Stefan Schuermans commited on 2019-06-21 08:45:29
Showing 1 changed files, with 158 additions and 200 deletions.
convert macros to subroutines and loops in order to make firmware shorter in instruction memory, performance is almost the same
| ... | ... |
@@ -1,6 +1,5 @@ |
| 1 | 1 |
; bulb - BlinkenArea ultimate logo board |
| 2 |
-; version 1.1.0 date 2012-06-10 |
|
| 3 |
-; Copyright (C) 2011-2012 Stefan Schuermans <stefan@blinkenarea.org> |
|
| 2 |
+; Copyright (C) 2011-2019 Stefan Schuermans <stefan@blinkenarea.org> |
|
| 4 | 3 |
; Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html |
| 5 | 4 |
|
| 6 | 5 |
; ATtiny2313A, clock frequency: 8 MHz (internal oscillator) |
| ... | ... |
@@ -40,15 +39,21 @@ |
| 40 | 39 |
|
| 41 | 40 |
; general purpose registers |
| 42 | 41 |
.def TMP = r16 |
| 43 |
-.def CNT = r17 |
|
| 44 |
-.def DATA = r18 |
|
| 42 |
+.def TMP2 = r17 |
|
| 43 |
+.def CNT = r18 |
|
| 44 |
+.def DATA = r19 |
|
| 45 |
+.def GRAY = r20 |
|
| 45 | 46 |
|
| 46 | 47 |
; current mode |
| 47 |
-.def MODE = r19 |
|
| 48 |
+.def MODE = r21 |
|
| 48 | 49 |
.equ MODE_ALL = 0 ; play all animations |
| 49 | 50 |
.equ MODE_SINGLE = 1 ; play single animation only |
| 50 | 51 |
.equ MODE_UNKNOWN = 0xFF ; unknown mode |
| 51 | 52 |
|
| 53 |
+; current animation number and iterations |
|
| 54 |
+.def ANI_NO = r22 |
|
| 55 |
+.def ANI_IT = r23 |
|
| 56 |
+ |
|
| 52 | 57 |
|
| 53 | 58 |
|
| 54 | 59 |
.DSEG |
| ... | ... |
@@ -61,125 +66,6 @@ FRAME: .BYTE 42 |
| 61 | 66 |
|
| 62 | 67 |
|
| 63 | 68 |
|
| 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 |
|
| 77 |
- rcall_N @0,@1 - 1 |
|
| 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 |
|
| 114 |
- lsr DATA ; ensure remaining bit stays high |
|
| 115 |
- ; (pull-up for unused pin) |
|
| 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 |
|
| 160 |
- ldi TMP,0x80 ; ensure remaining bit stays high |
|
| 161 |
- ; (pull-up for unused pin) |
|
| 162 |
- out COL_PORT,TMP |
|
| 163 |
-.ENDM |
|
| 164 |
- |
|
| 165 |
- |
|
| 166 |
- |
|
| 167 |
-; play an animation N times (mode 0) or infinitely (mode 1) |
|
| 168 |
-; parameters: animation function, N, animation number |
|
| 169 |
-.MACRO PL_ANIM |
|
| 170 |
-PL_ANIM_LOOP: |
|
| 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 |
|
| 179 |
-.ENDM |
|
| 180 |
- |
|
| 181 |
- |
|
| 182 |
- |
|
| 183 | 69 |
.CSEG |
| 184 | 70 |
.ORG 0x000 |
| 185 | 71 |
rjmp ENTRY ; RESET |
| ... | ... |
@@ -244,43 +130,85 @@ ENTRY: |
| 244 | 130 |
|
| 245 | 131 |
|
| 246 | 132 |
|
| 247 |
-; wait 64 cycles |
|
| 133 |
+; wait 61 cycles |
|
| 248 | 134 |
; input: - |
| 249 | 135 |
; output: - |
| 250 | 136 |
; changes: TMP |
| 251 |
-; cycles: 64 (including rcall and ret) |
|
| 252 |
-WAIT64: |
|
| 253 |
- ldi TMP,19 |
|
| 254 |
-WAIT64_LOOP: |
|
| 137 |
+; cycles: 61 (including rcall and ret) |
|
| 138 |
+WAIT61: |
|
| 139 |
+ ldi TMP,18 |
|
| 140 |
+WAIT61_LOOP: |
|
| 255 | 141 |
dec TMP |
| 256 |
- brne WAIT64_LOOP |
|
| 142 |
+ brne WAIT61_LOOP |
|
| 257 | 143 |
; done |
| 258 | 144 |
ret |
| 259 | 145 |
|
| 260 | 146 |
|
| 261 | 147 |
|
| 148 |
+; output row for grayscale (black/white) and wait |
|
| 149 |
+; input: X = ptr to pixel data (0..15) |
|
| 150 |
+; GRAY = grayscale value (1..15) |
|
| 151 |
+; output: - |
|
| 152 |
+; changes: TMP, TMP2, DATA |
|
| 153 |
+; cycles: GRAY * 64 + 1 (including rcall and ret) |
|
| 154 |
+ROW_BW_WAIT: |
|
| 155 |
+; get data for LEDs |
|
| 156 |
+ ldi TMP2,7 ; 7 pixels |
|
| 157 |
+ROW_BW_WAIT_PIXEL: |
|
| 158 |
+ ld TMP,X+ ; get pixel value |
|
| 159 |
+ cp TMP,GRAY ; compare with grayscale value |
|
| 160 |
+ ror DATA ; store result as output bit |
|
| 161 |
+ dec TMP2 ; next pixel |
|
| 162 |
+ brne ROW_BW_WAIT_PIXEL |
|
| 163 |
+; restore data pointer |
|
| 164 |
+ subi XL,7 ; XH not there on ATtiny2313 |
|
| 165 |
+; output |
|
| 166 |
+ lsr DATA ; ensure remaining bit stays high |
|
| 167 |
+ ; (pull-up for unused pin) |
|
| 168 |
+ com DATA |
|
| 169 |
+ out COL_PORT,DATA |
|
| 170 |
+; wait 5 + (GRAY - 1) * 64 |
|
| 171 |
+ mov TMP2,GRAY |
|
| 172 |
+ rjmp ROW_BW_WAIT_LOOP_ENTRY |
|
| 173 |
+ROW_BW_WAIT_LOOP: |
|
| 174 |
+ rcall WAIT61 |
|
| 175 |
+ROW_BW_WAIT_LOOP_ENTRY: |
|
| 176 |
+ dec TMP2 |
|
| 177 |
+ brne ROW_BW_WAIT_LOOP |
|
| 178 |
+ ret |
|
| 179 |
+ |
|
| 180 |
+ |
|
| 181 |
+ |
|
| 182 |
+; turn off row (with same timing as ROW_BW_WAIT) |
|
| 183 |
+; input: - |
|
| 184 |
+; output: - |
|
| 185 |
+; changes: TMP |
|
| 186 |
+; cycles: 60 (including rcall and ret) |
|
| 187 |
+ROW_OFF: |
|
| 188 |
+ ldi TMP,17 |
|
| 189 |
+ROW_OFF_LOOP: |
|
| 190 |
+ dec TMP |
|
| 191 |
+ brne ROW_OFF_LOOP |
|
| 192 |
+ ldi TMP,0x80 ; ensure remaining bit stays high |
|
| 193 |
+ ; (pull-up for unused pin) |
|
| 194 |
+ out COL_PORT,TMP |
|
| 195 |
+ ret |
|
| 196 |
+ |
|
| 197 |
+ |
|
| 198 |
+ |
|
| 262 | 199 |
; output row (grayscales) |
| 263 | 200 |
; input: X = ptr to pixel data (0..15) |
| 264 | 201 |
; output: - |
| 265 |
-; changes: TMP, DATA |
|
| 266 |
-; cycles: 7269 (including rcall and ret) |
|
| 202 |
+; changes: TMP, TMP2, DATA |
|
| 203 |
+; cycles: 7822 (including rcall and ret) |
|
| 267 | 204 |
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 |
|
| 205 |
+ ldi GRAY,1 |
|
| 206 |
+ROW_GRAY_LOOP: |
|
| 207 |
+ rcall ROW_BW_WAIT |
|
| 208 |
+ inc GRAY |
|
| 209 |
+ cpi GRAY,16 |
|
| 210 |
+ brlo ROW_GRAY_LOOP |
|
| 211 |
+ rcall ROW_OFF |
|
| 284 | 212 |
; done |
| 285 | 213 |
ret |
| 286 | 214 |
|
| ... | ... |
@@ -289,7 +217,7 @@ ROW_GRAY: |
| 289 | 217 |
; output a frame |
| 290 | 218 |
; input: FRAME = pixel data (0..15) |
| 291 | 219 |
; output: - |
| 292 |
-; changes: TMP, CNT, DATA, X |
|
| 220 |
+; changes: TMP, TMP2, CNT, DATA, X |
|
| 293 | 221 |
; cycles: 43682 (including rcall and ret) |
| 294 | 222 |
; time: 5.5ms |
| 295 | 223 |
OUT_FRAME: |
| ... | ... |
@@ -319,7 +247,7 @@ OUT_FRAME_LOOP: |
| 319 | 247 |
; input: FRAME = pixel data (0..15) |
| 320 | 248 |
; TMP = time to show frame (1..255, in 5.5 ms steps) |
| 321 | 249 |
; output: - |
| 322 |
-; changes: X, TMP |
|
| 250 |
+; changes: X, TMP, TMP2 |
|
| 323 | 251 |
; time: TMP * 5.5 ms |
| 324 | 252 |
OUT_FRAME_TIME: |
| 325 | 253 |
; output frame |
| ... | ... |
@@ -455,7 +383,7 @@ DRAW_BW_WORM_END: |
| 455 | 383 |
; blink animation |
| 456 | 384 |
; input: - |
| 457 | 385 |
; output: - |
| 458 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 386 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 459 | 387 |
ANIM_BLINK: |
| 460 | 388 |
; off |
| 461 | 389 |
ldi DATA,0 ; minimum color |
| ... | ... |
@@ -475,7 +403,7 @@ ANIM_BLINK: |
| 475 | 403 |
; fade up and down animation |
| 476 | 404 |
; input: - |
| 477 | 405 |
; output: - |
| 478 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 406 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 479 | 407 |
ANIM_FADE: |
| 480 | 408 |
; fade up |
| 481 | 409 |
ldi DATA,0 ; start dark |
| ... | ... |
@@ -502,7 +430,7 @@ ANIM_FADE_DOWN: |
| 502 | 430 |
; flicker animation |
| 503 | 431 |
; input: - |
| 504 | 432 |
; output: - |
| 505 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 433 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 506 | 434 |
ANIM_FLICKER: |
| 507 | 435 |
; even pixels |
| 508 | 436 |
rcall CLEAR ; clear |
| ... | ... |
@@ -534,7 +462,7 @@ ANIM_FLICKER_ODD: |
| 534 | 462 |
; wobble animation |
| 535 | 463 |
; input: - |
| 536 | 464 |
; output: - |
| 537 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 465 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 538 | 466 |
ANIM_WOBBLE: |
| 539 | 467 |
; even pixels up, odd pixels down |
| 540 | 468 |
ldi DATA,0 ; even pixels start dark |
| ... | ... |
@@ -576,7 +504,7 @@ ANIM_WOBBLE_DOWN_DRAW: |
| 576 | 504 |
; run animation |
| 577 | 505 |
; input: - |
| 578 | 506 |
; output: - |
| 579 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 507 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 580 | 508 |
ANIM_RUN: |
| 581 | 509 |
ldi CNT,255 ; start before 1st pixel |
| 582 | 510 |
ANIM_RUN_LOOP: |
| ... | ... |
@@ -596,7 +524,7 @@ ANIM_RUN_LOOP: |
| 596 | 524 |
; backwards run animation |
| 597 | 525 |
; input: - |
| 598 | 526 |
; output: - |
| 599 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 527 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 600 | 528 |
ANIM_BW_RUN: |
| 601 | 529 |
ldi CNT,42 ; start after last pixel |
| 602 | 530 |
ANIM_BW_RUN_LOOP: |
| ... | ... |
@@ -616,7 +544,7 @@ ANIM_BW_RUN_LOOP: |
| 616 | 544 |
; worm animation |
| 617 | 545 |
; input: - |
| 618 | 546 |
; output: - |
| 619 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 547 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 620 | 548 |
ANIM_WORM: |
| 621 | 549 |
ldi CNT,255 ; worm starts before 1st pixel |
| 622 | 550 |
ANIM_WORM_LOOP: |
| ... | ... |
@@ -635,7 +563,7 @@ ANIM_WORM_LOOP: |
| 635 | 563 |
; backwards worm animation |
| 636 | 564 |
; input: - |
| 637 | 565 |
; output: - |
| 638 |
-; changes: X, FRAME, CNT, DATA, TMP |
|
| 566 |
+; changes: X, FRAME, CNT, DATA, TMP, TMP2 |
|
| 639 | 567 |
ANIM_BW_WORM: |
| 640 | 568 |
ldi CNT,56 ; worm starts behind frame |
| 641 | 569 |
; head not yet visible |
| ... | ... |
@@ -688,6 +616,28 @@ MODE_READ_NOT_0_TO_1: |
| 688 | 616 |
|
| 689 | 617 |
|
| 690 | 618 |
|
| 619 |
+; animation table: animation function, iteration count (<= 255) |
|
| 620 |
+ANIM_TAB: |
|
| 621 |
+ .dw ANIM_BLINK |
|
| 622 |
+ .dw 3 |
|
| 623 |
+ .dw ANIM_WORM |
|
| 624 |
+ .dw 3 |
|
| 625 |
+ .dw ANIM_FLICKER |
|
| 626 |
+ .dw 10 |
|
| 627 |
+ .dw ANIM_BW_RUN |
|
| 628 |
+ .dw 3 |
|
| 629 |
+ .dw ANIM_FADE |
|
| 630 |
+ .dw 2 |
|
| 631 |
+ .dw ANIM_BW_WORM |
|
| 632 |
+ .dw 3 |
|
| 633 |
+ .dw ANIM_WOBBLE |
|
| 634 |
+ .dw 5 |
|
| 635 |
+ .dw ANIM_RUN |
|
| 636 |
+ .dw 3 |
|
| 637 |
+ANIM_TAB_END: |
|
| 638 |
+ |
|
| 639 |
+ |
|
| 640 |
+ |
|
| 691 | 641 |
; main program |
| 692 | 642 |
MAIN: |
| 693 | 643 |
wdr |
| ... | ... |
@@ -699,56 +649,64 @@ MAIN: |
| 699 | 649 |
ldi TMP,0 ; set EEPROM address |
| 700 | 650 |
out EEARL,TMP |
| 701 | 651 |
sbi EECR,EERE ; start EEPROM read |
| 702 |
- in CNT,EEDR ; get read value |
|
| 703 |
- mov TMP,CNT ; check if high nibble contains NOTed |
|
| 652 |
+ in ANI_NO,EEDR ; get read value |
|
| 653 |
+ mov TMP,ANI_NO ; check if high nibble contains NOTed |
|
| 704 | 654 |
com TMP ; value |
| 705 | 655 |
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 |
- |
|
| 656 |
+ cp ANI_NO,TMP |
|
| 657 |
+ brne MAIN_FIRST_ANIM_INVALID |
|
| 658 |
+ andi ANI_NO,0x0F ; throw away check value in high nibble |
|
| 659 |
+ cpi ANI_NO,(ANIM_TAB_END - ANIM_TAB) / 2 |
|
| 660 |
+ brlo MAIN_FIRST_ANIM_OK |
|
| 661 |
+MAIN_FIRST_ANIM_INVALID: |
|
| 662 |
+ ldi ANI_NO,0 |
|
| 663 |
+MAIN_FIRST_ANIM_OK: |
|
| 664 |
+; first iteration of animation (into DATA) |
|
| 665 |
+ ldi ANI_IT,0 |
|
| 728 | 666 |
|
| 667 |
+; main loop |
|
| 729 | 668 |
MAIN_LOOP: |
| 730 | 669 |
wdr |
| 731 | 670 |
|
| 732 |
-; main loop |
|
| 671 |
+; load pointer to animation function and repetition count from table |
|
| 672 |
+ ldi ZL,low(2 * ANIM_TAB) |
|
| 673 |
+ ldi ZH,high(2 * ANIM_TAB) |
|
| 674 |
+ mov TMP,ANI_NO |
|
| 675 |
+ lsl TMP |
|
| 676 |
+ lsl TMP |
|
| 677 |
+ add ZL,TMP |
|
| 678 |
+ clr TMP |
|
| 679 |
+ adc ZH,TMP |
|
| 680 |
+ lpm DATA,Z+ ; address of function -> TMP:DATA |
|
| 681 |
+ lpm TMP,Z+ |
|
| 682 |
+ lpm CNT,Z+ ; iteration count -> CNT |
|
| 683 |
+ mov ZL,DATA ; address of function -> Z |
|
| 684 |
+ mov ZH,TMP |
|
| 685 |
+; save iteration count |
|
| 686 |
+ push CNT |
|
| 687 |
+; call animation |
|
| 688 |
+ icall |
|
| 689 |
+; read new mode |
|
| 690 |
+ mov CNT,ANI_NO |
|
| 691 |
+ rcall MODE_READ |
|
| 692 |
+; restore iteration count |
|
| 693 |
+ pop CNT |
|
| 733 | 694 |
|
| 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 |
|
| 695 |
+; keep playing animation in single animation mode |
|
| 696 |
+ cpi MODE,MODE_SINGLE |
|
| 697 |
+ breq MAIN_NEXT_END |
|
| 698 |
+; next iteration |
|
| 699 |
+ inc ANI_IT |
|
| 700 |
+ cp ANI_IT,CNT |
|
| 701 |
+ brlo MAIN_NEXT_END |
|
| 702 |
+ clr ANI_IT |
|
| 703 |
+; next animation |
|
| 704 |
+ inc ANI_NO |
|
| 705 |
+ cpi ANI_NO,(ANIM_TAB_END - ANIM_TAB) / 2 |
|
| 706 |
+ brlo MAIN_NEXT_END |
|
| 707 |
+ clr ANI_NO |
|
| 708 |
+MAIN_NEXT_END: |
|
| 750 | 709 |
|
| 751 | 710 |
; bottom of main loop |
| 752 |
- |
|
| 753 | 711 |
rjmp MAIN_LOOP |
| 754 | 712 |
|
| 755 | 713 |