3bf808e6ae20e1970589124cc7cdfc29185004b3
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: -
petaflot improved animations

petaflot authored 5 years ago

464) ; changes: X, FRAME, CNT, DATA, BULB, BORDER, TMP, TMP2
petaflot separate bulb and border ad...

petaflot authored 5 years ago

465) INVERTED_FADE:
466)         ;rcall   CLEAR                   ; clear
petaflot improved animations

petaflot authored 5 years ago

467)         ldi     DATA,0xf
468)         sts     FRAME+41,DATA           ; set filament pixel
469) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

470)         ldi     BORDER,15               ; start bright
471)         ldi     BULB,0                  ; start dark
472) INVERTED_FADE_BACK:;EVEN                     ; relative to the bulb
473)         rcall   BORDER_COLOR            ; paint border (to darker)
474)         rcall   BULB_COLOR              ; paint bulb (to brighter)
475)         ldi     TMP,10                  ; show frame 60 ms
476)         rcall   OUT_FRAME_TIME
477)         dec     BORDER                  ; fade down, 0-27
478)         cpi     BORDER,255              ; loop until full off
petaflot improved animations

petaflot authored 5 years ago

479)         inc     BULB                    ; fade up, 28-41
petaflot separate bulb and border ad...

petaflot authored 5 years ago

480)         cpi     BULB,15                 ; loop until almost full on
481)         brne    INVERTED_FADE_BACK
482) INVERTED_FADE_FORTH:;ODD
483)         rcall   BORDER_COLOR            ; paint border (to brighter)
484)         rcall   BULB_COLOR              ; paint bulb (to darker)
485)         ldi     TMP,10                  ; show frame 60 ms
486)         rcall   OUT_FRAME_TIME
487)         inc     BORDER                  ; fade up, 28-41
488)         cpi     BORDER,15               ; loop until almost full on
petaflot improved animations

petaflot authored 5 years ago

489)         dec     BULB                    ; fade down, 0-27
petaflot separate bulb and border ad...

petaflot authored 5 years ago

490)         cpi     BULB,255                ; loop until full off
491)         brne    INVERTED_FADE_FORTH
492) ; done
493)         ret
494) 
495) 
496) ; border (frame around bulb) blink animation
497) ; input: -
498) ; output: -
499) ; changes: X, FRAME, CNT, BORDER, TMP, TMP2
500) ANIM_FRAMEBLINK:
501)         rcall   CLEAR
502) ; off
503)         ldi     BORDER,0                ; minimum color
504)         rcall   BORDER_COLOR            ; paint
505)         ldi     TMP,100                 ; show frame 600 ms
506)         rcall   OUT_FRAME_TIME
507) ; on
508)         ldi     BORDER,15               ; maximum color
509)         rcall   BORDER_COLOR            ; paint
510)         ldi     TMP,100                 ; show frame 600 ms
511)         rcall   OUT_FRAME_TIME
512) ; done
513)         ret
514) 
515) ; bulb blink animation, fast
516) ; input: -
517) ; output: -
518) ; changes: X, FRAME, CNT, BULB, TMP, TMP2
519) ANIM_BULBFAST:
520)         rcall   CLEAR
petaflot improved animations

petaflot authored 5 years ago

521)         ldi     DATA,0xf
522)         sts     FRAME+41,DATA           ; set filament pixel
petaflot separate bulb and border ad...

petaflot authored 5 years ago

523) ; off
524)         ldi     BULB,0                ; minimum color
525)         rcall   BULB_COLOR            ; paint
526)         ldi     TMP,10                 ; show frame 20 ms
527)         rcall   OUT_FRAME_TIME
528) ; on
529)         ldi     BULB,15               ; maximum color
530)         rcall   BULB_COLOR            ; paint
531)         ldi     TMP,10                 ; show frame 20 ms
532)         rcall   OUT_FRAME_TIME
533) ; done
534)         ret
535) 
536) ; bulb blink animation, slow
537) ; input: -
538) ; output: -
539) ; changes: X, FRAME, CNT, BULB, TMP, TMP2
540) ANIM_BULBSLOW:
541)         rcall   CLEAR
petaflot improved animations

petaflot authored 5 years ago

542)         ldi     DATA,0xf
543)         sts     FRAME+41,DATA           ; set filament pixel
petaflot separate bulb and border ad...

