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 : 432: 00 00 00 00 25 00 28 00 2b 00 ....%.(.+. 0000043c : 43c: 00 00 00 00 24 00 27 00 2a 00 ....$.'.*. 00000446 : 446: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................ 456: 03 03 03 03 .... 0000045a : 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
4bc: 0c 94 92 0a jmp 0x1524 ; 0x1524 <_exit> 000004c0 <__bad_interrupt>: 4c0: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000004c4 : #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 // 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 : } } 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 53a: 3c c0 rjmp .+120 ; 0x5b4 // 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 // //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 544: 38 f4 brcc .+14 ; 0x554 546: 21 30 cpi r18, 0x01 ; 1 548: a9 f0 breq .+42 ; 0x574 54a: 22 30 cpi r18, 0x02 ; 2 54c: 01 f5 brne .+64 ; 0x58e #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 // //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 558: 28 30 cpi r18, 0x08 ; 8 55a: a1 f0 breq .+40 ; 0x584 55c: 24 30 cpi r18, 0x04 ; 4 55e: b9 f4 brne .+46 ; 0x58e { #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 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 #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 #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 #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 *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 } 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 : 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 5be: 90 91 50 01 lds r25, 0x0150 ; 0x800150 5c2: a0 91 51 01 lds r26, 0x0151 ; 0x800151 5c6: b0 91 52 01 lds r27, 0x0152 ; 0x800152 #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 5d0: 2f 3f cpi r18, 0xFF ; 255 5d2: 19 f0 breq .+6 ; 0x5da 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 } 5fe: 08 95 ret 00000600 : 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 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 yield(); while ( ms > 0 && (micros() - start) >= 1000) { 626: 0e 94 db 02 call 0x5b6 ; 0x5b6 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 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 660: dd cf rjmp .-70 ; 0x61c 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(_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(clockPin, HIGH); 976: 61 e0 ldi r22, 0x01 ; 1 978: 8d 2d mov r24, r13 97a: 0e 94 8e 02 call 0x51c ; 0x51c digitalWrite(clockPin, LOW); 97e: 60 e0 ldi r22, 0x00 ; 0 980: 8d 2d mov r24, r13 982: 0e 94 8e 02 call 0x51c ; 0x51c 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 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 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 a06: 0e 94 8e 02 call 0x51c ; 0x51c 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 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 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 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 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 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 ba0: 90 91 4c 01 lds r25, 0x014C ; 0x80014c ba4: a0 91 4d 01 lds r26, 0x014D ; 0x80014d ba8: b0 91 4e 01 lds r27, 0x014E ; 0x80014e unsigned char f = timer0_fract; bac: 30 91 4a 01 lds r19, 0x014A ; 0x80014a 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_millis = m; bce: 80 93 4b 01 sts 0x014B, r24 ; 0x80014b bd2: 90 93 4c 01 sts 0x014C, r25 ; 0x80014c bd6: a0 93 4d 01 sts 0x014D, r26 ; 0x80014d bda: b0 93 4e 01 sts 0x014E, r27 ; 0x80014e timer0_overflow_count++; bde: 80 91 4f 01 lds r24, 0x014F ; 0x80014f be2: 90 91 50 01 lds r25, 0x0150 ; 0x800150 be6: a0 91 51 01 lds r26, 0x0151 ; 0x800151 bea: b0 91 52 01 lds r27, 0x0152 ; 0x800152 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 bf8: 90 93 50 01 sts 0x0150, r25 ; 0x800150 bfc: a0 93 51 01 sts 0x0151, r26 ; 0x800151 c00: b0 93 52 01 sts 0x0152, r27 ; 0x800152 } 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 c7e: f0 91 64 01 lds r31, 0x0164 ; 0x800164 c82: 80 81 ld r24, Z c84: e0 91 69 01 lds r30, 0x0169 ; 0x800169 c88: f0 91 6a 01 lds r31, 0x016A ; 0x80016a 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 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 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 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 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(CE, OUTPUT); d6c: 84 e0 ldi r24, 0x04 ; 4 d6e: 0e 94 62 02 call 0x4c4 ; 0x4c4 pinMode(DC, OUTPUT); d72: 85 e0 ldi r24, 0x05 ; 5 d74: 0e 94 62 02 call 0x4c4 ; 0x4c4 pinMode(DIN, OUTPUT); d78: 86 e0 ldi r24, 0x06 ; 6 d7a: 0e 94 62 02 call 0x4c4 ; 0x4c4 pinMode(CLK, OUTPUT); d7e: 87 e0 ldi r24, 0x07 ; 7 d80: 0e 94 62 02 call 0x4c4 ; 0x4c4 _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(_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 _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
: 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 e5e: f0 91 64 01 lds r31, 0x0164 ; 0x800164 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 e6a: f0 91 60 01 lds r31, 0x0160 ; 0x800160 e6e: 10 82 st Z, r1 *_ubrrl = baud_setting; e70: e0 91 61 01 lds r30, 0x0161 ; 0x800161 e74: f0 91 62 01 lds r31, 0x0162 ; 0x800162 e78: 8f ec ldi r24, 0xCF ; 207 e7a: 80 83 st Z, r24 _written = false; e7c: 10 92 6b 01 sts 0x016B, r1 ; 0x80016b //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 e84: f0 91 68 01 lds r31, 0x0168 ; 0x800168 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 e90: f0 91 66 01 lds r31, 0x0166 ; 0x800166 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 e9e: f0 91 66 01 lds r31, 0x0166 ; 0x800166 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 eac: f0 91 66 01 lds r31, 0x0166 ; 0x800166 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 eba: f0 91 66 01 lds r31, 0x0166 ; 0x800166 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 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 // 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 f2c: 60 93 48 01 sts 0x0148, r22 ; 0x800148 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 f88: 70 91 49 01 lds r23, 0x0149 ; 0x800149 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 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 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 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 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 { 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 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 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 // 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 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 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 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); 111e: 0e 94 3c 04 call 0x878 ; 0x878 <_Z14serialEventRunv> 1122: ef ce rjmp .-546 ; 0xf02 00001124 : 1124: fb 01 movw r30, r22 1126: dc 01 movw r26, r24 1128: 02 c0 rjmp .+4 ; 0x112e 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 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 : 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>