+DO_IT:
+cpi mode,cm
+breq CM_ACTION
+reti
+
+;
+; specify action
+;
+
+
+;
+; continuous mode action
+;
+CM_ACTION:
+cp countrgb,zero
+breq RD_GU
+ldi tmp,CM1
+cp countrgb,tmp
+breq GD_BU
+ldi tmp,CM2
+cp countrgb,tmp
+breq BD_RU
+ldi tmp,255
+cp countrgb,tmp
+breq RESET_RGB
+rjmp MAKE_RGB
+
+;
+; reset rgb
+;
+RESET_RGB:
+ldi RED,CM2
+mov GREEN,zero
+mov BLUE,zero
+mov desc,zero
+rjmp MAKE_RGB
+
+;
+; set desc
+;
+RD_GU:
+ldi tmp,((1<<RDOWN)|(1<<GUP))
+mov desc,tmp
+rjmp MAKE_RGB
+GD_BU:
+ldi tmp,((1<<GDOWN)|(1<<BUP))
+mov desc,tmp
+rjmp MAKE_RGB
+BD_RU:
+ldi tmp,((1<<BDOWN)|(1<<RUP))
+mov desc,tmp
+rjmp MAKE_RGB
+
+;
+; do the actual rgb calculation
+;
+MAKE_RGB:
+ldi tmp,(1<<RUP)
+and tmp,desc
+add tmp,tmp
+add RED,tmp
+ldi tmp,(1<<GUP)
+and tmp,desc
+lsr tmp
+lsr tmp
+add tmp,tmp
+add GREEN,tmp
+ldi tmp,(1<<BUP)
+and tmp,desc
+lsr tmp
+lsr tmp
+lsr tmp
+lsr tmp
+add tmp,tmp
+add BLUE,tmp
+ldi tmp,(1<<RDOWN)
+and tmp,desc
+lsr tmp
+add tmp,tmp
+sub RED,tmp
+ldi tmp,(1<<GDOWN)
+and tmp,desc
+lsr tmp
+lsr tmp
+lsr tmp
+add tmp,tmp
+sub GREEN,tmp
+ldi tmp,(1<<BDOWN)
+and tmp,desc
+lsr tmp
+lsr tmp
+lsr tmp
+lsr tmp
+lsr tmp
+add tmp,tmp
+sub BLUE,tmp
+add countrgb,one