petaflot authored 5 years ago

544) ; off
545)         ldi     BULB,0                ; minimum color
546)         rcall   BULB_COLOR            ; paint
547)         ldi     TMP,200
548)         rcall   OUT_FRAME_TIME
549) ; on
550)         ldi     BULB,15               ; maximum color
551)         rcall   BULB_COLOR            ; paint
552)         ldi     TMP,200
553)         rcall   OUT_FRAME_TIME
554) ; done
555)         ret
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

556) 
557) 
558) ; flicker animation
559) ; input: -
560) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

562) ANIM_FLICKER:
563) ; even pixels
564)         rcall   CLEAR                   ; clear
565)         ldi     DATA,15                 ; even pixels to maximum
petaflot separate bulb and border ad...

petaflot authored 5 years ago

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

Stefan Schuermans authored 12 years ago

568)         ldi     CNT,0
569) ANIM_FLICKER_EVEN:
570)         rcall   SET_PIXEL
571)         subi    CNT,-2                  ; move two pixels
572)         cpi     CNT,42                  ; loop
573)         brlo    ANIM_FLICKER_EVEN
petaflot separate bulb and border ad...

petaflot authored 5 years ago

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

Stefan Schuermans authored 12 years ago

575)         rcall   OUT_FRAME_TIME
576) ; odd pixels
577)         rcall   CLEAR                   ; clear
578)         ldi     DATA,15                 ; odd pixels to maximum
579)         ldi     CNT,1
580) ANIM_FLICKER_ODD:
581)         rcall   SET_PIXEL
582)         subi    CNT,-2                  ; move two pixels
583)         cpi     CNT,42                  ; loop
584)         brlo    ANIM_FLICKER_ODD
petaflot separate bulb and border ad...

petaflot authored 5 years ago

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

Stefan Schuermans authored 12 years ago

586)         rcall   OUT_FRAME_TIME
587) ; done
588)         ret
589) 
petaflot separate bulb and border ad...

petaflot authored 5 years ago

590) ANIM_IDLE:
591)         rcall   CLEAR                   ; clear
592)         ldi     TMP,500                 ; show frame 3000 ms
593)         rcall   OUT_FRAME_TIME
594) 
595)         ldi     DATA,0xf
596)         sts     FRAME+41,DATA                 ; set pixel, go back
597) 
598)         ldi     TMP,10                  ; show frame 60 ms
599)         rcall   OUT_FRAME_TIME
600)         ret
601) 
602) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

603) 
604) 
605) ; wobble animation
606) ; input: -
607) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

609) ANIM_WOBBLE:
610) ; even pixels up, odd pixels down
611)         ldi     DATA,0                  ; even pixels start dark
612) ANIM_WOBBLE_UP:
613)         ldi     CNT,0
614) ANIM_WOBBLE_UP_DRAW:
615)         rcall   SET_PIXEL
616)         inc     CNT                     ; next pixel
617)         ldi     TMP,0x0F                ; invert color
618)         eor     DATA,TMP
619)         cpi     CNT,42                  ; loop
620)         brlo    ANIM_WOBBLE_UP_DRAW
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

638)         rcall   OUT_FRAME_TIME
639)         dec     DATA                    ; next color: darker
640)         cpi     DATA,16
641)         brlo    ANIM_WOBBLE_DOWN
642) ; done
643)         ret
644) 
645) 
646) 
647) ; run animation
648) ; input: -
649) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

651) ANIM_RUN:
652)         ldi     CNT,255                 ; start before 1st pixel
653) ANIM_RUN_LOOP:
654)         rcall   CLEAR                   ; clear
655)         ldi     DATA,15                 ; current pixel full on
656)         rcall   SET_PIXEL
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

658)         rcall   OUT_FRAME_TIME
659)         inc     CNT                     ; next pixel
petaflot improved animations

petaflot authored 5 years ago

660)         cpi     CNT,41                  ; loop until after last pixel
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

661)         brne    ANIM_RUN_LOOP
662) ; done
663)         ret
664) 
665) 
666) 
667) ; backwards run animation
668) ; input: -
669) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

671) ANIM_BW_RUN:
petaflot improved animations

petaflot authored 5 years ago

672)         ldi     CNT,40                  ; start after last pixel
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

