58920fa0ea5c93d44dc344cc8fe92fc388d057b7
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

1) ; bulb - BlinkenArea ultimate logo board
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

2) ; Copyright (C) 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

37) 
38) 
39) 
40) ; general purpose registers
41) .def    TMP                     =       r16
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

42) .def    TMP2                    =       r17
43) .def    CNT                     =       r18
44) .def    DATA                    =       r19
45) .def    GRAY                    =       r20
petaflot separate bulb and border ad...

petaflot authored 5 years ago

46) .def    BULB                    =       r24
47) .def    BORDER                  =       r25
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

48) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

49) ; current mode
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

50) .def    MODE                    =       r21
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

51) .equ    MODE_ALL                =       0       ; play all animations
52) .equ    MODE_SINGLE             =       1       ; play single animation only
53) .equ    MODE_UNKNOWN            =       0xFF    ; unknown mode
54) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

55) ; current animation number and iterations
56) .def    ANI_NO                  =       r22
57) .def    ANI_IT                  =       r23
58) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

59) 
60) 
61) .DSEG
62) .ORG    0x060
63) 
64) 
65) 
66) ; current frame
67) FRAME:                  .BYTE   42
68) 
69) 
70) 
71) .CSEG
72) .ORG    0x000
73)         rjmp    ENTRY                   ; RESET
74)         reti                            ; INT0
75)         reti                            ; INT1
76)         reti                            ; TIMER1_CAPT
77)         reti                            ; TIMER1_COMPA
78)         reti                            ; TIMER1_OVF
79)         reti                            ; TIMER0_OVF
80)         reti                            ; USART0_RX
81)         reti                            ; USART0_UDRE
82)         reti                            ; USART0_TX
83)         reti                            ; ANALOG_COMP
84)         reti                            ; PC_INT0
85)         reti                            ; TIMER1_COMPB
86)         reti                            ; TIMER0_COMPA
87)         reti                            ; TIMER0_COMPB
88)         reti                            ; USI_START
89)         reti                            ; USI_OVERFLOW
90)         reti                            ; EE_READY
91)         reti                            ; WDT
92)         reti                            ; PC_INT1
93)         reti                            ; PC_INT2
94) 
95) 
96) 
97) ; code entry point
98) ENTRY:
99) ; set system clock prescaler to 1:1
100)         ldi     TMP,1<<CLKPCE
101)         out     CLKPR,TMP
102)         ldi     TMP,0
103)         out     CLKPR,TMP
104) ; initialize output ports
105)         ldi     TMP,0x00                ; PA[01] to output, low
106)         out     PORTA,TMP
107)         ldi     TMP,0x03
108)         out     DDRA,TMP
109)         ldi     TMP,0x80                ; PB[0-6] to output, low - PB7 to input, pull-up enabled
110)         out     PORTB,TMP
111)         ldi     TMP,0x7F
112)         out     DDRB,TMP
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

113)         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

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

Stefan Schuermans authored 12 years ago

115)         ldi     TMP,0x3F
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

116)         out     DDRD,TMP
117) ; initialize stack pointer
118)         ldi     TMP,RAMEND
119)         out     SPL,TMP
120) ; enable watchdog (64ms)
121)         wdr
122)         ldi     TMP,1<<WDCE|1<<WDE
123)         out     WDTCR,TMP
124)         ldi     TMP,1<<WDE|1<<WDP1
125)         out     WDTCR,TMP
126)         wdr
127) ; disable analog comparator
128)         ldi     TMP,1<<ACD
129)         out     ACSR,TMP
130) ; jump to main program
131)         rjmp    MAIN
132) 
133) 
134) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

135) ; wait 61 cycles
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

136) ; input: -
137) ; output: -
138) ; changes: TMP
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

139) ; cycles: 61 (including rcall and ret)
140) WAIT61:
141)         ldi     TMP,18
142) WAIT61_LOOP:
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

143)         dec     TMP
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

144)         brne    WAIT61_LOOP
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

145) ; done
146)         ret
147) 
148) 
149) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

