bfb7b1ce9243fa0d4b36b7f2c4e64000c49f780c
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

1) ; bulb - BlinkenArea ultimate logo board
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

2) ; version 1.1.0 date 2012-06-10
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

3) ; Copyright (C) 2011-2012 Stefan Schuermans <stefan@blinkenarea.org>
4) ; Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5) 
6) ; ATtiny2313A, clock frequency: 8 MHz (internal oscillator)
7) 
8) ; PA0: unused
9) ; PA1: unused
10) ; PA2: reset
11) ; PB0: column 0 output (output, low)
12) ; PB1: column 1 output (output, low)
13) ; PB2: column 2 output (output, low)
14) ; PB3: column 3 output (output, low)
15) ; PB4: column 4 output (output, low)
16) ; PB5: column 5 output (output, low)
17) ; PB6: column 6 output (output, low)
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

18) ; PB7: unused (input, pull-up enabled)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

19) ; PD0: row 0 output (output, high)
20) ; PD1: row 1 output (output, high)
21) ; PD2: row 2 output (output, high)
22) ; PD3: row 3 output (output, high)
23) ; PD4: row 4 output (output, high)
24) ; PD5: row 5 output (output, high)
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

25) ; PD6: mode switch (input, pull-up enabled)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

26) 
27) 
28) 
29) .INCLUDE        "tn2313def.inc"
30) 
31) 
32) 
33) ; IO pins
34) .equ    COL_PORT                =       PORTB   ; column outputs
35) .equ    ROW_PORT                =       PORTD   ; row outputs
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

36) .equ    MODE_SW_PIN             =       PIND
37) .equ    MODE_SW_BIT             =       6
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

38) 
39) 
40) 
41) ; general purpose registers
42) .def    TMP                     =       r16
43) .def    CNT                     =       r17
44) .def    DATA                    =       r18
45) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

46) ; current mode
47) .def    MODE                    =       r19
48) .equ    MODE_ALL                =       0       ; play all animations
49) .equ    MODE_SINGLE             =       1       ; play single animation only
50) .equ    MODE_UNKNOWN            =       0xFF    ; unknown mode
51) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

52) 
53) 
54) .DSEG
55) .ORG    0x060
56) 
57) 
58) 
59) ; current frame
60) FRAME:                  .BYTE   42
61) 
62) 
63) 
64) .MACRO breqx
65)         brne    NE
66)         rjmp    @0
67) NE:
68) .ENDM
69) 
70) 
71) 
72) ; multiple rcalls in a row
73) ; parameters: label, N
74) .MACRO rcall_N
75) .IF @1 > 0
76)         rcall   @0
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

77)         rcall_N @0,@1 - 1
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

78) .ENDIF
79) .ENDM
80) 
81) 
82) 
83) ; check if to turn on pixel in subframe
84) ; parameter: grayscale value (1..15)
85) ; input: X = ptr to pixel data (0..7),
86) ;        DATA[7-1] = other pixels
87) ; output: X = ptr to pixel data of next pixel,
88) ;         DATA.7 = if _not_ to turn on pixel, DATA.[6-0] = old DATA[7-1]
89) ; changes: TMP, DATA, X
90) ; cycles: 4
91) .MACRO PIXEL
92)         ld      TMP,X+
93)         cpi     TMP,@0
94)         ror     DATA
95) .ENDM
96) 
97) 
98) 
99) ; output row (black/white)
100) ; parameter: grayscale value (1..15)
101) ; input: X = ptr to pixel data (0..15)
102) ; output: -
103) ; changes: TMP, DATA
104) ; cycles: 32
105) .MACRO ROW_BW
106)         PIXEL   @0                      ; pixel 0
107)         PIXEL   @0                      ; pixel 1
108)         PIXEL   @0                      ; pixel 2
109)         PIXEL   @0                      ; pixel 3
110)         PIXEL   @0                      ; pixel 4
111)         PIXEL   @0                      ; pixel 5
112)         PIXEL   @0                      ; pixel 6
113)         subi    XL,7                    ;   XH not there on ATtiny2313
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

