Bootloader1281.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000bbc 0001f000 0001f000 00000094 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .noinit 0000012d 00801000 00801000 00000c50 2**0 ALLOC 2 .bss 00000002 00801500 00801500 00000c50 2**0 ALLOC 3 .debug_aranges 00000048 00000000 00000000 00000c50 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_pubnames 0000008a 00000000 00000000 00000c98 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_info 000004cb 00000000 00000000 00000d22 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_abbrev 00000163 00000000 00000000 000011ed 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_line 00000724 00000000 00000000 00001350 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_frame 00000060 00000000 00000000 00001a74 2**2 CONTENTS, READONLY, DEBUGGING 9 .debug_str 000001ce 00000000 00000000 00001ad4 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_ranges 00000020 00000000 00000000 00001ca2 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 0001f000 <__vectors>: 1f000: 0c 94 66 f8 jmp 0x1f0cc ; 0x1f0cc 1f004: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f008: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f00c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f010: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f014: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f018: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f01c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f020: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f024: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f028: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f02c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f030: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f034: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f038: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f03c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f040: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f044: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f048: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f04c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f050: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f054: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f058: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f05c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f060: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f064: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f068: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f06c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f070: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f074: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f078: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f07c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f080: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f084: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f088: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f08c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f090: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f094: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f098: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f09c: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0a0: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0a4: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0a8: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0ac: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0b0: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0b4: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0b8: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0bc: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0c0: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0c4: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 1f0c8: 0c 94 b9 f8 jmp 0x1f172 ; 0x1f172 <__bad_interrupt> 0001f0cc : void (*reset)( void ) = 0x0000; void initBootloader(void) __attribute__ ((naked)) __attribute__ ((section (".init0"))); void initBootloader(void) { 1f0cc: e3 e3 ldi r30, 0x33 ; 51 1f0ce: f0 e0 ldi r31, 0x00 ; 0 1f0d0: 8f ef ldi r24, 0xFF ; 255 1f0d2: 80 83 st Z, r24 PROGLED_DDR = 255;; /* Enable XMEM Interface, Waitstates for Upper Sector (=0x8000-0xFFFF) */ XMCRA = (1 << SRE) | (1< { /* Reset vector in Application Section (0x0000) != 0xFFFF --> Application programmed */ asm volatile ( "push r1" "\n\t" // Jump to Reset vector in Application Section 1f12e: 1f 92 push r1 1f130: 1f 92 push r1 1f132: 08 95 ret 1f134: 11 24 eor r1, r1 1f136: 1f be out 0x3f, r1 ; 63 1f138: cf ef ldi r28, 0xFF ; 255 1f13a: d1 e2 ldi r29, 0x21 ; 33 1f13c: de bf out 0x3e, r29 ; 62 1f13e: cd bf out 0x3d, r28 ; 61 0001f140 <__do_copy_data>: 1f140: 15 e1 ldi r17, 0x15 ; 21 1f142: a0 e0 ldi r26, 0x00 ; 0 1f144: b5 e1 ldi r27, 0x15 ; 21 1f146: ec eb ldi r30, 0xBC ; 188 1f148: fb ef ldi r31, 0xFB ; 251 1f14a: 01 e0 ldi r16, 0x01 ; 1 1f14c: 0b bf out 0x3b, r16 ; 59 1f14e: 02 c0 rjmp .+4 ; 0x1f154 <__do_copy_data+0x14> 1f150: 07 90 elpm r0, Z+ 1f152: 0d 92 st X+, r0 1f154: a0 30 cpi r26, 0x00 ; 0 1f156: b1 07 cpc r27, r17 1f158: d9 f7 brne .-10 ; 0x1f150 <__do_copy_data+0x10> 0001f15a <__do_clear_bss>: 1f15a: 15 e1 ldi r17, 0x15 ; 21 1f15c: a0 e0 ldi r26, 0x00 ; 0 1f15e: b5 e1 ldi r27, 0x15 ; 21 1f160: 01 c0 rjmp .+2 ; 0x1f164 <.do_clear_bss_start> 0001f162 <.do_clear_bss_loop>: 1f162: 1d 92 st X+, r1 0001f164 <.do_clear_bss_start>: 1f164: a2 30 cpi r26, 0x02 ; 2 1f166: b1 07 cpc r27, r17 1f168: e1 f7 brne .-8 ; 0x1f162 <.do_clear_bss_loop> 1f16a: 0e 94 bb f8 call 0x1f176 ; 0x1f176
1f16e: 0c 94 dc fd jmp 0x1fbb8 ; 0x1fbb8 <_exit> 0001f172 <__bad_interrupt>: 1f172: 0c 94 00 f8 jmp 0x1f000 ; 0x1f000 <__vectors> 0001f176
: } int main(void) { 1f176: df 93 push r29 1f178: cf 93 push r28 1f17a: cd b7 in r28, 0x3d ; 61 1f17c: de b7 in r29, 0x3e ; 62 1f17e: c3 56 subi r28, 0x63 ; 99 1f180: d1 40 sbci r29, 0x01 ; 1 1f182: 0f b6 in r0, 0x3f ; 63 1f184: f8 94 cli 1f186: de bf out 0x3e, r29 ; 62 1f188: 0f be out 0x3f, r0 ; 63 1f18a: cd bf out 0x3d, r28 ; 61 address_t address = 0; 1f18c: 18 ae std Y+56, r1 ; 0x38 1f18e: 19 ae std Y+57, r1 ; 0x39 1f190: 1a ae std Y+58, r1 ; 0x3a 1f192: 1b ae std Y+59, r1 ; 0x3b address_t eraseAddress = 0; 1f194: 1c aa std Y+52, r1 ; 0x34 1f196: 1d aa std Y+53, r1 ; 0x35 1f198: 1e aa std Y+54, r1 ; 0x36 1f19a: 1f aa std Y+55, r1 ; 0x37 unsigned char msgParseState = ST_START; 1f19c: 1b aa std Y+51, r1 ; 0x33 unsigned int i = 0; 1f19e: 1a aa std Y+50, r1 ; 0x32 1f1a0: 19 aa std Y+49, r1 ; 0x31 unsigned char checksum = 0; 1f1a2: 18 aa std Y+48, r1 ; 0x30 unsigned char seqNum = 0; 1f1a4: 1f a6 std Y+47, r1 ; 0x2f unsigned int msgLength = 0; 1f1a6: 1e a6 std Y+46, r1 ; 0x2e 1f1a8: 1d a6 std Y+45, r1 ; 0x2d unsigned char msgBuffer[285]; unsigned char c, *p; uint16_t baud = ((FC_CPU+(BAUD*8L))/(BAUD*16L)-1); 1f1aa: 88 e0 ldi r24, 0x08 ; 8 1f1ac: 90 e0 ldi r25, 0x00 ; 0 1f1ae: 99 a7 std Y+41, r25 ; 0x29 1f1b0: 88 a7 std Y+40, r24 ; 0x28 UBRR0H = (unsigned char)(baud>>8); 1f1b2: e5 ec ldi r30, 0xC5 ; 197 1f1b4: f0 e0 ldi r31, 0x00 ; 0 1f1b6: 88 a5 ldd r24, Y+40 ; 0x28 1f1b8: 99 a5 ldd r25, Y+41 ; 0x29 1f1ba: 89 2f mov r24, r25 1f1bc: 99 27 eor r25, r25 1f1be: 80 83 st Z, r24 UBRR0L = (unsigned char)baud; 1f1c0: e4 ec ldi r30, 0xC4 ; 196 1f1c2: f0 e0 ldi r31, 0x00 ; 0 1f1c4: 88 a5 ldd r24, Y+40 ; 0x28 1f1c6: 80 83 st Z, r24 UCSR0B = ((1< { msgParseState = ST_PROCESS; 1f1d8: 87 e0 ldi r24, 0x07 ; 7 1f1da: 8b ab std Y+51, r24 ; 0x33 statusbyte = 0; 1f1dc: 10 92 00 10 sts 0x1000, r1 1f1e0: c7 c0 rjmp .+398 ; 0x1f370 } else msgParseState = ST_START; 1f1e2: 1b aa std Y+51, r1 ; 0x33 1f1e4: c5 c0 rjmp .+394 ; 0x1f370 while (msgParseState != ST_PROCESS) { c = recchar(); 1f1e6: 0e 94 cd fd call 0x1fb9a ; 0x1fb9a 1f1ea: 8c a7 std Y+44, r24 ; 0x2c switch (msgParseState) 1f1ec: 8b a9 ldd r24, Y+51 ; 0x33 1f1ee: 28 2f mov r18, r24 1f1f0: 30 e0 ldi r19, 0x00 ; 0 1f1f2: ce 59 subi r28, 0x9E ; 158 1f1f4: de 4f sbci r29, 0xFE ; 254 1f1f6: 39 83 std Y+1, r19 ; 0x01 1f1f8: 28 83 st Y, r18 1f1fa: c2 56 subi r28, 0x62 ; 98 1f1fc: d1 40 sbci r29, 0x01 ; 1 1f1fe: ce 59 subi r28, 0x9E ; 158 1f200: de 4f sbci r29, 0xFE ; 254 1f202: 88 81 ld r24, Y 1f204: 99 81 ldd r25, Y+1 ; 0x01 1f206: c2 56 subi r28, 0x62 ; 98 1f208: d1 40 sbci r29, 0x01 ; 1 1f20a: 83 30 cpi r24, 0x03 ; 3 1f20c: 91 05 cpc r25, r1 1f20e: 09 f4 brne .+2 ; 0x1f212 1f210: 6d c0 rjmp .+218 ; 0x1f2ec 1f212: ce 59 subi r28, 0x9E ; 158 1f214: de 4f sbci r29, 0xFE ; 254 1f216: 28 81 ld r18, Y 1f218: 39 81 ldd r19, Y+1 ; 0x01 1f21a: c2 56 subi r28, 0x62 ; 98 1f21c: d1 40 sbci r29, 0x01 ; 1 1f21e: 24 30 cpi r18, 0x04 ; 4 1f220: 31 05 cpc r19, r1 1f222: e4 f4 brge .+56 ; 0x1f25c 1f224: ce 59 subi r28, 0x9E ; 158 1f226: de 4f sbci r29, 0xFE ; 254 1f228: 88 81 ld r24, Y 1f22a: 99 81 ldd r25, Y+1 ; 0x01 1f22c: c2 56 subi r28, 0x62 ; 98 1f22e: d1 40 sbci r29, 0x01 ; 1 1f230: 81 30 cpi r24, 0x01 ; 1 1f232: 91 05 cpc r25, r1 1f234: d9 f1 breq .+118 ; 0x1f2ac 1f236: ce 59 subi r28, 0x9E ; 158 1f238: de 4f sbci r29, 0xFE ; 254 1f23a: 28 81 ld r18, Y 1f23c: 39 81 ldd r19, Y+1 ; 0x01 1f23e: c2 56 subi r28, 0x62 ; 98 1f240: d1 40 sbci r29, 0x01 ; 1 1f242: 22 30 cpi r18, 0x02 ; 2 1f244: 31 05 cpc r19, r1 1f246: 0c f0 brlt .+2 ; 0x1f24a 1f248: 43 c0 rjmp .+134 ; 0x1f2d0 1f24a: ce 59 subi r28, 0x9E ; 158 1f24c: de 4f sbci r29, 0xFE ; 254 1f24e: 88 81 ld r24, Y 1f250: 99 81 ldd r25, Y+1 ; 0x01 1f252: c2 56 subi r28, 0x62 ; 98 1f254: d1 40 sbci r29, 0x01 ; 1 1f256: 00 97 sbiw r24, 0x00 ; 0 1f258: 01 f1 breq .+64 ; 0x1f29a 1f25a: 8a c0 rjmp .+276 ; 0x1f370 1f25c: ce 59 subi r28, 0x9E ; 158 1f25e: de 4f sbci r29, 0xFE ; 254 1f260: 28 81 ld r18, Y 1f262: 39 81 ldd r19, Y+1 ; 0x01 1f264: c2 56 subi r28, 0x62 ; 98 1f266: d1 40 sbci r29, 0x01 ; 1 1f268: 25 30 cpi r18, 0x05 ; 5 1f26a: 31 05 cpc r19, r1 1f26c: 09 f4 brne .+2 ; 0x1f270 1f26e: 5c c0 rjmp .+184 ; 0x1f328 1f270: ce 59 subi r28, 0x9E ; 158 1f272: de 4f sbci r29, 0xFE ; 254 1f274: 88 81 ld r24, Y 1f276: 99 81 ldd r25, Y+1 ; 0x01 1f278: c2 56 subi r28, 0x62 ; 98 1f27a: d1 40 sbci r29, 0x01 ; 1 1f27c: 85 30 cpi r24, 0x05 ; 5 1f27e: 91 05 cpc r25, r1 1f280: 0c f4 brge .+2 ; 0x1f284 1f282: 44 c0 rjmp .+136 ; 0x1f30c 1f284: ce 59 subi r28, 0x9E ; 158 1f286: de 4f sbci r29, 0xFE ; 254 1f288: 28 81 ld r18, Y 1f28a: 39 81 ldd r19, Y+1 ; 0x01 1f28c: c2 56 subi r28, 0x62 ; 98 1f28e: d1 40 sbci r29, 0x01 ; 1 1f290: 26 30 cpi r18, 0x06 ; 6 1f292: 31 05 cpc r19, r1 1f294: 09 f4 brne .+2 ; 0x1f298 1f296: 64 c0 rjmp .+200 ; 0x1f360 1f298: 6b c0 rjmp .+214 ; 0x1f370 { case ST_START: if(c == MESSAGE_START) 1f29a: 8c a5 ldd r24, Y+44 ; 0x2c 1f29c: 8b 31 cpi r24, 0x1B ; 27 1f29e: 09 f0 breq .+2 ; 0x1f2a2 1f2a0: 67 c0 rjmp .+206 ; 0x1f370 { msgParseState = ST_GET_SEQ_NUM; 1f2a2: 81 e0 ldi r24, 0x01 ; 1 1f2a4: 8b ab std Y+51, r24 ; 0x33 checksum = MESSAGE_START; 1f2a6: 8b e1 ldi r24, 0x1B ; 27 1f2a8: 88 ab std Y+48, r24 ; 0x30 1f2aa: 62 c0 rjmp .+196 ; 0x1f370 } break; case ST_GET_SEQ_NUM: if ((c == 1) || (c == seqNum)) 1f2ac: 8c a5 ldd r24, Y+44 ; 0x2c 1f2ae: 81 30 cpi r24, 0x01 ; 1 1f2b0: 21 f0 breq .+8 ; 0x1f2ba 1f2b2: 9c a5 ldd r25, Y+44 ; 0x2c 1f2b4: 8f a5 ldd r24, Y+47 ; 0x2f 1f2b6: 98 17 cp r25, r24 1f2b8: 49 f4 brne .+18 ; 0x1f2cc { seqNum = c; 1f2ba: 8c a5 ldd r24, Y+44 ; 0x2c 1f2bc: 8f a7 std Y+47, r24 ; 0x2f msgParseState = ST_MSG_SIZE_1; 1f2be: 82 e0 ldi r24, 0x02 ; 2 1f2c0: 8b ab std Y+51, r24 ; 0x33 checksum ^= c; 1f2c2: 98 a9 ldd r25, Y+48 ; 0x30 1f2c4: 8c a5 ldd r24, Y+44 ; 0x2c 1f2c6: 89 27 eor r24, r25 1f2c8: 88 ab std Y+48, r24 ; 0x30 1f2ca: 52 c0 rjmp .+164 ; 0x1f370 } else msgParseState = ST_START; 1f2cc: 1b aa std Y+51, r1 ; 0x33 1f2ce: 50 c0 rjmp .+160 ; 0x1f370 break; case ST_MSG_SIZE_1: msgLength = c<<8; 1f2d0: 8c a5 ldd r24, Y+44 ; 0x2c 1f2d2: 88 2f mov r24, r24 1f2d4: 90 e0 ldi r25, 0x00 ; 0 1f2d6: 98 2f mov r25, r24 1f2d8: 88 27 eor r24, r24 1f2da: 9e a7 std Y+46, r25 ; 0x2e 1f2dc: 8d a7 std Y+45, r24 ; 0x2d msgParseState = ST_MSG_SIZE_2; 1f2de: 83 e0 ldi r24, 0x03 ; 3 1f2e0: 8b ab std Y+51, r24 ; 0x33 checksum ^= c; 1f2e2: 98 a9 ldd r25, Y+48 ; 0x30 1f2e4: 8c a5 ldd r24, Y+44 ; 0x2c 1f2e6: 89 27 eor r24, r25 1f2e8: 88 ab std Y+48, r24 ; 0x30 1f2ea: 42 c0 rjmp .+132 ; 0x1f370 break; case ST_MSG_SIZE_2: msgLength |= c; 1f2ec: 8c a5 ldd r24, Y+44 ; 0x2c 1f2ee: 28 2f mov r18, r24 1f2f0: 30 e0 ldi r19, 0x00 ; 0 1f2f2: 8d a5 ldd r24, Y+45 ; 0x2d 1f2f4: 9e a5 ldd r25, Y+46 ; 0x2e 1f2f6: 82 2b or r24, r18 1f2f8: 93 2b or r25, r19 1f2fa: 9e a7 std Y+46, r25 ; 0x2e 1f2fc: 8d a7 std Y+45, r24 ; 0x2d msgParseState = ST_GET_TOKEN; 1f2fe: 84 e0 ldi r24, 0x04 ; 4 1f300: 8b ab std Y+51, r24 ; 0x33 checksum ^= c; 1f302: 98 a9 ldd r25, Y+48 ; 0x30 1f304: 8c a5 ldd r24, Y+44 ; 0x2c 1f306: 89 27 eor r24, r25 1f308: 88 ab std Y+48, r24 ; 0x30 1f30a: 32 c0 rjmp .+100 ; 0x1f370 break; case ST_GET_TOKEN: if (c == TOKEN) 1f30c: 8c a5 ldd r24, Y+44 ; 0x2c 1f30e: 8e 30 cpi r24, 0x0E ; 14 1f310: 49 f4 brne .+18 ; 0x1f324 { msgParseState = ST_GET_DATA; 1f312: 85 e0 ldi r24, 0x05 ; 5 1f314: 8b ab std Y+51, r24 ; 0x33 checksum ^= c; 1f316: 98 a9 ldd r25, Y+48 ; 0x30 1f318: 8c a5 ldd r24, Y+44 ; 0x2c 1f31a: 89 27 eor r24, r25 1f31c: 88 ab std Y+48, r24 ; 0x30 i = 0; 1f31e: 1a aa std Y+50, r1 ; 0x32 1f320: 19 aa std Y+49, r1 ; 0x31 1f322: 26 c0 rjmp .+76 ; 0x1f370 } else msgParseState = ST_START; 1f324: 1b aa std Y+51, r1 ; 0x33 1f326: 24 c0 rjmp .+72 ; 0x1f370 break; case ST_GET_DATA: msgBuffer[i++] = c; 1f328: 29 a9 ldd r18, Y+49 ; 0x31 1f32a: 3a a9 ldd r19, Y+50 ; 0x32 1f32c: ce 01 movw r24, r28 1f32e: cc 96 adiw r24, 0x3c ; 60 1f330: fc 01 movw r30, r24 1f332: e2 0f add r30, r18 1f334: f3 1f adc r31, r19 1f336: 8c a5 ldd r24, Y+44 ; 0x2c 1f338: 80 83 st Z, r24 1f33a: 89 a9 ldd r24, Y+49 ; 0x31 1f33c: 9a a9 ldd r25, Y+50 ; 0x32 1f33e: 01 96 adiw r24, 0x01 ; 1 1f340: 9a ab std Y+50, r25 ; 0x32 1f342: 89 ab std Y+49, r24 ; 0x31 checksum ^= c; 1f344: 98 a9 ldd r25, Y+48 ; 0x30 1f346: 8c a5 ldd r24, Y+44 ; 0x2c 1f348: 89 27 eor r24, r25 1f34a: 88 ab std Y+48, r24 ; 0x30 if (i == msgLength) 1f34c: 29 a9 ldd r18, Y+49 ; 0x31 1f34e: 3a a9 ldd r19, Y+50 ; 0x32 1f350: 8d a5 ldd r24, Y+45 ; 0x2d 1f352: 9e a5 ldd r25, Y+46 ; 0x2e 1f354: 28 17 cp r18, r24 1f356: 39 07 cpc r19, r25 1f358: 59 f4 brne .+22 ; 0x1f370 msgParseState = ST_GET_CHECK; 1f35a: 86 e0 ldi r24, 0x06 ; 6 1f35c: 8b ab std Y+51, r24 ; 0x33 1f35e: 08 c0 rjmp .+16 ; 0x1f370 break; case ST_GET_CHECK: if(c == checksum) 1f360: 9c a5 ldd r25, Y+44 ; 0x2c 1f362: 88 a9 ldd r24, Y+48 ; 0x30 1f364: 98 17 cp r25, r24 1f366: 19 f4 brne .+6 ; 0x1f36e msgParseState = ST_PROCESS; 1f368: 87 e0 ldi r24, 0x07 ; 7 1f36a: 8b ab std Y+51, r24 ; 0x33 1f36c: 01 c0 rjmp .+2 ; 0x1f370 else msgParseState = ST_START; 1f36e: 1b aa std Y+51, r1 ; 0x33 } else msgParseState = ST_START; while (msgParseState != ST_PROCESS) 1f370: 8b a9 ldd r24, Y+51 ; 0x33 1f372: 87 30 cpi r24, 0x07 ; 7 1f374: 09 f0 breq .+2 ; 0x1f378 1f376: 37 cf rjmp .-402 ; 0x1f1e6 } /* Now process the STK500 commands, see Atmel Appnote AVR068 */ switch (msgBuffer[0]) 1f378: 8c ad ldd r24, Y+60 ; 0x3c 1f37a: 28 2f mov r18, r24 1f37c: 30 e0 ldi r19, 0x00 ; 0 1f37e: c0 5a subi r28, 0xA0 ; 160 1f380: de 4f sbci r29, 0xFE ; 254 1f382: 39 83 std Y+1, r19 ; 0x01 1f384: 28 83 st Y, r18 1f386: c0 56 subi r28, 0x60 ; 96 1f388: d1 40 sbci r29, 0x01 ; 1 1f38a: c0 5a subi r28, 0xA0 ; 160 1f38c: de 4f sbci r29, 0xFE ; 254 1f38e: 88 81 ld r24, Y 1f390: 99 81 ldd r25, Y+1 ; 0x01 1f392: c0 56 subi r28, 0x60 ; 96 1f394: d1 40 sbci r29, 0x01 ; 1 1f396: 82 31 cpi r24, 0x12 ; 18 1f398: 91 05 cpc r25, r1 1f39a: 09 f4 brne .+2 ; 0x1f39e 1f39c: b0 c1 rjmp .+864 ; 0x1f6fe 1f39e: c0 5a subi r28, 0xA0 ; 160 1f3a0: de 4f sbci r29, 0xFE ; 254 1f3a2: 28 81 ld r18, Y 1f3a4: 39 81 ldd r19, Y+1 ; 0x01 1f3a6: c0 56 subi r28, 0x60 ; 96 1f3a8: d1 40 sbci r29, 0x01 ; 1 1f3aa: 23 31 cpi r18, 0x13 ; 19 1f3ac: 31 05 cpc r19, r1 1f3ae: 0c f0 brlt .+2 ; 0x1f3b2 1f3b0: 47 c0 rjmp .+142 ; 0x1f440 1f3b2: c0 5a subi r28, 0xA0 ; 160 1f3b4: de 4f sbci r29, 0xFE ; 254 1f3b6: 88 81 ld r24, Y 1f3b8: 99 81 ldd r25, Y+1 ; 0x01 1f3ba: c0 56 subi r28, 0x60 ; 96 1f3bc: d1 40 sbci r29, 0x01 ; 1 1f3be: 83 30 cpi r24, 0x03 ; 3 1f3c0: 91 05 cpc r25, r1 1f3c2: 09 f4 brne .+2 ; 0x1f3c6 1f3c4: e7 c0 rjmp .+462 ; 0x1f594 1f3c6: c0 5a subi r28, 0xA0 ; 160 1f3c8: de 4f sbci r29, 0xFE ; 254 1f3ca: 28 81 ld r18, Y 1f3cc: 39 81 ldd r19, Y+1 ; 0x01 1f3ce: c0 56 subi r28, 0x60 ; 96 1f3d0: d1 40 sbci r29, 0x01 ; 1 1f3d2: 24 30 cpi r18, 0x04 ; 4 1f3d4: 31 05 cpc r19, r1 1f3d6: ac f4 brge .+42 ; 0x1f402 1f3d8: c0 5a subi r28, 0xA0 ; 160 1f3da: de 4f sbci r29, 0xFE ; 254 1f3dc: 88 81 ld r24, Y 1f3de: 99 81 ldd r25, Y+1 ; 0x01 1f3e0: c0 56 subi r28, 0x60 ; 96 1f3e2: d1 40 sbci r29, 0x01 ; 1 1f3e4: 81 30 cpi r24, 0x01 ; 1 1f3e6: 91 05 cpc r25, r1 1f3e8: 09 f4 brne .+2 ; 0x1f3ec 1f3ea: a7 c0 rjmp .+334 ; 0x1f53a 1f3ec: c0 5a subi r28, 0xA0 ; 160 1f3ee: de 4f sbci r29, 0xFE ; 254 1f3f0: 28 81 ld r18, Y 1f3f2: 39 81 ldd r19, Y+1 ; 0x01 1f3f4: c0 56 subi r28, 0x60 ; 96 1f3f6: d1 40 sbci r29, 0x01 ; 1 1f3f8: 22 30 cpi r18, 0x02 ; 2 1f3fa: 31 05 cpc r19, r1 1f3fc: 09 f4 brne .+2 ; 0x1f400 1f3fe: 21 c1 rjmp .+578 ; 0x1f642 1f400: f0 c2 rjmp .+1504 ; 0x1f9e2 1f402: c0 5a subi r28, 0xA0 ; 160 1f404: de 4f sbci r29, 0xFE ; 254 1f406: 88 81 ld r24, Y 1f408: 99 81 ldd r25, Y+1 ; 0x01 1f40a: c0 56 subi r28, 0x60 ; 96 1f40c: d1 40 sbci r29, 0x01 ; 1 1f40e: 86 30 cpi r24, 0x06 ; 6 1f410: 91 05 cpc r25, r1 1f412: 09 f4 brne .+2 ; 0x1f416 1f414: 96 c1 rjmp .+812 ; 0x1f742 1f416: c0 5a subi r28, 0xA0 ; 160 1f418: de 4f sbci r29, 0xFE ; 254 1f41a: 28 81 ld r18, Y 1f41c: 39 81 ldd r19, Y+1 ; 0x01 1f41e: c0 56 subi r28, 0x60 ; 96 1f420: d1 40 sbci r29, 0x01 ; 1 1f422: 26 30 cpi r18, 0x06 ; 6 1f424: 31 05 cpc r19, r1 1f426: 0c f4 brge .+2 ; 0x1f42a 1f428: dc c2 rjmp .+1464 ; 0x1f9e2 1f42a: c0 5a subi r28, 0xA0 ; 160 1f42c: de 4f sbci r29, 0xFE ; 254 1f42e: 88 81 ld r24, Y 1f430: 99 81 ldd r25, Y+1 ; 0x01 1f432: c0 56 subi r28, 0x60 ; 96 1f434: d1 40 sbci r29, 0x01 ; 1 1f436: 80 31 cpi r24, 0x10 ; 16 1f438: 91 05 cpc r25, r1 1f43a: 0c f4 brge .+2 ; 0x1f43e 1f43c: d2 c2 rjmp .+1444 ; 0x1f9e2 1f43e: 01 c1 rjmp .+514 ; 0x1f642 1f440: c0 5a subi r28, 0xA0 ; 160 1f442: de 4f sbci r29, 0xFE ; 254 1f444: 28 81 ld r18, Y 1f446: 39 81 ldd r19, Y+1 ; 0x01 1f448: c0 56 subi r28, 0x60 ; 96 1f44a: d1 40 sbci r29, 0x01 ; 1 1f44c: 28 31 cpi r18, 0x18 ; 24 1f44e: 31 05 cpc r19, r1 1f450: 09 f4 brne .+2 ; 0x1f454 1f452: 29 c1 rjmp .+594 ; 0x1f6a6 1f454: c0 5a subi r28, 0xA0 ; 160 1f456: de 4f sbci r29, 0xFE ; 254 1f458: 88 81 ld r24, Y 1f45a: 99 81 ldd r25, Y+1 ; 0x01 1f45c: c0 56 subi r28, 0x60 ; 96 1f45e: d1 40 sbci r29, 0x01 ; 1 1f460: 89 31 cpi r24, 0x19 ; 25 1f462: 91 05 cpc r25, r1 1f464: ac f4 brge .+42 ; 0x1f490 1f466: c0 5a subi r28, 0xA0 ; 160 1f468: de 4f sbci r29, 0xFE ; 254 1f46a: 28 81 ld r18, Y 1f46c: 39 81 ldd r19, Y+1 ; 0x01 1f46e: c0 56 subi r28, 0x60 ; 96 1f470: d1 40 sbci r29, 0x01 ; 1 1f472: 23 31 cpi r18, 0x13 ; 19 1f474: 31 05 cpc r19, r1 1f476: 09 f4 brne .+2 ; 0x1f47a 1f478: a0 c1 rjmp .+832 ; 0x1f7ba 1f47a: c0 5a subi r28, 0xA0 ; 160 1f47c: de 4f sbci r29, 0xFE ; 254 1f47e: 88 81 ld r24, Y 1f480: 99 81 ldd r25, Y+1 ; 0x01 1f482: c0 56 subi r28, 0x60 ; 96 1f484: d1 40 sbci r29, 0x01 ; 1 1f486: 84 31 cpi r24, 0x14 ; 20 1f488: 91 05 cpc r25, r1 1f48a: 09 f4 brne .+2 ; 0x1f48e 1f48c: 3f c2 rjmp .+1150 ; 0x1f90c 1f48e: a9 c2 rjmp .+1362 ; 0x1f9e2 1f490: c0 5a subi r28, 0xA0 ; 160 1f492: de 4f sbci r29, 0xFE ; 254 1f494: 28 81 ld r18, Y 1f496: 39 81 ldd r19, Y+1 ; 0x01 1f498: c0 56 subi r28, 0x60 ; 96 1f49a: d1 40 sbci r29, 0x01 ; 1 1f49c: 2b 31 cpi r18, 0x1B ; 27 1f49e: 31 05 cpc r19, r1 1f4a0: 09 f4 brne .+2 ; 0x1f4a4 1f4a2: d5 c0 rjmp .+426 ; 0x1f64e 1f4a4: c0 5a subi r28, 0xA0 ; 160 1f4a6: de 4f sbci r29, 0xFE ; 254 1f4a8: 88 81 ld r24, Y 1f4aa: 99 81 ldd r25, Y+1 ; 0x01 1f4ac: c0 56 subi r28, 0x60 ; 96 1f4ae: d1 40 sbci r29, 0x01 ; 1 1f4b0: 8d 31 cpi r24, 0x1D ; 29 1f4b2: 91 05 cpc r25, r1 1f4b4: 59 f0 breq .+22 ; 0x1f4cc 1f4b6: c0 5a subi r28, 0xA0 ; 160 1f4b8: de 4f sbci r29, 0xFE ; 254 1f4ba: 28 81 ld r18, Y 1f4bc: 39 81 ldd r19, Y+1 ; 0x01 1f4be: c0 56 subi r28, 0x60 ; 96 1f4c0: d1 40 sbci r29, 0x01 ; 1 1f4c2: 2a 31 cpi r18, 0x1A ; 26 1f4c4: 31 05 cpc r19, r1 1f4c6: 09 f4 brne .+2 ; 0x1f4ca 1f4c8: de c0 rjmp .+444 ; 0x1f686 1f4ca: 8b c2 rjmp .+1302 ; 0x1f9e2 { #ifndef REMOVE_CMD_SPI_MULTI case CMD_SPI_MULTI: { unsigned char answerByte = 0; 1f4cc: 1f a2 std Y+39, r1 ; 0x27 // only Read Signature Bytes implemented, return dummy value for other instructions if (msgBuffer[4]== 0x30) 1f4ce: fe 01 movw r30, r28 1f4d0: e0 5c subi r30, 0xC0 ; 192 1f4d2: ff 4f sbci r31, 0xFF ; 255 1f4d4: 80 81 ld r24, Z 1f4d6: 80 33 cpi r24, 0x30 ; 48 1f4d8: 99 f4 brne .+38 ; 0x1f500 { unsigned char signatureIndex = msgBuffer[6]; 1f4da: fe 01 movw r30, r28 1f4dc: ee 5b subi r30, 0xBE ; 190 1f4de: ff 4f sbci r31, 0xFF ; 255 1f4e0: 80 81 ld r24, Z 1f4e2: 8e a3 std Y+38, r24 ; 0x26 if (signatureIndex == 0) 1f4e4: 8e a1 ldd r24, Y+38 ; 0x26 1f4e6: 88 23 and r24, r24 1f4e8: 19 f4 brne .+6 ; 0x1f4f0 answerByte = (SIGNATURE_BYTES >>16) & 0x000000FF; 1f4ea: 8e e1 ldi r24, 0x1E ; 30 1f4ec: 8f a3 std Y+39, r24 ; 0x27 1f4ee: 08 c0 rjmp .+16 ; 0x1f500 else if ( signatureIndex == 1 ) 1f4f0: 8e a1 ldd r24, Y+38 ; 0x26 1f4f2: 81 30 cpi r24, 0x01 ; 1 1f4f4: 19 f4 brne .+6 ; 0x1f4fc answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; 1f4f6: 87 e9 ldi r24, 0x97 ; 151 1f4f8: 8f a3 std Y+39, r24 ; 0x27 1f4fa: 02 c0 rjmp .+4 ; 0x1f500 else answerByte = SIGNATURE_BYTES & 0x000000FF; 1f4fc: 84 e0 ldi r24, 0x04 ; 4 1f4fe: 8f a3 std Y+39, r24 ; 0x27 } msgLength = 7; 1f500: 87 e0 ldi r24, 0x07 ; 7 1f502: 90 e0 ldi r25, 0x00 ; 0 1f504: 9e a7 std Y+46, r25 ; 0x2e 1f506: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f508: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = 0; 1f50a: 1e ae std Y+62, r1 ; 0x3e msgBuffer[3] = msgBuffer[4]; // Instruction Byte 1 1f50c: fe 01 movw r30, r28 1f50e: e0 5c subi r30, 0xC0 ; 192 1f510: ff 4f sbci r31, 0xFF ; 255 1f512: 80 81 ld r24, Z 1f514: 8f af std Y+63, r24 ; 0x3f msgBuffer[4] = msgBuffer[5]; // Instruction Byte 2 1f516: fe 01 movw r30, r28 1f518: ef 5b subi r30, 0xBF ; 191 1f51a: ff 4f sbci r31, 0xFF ; 255 1f51c: 80 81 ld r24, Z 1f51e: fe 01 movw r30, r28 1f520: e0 5c subi r30, 0xC0 ; 192 1f522: ff 4f sbci r31, 0xFF ; 255 1f524: 80 83 st Z, r24 msgBuffer[5] = answerByte; 1f526: fe 01 movw r30, r28 1f528: ef 5b subi r30, 0xBF ; 191 1f52a: ff 4f sbci r31, 0xFF ; 255 1f52c: 8f a1 ldd r24, Y+39 ; 0x27 1f52e: 80 83 st Z, r24 msgBuffer[6] = STATUS_CMD_OK; 1f530: fe 01 movw r30, r28 1f532: ee 5b subi r30, 0xBE ; 190 1f534: ff 4f sbci r31, 0xFF ; 255 1f536: 10 82 st Z, r1 1f538: 5a c2 rjmp .+1204 ; 0x1f9ee } break; #endif case CMD_SIGN_ON: msgLength = 11; 1f53a: 8b e0 ldi r24, 0x0B ; 11 1f53c: 90 e0 ldi r25, 0x00 ; 0 1f53e: 9e a7 std Y+46, r25 ; 0x2e 1f540: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f542: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = 8; 1f544: 88 e0 ldi r24, 0x08 ; 8 1f546: 8e af std Y+62, r24 ; 0x3e msgBuffer[3] = 'A'; 1f548: 81 e4 ldi r24, 0x41 ; 65 1f54a: 8f af std Y+63, r24 ; 0x3f msgBuffer[4] = 'V'; 1f54c: 86 e5 ldi r24, 0x56 ; 86 1f54e: fe 01 movw r30, r28 1f550: e0 5c subi r30, 0xC0 ; 192 1f552: ff 4f sbci r31, 0xFF ; 255 1f554: 80 83 st Z, r24 msgBuffer[5] = 'R'; 1f556: fe 01 movw r30, r28 1f558: ef 5b subi r30, 0xBF ; 191 1f55a: ff 4f sbci r31, 0xFF ; 255 1f55c: 82 e5 ldi r24, 0x52 ; 82 1f55e: 80 83 st Z, r24 msgBuffer[6] = 'I'; 1f560: fe 01 movw r30, r28 1f562: ee 5b subi r30, 0xBE ; 190 1f564: ff 4f sbci r31, 0xFF ; 255 1f566: 89 e4 ldi r24, 0x49 ; 73 1f568: 80 83 st Z, r24 msgBuffer[7] = 'S'; 1f56a: fe 01 movw r30, r28 1f56c: ed 5b subi r30, 0xBD ; 189 1f56e: ff 4f sbci r31, 0xFF ; 255 1f570: 83 e5 ldi r24, 0x53 ; 83 1f572: 80 83 st Z, r24 msgBuffer[8] = 'P'; 1f574: fe 01 movw r30, r28 1f576: ec 5b subi r30, 0xBC ; 188 1f578: ff 4f sbci r31, 0xFF ; 255 1f57a: 80 e5 ldi r24, 0x50 ; 80 1f57c: 80 83 st Z, r24 msgBuffer[9] = '_'; 1f57e: fe 01 movw r30, r28 1f580: eb 5b subi r30, 0xBB ; 187 1f582: ff 4f sbci r31, 0xFF ; 255 1f584: 8f e5 ldi r24, 0x5F ; 95 1f586: 80 83 st Z, r24 msgBuffer[10] = '2'; 1f588: fe 01 movw r30, r28 1f58a: ea 5b subi r30, 0xBA ; 186 1f58c: ff 4f sbci r31, 0xFF ; 255 1f58e: 82 e3 ldi r24, 0x32 ; 50 1f590: 80 83 st Z, r24 1f592: 2d c2 rjmp .+1114 ; 0x1f9ee case CMD_GET_PARAMETER: { unsigned char value; switch(msgBuffer[1]) 1f594: 8d ad ldd r24, Y+61 ; 0x3d 1f596: 28 2f mov r18, r24 1f598: 30 e0 ldi r19, 0x00 ; 0 1f59a: c2 5a subi r28, 0xA2 ; 162 1f59c: de 4f sbci r29, 0xFE ; 254 1f59e: 39 83 std Y+1, r19 ; 0x01 1f5a0: 28 83 st Y, r18 1f5a2: ce 55 subi r28, 0x5E ; 94 1f5a4: d1 40 sbci r29, 0x01 ; 1 1f5a6: c2 5a subi r28, 0xA2 ; 162 1f5a8: de 4f sbci r29, 0xFE ; 254 1f5aa: 88 81 ld r24, Y 1f5ac: 99 81 ldd r25, Y+1 ; 0x01 1f5ae: ce 55 subi r28, 0x5E ; 94 1f5b0: d1 40 sbci r29, 0x01 ; 1 1f5b2: 80 39 cpi r24, 0x90 ; 144 1f5b4: 91 05 cpc r25, r1 1f5b6: 99 f1 breq .+102 ; 0x1f61e 1f5b8: c2 5a subi r28, 0xA2 ; 162 1f5ba: de 4f sbci r29, 0xFE ; 254 1f5bc: 28 81 ld r18, Y 1f5be: 39 81 ldd r19, Y+1 ; 0x01 1f5c0: ce 55 subi r28, 0x5E ; 94 1f5c2: d1 40 sbci r29, 0x01 ; 1 1f5c4: 21 39 cpi r18, 0x91 ; 145 1f5c6: 31 05 cpc r19, r1 1f5c8: 9c f4 brge .+38 ; 0x1f5f0 1f5ca: c2 5a subi r28, 0xA2 ; 162 1f5cc: de 4f sbci r29, 0xFE ; 254 1f5ce: 88 81 ld r24, Y 1f5d0: 99 81 ldd r25, Y+1 ; 0x01 1f5d2: ce 55 subi r28, 0x5E ; 94 1f5d4: d1 40 sbci r29, 0x01 ; 1 1f5d6: 80 38 cpi r24, 0x80 ; 128 1f5d8: 91 05 cpc r25, r1 1f5da: e9 f0 breq .+58 ; 0x1f616 1f5dc: c2 5a subi r28, 0xA2 ; 162 1f5de: de 4f sbci r29, 0xFE ; 254 1f5e0: 28 81 ld r18, Y 1f5e2: 39 81 ldd r19, Y+1 ; 0x01 1f5e4: ce 55 subi r28, 0x5E ; 94 1f5e6: d1 40 sbci r29, 0x01 ; 1 1f5e8: 21 38 cpi r18, 0x81 ; 129 1f5ea: 31 05 cpc r19, r1 1f5ec: b1 f0 breq .+44 ; 0x1f61a 1f5ee: 20 c0 rjmp .+64 ; 0x1f630 1f5f0: c2 5a subi r28, 0xA2 ; 162 1f5f2: de 4f sbci r29, 0xFE ; 254 1f5f4: 88 81 ld r24, Y 1f5f6: 99 81 ldd r25, Y+1 ; 0x01 1f5f8: ce 55 subi r28, 0x5E ; 94 1f5fa: d1 40 sbci r29, 0x01 ; 1 1f5fc: 81 39 cpi r24, 0x91 ; 145 1f5fe: 91 05 cpc r25, r1 1f600: 89 f0 breq .+34 ; 0x1f624 1f602: c2 5a subi r28, 0xA2 ; 162 1f604: de 4f sbci r29, 0xFE ; 254 1f606: 28 81 ld r18, Y 1f608: 39 81 ldd r19, Y+1 ; 0x01 1f60a: ce 55 subi r28, 0x5E ; 94 1f60c: d1 40 sbci r29, 0x01 ; 1 1f60e: 22 39 cpi r18, 0x92 ; 146 1f610: 31 05 cpc r19, r1 1f612: 59 f0 breq .+22 ; 0x1f62a 1f614: 0d c0 rjmp .+26 ; 0x1f630 { case PARAM_BUILD_NUMBER_LOW: value = CONFIG_PARAM_BUILD_NUMBER_LOW; 1f616: 1d a2 std Y+37, r1 ; 0x25 1f618: 0c c0 rjmp .+24 ; 0x1f632 break; case PARAM_BUILD_NUMBER_HIGH: value = CONFIG_PARAM_BUILD_NUMBER_HIGH; 1f61a: 1d a2 std Y+37, r1 ; 0x25 1f61c: 0a c0 rjmp .+20 ; 0x1f632 break; case PARAM_HW_VER: value = CONFIG_PARAM_HW_VER; 1f61e: 8f e0 ldi r24, 0x0F ; 15 1f620: 8d a3 std Y+37, r24 ; 0x25 1f622: 07 c0 rjmp .+14 ; 0x1f632 break; case PARAM_SW_MAJOR: value = CONFIG_PARAM_SW_MAJOR; 1f624: 82 e0 ldi r24, 0x02 ; 2 1f626: 8d a3 std Y+37, r24 ; 0x25 1f628: 04 c0 rjmp .+8 ; 0x1f632 break; case PARAM_SW_MINOR: value = CONFIG_PARAM_SW_MINOR; 1f62a: 8a e0 ldi r24, 0x0A ; 10 1f62c: 8d a3 std Y+37, r24 ; 0x25 1f62e: 01 c0 rjmp .+2 ; 0x1f632 break; default: value = 0; 1f630: 1d a2 std Y+37, r1 ; 0x25 break; } msgLength = 3; 1f632: 83 e0 ldi r24, 0x03 ; 3 1f634: 90 e0 ldi r25, 0x00 ; 0 1f636: 9e a7 std Y+46, r25 ; 0x2e 1f638: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f63a: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = value; 1f63c: 8d a1 ldd r24, Y+37 ; 0x25 1f63e: 8e af std Y+62, r24 ; 0x3e 1f640: d6 c1 rjmp .+940 ; 0x1f9ee break; case CMD_SET_PARAMETER: case CMD_ENTER_PROGMODE_ISP: case CMD_LEAVE_PROGMODE_ISP: msgLength = 2; 1f642: 82 e0 ldi r24, 0x02 ; 2 1f644: 90 e0 ldi r25, 0x00 ; 0 1f646: 9e a7 std Y+46, r25 ; 0x2e 1f648: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f64a: 1d ae std Y+61, r1 ; 0x3d 1f64c: d0 c1 rjmp .+928 ; 0x1f9ee break; case CMD_READ_SIGNATURE_ISP: { unsigned char signatureIndex = msgBuffer[4]; 1f64e: fe 01 movw r30, r28 1f650: e0 5c subi r30, 0xC0 ; 192 1f652: ff 4f sbci r31, 0xFF ; 255 1f654: 80 81 ld r24, Z 1f656: 8c a3 std Y+36, r24 ; 0x24 unsigned char signature; if ( signatureIndex == 0 ) 1f658: 8c a1 ldd r24, Y+36 ; 0x24 1f65a: 88 23 and r24, r24 1f65c: 19 f4 brne .+6 ; 0x1f664 signature = (SIGNATURE_BYTES >>16) & 0x000000FF; 1f65e: 8e e1 ldi r24, 0x1E ; 30 1f660: 8b a3 std Y+35, r24 ; 0x23 1f662: 08 c0 rjmp .+16 ; 0x1f674 else if ( signatureIndex == 1 ) 1f664: 8c a1 ldd r24, Y+36 ; 0x24 1f666: 81 30 cpi r24, 0x01 ; 1 1f668: 19 f4 brne .+6 ; 0x1f670 signature = (SIGNATURE_BYTES >> 8) & 0x000000FF; 1f66a: 87 e9 ldi r24, 0x97 ; 151 1f66c: 8b a3 std Y+35, r24 ; 0x23 1f66e: 02 c0 rjmp .+4 ; 0x1f674 else signature = SIGNATURE_BYTES & 0x000000FF; 1f670: 84 e0 ldi r24, 0x04 ; 4 1f672: 8b a3 std Y+35, r24 ; 0x23 msgLength = 4; 1f674: 84 e0 ldi r24, 0x04 ; 4 1f676: 90 e0 ldi r25, 0x00 ; 0 1f678: 9e a7 std Y+46, r25 ; 0x2e 1f67a: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f67c: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = signature; 1f67e: 8b a1 ldd r24, Y+35 ; 0x23 1f680: 8e af std Y+62, r24 ; 0x3e msgBuffer[3] = STATUS_CMD_OK; 1f682: 1f ae std Y+63, r1 ; 0x3f 1f684: b4 c1 rjmp .+872 ; 0x1f9ee } break; case CMD_READ_LOCK_ISP: msgLength = 4; 1f686: 84 e0 ldi r24, 0x04 ; 4 1f688: 90 e0 ldi r25, 0x00 ; 0 1f68a: 9e a7 std Y+46, r25 ; 0x2e 1f68c: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f68e: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS ); 1f690: 89 e0 ldi r24, 0x09 ; 9 1f692: e1 e0 ldi r30, 0x01 ; 1 1f694: f0 e0 ldi r31, 0x00 ; 0 1f696: 80 93 57 00 sts 0x0057, r24 1f69a: 84 91 lpm r24, Z+ 1f69c: 8a a3 std Y+34, r24 ; 0x22 1f69e: 8a a1 ldd r24, Y+34 ; 0x22 1f6a0: 8e af std Y+62, r24 ; 0x3e msgBuffer[3] = STATUS_CMD_OK; 1f6a2: 1f ae std Y+63, r1 ; 0x3f 1f6a4: a4 c1 rjmp .+840 ; 0x1f9ee case CMD_READ_FUSE_ISP: { unsigned char fuseBits; if (msgBuffer[2] == 0x50) 1f6a6: 8e ad ldd r24, Y+62 ; 0x3e 1f6a8: 80 35 cpi r24, 0x50 ; 80 1f6aa: b9 f4 brne .+46 ; 0x1f6da { if ( msgBuffer[3] == 0x08 ) 1f6ac: 8f ad ldd r24, Y+63 ; 0x3f 1f6ae: 88 30 cpi r24, 0x08 ; 8 1f6b0: 51 f4 brne .+20 ; 0x1f6c6 fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS ); 1f6b2: 89 e0 ldi r24, 0x09 ; 9 1f6b4: e2 e0 ldi r30, 0x02 ; 2 1f6b6: f0 e0 ldi r31, 0x00 ; 0 1f6b8: 80 93 57 00 sts 0x0057, r24 1f6bc: 84 91 lpm r24, Z+ 1f6be: 88 a3 std Y+32, r24 ; 0x20 1f6c0: 88 a1 ldd r24, Y+32 ; 0x20 1f6c2: 89 a3 std Y+33, r24 ; 0x21 1f6c4: 13 c0 rjmp .+38 ; 0x1f6ec else fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS ); 1f6c6: 89 e0 ldi r24, 0x09 ; 9 1f6c8: e0 e0 ldi r30, 0x00 ; 0 1f6ca: f0 e0 ldi r31, 0x00 ; 0 1f6cc: 80 93 57 00 sts 0x0057, r24 1f6d0: 84 91 lpm r24, Z+ 1f6d2: 8f 8f std Y+31, r24 ; 0x1f 1f6d4: 8f 8d ldd r24, Y+31 ; 0x1f 1f6d6: 89 a3 std Y+33, r24 ; 0x21 1f6d8: 09 c0 rjmp .+18 ; 0x1f6ec } else fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS ); 1f6da: 89 e0 ldi r24, 0x09 ; 9 1f6dc: e3 e0 ldi r30, 0x03 ; 3 1f6de: f0 e0 ldi r31, 0x00 ; 0 1f6e0: 80 93 57 00 sts 0x0057, r24 1f6e4: 84 91 lpm r24, Z+ 1f6e6: 8e 8f std Y+30, r24 ; 0x1e 1f6e8: 8e 8d ldd r24, Y+30 ; 0x1e 1f6ea: 89 a3 std Y+33, r24 ; 0x21 msgLength = 4; 1f6ec: 84 e0 ldi r24, 0x04 ; 4 1f6ee: 90 e0 ldi r25, 0x00 ; 0 1f6f0: 9e a7 std Y+46, r25 ; 0x2e 1f6f2: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f6f4: 1d ae std Y+61, r1 ; 0x3d msgBuffer[2] = fuseBits; 1f6f6: 89 a1 ldd r24, Y+33 ; 0x21 1f6f8: 8e af std Y+62, r24 ; 0x3e msgBuffer[3] = STATUS_CMD_OK; 1f6fa: 1f ae std Y+63, r1 ; 0x3f 1f6fc: 78 c1 rjmp .+752 ; 0x1f9ee } break; case CMD_CHIP_ERASE_ISP: eraseAddress = 0; 1f6fe: 1c aa std Y+52, r1 ; 0x34 1f700: 1d aa std Y+53, r1 ; 0x35 1f702: 1e aa std Y+54, r1 ; 0x36 1f704: 1f aa std Y+55, r1 ; 0x37 boot_page_erase(eraseAddress); // Erase the first page so that AVR will stay 1f706: 23 e0 ldi r18, 0x03 ; 3 1f708: 8c a9 ldd r24, Y+52 ; 0x34 1f70a: 9d a9 ldd r25, Y+53 ; 0x35 1f70c: ae a9 ldd r26, Y+54 ; 0x36 1f70e: bf a9 ldd r27, Y+55 ; 0x37 1f710: fc 01 movw r30, r24 1f712: a0 93 5b 00 sts 0x005B, r26 1f716: 20 93 57 00 sts 0x0057, r18 1f71a: e8 95 spm boot_spm_busy_wait(); // in Bootlaoder until Flash is programmed again 1f71c: e7 e5 ldi r30, 0x57 ; 87 1f71e: f0 e0 ldi r31, 0x00 ; 0 1f720: 80 81 ld r24, Z 1f722: 88 2f mov r24, r24 1f724: 90 e0 ldi r25, 0x00 ; 0 1f726: 81 70 andi r24, 0x01 ; 1 1f728: 90 70 andi r25, 0x00 ; 0 1f72a: 88 23 and r24, r24 1f72c: b9 f7 brne .-18 ; 0x1f71c boot_rww_enable(); 1f72e: 81 e1 ldi r24, 0x11 ; 17 1f730: 80 93 57 00 sts 0x0057, r24 1f734: e8 95 spm msgLength = 2; 1f736: 82 e0 ldi r24, 0x02 ; 2 1f738: 90 e0 ldi r25, 0x00 ; 0 1f73a: 9e a7 std Y+46, r25 ; 0x2e 1f73c: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f73e: 1d ae std Y+61, r1 ; 0x3d 1f740: 56 c1 rjmp .+684 ; 0x1f9ee break; case CMD_LOAD_ADDRESS: #if defined(RAMPZ) address = ( ((address_t)(msgBuffer[1])<<24)|((address_t)(msgBuffer[2])<<16)|((address_t)(msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; 1f742: 8d ad ldd r24, Y+61 ; 0x3d 1f744: 88 2f mov r24, r24 1f746: 90 e0 ldi r25, 0x00 ; 0 1f748: a0 e0 ldi r26, 0x00 ; 0 1f74a: b0 e0 ldi r27, 0x00 ; 0 1f74c: 58 2f mov r21, r24 1f74e: 44 27 eor r20, r20 1f750: 33 27 eor r19, r19 1f752: 22 27 eor r18, r18 1f754: 8e ad ldd r24, Y+62 ; 0x3e 1f756: 88 2f mov r24, r24 1f758: 90 e0 ldi r25, 0x00 ; 0 1f75a: a0 e0 ldi r26, 0x00 ; 0 1f75c: b0 e0 ldi r27, 0x00 ; 0 1f75e: dc 01 movw r26, r24 1f760: 99 27 eor r25, r25 1f762: 88 27 eor r24, r24 1f764: 28 2b or r18, r24 1f766: 39 2b or r19, r25 1f768: 4a 2b or r20, r26 1f76a: 5b 2b or r21, r27 1f76c: 8f ad ldd r24, Y+63 ; 0x3f 1f76e: 88 2f mov r24, r24 1f770: 90 e0 ldi r25, 0x00 ; 0 1f772: a0 e0 ldi r26, 0x00 ; 0 1f774: b0 e0 ldi r27, 0x00 ; 0 1f776: ba 2f mov r27, r26 1f778: a9 2f mov r26, r25 1f77a: 98 2f mov r25, r24 1f77c: 88 27 eor r24, r24 1f77e: 28 2b or r18, r24 1f780: 39 2b or r19, r25 1f782: 4a 2b or r20, r26 1f784: 5b 2b or r21, r27 1f786: fe 01 movw r30, r28 1f788: e0 5c subi r30, 0xC0 ; 192 1f78a: ff 4f sbci r31, 0xFF ; 255 1f78c: 80 81 ld r24, Z 1f78e: 88 2f mov r24, r24 1f790: 90 e0 ldi r25, 0x00 ; 0 1f792: a0 e0 ldi r26, 0x00 ; 0 1f794: b0 e0 ldi r27, 0x00 ; 0 1f796: 82 2b or r24, r18 1f798: 93 2b or r25, r19 1f79a: a4 2b or r26, r20 1f79c: b5 2b or r27, r21 1f79e: 88 0f add r24, r24 1f7a0: 99 1f adc r25, r25 1f7a2: aa 1f adc r26, r26 1f7a4: bb 1f adc r27, r27 1f7a6: 88 af std Y+56, r24 ; 0x38 1f7a8: 99 af std Y+57, r25 ; 0x39 1f7aa: aa af std Y+58, r26 ; 0x3a 1f7ac: bb af std Y+59, r27 ; 0x3b #else address = ( ((msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; //convert word to byte address #endif msgLength = 2; 1f7ae: 82 e0 ldi r24, 0x02 ; 2 1f7b0: 90 e0 ldi r25, 0x00 ; 0 1f7b2: 9e a7 std Y+46, r25 ; 0x2e 1f7b4: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f7b6: 1d ae std Y+61, r1 ; 0x3d 1f7b8: 1a c1 rjmp .+564 ; 0x1f9ee break; case CMD_PROGRAM_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 1f7ba: 8d ad ldd r24, Y+61 ; 0x3d 1f7bc: 88 2f mov r24, r24 1f7be: 90 e0 ldi r25, 0x00 ; 0 1f7c0: 38 2f mov r19, r24 1f7c2: 22 27 eor r18, r18 1f7c4: 8e ad ldd r24, Y+62 ; 0x3e 1f7c6: 88 2f mov r24, r24 1f7c8: 90 e0 ldi r25, 0x00 ; 0 1f7ca: 82 2b or r24, r18 1f7cc: 93 2b or r25, r19 1f7ce: 9d 8f std Y+29, r25 ; 0x1d 1f7d0: 8c 8f std Y+28, r24 ; 0x1c unsigned char *p = msgBuffer+10; 1f7d2: ce 01 movw r24, r28 1f7d4: cc 96 adiw r24, 0x3c ; 60 1f7d6: 0a 96 adiw r24, 0x0a ; 10 1f7d8: 9b 8f std Y+27, r25 ; 0x1b 1f7da: 8a 8f std Y+26, r24 ; 0x1a unsigned int data; unsigned char highByte, lowByte; address_t tempaddress = address; 1f7dc: 88 ad ldd r24, Y+56 ; 0x38 1f7de: 99 ad ldd r25, Y+57 ; 0x39 1f7e0: aa ad ldd r26, Y+58 ; 0x3a 1f7e2: bb ad ldd r27, Y+59 ; 0x3b 1f7e4: 8a 8b std Y+18, r24 ; 0x12 1f7e6: 9b 8b std Y+19, r25 ; 0x13 1f7e8: ac 8b std Y+20, r26 ; 0x14 1f7ea: bd 8b std Y+21, r27 ; 0x15 if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP ) 1f7ec: 8c ad ldd r24, Y+60 ; 0x3c 1f7ee: 83 31 cpi r24, 0x13 ; 19 1f7f0: 09 f0 breq .+2 ; 0x1f7f4 1f7f2: 86 c0 rjmp .+268 ; 0x1f900 { if (eraseAddress < APP_END) // erase only main section (bootloader protection) 1f7f4: 8c a9 ldd r24, Y+52 ; 0x34 1f7f6: 9d a9 ldd r25, Y+53 ; 0x35 1f7f8: ae a9 ldd r26, Y+54 ; 0x36 1f7fa: bf a9 ldd r27, Y+55 ; 0x37 1f7fc: 80 30 cpi r24, 0x00 ; 0 1f7fe: 30 ef ldi r19, 0xF0 ; 240 1f800: 93 07 cpc r25, r19 1f802: 31 e0 ldi r19, 0x01 ; 1 1f804: a3 07 cpc r26, r19 1f806: 30 e0 ldi r19, 0x00 ; 0 1f808: b3 07 cpc r27, r19 1f80a: 00 f5 brcc .+64 ; 0x1f84c { boot_page_erase(eraseAddress); // Perform page erase 1f80c: 23 e0 ldi r18, 0x03 ; 3 1f80e: 8c a9 ldd r24, Y+52 ; 0x34 1f810: 9d a9 ldd r25, Y+53 ; 0x35 1f812: ae a9 ldd r26, Y+54 ; 0x36 1f814: bf a9 ldd r27, Y+55 ; 0x37 1f816: fc 01 movw r30, r24 1f818: a0 93 5b 00 sts 0x005B, r26 1f81c: 20 93 57 00 sts 0x0057, r18 1f820: e8 95 spm boot_spm_busy_wait(); // Wait until the memory is erased. 1f822: e7 e5 ldi r30, 0x57 ; 87 1f824: f0 e0 ldi r31, 0x00 ; 0 1f826: 80 81 ld r24, Z 1f828: 88 2f mov r24, r24 1f82a: 90 e0 ldi r25, 0x00 ; 0 1f82c: 81 70 andi r24, 0x01 ; 1 1f82e: 90 70 andi r25, 0x00 ; 0 1f830: 88 23 and r24, r24 1f832: b9 f7 brne .-18 ; 0x1f822 eraseAddress += SPM_PAGESIZE; // point to next page to be erase 1f834: 8c a9 ldd r24, Y+52 ; 0x34 1f836: 9d a9 ldd r25, Y+53 ; 0x35 1f838: ae a9 ldd r26, Y+54 ; 0x36 1f83a: bf a9 ldd r27, Y+55 ; 0x37 1f83c: 80 50 subi r24, 0x00 ; 0 1f83e: 9f 4f sbci r25, 0xFF ; 255 1f840: af 4f sbci r26, 0xFF ; 255 1f842: bf 4f sbci r27, 0xFF ; 255 1f844: 8c ab std Y+52, r24 ; 0x34 1f846: 9d ab std Y+53, r25 ; 0x35 1f848: ae ab std Y+54, r26 ; 0x36 1f84a: bf ab std Y+55, r27 ; 0x37 } /* Write FLASH */ do { lowByte = *p++; 1f84c: ea 8d ldd r30, Y+26 ; 0x1a 1f84e: fb 8d ldd r31, Y+27 ; 0x1b 1f850: 80 81 ld r24, Z 1f852: 8e 8b std Y+22, r24 ; 0x16 1f854: 8a 8d ldd r24, Y+26 ; 0x1a 1f856: 9b 8d ldd r25, Y+27 ; 0x1b 1f858: 01 96 adiw r24, 0x01 ; 1 1f85a: 9b 8f std Y+27, r25 ; 0x1b 1f85c: 8a 8f std Y+26, r24 ; 0x1a highByte = *p++; 1f85e: ea 8d ldd r30, Y+26 ; 0x1a 1f860: fb 8d ldd r31, Y+27 ; 0x1b 1f862: 80 81 ld r24, Z 1f864: 8f 8b std Y+23, r24 ; 0x17 1f866: 8a 8d ldd r24, Y+26 ; 0x1a 1f868: 9b 8d ldd r25, Y+27 ; 0x1b 1f86a: 01 96 adiw r24, 0x01 ; 1 1f86c: 9b 8f std Y+27, r25 ; 0x1b 1f86e: 8a 8f std Y+26, r24 ; 0x1a data = (highByte << 8) | lowByte; 1f870: 8f 89 ldd r24, Y+23 ; 0x17 1f872: 88 2f mov r24, r24 1f874: 90 e0 ldi r25, 0x00 ; 0 1f876: 38 2f mov r19, r24 1f878: 22 27 eor r18, r18 1f87a: 8e 89 ldd r24, Y+22 ; 0x16 1f87c: 88 2f mov r24, r24 1f87e: 90 e0 ldi r25, 0x00 ; 0 1f880: 82 2b or r24, r18 1f882: 93 2b or r25, r19 1f884: 99 8f std Y+25, r25 ; 0x19 1f886: 88 8f std Y+24, r24 ; 0x18 boot_page_fill(address,data); 1f888: 41 e0 ldi r20, 0x01 ; 1 1f88a: 88 ad ldd r24, Y+56 ; 0x38 1f88c: 99 ad ldd r25, Y+57 ; 0x39 1f88e: aa ad ldd r26, Y+58 ; 0x3a 1f890: bb ad ldd r27, Y+59 ; 0x3b 1f892: 28 8d ldd r18, Y+24 ; 0x18 1f894: 39 8d ldd r19, Y+25 ; 0x19 1f896: 09 01 movw r0, r18 1f898: fc 01 movw r30, r24 1f89a: a0 93 5b 00 sts 0x005B, r26 1f89e: 40 93 57 00 sts 0x0057, r20 1f8a2: e8 95 spm 1f8a4: 11 24 eor r1, r1 address = address + 2; // Select next word in memory 1f8a6: 88 ad ldd r24, Y+56 ; 0x38 1f8a8: 99 ad ldd r25, Y+57 ; 0x39 1f8aa: aa ad ldd r26, Y+58 ; 0x3a 1f8ac: bb ad ldd r27, Y+59 ; 0x3b 1f8ae: 02 96 adiw r24, 0x02 ; 2 1f8b0: a1 1d adc r26, r1 1f8b2: b1 1d adc r27, r1 1f8b4: 88 af std Y+56, r24 ; 0x38 1f8b6: 99 af std Y+57, r25 ; 0x39 1f8b8: aa af std Y+58, r26 ; 0x3a 1f8ba: bb af std Y+59, r27 ; 0x3b size -= 2; // Reduce number of bytes to write by two 1f8bc: 8c 8d ldd r24, Y+28 ; 0x1c 1f8be: 9d 8d ldd r25, Y+29 ; 0x1d 1f8c0: 02 97 sbiw r24, 0x02 ; 2 1f8c2: 9d 8f std Y+29, r25 ; 0x1d 1f8c4: 8c 8f std Y+28, r24 ; 0x1c } while(size); // Loop until all bytes written 1f8c6: 8c 8d ldd r24, Y+28 ; 0x1c 1f8c8: 9d 8d ldd r25, Y+29 ; 0x1d 1f8ca: 00 97 sbiw r24, 0x00 ; 0 1f8cc: 09 f0 breq .+2 ; 0x1f8d0 1f8ce: be cf rjmp .-132 ; 0x1f84c boot_page_write(tempaddress); 1f8d0: 25 e0 ldi r18, 0x05 ; 5 1f8d2: 8a 89 ldd r24, Y+18 ; 0x12 1f8d4: 9b 89 ldd r25, Y+19 ; 0x13 1f8d6: ac 89 ldd r26, Y+20 ; 0x14 1f8d8: bd 89 ldd r27, Y+21 ; 0x15 1f8da: fc 01 movw r30, r24 1f8dc: a0 93 5b 00 sts 0x005B, r26 1f8e0: 20 93 57 00 sts 0x0057, r18 1f8e4: e8 95 spm boot_spm_busy_wait(); 1f8e6: e7 e5 ldi r30, 0x57 ; 87 1f8e8: f0 e0 ldi r31, 0x00 ; 0 1f8ea: 80 81 ld r24, Z 1f8ec: 88 2f mov r24, r24 1f8ee: 90 e0 ldi r25, 0x00 ; 0 1f8f0: 81 70 andi r24, 0x01 ; 1 1f8f2: 90 70 andi r25, 0x00 ; 0 1f8f4: 88 23 and r24, r24 1f8f6: b9 f7 brne .-18 ; 0x1f8e6 boot_rww_enable(); // Re-enable the RWW section 1f8f8: 81 e1 ldi r24, 0x11 ; 17 1f8fa: 80 93 57 00 sts 0x0057, r24 1f8fe: e8 95 spm } msgLength = 2; 1f900: 82 e0 ldi r24, 0x02 ; 2 1f902: 90 e0 ldi r25, 0x00 ; 0 1f904: 9e a7 std Y+46, r25 ; 0x2e 1f906: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_OK; 1f908: 1d ae std Y+61, r1 ; 0x3d 1f90a: 71 c0 rjmp .+226 ; 0x1f9ee } break; case CMD_READ_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 1f90c: 8d ad ldd r24, Y+61 ; 0x3d 1f90e: 88 2f mov r24, r24 1f910: 90 e0 ldi r25, 0x00 ; 0 1f912: 38 2f mov r19, r24 1f914: 22 27 eor r18, r18 1f916: 8e ad ldd r24, Y+62 ; 0x3e 1f918: 88 2f mov r24, r24 1f91a: 90 e0 ldi r25, 0x00 ; 0 1f91c: 82 2b or r24, r18 1f91e: 93 2b or r25, r19 1f920: 99 8b std Y+17, r25 ; 0x11 1f922: 88 8b std Y+16, r24 ; 0x10 unsigned char *p = msgBuffer+1; 1f924: ce 01 movw r24, r28 1f926: cc 96 adiw r24, 0x3c ; 60 1f928: 01 96 adiw r24, 0x01 ; 1 1f92a: 9f 87 std Y+15, r25 ; 0x0f 1f92c: 8e 87 std Y+14, r24 ; 0x0e msgLength = size+3; 1f92e: 88 89 ldd r24, Y+16 ; 0x10 1f930: 99 89 ldd r25, Y+17 ; 0x11 1f932: 03 96 adiw r24, 0x03 ; 3 1f934: 9e a7 std Y+46, r25 ; 0x2e 1f936: 8d a7 std Y+45, r24 ; 0x2d *p++ = STATUS_CMD_OK; 1f938: ee 85 ldd r30, Y+14 ; 0x0e 1f93a: ff 85 ldd r31, Y+15 ; 0x0f 1f93c: 10 82 st Z, r1 1f93e: 8e 85 ldd r24, Y+14 ; 0x0e 1f940: 9f 85 ldd r25, Y+15 ; 0x0f 1f942: 01 96 adiw r24, 0x01 ; 1 1f944: 9f 87 std Y+15, r25 ; 0x0f 1f946: 8e 87 std Y+14, r24 ; 0x0e if (msgBuffer[0] == CMD_READ_FLASH_ISP ) 1f948: 8c ad ldd r24, Y+60 ; 0x3c 1f94a: 84 31 cpi r24, 0x14 ; 20 1f94c: 09 f0 breq .+2 ; 0x1f950 1f94e: 40 c0 rjmp .+128 ; 0x1f9d0 unsigned int data; /* Read FLASH */ do { #if defined(RAMPZ) data = pgm_read_word_far(address); 1f950: 88 ad ldd r24, Y+56 ; 0x38 1f952: 99 ad ldd r25, Y+57 ; 0x39 1f954: aa ad ldd r26, Y+58 ; 0x3a 1f956: bb ad ldd r27, Y+59 ; 0x3b 1f958: 88 87 std Y+8, r24 ; 0x08 1f95a: 99 87 std Y+9, r25 ; 0x09 1f95c: aa 87 std Y+10, r26 ; 0x0a 1f95e: bb 87 std Y+11, r27 ; 0x0b 1f960: 88 85 ldd r24, Y+8 ; 0x08 1f962: 99 85 ldd r25, Y+9 ; 0x09 1f964: aa 85 ldd r26, Y+10 ; 0x0a 1f966: bb 85 ldd r27, Y+11 ; 0x0b 1f968: ab bf out 0x3b, r26 ; 59 1f96a: fc 01 movw r30, r24 1f96c: 87 91 elpm r24, Z+ 1f96e: 96 91 elpm r25, Z+ 1f970: 9f 83 std Y+7, r25 ; 0x07 1f972: 8e 83 std Y+6, r24 ; 0x06 1f974: 8e 81 ldd r24, Y+6 ; 0x06 1f976: 9f 81 ldd r25, Y+7 ; 0x07 1f978: 9d 87 std Y+13, r25 ; 0x0d 1f97a: 8c 87 std Y+12, r24 ; 0x0c #else data = pgm_read_word_near(address); #endif *p++ = (unsigned char)data; //LSB 1f97c: 8c 85 ldd r24, Y+12 ; 0x0c 1f97e: ee 85 ldd r30, Y+14 ; 0x0e 1f980: ff 85 ldd r31, Y+15 ; 0x0f 1f982: 80 83 st Z, r24 1f984: 8e 85 ldd r24, Y+14 ; 0x0e 1f986: 9f 85 ldd r25, Y+15 ; 0x0f 1f988: 01 96 adiw r24, 0x01 ; 1 1f98a: 9f 87 std Y+15, r25 ; 0x0f 1f98c: 8e 87 std Y+14, r24 ; 0x0e *p++ = (unsigned char)(data >> 8); //MSB 1f98e: 8c 85 ldd r24, Y+12 ; 0x0c 1f990: 9d 85 ldd r25, Y+13 ; 0x0d 1f992: 89 2f mov r24, r25 1f994: 99 27 eor r25, r25 1f996: ee 85 ldd r30, Y+14 ; 0x0e 1f998: ff 85 ldd r31, Y+15 ; 0x0f 1f99a: 80 83 st Z, r24 1f99c: 8e 85 ldd r24, Y+14 ; 0x0e 1f99e: 9f 85 ldd r25, Y+15 ; 0x0f 1f9a0: 01 96 adiw r24, 0x01 ; 1 1f9a2: 9f 87 std Y+15, r25 ; 0x0f 1f9a4: 8e 87 std Y+14, r24 ; 0x0e address += 2; // Select next word in memory 1f9a6: 88 ad ldd r24, Y+56 ; 0x38 1f9a8: 99 ad ldd r25, Y+57 ; 0x39 1f9aa: aa ad ldd r26, Y+58 ; 0x3a 1f9ac: bb ad ldd r27, Y+59 ; 0x3b 1f9ae: 02 96 adiw r24, 0x02 ; 2 1f9b0: a1 1d adc r26, r1 1f9b2: b1 1d adc r27, r1 1f9b4: 88 af std Y+56, r24 ; 0x38 1f9b6: 99 af std Y+57, r25 ; 0x39 1f9b8: aa af std Y+58, r26 ; 0x3a 1f9ba: bb af std Y+59, r27 ; 0x3b size -= 2; 1f9bc: 88 89 ldd r24, Y+16 ; 0x10 1f9be: 99 89 ldd r25, Y+17 ; 0x11 1f9c0: 02 97 sbiw r24, 0x02 ; 2 1f9c2: 99 8b std Y+17, r25 ; 0x11 1f9c4: 88 8b std Y+16, r24 ; 0x10 }while (size); 1f9c6: 88 89 ldd r24, Y+16 ; 0x10 1f9c8: 99 89 ldd r25, Y+17 ; 0x11 1f9ca: 00 97 sbiw r24, 0x00 ; 0 1f9cc: 09 f0 breq .+2 ; 0x1f9d0 1f9ce: c0 cf rjmp .-128 ; 0x1f950 } *p++ = STATUS_CMD_OK; 1f9d0: ee 85 ldd r30, Y+14 ; 0x0e 1f9d2: ff 85 ldd r31, Y+15 ; 0x0f 1f9d4: 10 82 st Z, r1 1f9d6: 8e 85 ldd r24, Y+14 ; 0x0e 1f9d8: 9f 85 ldd r25, Y+15 ; 0x0f 1f9da: 01 96 adiw r24, 0x01 ; 1 1f9dc: 9f 87 std Y+15, r25 ; 0x0f 1f9de: 8e 87 std Y+14, r24 ; 0x0e 1f9e0: 06 c0 rjmp .+12 ; 0x1f9ee } break; default: msgLength = 2; 1f9e2: 82 e0 ldi r24, 0x02 ; 2 1f9e4: 90 e0 ldi r25, 0x00 ; 0 1f9e6: 9e a7 std Y+46, r25 ; 0x2e 1f9e8: 8d a7 std Y+45, r24 ; 0x2d msgBuffer[1] = STATUS_CMD_FAILED; 1f9ea: 80 ec ldi r24, 0xC0 ; 192 1f9ec: 8d af std Y+61, r24 ; 0x3d break; } /* Now send answer message back */ sendchar(MESSAGE_START); 1f9ee: 8b e1 ldi r24, 0x1B ; 27 1f9f0: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum = MESSAGE_START^0; 1f9f4: 8b e1 ldi r24, 0x1B ; 27 1f9f6: 88 ab std Y+48, r24 ; 0x30 sendchar(seqNum); 1f9f8: 8f a5 ldd r24, Y+47 ; 0x2f 1f9fa: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum ^= seqNum; 1f9fe: 98 a9 ldd r25, Y+48 ; 0x30 1fa00: 8f a5 ldd r24, Y+47 ; 0x2f 1fa02: 89 27 eor r24, r25 1fa04: 88 ab std Y+48, r24 ; 0x30 c = ((msgLength>>8)&0xFF); 1fa06: 8d a5 ldd r24, Y+45 ; 0x2d 1fa08: 9e a5 ldd r25, Y+46 ; 0x2e 1fa0a: 89 2f mov r24, r25 1fa0c: 99 27 eor r25, r25 1fa0e: 8c a7 std Y+44, r24 ; 0x2c sendchar(c); 1fa10: 8c a5 ldd r24, Y+44 ; 0x2c 1fa12: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum ^= c; 1fa16: 98 a9 ldd r25, Y+48 ; 0x30 1fa18: 8c a5 ldd r24, Y+44 ; 0x2c 1fa1a: 89 27 eor r24, r25 1fa1c: 88 ab std Y+48, r24 ; 0x30 c = msgLength & 0x00FF; 1fa1e: 8d a5 ldd r24, Y+45 ; 0x2d 1fa20: 8c a7 std Y+44, r24 ; 0x2c sendchar(c); 1fa22: 8c a5 ldd r24, Y+44 ; 0x2c 1fa24: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum ^= c; 1fa28: 98 a9 ldd r25, Y+48 ; 0x30 1fa2a: 8c a5 ldd r24, Y+44 ; 0x2c 1fa2c: 89 27 eor r24, r25 1fa2e: 88 ab std Y+48, r24 ; 0x30 sendchar(TOKEN); 1fa30: 8e e0 ldi r24, 0x0E ; 14 1fa32: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum ^= TOKEN; 1fa36: 98 a9 ldd r25, Y+48 ; 0x30 1fa38: 8e e0 ldi r24, 0x0E ; 14 1fa3a: 89 27 eor r24, r25 1fa3c: 88 ab std Y+48, r24 ; 0x30 p = msgBuffer; 1fa3e: ce 01 movw r24, r28 1fa40: cc 96 adiw r24, 0x3c ; 60 1fa42: 9b a7 std Y+43, r25 ; 0x2b 1fa44: 8a a7 std Y+42, r24 ; 0x2a 1fa46: 15 c0 rjmp .+42 ; 0x1fa72 while (msgLength) { sendchar(*p); 1fa48: ea a5 ldd r30, Y+42 ; 0x2a 1fa4a: fb a5 ldd r31, Y+43 ; 0x2b 1fa4c: 80 81 ld r24, Z 1fa4e: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c checksum ^=*p++; 1fa52: ea a5 ldd r30, Y+42 ; 0x2a 1fa54: fb a5 ldd r31, Y+43 ; 0x2b 1fa56: 90 81 ld r25, Z 1fa58: 88 a9 ldd r24, Y+48 ; 0x30 1fa5a: 89 27 eor r24, r25 1fa5c: 88 ab std Y+48, r24 ; 0x30 1fa5e: 8a a5 ldd r24, Y+42 ; 0x2a 1fa60: 9b a5 ldd r25, Y+43 ; 0x2b 1fa62: 01 96 adiw r24, 0x01 ; 1 1fa64: 9b a7 std Y+43, r25 ; 0x2b 1fa66: 8a a7 std Y+42, r24 ; 0x2a msgLength--; 1fa68: 8d a5 ldd r24, Y+45 ; 0x2d 1fa6a: 9e a5 ldd r25, Y+46 ; 0x2e 1fa6c: 01 97 sbiw r24, 0x01 ; 1 1fa6e: 9e a7 std Y+46, r25 ; 0x2e 1fa70: 8d a7 std Y+45, r24 ; 0x2d sendchar(TOKEN); checksum ^= TOKEN; p = msgBuffer; while (msgLength) 1fa72: 8d a5 ldd r24, Y+45 ; 0x2d 1fa74: 9e a5 ldd r25, Y+46 ; 0x2e 1fa76: 00 97 sbiw r24, 0x00 ; 0 1fa78: 39 f7 brne .-50 ; 0x1fa48 { sendchar(*p); checksum ^=*p++; msgLength--; } sendchar(checksum); 1fa7a: 88 a9 ldd r24, Y+48 ; 0x30 1fa7c: 0e 94 b6 fd call 0x1fb6c ; 0x1fb6c seqNum++; 1fa80: 8f a5 ldd r24, Y+47 ; 0x2f 1fa82: 8f 5f subi r24, 0xFF ; 255 1fa84: 8f a7 std Y+47, r24 ; 0x2f uint16_t volatile j=0; 1fa86: fe 01 movw r30, r28 1fa88: e7 5a subi r30, 0xA7 ; 167 1fa8a: fe 4f sbci r31, 0xFE ; 254 1fa8c: 11 82 std Z+1, r1 ; 0x01 1fa8e: 10 82 st Z, r1 1fa90: 66 c0 rjmp .+204 ; 0x1fb5e while(!newDataAvailable()) { if(j++>20000) 1fa92: fe 01 movw r30, r28 1fa94: e7 5a subi r30, 0xA7 ; 167 1fa96: fe 4f sbci r31, 0xFE ; 254 1fa98: 80 81 ld r24, Z 1fa9a: 91 81 ldd r25, Z+1 ; 0x01 1fa9c: c4 5a subi r28, 0xA4 ; 164 1fa9e: de 4f sbci r29, 0xFE ; 254 1faa0: 99 83 std Y+1, r25 ; 0x01 1faa2: 88 83 st Y, r24 1faa4: cc 55 subi r28, 0x5C ; 92 1faa6: d1 40 sbci r29, 0x01 ; 1 1faa8: c5 5a subi r28, 0xA5 ; 165 1faaa: de 4f sbci r29, 0xFE ; 254 1faac: 18 82 st Y, r1 1faae: cb 55 subi r28, 0x5B ; 91 1fab0: d1 40 sbci r29, 0x01 ; 1 1fab2: c4 5a subi r28, 0xA4 ; 164 1fab4: de 4f sbci r29, 0xFE ; 254 1fab6: 28 81 ld r18, Y 1fab8: 39 81 ldd r19, Y+1 ; 0x01 1faba: cc 55 subi r28, 0x5C ; 92 1fabc: d1 40 sbci r29, 0x01 ; 1 1fabe: 8e e4 ldi r24, 0x4E ; 78 1fac0: 21 32 cpi r18, 0x21 ; 33 1fac2: 38 07 cpc r19, r24 1fac4: 30 f0 brcs .+12 ; 0x1fad2 1fac6: 91 e0 ldi r25, 0x01 ; 1 1fac8: c5 5a subi r28, 0xA5 ; 165 1faca: de 4f sbci r29, 0xFE ; 254 1facc: 98 83 st Y, r25 1face: cb 55 subi r28, 0x5B ; 91 1fad0: d1 40 sbci r29, 0x01 ; 1 1fad2: c4 5a subi r28, 0xA4 ; 164 1fad4: de 4f sbci r29, 0xFE ; 254 1fad6: 88 81 ld r24, Y 1fad8: 99 81 ldd r25, Y+1 ; 0x01 1fada: cc 55 subi r28, 0x5C ; 92 1fadc: d1 40 sbci r29, 0x01 ; 1 1fade: 01 96 adiw r24, 0x01 ; 1 1fae0: fe 01 movw r30, r28 1fae2: e7 5a subi r30, 0xA7 ; 167 1fae4: fe 4f sbci r31, 0xFE ; 254 1fae6: 91 83 std Z+1, r25 ; 0x01 1fae8: 80 83 st Z, r24 1faea: c5 5a subi r28, 0xA5 ; 165 1faec: de 4f sbci r29, 0xFE ; 254 1faee: 28 81 ld r18, Y 1faf0: cb 55 subi r28, 0x5B ; 91 1faf2: d1 40 sbci r29, 0x01 ; 1 1faf4: 22 23 and r18, r18 1faf6: 51 f1 breq .+84 ; 0x1fb4c { if(pgm_read_word(0x0000) != 0xFFFF) 1faf8: 1d 82 std Y+5, r1 ; 0x05 1fafa: 1c 82 std Y+4, r1 ; 0x04 1fafc: 8c 81 ldd r24, Y+4 ; 0x04 1fafe: 9d 81 ldd r25, Y+5 ; 0x05 1fb00: fc 01 movw r30, r24 1fb02: 85 91 lpm r24, Z+ 1fb04: 94 91 lpm r25, Z+ 1fb06: 9b 83 std Y+3, r25 ; 0x03 1fb08: 8a 83 std Y+2, r24 ; 0x02 1fb0a: fd 83 std Y+5, r31 ; 0x05 1fb0c: ec 83 std Y+4, r30 ; 0x04 1fb0e: 8a 81 ldd r24, Y+2 ; 0x02 1fb10: 9b 81 ldd r25, Y+3 ; 0x03 1fb12: 3f ef ldi r19, 0xFF ; 255 1fb14: 8f 3f cpi r24, 0xFF ; 255 1fb16: 93 07 cpc r25, r19 1fb18: 61 f0 breq .+24 ; 0x1fb32 { wdt_enable(WDTO_15MS); 1fb1a: 88 e1 ldi r24, 0x18 ; 24 1fb1c: 90 e0 ldi r25, 0x00 ; 0 1fb1e: 28 e0 ldi r18, 0x08 ; 8 1fb20: 0f b6 in r0, 0x3f ; 63 1fb22: f8 94 cli 1fb24: a8 95 wdr 1fb26: 80 93 60 00 sts 0x0060, r24 1fb2a: 0f be out 0x3f, r0 ; 63 1fb2c: 20 93 60 00 sts 0x0060, r18 1fb30: ff cf rjmp .-2 ; 0x1fb30 while(1); } else { j=0; 1fb32: fe 01 movw r30, r28 1fb34: e7 5a subi r30, 0xA7 ; 167 1fb36: fe 4f sbci r31, 0xFE ; 254 1fb38: 11 82 std Z+1, r1 ; 0x01 1fb3a: 10 82 st Z, r1 PORTG ^= (1 << PG5); 1fb3c: a4 e3 ldi r26, 0x34 ; 52 1fb3e: b0 e0 ldi r27, 0x00 ; 0 1fb40: e4 e3 ldi r30, 0x34 ; 52 1fb42: f0 e0 ldi r31, 0x00 ; 0 1fb44: 90 81 ld r25, Z 1fb46: 80 e2 ldi r24, 0x20 ; 32 1fb48: 89 27 eor r24, r25 1fb4a: 8c 93 st X, r24 } } for(uint8_t i=0;i<50;i++) asm volatile("nop"); 1fb4c: 19 82 std Y+1, r1 ; 0x01 1fb4e: 04 c0 rjmp .+8 ; 0x1fb58 1fb50: 00 00 nop 1fb52: 89 81 ldd r24, Y+1 ; 0x01 1fb54: 8f 5f subi r24, 0xFF ; 255 1fb56: 89 83 std Y+1, r24 ; 0x01 1fb58: 89 81 ldd r24, Y+1 ; 0x01 1fb5a: 82 33 cpi r24, 0x32 ; 50 1fb5c: c8 f3 brcs .-14 ; 0x1fb50 sendchar(checksum); seqNum++; uint16_t volatile j=0; while(!newDataAvailable()) 1fb5e: e0 ec ldi r30, 0xC0 ; 192 1fb60: f0 e0 ldi r31, 0x00 ; 0 1fb62: 80 81 ld r24, Z 1fb64: 88 23 and r24, r24 1fb66: 0c f0 brlt .+2 ; 0x1fb6a 1fb68: 94 cf rjmp .-216 ; 0x1fa92 1fb6a: 32 cb rjmp .-2460 ; 0x1f1d0 0001fb6c : #include "communication.h" /* send single byte to USART, wait until transmission is completed */ void sendchar(char c) { 1fb6c: df 93 push r29 1fb6e: cf 93 push r28 1fb70: 0f 92 push r0 1fb72: cd b7 in r28, 0x3d ; 61 1fb74: de b7 in r29, 0x3e ; 62 1fb76: 89 83 std Y+1, r24 ; 0x01 while (!( UART_STATUS_REG & (1< ; /* Put data into buffer, sends the data */ UART_DATA_REG = c; 1fb8a: e6 ec ldi r30, 0xC6 ; 198 1fb8c: f0 e0 ldi r31, 0x00 ; 0 1fb8e: 89 81 ldd r24, Y+1 ; 0x01 1fb90: 80 83 st Z, r24 } 1fb92: 0f 90 pop r0 1fb94: cf 91 pop r28 1fb96: df 91 pop r29 1fb98: 08 95 ret 0001fb9a : /* Read single byte from USART, block if no data available */ unsigned char recchar(void) { 1fb9a: df 93 push r29 1fb9c: cf 93 push r28 1fb9e: cd b7 in r28, 0x3d ; 61 1fba0: de b7 in r29, 0x3e ; 62 while(!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE))); // wait for data 1fba2: e0 ec ldi r30, 0xC0 ; 192 1fba4: f0 e0 ldi r31, 0x00 ; 0 1fba6: 80 81 ld r24, Z 1fba8: 88 23 and r24, r24 1fbaa: dc f7 brge .-10 ; 0x1fba2 return UART_DATA_REG; 1fbac: e6 ec ldi r30, 0xC6 ; 198 1fbae: f0 e0 ldi r31, 0x00 ; 0 1fbb0: 80 81 ld r24, Z } 1fbb2: cf 91 pop r28 1fbb4: df 91 pop r29 1fbb6: 08 95 ret 0001fbb8 <_exit>: 1fbb8: f8 94 cli 0001fbba <__stop_program>: 1fbba: ff cf rjmp .-2 ; 0x1fbba <__stop_program>