150) ; output row for grayscale (black/white) and wait
151) ; input: X = ptr to pixel data (0..15)
152) ;        GRAY = grayscale value (1..15)
153) ; output: -
154) ; changes: TMP, TMP2, DATA
155) ; cycles: GRAY * 64 + 1 (including rcall and ret)
156) ROW_BW_WAIT:
157) ; get data for LEDs
158)         ldi     TMP2,7                  ; 7 pixels
159) ROW_BW_WAIT_PIXEL:
160)         ld      TMP,X+                  ; get pixel value
161)         cp      TMP,GRAY                ; compare with grayscale value
162)         ror     DATA                    ; store result as output bit
163)         dec     TMP2                    ; next pixel
164)         brne    ROW_BW_WAIT_PIXEL
165) ; restore data pointer
166)         subi    XL,7                    ;   XH not there on ATtiny2313
167) ; output
168)         lsr     DATA                    ; ensure remaining bit stays high
169)                                         ;   (pull-up for unused pin)
170)         com     DATA
171)         out     COL_PORT,DATA
172) ; wait 5 + (GRAY - 1) * 64
173)         mov     TMP2,GRAY
174)         rjmp    ROW_BW_WAIT_LOOP_ENTRY
175) ROW_BW_WAIT_LOOP:
176)         rcall   WAIT61
177) ROW_BW_WAIT_LOOP_ENTRY:
178)         dec     TMP2
179)         brne    ROW_BW_WAIT_LOOP
180)         ret
181) 
182) 
183) 
184) ; turn off row (with same timing as ROW_BW_WAIT)
185) ; input: -
186) ; output: -
187) ; changes: TMP
188) ; cycles: 60 (including rcall and ret)
189) ROW_OFF:
190)         ldi     TMP,17
191) ROW_OFF_LOOP:
192)         dec     TMP
193)         brne    ROW_OFF_LOOP
194)         ldi     TMP,0x80                ; ensure remaining bit stays high
195)                                         ;   (pull-up for unused pin)
196)         out     COL_PORT,TMP
197)         ret
198) 
199) 
200) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

201) ; output row (grayscales)
202) ; input: X = ptr to pixel data (0..15)
203) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

204) ; changes: TMP, TMP2, DATA
205) ; cycles: 7822 (including rcall and ret)
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

206) ; time: 1ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

207) ROW_GRAY:
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

208)         ldi     GRAY,1
209) ROW_GRAY_LOOP:
210)         rcall   ROW_BW_WAIT
211)         inc     GRAY
212)         cpi     GRAY,16
213)         brlo    ROW_GRAY_LOOP
214)         rcall   ROW_OFF
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

215) ; done
216)         ret
217) 
218) 
219) 
220) ; output a frame
221) ; input: FRAME = pixel data (0..15)
222) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

223) ; changes: TMP, TMP2, CNT, DATA, X
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

224) ; time: 6ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

225) OUT_FRAME:
226)         wdr
227)         ldi     XL,low(FRAME)           ; ptr to pixel data
228)                                         ;   XH not there on ATtiny2313
229)         ldi     CNT,0x01                ; bitmask loop over rows
230) OUT_FRAME_LOOP:
231)         mov     TMP,CNT                 ; select row
232)         com     TMP
233)         andi    TMP,0x3F
Stefan Schuermans change firmware to match ne...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

236)         out     ROW_PORT,TMP
237)         rcall   ROW_GRAY                ; display row
238)         subi    XL,-7                   ; ptr to next row
239)                                         ;   XH not there on ATtiny2313
240)         lsl     CNT                     ; bitmask loop over rows
241)         cpi     CNT,0x40
242)         brne    OUT_FRAME_LOOP
243) ; done
244)         ret
245) 
246) 
247) 
248) ; output a frame for some time
249) ; input: FRAME = pixel data (0..15)
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

250) ;        TMP = time to show frame (1..255, in 6 ms steps)
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

251) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

252) ; changes: X, TMP, TMP2
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

253) ; time: TMP * 6 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

254) OUT_FRAME_TIME:
255) ; output frame
256)         push    TMP
257)         push    CNT
258)         push    DATA
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

259)         rcall   OUT_FRAME               ; 6 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