114)         lsr     DATA                    ; ensure remaining bit stays high
115)                                         ;   (pull-up for unused pin)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

116)         com     DATA
117)         out     COL_PORT,DATA
118) .ENDM
119) 
120) 
121) 
122) ; wait n * 64 cycles
123) ; parameter: n
124) ; input: -
125) ; output: -
126) ; changes: TMP
127) ; cycles: n * 64
128) .MACRO WAIT64_N
129) .IF @0 > 0
130)         rcall           WAIT64
131)         WAIT64_N        @0 - 1
132) .ENDIF
133) .ENDM
134) 
135) 
136) 
137) ; output row for grayscale (black/white) and wait
138) ; parameter: grayscale value (1..15)
139) ; input: X = ptr to pixel data (0..15)
140) ; output: -
141) ; changes: TMP, DATA
142) ; cycles: 32 + (grayscale - 1) * 64
143) .MACRO ROW_BW_WAIT
144)         ROW_BW          @0
145)         WAIT64_N        @0 - 1
146) .ENDM
147) 
148) 
149) 
150) ; turn off row (with same timing as ROW_BW)
151) ; input: -
152) ; output: -
153) ; changes: TMP
154) ; cycles: 32
155) .MACRO ROW_OFF
156)         ldi     TMP,10
157) ROW_OFF_LOOP:
158)         dec     TMP
159)         brne    ROW_OFF_LOOP
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

160)         ldi     TMP,0x80                ; ensure remaining bit stays high
161)                                         ;   (pull-up for unused pin)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

162)         out     COL_PORT,TMP
163) .ENDM
164) 
165) 
166) 
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

167) ; play an animation N times (mode 0) or infinitely (mode 1)
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

168) ; parameters: animation function, N, animation number
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

169) .MACRO PL_ANIM
170) PL_ANIM_LOOP:
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

171)         ; play animation N times
172)         rcall_N @0,@1 - 1
173)         ; read new mode
174)         ldi     CNT,@2
175)         rcall   MODE_READ
176)         ; keep playing animation in mode 1
177)         cpi     MODE,MODE_SINGLE
178)         breq    PL_ANIM_LOOP
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

179) .ENDM
180) 
181) 
182) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

183) .CSEG
184) .ORG    0x000
185)         rjmp    ENTRY                   ; RESET
186)         reti                            ; INT0
187)         reti                            ; INT1
188)         reti                            ; TIMER1_CAPT
189)         reti                            ; TIMER1_COMPA
190)         reti                            ; TIMER1_OVF
191)         reti                            ; TIMER0_OVF
192)         reti                            ; USART0_RX
193)         reti                            ; USART0_UDRE
194)         reti                            ; USART0_TX
195)         reti                            ; ANALOG_COMP
196)         reti                            ; PC_INT0
197)         reti                            ; TIMER1_COMPB
198)         reti                            ; TIMER0_COMPA
199)         reti                            ; TIMER0_COMPB
200)         reti                            ; USI_START
201)         reti                            ; USI_OVERFLOW
202)         reti                            ; EE_READY
203)         reti                            ; WDT
204)         reti                            ; PC_INT1
205)         reti                            ; PC_INT2
206) 
207) 
208) 
209) ; code entry point
210) ENTRY:
211) ; set system clock prescaler to 1:1
212)         ldi     TMP,1<<CLKPCE
213)         out     CLKPR,TMP
214)         ldi     TMP,0
215)         out     CLKPR,TMP
216) ; initialize output ports
217)         ldi     TMP,0x00                ; PA[01] to output, low
218)         out     PORTA,TMP
219)         ldi     TMP,0x03
220)         out     DDRA,TMP
221)         ldi     TMP,0x80                ; PB[0-6] to output, low - PB7 to input, pull-up enabled
222)         out     PORTB,TMP
223)         ldi     TMP,0x7F
224)         out     DDRB,TMP
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

225)         ldi     TMP,0x7F                ; PD[0-5] to output, high - PD6 to input, pull-up enabled
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

226)         out     PORTD,TMP
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

227)         ldi     TMP,0x3F
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

