|
|
BasicPHSensor.ino.elf: file format elf32-avr
|
|
|
|
|
|
Disassembly of section .text:
|
|
|
|
00000000 <__vectors>:
|
|
0: 0c 94 38 02 jmp 0x470 ; 0x470 <__ctors_end>
|
|
4: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
8: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
c: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
10: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
14: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
18: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
1c: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
20: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
24: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
28: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
2c: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
30: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
34: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
38: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
3c: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
40: 0c 94 c3 05 jmp 0xb86 ; 0xb86 <__vector_16>
|
|
44: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
48: 0c 94 33 06 jmp 0xc66 ; 0xc66 <__vector_18>
|
|
4c: 0c 94 0d 06 jmp 0xc1a ; 0xc1a <__vector_19>
|
|
50: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
54: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
58: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
5c: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
60: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
64: 0c 94 60 02 jmp 0x4c0 ; 0x4c0 <__bad_interrupt>
|
|
|
|
00000068 <__trampolines_end>:
|
|
68: 00 00 nop
|
|
6a: 00 08 sbc r0, r0
|
|
6c: 00 02 muls r16, r16
|
|
6e: 01 00 .word 0x0001 ; ????
|
|
70: 00 03 mulsu r16, r16
|
|
72: 04 07 cpc r16, r20
|
|
...
|
|
|
|
0000007c <_ZL10characters>:
|
|
7c: 3f 3f 02 01 51 09 06 00 05 00 41 41 7c 12 11 12 ??..Q.....AA|...
|
|
8c: 7c 00 05 00 42 42 7f 49 49 49 36 00 05 00 43 43 |...BB.III6...CC
|
|
9c: 3e 41 41 41 22 00 05 00 44 44 7f 41 41 41 3e 00 >AAA"...DD.AAA>.
|
|
ac: 05 00 45 45 7f 49 49 49 41 00 05 00 46 46 7f 09 ..EE.IIIA...FF..
|
|
bc: 09 09 01 00 05 00 47 47 3e 41 49 49 3a 00 05 00 ......GG>AII:...
|
|
cc: 48 48 7f 08 08 08 7f 00 05 00 49 49 00 41 7f 41 HH........II.A.A
|
|
dc: 00 00 05 00 4a 4a 30 40 40 40 3f 00 05 00 4b 4b ....JJ0@@@?...KK
|
|
ec: 7f 08 08 14 63 00 05 00 4c 4c 7f 40 40 40 40 00 ....c...LL.@@@@.
|
|
fc: 05 00 4d 4d 7f 06 0c 06 7f 00 05 00 4e 4e 7f 04 ..MM........NN..
|
|
10c: 08 10 7f 00 05 00 4f 4f 3e 41 41 41 3e 00 05 00 ......OO>AAA>...
|
|
11c: 50 50 7f 09 09 09 06 00 05 00 51 51 3e 41 51 61 PP........QQ>AQa
|
|
12c: 7e 00 05 00 52 52 7f 09 19 29 46 00 05 00 53 53 ~...RR...)F...SS
|
|
13c: 26 49 49 49 32 00 05 00 54 54 01 01 7f 01 01 00 &III2...TT......
|
|
14c: 05 00 55 55 3f 40 40 40 3f 00 05 00 56 56 1f 20 ..UU?@@@?...VV.
|
|
15c: 40 20 1f 00 05 00 57 57 3f 40 38 40 3f 00 05 00 @ ....WW?@8@?...
|
|
16c: 58 58 63 14 08 14 63 00 05 00 59 59 07 08 70 08 XXc...c...YY..p.
|
|
17c: 07 00 05 00 5a 5a 61 51 49 45 43 00 05 00 2d 2d ....ZZaQIEC...--
|
|
18c: 08 08 08 08 08 00 05 00 21 21 00 00 5f 00 00 00 ........!!.._...
|
|
19c: 05 00 2e 2e 00 40 00 00 00 00 03 00 31 31 42 42 .....@......11BB
|
|
1ac: 7f 40 40 00 05 00 32 32 62 51 49 45 42 00 05 00 .@@...22bQIEB...
|
|
1bc: 33 33 22 41 49 49 3e 00 05 00 34 34 1f 10 7c 10 33"AII>...44..|.
|
|
1cc: 10 00 05 00 35 35 4f 49 49 49 31 00 05 00 36 36 ....55OIII1...66
|
|
1dc: 3e 49 49 49 32 00 05 00 37 37 01 01 79 05 03 00 >III2...77..y...
|
|
1ec: 05 00 38 38 36 49 49 49 36 00 05 00 39 39 26 49 ..886III6...99&I
|
|
1fc: 49 49 3e 00 05 00 30 30 3e 41 41 41 3e 00 05 00 II>...00>AAA>...
|
|
20c: 2b 2b 08 08 3e 08 08 00 05 00 3a 3a 00 28 00 00 ++..>.....::.(..
|
|
21c: 00 00 03 00 3d 3d 14 14 14 14 14 00 05 00 20 20 ....==........
|
|
22c: 00 00 00 00 00 00 02 00 61 61 20 54 54 54 78 00 ........aa TTTx.
|
|
23c: 05 00 62 62 7f 48 48 48 30 00 05 00 63 63 38 44 ..bb.HHH0...cc8D
|
|
24c: 44 44 28 00 05 00 64 64 20 50 50 50 7f 00 05 00 DD(...dd PPP....
|
|
25c: 65 65 38 54 54 54 48 00 05 00 66 66 08 7e 09 01 ee8TTTH...ff.~..
|
|
26c: 02 00 05 00 67 67 48 54 54 54 38 00 05 00 68 68 ....ggHTTT8...hh
|
|
27c: 7f 08 08 08 70 00 05 00 69 69 40 44 7d 40 40 00 ....p...ii@D}@@.
|
|
28c: 05 00 6a 6a 20 40 44 3d 00 00 05 00 6b 6b 7f 10 ..jj @D=....kk..
|
|
29c: 10 28 44 00 05 00 6c 6c 01 01 7f 40 40 00 05 00 .(D...ll...@@...
|
|
2ac: 6d 6d 7c 04 7c 04 78 00 05 00 6e 6e 7c 04 04 04 mm|.|.x...nn|...
|
|
2bc: 78 00 05 00 6f 6f 38 44 44 44 38 00 05 00 70 70 x...oo8DDD8...pp
|
|
2cc: 7c 14 14 14 08 00 05 00 71 71 08 14 14 14 7c 00 |.......qq....|.
|
|
2dc: 05 00 72 72 7c 08 04 04 04 00 05 00 73 73 48 54 ..rr|.......ssHT
|
|
2ec: 54 54 24 00 05 00 74 74 02 02 3f 42 42 00 05 00 TT$...tt..?BB...
|
|
2fc: 75 75 3c 40 40 20 7c 00 05 00 76 76 1c 20 40 20 uu<@@ |...vv. @
|
|
30c: 1c 00 05 00 77 77 7c 20 70 20 7c 00 05 00 78 78 ....ww| p |...xx
|
|
31c: 44 28 10 28 44 00 05 00 79 79 4c 50 50 50 3c 00 D(.(D...yyLPPP<.
|
|
32c: 05 00 7a 7a 44 64 54 4c 44 00 05 00 5b 5b 00 7f ..zzDdTLD...[[..
|
|
33c: 41 41 00 00 05 00 5d 5d 00 41 41 7f 00 00 05 00 AA....]].AA.....
|
|
34c: 7b 7b 08 08 36 41 41 00 05 00 7d 7d 41 41 36 08 {{..6AA...}}AA6.
|
|
35c: 08 00 05 00 28 28 00 1c 22 41 00 00 05 00 29 29 ....((.."A....))
|
|
36c: 00 41 22 1c 00 00 05 00 40 40 3e 41 5d 55 1e 00 .A".....@@>A]U..
|
|
37c: 05 00 23 23 14 3e 14 3e 14 00 05 00 24 24 2c 2a ..##.>.>....$$,*
|
|
38c: 7f 2a 12 00 05 00 25 25 26 16 08 34 32 00 05 00 .*....%%&..42...
|
|
39c: 5e 5e 04 02 01 02 04 00 05 00 5f 5f 40 40 40 40 ^^........__@@@@
|
|
3ac: 40 00 05 00 27 27 07 00 00 00 00 00 01 00 22 22 @...''........""
|
|
3bc: 00 07 00 07 00 00 05 00 3b 3b 00 40 76 36 00 00 ........;;.@v6..
|
|
3cc: 05 00 2f 2f 20 10 08 04 02 00 05 00 5c 5c 02 04 ..// .......\\..
|
|
3dc: 08 10 20 00 05 00 3c 3c 00 10 28 44 00 00 05 00 .. ...<<..(D....
|
|
3ec: 3e 3e 00 44 28 10 00 00 05 00 2a 2a 12 0c 3f 0c >>.D(.....**..?.
|
|
3fc: 12 00 05 00 60 60 01 02 00 00 00 00 02 00 7e 7e ....``........~~
|
|
40c: 02 01 03 02 01 00 05 00 26 26 30 4a 45 2a 10 28 ........&&0JE*.(
|
|
41c: 06 00 0a 0a 00 00 00 00 00 00 00 00 0d 0d 00 00 ................
|
|
42c: 00 00 00 00 00 00 ......
|
|
|
|
00000432 <port_to_output_PGM>:
|
|
432: 00 00 00 00 25 00 28 00 2b 00 ....%.(.+.
|
|
|
|
0000043c <port_to_mode_PGM>:
|
|
43c: 00 00 00 00 24 00 27 00 2a 00 ....$.'.*.
|
|
|
|
00000446 <digital_pin_to_port_PGM>:
|
|
446: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................
|
|
456: 03 03 03 03 ....
|
|
|
|
0000045a <digital_pin_to_bit_mask_PGM>:
|
|
45a: 01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02 ..... @...... ..
|
|
46a: 04 08 10 20 ...
|
|
|
|
0000046e <__ctors_start>:
|
|
46e: 65 06 cpc r6, r21
|
|
|
|
00000470 <__ctors_end>:
|
|
470: 11 24 eor r1, r1
|
|
472: 1f be out 0x3f, r1 ; 63
|
|
474: cf ef ldi r28, 0xFF ; 255
|
|
476: d8 e0 ldi r29, 0x08 ; 8
|
|
478: de bf out 0x3e, r29 ; 62
|
|
47a: cd bf out 0x3d, r28 ; 61
|
|
|
|
0000047c <__do_copy_data>:
|
|
47c: 11 e0 ldi r17, 0x01 ; 1
|
|
47e: a0 e0 ldi r26, 0x00 ; 0
|
|
480: b1 e0 ldi r27, 0x01 ; 1
|
|
482: e8 e2 ldi r30, 0x28 ; 40
|
|
484: f5 e1 ldi r31, 0x15 ; 21
|
|
486: 02 c0 rjmp .+4 ; 0x48c <__do_copy_data+0x10>
|
|
488: 05 90 lpm r0, Z+
|
|
48a: 0d 92 st X+, r0
|
|
48c: a4 34 cpi r26, 0x44 ; 68
|
|
48e: b1 07 cpc r27, r17
|
|
490: d9 f7 brne .-10 ; 0x488 <__do_copy_data+0xc>
|
|
|
|
00000492 <__do_clear_bss>:
|
|
492: 22 e0 ldi r18, 0x02 ; 2
|
|
494: a4 e4 ldi r26, 0x44 ; 68
|
|
496: b1 e0 ldi r27, 0x01 ; 1
|
|
498: 01 c0 rjmp .+2 ; 0x49c <.do_clear_bss_start>
|
|
|
|
0000049a <.do_clear_bss_loop>:
|
|
49a: 1d 92 st X+, r1
|
|
|
|
0000049c <.do_clear_bss_start>:
|
|
49c: a2 30 cpi r26, 0x02 ; 2
|
|
49e: b2 07 cpc r27, r18
|
|
4a0: e1 f7 brne .-8 ; 0x49a <.do_clear_bss_loop>
|
|
|
|
000004a2 <__do_global_ctors>:
|
|
4a2: 12 e0 ldi r17, 0x02 ; 2
|
|
4a4: c8 e3 ldi r28, 0x38 ; 56
|
|
4a6: d2 e0 ldi r29, 0x02 ; 2
|
|
4a8: 04 c0 rjmp .+8 ; 0x4b2 <__do_global_ctors+0x10>
|
|
4aa: 21 97 sbiw r28, 0x01 ; 1
|
|
4ac: fe 01 movw r30, r28
|
|
4ae: 0e 94 87 0a call 0x150e ; 0x150e <__tablejump2__>
|
|
4b2: c7 33 cpi r28, 0x37 ; 55
|
|
4b4: d1 07 cpc r29, r17
|
|
4b6: c9 f7 brne .-14 ; 0x4aa <__do_global_ctors+0x8>
|
|
4b8: 0e 94 ea 06 call 0xdd4 ; 0xdd4 <main>
|
|
4bc: 0c 94 92 0a jmp 0x1524 ; 0x1524 <_exit>
|
|
|
|
000004c0 <__bad_interrupt>:
|
|
4c0: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
|
|
|
|
000004c4 <pinMode.constprop.29>:
|
|
#include "wiring_private.h"
|
|
#include "pins_arduino.h"
|
|
|
|
void pinMode(uint8_t pin, uint8_t mode)
|
|
{
|
|
uint8_t bit = digitalPinToBitMask(pin);
|
|
4c4: 90 e0 ldi r25, 0x00 ; 0
|
|
4c6: fc 01 movw r30, r24
|
|
4c8: e6 5a subi r30, 0xA6 ; 166
|
|
4ca: fb 4f sbci r31, 0xFB ; 251
|
|
4cc: 24 91 lpm r18, Z
|
|
uint8_t port = digitalPinToPort(pin);
|
|
4ce: fc 01 movw r30, r24
|
|
4d0: ea 5b subi r30, 0xBA ; 186
|
|
4d2: fb 4f sbci r31, 0xFB ; 251
|
|
4d4: 84 91 lpm r24, Z
|
|
volatile uint8_t *reg, *out;
|
|
|
|
if (port == NOT_A_PIN) return;
|
|
4d6: 88 23 and r24, r24
|
|
4d8: 99 f0 breq .+38 ; 0x500 <pinMode.constprop.29+0x3c>
|
|
|
|
// JWS: can I let the optimizer do this?
|
|
reg = portModeRegister(port);
|
|
4da: 90 e0 ldi r25, 0x00 ; 0
|
|
4dc: 88 0f add r24, r24
|
|
4de: 99 1f adc r25, r25
|
|
4e0: fc 01 movw r30, r24
|
|
4e2: e4 5c subi r30, 0xC4 ; 196
|
|
4e4: fb 4f sbci r31, 0xFB ; 251
|
|
4e6: a5 91 lpm r26, Z+
|
|
4e8: b4 91 lpm r27, Z
|
|
out = portOutputRegister(port);
|
|
4ea: fc 01 movw r30, r24
|
|
4ec: ee 5c subi r30, 0xCE ; 206
|
|
4ee: fb 4f sbci r31, 0xFB ; 251
|
|
4f0: 85 91 lpm r24, Z+
|
|
4f2: 94 91 lpm r25, Z
|
|
cli();
|
|
*reg &= ~bit;
|
|
*out |= bit;
|
|
SREG = oldSREG;
|
|
} else {
|
|
uint8_t oldSREG = SREG;
|
|
4f4: 8f b7 in r24, 0x3f ; 63
|
|
cli();
|
|
4f6: f8 94 cli
|
|
*reg |= bit;
|
|
4f8: ec 91 ld r30, X
|
|
4fa: e2 2b or r30, r18
|
|
4fc: ec 93 st X, r30
|
|
SREG = oldSREG;
|
|
4fe: 8f bf out 0x3f, r24 ; 63
|
|
500: 08 95 ret
|
|
|
|
00000502 <_ZN6Cursor9moveYAxisEt.constprop.10>:
|
|
}
|
|
|
|
/**
|
|
* Moves cursor in y axis by a number sepcified in method's parameter
|
|
*/
|
|
void Cursor::moveYAxis(position by){
|
|
502: fc 01 movw r30, r24
|
|
if(by == 0)
|
|
return;
|
|
|
|
_y++;
|
|
504: 80 81 ld r24, Z
|
|
506: 91 81 ldd r25, Z+1 ; 0x01
|
|
508: 01 96 adiw r24, 0x01 ; 1
|
|
50a: 91 83 std Z+1, r25 ; 0x01
|
|
50c: 80 83 st Z, r24
|
|
_x = 0; // for each y incrementation, reset the x axis :D
|
|
50e: 13 82 std Z+3, r1 ; 0x03
|
|
510: 12 82 std Z+2, r1 ; 0x02
|
|
|
|
if(_y > 5){
|
|
512: 06 97 sbiw r24, 0x06 ; 6
|
|
514: 10 f0 brcs .+4 ; 0x51a <_ZN6Cursor9moveYAxisEt.constprop.10+0x18>
|
|
_y = 0;
|
|
516: 11 82 std Z+1, r1 ; 0x01
|
|
518: 10 82 st Z, r1
|
|
51a: 08 95 ret
|
|
|
|
0000051c <digitalWrite>:
|
|
}
|
|
}
|
|
|
|
void digitalWrite(uint8_t pin, uint8_t val)
|
|
{
|
|
uint8_t timer = digitalPinToTimer(pin);
|
|
51c: 90 e0 ldi r25, 0x00 ; 0
|
|
51e: fc 01 movw r30, r24
|
|
520: e8 59 subi r30, 0x98 ; 152
|
|
522: ff 4f sbci r31, 0xFF ; 255
|
|
524: 24 91 lpm r18, Z
|
|
uint8_t bit = digitalPinToBitMask(pin);
|
|
526: fc 01 movw r30, r24
|
|
528: e6 5a subi r30, 0xA6 ; 166
|
|
52a: fb 4f sbci r31, 0xFB ; 251
|
|
52c: 34 91 lpm r19, Z
|
|
uint8_t port = digitalPinToPort(pin);
|
|
52e: fc 01 movw r30, r24
|
|
530: ea 5b subi r30, 0xBA ; 186
|
|
532: fb 4f sbci r31, 0xFB ; 251
|
|
534: e4 91 lpm r30, Z
|
|
volatile uint8_t *out;
|
|
|
|
if (port == NOT_A_PIN) return;
|
|
536: ee 23 and r30, r30
|
|
538: 09 f4 brne .+2 ; 0x53c <digitalWrite+0x20>
|
|
53a: 3c c0 rjmp .+120 ; 0x5b4 <digitalWrite+0x98>
|
|
|
|
// If the pin that support PWM output, we need to turn it off
|
|
// before doing a digital write.
|
|
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
|
|
53c: 22 23 and r18, r18
|
|
53e: 39 f1 breq .+78 ; 0x58e <digitalWrite+0x72>
|
|
//
|
|
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
|
|
//static inline void turnOffPWM(uint8_t timer)
|
|
static void turnOffPWM(uint8_t timer)
|
|
{
|
|
switch (timer)
|
|
540: 23 30 cpi r18, 0x03 ; 3
|
|
542: 91 f0 breq .+36 ; 0x568 <digitalWrite+0x4c>
|
|
544: 38 f4 brcc .+14 ; 0x554 <digitalWrite+0x38>
|
|
546: 21 30 cpi r18, 0x01 ; 1
|
|
548: a9 f0 breq .+42 ; 0x574 <digitalWrite+0x58>
|
|
54a: 22 30 cpi r18, 0x02 ; 2
|
|
54c: 01 f5 brne .+64 ; 0x58e <digitalWrite+0x72>
|
|
#if defined(TCCR0A) && defined(COM0A1)
|
|
case TIMER0A: cbi(TCCR0A, COM0A1); break;
|
|
#endif
|
|
|
|
#if defined(TCCR0A) && defined(COM0B1)
|
|
case TIMER0B: cbi(TCCR0A, COM0B1); break;
|
|
54e: 84 b5 in r24, 0x24 ; 36
|
|
550: 8f 7d andi r24, 0xDF ; 223
|
|
552: 12 c0 rjmp .+36 ; 0x578 <digitalWrite+0x5c>
|
|
//
|
|
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
|
|
//static inline void turnOffPWM(uint8_t timer)
|
|
static void turnOffPWM(uint8_t timer)
|
|
{
|
|
switch (timer)
|
|
554: 27 30 cpi r18, 0x07 ; 7
|
|
556: 91 f0 breq .+36 ; 0x57c <digitalWrite+0x60>
|
|
558: 28 30 cpi r18, 0x08 ; 8
|
|
55a: a1 f0 breq .+40 ; 0x584 <digitalWrite+0x68>
|
|
55c: 24 30 cpi r18, 0x04 ; 4
|
|
55e: b9 f4 brne .+46 ; 0x58e <digitalWrite+0x72>
|
|
{
|
|
#if defined(TCCR1A) && defined(COM1A1)
|
|
case TIMER1A: cbi(TCCR1A, COM1A1); break;
|
|
#endif
|
|
#if defined(TCCR1A) && defined(COM1B1)
|
|
case TIMER1B: cbi(TCCR1A, COM1B1); break;
|
|
560: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
|
|
564: 8f 7d andi r24, 0xDF ; 223
|
|
566: 03 c0 rjmp .+6 ; 0x56e <digitalWrite+0x52>
|
|
static void turnOffPWM(uint8_t timer)
|
|
{
|
|
switch (timer)
|
|
{
|
|
#if defined(TCCR1A) && defined(COM1A1)
|
|
case TIMER1A: cbi(TCCR1A, COM1A1); break;
|
|
568: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
|
|
56c: 8f 77 andi r24, 0x7F ; 127
|
|
#endif
|
|
#if defined(TCCR1A) && defined(COM1B1)
|
|
case TIMER1B: cbi(TCCR1A, COM1B1); break;
|
|
56e: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
|
|
572: 0d c0 rjmp .+26 ; 0x58e <digitalWrite+0x72>
|
|
#if defined(TCCR2) && defined(COM21)
|
|
case TIMER2: cbi(TCCR2, COM21); break;
|
|
#endif
|
|
|
|
#if defined(TCCR0A) && defined(COM0A1)
|
|
case TIMER0A: cbi(TCCR0A, COM0A1); break;
|
|
574: 84 b5 in r24, 0x24 ; 36
|
|
576: 8f 77 andi r24, 0x7F ; 127
|
|
#endif
|
|
|
|
#if defined(TCCR0A) && defined(COM0B1)
|
|
case TIMER0B: cbi(TCCR0A, COM0B1); break;
|
|
578: 84 bd out 0x24, r24 ; 36
|
|
57a: 09 c0 rjmp .+18 ; 0x58e <digitalWrite+0x72>
|
|
#endif
|
|
#if defined(TCCR2A) && defined(COM2A1)
|
|
case TIMER2A: cbi(TCCR2A, COM2A1); break;
|
|
57c: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
|
|
580: 8f 77 andi r24, 0x7F ; 127
|
|
582: 03 c0 rjmp .+6 ; 0x58a <digitalWrite+0x6e>
|
|
#endif
|
|
#if defined(TCCR2A) && defined(COM2B1)
|
|
case TIMER2B: cbi(TCCR2A, COM2B1); break;
|
|
584: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
|
|
588: 8f 7d andi r24, 0xDF ; 223
|
|
58a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
|
|
|
|
// If the pin that support PWM output, we need to turn it off
|
|
// before doing a digital write.
|
|
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
|
|
|
|
out = portOutputRegister(port);
|
|
58e: f0 e0 ldi r31, 0x00 ; 0
|
|
590: ee 0f add r30, r30
|
|
592: ff 1f adc r31, r31
|
|
594: ee 5c subi r30, 0xCE ; 206
|
|
596: fb 4f sbci r31, 0xFB ; 251
|
|
598: a5 91 lpm r26, Z+
|
|
59a: b4 91 lpm r27, Z
|
|
|
|
uint8_t oldSREG = SREG;
|
|
59c: 9f b7 in r25, 0x3f ; 63
|
|
cli();
|
|
59e: f8 94 cli
|
|
|
|
if (val == LOW) {
|
|
5a0: 61 11 cpse r22, r1
|
|
5a2: 04 c0 rjmp .+8 ; 0x5ac <digitalWrite+0x90>
|
|
*out &= ~bit;
|
|
5a4: 8c 91 ld r24, X
|
|
5a6: 30 95 com r19
|
|
5a8: 38 23 and r19, r24
|
|
5aa: 02 c0 rjmp .+4 ; 0x5b0 <digitalWrite+0x94>
|
|
} else {
|
|
*out |= bit;
|
|
5ac: ec 91 ld r30, X
|
|
5ae: 3e 2b or r19, r30
|
|
5b0: 3c 93 st X, r19
|
|
}
|
|
|
|
SREG = oldSREG;
|
|
5b2: 9f bf out 0x3f, r25 ; 63
|
|
5b4: 08 95 ret
|
|
|
|
000005b6 <micros>:
|
|
return m;
|
|
}
|
|
|
|
unsigned long micros() {
|
|
unsigned long m;
|
|
uint8_t oldSREG = SREG, t;
|
|
5b6: 3f b7 in r19, 0x3f ; 63
|
|
|
|
cli();
|
|
5b8: f8 94 cli
|
|
m = timer0_overflow_count;
|
|
5ba: 80 91 4f 01 lds r24, 0x014F ; 0x80014f <timer0_overflow_count>
|
|
5be: 90 91 50 01 lds r25, 0x0150 ; 0x800150 <timer0_overflow_count+0x1>
|
|
5c2: a0 91 51 01 lds r26, 0x0151 ; 0x800151 <timer0_overflow_count+0x2>
|
|
5c6: b0 91 52 01 lds r27, 0x0152 ; 0x800152 <timer0_overflow_count+0x3>
|
|
#if defined(TCNT0)
|
|
t = TCNT0;
|
|
5ca: 26 b5 in r18, 0x26 ; 38
|
|
#else
|
|
#error TIMER 0 not defined
|
|
#endif
|
|
|
|
#ifdef TIFR0
|
|
if ((TIFR0 & _BV(TOV0)) && (t < 255))
|
|
5cc: a8 9b sbis 0x15, 0 ; 21
|
|
5ce: 05 c0 rjmp .+10 ; 0x5da <micros+0x24>
|
|
5d0: 2f 3f cpi r18, 0xFF ; 255
|
|
5d2: 19 f0 breq .+6 ; 0x5da <micros+0x24>
|
|
m++;
|
|
5d4: 01 96 adiw r24, 0x01 ; 1
|
|
5d6: a1 1d adc r26, r1
|
|
5d8: b1 1d adc r27, r1
|
|
#else
|
|
if ((TIFR & _BV(TOV0)) && (t < 255))
|
|
m++;
|
|
#endif
|
|
|
|
SREG = oldSREG;
|
|
5da: 3f bf out 0x3f, r19 ; 63
|
|
|
|
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
|
|
5dc: ba 2f mov r27, r26
|
|
5de: a9 2f mov r26, r25
|
|
5e0: 98 2f mov r25, r24
|
|
5e2: 88 27 eor r24, r24
|
|
5e4: 82 0f add r24, r18
|
|
5e6: 91 1d adc r25, r1
|
|
5e8: a1 1d adc r26, r1
|
|
5ea: b1 1d adc r27, r1
|
|
5ec: bc 01 movw r22, r24
|
|
5ee: cd 01 movw r24, r26
|
|
5f0: 42 e0 ldi r20, 0x02 ; 2
|
|
5f2: 66 0f add r22, r22
|
|
5f4: 77 1f adc r23, r23
|
|
5f6: 88 1f adc r24, r24
|
|
5f8: 99 1f adc r25, r25
|
|
5fa: 4a 95 dec r20
|
|
5fc: d1 f7 brne .-12 ; 0x5f2 <micros+0x3c>
|
|
}
|
|
5fe: 08 95 ret
|
|
|
|
00000600 <delay>:
|
|
|
|
void delay(unsigned long ms)
|
|
{
|
|
600: 8f 92 push r8
|
|
602: 9f 92 push r9
|
|
604: af 92 push r10
|
|
606: bf 92 push r11
|
|
608: cf 92 push r12
|
|
60a: df 92 push r13
|
|
60c: ef 92 push r14
|
|
60e: ff 92 push r15
|
|
610: 6b 01 movw r12, r22
|
|
612: 7c 01 movw r14, r24
|
|
uint32_t start = micros();
|
|
614: 0e 94 db 02 call 0x5b6 ; 0x5b6 <micros>
|
|
618: 4b 01 movw r8, r22
|
|
61a: 5c 01 movw r10, r24
|
|
|
|
while (ms > 0) {
|
|
61c: c1 14 cp r12, r1
|
|
61e: d1 04 cpc r13, r1
|
|
620: e1 04 cpc r14, r1
|
|
622: f1 04 cpc r15, r1
|
|
624: f1 f0 breq .+60 ; 0x662 <delay+0x62>
|
|
yield();
|
|
while ( ms > 0 && (micros() - start) >= 1000) {
|
|
626: 0e 94 db 02 call 0x5b6 ; 0x5b6 <micros>
|
|
62a: dc 01 movw r26, r24
|
|
62c: cb 01 movw r24, r22
|
|
62e: 88 19 sub r24, r8
|
|
630: 99 09 sbc r25, r9
|
|
632: aa 09 sbc r26, r10
|
|
634: bb 09 sbc r27, r11
|
|
636: 88 3e cpi r24, 0xE8 ; 232
|
|
638: 93 40 sbci r25, 0x03 ; 3
|
|
63a: a1 05 cpc r26, r1
|
|
63c: b1 05 cpc r27, r1
|
|
63e: 70 f3 brcs .-36 ; 0x61c <delay+0x1c>
|
|
ms--;
|
|
640: 21 e0 ldi r18, 0x01 ; 1
|
|
642: c2 1a sub r12, r18
|
|
644: d1 08 sbc r13, r1
|
|
646: e1 08 sbc r14, r1
|
|
648: f1 08 sbc r15, r1
|
|
start += 1000;
|
|
64a: 88 ee ldi r24, 0xE8 ; 232
|
|
64c: 88 0e add r8, r24
|
|
64e: 83 e0 ldi r24, 0x03 ; 3
|
|
650: 98 1e adc r9, r24
|
|
652: a1 1c adc r10, r1
|
|
654: b1 1c adc r11, r1
|
|
{
|
|
uint32_t start = micros();
|
|
|
|
while (ms > 0) {
|
|
yield();
|
|
while ( ms > 0 && (micros() - start) >= 1000) {
|
|
656: c1 14 cp r12, r1
|
|
658: d1 04 cpc r13, r1
|
|
65a: e1 04 cpc r14, r1
|
|
65c: f1 04 cpc r15, r1
|
|
65e: 19 f7 brne .-58 ; 0x626 <delay+0x26>
|
|
660: dd cf rjmp .-70 ; 0x61c <delay+0x1c>
|
|
ms--;
|
|
start += 1000;
|
|
}
|
|
}
|
|
}
|
|
662: ff 90 pop r15
|
|
664: ef 90 pop r14
|
|
666: df 90 pop r13
|
|
668: cf 90 pop r12
|
|
66a: bf 90 pop r11
|
|
66c: af 90 pop r10
|
|
66e: 9f 90 pop r9
|
|
670: 8f 90 pop r8
|
|
672: 08 95 ret
|
|
|
|
00000674 <_ZN5Print5writeEPKhj>:
|
|
|
|
// Public Methods //////////////////////////////////////////////////////////////
|
|
|
|
/* default implementation: may be overridden */
|
|
size_t Print::write(const uint8_t *buffer, size_t size)
|
|
{
|
|
674: cf 92 push r12
|
|
676: df 92 push r13
|
|
678: ef 92 push r14
|
|
67a: ff 92 push r15
|
|
67c: 0f 93 push r16
|
|
67e: 1f 93 push r17
|
|
680: cf 93 push r28
|
|
682: df 93 push r29
|
|
684: 6c 01 movw r12, r24
|
|
686: 7a 01 movw r14, r20
|
|
688: 8b 01 movw r16, r22
|
|
size_t n = 0;
|
|
68a: c0 e0 ldi r28, 0x00 ; 0
|
|
68c: d0 e0 ldi r29, 0x00 ; 0
|
|
while (size--) {
|
|
68e: ce 15 cp r28, r14
|
|
690: df 05 cpc r29, r15
|
|
692: 81 f0 breq .+32 ; 0x6b4 <_ZN5Print5writeEPKhj+0x40>
|
|
if (write(*buffer++)) n++;
|
|
694: d8 01 movw r26, r16
|
|
696: 6d 91 ld r22, X+
|
|
698: 8d 01 movw r16, r26
|
|
69a: d6 01 movw r26, r12
|
|
69c: ed 91 ld r30, X+
|
|
69e: fc 91 ld r31, X
|
|
6a0: 01 90 ld r0, Z+
|
|
6a2: f0 81 ld r31, Z
|
|
6a4: e0 2d mov r30, r0
|
|
6a6: c6 01 movw r24, r12
|
|
6a8: 09 95 icall
|
|
6aa: 89 2b or r24, r25
|
|
6ac: 11 f0 breq .+4 ; 0x6b2 <_ZN5Print5writeEPKhj+0x3e>
|
|
6ae: 21 96 adiw r28, 0x01 ; 1
|
|
6b0: ee cf rjmp .-36 ; 0x68e <_ZN5Print5writeEPKhj+0x1a>
|
|
6b2: 7e 01 movw r14, r28
|
|
else break;
|
|
}
|
|
return n;
|
|
}
|
|
6b4: c7 01 movw r24, r14
|
|
6b6: df 91 pop r29
|
|
6b8: cf 91 pop r28
|
|
6ba: 1f 91 pop r17
|
|
6bc: 0f 91 pop r16
|
|
6be: ff 90 pop r15
|
|
6c0: ef 90 pop r14
|
|
6c2: df 90 pop r13
|
|
6c4: cf 90 pop r12
|
|
6c6: 08 95 ret
|
|
|
|
000006c8 <_ZN14HardwareSerial17availableForWriteEv>:
|
|
{
|
|
tx_buffer_index_t head;
|
|
tx_buffer_index_t tail;
|
|
|
|
TX_BUFFER_ATOMIC {
|
|
head = _tx_buffer_head;
|
|
6c8: fc 01 movw r30, r24
|
|
6ca: 53 8d ldd r21, Z+27 ; 0x1b
|
|
tail = _tx_buffer_tail;
|
|
6cc: 44 8d ldd r20, Z+28 ; 0x1c
|
|
6ce: 25 2f mov r18, r21
|
|
6d0: 30 e0 ldi r19, 0x00 ; 0
|
|
6d2: 84 2f mov r24, r20
|
|
6d4: 90 e0 ldi r25, 0x00 ; 0
|
|
}
|
|
if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
|
|
6d6: 82 1b sub r24, r18
|
|
6d8: 93 0b sbc r25, r19
|
|
6da: 54 17 cp r21, r20
|
|
6dc: 10 f0 brcs .+4 ; 0x6e2 <_ZN14HardwareSerial17availableForWriteEv+0x1a>
|
|
6de: cf 96 adiw r24, 0x3f ; 63
|
|
6e0: 08 95 ret
|
|
return tail - head - 1;
|
|
6e2: 01 97 sbiw r24, 0x01 ; 1
|
|
}
|
|
6e4: 08 95 ret
|
|
|
|
000006e6 <_ZN14HardwareSerial4readEv>:
|
|
return _rx_buffer[_rx_buffer_tail];
|
|
}
|
|
}
|
|
|
|
int HardwareSerial::read(void)
|
|
{
|
|
6e6: fc 01 movw r30, r24
|
|
// if the head isn't ahead of the tail, we don't have any characters
|
|
if (_rx_buffer_head == _rx_buffer_tail) {
|
|
6e8: 91 8d ldd r25, Z+25 ; 0x19
|
|
6ea: 82 8d ldd r24, Z+26 ; 0x1a
|
|
6ec: 98 17 cp r25, r24
|
|
6ee: 61 f0 breq .+24 ; 0x708 <_ZN14HardwareSerial4readEv+0x22>
|
|
return -1;
|
|
} else {
|
|
unsigned char c = _rx_buffer[_rx_buffer_tail];
|
|
6f0: 82 8d ldd r24, Z+26 ; 0x1a
|
|
6f2: df 01 movw r26, r30
|
|
6f4: a8 0f add r26, r24
|
|
6f6: b1 1d adc r27, r1
|
|
6f8: 5d 96 adiw r26, 0x1d ; 29
|
|
6fa: 8c 91 ld r24, X
|
|
_rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
|
|
6fc: 92 8d ldd r25, Z+26 ; 0x1a
|
|
6fe: 9f 5f subi r25, 0xFF ; 255
|
|
700: 9f 73 andi r25, 0x3F ; 63
|
|
702: 92 8f std Z+26, r25 ; 0x1a
|
|
return c;
|
|
704: 90 e0 ldi r25, 0x00 ; 0
|
|
706: 08 95 ret
|
|
|
|
int HardwareSerial::read(void)
|
|
{
|
|
// if the head isn't ahead of the tail, we don't have any characters
|
|
if (_rx_buffer_head == _rx_buffer_tail) {
|
|
return -1;
|
|
708: 8f ef ldi r24, 0xFF ; 255
|
|
70a: 9f ef ldi r25, 0xFF ; 255
|
|
} else {
|
|
unsigned char c = _rx_buffer[_rx_buffer_tail];
|
|
_rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
|
|
return c;
|
|
}
|
|
}
|
|
70c: 08 95 ret
|
|
|
|
0000070e <_ZN14HardwareSerial4peekEv>:
|
|
{
|
|
return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
|
|
}
|
|
|
|
int HardwareSerial::peek(void)
|
|
{
|
|
70e: fc 01 movw r30, r24
|
|
if (_rx_buffer_head == _rx_buffer_tail) {
|
|
710: 91 8d ldd r25, Z+25 ; 0x19
|
|
712: 82 8d ldd r24, Z+26 ; 0x1a
|
|
714: 98 17 cp r25, r24
|
|
716: 31 f0 breq .+12 ; 0x724 <_ZN14HardwareSerial4peekEv+0x16>
|
|
return -1;
|
|
} else {
|
|
return _rx_buffer[_rx_buffer_tail];
|
|
718: 82 8d ldd r24, Z+26 ; 0x1a
|
|
71a: e8 0f add r30, r24
|
|
71c: f1 1d adc r31, r1
|
|
71e: 85 8d ldd r24, Z+29 ; 0x1d
|
|
720: 90 e0 ldi r25, 0x00 ; 0
|
|
722: 08 95 ret
|
|
}
|
|
|
|
int HardwareSerial::peek(void)
|
|
{
|
|
if (_rx_buffer_head == _rx_buffer_tail) {
|
|
return -1;
|
|
724: 8f ef ldi r24, 0xFF ; 255
|
|
726: 9f ef ldi r25, 0xFF ; 255
|
|
} else {
|
|
return _rx_buffer[_rx_buffer_tail];
|
|
}
|
|
}
|
|
728: 08 95 ret
|
|
|
|
0000072a <_ZN14HardwareSerial9availableEv>:
|
|
// clear any received data
|
|
_rx_buffer_head = _rx_buffer_tail;
|
|
}
|
|
|
|
int HardwareSerial::available(void)
|
|
{
|
|
72a: fc 01 movw r30, r24
|
|
return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
|
|
72c: 91 8d ldd r25, Z+25 ; 0x19
|
|
72e: 22 8d ldd r18, Z+26 ; 0x1a
|
|
730: 89 2f mov r24, r25
|
|
732: 90 e0 ldi r25, 0x00 ; 0
|
|
734: 80 5c subi r24, 0xC0 ; 192
|
|
736: 9f 4f sbci r25, 0xFF ; 255
|
|
738: 82 1b sub r24, r18
|
|
73a: 91 09 sbc r25, r1
|
|
}
|
|
73c: 8f 73 andi r24, 0x3F ; 63
|
|
73e: 99 27 eor r25, r25
|
|
740: 08 95 ret
|
|
|
|
00000742 <_Z17Serial0_availablev>:
|
|
#endif
|
|
|
|
// Function that can be weakly referenced by serialEventRun to prevent
|
|
// pulling in this file if it's not otherwise used.
|
|
bool Serial0_available() {
|
|
return Serial.available();
|
|
742: 83 e5 ldi r24, 0x53 ; 83
|
|
744: 91 e0 ldi r25, 0x01 ; 1
|
|
746: 0e 94 95 03 call 0x72a ; 0x72a <_ZN14HardwareSerial9availableEv>
|
|
74a: 21 e0 ldi r18, 0x01 ; 1
|
|
74c: 89 2b or r24, r25
|
|
74e: 09 f4 brne .+2 ; 0x752 <_Z17Serial0_availablev+0x10>
|
|
750: 20 e0 ldi r18, 0x00 ; 0
|
|
}
|
|
752: 82 2f mov r24, r18
|
|
754: 08 95 ret
|
|
|
|
00000756 <_ZN14HardwareSerial17_tx_udr_empty_irqEv>:
|
|
#endif
|
|
|
|
// Actual interrupt handlers //////////////////////////////////////////////////////////////
|
|
|
|
void HardwareSerial::_tx_udr_empty_irq(void)
|
|
{
|
|
756: fc 01 movw r30, r24
|
|
// If interrupts are enabled, there must be more data in the output
|
|
// buffer. Send the next byte
|
|
unsigned char c = _tx_buffer[_tx_buffer_tail];
|
|
758: 84 8d ldd r24, Z+28 ; 0x1c
|
|
75a: df 01 movw r26, r30
|
|
75c: a8 0f add r26, r24
|
|
75e: b1 1d adc r27, r1
|
|
760: a3 5a subi r26, 0xA3 ; 163
|
|
762: bf 4f sbci r27, 0xFF ; 255
|
|
764: 2c 91 ld r18, X
|
|
_tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_TX_BUFFER_SIZE;
|
|
766: 84 8d ldd r24, Z+28 ; 0x1c
|
|
768: 90 e0 ldi r25, 0x00 ; 0
|
|
76a: 01 96 adiw r24, 0x01 ; 1
|
|
76c: 8f 73 andi r24, 0x3F ; 63
|
|
76e: 99 27 eor r25, r25
|
|
770: 84 8f std Z+28, r24 ; 0x1c
|
|
|
|
*_udr = c;
|
|
772: a6 89 ldd r26, Z+22 ; 0x16
|
|
774: b7 89 ldd r27, Z+23 ; 0x17
|
|
776: 2c 93 st X, r18
|
|
// location". This makes sure flush() won't return until the bytes
|
|
// actually got written. Other r/w bits are preserved, and zeroes
|
|
// written to the rest.
|
|
|
|
#ifdef MPCM0
|
|
*_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << MPCM0))) | (1 << TXC0);
|
|
778: a0 89 ldd r26, Z+16 ; 0x10
|
|
77a: b1 89 ldd r27, Z+17 ; 0x11
|
|
77c: 8c 91 ld r24, X
|
|
77e: 83 70 andi r24, 0x03 ; 3
|
|
780: 80 64 ori r24, 0x40 ; 64
|
|
782: 8c 93 st X, r24
|
|
#else
|
|
*_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << TXC0)));
|
|
#endif
|
|
|
|
if (_tx_buffer_head == _tx_buffer_tail) {
|
|
784: 93 8d ldd r25, Z+27 ; 0x1b
|
|
786: 84 8d ldd r24, Z+28 ; 0x1c
|
|
788: 98 13 cpse r25, r24
|
|
78a: 06 c0 rjmp .+12 ; 0x798 <_ZN14HardwareSerial17_tx_udr_empty_irqEv+0x42>
|
|
// Buffer empty, so disable interrupts
|
|
cbi(*_ucsrb, UDRIE0);
|
|
78c: 02 88 ldd r0, Z+18 ; 0x12
|
|
78e: f3 89 ldd r31, Z+19 ; 0x13
|
|
790: e0 2d mov r30, r0
|
|
792: 80 81 ld r24, Z
|
|
794: 8f 7d andi r24, 0xDF ; 223
|
|
796: 80 83 st Z, r24
|
|
798: 08 95 ret
|
|
|
|
0000079a <_ZN14HardwareSerial5writeEh>:
|
|
// If we get here, nothing is queued anymore (DRIE is disabled) and
|
|
// the hardware finished tranmission (TXC is set).
|
|
}
|
|
|
|
size_t HardwareSerial::write(uint8_t c)
|
|
{
|
|
79a: ef 92 push r14
|
|
79c: ff 92 push r15
|
|
79e: 0f 93 push r16
|
|
7a0: 1f 93 push r17
|
|
7a2: cf 93 push r28
|
|
7a4: df 93 push r29
|
|
7a6: ec 01 movw r28, r24
|
|
_written = true;
|
|
7a8: 81 e0 ldi r24, 0x01 ; 1
|
|
7aa: 88 8f std Y+24, r24 ; 0x18
|
|
// If the buffer and the data register is empty, just write the byte
|
|
// to the data register and be done. This shortcut helps
|
|
// significantly improve the effective datarate at high (>
|
|
// 500kbit/s) bitrates, where interrupt overhead becomes a slowdown.
|
|
if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
|
|
7ac: 9b 8d ldd r25, Y+27 ; 0x1b
|
|
7ae: 8c 8d ldd r24, Y+28 ; 0x1c
|
|
7b0: 98 13 cpse r25, r24
|
|
7b2: 05 c0 rjmp .+10 ; 0x7be <_ZN14HardwareSerial5writeEh+0x24>
|
|
7b4: e8 89 ldd r30, Y+16 ; 0x10
|
|
7b6: f9 89 ldd r31, Y+17 ; 0x11
|
|
7b8: 80 81 ld r24, Z
|
|
7ba: 85 fd sbrc r24, 5
|
|
7bc: 26 c0 rjmp .+76 ; 0x80a <_ZN14HardwareSerial5writeEh+0x70>
|
|
7be: f6 2e mov r15, r22
|
|
*_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << TXC0)));
|
|
#endif
|
|
}
|
|
return 1;
|
|
}
|
|
tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE;
|
|
7c0: 0b 8d ldd r16, Y+27 ; 0x1b
|
|
7c2: 10 e0 ldi r17, 0x00 ; 0
|
|
7c4: 0f 5f subi r16, 0xFF ; 255
|
|
7c6: 1f 4f sbci r17, 0xFF ; 255
|
|
7c8: 0f 73 andi r16, 0x3F ; 63
|
|
7ca: 11 27 eor r17, r17
|
|
7cc: e0 2e mov r14, r16
|
|
|
|
// If the output buffer is full, there's nothing for it other than to
|
|
// wait for the interrupt handler to empty it a bit
|
|
while (i == _tx_buffer_tail) {
|
|
7ce: 8c 8d ldd r24, Y+28 ; 0x1c
|
|
7d0: e8 12 cpse r14, r24
|
|
7d2: 0c c0 rjmp .+24 ; 0x7ec <_ZN14HardwareSerial5writeEh+0x52>
|
|
if (bit_is_clear(SREG, SREG_I)) {
|
|
7d4: 0f b6 in r0, 0x3f ; 63
|
|
7d6: 07 fc sbrc r0, 7
|
|
7d8: fa cf rjmp .-12 ; 0x7ce <_ZN14HardwareSerial5writeEh+0x34>
|
|
// Interrupts are disabled, so we'll have to poll the data
|
|
// register empty flag ourselves. If it is set, pretend an
|
|
// interrupt has happened and call the handler to free up
|
|
// space for us.
|
|
if(bit_is_set(*_ucsra, UDRE0))
|
|
7da: e8 89 ldd r30, Y+16 ; 0x10
|
|
7dc: f9 89 ldd r31, Y+17 ; 0x11
|
|
7de: 80 81 ld r24, Z
|
|
7e0: 85 ff sbrs r24, 5
|
|
7e2: f5 cf rjmp .-22 ; 0x7ce <_ZN14HardwareSerial5writeEh+0x34>
|
|
_tx_udr_empty_irq();
|
|
7e4: ce 01 movw r24, r28
|
|
7e6: 0e 94 ab 03 call 0x756 ; 0x756 <_ZN14HardwareSerial17_tx_udr_empty_irqEv>
|
|
7ea: f1 cf rjmp .-30 ; 0x7ce <_ZN14HardwareSerial5writeEh+0x34>
|
|
} else {
|
|
// nop, the interrupt handler will free up space for us
|
|
}
|
|
}
|
|
|
|
_tx_buffer[_tx_buffer_head] = c;
|
|
7ec: 8b 8d ldd r24, Y+27 ; 0x1b
|
|
7ee: fe 01 movw r30, r28
|
|
7f0: e8 0f add r30, r24
|
|
7f2: f1 1d adc r31, r1
|
|
7f4: e3 5a subi r30, 0xA3 ; 163
|
|
7f6: ff 4f sbci r31, 0xFF ; 255
|
|
7f8: f0 82 st Z, r15
|
|
|
|
// make atomic to prevent execution of ISR between setting the
|
|
// head pointer and setting the interrupt flag resulting in buffer
|
|
// retransmission
|
|
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
|
7fa: 9f b7 in r25, 0x3f ; 63
|
|
return 1;
|
|
}
|
|
|
|
static __inline__ uint8_t __iCliRetVal(void)
|
|
{
|
|
cli();
|
|
7fc: f8 94 cli
|
|
_tx_buffer_head = i;
|
|
7fe: 0b 8f std Y+27, r16 ; 0x1b
|
|
sbi(*_ucsrb, UDRIE0);
|
|
800: ea 89 ldd r30, Y+18 ; 0x12
|
|
802: fb 89 ldd r31, Y+19 ; 0x13
|
|
804: 80 81 ld r24, Z
|
|
806: 80 62 ori r24, 0x20 ; 32
|
|
808: 0a c0 rjmp .+20 ; 0x81e <_ZN14HardwareSerial5writeEh+0x84>
|
|
// So writing UDR must happen first.
|
|
// Writing UDR and clearing TC must be done atomically, otherwise
|
|
// interrupts might delay the TXC clear so the byte written to UDR
|
|
// is transmitted (setting TXC) before clearing TXC. Then TXC will
|
|
// be cleared when no bytes are left, causing flush() to hang
|
|
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
|
80a: 9f b7 in r25, 0x3f ; 63
|
|
80c: f8 94 cli
|
|
*_udr = c;
|
|
80e: ee 89 ldd r30, Y+22 ; 0x16
|
|
810: ff 89 ldd r31, Y+23 ; 0x17
|
|
812: 60 83 st Z, r22
|
|
#ifdef MPCM0
|
|
*_ucsra = ((*_ucsra) & ((1 << U2X0) | (1 << MPCM0))) | (1 << TXC0);
|
|
814: e8 89 ldd r30, Y+16 ; 0x10
|
|
816: f9 89 ldd r31, Y+17 ; 0x11
|
|
818: 80 81 ld r24, Z
|
|
81a: 83 70 andi r24, 0x03 ; 3
|
|
81c: 80 64 ori r24, 0x40 ; 64
|
|
81e: 80 83 st Z, r24
|
|
(void)__s;
|
|
}
|
|
|
|
static __inline__ void __iRestore(const uint8_t *__s)
|
|
{
|
|
SREG = *__s;
|
|
820: 9f bf out 0x3f, r25 ; 63
|
|
_tx_buffer_head = i;
|
|
sbi(*_ucsrb, UDRIE0);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
822: 81 e0 ldi r24, 0x01 ; 1
|
|
824: 90 e0 ldi r25, 0x00 ; 0
|
|
826: df 91 pop r29
|
|
828: cf 91 pop r28
|
|
82a: 1f 91 pop r17
|
|
82c: 0f 91 pop r16
|
|
82e: ff 90 pop r15
|
|
830: ef 90 pop r14
|
|
832: 08 95 ret
|
|
|
|
00000834 <_ZN14HardwareSerial5flushEv>:
|
|
if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
|
|
return tail - head - 1;
|
|
}
|
|
|
|
void HardwareSerial::flush()
|
|
{
|
|
834: cf 93 push r28
|
|
836: df 93 push r29
|
|
838: ec 01 movw r28, r24
|
|
// If we have never written a byte, no need to flush. This special
|
|
// case is needed since there is no way to force the TXC (transmit
|
|
// complete) bit to 1 during initialization
|
|
if (!_written)
|
|
83a: 88 8d ldd r24, Y+24 ; 0x18
|
|
83c: 88 23 and r24, r24
|
|
83e: c9 f0 breq .+50 ; 0x872 <_ZN14HardwareSerial5flushEv+0x3e>
|
|
return;
|
|
|
|
while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
|
|
840: ea 89 ldd r30, Y+18 ; 0x12
|
|
842: fb 89 ldd r31, Y+19 ; 0x13
|
|
844: 80 81 ld r24, Z
|
|
846: 85 fd sbrc r24, 5
|
|
848: 05 c0 rjmp .+10 ; 0x854 <_ZN14HardwareSerial5flushEv+0x20>
|
|
84a: a8 89 ldd r26, Y+16 ; 0x10
|
|
84c: b9 89 ldd r27, Y+17 ; 0x11
|
|
84e: 8c 91 ld r24, X
|
|
850: 86 fd sbrc r24, 6
|
|
852: 0f c0 rjmp .+30 ; 0x872 <_ZN14HardwareSerial5flushEv+0x3e>
|
|
if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
|
|
854: 0f b6 in r0, 0x3f ; 63
|
|
856: 07 fc sbrc r0, 7
|
|
858: f5 cf rjmp .-22 ; 0x844 <_ZN14HardwareSerial5flushEv+0x10>
|
|
85a: 80 81 ld r24, Z
|
|
85c: 85 ff sbrs r24, 5
|
|
85e: f2 cf rjmp .-28 ; 0x844 <_ZN14HardwareSerial5flushEv+0x10>
|
|
// Interrupts are globally disabled, but the DR empty
|
|
// interrupt should be enabled, so poll the DR empty flag to
|
|
// prevent deadlock
|
|
if (bit_is_set(*_ucsra, UDRE0))
|
|
860: a8 89 ldd r26, Y+16 ; 0x10
|
|
862: b9 89 ldd r27, Y+17 ; 0x11
|
|
864: 8c 91 ld r24, X
|
|
866: 85 ff sbrs r24, 5
|
|
868: ed cf rjmp .-38 ; 0x844 <_ZN14HardwareSerial5flushEv+0x10>
|
|
_tx_udr_empty_irq();
|
|
86a: ce 01 movw r24, r28
|
|
86c: 0e 94 ab 03 call 0x756 ; 0x756 <_ZN14HardwareSerial17_tx_udr_empty_irqEv>
|
|
870: e7 cf rjmp .-50 ; 0x840 <_ZN14HardwareSerial5flushEv+0xc>
|
|
}
|
|
// If we get here, nothing is queued anymore (DRIE is disabled) and
|
|
// the hardware finished tranmission (TXC is set).
|
|
}
|
|
872: df 91 pop r29
|
|
874: cf 91 pop r28
|
|
876: 08 95 ret
|
|
|
|
00000878 <_Z14serialEventRunv>:
|
|
#endif
|
|
|
|
void serialEventRun(void)
|
|
{
|
|
#if defined(HAVE_HWSERIAL0)
|
|
if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
|
|
878: 80 e0 ldi r24, 0x00 ; 0
|
|
87a: 90 e0 ldi r25, 0x00 ; 0
|
|
87c: 89 2b or r24, r25
|
|
87e: 29 f0 breq .+10 ; 0x88a <_Z14serialEventRunv+0x12>
|
|
880: 0e 94 a1 03 call 0x742 ; 0x742 <_Z17Serial0_availablev>
|
|
884: 81 11 cpse r24, r1
|
|
886: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
|
|
88a: 08 95 ret
|
|
|
|
0000088c <_ZN5Print5flushEv>:
|
|
size_t println(unsigned long, int = DEC);
|
|
size_t println(double, int = 2);
|
|
size_t println(const Printable&);
|
|
size_t println(void);
|
|
|
|
virtual void flush() { /* Empty implementation for backward compatibility */ }
|
|
88c: 08 95 ret
|
|
|
|
0000088e <_ZN5Print17availableForWriteEv>:
|
|
return write((const uint8_t *)buffer, size);
|
|
}
|
|
|
|
// default to zero, meaning "a single write may block"
|
|
// should be overriden by subclasses with buffering
|
|
virtual int availableForWrite() { return 0; }
|
|
88e: 80 e0 ldi r24, 0x00 ; 0
|
|
890: 90 e0 ldi r25, 0x00 ; 0
|
|
892: 08 95 ret
|
|
|
|
00000894 <_ZN5Print5writeEPKc.constprop.24>:
|
|
int getWriteError() { return write_error; }
|
|
void clearWriteError() { setWriteError(0); }
|
|
|
|
virtual size_t write(uint8_t) = 0;
|
|
size_t write(const char *str) {
|
|
if (str == NULL) return 0;
|
|
894: 00 97 sbiw r24, 0x00 ; 0
|
|
896: 69 f0 breq .+26 ; 0x8b2 <_ZN5Print5writeEPKc.constprop.24+0x1e>
|
|
return write((const uint8_t *)str, strlen(str));
|
|
898: fc 01 movw r30, r24
|
|
89a: 01 90 ld r0, Z+
|
|
89c: 00 20 and r0, r0
|
|
89e: e9 f7 brne .-6 ; 0x89a <_ZN5Print5writeEPKc.constprop.24+0x6>
|
|
8a0: 31 97 sbiw r30, 0x01 ; 1
|
|
8a2: af 01 movw r20, r30
|
|
8a4: 48 1b sub r20, r24
|
|
8a6: 59 0b sbc r21, r25
|
|
8a8: bc 01 movw r22, r24
|
|
8aa: 80 ef ldi r24, 0xF0 ; 240
|
|
8ac: 91 e0 ldi r25, 0x01 ; 1
|
|
8ae: 0c 94 3a 03 jmp 0x674 ; 0x674 <_ZN5Print5writeEPKhj>
|
|
}
|
|
8b2: 80 e0 ldi r24, 0x00 ; 0
|
|
8b4: 90 e0 ldi r25, 0x00 ; 0
|
|
8b6: 08 95 ret
|
|
|
|
000008b8 <_ZN5Print11printNumberEmh.constprop.20>:
|
|
return n;
|
|
}
|
|
|
|
// Private Methods /////////////////////////////////////////////////////////////
|
|
|
|
size_t Print::printNumber(unsigned long n, uint8_t base)
|
|
8b8: 8f 92 push r8
|
|
8ba: 9f 92 push r9
|
|
8bc: af 92 push r10
|
|
8be: bf 92 push r11
|
|
8c0: 0f 93 push r16
|
|
8c2: 1f 93 push r17
|
|
8c4: cf 93 push r28
|
|
8c6: df 93 push r29
|
|
8c8: cd b7 in r28, 0x3d ; 61
|
|
8ca: de b7 in r29, 0x3e ; 62
|
|
8cc: a1 97 sbiw r28, 0x21 ; 33
|
|
8ce: 0f b6 in r0, 0x3f ; 63
|
|
8d0: f8 94 cli
|
|
8d2: de bf out 0x3e, r29 ; 62
|
|
8d4: 0f be out 0x3f, r0 ; 63
|
|
8d6: cd bf out 0x3d, r28 ; 61
|
|
{
|
|
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
|
|
char *str = &buf[sizeof(buf) - 1];
|
|
|
|
*str = '\0';
|
|
8d8: 19 a2 std Y+33, r1 ; 0x21
|
|
|
|
// prevent crash if called with base == 1
|
|
if (base < 2) base = 10;
|
|
8da: 42 30 cpi r20, 0x02 ; 2
|
|
8dc: 08 f4 brcc .+2 ; 0x8e0 <_ZN5Print11printNumberEmh.constprop.20+0x28>
|
|
8de: 4a e0 ldi r20, 0x0A ; 10
|
|
8e0: 8e 01 movw r16, r28
|
|
8e2: 0f 5d subi r16, 0xDF ; 223
|
|
8e4: 1f 4f sbci r17, 0xFF ; 255
|
|
|
|
do {
|
|
char c = n % base;
|
|
8e6: 84 2e mov r8, r20
|
|
8e8: 91 2c mov r9, r1
|
|
8ea: a1 2c mov r10, r1
|
|
8ec: b1 2c mov r11, r1
|
|
8ee: a5 01 movw r20, r10
|
|
8f0: 94 01 movw r18, r8
|
|
8f2: 0e 94 65 0a call 0x14ca ; 0x14ca <__udivmodsi4>
|
|
8f6: e6 2f mov r30, r22
|
|
n /= base;
|
|
8f8: b9 01 movw r22, r18
|
|
8fa: ca 01 movw r24, r20
|
|
|
|
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
|
8fc: 01 50 subi r16, 0x01 ; 1
|
|
8fe: 11 09 sbc r17, r1
|
|
900: ea 30 cpi r30, 0x0A ; 10
|
|
902: 14 f4 brge .+4 ; 0x908 <__stack+0x9>
|
|
904: e0 5d subi r30, 0xD0 ; 208
|
|
906: 01 c0 rjmp .+2 ; 0x90a <__stack+0xb>
|
|
908: e9 5c subi r30, 0xC9 ; 201
|
|
90a: d8 01 movw r26, r16
|
|
90c: ec 93 st X, r30
|
|
*str = '\0';
|
|
|
|
// prevent crash if called with base == 1
|
|
if (base < 2) base = 10;
|
|
|
|
do {
|
|
90e: 23 2b or r18, r19
|
|
910: 24 2b or r18, r20
|
|
912: 25 2b or r18, r21
|
|
914: 61 f7 brne .-40 ; 0x8ee <_ZN5Print11printNumberEmh.constprop.20+0x36>
|
|
n /= base;
|
|
|
|
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
|
} while(n);
|
|
|
|
return write(str);
|
|
916: c8 01 movw r24, r16
|
|
918: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
}
|
|
91c: a1 96 adiw r28, 0x21 ; 33
|
|
91e: 0f b6 in r0, 0x3f ; 63
|
|
920: f8 94 cli
|
|
922: de bf out 0x3e, r29 ; 62
|
|
924: 0f be out 0x3f, r0 ; 63
|
|
926: cd bf out 0x3d, r28 ; 61
|
|
928: df 91 pop r29
|
|
92a: cf 91 pop r28
|
|
92c: 1f 91 pop r17
|
|
92e: 0f 91 pop r16
|
|
930: bf 90 pop r11
|
|
932: af 90 pop r10
|
|
934: 9f 90 pop r9
|
|
936: 8f 90 pop r8
|
|
938: 08 95 ret
|
|
|
|
0000093a <_ZN10Nokia_511019transmitInformationEh>:
|
|
|
|
void Nokia_5110::endTransmission(){
|
|
digitalWrite(_CE, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::transmitInformation(byte information){
|
|
93a: cf 92 push r12
|
|
93c: df 92 push r13
|
|
93e: ef 92 push r14
|
|
940: ff 92 push r15
|
|
942: 0f 93 push r16
|
|
944: 1f 93 push r17
|
|
946: cf 93 push r28
|
|
948: df 93 push r29
|
|
94a: ec 01 movw r28, r24
|
|
94c: e6 2e mov r14, r22
|
|
setBiasSystem(Mux_Rate::FORTY);
|
|
setContrast(60);
|
|
}
|
|
|
|
void Nokia_5110::startTransmission(){
|
|
digitalWrite(_CE, LOW);
|
|
94e: 60 e0 ldi r22, 0x00 ; 0
|
|
950: 8e 81 ldd r24, Y+6 ; 0x06
|
|
952: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
digitalWrite(_CE, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::transmitInformation(byte information){
|
|
startTransmission();
|
|
shiftOut(_DIN, _CLK, MSBFIRST, information);
|
|
956: dc 84 ldd r13, Y+12 ; 0x0c
|
|
958: ca 84 ldd r12, Y+10 ; 0x0a
|
|
95a: 07 e0 ldi r16, 0x07 ; 7
|
|
95c: 10 e0 ldi r17, 0x00 ; 0
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
if (bitOrder == LSBFIRST)
|
|
digitalWrite(dataPin, !!(val & (1 << i)));
|
|
else
|
|
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
|
|
95e: f1 2c mov r15, r1
|
|
960: b7 01 movw r22, r14
|
|
962: 00 2e mov r0, r16
|
|
964: 02 c0 rjmp .+4 ; 0x96a <_ZN10Nokia_511019transmitInformationEh+0x30>
|
|
966: 75 95 asr r23
|
|
968: 67 95 ror r22
|
|
96a: 0a 94 dec r0
|
|
96c: e2 f7 brpl .-8 ; 0x966 <_ZN10Nokia_511019transmitInformationEh+0x2c>
|
|
96e: 61 70 andi r22, 0x01 ; 1
|
|
970: 8c 2d mov r24, r12
|
|
972: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
|
|
digitalWrite(clockPin, HIGH);
|
|
976: 61 e0 ldi r22, 0x01 ; 1
|
|
978: 8d 2d mov r24, r13
|
|
97a: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
digitalWrite(clockPin, LOW);
|
|
97e: 60 e0 ldi r22, 0x00 ; 0
|
|
980: 8d 2d mov r24, r13
|
|
982: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
986: 01 50 subi r16, 0x01 ; 1
|
|
988: 11 09 sbc r17, r1
|
|
98a: 50 f7 brcc .-44 ; 0x960 <_ZN10Nokia_511019transmitInformationEh+0x26>
|
|
void Nokia_5110::startTransmission(){
|
|
digitalWrite(_CE, LOW);
|
|
}
|
|
|
|
void Nokia_5110::endTransmission(){
|
|
digitalWrite(_CE, HIGH);
|
|
98c: 61 e0 ldi r22, 0x01 ; 1
|
|
98e: 8e 81 ldd r24, Y+6 ; 0x06
|
|
|
|
void Nokia_5110::transmitInformation(byte information){
|
|
startTransmission();
|
|
shiftOut(_DIN, _CLK, MSBFIRST, information);
|
|
endTransmission();
|
|
}
|
|
990: df 91 pop r29
|
|
992: cf 91 pop r28
|
|
994: 1f 91 pop r17
|
|
996: 0f 91 pop r16
|
|
998: ff 90 pop r15
|
|
99a: ef 90 pop r14
|
|
99c: df 90 pop r13
|
|
99e: cf 90 pop r12
|
|
void Nokia_5110::startTransmission(){
|
|
digitalWrite(_CE, LOW);
|
|
}
|
|
|
|
void Nokia_5110::endTransmission(){
|
|
digitalWrite(_CE, HIGH);
|
|
9a0: 0c 94 8e 02 jmp 0x51c ; 0x51c <digitalWrite>
|
|
|
|
000009a4 <_ZN10Nokia_51107executeEh>:
|
|
startTransmission();
|
|
shiftOut(_DIN, _CLK, MSBFIRST, information);
|
|
endTransmission();
|
|
}
|
|
|
|
void Nokia_5110::execute(byte command){
|
|
9a4: 1f 93 push r17
|
|
9a6: cf 93 push r28
|
|
9a8: df 93 push r29
|
|
9aa: ec 01 movw r28, r24
|
|
9ac: 16 2f mov r17, r22
|
|
initializeForSendingCommand();
|
|
transmitInformation(command);
|
|
}
|
|
|
|
void Nokia_5110::initializeForSendingCommand(){
|
|
digitalWrite(_DC, LOW);
|
|
9ae: 60 e0 ldi r22, 0x00 ; 0
|
|
9b0: 88 85 ldd r24, Y+8 ; 0x08
|
|
9b2: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
endTransmission();
|
|
}
|
|
|
|
void Nokia_5110::execute(byte command){
|
|
initializeForSendingCommand();
|
|
transmitInformation(command);
|
|
9b6: 61 2f mov r22, r17
|
|
9b8: ce 01 movw r24, r28
|
|
}
|
|
9ba: df 91 pop r29
|
|
9bc: cf 91 pop r28
|
|
9be: 1f 91 pop r17
|
|
endTransmission();
|
|
}
|
|
|
|
void Nokia_5110::execute(byte command){
|
|
initializeForSendingCommand();
|
|
transmitInformation(command);
|
|
9c0: 0c 94 9d 04 jmp 0x93a ; 0x93a <_ZN10Nokia_511019transmitInformationEh>
|
|
|
|
000009c4 <_ZN10Nokia_51109setCursorEtt>:
|
|
|
|
transmitInformation(0x0); // add an empty line after each chars
|
|
_cursor.moveXAxis(fontData.definition_total_bytes + 1);
|
|
}
|
|
|
|
void Nokia_5110::setCursor(position x, position y){
|
|
9c4: 0f 93 push r16
|
|
9c6: 1f 93 push r17
|
|
9c8: cf 93 push r28
|
|
9ca: df 93 push r29
|
|
9cc: ec 01 movw r28, r24
|
|
9ce: 06 2f mov r16, r22
|
|
9d0: 14 2f mov r17, r20
|
|
#include "Cursor.h"
|
|
|
|
void Cursor::setCursor(position x, position y){
|
|
_x = x;
|
|
9d2: 68 8b std Y+16, r22 ; 0x10
|
|
9d4: 79 8b std Y+17, r23 ; 0x11
|
|
_y = y;
|
|
9d6: 4e 87 std Y+14, r20 ; 0x0e
|
|
9d8: 5f 87 std Y+15, r21 ; 0x0f
|
|
void Nokia_5110::extendedInstruction(){
|
|
execute(0x21);
|
|
}
|
|
|
|
void Nokia_5110::basicInstruction(){
|
|
execute(0x20);
|
|
9da: 60 e2 ldi r22, 0x20 ; 32
|
|
9dc: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
|
|
basicInstruction();
|
|
|
|
//set x position
|
|
unsigned short int leastXPositionValue = 128;
|
|
execute(byte(leastXPositionValue + x));
|
|
9e0: 60 e8 ldi r22, 0x80 ; 128
|
|
9e2: 60 0f add r22, r16
|
|
9e4: ce 01 movw r24, r28
|
|
9e6: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
|
|
|
|
//set y position
|
|
unsigned short int leastYPositionValue = 64;
|
|
execute(byte(leastYPositionValue + y));
|
|
9ea: 60 e4 ldi r22, 0x40 ; 64
|
|
9ec: 61 0f add r22, r17
|
|
9ee: ce 01 movw r24, r28
|
|
}
|
|
9f0: df 91 pop r29
|
|
9f2: cf 91 pop r28
|
|
9f4: 1f 91 pop r17
|
|
9f6: 0f 91 pop r16
|
|
execute(byte(leastXPositionValue + x));
|
|
|
|
|
|
//set y position
|
|
unsigned short int leastYPositionValue = 64;
|
|
execute(byte(leastYPositionValue + y));
|
|
9f8: 0c 94 d2 04 jmp 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
|
|
000009fc <_ZN10Nokia_51105clearEv.constprop.31>:
|
|
}
|
|
|
|
void Nokia_5110::clear(){
|
|
9fc: cf 93 push r28
|
|
9fe: df 93 push r29
|
|
digitalWrite(_RST, LOW);
|
|
digitalWrite(_RST, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::initializeForSendingData(){
|
|
digitalWrite(_DC, HIGH);
|
|
a00: 61 e0 ldi r22, 0x01 ; 1
|
|
a02: 80 91 f8 01 lds r24, 0x01F8 ; 0x8001f8 <lcd+0x8>
|
|
a06: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
a0a: c9 ef ldi r28, 0xF9 ; 249
|
|
a0c: d1 e0 ldi r29, 0x01 ; 1
|
|
void Nokia_5110::clear(){
|
|
initializeForSendingData();
|
|
|
|
int i = 504;
|
|
while(i >= 0){
|
|
transmitInformation(0x0);
|
|
a0e: 60 e0 ldi r22, 0x00 ; 0
|
|
a10: 80 ef ldi r24, 0xF0 ; 240
|
|
a12: 91 e0 ldi r25, 0x01 ; 1
|
|
a14: 0e 94 9d 04 call 0x93a ; 0x93a <_ZN10Nokia_511019transmitInformationEh>
|
|
a18: 21 97 sbiw r28, 0x01 ; 1
|
|
|
|
void Nokia_5110::clear(){
|
|
initializeForSendingData();
|
|
|
|
int i = 504;
|
|
while(i >= 0){
|
|
a1a: c9 f7 brne .-14 ; 0xa0e <_ZN10Nokia_51105clearEv.constprop.31+0x12>
|
|
transmitInformation(0x0);
|
|
i--;
|
|
}
|
|
|
|
setCursor(0, 0);
|
|
a1c: 40 e0 ldi r20, 0x00 ; 0
|
|
a1e: 50 e0 ldi r21, 0x00 ; 0
|
|
a20: 60 e0 ldi r22, 0x00 ; 0
|
|
a22: 70 e0 ldi r23, 0x00 ; 0
|
|
a24: 80 ef ldi r24, 0xF0 ; 240
|
|
a26: 91 e0 ldi r25, 0x01 ; 1
|
|
}
|
|
a28: df 91 pop r29
|
|
a2a: cf 91 pop r28
|
|
while(i >= 0){
|
|
transmitInformation(0x0);
|
|
i--;
|
|
}
|
|
|
|
setCursor(0, 0);
|
|
a2c: 0c 94 e2 04 jmp 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
|
|
00000a30 <_ZN10Nokia_51106_printEh.constprop.6>:
|
|
_cursor.moveYAxis(1);
|
|
setCursor(_cursor.getPosition().x, _cursor.getPosition().y);
|
|
initializeForSendingData();
|
|
}
|
|
|
|
void Nokia_5110::_print(uint8_t charAsciiCode){
|
|
a30: 8f 92 push r8
|
|
a32: 9f 92 push r9
|
|
a34: af 92 push r10
|
|
a36: bf 92 push r11
|
|
a38: cf 92 push r12
|
|
a3a: df 92 push r13
|
|
a3c: ef 92 push r14
|
|
a3e: ff 92 push r15
|
|
a40: 0f 93 push r16
|
|
a42: 1f 93 push r17
|
|
a44: cf 93 push r28
|
|
a46: df 93 push r29
|
|
a48: cd b7 in r28, 0x3d ; 61
|
|
a4a: de b7 in r29, 0x3e ; 62
|
|
a4c: 2a 97 sbiw r28, 0x0a ; 10
|
|
a4e: 0f b6 in r0, 0x3f ; 63
|
|
a50: f8 94 cli
|
|
a52: de bf out 0x3e, r29 ; 62
|
|
a54: 0f be out 0x3f, r0 ; 63
|
|
a56: cd bf out 0x3d, r28 ; 61
|
|
a58: 8c 01 movw r16, r24
|
|
a5a: d6 2e mov r13, r22
|
|
a5c: 0e 96 adiw r24, 0x0e ; 14
|
|
a5e: 5c 01 movw r10, r24
|
|
|
|
if (charAsciiCode == 0x0a){ // \n for jumping to the beginning of a new line.
|
|
a60: 9a e0 ldi r25, 0x0A ; 10
|
|
a62: 69 13 cpse r22, r25
|
|
a64: 04 c0 rjmp .+8 ; 0xa6e <_ZN10Nokia_51106_printEh.constprop.6+0x3e>
|
|
_cursor.moveYAxis(1);
|
|
a66: c5 01 movw r24, r10
|
|
a68: 0e 94 81 02 call 0x502 ; 0x502 <_ZN6Cursor9moveYAxisEt.constprop.10>
|
|
a6c: 72 c0 rjmp .+228 ; 0xb52 <_ZN10Nokia_51106_printEh.constprop.6+0x122>
|
|
return;
|
|
}
|
|
|
|
setCursor(_cursor.getPosition().x, _cursor.getPosition().y);
|
|
a6e: f8 01 movw r30, r16
|
|
a70: 46 85 ldd r20, Z+14 ; 0x0e
|
|
a72: 57 85 ldd r21, Z+15 ; 0x0f
|
|
a74: 60 89 ldd r22, Z+16 ; 0x10
|
|
a76: 71 89 ldd r23, Z+17 ; 0x11
|
|
a78: c8 01 movw r24, r16
|
|
a7a: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
digitalWrite(_RST, LOW);
|
|
digitalWrite(_RST, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::initializeForSendingData(){
|
|
digitalWrite(_DC, HIGH);
|
|
a7e: 61 e0 ldi r22, 0x01 ; 1
|
|
a80: f8 01 movw r30, r16
|
|
a82: 80 85 ldd r24, Z+8 ; 0x08
|
|
a84: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
a88: 8c e7 ldi r24, 0x7C ; 124
|
|
a8a: e8 2e mov r14, r24
|
|
a8c: 80 e0 ldi r24, 0x00 ; 0
|
|
a8e: f8 2e mov r15, r24
|
|
unsigned short int total_characters = sizeof(characters) / sizeof(*characters);
|
|
character temp;
|
|
|
|
for (unsigned short int i = 0; i < total_characters; i++) {
|
|
//Retrieve character from FLASH MEMORY
|
|
memcpy_P(&temp, &characters[i], sizeof(character));
|
|
a90: 4a e0 ldi r20, 0x0A ; 10
|
|
a92: 50 e0 ldi r21, 0x00 ; 0
|
|
a94: b7 01 movw r22, r14
|
|
a96: ce 01 movw r24, r28
|
|
a98: 01 96 adiw r24, 0x01 ; 1
|
|
a9a: 0e 94 92 08 call 0x1124 ; 0x1124 <memcpy_P>
|
|
if (temp.ascii_code == ascii_code) return temp;
|
|
a9e: 8a 81 ldd r24, Y+2 ; 0x02
|
|
aa0: d8 16 cp r13, r24
|
|
aa2: 81 f0 breq .+32 ; 0xac4 <_ZN10Nokia_51106_printEh.constprop.6+0x94>
|
|
aa4: fa e0 ldi r31, 0x0A ; 10
|
|
aa6: ef 0e add r14, r31
|
|
aa8: f1 1c adc r15, r1
|
|
|
|
character findCorrespondingByte(uint8_t ascii_code){
|
|
unsigned short int total_characters = sizeof(characters) / sizeof(*characters);
|
|
character temp;
|
|
|
|
for (unsigned short int i = 0; i < total_characters; i++) {
|
|
aaa: 82 e3 ldi r24, 0x32 ; 50
|
|
aac: e8 16 cp r14, r24
|
|
aae: 84 e0 ldi r24, 0x04 ; 4
|
|
ab0: f8 06 cpc r15, r24
|
|
ab2: 71 f7 brne .-36 ; 0xa90 <_ZN10Nokia_51106_printEh.constprop.6+0x60>
|
|
//Retrieve character from FLASH MEMORY
|
|
memcpy_P(&temp, &characters[i], sizeof(character));
|
|
if (temp.ascii_code == ascii_code) return temp;
|
|
}
|
|
memcpy_P(&temp, &characters[0], sizeof(character));
|
|
ab4: 4a e0 ldi r20, 0x0A ; 10
|
|
ab6: 50 e0 ldi r21, 0x00 ; 0
|
|
ab8: 6c e7 ldi r22, 0x7C ; 124
|
|
aba: 70 e0 ldi r23, 0x00 ; 0
|
|
abc: ce 01 movw r24, r28
|
|
abe: 01 96 adiw r24, 0x01 ; 1
|
|
ac0: 0e 94 92 08 call 0x1124 ; 0x1124 <memcpy_P>
|
|
|
|
setCursor(_cursor.getPosition().x, _cursor.getPosition().y);
|
|
|
|
initializeForSendingData();
|
|
|
|
character fontData = findCorrespondingByte(charAsciiCode);
|
|
ac4: c9 84 ldd r12, Y+9 ; 0x09
|
|
ac6: da 84 ldd r13, Y+10 ; 0x0a
|
|
void Nokia_5110::initializeForSendingData(){
|
|
digitalWrite(_DC, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::makeEnoughSpaceForPrinting(unsigned short int newCharacterLength){
|
|
if((newCharacterLength + _cursor.getPosition().x) < 85)
|
|
ac8: f8 01 movw r30, r16
|
|
aca: 80 89 ldd r24, Z+16 ; 0x10
|
|
acc: 91 89 ldd r25, Z+17 ; 0x11
|
|
ace: 8c 0d add r24, r12
|
|
ad0: 9d 1d adc r25, r13
|
|
ad2: 85 35 cpi r24, 0x55 ; 85
|
|
ad4: 91 05 cpc r25, r1
|
|
ad6: 80 f0 brcs .+32 ; 0xaf8 <_ZN10Nokia_51106_printEh.constprop.6+0xc8>
|
|
return;
|
|
|
|
_cursor.moveYAxis(1);
|
|
ad8: c5 01 movw r24, r10
|
|
ada: 0e 94 81 02 call 0x502 ; 0x502 <_ZN6Cursor9moveYAxisEt.constprop.10>
|
|
setCursor(_cursor.getPosition().x, _cursor.getPosition().y);
|
|
ade: f8 01 movw r30, r16
|
|
ae0: 46 85 ldd r20, Z+14 ; 0x0e
|
|
ae2: 57 85 ldd r21, Z+15 ; 0x0f
|
|
ae4: 60 89 ldd r22, Z+16 ; 0x10
|
|
ae6: 71 89 ldd r23, Z+17 ; 0x11
|
|
ae8: c8 01 movw r24, r16
|
|
aea: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
digitalWrite(_RST, LOW);
|
|
digitalWrite(_RST, HIGH);
|
|
}
|
|
|
|
void Nokia_5110::initializeForSendingData(){
|
|
digitalWrite(_DC, HIGH);
|
|
aee: 61 e0 ldi r22, 0x01 ; 1
|
|
af0: f8 01 movw r30, r16
|
|
af2: 80 85 ldd r24, Z+8 ; 0x08
|
|
af4: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
af8: ce 01 movw r24, r28
|
|
afa: 01 96 adiw r24, 0x01 ; 1
|
|
afc: 7c 01 movw r14, r24
|
|
afe: 4c 01 movw r8, r24
|
|
b00: 8c 0c add r8, r12
|
|
b02: 9d 1c adc r9, r13
|
|
initializeForSendingData();
|
|
|
|
character fontData = findCorrespondingByte(charAsciiCode);
|
|
makeEnoughSpaceForPrinting(fontData.definition_total_bytes);
|
|
|
|
for(unsigned int i = 0; i < fontData.definition_total_bytes; i++){
|
|
b04: e8 14 cp r14, r8
|
|
b06: f9 04 cpc r15, r9
|
|
b08: 49 f0 breq .+18 ; 0xb1c <_ZN10Nokia_51106_printEh.constprop.6+0xec>
|
|
transmitInformation(fontData.definition[i]);
|
|
b0a: f7 01 movw r30, r14
|
|
b0c: 62 81 ldd r22, Z+2 ; 0x02
|
|
b0e: c8 01 movw r24, r16
|
|
b10: 0e 94 9d 04 call 0x93a ; 0x93a <_ZN10Nokia_511019transmitInformationEh>
|
|
b14: ff ef ldi r31, 0xFF ; 255
|
|
b16: ef 1a sub r14, r31
|
|
b18: ff 0a sbc r15, r31
|
|
b1a: f4 cf rjmp .-24 ; 0xb04 <_ZN10Nokia_51106_printEh.constprop.6+0xd4>
|
|
}
|
|
|
|
transmitInformation(0x0); // add an empty line after each chars
|
|
b1c: 60 e0 ldi r22, 0x00 ; 0
|
|
b1e: c8 01 movw r24, r16
|
|
b20: 0e 94 9d 04 call 0x93a ; 0x93a <_ZN10Nokia_511019transmitInformationEh>
|
|
|
|
/**
|
|
* Moves cursor in x axis by a number sepcified in method's parameter
|
|
*/
|
|
void Cursor::moveXAxis(position by){
|
|
if(by == 0)
|
|
b24: 8f ef ldi r24, 0xFF ; 255
|
|
b26: c8 16 cp r12, r24
|
|
b28: d8 06 cpc r13, r24
|
|
b2a: 99 f0 breq .+38 ; 0xb52 <_ZN10Nokia_51106_printEh.constprop.6+0x122>
|
|
return;
|
|
|
|
_x++;
|
|
b2c: f8 01 movw r30, r16
|
|
b2e: 80 89 ldd r24, Z+16 ; 0x10
|
|
b30: 91 89 ldd r25, Z+17 ; 0x11
|
|
b32: 01 96 adiw r24, 0x01 ; 1
|
|
b34: 91 8b std Z+17, r25 ; 0x11
|
|
b36: 80 8b std Z+16, r24 ; 0x10
|
|
|
|
if(_x > 83){
|
|
b38: 84 35 cpi r24, 0x54 ; 84
|
|
b3a: 91 05 cpc r25, r1
|
|
b3c: 30 f0 brcs .+12 ; 0xb4a <_ZN10Nokia_51106_printEh.constprop.6+0x11a>
|
|
moveYAxis(1);
|
|
b3e: c5 01 movw r24, r10
|
|
b40: 0e 94 81 02 call 0x502 ; 0x502 <_ZN6Cursor9moveYAxisEt.constprop.10>
|
|
_x = 0;
|
|
b44: f8 01 movw r30, r16
|
|
b46: 11 8a std Z+17, r1 ; 0x11
|
|
b48: 10 8a std Z+16, r1 ; 0x10
|
|
b4a: f1 e0 ldi r31, 0x01 ; 1
|
|
b4c: cf 1a sub r12, r31
|
|
b4e: d1 08 sbc r13, r1
|
|
b50: e9 cf rjmp .-46 ; 0xb24 <_ZN10Nokia_51106_printEh.constprop.6+0xf4>
|
|
_cursor.moveXAxis(fontData.definition_total_bytes + 1);
|
|
}
|
|
b52: 2a 96 adiw r28, 0x0a ; 10
|
|
b54: 0f b6 in r0, 0x3f ; 63
|
|
b56: f8 94 cli
|
|
b58: de bf out 0x3e, r29 ; 62
|
|
b5a: 0f be out 0x3f, r0 ; 63
|
|
b5c: cd bf out 0x3d, r28 ; 61
|
|
b5e: df 91 pop r29
|
|
b60: cf 91 pop r28
|
|
b62: 1f 91 pop r17
|
|
b64: 0f 91 pop r16
|
|
b66: ff 90 pop r15
|
|
b68: ef 90 pop r14
|
|
b6a: df 90 pop r13
|
|
b6c: cf 90 pop r12
|
|
b6e: bf 90 pop r11
|
|
b70: af 90 pop r10
|
|
b72: 9f 90 pop r9
|
|
b74: 8f 90 pop r8
|
|
b76: 08 95 ret
|
|
|
|
00000b78 <_ZN10Nokia_51105writeEh>:
|
|
extendedInstruction();
|
|
execute(rate);
|
|
}
|
|
|
|
size_t Nokia_5110::write(uint8_t character) {
|
|
_print(character);
|
|
b78: 0e 94 18 05 call 0xa30 ; 0xa30 <_ZN10Nokia_51106_printEh.constprop.6>
|
|
return 1;
|
|
}
|
|
b7c: 81 e0 ldi r24, 0x01 ; 1
|
|
b7e: 90 e0 ldi r25, 0x00 ; 0
|
|
b80: 08 95 ret
|
|
|
|
00000b82 <__cxa_pure_virtual>:
|
|
extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
|
|
|
|
void __cxa_pure_virtual(void) {
|
|
// We might want to write some diagnostics to uart in this case
|
|
//std::terminate();
|
|
abort();
|
|
b82: 0e 94 8d 0a call 0x151a ; 0x151a <abort>
|
|
|
|
00000b86 <__vector_16>:
|
|
#if defined(TIM0_OVF_vect)
|
|
ISR(TIM0_OVF_vect)
|
|
#else
|
|
ISR(TIMER0_OVF_vect)
|
|
#endif
|
|
{
|
|
b86: 1f 92 push r1
|
|
b88: 0f 92 push r0
|
|
b8a: 0f b6 in r0, 0x3f ; 63
|
|
b8c: 0f 92 push r0
|
|
b8e: 11 24 eor r1, r1
|
|
b90: 2f 93 push r18
|
|
b92: 3f 93 push r19
|
|
b94: 8f 93 push r24
|
|
b96: 9f 93 push r25
|
|
b98: af 93 push r26
|
|
b9a: bf 93 push r27
|
|
// copy these to local variables so they can be stored in registers
|
|
// (volatile variables must be read from memory on every access)
|
|
unsigned long m = timer0_millis;
|
|
b9c: 80 91 4b 01 lds r24, 0x014B ; 0x80014b <timer0_millis>
|
|
ba0: 90 91 4c 01 lds r25, 0x014C ; 0x80014c <timer0_millis+0x1>
|
|
ba4: a0 91 4d 01 lds r26, 0x014D ; 0x80014d <timer0_millis+0x2>
|
|
ba8: b0 91 4e 01 lds r27, 0x014E ; 0x80014e <timer0_millis+0x3>
|
|
unsigned char f = timer0_fract;
|
|
bac: 30 91 4a 01 lds r19, 0x014A ; 0x80014a <timer0_fract>
|
|
|
|
m += MILLIS_INC;
|
|
f += FRACT_INC;
|
|
bb0: 23 e0 ldi r18, 0x03 ; 3
|
|
bb2: 23 0f add r18, r19
|
|
if (f >= FRACT_MAX) {
|
|
bb4: 2d 37 cpi r18, 0x7D ; 125
|
|
bb6: 20 f4 brcc .+8 ; 0xbc0 <__vector_16+0x3a>
|
|
// copy these to local variables so they can be stored in registers
|
|
// (volatile variables must be read from memory on every access)
|
|
unsigned long m = timer0_millis;
|
|
unsigned char f = timer0_fract;
|
|
|
|
m += MILLIS_INC;
|
|
bb8: 01 96 adiw r24, 0x01 ; 1
|
|
bba: a1 1d adc r26, r1
|
|
bbc: b1 1d adc r27, r1
|
|
bbe: 05 c0 rjmp .+10 ; 0xbca <__vector_16+0x44>
|
|
f += FRACT_INC;
|
|
if (f >= FRACT_MAX) {
|
|
f -= FRACT_MAX;
|
|
bc0: 26 e8 ldi r18, 0x86 ; 134
|
|
bc2: 23 0f add r18, r19
|
|
m += 1;
|
|
bc4: 02 96 adiw r24, 0x02 ; 2
|
|
bc6: a1 1d adc r26, r1
|
|
bc8: b1 1d adc r27, r1
|
|
}
|
|
|
|
timer0_fract = f;
|
|
bca: 20 93 4a 01 sts 0x014A, r18 ; 0x80014a <timer0_fract>
|
|
timer0_millis = m;
|
|
bce: 80 93 4b 01 sts 0x014B, r24 ; 0x80014b <timer0_millis>
|
|
bd2: 90 93 4c 01 sts 0x014C, r25 ; 0x80014c <timer0_millis+0x1>
|
|
bd6: a0 93 4d 01 sts 0x014D, r26 ; 0x80014d <timer0_millis+0x2>
|
|
bda: b0 93 4e 01 sts 0x014E, r27 ; 0x80014e <timer0_millis+0x3>
|
|
timer0_overflow_count++;
|
|
bde: 80 91 4f 01 lds r24, 0x014F ; 0x80014f <timer0_overflow_count>
|
|
be2: 90 91 50 01 lds r25, 0x0150 ; 0x800150 <timer0_overflow_count+0x1>
|
|
be6: a0 91 51 01 lds r26, 0x0151 ; 0x800151 <timer0_overflow_count+0x2>
|
|
bea: b0 91 52 01 lds r27, 0x0152 ; 0x800152 <timer0_overflow_count+0x3>
|
|
bee: 01 96 adiw r24, 0x01 ; 1
|
|
bf0: a1 1d adc r26, r1
|
|
bf2: b1 1d adc r27, r1
|
|
bf4: 80 93 4f 01 sts 0x014F, r24 ; 0x80014f <timer0_overflow_count>
|
|
bf8: 90 93 50 01 sts 0x0150, r25 ; 0x800150 <timer0_overflow_count+0x1>
|
|
bfc: a0 93 51 01 sts 0x0151, r26 ; 0x800151 <timer0_overflow_count+0x2>
|
|
c00: b0 93 52 01 sts 0x0152, r27 ; 0x800152 <timer0_overflow_count+0x3>
|
|
}
|
|
c04: bf 91 pop r27
|
|
c06: af 91 pop r26
|
|
c08: 9f 91 pop r25
|
|
c0a: 8f 91 pop r24
|
|
c0c: 3f 91 pop r19
|
|
c0e: 2f 91 pop r18
|
|
c10: 0f 90 pop r0
|
|
c12: 0f be out 0x3f, r0 ; 63
|
|
c14: 0f 90 pop r0
|
|
c16: 1f 90 pop r1
|
|
c18: 18 95 reti
|
|
|
|
00000c1a <__vector_19>:
|
|
#elif defined(USART_UDRE_vect)
|
|
ISR(USART_UDRE_vect)
|
|
#else
|
|
#error "Don't know what the Data Register Empty vector is called for Serial"
|
|
#endif
|
|
{
|
|
c1a: 1f 92 push r1
|
|
c1c: 0f 92 push r0
|
|
c1e: 0f b6 in r0, 0x3f ; 63
|
|
c20: 0f 92 push r0
|
|
c22: 11 24 eor r1, r1
|
|
c24: 2f 93 push r18
|
|
c26: 3f 93 push r19
|
|
c28: 4f 93 push r20
|
|
c2a: 5f 93 push r21
|
|
c2c: 6f 93 push r22
|
|
c2e: 7f 93 push r23
|
|
c30: 8f 93 push r24
|
|
c32: 9f 93 push r25
|
|
c34: af 93 push r26
|
|
c36: bf 93 push r27
|
|
c38: ef 93 push r30
|
|
c3a: ff 93 push r31
|
|
Serial._tx_udr_empty_irq();
|
|
c3c: 83 e5 ldi r24, 0x53 ; 83
|
|
c3e: 91 e0 ldi r25, 0x01 ; 1
|
|
c40: 0e 94 ab 03 call 0x756 ; 0x756 <_ZN14HardwareSerial17_tx_udr_empty_irqEv>
|
|
}
|
|
c44: ff 91 pop r31
|
|
c46: ef 91 pop r30
|
|
c48: bf 91 pop r27
|
|
c4a: af 91 pop r26
|
|
c4c: 9f 91 pop r25
|
|
c4e: 8f 91 pop r24
|
|
c50: 7f 91 pop r23
|
|
c52: 6f 91 pop r22
|
|
c54: 5f 91 pop r21
|
|
c56: 4f 91 pop r20
|
|
c58: 3f 91 pop r19
|
|
c5a: 2f 91 pop r18
|
|
c5c: 0f 90 pop r0
|
|
c5e: 0f be out 0x3f, r0 ; 63
|
|
c60: 0f 90 pop r0
|
|
c62: 1f 90 pop r1
|
|
c64: 18 95 reti
|
|
|
|
00000c66 <__vector_18>:
|
|
#elif defined(USART_RXC_vect)
|
|
ISR(USART_RXC_vect) // ATmega8
|
|
#else
|
|
#error "Don't know what the Data Received vector is called for Serial"
|
|
#endif
|
|
{
|
|
c66: 1f 92 push r1
|
|
c68: 0f 92 push r0
|
|
c6a: 0f b6 in r0, 0x3f ; 63
|
|
c6c: 0f 92 push r0
|
|
c6e: 11 24 eor r1, r1
|
|
c70: 2f 93 push r18
|
|
c72: 8f 93 push r24
|
|
c74: 9f 93 push r25
|
|
c76: ef 93 push r30
|
|
c78: ff 93 push r31
|
|
|
|
// Actual interrupt handlers //////////////////////////////////////////////////////////////
|
|
|
|
void HardwareSerial::_rx_complete_irq(void)
|
|
{
|
|
if (bit_is_clear(*_ucsra, UPE0)) {
|
|
c7a: e0 91 63 01 lds r30, 0x0163 ; 0x800163 <Serial+0x10>
|
|
c7e: f0 91 64 01 lds r31, 0x0164 ; 0x800164 <Serial+0x11>
|
|
c82: 80 81 ld r24, Z
|
|
c84: e0 91 69 01 lds r30, 0x0169 ; 0x800169 <Serial+0x16>
|
|
c88: f0 91 6a 01 lds r31, 0x016A ; 0x80016a <Serial+0x17>
|
|
c8c: 82 fd sbrc r24, 2
|
|
c8e: 12 c0 rjmp .+36 ; 0xcb4 <__vector_18+0x4e>
|
|
// No Parity error, read byte and store it in the buffer if there is
|
|
// room
|
|
unsigned char c = *_udr;
|
|
c90: 90 81 ld r25, Z
|
|
rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
|
|
c92: 80 91 6c 01 lds r24, 0x016C ; 0x80016c <Serial+0x19>
|
|
c96: 8f 5f subi r24, 0xFF ; 255
|
|
c98: 8f 73 andi r24, 0x3F ; 63
|
|
|
|
// if we should be storing the received character into the location
|
|
// just before the tail (meaning that the head would advance to the
|
|
// current location of the tail), we're about to overflow the buffer
|
|
// and so we don't write the character or advance the head.
|
|
if (i != _rx_buffer_tail) {
|
|
c9a: 20 91 6d 01 lds r18, 0x016D ; 0x80016d <Serial+0x1a>
|
|
c9e: 82 17 cp r24, r18
|
|
ca0: 51 f0 breq .+20 ; 0xcb6 <__vector_18+0x50>
|
|
_rx_buffer[_rx_buffer_head] = c;
|
|
ca2: e0 91 6c 01 lds r30, 0x016C ; 0x80016c <Serial+0x19>
|
|
ca6: f0 e0 ldi r31, 0x00 ; 0
|
|
ca8: ed 5a subi r30, 0xAD ; 173
|
|
caa: fe 4f sbci r31, 0xFE ; 254
|
|
cac: 95 8f std Z+29, r25 ; 0x1d
|
|
_rx_buffer_head = i;
|
|
cae: 80 93 6c 01 sts 0x016C, r24 ; 0x80016c <Serial+0x19>
|
|
cb2: 01 c0 rjmp .+2 ; 0xcb6 <__vector_18+0x50>
|
|
}
|
|
} else {
|
|
// Parity error, read byte but discard it
|
|
*_udr;
|
|
cb4: 80 81 ld r24, Z
|
|
Serial._rx_complete_irq();
|
|
}
|
|
cb6: ff 91 pop r31
|
|
cb8: ef 91 pop r30
|
|
cba: 9f 91 pop r25
|
|
cbc: 8f 91 pop r24
|
|
cbe: 2f 91 pop r18
|
|
cc0: 0f 90 pop r0
|
|
cc2: 0f be out 0x3f, r0 ; 63
|
|
cc4: 0f 90 pop r0
|
|
cc6: 1f 90 pop r1
|
|
cc8: 18 95 reti
|
|
|
|
00000cca <_GLOBAL__I_65535_0_BasicPHSensor.ino.cpp.o.2007>:
|
|
cca: cf 93 push r28
|
|
ccc: df 93 push r29
|
|
size_t printNumber(unsigned long, uint8_t);
|
|
size_t printFloat(double, uint8_t);
|
|
protected:
|
|
void setWriteError(int err = 1) { write_error = err; }
|
|
public:
|
|
Print() : write_error(0) {}
|
|
cce: e3 e5 ldi r30, 0x53 ; 83
|
|
cd0: f1 e0 ldi r31, 0x01 ; 1
|
|
cd2: 13 82 std Z+3, r1 ; 0x03
|
|
cd4: 12 82 std Z+2, r1 ; 0x02
|
|
public:
|
|
virtual int available() = 0;
|
|
virtual int read() = 0;
|
|
virtual int peek() = 0;
|
|
|
|
Stream() {_timeout=1000;}
|
|
cd6: 88 ee ldi r24, 0xE8 ; 232
|
|
cd8: 93 e0 ldi r25, 0x03 ; 3
|
|
cda: a0 e0 ldi r26, 0x00 ; 0
|
|
cdc: b0 e0 ldi r27, 0x00 ; 0
|
|
cde: 84 83 std Z+4, r24 ; 0x04
|
|
ce0: 95 83 std Z+5, r25 ; 0x05
|
|
ce2: a6 83 std Z+6, r26 ; 0x06
|
|
ce4: b7 83 std Z+7, r27 ; 0x07
|
|
volatile uint8_t *ucsrc, volatile uint8_t *udr) :
|
|
_ubrrh(ubrrh), _ubrrl(ubrrl),
|
|
_ucsra(ucsra), _ucsrb(ucsrb), _ucsrc(ucsrc),
|
|
_udr(udr),
|
|
_rx_buffer_head(0), _rx_buffer_tail(0),
|
|
_tx_buffer_head(0), _tx_buffer_tail(0)
|
|
ce6: 84 e0 ldi r24, 0x04 ; 4
|
|
ce8: 91 e0 ldi r25, 0x01 ; 1
|
|
cea: 91 83 std Z+1, r25 ; 0x01
|
|
cec: 80 83 st Z, r24
|
|
cee: 85 ec ldi r24, 0xC5 ; 197
|
|
cf0: 90 e0 ldi r25, 0x00 ; 0
|
|
cf2: 95 87 std Z+13, r25 ; 0x0d
|
|
cf4: 84 87 std Z+12, r24 ; 0x0c
|
|
cf6: 84 ec ldi r24, 0xC4 ; 196
|
|
cf8: 90 e0 ldi r25, 0x00 ; 0
|
|
cfa: 97 87 std Z+15, r25 ; 0x0f
|
|
cfc: 86 87 std Z+14, r24 ; 0x0e
|
|
cfe: 80 ec ldi r24, 0xC0 ; 192
|
|
d00: 90 e0 ldi r25, 0x00 ; 0
|
|
d02: 91 8b std Z+17, r25 ; 0x11
|
|
d04: 80 8b std Z+16, r24 ; 0x10
|
|
d06: 81 ec ldi r24, 0xC1 ; 193
|
|
d08: 90 e0 ldi r25, 0x00 ; 0
|
|
d0a: 93 8b std Z+19, r25 ; 0x13
|
|
d0c: 82 8b std Z+18, r24 ; 0x12
|
|
d0e: 82 ec ldi r24, 0xC2 ; 194
|
|
d10: 90 e0 ldi r25, 0x00 ; 0
|
|
d12: 95 8b std Z+21, r25 ; 0x15
|
|
d14: 84 8b std Z+20, r24 ; 0x14
|
|
d16: 86 ec ldi r24, 0xC6 ; 198
|
|
d18: 90 e0 ldi r25, 0x00 ; 0
|
|
d1a: 97 8b std Z+23, r25 ; 0x17
|
|
d1c: 86 8b std Z+22, r24 ; 0x16
|
|
d1e: 11 8e std Z+25, r1 ; 0x19
|
|
d20: 12 8e std Z+26, r1 ; 0x1a
|
|
d22: 13 8e std Z+27, r1 ; 0x1b
|
|
d24: 14 8e std Z+28, r1 ; 0x1c
|
|
d26: c0 ef ldi r28, 0xF0 ; 240
|
|
d28: d1 e0 ldi r29, 0x01 ; 1
|
|
d2a: 1b 82 std Y+3, r1 ; 0x03
|
|
d2c: 1a 82 std Y+2, r1 ; 0x02
|
|
#include "Nokia_5110.h"
|
|
#include "Font.h"
|
|
|
|
Nokia_5110::Nokia_5110(){}
|
|
|
|
Nokia_5110::Nokia_5110(unsigned short RST, unsigned short CE, unsigned short DC, unsigned short DIN, unsigned short CLK){
|
|
d2e: 86 e1 ldi r24, 0x16 ; 22
|
|
d30: 91 e0 ldi r25, 0x01 ; 1
|
|
d32: 99 83 std Y+1, r25 ; 0x01
|
|
d34: 88 83 st Y, r24
|
|
struct Position {
|
|
position y;
|
|
position x;
|
|
};
|
|
|
|
class Cursor {
|
|
d36: 1f 86 std Y+15, r1 ; 0x0f
|
|
d38: 1e 86 std Y+14, r1 ; 0x0e
|
|
d3a: 19 8a std Y+17, r1 ; 0x11
|
|
d3c: 18 8a std Y+16, r1 ; 0x10
|
|
_RST = RST;
|
|
d3e: 83 e0 ldi r24, 0x03 ; 3
|
|
d40: 90 e0 ldi r25, 0x00 ; 0
|
|
d42: 9d 83 std Y+5, r25 ; 0x05
|
|
d44: 8c 83 std Y+4, r24 ; 0x04
|
|
_CE = CE;
|
|
d46: 84 e0 ldi r24, 0x04 ; 4
|
|
d48: 90 e0 ldi r25, 0x00 ; 0
|
|
d4a: 9f 83 std Y+7, r25 ; 0x07
|
|
d4c: 8e 83 std Y+6, r24 ; 0x06
|
|
_DC = DC;
|
|
d4e: 85 e0 ldi r24, 0x05 ; 5
|
|
d50: 90 e0 ldi r25, 0x00 ; 0
|
|
d52: 99 87 std Y+9, r25 ; 0x09
|
|
d54: 88 87 std Y+8, r24 ; 0x08
|
|
_DIN = DIN;
|
|
d56: 86 e0 ldi r24, 0x06 ; 6
|
|
d58: 90 e0 ldi r25, 0x00 ; 0
|
|
d5a: 9b 87 std Y+11, r25 ; 0x0b
|
|
d5c: 8a 87 std Y+10, r24 ; 0x0a
|
|
_CLK = CLK;
|
|
d5e: 87 e0 ldi r24, 0x07 ; 7
|
|
d60: 90 e0 ldi r25, 0x00 ; 0
|
|
d62: 9d 87 std Y+13, r25 ; 0x0d
|
|
d64: 8c 87 std Y+12, r24 ; 0x0c
|
|
|
|
pinMode(RST, OUTPUT);
|
|
d66: 83 e0 ldi r24, 0x03 ; 3
|
|
d68: 0e 94 62 02 call 0x4c4 ; 0x4c4 <pinMode.constprop.29>
|
|
pinMode(CE, OUTPUT);
|
|
d6c: 84 e0 ldi r24, 0x04 ; 4
|
|
d6e: 0e 94 62 02 call 0x4c4 ; 0x4c4 <pinMode.constprop.29>
|
|
pinMode(DC, OUTPUT);
|
|
d72: 85 e0 ldi r24, 0x05 ; 5
|
|
d74: 0e 94 62 02 call 0x4c4 ; 0x4c4 <pinMode.constprop.29>
|
|
pinMode(DIN, OUTPUT);
|
|
d78: 86 e0 ldi r24, 0x06 ; 6
|
|
d7a: 0e 94 62 02 call 0x4c4 ; 0x4c4 <pinMode.constprop.29>
|
|
pinMode(CLK, OUTPUT);
|
|
d7e: 87 e0 ldi r24, 0x07 ; 7
|
|
d80: 0e 94 62 02 call 0x4c4 ; 0x4c4 <pinMode.constprop.29>
|
|
|
|
_cursor = Cursor();
|
|
d84: 1f 86 std Y+15, r1 ; 0x0f
|
|
d86: 1e 86 std Y+14, r1 ; 0x0e
|
|
d88: 19 8a std Y+17, r1 ; 0x11
|
|
d8a: 18 8a std Y+16, r1 ; 0x10
|
|
const unsigned short leastValue = 4;
|
|
execute(byte(leastValue + value));
|
|
}
|
|
|
|
void Nokia_5110::reset(){
|
|
digitalWrite(_RST, LOW);
|
|
d8c: 60 e0 ldi r22, 0x00 ; 0
|
|
d8e: 8c 81 ldd r24, Y+4 ; 0x04
|
|
d90: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
digitalWrite(_RST, HIGH);
|
|
d94: 61 e0 ldi r22, 0x01 ; 1
|
|
d96: 8c 81 ldd r24, Y+4 ; 0x04
|
|
d98: 0e 94 8e 02 call 0x51c ; 0x51c <digitalWrite>
|
|
|
|
_cursor = Cursor();
|
|
|
|
reset();
|
|
|
|
clear();
|
|
d9c: 0e 94 fe 04 call 0x9fc ; 0x9fc <_ZN10Nokia_51105clearEv.constprop.31>
|
|
void Nokia_5110::extendedInstruction(){
|
|
execute(0x21);
|
|
}
|
|
|
|
void Nokia_5110::basicInstruction(){
|
|
execute(0x20);
|
|
da0: 60 e2 ldi r22, 0x20 ; 32
|
|
da2: ce 01 movw r24, r28
|
|
da4: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
}
|
|
|
|
|
|
void Nokia_5110::setDisplayMode(display_mode value){
|
|
basicInstruction();
|
|
execute(value);
|
|
da8: 6c e0 ldi r22, 0x0C ; 12
|
|
daa: ce 01 movw r24, r28
|
|
dac: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
const unsigned short leastValue = 128;
|
|
execute(byte(leastValue + value));
|
|
}
|
|
|
|
void Nokia_5110::extendedInstruction(){
|
|
execute(0x21);
|
|
db0: 61 e2 ldi r22, 0x21 ; 33
|
|
db2: ce 01 movw r24, r28
|
|
db4: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
}
|
|
|
|
|
|
void Nokia_5110::setBiasSystem(mux_rate rate){
|
|
extendedInstruction();
|
|
execute(rate);
|
|
db8: 64 e1 ldi r22, 0x14 ; 20
|
|
dba: ce 01 movw r24, r28
|
|
dbc: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
const unsigned short leastValue = 128;
|
|
execute(byte(leastValue + value));
|
|
}
|
|
|
|
void Nokia_5110::extendedInstruction(){
|
|
execute(0x21);
|
|
dc0: 61 e2 ldi r22, 0x21 ; 33
|
|
dc2: ce 01 movw r24, r28
|
|
dc4: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
return;
|
|
|
|
extendedInstruction();
|
|
|
|
const unsigned short leastValue = 128;
|
|
execute(byte(leastValue + value));
|
|
dc8: 6c eb ldi r22, 0xBC ; 188
|
|
dca: ce 01 movw r24, r28
|
|
dcc: df 91 pop r29
|
|
dce: cf 91 pop r28
|
|
dd0: 0c 94 d2 04 jmp 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
|
|
00000dd4 <main>:
|
|
|
|
void init()
|
|
{
|
|
// this needs to be called before setup() or some functions won't
|
|
// work there
|
|
sei();
|
|
dd4: 78 94 sei
|
|
|
|
// on the ATmega168, timer 0 is also used for fast hardware pwm
|
|
// (using phase-correct PWM would mean that timer 0 overflowed half as often
|
|
// resulting in different millis() behavior on the ATmega8 and ATmega168)
|
|
#if defined(TCCR0A) && defined(WGM01)
|
|
sbi(TCCR0A, WGM01);
|
|
dd6: 84 b5 in r24, 0x24 ; 36
|
|
dd8: 82 60 ori r24, 0x02 ; 2
|
|
dda: 84 bd out 0x24, r24 ; 36
|
|
sbi(TCCR0A, WGM00);
|
|
ddc: 84 b5 in r24, 0x24 ; 36
|
|
dde: 81 60 ori r24, 0x01 ; 1
|
|
de0: 84 bd out 0x24, r24 ; 36
|
|
// this combination is for the standard atmega8
|
|
sbi(TCCR0, CS01);
|
|
sbi(TCCR0, CS00);
|
|
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
|
|
// this combination is for the standard 168/328/1280/2560
|
|
sbi(TCCR0B, CS01);
|
|
de2: 85 b5 in r24, 0x25 ; 37
|
|
de4: 82 60 ori r24, 0x02 ; 2
|
|
de6: 85 bd out 0x25, r24 ; 37
|
|
sbi(TCCR0B, CS00);
|
|
de8: 85 b5 in r24, 0x25 ; 37
|
|
dea: 81 60 ori r24, 0x01 ; 1
|
|
dec: 85 bd out 0x25, r24 ; 37
|
|
|
|
// enable timer 0 overflow interrupt
|
|
#if defined(TIMSK) && defined(TOIE0)
|
|
sbi(TIMSK, TOIE0);
|
|
#elif defined(TIMSK0) && defined(TOIE0)
|
|
sbi(TIMSK0, TOIE0);
|
|
dee: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7e006e>
|
|
df2: 81 60 ori r24, 0x01 ; 1
|
|
df4: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__TEXT_REGION_LENGTH__+0x7e006e>
|
|
// this is better for motors as it ensures an even waveform
|
|
// note, however, that fast pwm mode can achieve a frequency of up
|
|
// 8 MHz (with a 16 MHz clock) at 50% duty cycle
|
|
|
|
#if defined(TCCR1B) && defined(CS11) && defined(CS10)
|
|
TCCR1B = 0;
|
|
df8: 10 92 81 00 sts 0x0081, r1 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
|
|
|
|
// set timer 1 prescale factor to 64
|
|
sbi(TCCR1B, CS11);
|
|
dfc: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
|
|
e00: 82 60 ori r24, 0x02 ; 2
|
|
e02: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
|
|
#if F_CPU >= 8000000L
|
|
sbi(TCCR1B, CS10);
|
|
e06: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
|
|
e0a: 81 60 ori r24, 0x01 ; 1
|
|
e0c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
|
|
sbi(TCCR1, CS10);
|
|
#endif
|
|
#endif
|
|
// put timer 1 in 8-bit phase correct pwm mode
|
|
#if defined(TCCR1A) && defined(WGM10)
|
|
sbi(TCCR1A, WGM10);
|
|
e10: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
|
|
e14: 81 60 ori r24, 0x01 ; 1
|
|
e16: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
|
|
|
|
// set timer 2 prescale factor to 64
|
|
#if defined(TCCR2) && defined(CS22)
|
|
sbi(TCCR2, CS22);
|
|
#elif defined(TCCR2B) && defined(CS22)
|
|
sbi(TCCR2B, CS22);
|
|
e1a: 80 91 b1 00 lds r24, 0x00B1 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7e00b1>
|
|
e1e: 84 60 ori r24, 0x04 ; 4
|
|
e20: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7e00b1>
|
|
|
|
// configure timer 2 for phase correct pwm (8-bit)
|
|
#if defined(TCCR2) && defined(WGM20)
|
|
sbi(TCCR2, WGM20);
|
|
#elif defined(TCCR2A) && defined(WGM20)
|
|
sbi(TCCR2A, WGM20);
|
|
e24: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
|
|
e28: 81 60 ori r24, 0x01 ; 1
|
|
e2a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
|
|
#endif
|
|
|
|
#if defined(ADCSRA)
|
|
// set a2d prescaler so we are inside the desired 50-200 KHz range.
|
|
#if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
|
|
sbi(ADCSRA, ADPS2);
|
|
e2e: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
e32: 84 60 ori r24, 0x04 ; 4
|
|
e34: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
sbi(ADCSRA, ADPS1);
|
|
e38: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
e3c: 82 60 ori r24, 0x02 ; 2
|
|
e3e: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
sbi(ADCSRA, ADPS0);
|
|
e42: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
e46: 81 60 ori r24, 0x01 ; 1
|
|
e48: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
cbi(ADCSRA, ADPS2);
|
|
cbi(ADCSRA, ADPS1);
|
|
sbi(ADCSRA, ADPS0);
|
|
#endif
|
|
// enable a2d conversions
|
|
sbi(ADCSRA, ADEN);
|
|
e4c: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
e50: 80 68 ori r24, 0x80 ; 128
|
|
e52: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
// here so they can be used as normal digital i/o; they will be
|
|
// reconnected in Serial.begin()
|
|
#if defined(UCSRB)
|
|
UCSRB = 0;
|
|
#elif defined(UCSR0B)
|
|
UCSR0B = 0;
|
|
e56: 10 92 c1 00 sts 0x00C1, r1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
|
|
|
|
void HardwareSerial::begin(unsigned long baud, byte config)
|
|
{
|
|
// Try u2x mode first
|
|
uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
|
|
*_ucsra = 1 << U2X0;
|
|
e5a: e0 91 63 01 lds r30, 0x0163 ; 0x800163 <Serial+0x10>
|
|
e5e: f0 91 64 01 lds r31, 0x0164 ; 0x800164 <Serial+0x11>
|
|
e62: 82 e0 ldi r24, 0x02 ; 2
|
|
e64: 80 83 st Z, r24
|
|
*_ucsra = 0;
|
|
baud_setting = (F_CPU / 8 / baud - 1) / 2;
|
|
}
|
|
|
|
// assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
|
|
*_ubrrh = baud_setting >> 8;
|
|
e66: e0 91 5f 01 lds r30, 0x015F ; 0x80015f <Serial+0xc>
|
|
e6a: f0 91 60 01 lds r31, 0x0160 ; 0x800160 <Serial+0xd>
|
|
e6e: 10 82 st Z, r1
|
|
*_ubrrl = baud_setting;
|
|
e70: e0 91 61 01 lds r30, 0x0161 ; 0x800161 <Serial+0xe>
|
|
e74: f0 91 62 01 lds r31, 0x0162 ; 0x800162 <Serial+0xf>
|
|
e78: 8f ec ldi r24, 0xCF ; 207
|
|
e7a: 80 83 st Z, r24
|
|
|
|
_written = false;
|
|
e7c: 10 92 6b 01 sts 0x016B, r1 ; 0x80016b <Serial+0x18>
|
|
|
|
//set the data bits, parity, and stop bits
|
|
#if defined(__AVR_ATmega8__)
|
|
config |= 0x80; // select UCSRC register (shared with UBRRH)
|
|
#endif
|
|
*_ucsrc = config;
|
|
e80: e0 91 67 01 lds r30, 0x0167 ; 0x800167 <Serial+0x14>
|
|
e84: f0 91 68 01 lds r31, 0x0168 ; 0x800168 <Serial+0x15>
|
|
e88: 86 e0 ldi r24, 0x06 ; 6
|
|
e8a: 80 83 st Z, r24
|
|
|
|
sbi(*_ucsrb, RXEN0);
|
|
e8c: e0 91 65 01 lds r30, 0x0165 ; 0x800165 <Serial+0x12>
|
|
e90: f0 91 66 01 lds r31, 0x0166 ; 0x800166 <Serial+0x13>
|
|
e94: 80 81 ld r24, Z
|
|
e96: 80 61 ori r24, 0x10 ; 16
|
|
e98: 80 83 st Z, r24
|
|
sbi(*_ucsrb, TXEN0);
|
|
e9a: e0 91 65 01 lds r30, 0x0165 ; 0x800165 <Serial+0x12>
|
|
e9e: f0 91 66 01 lds r31, 0x0166 ; 0x800166 <Serial+0x13>
|
|
ea2: 80 81 ld r24, Z
|
|
ea4: 88 60 ori r24, 0x08 ; 8
|
|
ea6: 80 83 st Z, r24
|
|
sbi(*_ucsrb, RXCIE0);
|
|
ea8: e0 91 65 01 lds r30, 0x0165 ; 0x800165 <Serial+0x12>
|
|
eac: f0 91 66 01 lds r31, 0x0166 ; 0x800166 <Serial+0x13>
|
|
eb0: 80 81 ld r24, Z
|
|
eb2: 80 68 ori r24, 0x80 ; 128
|
|
eb4: 80 83 st Z, r24
|
|
cbi(*_ucsrb, UDRIE0);
|
|
eb6: e0 91 65 01 lds r30, 0x0165 ; 0x800165 <Serial+0x12>
|
|
eba: f0 91 66 01 lds r31, 0x0166 ; 0x800166 <Serial+0x13>
|
|
ebe: 80 81 ld r24, Z
|
|
ec0: 8f 7d andi r24, 0xDF ; 223
|
|
ec2: 80 83 st Z, r24
|
|
}
|
|
|
|
void Nokia_5110::extendedInstruction(){
|
|
execute(0x21);
|
|
ec4: 61 e2 ldi r22, 0x21 ; 33
|
|
ec6: 80 ef ldi r24, 0xF0 ; 240
|
|
ec8: 91 e0 ldi r25, 0x01 ; 1
|
|
eca: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
return;
|
|
|
|
extendedInstruction();
|
|
|
|
const unsigned short leastValue = 128;
|
|
execute(byte(leastValue + value));
|
|
ece: 6c e9 ldi r22, 0x9C ; 156
|
|
ed0: 80 ef ldi r24, 0xF0 ; 240
|
|
ed2: 91 e0 ldi r25, 0x01 ; 1
|
|
ed4: 0e 94 d2 04 call 0x9a4 ; 0x9a4 <_ZN10Nokia_51107executeEh>
|
|
* Note: if instead of text being shown on the display, all the segments are on, you may need to decrease contrast value.
|
|
*/
|
|
lcd.setContrast(28); // 60 is the default value set by the driver
|
|
|
|
//lcd.print("Please Wait ...");
|
|
lcd.setCursor(15,1);
|
|
ed8: 41 e0 ldi r20, 0x01 ; 1
|
|
eda: 50 e0 ldi r21, 0x00 ; 0
|
|
edc: 6f e0 ldi r22, 0x0F ; 15
|
|
ede: 70 e0 ldi r23, 0x00 ; 0
|
|
ee0: 80 ef ldi r24, 0xF0 ; 240
|
|
ee2: 91 e0 ldi r25, 0x01 ; 1
|
|
ee4: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
return write(s.c_str(), s.length());
|
|
}
|
|
|
|
size_t Print::print(const char str[])
|
|
{
|
|
return write(str);
|
|
ee8: 8e e1 ldi r24, 0x1E ; 30
|
|
eea: 91 e0 ldi r25, 0x01 ; 1
|
|
eec: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
lcd.print("Starting...");
|
|
delay(800);
|
|
ef0: 60 e2 ldi r22, 0x20 ; 32
|
|
ef2: 73 e0 ldi r23, 0x03 ; 3
|
|
ef4: 80 e0 ldi r24, 0x00 ; 0
|
|
ef6: 90 e0 ldi r25, 0x00 ; 0
|
|
ef8: 0e 94 00 03 call 0x600 ; 0x600 <delay>
|
|
lcd.clear();
|
|
efc: 0e 94 fe 04 call 0x9fc ; 0x9fc <_ZN10Nokia_51105clearEv.constprop.31>
|
|
// to 0 (the default).
|
|
#if defined(ADMUX)
|
|
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
|
|
ADMUX = (analog_reference << 4) | (pin & 0x07);
|
|
#else
|
|
ADMUX = (analog_reference << 6) | (pin & 0x07);
|
|
f00: c3 e4 ldi r28, 0x43 ; 67
|
|
//lcd.setCursor(0, 5);
|
|
//lcd.println("1 2 3 ...");
|
|
}
|
|
|
|
void loop() {
|
|
lcd.clear();
|
|
f02: 0e 94 fe 04 call 0x9fc ; 0x9fc <_ZN10Nokia_51105clearEv.constprop.31>
|
|
f06: c0 93 7c 00 sts 0x007C, r28 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7e007c>
|
|
// without a delay, we seem to read from the wrong channel
|
|
//delay(1);
|
|
|
|
#if defined(ADCSRA) && defined(ADCL)
|
|
// start the conversion
|
|
sbi(ADCSRA, ADSC);
|
|
f0a: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
f0e: 80 64 ori r24, 0x40 ; 64
|
|
f10: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
|
|
// ADSC is cleared when the conversion finishes
|
|
while (bit_is_set(ADCSRA, ADSC));
|
|
f14: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
|
|
f18: 86 fd sbrc r24, 6
|
|
f1a: fc cf rjmp .-8 ; 0xf14 <main+0x140>
|
|
|
|
// we have to read ADCL first; doing so locks both ADCL
|
|
// and ADCH until ADCH is read. reading ADCL second would
|
|
// cause the results of each conversion to be discarded,
|
|
// as ADCL and ADCH would be locked when it completed.
|
|
low = ADCL;
|
|
f1c: 60 91 78 00 lds r22, 0x0078 ; 0x800078 <__TEXT_REGION_LENGTH__+0x7e0078>
|
|
high = ADCH;
|
|
f20: 80 91 79 00 lds r24, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7e0079>
|
|
phVal_u16 = analogRead(PHSENSOR);
|
|
f24: 70 e0 ldi r23, 0x00 ; 0
|
|
f26: 78 2b or r23, r24
|
|
f28: 70 93 49 01 sts 0x0149, r23 ; 0x800149 <phVal_u16+0x1>
|
|
f2c: 60 93 48 01 sts 0x0148, r22 ; 0x800148 <phVal_u16>
|
|
phFloat = phVal_u16 * 0.013672;
|
|
f30: 80 e0 ldi r24, 0x00 ; 0
|
|
f32: 90 e0 ldi r25, 0x00 ; 0
|
|
f34: 0e 94 3c 09 call 0x1278 ; 0x1278 <__floatunsisf>
|
|
f38: 26 e8 ldi r18, 0x86 ; 134
|
|
f3a: 30 e0 ldi r19, 0x00 ; 0
|
|
f3c: 40 e6 ldi r20, 0x60 ; 96
|
|
f3e: 5c e3 ldi r21, 0x3C ; 60
|
|
f40: 0e 94 f3 09 call 0x13e6 ; 0x13e6 <__mulsf3>
|
|
f44: 60 93 44 01 sts 0x0144, r22 ; 0x800144 <__data_end>
|
|
f48: 70 93 45 01 sts 0x0145, r23 ; 0x800145 <__data_end+0x1>
|
|
f4c: 80 93 46 01 sts 0x0146, r24 ; 0x800146 <__data_end+0x2>
|
|
f50: 90 93 47 01 sts 0x0147, r25 ; 0x800147 <__data_end+0x3>
|
|
lcd.setCursor(15,1);
|
|
f54: 41 e0 ldi r20, 0x01 ; 1
|
|
f56: 50 e0 ldi r21, 0x00 ; 0
|
|
f58: 6f e0 ldi r22, 0x0F ; 15
|
|
f5a: 70 e0 ldi r23, 0x00 ; 0
|
|
f5c: 80 ef ldi r24, 0xF0 ; 240
|
|
f5e: 91 e0 ldi r25, 0x01 ; 1
|
|
f60: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
f64: 8a e2 ldi r24, 0x2A ; 42
|
|
f66: 91 e0 ldi r25, 0x01 ; 1
|
|
f68: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
return x.printTo(*this);
|
|
}
|
|
|
|
size_t Print::println(void)
|
|
{
|
|
return write("\r\n");
|
|
f6c: 8f e2 ldi r24, 0x2F ; 47
|
|
f6e: 91 e0 ldi r25, 0x01 ; 1
|
|
f70: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
lcd.println("Raw:");
|
|
lcd.setCursor(45,2);
|
|
f74: 42 e0 ldi r20, 0x02 ; 2
|
|
f76: 50 e0 ldi r21, 0x00 ; 0
|
|
f78: 6d e2 ldi r22, 0x2D ; 45
|
|
f7a: 70 e0 ldi r23, 0x00 ; 0
|
|
f7c: 80 ef ldi r24, 0xF0 ; 240
|
|
f7e: 91 e0 ldi r25, 0x01 ; 1
|
|
f80: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
}
|
|
|
|
size_t Print::print(unsigned long n, int base)
|
|
{
|
|
if (base == 0) return write(n);
|
|
else return printNumber(n, base);
|
|
f84: 60 91 48 01 lds r22, 0x0148 ; 0x800148 <phVal_u16>
|
|
f88: 70 91 49 01 lds r23, 0x0149 ; 0x800149 <phVal_u16+0x1>
|
|
f8c: 80 e0 ldi r24, 0x00 ; 0
|
|
f8e: 90 e0 ldi r25, 0x00 ; 0
|
|
f90: 4a e0 ldi r20, 0x0A ; 10
|
|
f92: 0e 94 5c 04 call 0x8b8 ; 0x8b8 <_ZN5Print11printNumberEmh.constprop.20>
|
|
lcd.print(phVal_u16);
|
|
lcd.setCursor(15,3);
|
|
f96: 43 e0 ldi r20, 0x03 ; 3
|
|
f98: 50 e0 ldi r21, 0x00 ; 0
|
|
f9a: 6f e0 ldi r22, 0x0F ; 15
|
|
f9c: 70 e0 ldi r23, 0x00 ; 0
|
|
f9e: 80 ef ldi r24, 0xF0 ; 240
|
|
fa0: 91 e0 ldi r25, 0x01 ; 1
|
|
fa2: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
return write(s.c_str(), s.length());
|
|
}
|
|
|
|
size_t Print::print(const char str[])
|
|
{
|
|
return write(str);
|
|
fa6: 82 e3 ldi r24, 0x32 ; 50
|
|
fa8: 91 e0 ldi r25, 0x01 ; 1
|
|
faa: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
return x.printTo(*this);
|
|
}
|
|
|
|
size_t Print::println(void)
|
|
{
|
|
return write("\r\n");
|
|
fae: 8f e2 ldi r24, 0x2F ; 47
|
|
fb0: 91 e0 ldi r25, 0x01 ; 1
|
|
fb2: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
lcd.println("PH #:");
|
|
lcd.setCursor(45,4);
|
|
fb6: 44 e0 ldi r20, 0x04 ; 4
|
|
fb8: 50 e0 ldi r21, 0x00 ; 0
|
|
fba: 6d e2 ldi r22, 0x2D ; 45
|
|
fbc: 70 e0 ldi r23, 0x00 ; 0
|
|
fbe: 80 ef ldi r24, 0xF0 ; 240
|
|
fc0: 91 e0 ldi r25, 0x01 ; 1
|
|
fc2: 0e 94 e2 04 call 0x9c4 ; 0x9c4 <_ZN10Nokia_51109setCursorEtt>
|
|
lcd.print(phFloat);
|
|
fc6: c0 90 44 01 lds r12, 0x0144 ; 0x800144 <__data_end>
|
|
fca: d0 90 45 01 lds r13, 0x0145 ; 0x800145 <__data_end+0x1>
|
|
fce: e0 90 46 01 lds r14, 0x0146 ; 0x800146 <__data_end+0x2>
|
|
fd2: f0 90 47 01 lds r15, 0x0147 ; 0x800147 <__data_end+0x3>
|
|
|
|
size_t Print::printFloat(double number, uint8_t digits)
|
|
{
|
|
size_t n = 0;
|
|
|
|
if (isnan(number)) return print("nan");
|
|
fd6: a7 01 movw r20, r14
|
|
fd8: 96 01 movw r18, r12
|
|
fda: c7 01 movw r24, r14
|
|
fdc: b6 01 movw r22, r12
|
|
fde: 0e 94 60 0a call 0x14c0 ; 0x14c0 <__unordsf2>
|
|
fe2: 88 23 and r24, r24
|
|
fe4: 19 f0 breq .+6 ; 0xfec <main+0x218>
|
|
return write(s.c_str(), s.length());
|
|
}
|
|
|
|
size_t Print::print(const char str[])
|
|
{
|
|
return write(str);
|
|
fe6: 88 e3 ldi r24, 0x38 ; 56
|
|
fe8: 91 e0 ldi r25, 0x01 ; 1
|
|
fea: 1a c0 rjmp .+52 ; 0x1020 <main+0x24c>
|
|
size_t Print::printFloat(double number, uint8_t digits)
|
|
{
|
|
size_t n = 0;
|
|
|
|
if (isnan(number)) return print("nan");
|
|
if (isinf(number)) return print("inf");
|
|
fec: 46 01 movw r8, r12
|
|
fee: 57 01 movw r10, r14
|
|
ff0: e8 94 clt
|
|
ff2: b7 f8 bld r11, 7
|
|
ff4: 2f ef ldi r18, 0xFF ; 255
|
|
ff6: 3f ef ldi r19, 0xFF ; 255
|
|
ff8: 4f e7 ldi r20, 0x7F ; 127
|
|
ffa: 5f e7 ldi r21, 0x7F ; 127
|
|
ffc: c5 01 movw r24, r10
|
|
ffe: b4 01 movw r22, r8
|
|
1000: 0e 94 60 0a call 0x14c0 ; 0x14c0 <__unordsf2>
|
|
1004: 81 11 cpse r24, r1
|
|
1006: 0f c0 rjmp .+30 ; 0x1026 <main+0x252>
|
|
1008: 2f ef ldi r18, 0xFF ; 255
|
|
100a: 3f ef ldi r19, 0xFF ; 255
|
|
100c: 4f e7 ldi r20, 0x7F ; 127
|
|
100e: 5f e7 ldi r21, 0x7F ; 127
|
|
1010: c5 01 movw r24, r10
|
|
1012: b4 01 movw r22, r8
|
|
1014: 0e 94 08 09 call 0x1210 ; 0x1210 <__cmpsf2>
|
|
1018: 18 16 cp r1, r24
|
|
101a: 2c f4 brge .+10 ; 0x1026 <main+0x252>
|
|
return write(s.c_str(), s.length());
|
|
}
|
|
|
|
size_t Print::print(const char str[])
|
|
{
|
|
return write(str);
|
|
101c: 8c e3 ldi r24, 0x3C ; 60
|
|
101e: 91 e0 ldi r25, 0x01 ; 1
|
|
1020: 0e 94 4a 04 call 0x894 ; 0x894 <_ZN5Print5writeEPKc.constprop.24>
|
|
1024: 76 c0 rjmp .+236 ; 0x1112 <main+0x33e>
|
|
{
|
|
size_t n = 0;
|
|
|
|
if (isnan(number)) return print("nan");
|
|
if (isinf(number)) return print("inf");
|
|
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
|
|
1026: 2f ef ldi r18, 0xFF ; 255
|
|
1028: 3f ef ldi r19, 0xFF ; 255
|
|
102a: 4f e7 ldi r20, 0x7F ; 127
|
|
102c: 5f e4 ldi r21, 0x4F ; 79
|
|
102e: c7 01 movw r24, r14
|
|
1030: b6 01 movw r22, r12
|
|
1032: 0e 94 ee 09 call 0x13dc ; 0x13dc <__gesf2>
|
|
1036: 18 16 cp r1, r24
|
|
1038: 1c f4 brge .+6 ; 0x1040 <main+0x26c>
|
|
return write(s.c_str(), s.length());
|
|
}
|
|
|
|
size_t Print::print(const char str[])
|
|
{
|
|
return write(str);
|
|
103a: 80 e4 ldi r24, 0x40 ; 64
|
|
103c: 91 e0 ldi r25, 0x01 ; 1
|
|
103e: f0 cf rjmp .-32 ; 0x1020 <main+0x24c>
|
|
size_t n = 0;
|
|
|
|
if (isnan(number)) return print("nan");
|
|
if (isinf(number)) return print("inf");
|
|
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
|
|
if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
|
|
1040: 2f ef ldi r18, 0xFF ; 255
|
|
1042: 3f ef ldi r19, 0xFF ; 255
|
|
1044: 4f e7 ldi r20, 0x7F ; 127
|
|
1046: 5f ec ldi r21, 0xCF ; 207
|
|
1048: c7 01 movw r24, r14
|
|
104a: b6 01 movw r22, r12
|
|
104c: 0e 94 08 09 call 0x1210 ; 0x1210 <__cmpsf2>
|
|
1050: 87 fd sbrc r24, 7
|
|
1052: f3 cf rjmp .-26 ; 0x103a <main+0x266>
|
|
|
|
// Handle negative numbers
|
|
if (number < 0.0)
|
|
1054: 20 e0 ldi r18, 0x00 ; 0
|
|
1056: 30 e0 ldi r19, 0x00 ; 0
|
|
1058: a9 01 movw r20, r18
|
|
105a: c7 01 movw r24, r14
|
|
105c: b6 01 movw r22, r12
|
|
105e: 0e 94 08 09 call 0x1210 ; 0x1210 <__cmpsf2>
|
|
1062: 87 ff sbrs r24, 7
|
|
1064: 09 c0 rjmp .+18 ; 0x1078 <main+0x2a4>
|
|
extendedInstruction();
|
|
execute(rate);
|
|
}
|
|
|
|
size_t Nokia_5110::write(uint8_t character) {
|
|
_print(character);
|
|
1066: 6d e2 ldi r22, 0x2D ; 45
|
|
1068: 80 ef ldi r24, 0xF0 ; 240
|
|
106a: 91 e0 ldi r25, 0x01 ; 1
|
|
106c: 0e 94 18 05 call 0xa30 ; 0xa30 <_ZN10Nokia_51106_printEh.constprop.6>
|
|
{
|
|
n += print('-');
|
|
number = -number;
|
|
1070: f7 fa bst r15, 7
|
|
1072: f0 94 com r15
|
|
1074: f7 f8 bld r15, 7
|
|
1076: f0 94 com r15
|
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
double rounding = 0.5;
|
|
for (uint8_t i=0; i<digits; ++i)
|
|
rounding /= 10.0;
|
|
|
|
number += rounding;
|
|
1078: 2a e0 ldi r18, 0x0A ; 10
|
|
107a: 37 ed ldi r19, 0xD7 ; 215
|
|
107c: 43 ea ldi r20, 0xA3 ; 163
|
|
107e: 5b e3 ldi r21, 0x3B ; 59
|
|
1080: c7 01 movw r24, r14
|
|
1082: b6 01 movw r22, r12
|
|
1084: 0e 94 9c 08 call 0x1138 ; 0x1138 <__addsf3>
|
|
1088: 4b 01 movw r8, r22
|
|
108a: 5c 01 movw r10, r24
|
|
|
|
// Extract the integer part of the number and print it
|
|
unsigned long int_part = (unsigned long)number;
|
|
108c: 0e 94 0d 09 call 0x121a ; 0x121a <__fixunssfsi>
|
|
1090: 6b 01 movw r12, r22
|
|
1092: 7c 01 movw r14, r24
|
|
double remainder = number - (double)int_part;
|
|
1094: 0e 94 3c 09 call 0x1278 ; 0x1278 <__floatunsisf>
|
|
1098: 9b 01 movw r18, r22
|
|
109a: ac 01 movw r20, r24
|
|
109c: c5 01 movw r24, r10
|
|
109e: b4 01 movw r22, r8
|
|
10a0: 0e 94 9b 08 call 0x1136 ; 0x1136 <__subsf3>
|
|
10a4: 4b 01 movw r8, r22
|
|
10a6: 5c 01 movw r10, r24
|
|
}
|
|
|
|
size_t Print::print(unsigned long n, int base)
|
|
{
|
|
if (base == 0) return write(n);
|
|
else return printNumber(n, base);
|
|
10a8: 4a e0 ldi r20, 0x0A ; 10
|
|
10aa: c7 01 movw r24, r14
|
|
10ac: b6 01 movw r22, r12
|
|
10ae: 0e 94 5c 04 call 0x8b8 ; 0x8b8 <_ZN5Print11printNumberEmh.constprop.20>
|
|
10b2: 6e e2 ldi r22, 0x2E ; 46
|
|
10b4: 80 ef ldi r24, 0xF0 ; 240
|
|
10b6: 91 e0 ldi r25, 0x01 ; 1
|
|
10b8: 0e 94 18 05 call 0xa30 ; 0xa30 <_ZN10Nokia_51106_printEh.constprop.6>
|
|
}
|
|
|
|
// Extract digits from the remainder one at a time
|
|
while (digits-- > 0)
|
|
{
|
|
remainder *= 10.0;
|
|
10bc: 20 e0 ldi r18, 0x00 ; 0
|
|
10be: 30 e0 ldi r19, 0x00 ; 0
|
|
10c0: 40 e2 ldi r20, 0x20 ; 32
|
|
10c2: 51 e4 ldi r21, 0x41 ; 65
|
|
10c4: c5 01 movw r24, r10
|
|
10c6: b4 01 movw r22, r8
|
|
10c8: 0e 94 f3 09 call 0x13e6 ; 0x13e6 <__mulsf3>
|
|
10cc: 4b 01 movw r8, r22
|
|
10ce: 5c 01 movw r10, r24
|
|
unsigned int toPrint = (unsigned int)(remainder);
|
|
10d0: 0e 94 0d 09 call 0x121a ; 0x121a <__fixunssfsi>
|
|
}
|
|
|
|
size_t Print::print(unsigned long n, int base)
|
|
{
|
|
if (base == 0) return write(n);
|
|
else return printNumber(n, base);
|
|
10d4: 6b 01 movw r12, r22
|
|
10d6: e1 2c mov r14, r1
|
|
10d8: f1 2c mov r15, r1
|
|
10da: 4a e0 ldi r20, 0x0A ; 10
|
|
10dc: c7 01 movw r24, r14
|
|
10de: b6 01 movw r22, r12
|
|
10e0: 0e 94 5c 04 call 0x8b8 ; 0x8b8 <_ZN5Print11printNumberEmh.constprop.20>
|
|
while (digits-- > 0)
|
|
{
|
|
remainder *= 10.0;
|
|
unsigned int toPrint = (unsigned int)(remainder);
|
|
n += print(toPrint);
|
|
remainder -= toPrint;
|
|
10e4: c7 01 movw r24, r14
|
|
10e6: b6 01 movw r22, r12
|
|
10e8: 0e 94 3c 09 call 0x1278 ; 0x1278 <__floatunsisf>
|
|
10ec: 9b 01 movw r18, r22
|
|
10ee: ac 01 movw r20, r24
|
|
10f0: c5 01 movw r24, r10
|
|
10f2: b4 01 movw r22, r8
|
|
10f4: 0e 94 9b 08 call 0x1136 ; 0x1136 <__subsf3>
|
|
}
|
|
|
|
size_t Print::print(unsigned long n, int base)
|
|
{
|
|
if (base == 0) return write(n);
|
|
else return printNumber(n, base);
|
|
10f8: 20 e0 ldi r18, 0x00 ; 0
|
|
10fa: 30 e0 ldi r19, 0x00 ; 0
|
|
10fc: 40 e2 ldi r20, 0x20 ; 32
|
|
10fe: 51 e4 ldi r21, 0x41 ; 65
|
|
1100: 0e 94 f3 09 call 0x13e6 ; 0x13e6 <__mulsf3>
|
|
1104: 0e 94 0d 09 call 0x121a ; 0x121a <__fixunssfsi>
|
|
1108: 80 e0 ldi r24, 0x00 ; 0
|
|
110a: 90 e0 ldi r25, 0x00 ; 0
|
|
110c: 4a e0 ldi r20, 0x0A ; 10
|
|
110e: 0e 94 5c 04 call 0x8b8 ; 0x8b8 <_ZN5Print11printNumberEmh.constprop.20>
|
|
//Serial.println(phVal_u16);
|
|
delay(1000);
|
|
1112: 68 ee ldi r22, 0xE8 ; 232
|
|
1114: 73 e0 ldi r23, 0x03 ; 3
|
|
1116: 80 e0 ldi r24, 0x00 ; 0
|
|
1118: 90 e0 ldi r25, 0x00 ; 0
|
|
111a: 0e 94 00 03 call 0x600 ; 0x600 <delay>
|
|
|
|
setup();
|
|
|
|
for (;;) {
|
|
loop();
|
|
if (serialEventRun) serialEventRun();
|
|
111e: 0e 94 3c 04 call 0x878 ; 0x878 <_Z14serialEventRunv>
|
|
1122: ef ce rjmp .-546 ; 0xf02 <main+0x12e>
|
|
|
|
00001124 <memcpy_P>:
|
|
1124: fb 01 movw r30, r22
|
|
1126: dc 01 movw r26, r24
|
|
1128: 02 c0 rjmp .+4 ; 0x112e <memcpy_P+0xa>
|
|
112a: 05 90 lpm r0, Z+
|
|
112c: 0d 92 st X+, r0
|
|
112e: 41 50 subi r20, 0x01 ; 1
|
|
1130: 50 40 sbci r21, 0x00 ; 0
|
|
1132: d8 f7 brcc .-10 ; 0x112a <memcpy_P+0x6>
|
|
1134: 08 95 ret
|
|
|
|
00001136 <__subsf3>:
|
|
1136: 50 58 subi r21, 0x80 ; 128
|
|
|
|
00001138 <__addsf3>:
|
|
1138: bb 27 eor r27, r27
|
|
113a: aa 27 eor r26, r26
|
|
113c: 0e 94 b3 08 call 0x1166 ; 0x1166 <__addsf3x>
|
|
1140: 0c 94 b4 09 jmp 0x1368 ; 0x1368 <__fp_round>
|
|
1144: 0e 94 a6 09 call 0x134c ; 0x134c <__fp_pscA>
|
|
1148: 38 f0 brcs .+14 ; 0x1158 <__addsf3+0x20>
|
|
114a: 0e 94 ad 09 call 0x135a ; 0x135a <__fp_pscB>
|
|
114e: 20 f0 brcs .+8 ; 0x1158 <__addsf3+0x20>
|
|
1150: 39 f4 brne .+14 ; 0x1160 <__addsf3+0x28>
|
|
1152: 9f 3f cpi r25, 0xFF ; 255
|
|
1154: 19 f4 brne .+6 ; 0x115c <__addsf3+0x24>
|
|
1156: 26 f4 brtc .+8 ; 0x1160 <__addsf3+0x28>
|
|
1158: 0c 94 a3 09 jmp 0x1346 ; 0x1346 <__fp_nan>
|
|
115c: 0e f4 brtc .+2 ; 0x1160 <__addsf3+0x28>
|
|
115e: e0 95 com r30
|
|
1160: e7 fb bst r30, 7
|
|
1162: 0c 94 9d 09 jmp 0x133a ; 0x133a <__fp_inf>
|
|
|
|
00001166 <__addsf3x>:
|
|
1166: e9 2f mov r30, r25
|
|
1168: 0e 94 c5 09 call 0x138a ; 0x138a <__fp_split3>
|
|
116c: 58 f3 brcs .-42 ; 0x1144 <__addsf3+0xc>
|
|
116e: ba 17 cp r27, r26
|
|
1170: 62 07 cpc r22, r18
|
|
1172: 73 07 cpc r23, r19
|
|
1174: 84 07 cpc r24, r20
|
|
1176: 95 07 cpc r25, r21
|
|
1178: 20 f0 brcs .+8 ; 0x1182 <__addsf3x+0x1c>
|
|
117a: 79 f4 brne .+30 ; 0x119a <__addsf3x+0x34>
|
|
117c: a6 f5 brtc .+104 ; 0x11e6 <__addsf3x+0x80>
|
|
117e: 0c 94 e7 09 jmp 0x13ce ; 0x13ce <__fp_zero>
|
|
1182: 0e f4 brtc .+2 ; 0x1186 <__addsf3x+0x20>
|
|
1184: e0 95 com r30
|
|
1186: 0b 2e mov r0, r27
|
|
1188: ba 2f mov r27, r26
|
|
118a: a0 2d mov r26, r0
|
|
118c: 0b 01 movw r0, r22
|
|
118e: b9 01 movw r22, r18
|
|
1190: 90 01 movw r18, r0
|
|
1192: 0c 01 movw r0, r24
|
|
1194: ca 01 movw r24, r20
|
|
1196: a0 01 movw r20, r0
|
|
1198: 11 24 eor r1, r1
|
|
119a: ff 27 eor r31, r31
|
|
119c: 59 1b sub r21, r25
|
|
119e: 99 f0 breq .+38 ; 0x11c6 <__addsf3x+0x60>
|
|
11a0: 59 3f cpi r21, 0xF9 ; 249
|
|
11a2: 50 f4 brcc .+20 ; 0x11b8 <__addsf3x+0x52>
|
|
11a4: 50 3e cpi r21, 0xE0 ; 224
|
|
11a6: 68 f1 brcs .+90 ; 0x1202 <__addsf3x+0x9c>
|
|
11a8: 1a 16 cp r1, r26
|
|
11aa: f0 40 sbci r31, 0x00 ; 0
|
|
11ac: a2 2f mov r26, r18
|
|
11ae: 23 2f mov r18, r19
|
|
11b0: 34 2f mov r19, r20
|
|
11b2: 44 27 eor r20, r20
|
|
11b4: 58 5f subi r21, 0xF8 ; 248
|
|
11b6: f3 cf rjmp .-26 ; 0x119e <__addsf3x+0x38>
|
|
11b8: 46 95 lsr r20
|
|
11ba: 37 95 ror r19
|
|
11bc: 27 95 ror r18
|
|
11be: a7 95 ror r26
|
|
11c0: f0 40 sbci r31, 0x00 ; 0
|
|
11c2: 53 95 inc r21
|
|
11c4: c9 f7 brne .-14 ; 0x11b8 <__addsf3x+0x52>
|
|
11c6: 7e f4 brtc .+30 ; 0x11e6 <__addsf3x+0x80>
|
|
11c8: 1f 16 cp r1, r31
|
|
11ca: ba 0b sbc r27, r26
|
|
11cc: 62 0b sbc r22, r18
|
|
11ce: 73 0b sbc r23, r19
|
|
11d0: 84 0b sbc r24, r20
|
|
11d2: ba f0 brmi .+46 ; 0x1202 <__addsf3x+0x9c>
|
|
11d4: 91 50 subi r25, 0x01 ; 1
|
|
11d6: a1 f0 breq .+40 ; 0x1200 <__addsf3x+0x9a>
|
|
11d8: ff 0f add r31, r31
|
|
11da: bb 1f adc r27, r27
|
|
11dc: 66 1f adc r22, r22
|
|
11de: 77 1f adc r23, r23
|
|
11e0: 88 1f adc r24, r24
|
|
11e2: c2 f7 brpl .-16 ; 0x11d4 <__addsf3x+0x6e>
|
|
11e4: 0e c0 rjmp .+28 ; 0x1202 <__addsf3x+0x9c>
|
|
11e6: ba 0f add r27, r26
|
|
11e8: 62 1f adc r22, r18
|
|
11ea: 73 1f adc r23, r19
|
|
11ec: 84 1f adc r24, r20
|
|
11ee: 48 f4 brcc .+18 ; 0x1202 <__addsf3x+0x9c>
|
|
11f0: 87 95 ror r24
|
|
11f2: 77 95 ror r23
|
|
11f4: 67 95 ror r22
|
|
11f6: b7 95 ror r27
|
|
11f8: f7 95 ror r31
|
|
11fa: 9e 3f cpi r25, 0xFE ; 254
|
|
11fc: 08 f0 brcs .+2 ; 0x1200 <__addsf3x+0x9a>
|
|
11fe: b0 cf rjmp .-160 ; 0x1160 <__addsf3+0x28>
|
|
1200: 93 95 inc r25
|
|
1202: 88 0f add r24, r24
|
|
1204: 08 f0 brcs .+2 ; 0x1208 <__addsf3x+0xa2>
|
|
1206: 99 27 eor r25, r25
|
|
1208: ee 0f add r30, r30
|
|
120a: 97 95 ror r25
|
|
120c: 87 95 ror r24
|
|
120e: 08 95 ret
|
|
|
|
00001210 <__cmpsf2>:
|
|
1210: 0e 94 79 09 call 0x12f2 ; 0x12f2 <__fp_cmp>
|
|
1214: 08 f4 brcc .+2 ; 0x1218 <__cmpsf2+0x8>
|
|
1216: 81 e0 ldi r24, 0x01 ; 1
|
|
1218: 08 95 ret
|
|
|
|
0000121a <__fixunssfsi>:
|
|
121a: 0e 94 cd 09 call 0x139a ; 0x139a <__fp_splitA>
|
|
121e: 88 f0 brcs .+34 ; 0x1242 <__fixunssfsi+0x28>
|
|
1220: 9f 57 subi r25, 0x7F ; 127
|
|
1222: 98 f0 brcs .+38 ; 0x124a <__fixunssfsi+0x30>
|
|
1224: b9 2f mov r27, r25
|
|
1226: 99 27 eor r25, r25
|
|
1228: b7 51 subi r27, 0x17 ; 23
|
|
122a: b0 f0 brcs .+44 ; 0x1258 <__fixunssfsi+0x3e>
|
|
122c: e1 f0 breq .+56 ; 0x1266 <__fixunssfsi+0x4c>
|
|
122e: 66 0f add r22, r22
|
|
1230: 77 1f adc r23, r23
|
|
1232: 88 1f adc r24, r24
|
|
1234: 99 1f adc r25, r25
|
|
1236: 1a f0 brmi .+6 ; 0x123e <__fixunssfsi+0x24>
|
|
1238: ba 95 dec r27
|
|
123a: c9 f7 brne .-14 ; 0x122e <__fixunssfsi+0x14>
|
|
123c: 14 c0 rjmp .+40 ; 0x1266 <__fixunssfsi+0x4c>
|
|
123e: b1 30 cpi r27, 0x01 ; 1
|
|
1240: 91 f0 breq .+36 ; 0x1266 <__fixunssfsi+0x4c>
|
|
1242: 0e 94 e7 09 call 0x13ce ; 0x13ce <__fp_zero>
|
|
1246: b1 e0 ldi r27, 0x01 ; 1
|
|
1248: 08 95 ret
|
|
124a: 0c 94 e7 09 jmp 0x13ce ; 0x13ce <__fp_zero>
|
|
124e: 67 2f mov r22, r23
|
|
1250: 78 2f mov r23, r24
|
|
1252: 88 27 eor r24, r24
|
|
1254: b8 5f subi r27, 0xF8 ; 248
|
|
1256: 39 f0 breq .+14 ; 0x1266 <__fixunssfsi+0x4c>
|
|
1258: b9 3f cpi r27, 0xF9 ; 249
|
|
125a: cc f3 brlt .-14 ; 0x124e <__fixunssfsi+0x34>
|
|
125c: 86 95 lsr r24
|
|
125e: 77 95 ror r23
|
|
1260: 67 95 ror r22
|
|
1262: b3 95 inc r27
|
|
1264: d9 f7 brne .-10 ; 0x125c <__fixunssfsi+0x42>
|
|
1266: 3e f4 brtc .+14 ; 0x1276 <__fixunssfsi+0x5c>
|
|
1268: 90 95 com r25
|
|
126a: 80 95 com r24
|
|
126c: 70 95 com r23
|
|
126e: 61 95 neg r22
|
|
1270: 7f 4f sbci r23, 0xFF ; 255
|
|
1272: 8f 4f sbci r24, 0xFF ; 255
|
|
1274: 9f 4f sbci r25, 0xFF ; 255
|
|
1276: 08 95 ret
|
|
|
|
00001278 <__floatunsisf>:
|
|
1278: e8 94 clt
|
|
127a: 09 c0 rjmp .+18 ; 0x128e <__floatsisf+0x12>
|
|
|
|
0000127c <__floatsisf>:
|
|
127c: 97 fb bst r25, 7
|
|
127e: 3e f4 brtc .+14 ; 0x128e <__floatsisf+0x12>
|
|
1280: 90 95 com r25
|
|
1282: 80 95 com r24
|
|
1284: 70 95 com r23
|
|
1286: 61 95 neg r22
|
|
1288: 7f 4f sbci r23, 0xFF ; 255
|
|
128a: 8f 4f sbci r24, 0xFF ; 255
|
|
128c: 9f 4f sbci r25, 0xFF ; 255
|
|
128e: 99 23 and r25, r25
|
|
1290: a9 f0 breq .+42 ; 0x12bc <__floatsisf+0x40>
|
|
1292: f9 2f mov r31, r25
|
|
1294: 96 e9 ldi r25, 0x96 ; 150
|
|
1296: bb 27 eor r27, r27
|
|
1298: 93 95 inc r25
|
|
129a: f6 95 lsr r31
|
|
129c: 87 95 ror r24
|
|
129e: 77 95 ror r23
|
|
12a0: 67 95 ror r22
|
|
12a2: b7 95 ror r27
|
|
12a4: f1 11 cpse r31, r1
|
|
12a6: f8 cf rjmp .-16 ; 0x1298 <__floatsisf+0x1c>
|
|
12a8: fa f4 brpl .+62 ; 0x12e8 <__floatsisf+0x6c>
|
|
12aa: bb 0f add r27, r27
|
|
12ac: 11 f4 brne .+4 ; 0x12b2 <__floatsisf+0x36>
|
|
12ae: 60 ff sbrs r22, 0
|
|
12b0: 1b c0 rjmp .+54 ; 0x12e8 <__floatsisf+0x6c>
|
|
12b2: 6f 5f subi r22, 0xFF ; 255
|
|
12b4: 7f 4f sbci r23, 0xFF ; 255
|
|
12b6: 8f 4f sbci r24, 0xFF ; 255
|
|
12b8: 9f 4f sbci r25, 0xFF ; 255
|
|
12ba: 16 c0 rjmp .+44 ; 0x12e8 <__floatsisf+0x6c>
|
|
12bc: 88 23 and r24, r24
|
|
12be: 11 f0 breq .+4 ; 0x12c4 <__floatsisf+0x48>
|
|
12c0: 96 e9 ldi r25, 0x96 ; 150
|
|
12c2: 11 c0 rjmp .+34 ; 0x12e6 <__floatsisf+0x6a>
|
|
12c4: 77 23 and r23, r23
|
|
12c6: 21 f0 breq .+8 ; 0x12d0 <__floatsisf+0x54>
|
|
12c8: 9e e8 ldi r25, 0x8E ; 142
|
|
12ca: 87 2f mov r24, r23
|
|
12cc: 76 2f mov r23, r22
|
|
12ce: 05 c0 rjmp .+10 ; 0x12da <__floatsisf+0x5e>
|
|
12d0: 66 23 and r22, r22
|
|
12d2: 71 f0 breq .+28 ; 0x12f0 <__floatsisf+0x74>
|
|
12d4: 96 e8 ldi r25, 0x86 ; 134
|
|
12d6: 86 2f mov r24, r22
|
|
12d8: 70 e0 ldi r23, 0x00 ; 0
|
|
12da: 60 e0 ldi r22, 0x00 ; 0
|
|
12dc: 2a f0 brmi .+10 ; 0x12e8 <__floatsisf+0x6c>
|
|
12de: 9a 95 dec r25
|
|
12e0: 66 0f add r22, r22
|
|
12e2: 77 1f adc r23, r23
|
|
12e4: 88 1f adc r24, r24
|
|
12e6: da f7 brpl .-10 ; 0x12de <__floatsisf+0x62>
|
|
12e8: 88 0f add r24, r24
|
|
12ea: 96 95 lsr r25
|
|
12ec: 87 95 ror r24
|
|
12ee: 97 f9 bld r25, 7
|
|
12f0: 08 95 ret
|
|
|
|
000012f2 <__fp_cmp>:
|
|
12f2: 99 0f add r25, r25
|
|
12f4: 00 08 sbc r0, r0
|
|
12f6: 55 0f add r21, r21
|
|
12f8: aa 0b sbc r26, r26
|
|
12fa: e0 e8 ldi r30, 0x80 ; 128
|
|
12fc: fe ef ldi r31, 0xFE ; 254
|
|
12fe: 16 16 cp r1, r22
|
|
1300: 17 06 cpc r1, r23
|
|
1302: e8 07 cpc r30, r24
|
|
1304: f9 07 cpc r31, r25
|
|
1306: c0 f0 brcs .+48 ; 0x1338 <__fp_cmp+0x46>
|
|
1308: 12 16 cp r1, r18
|
|
130a: 13 06 cpc r1, r19
|
|
130c: e4 07 cpc r30, r20
|
|
130e: f5 07 cpc r31, r21
|
|
1310: 98 f0 brcs .+38 ; 0x1338 <__fp_cmp+0x46>
|
|
1312: 62 1b sub r22, r18
|
|
1314: 73 0b sbc r23, r19
|
|
1316: 84 0b sbc r24, r20
|
|
1318: 95 0b sbc r25, r21
|
|
131a: 39 f4 brne .+14 ; 0x132a <__fp_cmp+0x38>
|
|
131c: 0a 26 eor r0, r26
|
|
131e: 61 f0 breq .+24 ; 0x1338 <__fp_cmp+0x46>
|
|
1320: 23 2b or r18, r19
|
|
1322: 24 2b or r18, r20
|
|
1324: 25 2b or r18, r21
|
|
1326: 21 f4 brne .+8 ; 0x1330 <__fp_cmp+0x3e>
|
|
1328: 08 95 ret
|
|
132a: 0a 26 eor r0, r26
|
|
132c: 09 f4 brne .+2 ; 0x1330 <__fp_cmp+0x3e>
|
|
132e: a1 40 sbci r26, 0x01 ; 1
|
|
1330: a6 95 lsr r26
|
|
1332: 8f ef ldi r24, 0xFF ; 255
|
|
1334: 81 1d adc r24, r1
|
|
1336: 81 1d adc r24, r1
|
|
1338: 08 95 ret
|
|
|
|
0000133a <__fp_inf>:
|
|
133a: 97 f9 bld r25, 7
|
|
133c: 9f 67 ori r25, 0x7F ; 127
|
|
133e: 80 e8 ldi r24, 0x80 ; 128
|
|
1340: 70 e0 ldi r23, 0x00 ; 0
|
|
1342: 60 e0 ldi r22, 0x00 ; 0
|
|
1344: 08 95 ret
|
|
|
|
00001346 <__fp_nan>:
|
|
1346: 9f ef ldi r25, 0xFF ; 255
|
|
1348: 80 ec ldi r24, 0xC0 ; 192
|
|
134a: 08 95 ret
|
|
|
|
0000134c <__fp_pscA>:
|
|
134c: 00 24 eor r0, r0
|
|
134e: 0a 94 dec r0
|
|
1350: 16 16 cp r1, r22
|
|
1352: 17 06 cpc r1, r23
|
|
1354: 18 06 cpc r1, r24
|
|
1356: 09 06 cpc r0, r25
|
|
1358: 08 95 ret
|
|
|
|
0000135a <__fp_pscB>:
|
|
135a: 00 24 eor r0, r0
|
|
135c: 0a 94 dec r0
|
|
135e: 12 16 cp r1, r18
|
|
1360: 13 06 cpc r1, r19
|
|
1362: 14 06 cpc r1, r20
|
|
1364: 05 06 cpc r0, r21
|
|
1366: 08 95 ret
|
|
|
|
00001368 <__fp_round>:
|
|
1368: 09 2e mov r0, r25
|
|
136a: 03 94 inc r0
|
|
136c: 00 0c add r0, r0
|
|
136e: 11 f4 brne .+4 ; 0x1374 <__fp_round+0xc>
|
|
1370: 88 23 and r24, r24
|
|
1372: 52 f0 brmi .+20 ; 0x1388 <__fp_round+0x20>
|
|
1374: bb 0f add r27, r27
|
|
1376: 40 f4 brcc .+16 ; 0x1388 <__fp_round+0x20>
|
|
1378: bf 2b or r27, r31
|
|
137a: 11 f4 brne .+4 ; 0x1380 <__fp_round+0x18>
|
|
137c: 60 ff sbrs r22, 0
|
|
137e: 04 c0 rjmp .+8 ; 0x1388 <__fp_round+0x20>
|
|
1380: 6f 5f subi r22, 0xFF ; 255
|
|
1382: 7f 4f sbci r23, 0xFF ; 255
|
|
1384: 8f 4f sbci r24, 0xFF ; 255
|
|
1386: 9f 4f sbci r25, 0xFF ; 255
|
|
1388: 08 95 ret
|
|
|
|
0000138a <__fp_split3>:
|
|
138a: 57 fd sbrc r21, 7
|
|
138c: 90 58 subi r25, 0x80 ; 128
|
|
138e: 44 0f add r20, r20
|
|
1390: 55 1f adc r21, r21
|
|
1392: 59 f0 breq .+22 ; 0x13aa <__fp_splitA+0x10>
|
|
1394: 5f 3f cpi r21, 0xFF ; 255
|
|
1396: 71 f0 breq .+28 ; 0x13b4 <__fp_splitA+0x1a>
|
|
1398: 47 95 ror r20
|
|
|
|
0000139a <__fp_splitA>:
|
|
139a: 88 0f add r24, r24
|
|
139c: 97 fb bst r25, 7
|
|
139e: 99 1f adc r25, r25
|
|
13a0: 61 f0 breq .+24 ; 0x13ba <__fp_splitA+0x20>
|
|
13a2: 9f 3f cpi r25, 0xFF ; 255
|
|
13a4: 79 f0 breq .+30 ; 0x13c4 <__fp_splitA+0x2a>
|
|
13a6: 87 95 ror r24
|
|
13a8: 08 95 ret
|
|
13aa: 12 16 cp r1, r18
|
|
13ac: 13 06 cpc r1, r19
|
|
13ae: 14 06 cpc r1, r20
|
|
13b0: 55 1f adc r21, r21
|
|
13b2: f2 cf rjmp .-28 ; 0x1398 <__fp_split3+0xe>
|
|
13b4: 46 95 lsr r20
|
|
13b6: f1 df rcall .-30 ; 0x139a <__fp_splitA>
|
|
13b8: 08 c0 rjmp .+16 ; 0x13ca <__fp_splitA+0x30>
|
|
13ba: 16 16 cp r1, r22
|
|
13bc: 17 06 cpc r1, r23
|
|
13be: 18 06 cpc r1, r24
|
|
13c0: 99 1f adc r25, r25
|
|
13c2: f1 cf rjmp .-30 ; 0x13a6 <__fp_splitA+0xc>
|
|
13c4: 86 95 lsr r24
|
|
13c6: 71 05 cpc r23, r1
|
|
13c8: 61 05 cpc r22, r1
|
|
13ca: 08 94 sec
|
|
13cc: 08 95 ret
|
|
|
|
000013ce <__fp_zero>:
|
|
13ce: e8 94 clt
|
|
|
|
000013d0 <__fp_szero>:
|
|
13d0: bb 27 eor r27, r27
|
|
13d2: 66 27 eor r22, r22
|
|
13d4: 77 27 eor r23, r23
|
|
13d6: cb 01 movw r24, r22
|
|
13d8: 97 f9 bld r25, 7
|
|
13da: 08 95 ret
|
|
|
|
000013dc <__gesf2>:
|
|
13dc: 0e 94 79 09 call 0x12f2 ; 0x12f2 <__fp_cmp>
|
|
13e0: 08 f4 brcc .+2 ; 0x13e4 <__gesf2+0x8>
|
|
13e2: 8f ef ldi r24, 0xFF ; 255
|
|
13e4: 08 95 ret
|
|
|
|
000013e6 <__mulsf3>:
|
|
13e6: 0e 94 06 0a call 0x140c ; 0x140c <__mulsf3x>
|
|
13ea: 0c 94 b4 09 jmp 0x1368 ; 0x1368 <__fp_round>
|
|
13ee: 0e 94 a6 09 call 0x134c ; 0x134c <__fp_pscA>
|
|
13f2: 38 f0 brcs .+14 ; 0x1402 <__mulsf3+0x1c>
|
|
13f4: 0e 94 ad 09 call 0x135a ; 0x135a <__fp_pscB>
|
|
13f8: 20 f0 brcs .+8 ; 0x1402 <__mulsf3+0x1c>
|
|
13fa: 95 23 and r25, r21
|
|
13fc: 11 f0 breq .+4 ; 0x1402 <__mulsf3+0x1c>
|
|
13fe: 0c 94 9d 09 jmp 0x133a ; 0x133a <__fp_inf>
|
|
1402: 0c 94 a3 09 jmp 0x1346 ; 0x1346 <__fp_nan>
|
|
1406: 11 24 eor r1, r1
|
|
1408: 0c 94 e8 09 jmp 0x13d0 ; 0x13d0 <__fp_szero>
|
|
|
|
0000140c <__mulsf3x>:
|
|
140c: 0e 94 c5 09 call 0x138a ; 0x138a <__fp_split3>
|
|
1410: 70 f3 brcs .-36 ; 0x13ee <__mulsf3+0x8>
|
|
|
|
00001412 <__mulsf3_pse>:
|
|
1412: 95 9f mul r25, r21
|
|
1414: c1 f3 breq .-16 ; 0x1406 <__mulsf3+0x20>
|
|
1416: 95 0f add r25, r21
|
|
1418: 50 e0 ldi r21, 0x00 ; 0
|
|
141a: 55 1f adc r21, r21
|
|
141c: 62 9f mul r22, r18
|
|
141e: f0 01 movw r30, r0
|
|
1420: 72 9f mul r23, r18
|
|
1422: bb 27 eor r27, r27
|
|
1424: f0 0d add r31, r0
|
|
1426: b1 1d adc r27, r1
|
|
1428: 63 9f mul r22, r19
|
|
142a: aa 27 eor r26, r26
|
|
142c: f0 0d add r31, r0
|
|
142e: b1 1d adc r27, r1
|
|
1430: aa 1f adc r26, r26
|
|
1432: 64 9f mul r22, r20
|
|
1434: 66 27 eor r22, r22
|
|
1436: b0 0d add r27, r0
|
|
1438: a1 1d adc r26, r1
|
|
143a: 66 1f adc r22, r22
|
|
143c: 82 9f mul r24, r18
|
|
143e: 22 27 eor r18, r18
|
|
1440: b0 0d add r27, r0
|
|
1442: a1 1d adc r26, r1
|
|
1444: 62 1f adc r22, r18
|
|
1446: 73 9f mul r23, r19
|
|
1448: b0 0d add r27, r0
|
|
144a: a1 1d adc r26, r1
|
|
144c: 62 1f adc r22, r18
|
|
144e: 83 9f mul r24, r19
|
|
1450: a0 0d add r26, r0
|
|
1452: 61 1d adc r22, r1
|
|
1454: 22 1f adc r18, r18
|
|
1456: 74 9f mul r23, r20
|
|
1458: 33 27 eor r19, r19
|
|
145a: a0 0d add r26, r0
|
|
145c: 61 1d adc r22, r1
|
|
145e: 23 1f adc r18, r19
|
|
1460: 84 9f mul r24, r20
|
|
1462: 60 0d add r22, r0
|
|
1464: 21 1d adc r18, r1
|
|
1466: 82 2f mov r24, r18
|
|
1468: 76 2f mov r23, r22
|
|
146a: 6a 2f mov r22, r26
|
|
146c: 11 24 eor r1, r1
|
|
146e: 9f 57 subi r25, 0x7F ; 127
|
|
1470: 50 40 sbci r21, 0x00 ; 0
|
|
1472: 9a f0 brmi .+38 ; 0x149a <__mulsf3_pse+0x88>
|
|
1474: f1 f0 breq .+60 ; 0x14b2 <__mulsf3_pse+0xa0>
|
|
1476: 88 23 and r24, r24
|
|
1478: 4a f0 brmi .+18 ; 0x148c <__mulsf3_pse+0x7a>
|
|
147a: ee 0f add r30, r30
|
|
147c: ff 1f adc r31, r31
|
|
147e: bb 1f adc r27, r27
|
|
1480: 66 1f adc r22, r22
|
|
1482: 77 1f adc r23, r23
|
|
1484: 88 1f adc r24, r24
|
|
1486: 91 50 subi r25, 0x01 ; 1
|
|
1488: 50 40 sbci r21, 0x00 ; 0
|
|
148a: a9 f7 brne .-22 ; 0x1476 <__mulsf3_pse+0x64>
|
|
148c: 9e 3f cpi r25, 0xFE ; 254
|
|
148e: 51 05 cpc r21, r1
|
|
1490: 80 f0 brcs .+32 ; 0x14b2 <__mulsf3_pse+0xa0>
|
|
1492: 0c 94 9d 09 jmp 0x133a ; 0x133a <__fp_inf>
|
|
1496: 0c 94 e8 09 jmp 0x13d0 ; 0x13d0 <__fp_szero>
|
|
149a: 5f 3f cpi r21, 0xFF ; 255
|
|
149c: e4 f3 brlt .-8 ; 0x1496 <__mulsf3_pse+0x84>
|
|
149e: 98 3e cpi r25, 0xE8 ; 232
|
|
14a0: d4 f3 brlt .-12 ; 0x1496 <__mulsf3_pse+0x84>
|
|
14a2: 86 95 lsr r24
|
|
14a4: 77 95 ror r23
|
|
14a6: 67 95 ror r22
|
|
14a8: b7 95 ror r27
|
|
14aa: f7 95 ror r31
|
|
14ac: e7 95 ror r30
|
|
14ae: 9f 5f subi r25, 0xFF ; 255
|
|
14b0: c1 f7 brne .-16 ; 0x14a2 <__mulsf3_pse+0x90>
|
|
14b2: fe 2b or r31, r30
|
|
14b4: 88 0f add r24, r24
|
|
14b6: 91 1d adc r25, r1
|
|
14b8: 96 95 lsr r25
|
|
14ba: 87 95 ror r24
|
|
14bc: 97 f9 bld r25, 7
|
|
14be: 08 95 ret
|
|
|
|
000014c0 <__unordsf2>:
|
|
14c0: 0e 94 79 09 call 0x12f2 ; 0x12f2 <__fp_cmp>
|
|
14c4: 88 0b sbc r24, r24
|
|
14c6: 99 0b sbc r25, r25
|
|
14c8: 08 95 ret
|
|
|
|
000014ca <__udivmodsi4>:
|
|
14ca: a1 e2 ldi r26, 0x21 ; 33
|
|
14cc: 1a 2e mov r1, r26
|
|
14ce: aa 1b sub r26, r26
|
|
14d0: bb 1b sub r27, r27
|
|
14d2: fd 01 movw r30, r26
|
|
14d4: 0d c0 rjmp .+26 ; 0x14f0 <__udivmodsi4_ep>
|
|
|
|
000014d6 <__udivmodsi4_loop>:
|
|
14d6: aa 1f adc r26, r26
|
|
14d8: bb 1f adc r27, r27
|
|
14da: ee 1f adc r30, r30
|
|
14dc: ff 1f adc r31, r31
|
|
14de: a2 17 cp r26, r18
|
|
14e0: b3 07 cpc r27, r19
|
|
14e2: e4 07 cpc r30, r20
|
|
14e4: f5 07 cpc r31, r21
|
|
14e6: 20 f0 brcs .+8 ; 0x14f0 <__udivmodsi4_ep>
|
|
14e8: a2 1b sub r26, r18
|
|
14ea: b3 0b sbc r27, r19
|
|
14ec: e4 0b sbc r30, r20
|
|
14ee: f5 0b sbc r31, r21
|
|
|
|
000014f0 <__udivmodsi4_ep>:
|
|
14f0: 66 1f adc r22, r22
|
|
14f2: 77 1f adc r23, r23
|
|
14f4: 88 1f adc r24, r24
|
|
14f6: 99 1f adc r25, r25
|
|
14f8: 1a 94 dec r1
|
|
14fa: 69 f7 brne .-38 ; 0x14d6 <__udivmodsi4_loop>
|
|
14fc: 60 95 com r22
|
|
14fe: 70 95 com r23
|
|
1500: 80 95 com r24
|
|
1502: 90 95 com r25
|
|
1504: 9b 01 movw r18, r22
|
|
1506: ac 01 movw r20, r24
|
|
1508: bd 01 movw r22, r26
|
|
150a: cf 01 movw r24, r30
|
|
150c: 08 95 ret
|
|
|
|
0000150e <__tablejump2__>:
|
|
150e: ee 0f add r30, r30
|
|
1510: ff 1f adc r31, r31
|
|
1512: 05 90 lpm r0, Z+
|
|
1514: f4 91 lpm r31, Z
|
|
1516: e0 2d mov r30, r0
|
|
1518: 09 94 ijmp
|
|
|
|
0000151a <abort>:
|
|
151a: 81 e0 ldi r24, 0x01 ; 1
|
|
151c: 90 e0 ldi r25, 0x00 ; 0
|
|
151e: f8 94 cli
|
|
1520: 0c 94 92 0a jmp 0x1524 ; 0x1524 <_exit>
|
|
|
|
00001524 <_exit>:
|
|
1524: f8 94 cli
|
|
|
|
00001526 <__stop_program>:
|
|
1526: ff cf rjmp .-2 ; 0x1526 <__stop_program>
|