260)         pop     DATA
261)         pop     CNT
262)         pop     TMP
263) ; loop
264)         dec     TMP
265)         brne    OUT_FRAME_TIME
266) ; done
267)         ret
268) 
269) 
270) 
271) ; clear frame
272) ; input: -
273) ; output: -
274) ; changes: X, FRAME, TMP
275) ; time: short
276) CLEAR:
277)         ldi     XL,low(FRAME)           ; ptr to pixel data
278)                                         ;   XH not there on ATtiny2313
279)         clr     TMP
280) CLEAR_LOOP:
281)         st      X+,TMP                  ; clear pixel
282)         cpi     XL,low(FRAME)+42        ; bottom of loop
283)                                         ;   XH not there on ATtiny2313
284)         brne    CLEAR_LOOP
285) ; done
286)         ret
287) 
288) 
289) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

290) ; set frame to solid color (all the same)
291) ; input: DATA = value (0..15) intensity for all LEDs
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

292) ; output: -
293) ; changes: X, FRAME
294) ; time: short
295) SET_COLOR:
296)         ldi     XL,low(FRAME)           ; ptr to pixel data
297)                                         ;   XH not there on ATtiny2313
298) SET_COLOR_LOOP:
299)         st      X+,DATA                 ; set pixel value
300)         cpi     XL,low(FRAME)+42        ; bottom of loop
301)                                         ;   XH not there on ATtiny2313
302)         brne    SET_COLOR_LOOP
303) ; done
304)         ret
305) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

306) ; set bulb to solid color
307) ; input: BULB = value (0..15) intensity for all bulb LEDs except spark (28-40)
308) ; output: -
309) ; changes: X, BULB
310) ; time: short
311) BULB_COLOR:
312)         ldi     XL,low(FRAME+26)        ; ptr to pixel data
313)                                         ;   XH not there on ATtiny2313
314) BULB_COLOR_LOOP:
315)         st      X+,BULB                 ; set pixel value
316)         cpi     XL,low(FRAME)+41        ; bottom of loop
317)                                         ;   XH not there on ATtiny2313
318)         brne    BULB_COLOR_LOOP
319) ; done
320)         ret
321) 
322) ; set border to solid color
323) ; input: BORDER = value (0..15) intensity for all border LEDs
324) ; output: -
325) ; changes: X, BORDER
326) ; time: short
327) BORDER_COLOR:
328)         ldi     XL,low(FRAME)           ; ptr to pixel data
329)                                         ;   XH not there on ATtiny2313
330) BORDER_COLOR_LOOP:
331)         st      X+,BORDER               ; set pixel value
332)         cpi     XL,low(FRAME)+28        ; bottom of loop
333)                                         ;   XH not there on ATtiny2313
334)         brne    BORDER_COLOR_LOOP
335) ; done
336)         ret
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