228)         out     DDRD,TMP
229) ; initialize stack pointer
230)         ldi     TMP,RAMEND
231)         out     SPL,TMP
232) ; enable watchdog (64ms)
233)         wdr
234)         ldi     TMP,1<<WDCE|1<<WDE
235)         out     WDTCR,TMP
236)         ldi     TMP,1<<WDE|1<<WDP1
237)         out     WDTCR,TMP
238)         wdr
239) ; disable analog comparator
240)         ldi     TMP,1<<ACD
241)         out     ACSR,TMP
242) ; jump to main program
243)         rjmp    MAIN
244) 
245) 
246) 
247) ; wait 64 cycles
248) ; input: -
249) ; output: -
250) ; changes: TMP
251) ; cycles: 64 (including rcall and ret)
252) WAIT64:
253)         ldi     TMP,19
254) WAIT64_LOOP:
255)         dec     TMP
256)         brne    WAIT64_LOOP
257) ; done
258)         ret
259) 
260) 
261) 
262) ; output row (grayscales)
263) ; input: X = ptr to pixel data (0..15)
264) ; output: -
265) ; changes: TMP, DATA
266) ; cycles: 7269 (including rcall and ret)
267) ROW_GRAY:
268)         ROW_BW_WAIT     1
269)         ROW_BW_WAIT     2
270)         ROW_BW_WAIT     3
271)         ROW_BW_WAIT     4
272)         ROW_BW_WAIT     5
273)         ROW_BW_WAIT     6
274)         ROW_BW_WAIT     7
275)         ROW_BW_WAIT     8
276)         ROW_BW_WAIT     9
277)         ROW_BW_WAIT     10
278)         ROW_BW_WAIT     11
279)         ROW_BW_WAIT     12
280)         ROW_BW_WAIT     13
281)         ROW_BW_WAIT     14
282)         ROW_BW_WAIT     15
283)         ROW_OFF
284) ; done
285)         ret
286) 
287) 
288) 
289) ; output a frame
290) ; input: FRAME = pixel data (0..15)
291) ; output: -
292) ; changes: TMP, CNT, DATA, X
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

293) ; cycles: 43682 (including rcall and ret)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

294) ; time: 5.5ms
295) OUT_FRAME:
296)         wdr
297)         ldi     XL,low(FRAME)           ; ptr to pixel data
298)                                         ;   XH not there on ATtiny2313
299)         ldi     CNT,0x01                ; bitmask loop over rows
300) OUT_FRAME_LOOP:
301)         mov     TMP,CNT                 ; select row
302)         com     TMP
303)         andi    TMP,0x3F
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

304)         ori     TMP,0x40                ; ensure bit 6 stays high
305)                                         ;   (pull-up for switch input)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

