1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
|
ledcube.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000003d2 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .bss 00000088 00800060 00800060 00000446 2**0
ALLOC
2 .stab 00003f90 00000000 00000000 00000448 2**2
CONTENTS, READONLY, DEBUGGING
3 .stabstr 00002106 00000000 00000000 000043d8 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end>
2: 2c c0 rjmp .+88 ; 0x5c <__bad_interrupt>
4: 2b c0 rjmp .+86 ; 0x5c <__bad_interrupt>
6: 7f c0 rjmp .+254 ; 0x106 <__vector_3>
8: 29 c0 rjmp .+82 ; 0x5c <__bad_interrupt>
a: 28 c0 rjmp .+80 ; 0x5c <__bad_interrupt>
c: 27 c0 rjmp .+78 ; 0x5c <__bad_interrupt>
e: 26 c0 rjmp .+76 ; 0x5c <__bad_interrupt>
10: 25 c0 rjmp .+74 ; 0x5c <__bad_interrupt>
12: 25 c0 rjmp .+74 ; 0x5e <__vector_9>
14: 23 c0 rjmp .+70 ; 0x5c <__bad_interrupt>
16: 22 c0 rjmp .+68 ; 0x5c <__bad_interrupt>
18: 21 c0 rjmp .+66 ; 0x5c <__bad_interrupt>
1a: 20 c0 rjmp .+64 ; 0x5c <__bad_interrupt>
1c: 1f c0 rjmp .+62 ; 0x5c <__bad_interrupt>
1e: 1e c0 rjmp .+60 ; 0x5c <__bad_interrupt>
20: 1d c0 rjmp .+58 ; 0x5c <__bad_interrupt>
22: 1c c0 rjmp .+56 ; 0x5c <__bad_interrupt>
24: 1b c0 rjmp .+54 ; 0x5c <__bad_interrupt>
00000026 <__ctors_end>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61
00000032 <__do_copy_data>:
32: 10 e0 ldi r17, 0x00 ; 0
34: a0 e6 ldi r26, 0x60 ; 96
36: b0 e0 ldi r27, 0x00 ; 0
38: e2 ed ldi r30, 0xD2 ; 210
3a: f3 e0 ldi r31, 0x03 ; 3
3c: 02 c0 rjmp .+4 ; 0x42 <.do_copy_data_start>
0000003e <.do_copy_data_loop>:
3e: 05 90 lpm r0, Z+
40: 0d 92 st X+, r0
00000042 <.do_copy_data_start>:
42: a0 36 cpi r26, 0x60 ; 96
44: b1 07 cpc r27, r17
46: d9 f7 brne .-10 ; 0x3e <.do_copy_data_loop>
00000048 <__do_clear_bss>:
48: 10 e0 ldi r17, 0x00 ; 0
4a: a0 e6 ldi r26, 0x60 ; 96
4c: b0 e0 ldi r27, 0x00 ; 0
4e: 01 c0 rjmp .+2 ; 0x52 <.do_clear_bss_start>
00000050 <.do_clear_bss_loop>:
50: 1d 92 st X+, r1
00000052 <.do_clear_bss_start>:
52: a8 3e cpi r26, 0xE8 ; 232
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <.do_clear_bss_loop>
58: 06 d1 rcall .+524 ; 0x266 <main>
5a: b9 c1 rjmp .+882 ; 0x3ce <_exit>
0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>
0000005e <__vector_9>:
//volatile uint32_t timer0_overflow_count = 0;
volatile uint32_t timer0_millis = 0;
//static uint8_t timer0_fract = 0;
ISR(TIMER0_OVF_vect)
5e: 1f 92 push r1
60: 0f 92 push r0
62: 0f b6 in r0, 0x3f ; 63
64: 0f 92 push r0
66: 11 24 eor r1, r1
68: 2f 93 push r18
6a: 3f 93 push r19
6c: 4f 93 push r20
6e: 5f 93 push r21
70: 8f 93 push r24
72: 9f 93 push r25
{
// copy these to local variables so they can be stored in registers
// (volatile variables must be read from memory on every access)
uint32_t m = timer0_millis;
74: 20 91 e3 00 lds r18, 0x00E3
78: 30 91 e4 00 lds r19, 0x00E4
7c: 40 91 e5 00 lds r20, 0x00E5
80: 50 91 e6 00 lds r21, 0x00E6
//uint8_t f = timer0_fract;
static uint8_t timer0_fract = 0;
m += MILLIS_INC;
84: 2f 5f subi r18, 0xFF ; 255
86: 3f 4f sbci r19, 0xFF ; 255
88: 4f 4f sbci r20, 0xFF ; 255
8a: 5f 4f sbci r21, 0xFF ; 255
//f += FRACT_INC;
timer0_fract += FRACT_INC;
8c: 90 91 e7 00 lds r25, 0x00E7
90: 89 2f mov r24, r25
92: 8d 5f subi r24, 0xFD ; 253
94: 80 93 e7 00 sts 0x00E7, r24
//if (f >= FRACT_MAX) {
if (timer0_fract >= FRACT_MAX) {
98: 8d 37 cpi r24, 0x7D ; 125
9a: 38 f0 brcs .+14 ; 0xaa <__vector_9+0x4c>
//f -= FRACT_MAX;
timer0_fract -= FRACT_MAX;
9c: 9a 57 subi r25, 0x7A ; 122
9e: 90 93 e7 00 sts 0x00E7, r25
++m;
a2: 2f 5f subi r18, 0xFF ; 255
a4: 3f 4f sbci r19, 0xFF ; 255
a6: 4f 4f sbci r20, 0xFF ; 255
a8: 5f 4f sbci r21, 0xFF ; 255
}
//timer0_fract = f;
timer0_millis = m;
aa: 20 93 e3 00 sts 0x00E3, r18
ae: 30 93 e4 00 sts 0x00E4, r19
b2: 40 93 e5 00 sts 0x00E5, r20
b6: 50 93 e6 00 sts 0x00E6, r21
//if (timer0_overflow_count & 0x1)
//if (m - last_time >= 5) {
//debounce_keys(); // called nearly each 2ms (0,002048s)
//last_time = m;
//}
}
ba: 9f 91 pop r25
bc: 8f 91 pop r24
be: 5f 91 pop r21
c0: 4f 91 pop r20
c2: 3f 91 pop r19
c4: 2f 91 pop r18
c6: 0f 90 pop r0
c8: 0f be out 0x3f, r0 ; 63
ca: 0f 90 pop r0
cc: 1f 90 pop r1
ce: 18 95 reti
000000d0 <_Z9clear_ledv>:
else {
cube[y][z] &= ~(((unsigned char)1) << x);
}
}
void clear_led()
d0: 20 e0 ldi r18, 0x00 ; 0
d2: 30 e0 ldi r19, 0x00 ; 0
d4: 14 c0 rjmp .+40 ; 0xfe <_Z9clear_ledv+0x2e>
{
for (unsigned char z = 0; z < 8; ++z) {
for (unsigned char y = 0; y < 8; ++y) {
cube[y][z] = 0;
d6: fc 01 movw r30, r24
d8: 43 e0 ldi r20, 0x03 ; 3
da: ee 0f add r30, r30
dc: ff 1f adc r31, r31
de: 4a 95 dec r20
e0: e1 f7 brne .-8 ; 0xda <_Z9clear_ledv+0xa>
e2: e2 0f add r30, r18
e4: f3 1f adc r31, r19
e6: ee 59 subi r30, 0x9E ; 158
e8: ff 4f sbci r31, 0xFF ; 255
ea: 10 82 st Z, r1
ec: 01 96 adiw r24, 0x01 ; 1
}
void clear_led()
{
for (unsigned char z = 0; z < 8; ++z) {
for (unsigned char y = 0; y < 8; ++y) {
ee: 88 30 cpi r24, 0x08 ; 8
f0: 91 05 cpc r25, r1
f2: 89 f7 brne .-30 ; 0xd6 <_Z9clear_ledv+0x6>
f4: 2f 5f subi r18, 0xFF ; 255
f6: 3f 4f sbci r19, 0xFF ; 255
}
}
void clear_led()
{
for (unsigned char z = 0; z < 8; ++z) {
f8: 28 30 cpi r18, 0x08 ; 8
fa: 31 05 cpc r19, r1
fc: 19 f0 breq .+6 ; 0x104 <_Z9clear_ledv+0x34>
fe: 80 e0 ldi r24, 0x00 ; 0
100: 90 e0 ldi r25, 0x00 ; 0
102: e9 cf rjmp .-46 ; 0xd6 <_Z9clear_ledv+0x6>
104: 08 95 ret
00000106 <__vector_3>:
/*****************************************************************************
* RENDER
*****************************************************************************/
ISR(TIMER2_COMP_vect)
106: 1f 92 push r1
108: 0f 92 push r0
10a: 0f b6 in r0, 0x3f ; 63
10c: 0f 92 push r0
10e: 11 24 eor r1, r1
110: 2f 93 push r18
112: 3f 93 push r19
114: 4f 93 push r20
116: 6f 93 push r22
118: 7f 93 push r23
11a: 8f 93 push r24
11c: 9f 93 push r25
11e: ef 93 push r30
120: ff 93 push r31
{
PORTD &= ~0x08; // layer down, should be done before latch
122: 93 98 cbi 0x12, 3 ; 18
PORTD &= ~0x20; // latch low
124: 95 98 cbi 0x12, 5 ; 18
unsigned char current_layer_ = current_layer;
126: 40 91 60 00 lds r20, 0x0060
12a: 20 e0 ldi r18, 0x00 ; 0
12c: 30 e0 ldi r19, 0x00 ; 0
for (unsigned char j = 0; j < 8; ++j) {
unsigned char val = cube[j][current_layer_];
12e: 64 2f mov r22, r20
130: 70 e0 ldi r23, 0x00 ; 0
132: f9 01 movw r30, r18
134: 83 e0 ldi r24, 0x03 ; 3
136: ee 0f add r30, r30
138: ff 1f adc r31, r31
13a: 8a 95 dec r24
13c: e1 f7 brne .-8 ; 0x136 <__vector_3+0x30>
13e: e6 0f add r30, r22
140: f7 1f adc r31, r23
142: ee 59 subi r30, 0x9E ; 158
144: ff 4f sbci r31, 0xFF ; 255
146: 90 81 ld r25, Z
PORTD &= ~0x10;
148: 94 98 cbi 0x12, 4 ; 18
PORTC = val;
14a: 95 bb out 0x15, r25 ; 21
PORTD = (PORTD & ~0xC0) | (val & 0xC0);
14c: 82 b3 in r24, 0x12 ; 18
14e: 90 7c andi r25, 0xC0 ; 192
150: 8f 73 andi r24, 0x3F ; 63
152: 98 2b or r25, r24
154: 92 bb out 0x12, r25 ; 18
PORTD |= 0x10;
156: 94 9a sbi 0x12, 4 ; 18
158: 2f 5f subi r18, 0xFF ; 255
15a: 3f 4f sbci r19, 0xFF ; 255
ISR(TIMER2_COMP_vect)
{
PORTD &= ~0x08; // layer down, should be done before latch
PORTD &= ~0x20; // latch low
unsigned char current_layer_ = current_layer;
for (unsigned char j = 0; j < 8; ++j) {
15c: 28 30 cpi r18, 0x08 ; 8
15e: 31 05 cpc r19, r1
160: 41 f7 brne .-48 ; 0x132 <__vector_3+0x2c>
PORTD &= ~0x10;
PORTC = val;
PORTD = (PORTD & ~0xC0) | (val & 0xC0);
PORTD |= 0x10;
}
PORTB = (PORTB & ~0x07) | current_layer_;
162: 88 b3 in r24, 0x18 ; 24
164: 88 7f andi r24, 0xF8 ; 248
166: 84 2b or r24, r20
168: 88 bb out 0x18, r24 ; 24
PORTD |= 0x20;
16a: 95 9a sbi 0x12, 5 ; 18
++current_layer_;
current_layer = current_layer_ & 0x07;
16c: 4f 5f subi r20, 0xFF ; 255
16e: 47 70 andi r20, 0x07 ; 7
170: 40 93 60 00 sts 0x0060, r20
PORTD |= 0x08; // layer, should be done in the end and must be after latch
174: 93 9a sbi 0x12, 3 ; 18
}
176: ff 91 pop r31
178: ef 91 pop r30
17a: 9f 91 pop r25
17c: 8f 91 pop r24
17e: 7f 91 pop r23
180: 6f 91 pop r22
182: 4f 91 pop r20
184: 3f 91 pop r19
186: 2f 91 pop r18
188: 0f 90 pop r0
18a: 0f be out 0x3f, r0 ; 63
18c: 0f 90 pop r0
18e: 1f 90 pop r1
190: 18 95 reti
00000192 <rs232>:
void tmp2cube (void);
// Take input from a computer and load it onto the cube buffer
void rs232(void)
192: 40 e0 ldi r20, 0x00 ; 0
194: 50 e0 ldi r21, 0x00 ; 0
196: 20 e0 ldi r18, 0x00 ; 0
198: 30 e0 ldi r19, 0x00 ; 0
// Should switch state every time the code
// is waiting for a byte to be received.
//LED_PORT ^= LED_RED;
// Wait until a byte has been received
while ( !(UCSRA & (1<<RXC)) );
19a: 5f 9b sbis 0x0b, 7 ; 11
19c: fe cf rjmp .-4 ; 0x19a <rs232+0x8>
// Load the received byte from rs232 into a buffer.
tempval = UDR;
19e: 8c b1 in r24, 0x0c ; 12
1a0: 90 e0 ldi r25, 0x00 ; 0
// are reset to 0. This way the x and y counters are
// always the same on the computer and in the cube.
// To send an 0xff byte, you have to send it twice!
// Go into sync escape mode
if (tempval == 0xff)
1a2: 8f 3f cpi r24, 0xFF ; 255
1a4: 91 05 cpc r25, r1
1a6: 31 f4 brne .+12 ; 0x1b4 <rs232+0x22>
{
// Wait for the next byte
while ( !(UCSRA & (1<<RXC)) );
1a8: 5f 9b sbis 0x0b, 7 ; 11
1aa: fe cf rjmp .-4 ; 0x1a8 <rs232+0x16>
// Get the next byte
tempval = UDR;
1ac: 8c b1 in r24, 0x0c ; 12
1ae: 90 e0 ldi r25, 0x00 ; 0
// Sync signal is received.
// Reset x and y counters to 0.
if (tempval == 0x00)
1b0: 00 97 sbiw r24, 0x00 ; 0
1b2: 79 f3 breq .-34 ; 0x192 <rs232>
}
if (escape == 0)
{
// Load data into the current position in the buffer
fb[x][y] = tempval;
1b4: fa 01 movw r30, r20
1b6: 93 e0 ldi r25, 0x03 ; 3
1b8: ee 0f add r30, r30
1ba: ff 1f adc r31, r31
1bc: 9a 95 dec r25
1be: e1 f7 brne .-8 ; 0x1b8 <rs232+0x26>
1c0: e2 0f add r30, r18
1c2: f3 1f adc r31, r19
1c4: ed 55 subi r30, 0x5D ; 93
1c6: ff 4f sbci r31, 0xFF ; 255
1c8: 80 83 st Z, r24
// Check if we have reached the limits of the buffer array.
if (y == 7)
1ca: 27 30 cpi r18, 0x07 ; 7
1cc: 31 05 cpc r19, r1
1ce: 41 f4 brne .+16 ; 0x1e0 <rs232+0x4e>
{
if (x == 7)
1d0: 47 30 cpi r20, 0x07 ; 7
1d2: 51 05 cpc r21, r1
1d4: 11 f4 brne .+4 ; 0x1da <rs232+0x48>
{
// All data is loaded. Reset both counters
y = 0;
x = 0;
// Copy the data onto the cube.
tmp2cube();
1d6: f1 d0 rcall .+482 ; 0x3ba <_Z8tmp2cubev>
1d8: dc cf rjmp .-72 ; 0x192 <rs232>
} else
{
// A layer is loaded, reset y and increment x.
x++;
1da: 4f 5f subi r20, 0xFF ; 255
1dc: 5f 4f sbci r21, 0xFF ; 255
1de: db cf rjmp .-74 ; 0x196 <rs232+0x4>
y = 0;
}
} else
{
// We are in the middle of loading a layer. increment y.
y++;
1e0: 2f 5f subi r18, 0xFF ; 255
1e2: 3f 4f sbci r19, 0xFF ; 255
1e4: da cf rjmp .-76 ; 0x19a <rs232+0x8>
000001e6 <_Z7set_ledhhhb>:
/*****************************************************************************
* ACCESSORS
*****************************************************************************/
unsigned char inrange(int x, int y, int z);
void set_led(unsigned char x, unsigned char y, unsigned char z, bool on)
1e6: ef 92 push r14
1e8: ff 92 push r15
1ea: 0f 93 push r16
1ec: 1f 93 push r17
1ee: cf 93 push r28
1f0: df 93 push r29
1f2: f8 2e mov r15, r24
1f4: e2 2e mov r14, r18
{
if (!inrange(x, y, z)) {
1f6: 06 2f mov r16, r22
1f8: 10 e0 ldi r17, 0x00 ; 0
1fa: c4 2f mov r28, r20
1fc: d0 e0 ldi r29, 0x00 ; 0
1fe: 90 e0 ldi r25, 0x00 ; 0
200: b8 01 movw r22, r16
202: ae 01 movw r20, r28
204: c6 d0 rcall .+396 ; 0x392 <_Z7inrangeiii>
206: 88 23 and r24, r24
208: 39 f1 breq .+78 ; 0x258 <_Z7set_ledhhhb+0x72>
20a: b8 01 movw r22, r16
20c: 23 e0 ldi r18, 0x03 ; 3
20e: 66 0f add r22, r22
210: 77 1f adc r23, r23
212: 2a 95 dec r18
214: e1 f7 brne .-8 ; 0x20e <_Z7set_ledhhhb+0x28>
assert(x >= 0 && x <= 7);
assert(y >= 0 && y <= 7);
assert(z >= 0 && z <= 7);
*/
if (on) {
216: ee 20 and r14, r14
218: 79 f0 breq .+30 ; 0x238 <_Z7set_ledhhhb+0x52>
cube[y][z] |= ((unsigned char)1) << x;
21a: fb 01 movw r30, r22
21c: ec 0f add r30, r28
21e: fd 1f adc r31, r29
220: ee 59 subi r30, 0x9E ; 158
222: ff 4f sbci r31, 0xFF ; 255
224: 20 81 ld r18, Z
226: 81 e0 ldi r24, 0x01 ; 1
228: 90 e0 ldi r25, 0x00 ; 0
22a: 02 c0 rjmp .+4 ; 0x230 <_Z7set_ledhhhb+0x4a>
22c: 88 0f add r24, r24
22e: 99 1f adc r25, r25
230: fa 94 dec r15
232: e2 f7 brpl .-8 ; 0x22c <_Z7set_ledhhhb+0x46>
234: 28 2b or r18, r24
236: 0f c0 rjmp .+30 ; 0x256 <_Z7set_ledhhhb+0x70>
}
else {
cube[y][z] &= ~(((unsigned char)1) << x);
238: fb 01 movw r30, r22
23a: ec 0f add r30, r28
23c: fd 1f adc r31, r29
23e: ee 59 subi r30, 0x9E ; 158
240: ff 4f sbci r31, 0xFF ; 255
242: 20 81 ld r18, Z
244: 81 e0 ldi r24, 0x01 ; 1
246: 90 e0 ldi r25, 0x00 ; 0
248: 02 c0 rjmp .+4 ; 0x24e <_Z7set_ledhhhb+0x68>
24a: 88 0f add r24, r24
24c: 99 1f adc r25, r25
24e: fa 94 dec r15
250: e2 f7 brpl .-8 ; 0x24a <_Z7set_ledhhhb+0x64>
252: 80 95 com r24
254: 28 23 and r18, r24
256: 20 83 st Z, r18
}
}
258: df 91 pop r29
25a: cf 91 pop r28
25c: 1f 91 pop r17
25e: 0f 91 pop r16
260: ff 90 pop r15
262: ef 90 pop r14
264: 08 95 ret
00000266 <main>:
/*****************************************************************************
* MAIN
*****************************************************************************/
int main()
266: df 92 push r13
268: ef 92 push r14
26a: ff 92 push r15
26c: 0f 93 push r16
26e: 1f 93 push r17
* Initialisation
* =======================================================================
*/
//*** init time management
TCNT0 = 0; // init timer count to 0
270: 12 be out 0x32, r1 ; 50
TCCR0 |= 0x03; // prescaler: 64
272: 83 b7 in r24, 0x33 ; 51
274: 83 60 ori r24, 0x03 ; 3
276: 83 bf out 0x33, r24 ; 51
TIMSK |= 0x01; // enable timer 0 overflow interrupt
278: 89 b7 in r24, 0x39 ; 57
27a: 81 60 ori r24, 0x01 ; 1
27c: 89 bf out 0x39, r24 ; 57
// Timer 2
// Frame buffer interrupt
// 14745600/128/11 = 10472.72 interrupts per second
// 10472.72/8 = 1309 frames per second
OCR2 = 11; // interrupt at counter = 10
27e: 8b e0 ldi r24, 0x0B ; 11
280: 83 bd out 0x23, r24 ; 35
TCCR2 |= (1 << CS20) | (0 << CS21) | (1 << CS22); // Prescaler = 128.
282: 85 b5 in r24, 0x25 ; 37
284: 85 60 ori r24, 0x05 ; 5
286: 85 bd out 0x25, r24 ; 37
TCCR2 |= (1 << WGM21); // CTC mode. Reset counter when OCR2 is reached.
288: 85 b5 in r24, 0x25 ; 37
28a: 88 60 ori r24, 0x08 ; 8
28c: 85 bd out 0x25, r24 ; 37
TCNT2 = 0x00; // initial counter value = 0;
28e: 14 bc out 0x24, r1 ; 36
TIMSK |= (1 << OCIE2); // Enable CTC interrupt
290: 89 b7 in r24, 0x39 ; 57
292: 80 68 ori r24, 0x80 ; 128
294: 89 bf out 0x39, r24 ; 57
PORTD = 0;
296: 12 ba out 0x12, r1 ; 18
PORTB = 0;
298: 18 ba out 0x18, r1 ; 24
PORTC = 0;
29a: 15 ba out 0x15, r1 ; 21
DDRD = 0xff;
29c: 8f ef ldi r24, 0xFF ; 255
29e: 81 bb out 0x11, r24 ; 17
DDRB = 0xff;
2a0: 87 bb out 0x17, r24 ; 23
DDRC = 0xff;
2a2: 84 bb out 0x14, r24 ; 20
////UDR = 0x00; // send an empty byte to indicate powerup.
#if 1
#define BAUDRATE 38400
#define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)
UBRRH = (uint8_t)(BAUD_PRESCALLER>>8);
2a4: 10 bc out 0x20, r1 ; 32
UBRRL = (uint8_t)(BAUD_PRESCALLER);
2a6: 89 e1 ldi r24, 0x19 ; 25
2a8: 89 b9 out 0x09, r24 ; 9
//UBRRH = (uint8_t)(0);
//UBRRL = (uint8_t)(0);
UCSRC = (1<<URSEL)|(3<<UCSZ0);
2aa: 86 e8 ldi r24, 0x86 ; 134
2ac: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN)|(1<<TXEN);
2ae: 88 e1 ldi r24, 0x18 ; 24
2b0: 8a b9 out 0x0a, r24 ; 10
#undef BAUDRATE
#undef BAUD_PRESCALLER
#endif
//*** set interupts
sei();
2b2: 78 94 sei
//while (1) { delay(1000); UDR = 'a'; }
//while (1) { UDR = 'a'; }
//DDRD |= 0x02; while (1) { delay(1000); PORTD ^= 0x02; }
rs232();
2b4: 6e df rcall .-292 ; 0x192 <rs232>
2b6: 20 e0 ldi r18, 0x00 ; 0
return timer0_millis;
}
void delay(uint32_t ms)
{
in_wait = true;
2b8: ee 24 eor r14, r14
2ba: e3 94 inc r14
//clear_led();
//delay_ms(1000);
for (unsigned char z = 0; z < 8; ++z) {
for (unsigned char y = 0; y < 8; ++y) {
cube[y][z] = 0xFF;
2bc: dd 24 eor r13, r13
2be: da 94 dec r13
2c0: 14 c0 rjmp .+40 ; 0x2ea <main+0x84>
//while (1) { delay(1000); UDR = 'a'; }
//while (1) { UDR = 'a'; }
//DDRD |= 0x02; while (1) { delay(1000); PORTD ^= 0x02; }
rs232();
2c2: 80 e0 ldi r24, 0x00 ; 0
2c4: 90 e0 ldi r25, 0x00 ; 0
//clear_led();
//delay_ms(1000);
for (unsigned char z = 0; z < 8; ++z) {
for (unsigned char y = 0; y < 8; ++y) {
cube[y][z] = 0xFF;
2c6: 42 2f mov r20, r18
2c8: 50 e0 ldi r21, 0x00 ; 0
2ca: fc 01 movw r30, r24
2cc: 33 e0 ldi r19, 0x03 ; 3
2ce: ee 0f add r30, r30
2d0: ff 1f adc r31, r31
2d2: 3a 95 dec r19
2d4: e1 f7 brne .-8 ; 0x2ce <main+0x68>
2d6: e4 0f add r30, r20
2d8: f5 1f adc r31, r21
2da: ee 59 subi r30, 0x9E ; 158
2dc: ff 4f sbci r31, 0xFF ; 255
2de: d0 82 st Z, r13
2e0: 01 96 adiw r24, 0x01 ; 1
for (;;) {
//clear_led();
//delay_ms(1000);
for (unsigned char z = 0; z < 8; ++z) {
for (unsigned char y = 0; y < 8; ++y) {
2e2: 88 30 cpi r24, 0x08 ; 8
2e4: 91 05 cpc r25, r1
2e6: 89 f7 brne .-30 ; 0x2ca <main+0x64>
for (;;) {
//clear_led();
//delay_ms(1000);
for (unsigned char z = 0; z < 8; ++z) {
2e8: 2f 5f subi r18, 0xFF ; 255
2ea: 28 30 cpi r18, 0x08 ; 8
2ec: 50 f3 brcs .-44 ; 0x2c2 <main+0x5c>
return timer0_millis;
}
void delay(uint32_t ms)
{
in_wait = true;
2ee: e0 92 a2 00 sts 0x00A2, r14
}
*/
inline uint32_t millis()
{
return timer0_millis;
2f2: 20 91 e3 00 lds r18, 0x00E3
2f6: 30 91 e4 00 lds r19, 0x00E4
2fa: 40 91 e5 00 lds r20, 0x00E5
2fe: 50 91 e6 00 lds r21, 0x00E6
302: 80 91 e3 00 lds r24, 0x00E3
306: 90 91 e4 00 lds r25, 0x00E4
30a: a0 91 e5 00 lds r26, 0x00E5
30e: b0 91 e6 00 lds r27, 0x00E6
void delay(uint32_t ms)
{
in_wait = true;
uint32_t time1 = millis();
while ((millis()) - time1 < ms);
312: 82 1b sub r24, r18
314: 93 0b sbc r25, r19
316: a4 0b sbc r26, r20
318: b5 0b sbc r27, r21
31a: 88 58 subi r24, 0x88 ; 136
31c: 93 41 sbci r25, 0x13 ; 19
31e: a0 40 sbci r26, 0x00 ; 0
320: b0 40 sbci r27, 0x00 ; 0
322: 78 f3 brcs .-34 ; 0x302 <main+0x9c>
in_wait = false;
324: 10 92 a2 00 sts 0x00A2, r1
}
}
//continue;
delay(5000);
clear_led();
328: d3 de rcall .-602 ; 0xd0 <_Z9clear_ledv>
32a: ff 24 eor r15, r15
32c: 30 c0 rjmp .+96 ; 0x38e <main+0x128>
for (char z = 0; z < 8; ++z) {
for (char y = 0; y < 8; ++y) {
for (char x = 0; x < 8; ++x) {
set_led(x, y, z, true);
32e: 81 2f mov r24, r17
330: 60 2f mov r22, r16
332: 4f 2d mov r20, r15
334: 21 e0 ldi r18, 0x01 ; 1
336: 57 df rcall .-338 ; 0x1e6 <_Z7set_ledhhhb>
return timer0_millis;
}
void delay(uint32_t ms)
{
in_wait = true;
338: e0 92 a2 00 sts 0x00A2, r14
}
*/
inline uint32_t millis()
{
return timer0_millis;
33c: 20 91 e3 00 lds r18, 0x00E3
340: 30 91 e4 00 lds r19, 0x00E4
344: 40 91 e5 00 lds r20, 0x00E5
348: 50 91 e6 00 lds r21, 0x00E6
34c: 80 91 e3 00 lds r24, 0x00E3
350: 90 91 e4 00 lds r25, 0x00E4
354: a0 91 e5 00 lds r26, 0x00E5
358: b0 91 e6 00 lds r27, 0x00E6
void delay(uint32_t ms)
{
in_wait = true;
uint32_t time1 = millis();
while ((millis()) - time1 < ms);
35c: 82 1b sub r24, r18
35e: 93 0b sbc r25, r19
360: a4 0b sbc r26, r20
362: b5 0b sbc r27, r21
364: 84 36 cpi r24, 0x64 ; 100
366: 91 05 cpc r25, r1
368: a1 05 cpc r26, r1
36a: b1 05 cpc r27, r1
36c: 78 f3 brcs .-34 ; 0x34c <main+0xe6>
in_wait = false;
36e: 10 92 a2 00 sts 0x00A2, r1
delay(5000);
clear_led();
for (char z = 0; z < 8; ++z) {
for (char y = 0; y < 8; ++y) {
for (char x = 0; x < 8; ++x) {
372: 1f 5f subi r17, 0xFF ; 255
374: 18 30 cpi r17, 0x08 ; 8
376: d9 f6 brne .-74 ; 0x32e <main+0xc8>
//continue;
delay(5000);
clear_led();
for (char z = 0; z < 8; ++z) {
for (char y = 0; y < 8; ++y) {
378: 0f 5f subi r16, 0xFF ; 255
37a: 08 30 cpi r16, 0x08 ; 8
37c: 11 f0 breq .+4 ; 0x382 <main+0x11c>
37e: 10 e0 ldi r17, 0x00 ; 0
380: d6 cf rjmp .-84 ; 0x32e <main+0xc8>
}
//continue;
delay(5000);
clear_led();
for (char z = 0; z < 8; ++z) {
382: f3 94 inc r15
384: 88 e0 ldi r24, 0x08 ; 8
386: f8 16 cp r15, r24
388: 11 f4 brne .+4 ; 0x38e <main+0x128>
38a: 20 e0 ldi r18, 0x00 ; 0
38c: 9a cf rjmp .-204 ; 0x2c2 <main+0x5c>
38e: 00 e0 ldi r16, 0x00 ; 0
390: f6 cf rjmp .-20 ; 0x37e <main+0x118>
00000392 <_Z7inrangeiii>:
392: 08 97 sbiw r24, 0x08 ; 8
394: 78 f4 brcc .+30 ; 0x3b4 <_Z7inrangeiii+0x22>
396: 77 fd sbrc r23, 7
398: 0d c0 rjmp .+26 ; 0x3b4 <_Z7inrangeiii+0x22>
39a: 68 30 cpi r22, 0x08 ; 8
39c: 71 05 cpc r23, r1
39e: 54 f4 brge .+20 ; 0x3b4 <_Z7inrangeiii+0x22>
3a0: 57 fd sbrc r21, 7
3a2: 08 c0 rjmp .+16 ; 0x3b4 <_Z7inrangeiii+0x22>
3a4: 90 e0 ldi r25, 0x00 ; 0
3a6: 48 30 cpi r20, 0x08 ; 8
3a8: 51 05 cpc r21, r1
3aa: 0c f0 brlt .+2 ; 0x3ae <_Z7inrangeiii+0x1c>
3ac: 91 e0 ldi r25, 0x01 ; 1
3ae: 81 e0 ldi r24, 0x01 ; 1
3b0: 98 27 eor r25, r24
3b2: 01 c0 rjmp .+2 ; 0x3b6 <_Z7inrangeiii+0x24>
3b4: 90 e0 ldi r25, 0x00 ; 0
3b6: 89 2f mov r24, r25
3b8: 08 95 ret
000003ba <_Z8tmp2cubev>:
3ba: a2 e6 ldi r26, 0x62 ; 98
3bc: b0 e0 ldi r27, 0x00 ; 0
3be: e3 ea ldi r30, 0xA3 ; 163
3c0: f0 e0 ldi r31, 0x00 ; 0
3c2: 80 e4 ldi r24, 0x40 ; 64
3c4: 01 90 ld r0, Z+
3c6: 0d 92 st X+, r0
3c8: 81 50 subi r24, 0x01 ; 1
3ca: e1 f7 brne .-8 ; 0x3c4 <_Z8tmp2cubev+0xa>
3cc: 08 95 ret
000003ce <_exit>:
3ce: f8 94 cli
000003d0 <__stop_program>:
3d0: ff cf rjmp .-2 ; 0x3d0 <__stop_program>
|