337) 
338) 
339) ; set pixel
340) ; input: CNT = pixel number (0..41, nothing is done for 42..255)
341) ;        DATA = value (0..15)
342) ; output: -
343) ; changes: X, FRAME, TMP
344) ; time: short
345) SET_PIXEL:
346)         cpi     CNT,42                  ; invalid pixel number -> done
347)         brsh    SET_PIXEL_END
348)         ldi     XL,low(FRAME)           ; ptr to pixel (base + offset)
349)         add     XL,CNT                  ;   XH not there on ATtiny2313
350)         st      X,DATA                  ; set pixel
351) SET_PIXEL_END:
352) ; done
353)         ret
354) 
355) 
356) 
357) ; draw worm
358) ; input: CNT = head of worm (0..55)
359) ; output: -
360) ; changes: X, FRAME, TMP, DATA
361) ; time: short
362) DRAW_WORM:
363)         cpi     CNT,56                  ; invalid head pos -> done
364)         brsh    DRAW_WORM_END
365)         ldi     XL,low(FRAME)+1         ; ptr to before head
366)         add     XL,CNT                  ;   XH not there on ATtiny2313
367)         ldi     DATA,15                 ; head is full on
368)         cpi     CNT,42                  ; head pos in frame -> go
369)         brlo    DRAW_WORM_LOOP
370)         mov     TMP,CNT                 ; TMP := invisible pixels
371)         subi    TMP,41
372)         sub     XL,TMP                  ; skip invisible pixels
373)         sub     DATA,TMP                ;   XH not there on ATtiny2313
374) DRAW_WORM_LOOP:
375)         st      -X,DATA                 ; set pixel, go back
376)         cpi     XL,low(FRAME)           ; 1st pixel -> done
377)         breq    DRAW_WORM_END           ;   XH not there on ATtiny2313
378)         dec     DATA                    ; next pixel darker
379)         brne    DRAW_WORM_LOOP          ; loop
380) DRAW_WORM_END:
381) ; done
382)         ret
383) 
384) 
385) 
386) ; draw backwards worm
387) ; input: CNT = tail of worm (0..55)
388) ; output: -
389) ; changes: X, FRAME, TMP, DATA
390) ; time: short
391) DRAW_BW_WORM:
392)         cpi     CNT,56                  ; invalid tail pos -> done
393)         brsh    DRAW_BW_WORM_END
394)         ldi     XL,low(FRAME)+1         ; ptr to before tail
395)         add     XL,CNT                  ;   XH not there on ATtiny2313
396)         ldi     DATA,1                  ; tail is minimum on
397)         cpi     CNT,42                  ; tail pos in frame -> go
398)         brlo    DRAW_BW_WORM_LOOP
399)         mov     TMP,CNT                 ; TMP := invisible pixels
400)         subi    TMP,41
401)         sub     XL,TMP                  ; skip invisible pixels
402)         add     DATA,TMP                ;   XH not there on ATtiny2313
403) DRAW_BW_WORM_LOOP:
404)         st      -X,DATA                 ; set pixel, go back
405)         cpi     XL,low(FRAME)           ; 1st pixel -> done
406)         breq    DRAW_BW_WORM_END        ;   XH not there on ATtiny2313
407)         inc     DATA                    ; next pixel brighter
408)         cpi     DATA,16                 ; loop
409)         brne    DRAW_BW_WORM_LOOP
410) DRAW_BW_WORM_END:
411) ; done
412)         ret
413) 
414) 
415) 
416) ; blink animation
417) ; input: -
418) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

419) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

420) ANIM_BLINK:
421) ; off
422)         ldi     DATA,0                  ; minimum color
423)         rcall   SET_COLOR               ; paint
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

424)         ldi     TMP,100                 ; show frame 600 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

425)         rcall   OUT_FRAME_TIME
426) ; on
427)         ldi     DATA,15                 ; maximum color
428)         rcall   SET_COLOR               ; paint
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

429)         ldi     TMP,100                 ; show frame 600 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

430)         rcall   OUT_FRAME_TIME
431) ; done
432)         ret
433) 
434) 
435) 
436) ; fade up and down animation
437) ; input: -
438) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

439) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

440) ANIM_FADE:
441) ; fade up
442)         ldi     DATA,0                  ; start dark
443) ANIM_FADE_UP:
444)         rcall   SET_COLOR               ; paint
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

445)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

446)         rcall   OUT_FRAME_TIME
447)         inc     DATA                    ; fade up
448)         cpi     DATA,15                 ; loop until almost full on
449)         brne    ANIM_FADE_UP
450) ; fade down
451) ANIM_FADE_DOWN:
452)         rcall   SET_COLOR               ; paint
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

453)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

454)         rcall   OUT_FRAME_TIME
455)         dec     DATA                    ; fade up
456)         cpi     DATA,255                ; loop until full off
457)         brne    ANIM_FADE_DOWN
458) ; done
459)         ret
460) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