306)         out     ROW_PORT,TMP
307)         rcall   ROW_GRAY                ; display row
308)         subi    XL,-7                   ; ptr to next row
309)                                         ;   XH not there on ATtiny2313
310)         lsl     CNT                     ; bitmask loop over rows
311)         cpi     CNT,0x40
312)         brne    OUT_FRAME_LOOP
313) ; done
314)         ret
315) 
316) 
317) 
318) ; output a frame for some time
319) ; input: FRAME = pixel data (0..15)
320) ;        TMP = time to show frame (1..255, in 5.5 ms steps)
321) ; output: -
322) ; changes: X, TMP
323) ; time: TMP * 5.5 ms
324) OUT_FRAME_TIME:
325) ; output frame
326)         push    TMP
327)         push    CNT
328)         push    DATA
329)         rcall   OUT_FRAME               ; 5.5 ms
330)         pop     DATA
331)         pop     CNT
332)         pop     TMP
333) ; loop
334)         dec     TMP
335)         brne    OUT_FRAME_TIME
336) ; done
337)         ret
338) 
339) 
340) 
341) ; clear frame
342) ; input: -
343) ; output: -
344) ; changes: X, FRAME, TMP
345) ; time: short
346) CLEAR:
347)         ldi     XL,low(FRAME)           ; ptr to pixel data
348)                                         ;   XH not there on ATtiny2313
349)         clr     TMP
350) CLEAR_LOOP:
351)         st      X+,TMP                  ; clear pixel
352)         cpi     XL,low(FRAME)+42        ; bottom of loop
353)                                         ;   XH not there on ATtiny2313
354)         brne    CLEAR_LOOP
355) ; done
356)         ret
357) 
358) 
359) 
360) ; set frame to solid color
361) ; input: DATA = value (0..15)
362) ; output: -
363) ; changes: X, FRAME
364) ; time: short
365) SET_COLOR:
366)         ldi     XL,low(FRAME)           ; ptr to pixel data
367)                                         ;   XH not there on ATtiny2313
368) SET_COLOR_LOOP:
369)         st      X+,DATA                 ; set pixel value
370)         cpi     XL,low(FRAME)+42        ; bottom of loop
371)                                         ;   XH not there on ATtiny2313
372)         brne    SET_COLOR_LOOP
373) ; done
374)         ret
375) 
376) 
377) 
378) ; set pixel
379) ; input: CNT = pixel number (0..41, nothing is done for 42..255)
380) ;        DATA = value (0..15)
381) ; output: -
382) ; changes: X, FRAME, TMP
383) ; time: short
384) SET_PIXEL:
385)         cpi     CNT,42                  ; invalid pixel number -> done
386)         brsh    SET_PIXEL_END
387)         ldi     XL,low(FRAME)           ; ptr to pixel (base + offset)
388)         add     XL,CNT                  ;   XH not there on ATtiny2313
389)         st      X,DATA                  ; set pixel
390) SET_PIXEL_END:
391) ; done
392)         ret
393) 
394) 
395) 
396) ; draw worm
397) ; input: CNT = head of worm (0..55)
398) ; output: -
399) ; changes: X, FRAME, TMP, DATA
400) ; time: short
401) DRAW_WORM:
402)         cpi     CNT,56                  ; invalid head pos -> done
403)         brsh    DRAW_WORM_END
404)         ldi     XL,low(FRAME)+1         ; ptr to before head
405)         add     XL,CNT                  ;   XH not there on ATtiny2313
406)         ldi     DATA,15                 ; head is full on
407)         cpi     CNT,42                  ; head pos in frame -> go
408)         brlo    DRAW_WORM_LOOP
409)         mov     TMP,CNT                 ; TMP := invisible pixels
410)         subi    TMP,41
411)         sub     XL,TMP                  ; skip invisible pixels
412)         sub     DATA,TMP                ;   XH not there on ATtiny2313
413) DRAW_WORM_LOOP:
414)         st      -X,DATA                 ; set pixel, go back
415)         cpi     XL,low(FRAME)           ; 1st pixel -> done
416)         breq    DRAW_WORM_END           ;   XH not there on ATtiny2313
417)         dec     DATA                    ; next pixel darker
418)         brne    DRAW_WORM_LOOP          ; loop
419) DRAW_WORM_END:
420) ; done
421)         ret
422) 
423) 
424) 
425) ; draw backwards worm
426) ; input: CNT = tail of worm (0..55)
427) ; output: -
428) ; changes: X, FRAME, TMP, DATA
429) ; time: short
430) DRAW_BW_WORM:
431)         cpi     CNT,56                  ; invalid tail pos -> done
432)         brsh    DRAW_BW_WORM_END
433)         ldi     XL,low(FRAME)+1         ; ptr to before tail
434)         add     XL,CNT                  ;   XH not there on ATtiny2313
435)         ldi     DATA,1                  ; tail is minimum on
436)         cpi     CNT,42                  ; tail pos in frame -> go
437)         brlo    DRAW_BW_WORM_LOOP
438)         mov     TMP,CNT                 ; TMP := invisible pixels
439)         subi    TMP,41
440)         sub     XL,TMP                  ; skip invisible pixels
441)         add     DATA,TMP                ;   XH not there on ATtiny2313
442) DRAW_BW_WORM_LOOP:
443)         st      -X,DATA                 ; set pixel, go back
444)         cpi     XL,low(FRAME)           ; 1st pixel -> done
445)         breq    DRAW_BW_WORM_END        ;   XH not there on ATtiny2313
446)         inc     DATA                    ; next pixel brighter
447)         cpi     DATA,16                 ; loop
448)         brne    DRAW_BW_WORM_LOOP
449) DRAW_BW_WORM_END:
450) ; done
451)         ret
452) 
453) 
454) 
455) ; blink animation
456) ; input: -
457) ; output: -
458) ; changes: X, FRAME, CNT, DATA, TMP
459) ANIM_BLINK:
460) ; off
461)         ldi     DATA,0                  ; minimum color
462)         rcall   SET_COLOR               ; paint
463)         ldi     TMP,100                 ; show frame 550 ms
464)         rcall   OUT_FRAME_TIME
465) ; on
466)         ldi     DATA,15                 ; maximum color
467)         rcall   SET_COLOR               ; paint
468)         ldi     TMP,100                 ; show frame 550 ms
469)         rcall   OUT_FRAME_TIME
470) ; done
471)         ret
472) 
473) 
474) 
475) ; fade up and down animation
476) ; input: -
477) ; output: -
478) ; changes: X, FRAME, CNT, DATA, TMP
479) ANIM_FADE:
480) ; fade up
481)         ldi     DATA,0                  ; start dark
482) ANIM_FADE_UP:
483)         rcall   SET_COLOR               ; paint
484)         ldi     TMP,10                  ; show frame 55 ms
485)         rcall   OUT_FRAME_TIME
486)         inc     DATA                    ; fade up
487)         cpi     DATA,15                 ; loop until almost full on
488)         brne    ANIM_FADE_UP
489) ; fade down
490) ANIM_FADE_DOWN:
491)         rcall   SET_COLOR               ; paint
492)         ldi     TMP,10                  ; show frame 55 ms
493)         rcall   OUT_FRAME_TIME
494)         dec     DATA                    ; fade up
495)         cpi     DATA,255                ; loop until full off
496)         brne    ANIM_FADE_DOWN
497) ; done
498)         ret
499) 
500) 
501) 
502) ; flicker animation
503) ; input: -
504) ; output: -
505) ; changes: X, FRAME, CNT, DATA, TMP
506) ANIM_FLICKER:
507) ; even pixels
508)         rcall   CLEAR                   ; clear
509)         ldi     DATA,15                 ; even pixels to maximum
510)         ldi     CNT,0
511) ANIM_FLICKER_EVEN:
512)         rcall   SET_PIXEL
513)         subi    CNT,-2                  ; move two pixels
514)         cpi     CNT,42                  ; loop
515)         brlo    ANIM_FLICKER_EVEN
516)         ldi     TMP,40                  ; show frame 220 ms
517)         rcall   OUT_FRAME_TIME
518) ; odd pixels
519)         rcall   CLEAR                   ; clear
520)         ldi     DATA,15                 ; odd pixels to maximum
521)         ldi     CNT,1
522) ANIM_FLICKER_ODD:
523)         rcall   SET_PIXEL
524)         subi    CNT,-2                  ; move two pixels
525)         cpi     CNT,42                  ; loop
526)         brlo    ANIM_FLICKER_ODD
527)         ldi     TMP,40                  ; show frame 220 ms
528)         rcall   OUT_FRAME_TIME
529) ; done
530)         ret
531) 
532) 
533) 
534) ; wobble animation
535) ; input: -
536) ; output: -
537) ; changes: X, FRAME, CNT, DATA, TMP
538) ANIM_WOBBLE:
539) ; even pixels up, odd pixels down
540)         ldi     DATA,0                  ; even pixels start dark
541) ANIM_WOBBLE_UP:
542)         ldi     CNT,0
543) ANIM_WOBBLE_UP_DRAW:
544)         rcall   SET_PIXEL
545)         inc     CNT                     ; next pixel
546)         ldi     TMP,0x0F                ; invert color
547)         eor     DATA,TMP
548)         cpi     CNT,42                  ; loop
549)         brlo    ANIM_WOBBLE_UP_DRAW
550)         ldi     TMP,10                  ; show frame 55 ms
551)         rcall   OUT_FRAME_TIME
552)         inc     DATA                    ; next color: brighter
553)         cpi     DATA,16
554)         brlo    ANIM_WOBBLE_UP
555) ; even pixels down, odd pixels up
556)         ldi     DATA,15                 ; even pixels start full
557) ANIM_WOBBLE_DOWN:
558)         ldi     CNT,0
559) ANIM_WOBBLE_DOWN_DRAW:
560)         rcall   SET_PIXEL
561)         inc     CNT                     ; next pixel
562)         ldi     TMP,0x0F                ; invert color
563)         eor     DATA,TMP
564)         cpi     CNT,42                  ; loop
565)         brlo    ANIM_WOBBLE_DOWN_DRAW
566)         ldi     TMP,10                  ; show frame 55 ms
567)         rcall   OUT_FRAME_TIME
568)         dec     DATA                    ; next color: darker
569)         cpi     DATA,16
570)         brlo    ANIM_WOBBLE_DOWN
571) ; done
572)         ret
573) 
574) 
575) 
576) ; run animation
577) ; input: -
578) ; output: -
579) ; changes: X, FRAME, CNT, DATA, TMP
580) ANIM_RUN:
581)         ldi     CNT,255                 ; start before 1st pixel
582) ANIM_RUN_LOOP:
583)         rcall   CLEAR                   ; clear
584)         ldi     DATA,15                 ; current pixel full on
585)         rcall   SET_PIXEL
586)         ldi     TMP,10                  ; show frame 55 ms
587)         rcall   OUT_FRAME_TIME
588)         inc     CNT                     ; next pixel
589)         cpi     CNT,43                  ; loop until after last pixel
590)         brne    ANIM_RUN_LOOP
591) ; done
592)         ret
593) 
594) 
595) 
596) ; backwards run animation
597) ; input: -
598) ; output: -
599) ; changes: X, FRAME, CNT, DATA, TMP
600) ANIM_BW_RUN:
601)         ldi     CNT,42                  ; start after last pixel
602) ANIM_BW_RUN_LOOP:
603)         rcall   CLEAR                   ; clear
604)         ldi     DATA,15                 ; current pixel full on
605)         rcall   SET_PIXEL
606)         ldi     TMP,10                  ; show frame 55 ms
607)         rcall   OUT_FRAME_TIME
608)         dec     CNT                     ; previous pixel
609)         cpi     CNT,255                 ; loop until before 1st pixel
610)         brne    ANIM_BW_RUN_LOOP
611) ; done
612)         ret
613) 
614) 
615) 
616) ; worm animation
617) ; input: -
618) ; output: -
619) ; changes: X, FRAME, CNT, DATA, TMP
620) ANIM_WORM:
621)         ldi     CNT,255                 ; worm starts before 1st pixel
622) ANIM_WORM_LOOP:
623)         rcall   CLEAR                   ; draw worm
624)         rcall   DRAW_WORM
625)         ldi     TMP,10                  ; show frame 55 ms
626)         rcall   OUT_FRAME_TIME
627)         inc     CNT                     ; advance worm
628)         cpi     CNT,57                  ; loop until has exits
629)         brne    ANIM_WORM_LOOP
630) ; done
631)         ret
632) 
633) 
634) 
635) ; backwards worm animation
636) ; input: -
637) ; output: -
638) ; changes: X, FRAME, CNT, DATA, TMP
639) ANIM_BW_WORM:
640)         ldi     CNT,56                  ; worm starts behind frame
641)                                         ;   head not yet visible
642) ANIM_BW_WORM_LOOP:
643)         rcall   CLEAR                   ; draw backwards worm
644)         rcall   DRAW_BW_WORM
645)         ldi     TMP,10                  ; show frame 55 ms
646)         rcall   OUT_FRAME_TIME
647)         dec     CNT                     ; advance worm backwards
648)         cpi     CNT,254                 ; loop until worm has exited
649)         brne    ANIM_BW_WORM_LOOP
650) ; done
651)         ret
652) 
653) 
654) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