673) ANIM_BW_RUN_LOOP:
674)         rcall   CLEAR                   ; clear
675)         ldi     DATA,15                 ; current pixel full on
676)         rcall   SET_PIXEL
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

678)         rcall   OUT_FRAME_TIME
679)         dec     CNT                     ; previous pixel
680)         cpi     CNT,255                 ; loop until before 1st pixel
681)         brne    ANIM_BW_RUN_LOOP
682) ; done
683)         ret
684) 
685) 
686) 
687) ; worm animation
688) ; input: -
689) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

691) ANIM_WORM:
692)         ldi     CNT,255                 ; worm starts before 1st pixel
693) ANIM_WORM_LOOP:
694)         rcall   CLEAR                   ; draw worm
695)         rcall   DRAW_WORM
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

697)         rcall   OUT_FRAME_TIME
698)         inc     CNT                     ; advance worm
699)         cpi     CNT,57                  ; loop until has exits
700)         brne    ANIM_WORM_LOOP
701) ; done
702)         ret
703) 
704) 
705) 
706) ; backwards worm animation
707) ; input: -
708) ; output: -
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

710) ANIM_BW_WORM:
711)         ldi     CNT,56                  ; worm starts behind frame
712)                                         ;   head not yet visible
713) ANIM_BW_WORM_LOOP:
714)         rcall   CLEAR                   ; draw backwards worm
715)         rcall   DRAW_BW_WORM
Stefan Schuermans adapt time in comments

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

717)         rcall   OUT_FRAME_TIME
718)         dec     CNT                     ; advance worm backwards
719)         cpi     CNT,254                 ; loop until worm has exited
720)         brne    ANIM_BW_WORM_LOOP
721) ; done
722)         ret
723) 
724) 
725) 
Stefan Schuermans remember animation number i...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 5 years ago

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

petaflot authored 5 years ago

764)         .dw     ANIM_FRAMEBLINK
765)         .dw     5
petaflot improved animations

petaflot authored 5 years ago

766)         .dw     ANIM_BULBSLOW
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

767)         .dw     3
768)         .dw     ANIM_WORM
petaflot separate bulb and border ad...

petaflot authored 5 years ago

769)         .dw     1
770)         .dw     ANIM_IDLE
petaflot improved animations

petaflot authored 5 years ago

771)         .dw     20
772)         .dw     ANIM_BW_WORM
773)         .dw     1
774)         .dw     ANIM_RUN
775)         .dw     1
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

776)         .dw     ANIM_BW_RUN
petaflot improved animations

petaflot authored 5 years ago

777)         .dw     1
778)         .dw     ANIM_WORM
779)         .dw     1
petaflot separate bulb and border ad...

petaflot authored 5 years ago

780)         .dw     ANIM_IDLE
781)         .dw     10
782)         .dw     INVERTED_FADE
petaflot improved animations

petaflot authored 5 years ago

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

petaflot authored 5 years ago

784)         .dw     ANIM_IDLE
785)         .dw     20
786)         .dw     ANIM_FLICKER
787)         .dw     10
788)         .dw     ANIM_IDLE
789)         .dw     20
790)         .dw     ANIM_FRAMEBLINK
petaflot improved animations

petaflot authored 5 years ago

791)         .dw     1
792)         .dw     ANIM_BULBFAST
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

petaflot authored 5 years ago

794)         .dw     ANIM_FRAMEBLINK
petaflot improved animations

petaflot authored 5 years ago

795)         .dw     1
petaflot separate bulb and border ad...

petaflot authored 5 years ago

796)         .dw     ANIM_IDLE
797)         .dw     20
798)         .dw     INVERTED_FADE
petaflot improved animations

petaflot authored 5 years ago

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

petaflot authored 5 years ago

800)         .dw     ANIM_IDLE
801)         .dw     20
petaflot improved animations

petaflot authored 5 years ago

802)         ;.dw     ANIM_WOBBLE
803)         ;.dw     5
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

804) ANIM_TAB_END:
805) 
806) 
807) 
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

821)         com     TMP                     ;   value
822)         swap    TMP
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

833) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

834) ; main loop
Stefan Schuermans version 1.0.0

Stefan Schuermans authored 12 years ago

835) MAIN_LOOP:
836)         wdr
837) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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

Stefan Schuermans authored 12 years ago

861) 
Stefan Schuermans macros -> subroutines/loops

Stefan Schuermans authored 5 years ago

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