461) ; fade up and down animation, bulb and frame are in opposite phase
462) ; input: -
463) ; output: -
464) ; changes: X, FRAME, CNT, BULB, BORDER, TMP, TMP2
465) INVERTED_FADE:
466) ; fade up
467)         ;rcall   CLEAR                   ; clear
468)         ldi     BORDER,15               ; start bright
469)         ldi     BULB,0                  ; start dark
470) INVERTED_FADE_BACK:;EVEN                     ; relative to the bulb
471)         rcall   BORDER_COLOR            ; paint border (to darker)
472)         rcall   BULB_COLOR              ; paint bulb (to brighter)
473)         ldi     TMP,10                  ; show frame 60 ms
474)         rcall   OUT_FRAME_TIME
475)         dec     BORDER                  ; fade down, 0-27
476)         inc     BULB                    ; fade up, 28-41
477)         cpi     BORDER,255              ; loop until full off
478)         cpi     BULB,15                 ; loop until almost full on
479)         brne    INVERTED_FADE_BACK
480) INVERTED_FADE_FORTH:;ODD
481)         rcall   BORDER_COLOR            ; paint border (to brighter)
482)         rcall   BULB_COLOR              ; paint bulb (to darker)
483)         ldi     TMP,10                  ; show frame 60 ms
484)         rcall   OUT_FRAME_TIME
485)         inc     BORDER                  ; fade up, 28-41
486)         dec     BULB                    ; fade down, 0-27
487)         cpi     BORDER,15               ; loop until almost full on
488)         cpi     BULB,255                ; loop until full off
489)         brne    INVERTED_FADE_FORTH
490) ; done
491)         ret
492) 
493) 
494) ; border (frame around bulb) blink animation
495) ; input: -
496) ; output: -
497) ; changes: X, FRAME, CNT, BORDER, TMP, TMP2
498) ANIM_FRAMEBLINK:
499)         rcall   CLEAR
500) ; off
501)         ldi     BORDER,0                ; minimum color
502)         rcall   BORDER_COLOR            ; paint
503)         ldi     TMP,100                 ; show frame 600 ms
504)         rcall   OUT_FRAME_TIME
505) ; on
506)         ldi     BORDER,15               ; maximum color
507)         rcall   BORDER_COLOR            ; paint
508)         ldi     TMP,100                 ; show frame 600 ms
509)         rcall   OUT_FRAME_TIME
510) ; done
511)         ret
512) 
513) ; bulb blink animation, fast
514) ; input: -
515) ; output: -
516) ; changes: X, FRAME, CNT, BULB, TMP, TMP2
517) ANIM_BULBFAST:
518)         rcall   CLEAR
519) ; off
520)         ldi     BULB,0                ; minimum color
521)         rcall   BULB_COLOR            ; paint
522)         ldi     TMP,10                 ; show frame 20 ms
523)         rcall   OUT_FRAME_TIME
524) ; on
525)         ldi     BULB,15               ; maximum color
526)         rcall   BULB_COLOR            ; paint
527)         ldi     TMP,10                 ; show frame 20 ms
528)         rcall   OUT_FRAME_TIME
529) ; done
530)         ret
531) 
532) ; bulb blink animation, slow
533) ; input: -
534) ; output: -
535) ; changes: X, FRAME, CNT, BULB, TMP, TMP2
536) ANIM_BULBSLOW:
537)         rcall   CLEAR
538) ; off
539)         ldi     BULB,0                ; minimum color
540)         rcall   BULB_COLOR            ; paint
541)         ldi     TMP,200
542)         rcall   OUT_FRAME_TIME
543) ; on
544)         ldi     BULB,15               ; maximum color
545)         rcall   BULB_COLOR            ; paint
546)         ldi     TMP,200
547)         rcall   OUT_FRAME_TIME
548) ; done
549)         ret
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

550) 
551) 
552) ; flicker animation
553) ; input: -
554) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

555) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

556) ANIM_FLICKER:
557) ; even pixels
558)         rcall   CLEAR                   ; clear
559)         ldi     DATA,15                 ; even pixels to maximum
petaflot separate bulb and border ad...

petaflot authored 5 years ago

560)         ldi     DATA,0xf
561)         sts     FRAME+41,DATA                 ; set pixel, go back
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

562)         ldi     CNT,0
563) ANIM_FLICKER_EVEN:
564)         rcall   SET_PIXEL
565)         subi    CNT,-2                  ; move two pixels
566)         cpi     CNT,42                  ; loop
567)         brlo    ANIM_FLICKER_EVEN
petaflot separate bulb and border ad...

petaflot authored 5 years ago