655) ; read mode from switch and (store animation number)
656) ; input: MODE = old mode, CNT = animation number
657) ; output: MODE = new mode
658) ; changes: TMP, DATA
659) MODE_READ:
660) ; read new mode (into DATA)
661)         ldi     DATA,MODE_ALL
662)         sbic    MODE_SW_PIN,MODE_SW_BIT
663)         ldi     DATA,MODE_SINGLE
664) ; mode was changed from all to single -> save animation number
665)         cpi     MODE,MODE_ALL           ; old mode not all -> do nothing
666)         brne    MODE_READ_NOT_0_TO_1
667)         cpi     DATA,MODE_SINGLE        ; new mode not single -> do nothing
668)         brne    MODE_READ_NOT_0_TO_1
669)         sbic    EECR,EEPE               ; EEPROM write ongoing -> do nothing
670)         rjmp    MODE_READ_NOT_0_TO_1
671)         ldi     TMP,0<<EEPM1|0<<EEPM0   ; set EEPROM programming mode
672)         out     EECR,TMP
673)         ldi     TMP,0                   ; set EEPROM address
674)         out     EEARL,TMP
675)         mov     TMP,CNT                 ; set EEPROM data to animation number
676)         com     TMP                     ;   with NOTed number in upper nibble
677)         swap    TMP
678)         andi    TMP,0xF0
679)         or      TMP,CNT
680)         out     EEDR,TMP
681)         sbi     EECR,EEMPE              ; begin writing EEPROM
682)         sbi     EECR,EEPE
683) MODE_READ_NOT_0_TO_1:
684) ; remember new mode (in MODE)
685)         mov     MODE,DATA
686) ; done
687)         ret
688) 
689) 
690) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