568)         ldi     TMP,20                  ; show frame 120 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

569)         rcall   OUT_FRAME_TIME
570) ; odd pixels
571)         rcall   CLEAR                   ; clear
572)         ldi     DATA,15                 ; odd pixels to maximum
573)         ldi     CNT,1
574) ANIM_FLICKER_ODD:
575)         rcall   SET_PIXEL
576)         subi    CNT,-2                  ; move two pixels
577)         cpi     CNT,42                  ; loop
578)         brlo    ANIM_FLICKER_ODD
petaflot separate bulb and border ad...

petaflot authored 5 years ago

579)         ldi     TMP,20                  ; show frame 120 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

580)         rcall   OUT_FRAME_TIME
581) ; done
582)         ret
583) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

584) ANIM_IDLE:
585)         rcall   CLEAR                   ; clear
586)         ldi     TMP,500                 ; show frame 3000 ms
587)         rcall   OUT_FRAME_TIME
588) 
589)         ldi     DATA,0xf
590)         sts     FRAME+41,DATA                 ; set pixel, go back
591) 
592)         ldi     TMP,10                  ; show frame 60 ms
593)         rcall   OUT_FRAME_TIME
594)         ret
595) 
596) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

597) 
598) 
599) ; wobble animation
600) ; input: -
601) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

602) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

603) ANIM_WOBBLE:
604) ; even pixels up, odd pixels down
605)         ldi     DATA,0                  ; even pixels start dark
606) ANIM_WOBBLE_UP:
607)         ldi     CNT,0
608) ANIM_WOBBLE_UP_DRAW:
609)         rcall   SET_PIXEL
610)         inc     CNT                     ; next pixel
611)         ldi     TMP,0x0F                ; invert color
612)         eor     DATA,TMP
613)         cpi     CNT,42                  ; loop
614)         brlo    ANIM_WOBBLE_UP_DRAW
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

615)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

616)         rcall   OUT_FRAME_TIME
617)         inc     DATA                    ; next color: brighter
618)         cpi     DATA,16
619)         brlo    ANIM_WOBBLE_UP
620) ; even pixels down, odd pixels up
621)         ldi     DATA,15                 ; even pixels start full
622) ANIM_WOBBLE_DOWN:
623)         ldi     CNT,0
624) ANIM_WOBBLE_DOWN_DRAW:
625)         rcall   SET_PIXEL
626)         inc     CNT                     ; next pixel
627)         ldi     TMP,0x0F                ; invert color
628)         eor     DATA,TMP
629)         cpi     CNT,42                  ; loop
630)         brlo    ANIM_WOBBLE_DOWN_DRAW
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

631)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

632)         rcall   OUT_FRAME_TIME
633)         dec     DATA                    ; next color: darker
634)         cpi     DATA,16
635)         brlo    ANIM_WOBBLE_DOWN
636) ; done
637)         ret
638) 
639) 
640) 
641) ; run animation
642) ; input: -
643) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

644) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

645) ANIM_RUN:
646)         ldi     CNT,255                 ; start before 1st pixel
647) ANIM_RUN_LOOP:
648)         rcall   CLEAR                   ; clear
649)         ldi     DATA,15                 ; current pixel full on
650)         rcall   SET_PIXEL
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

651)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

652)         rcall   OUT_FRAME_TIME
653)         inc     CNT                     ; next pixel
654)         cpi     CNT,43                  ; loop until after last pixel
655)         brne    ANIM_RUN_LOOP
656) ; done
657)         ret
658) 
659) 
660) 
661) ; backwards run animation
662) ; input: -
663) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

664) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

665) ANIM_BW_RUN:
666)         ldi     CNT,42                  ; start after last pixel
667) ANIM_BW_RUN_LOOP:
668)         rcall   CLEAR                   ; clear
669)         ldi     DATA,15                 ; current pixel full on
670)         rcall   SET_PIXEL
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

671)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

672)         rcall   OUT_FRAME_TIME
673)         dec     CNT                     ; previous pixel
674)         cpi     CNT,255                 ; loop until before 1st pixel
675)         brne    ANIM_BW_RUN_LOOP
676) ; done
677)         ret
678) 
679) 
680) 
681) ; worm animation
682) ; input: -
683) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

684) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

685) ANIM_WORM:
686)         ldi     CNT,255                 ; worm starts before 1st pixel
687) ANIM_WORM_LOOP:
688)         rcall   CLEAR                   ; draw worm
689)         rcall   DRAW_WORM
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

690)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

691)         rcall   OUT_FRAME_TIME
692)         inc     CNT                     ; advance worm
693)         cpi     CNT,57                  ; loop until has exits
694)         brne    ANIM_WORM_LOOP
695) ; done
696)         ret
697) 
698) 
699) 
700) ; backwards worm animation
701) ; input: -
702) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

703) ; changes: X, FRAME, CNT, DATA, TMP, TMP2
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

704) ANIM_BW_WORM:
705)         ldi     CNT,56                  ; worm starts behind frame
706)                                         ;   head not yet visible
707) ANIM_BW_WORM_LOOP:
708)         rcall   CLEAR                   ; draw backwards worm
709)         rcall   DRAW_BW_WORM
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

710)         ldi     TMP,10                  ; show frame 60 ms
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

711)         rcall   OUT_FRAME_TIME
712)         dec     CNT                     ; advance worm backwards
713)         cpi     CNT,254                 ; loop until worm has exited
714)         brne    ANIM_BW_WORM_LOOP
715) ; done
716)         ret
717) 
718) 
719) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

720) ; read mode from switch and (store animation number)
721) ; input: MODE = old mode, CNT = animation number
722) ; output: MODE = new mode
723) ; changes: TMP, DATA
724) MODE_READ:
725) ; read new mode (into DATA)
726)         ldi     DATA,MODE_ALL
727)         sbic    MODE_SW_PIN,MODE_SW_BIT
728)         ldi     DATA,MODE_SINGLE
729) ; mode was changed from all to single -> save animation number
730)         cpi     MODE,MODE_ALL           ; old mode not all -> do nothing
731)         brne    MODE_READ_NOT_0_TO_1
732)         cpi     DATA,MODE_SINGLE        ; new mode not single -> do nothing
733)         brne    MODE_READ_NOT_0_TO_1
734)         sbic    EECR,EEPE               ; EEPROM write ongoing -> do nothing
735)         rjmp    MODE_READ_NOT_0_TO_1
736)         ldi     TMP,0<<EEPM1|0<<EEPM0   ; set EEPROM programming mode
737)         out     EECR,TMP
738)         ldi     TMP,0                   ; set EEPROM address
739)         out     EEARL,TMP
740)         mov     TMP,CNT                 ; set EEPROM data to animation number
741)         com     TMP                     ;   with NOTed number in upper nibble
742)         swap    TMP
743)         andi    TMP,0xF0
744)         or      TMP,CNT
745)         out     EEDR,TMP
746)         sbi     EECR,EEMPE              ; begin writing EEPROM
747)         sbi     EECR,EEPE
748) MODE_READ_NOT_0_TO_1:
749) ; remember new mode (in MODE)
750)         mov     MODE,DATA
751) ; done
752)         ret
753) 
754) 
755) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

756) ; animation table: animation function, iteration count (<= 255)
757) ANIM_TAB:
petaflot separate bulb and border ad...

petaflot authored 5 years ago

758)         .dw     ANIM_FRAMEBLINK
759)         .dw     5
760)         .dw     ANIM_BULBFAST
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

761)         .dw     3
762)         .dw     ANIM_WORM
petaflot separate bulb and border ad...

petaflot authored 5 years ago

763)         .dw     1
764)         .dw     ANIM_IDLE
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

765)         .dw     10
766)         .dw     ANIM_BW_RUN
petaflot separate bulb and border ad...

petaflot authored 5 years ago

767)         .dw     4
768)         .dw     ANIM_IDLE
769)         .dw     10
770)         ;.dw     ANIM_FADE
771)         ;.dw     5
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

772)         .dw     ANIM_BW_WORM
petaflot separate bulb and border ad...

petaflot authored 5 years ago