691) ; main program
692) MAIN:
693)         wdr
694) 
695) ; initialization
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

696)         ldi     MODE,MODE_UNKNOWN       ; unknown mode
697) 
698) ; get number of fist animation from EEPROM (into CNT)
699)         ldi     TMP,0                   ; set EEPROM address
700)         out     EEARL,TMP
701)         sbi     EECR,EERE               ; start EEPROM read
702)         in      CNT,EEDR                ; get read value
703)         mov     TMP,CNT                 ; check if high nibble contains NOTed
704)         com     TMP                     ;   value
705)         swap    TMP
706)         cp      CNT,TMP
707)         brne    MAIN_FIRST_ANIM_END
708)         andi    CNT,0x0F                ; throw away check value in high nibble
709) ; jump to first animation
710)         cpi     CNT,0
711)         breq    MAIN_FIRST_0
712)         cpi     CNT,1
713)         breq    MAIN_FIRST_1
714)         cpi     CNT,2
715)         breq    MAIN_FIRST_2
716)         cpi     CNT,3
717)         breq    MAIN_FIRST_3
718)         cpi     CNT,4
719)         breq    MAIN_FIRST_4
720)         cpi     CNT,5
721)         breq    MAIN_FIRST_5
722)         cpi     CNT,6
723)         breq    MAIN_FIRST_6
724)         cpi     CNT,7
725)         breq    MAIN_FIRST_7
726) MAIN_FIRST_ANIM_END:
727) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

728) 
729) MAIN_LOOP:
730)         wdr
731) 
732) ; main loop
733) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

734) MAIN_FIRST_0:
735)         PL_ANIM ANIM_BLINK,3,0
736) MAIN_FIRST_1:
737)         PL_ANIM ANIM_WORM,3,1
738) MAIN_FIRST_2:
739)         PL_ANIM ANIM_FLICKER,10,2
740) MAIN_FIRST_3:
741)         PL_ANIM ANIM_BW_RUN,3,3
742) MAIN_FIRST_4:
743)         PL_ANIM ANIM_FADE,2,4
744) MAIN_FIRST_5:
745)         PL_ANIM ANIM_BW_WORM,3,5
746) MAIN_FIRST_6:
747)         PL_ANIM ANIM_WOBBLE,5,6
748) MAIN_FIRST_7:
749)         PL_ANIM ANIM_RUN,3,7
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

750) 
751) ; bottom of main loop
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

752)