773)         .dw     1
774)         .dw     INVERTED_FADE
775)         .dw     15
776)         .dw     ANIM_IDLE
777)         .dw     20
778)         ;.dw     ANIM_WOBBLE
779)         ;.dw     5
780)         ;.dw     ANIM_RUN
781)         ;.dw     3
782)         .dw     ANIM_WORM
783)         .dw     1
784)         .dw     ANIM_FLICKER
785)         .dw     10
786)         .dw     ANIM_BW_WORM
787)         .dw     1
788)         .dw     ANIM_IDLE
789)         .dw     20
790)         .dw     ANIM_FRAMEBLINK
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

791)         .dw     5
petaflot separate bulb and border ad...

petaflot authored 5 years ago

792)         .dw     ANIM_IDLE
793)         .dw     20
794)         .dw     ANIM_FRAMEBLINK
795)         .dw     5
796)         .dw     ANIM_BULBSLOW
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

797)         .dw     3
petaflot separate bulb and border ad...

petaflot authored 5 years ago

798)         .dw     ANIM_IDLE
799)         .dw     20
800)         .dw     ANIM_WORM
801)         .dw     1
802)         .dw     INVERTED_FADE
803)         .dw     15
804)         .dw     ANIM_IDLE
805)         .dw     20
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

806) ANIM_TAB_END:
807) 
808) 
809) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

810) ; main program
811) MAIN:
812)         wdr
813) 
814) ; initialization
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

815)         ldi     MODE,MODE_UNKNOWN       ; unknown mode
816) 
817) ; get number of fist animation from EEPROM (into CNT)
818)         ldi     TMP,0                   ; set EEPROM address
819)         out     EEARL,TMP
820)         sbi     EECR,EERE               ; start EEPROM read
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

821)         in      ANI_NO,EEDR                ; get read value
822)         mov     TMP,ANI_NO              ; check if high nibble contains NOTed
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

823)         com     TMP                     ;   value
824)         swap    TMP
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

825)         cp      ANI_NO,TMP
826)         brne    MAIN_FIRST_ANIM_INVALID
827)         andi    ANI_NO,0x0F             ; throw away check value in high nibble
828)         cpi     ANI_NO,(ANIM_TAB_END - ANIM_TAB) / 2
829)         brlo    MAIN_FIRST_ANIM_OK
830) MAIN_FIRST_ANIM_INVALID:
831)         ldi     ANI_NO,0
832) MAIN_FIRST_ANIM_OK:
833) ; first iteration of animation (into DATA)
834)         ldi     ANI_IT,0
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

835) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

836) ; main loop
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

837) MAIN_LOOP:
838)         wdr
839) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

840) ; load pointer to animation function and repetition count from table
841)         ldi     ZL,low(2 * ANIM_TAB)
842)         ldi     ZH,high(2 * ANIM_TAB)
843)         mov     TMP,ANI_NO
844)         lsl     TMP
845)         lsl     TMP
846)         add     ZL,TMP
847)         clr     TMP
848)         adc     ZH,TMP
849)         lpm     DATA,Z+                 ; address of function -> TMP:DATA
850)         lpm     TMP,Z+
851)         lpm     CNT,Z+                  ; iteration count -> CNT
852)         mov     ZL,DATA                 ; address of function  -> Z
853)         mov     ZH,TMP
854) ; save iteration count
855)         push    CNT
856) ; call animation
857)         icall
858) ; read new mode
859)         mov     CNT,ANI_NO
860)         rcall   MODE_READ
861) ; restore iteration count
862)         pop     CNT
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

863) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

864) ; keep playing animation in single animation mode
865)         cpi     MODE,MODE_SINGLE
866)         breq    MAIN_NEXT_END
867) ; next iteration
868)         inc     ANI_IT
869)         cp      ANI_IT,CNT
870)         brlo    MAIN_NEXT_END
871)         clr     ANI_IT
872) ; next animation
873)         inc     ANI_NO
874)         cpi     ANI_NO,(ANIM_TAB_END - ANIM_TAB) / 2
875)         brlo    MAIN_NEXT_END
876)         clr     ANI_NO
877) MAIN_NEXT_END: