Bootloader1281.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 000006d2 0001f000 0001f000 00000094 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .noinit 0000012d 00801000 00801000 00000766 2**0 ALLOC 2 .bss 00000002 00801500 00801500 00000766 2**0 ALLOC 3 .debug_aranges 00000048 00000000 00000000 00000766 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_pubnames 0000008a 00000000 00000000 000007ae 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_info 000004d3 00000000 00000000 00000838 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_abbrev 000001aa 00000000 00000000 00000d0b 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_line 0000056a 00000000 00000000 00000eb5 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_frame 00000060 00000000 00000000 00001420 2**2 CONTENTS, READONLY, DEBUGGING 9 .debug_str 000001ce 00000000 00000000 00001480 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_loc 00000625 00000000 00000000 0000164e 2**0 CONTENTS, READONLY, DEBUGGING 11 .debug_ranges 00000020 00000000 00000000 00001c73 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 0001f000 <__vectors>: 1f000: 0c 94 66 f8 jmp 0x1f0cc ; 0x1f0cc 1f004: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f008: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f00c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f010: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f014: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f018: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f01c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f020: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f024: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f028: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f02c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f030: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f034: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f038: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f03c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f040: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f044: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f048: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f04c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f050: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f054: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f058: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f05c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f060: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f064: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f068: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f06c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f070: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f074: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f078: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f07c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f080: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f084: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f088: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f08c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f090: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f094: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f098: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f09c: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0a0: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0a4: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0a8: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0ac: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0b0: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0b4: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0b8: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0bc: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0c0: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0c4: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 1f0c8: 0c 94 a4 f8 jmp 0x1f148 ; 0x1f148 <__bad_interrupt> 0001f0cc : void (*reset)( void ) = 0x0000; void initBootloader(void) __attribute__ ((naked)) __attribute__ ((section (".init0"))); void initBootloader(void) { 1f0cc: 8f ef ldi r24, 0xFF ; 255 1f0ce: 83 bb out 0x13, r24 ; 19 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 1f104: 1f 92 push r1 1f106: 1f 92 push r1 1f108: 08 95 ret 1f10a: 11 24 eor r1, r1 1f10c: 1f be out 0x3f, r1 ; 63 1f10e: cf ef ldi r28, 0xFF ; 255 1f110: d1 e2 ldi r29, 0x21 ; 33 1f112: de bf out 0x3e, r29 ; 62 1f114: cd bf out 0x3d, r28 ; 61 0001f116 <__do_copy_data>: 1f116: 15 e1 ldi r17, 0x15 ; 21 1f118: a0 e0 ldi r26, 0x00 ; 0 1f11a: b5 e1 ldi r27, 0x15 ; 21 1f11c: e2 ed ldi r30, 0xD2 ; 210 1f11e: f6 ef ldi r31, 0xF6 ; 246 1f120: 01 e0 ldi r16, 0x01 ; 1 1f122: 0b bf out 0x3b, r16 ; 59 1f124: 02 c0 rjmp .+4 ; 0x1f12a <__do_copy_data+0x14> 1f126: 07 90 elpm r0, Z+ 1f128: 0d 92 st X+, r0 1f12a: a0 30 cpi r26, 0x00 ; 0 1f12c: b1 07 cpc r27, r17 1f12e: d9 f7 brne .-10 ; 0x1f126 <__do_copy_data+0x10> 0001f130 <__do_clear_bss>: 1f130: 15 e1 ldi r17, 0x15 ; 21 1f132: a0 e0 ldi r26, 0x00 ; 0 1f134: b5 e1 ldi r27, 0x15 ; 21 1f136: 01 c0 rjmp .+2 ; 0x1f13a <.do_clear_bss_start> 0001f138 <.do_clear_bss_loop>: 1f138: 1d 92 st X+, r1 0001f13a <.do_clear_bss_start>: 1f13a: a2 30 cpi r26, 0x02 ; 2 1f13c: b1 07 cpc r27, r17 1f13e: e1 f7 brne .-8 ; 0x1f138 <.do_clear_bss_loop> 1f140: 0e 94 a6 f8 call 0x1f14c ; 0x1f14c
1f144: 0c 94 67 fb jmp 0x1f6ce ; 0x1f6ce <_exit> 0001f148 <__bad_interrupt>: 1f148: 0c 94 00 f8 jmp 0x1f000 ; 0x1f000 <__vectors> 0001f14c
: } int main(void) { 1f14c: 2f 92 push r2 1f14e: 3f 92 push r3 1f150: 4f 92 push r4 1f152: 5f 92 push r5 1f154: 6f 92 push r6 1f156: 7f 92 push r7 1f158: 8f 92 push r8 1f15a: 9f 92 push r9 1f15c: af 92 push r10 1f15e: bf 92 push r11 1f160: cf 92 push r12 1f162: df 92 push r13 1f164: ef 92 push r14 1f166: ff 92 push r15 1f168: 0f 93 push r16 1f16a: 1f 93 push r17 1f16c: df 93 push r29 1f16e: cf 93 push r28 1f170: cd b7 in r28, 0x3d ; 61 1f172: de b7 in r29, 0x3e ; 62 1f174: cb 52 subi r28, 0x2B ; 43 1f176: d1 40 sbci r29, 0x01 ; 1 1f178: 0f b6 in r0, 0x3f ; 63 1f17a: f8 94 cli 1f17c: de bf out 0x3e, r29 ; 62 1f17e: 0f be out 0x3f, r0 ; 63 1f180: cd bf out 0x3d, r28 ; 61 unsigned char msgBuffer[285]; unsigned char c, *p; uint16_t baud = ((FC_CPU+(BAUD*8L))/(BAUD*16L)-1); UBRR0H = (unsigned char)(baud>>8); 1f182: 10 92 c5 00 sts 0x00C5, r1 UBRR0L = (unsigned char)baud; 1f186: 88 e0 ldi r24, 0x08 ; 8 1f188: 80 93 c4 00 sts 0x00C4, r24 UCSR0B = ((1<20000) { if(pgm_read_word(0x0000) != 0xFFFF) 1f1b0: f1 01 movw r30, r2 1f1b2: 25 91 lpm r18, Z+ 1f1b4: 34 91 lpm r19, Z+ 1f1b6: c6 5d subi r28, 0xD6 ; 214 1f1b8: de 4f sbci r29, 0xFE ; 254 1f1ba: 39 83 std Y+1, r19 ; 0x01 1f1bc: 28 83 st Y, r18 1f1be: ca 52 subi r28, 0x2A ; 42 1f1c0: d1 40 sbci r29, 0x01 ; 1 /* main loop */ for(;;) { /* Collect received bytes to a complete message */ if(statusbyte == MESSAGE_START) 1f1c2: 80 91 00 10 lds r24, 0x1000 1f1c6: 8b 31 cpi r24, 0x1B ; 27 1f1c8: 11 f0 breq .+4 ; 0x1f1ce 1f1ca: 10 e0 ldi r17, 0x00 ; 0 1f1cc: 03 c0 rjmp .+6 ; 0x1f1d4 { msgParseState = ST_PROCESS; statusbyte = 0; 1f1ce: 10 92 00 10 sts 0x1000, r1 1f1d2: 17 e0 ldi r17, 0x07 ; 7 1f1d4: ee 24 eor r14, r14 1f1d6: ff 24 eor r15, r15 1f1d8: 49 c0 rjmp .+146 ; 0x1f26c else msgParseState = ST_START; while (msgParseState != ST_PROCESS) { c = recchar(); 1f1da: 0e 94 60 fb call 0x1f6c0 ; 0x1f6c0 1f1de: 28 2f mov r18, r24 switch (msgParseState) 1f1e0: 13 30 cpi r17, 0x03 ; 3 1f1e2: 09 f1 breq .+66 ; 0x1f226 1f1e4: 14 30 cpi r17, 0x04 ; 4 1f1e6: 28 f4 brcc .+10 ; 0x1f1f2 1f1e8: 11 30 cpi r17, 0x01 ; 1 1f1ea: 81 f0 breq .+32 ; 0x1f20c 1f1ec: 12 30 cpi r17, 0x02 ; 2 1f1ee: b0 f4 brcc .+44 ; 0x1f21c 1f1f0: 07 c0 rjmp .+14 ; 0x1f200 1f1f2: 15 30 cpi r17, 0x05 ; 5 1f1f4: 29 f1 breq .+74 ; 0x1f240 1f1f6: 15 30 cpi r17, 0x05 ; 5 1f1f8: e0 f0 brcs .+56 ; 0x1f232 1f1fa: 16 30 cpi r17, 0x06 ; 6 1f1fc: 71 f7 brne .-36 ; 0x1f1da 1f1fe: 32 c0 rjmp .+100 ; 0x1f264 { case ST_START: if(c == MESSAGE_START) 1f200: 8b 31 cpi r24, 0x1B ; 27 1f202: a1 f5 brne .+104 ; 0x1f26c 1f204: 11 e0 ldi r17, 0x01 ; 1 1f206: 0b e1 ldi r16, 0x1B ; 27 1f208: 50 2e mov r5, r16 1f20a: e7 cf rjmp .-50 ; 0x1f1da } break; case ST_GET_SEQ_NUM: if ((c == 1) || (c == seqNum)) 1f20c: 81 30 cpi r24, 0x01 ; 1 1f20e: 11 f0 breq .+4 ; 0x1f214 1f210: 84 15 cp r24, r4 1f212: 51 f5 brne .+84 ; 0x1f268 { seqNum = c; msgParseState = ST_MSG_SIZE_1; checksum ^= c; 1f214: 52 26 eor r5, r18 1f216: 42 2e mov r4, r18 1f218: 12 e0 ldi r17, 0x02 ; 2 1f21a: df cf rjmp .-66 ; 0x1f1da else msgParseState = ST_START; break; case ST_MSG_SIZE_1: msgLength = c<<8; 1f21c: f8 2e mov r15, r24 1f21e: ee 24 eor r14, r14 msgParseState = ST_MSG_SIZE_2; checksum ^= c; 1f220: 58 26 eor r5, r24 1f222: 13 e0 ldi r17, 0x03 ; 3 1f224: da cf rjmp .-76 ; 0x1f1da break; case ST_MSG_SIZE_2: msgLength |= c; 1f226: 90 e0 ldi r25, 0x00 ; 0 1f228: e8 2a or r14, r24 1f22a: f9 2a or r15, r25 msgParseState = ST_GET_TOKEN; checksum ^= c; 1f22c: 52 26 eor r5, r18 1f22e: 14 e0 ldi r17, 0x04 ; 4 1f230: d4 cf rjmp .-88 ; 0x1f1da break; case ST_GET_TOKEN: if (c == TOKEN) 1f232: 8e 30 cpi r24, 0x0E ; 14 1f234: c9 f4 brne .+50 ; 0x1f268 { msgParseState = ST_GET_DATA; checksum ^= c; 1f236: 58 26 eor r5, r24 1f238: 15 e0 ldi r17, 0x05 ; 5 1f23a: 22 24 eor r2, r2 1f23c: 33 24 eor r3, r3 1f23e: cd cf rjmp .-102 ; 0x1f1da else msgParseState = ST_START; break; case ST_GET_DATA: msgBuffer[i++] = c; 1f240: e3 e0 ldi r30, 0x03 ; 3 1f242: f0 e0 ldi r31, 0x00 ; 0 1f244: ec 0f add r30, r28 1f246: fd 1f adc r31, r29 1f248: e2 0d add r30, r2 1f24a: f3 1d adc r31, r3 1f24c: 80 83 st Z, r24 1f24e: 08 94 sec 1f250: 21 1c adc r2, r1 1f252: 31 1c adc r3, r1 checksum ^= c; 1f254: 58 26 eor r5, r24 if (i == msgLength) 1f256: 2e 14 cp r2, r14 1f258: 3f 04 cpc r3, r15 1f25a: 09 f0 breq .+2 ; 0x1f25e 1f25c: be cf rjmp .-132 ; 0x1f1da 1f25e: 71 01 movw r14, r2 1f260: 16 e0 ldi r17, 0x06 ; 6 1f262: bb cf rjmp .-138 ; 0x1f1da msgParseState = ST_GET_CHECK; break; case ST_GET_CHECK: if(c == checksum) 1f264: 85 15 cp r24, r5 1f266: 29 f0 breq .+10 ; 0x1f272 1f268: 10 e0 ldi r17, 0x00 ; 0 1f26a: b7 cf rjmp .-146 ; 0x1f1da } else msgParseState = ST_START; while (msgParseState != ST_PROCESS) 1f26c: 17 30 cpi r17, 0x07 ; 7 1f26e: 09 f0 breq .+2 ; 0x1f272 1f270: b4 cf rjmp .-152 ; 0x1f1da } /* Now process the STK500 commands, see Atmel Appnote AVR068 */ switch (msgBuffer[0]) 1f272: 8b 81 ldd r24, Y+3 ; 0x03 1f274: 82 31 cpi r24, 0x12 ; 18 1f276: 09 f4 brne .+2 ; 0x1f27a 1f278: b1 c0 rjmp .+354 ; 0x1f3dc 1f27a: 83 31 cpi r24, 0x13 ; 19 1f27c: b0 f4 brcc .+44 ; 0x1f2aa 1f27e: 83 30 cpi r24, 0x03 ; 3 1f280: 09 f4 brne .+2 ; 0x1f284 1f282: 5e c0 rjmp .+188 ; 0x1f340 1f284: 84 30 cpi r24, 0x04 ; 4 1f286: 38 f4 brcc .+14 ; 0x1f296 1f288: 81 30 cpi r24, 0x01 ; 1 1f28a: 09 f4 brne .+2 ; 0x1f28e 1f28c: 40 c0 rjmp .+128 ; 0x1f30e 1f28e: 82 30 cpi r24, 0x02 ; 2 1f290: 09 f0 breq .+2 ; 0x1f294 1f292: a9 c1 rjmp .+850 ; 0x1f5e6 1f294: 6b c0 rjmp .+214 ; 0x1f36c 1f296: 86 30 cpi r24, 0x06 ; 6 1f298: 09 f4 brne .+2 ; 0x1f29c 1f29a: be c0 rjmp .+380 ; 0x1f418 1f29c: 86 30 cpi r24, 0x06 ; 6 1f29e: 08 f4 brcc .+2 ; 0x1f2a2 1f2a0: a2 c1 rjmp .+836 ; 0x1f5e6 1f2a2: 80 31 cpi r24, 0x10 ; 16 1f2a4: 08 f4 brcc .+2 ; 0x1f2a8 1f2a6: 9f c1 rjmp .+830 ; 0x1f5e6 1f2a8: 61 c0 rjmp .+194 ; 0x1f36c 1f2aa: 88 31 cpi r24, 0x18 ; 24 1f2ac: 09 f4 brne .+2 ; 0x1f2b0 1f2ae: 7a c0 rjmp .+244 ; 0x1f3a4 1f2b0: 89 31 cpi r24, 0x19 ; 25 1f2b2: 38 f4 brcc .+14 ; 0x1f2c2 1f2b4: 83 31 cpi r24, 0x13 ; 19 1f2b6: 09 f4 brne .+2 ; 0x1f2ba 1f2b8: db c0 rjmp .+438 ; 0x1f470 1f2ba: 84 31 cpi r24, 0x14 ; 20 1f2bc: 09 f0 breq .+2 ; 0x1f2c0 1f2be: 93 c1 rjmp .+806 ; 0x1f5e6 1f2c0: 5b c1 rjmp .+694 ; 0x1f578 1f2c2: 8b 31 cpi r24, 0x1B ; 27 1f2c4: 09 f4 brne .+2 ; 0x1f2c8 1f2c6: 54 c0 rjmp .+168 ; 0x1f370 1f2c8: 8d 31 cpi r24, 0x1D ; 29 1f2ca: 21 f0 breq .+8 ; 0x1f2d4 1f2cc: 8a 31 cpi r24, 0x1A ; 26 1f2ce: 09 f0 breq .+2 ; 0x1f2d2 1f2d0: 8a c1 rjmp .+788 ; 0x1f5e6 1f2d2: 59 c0 rjmp .+178 ; 0x1f386 #ifndef REMOVE_CMD_SPI_MULTI case CMD_SPI_MULTI: { unsigned char answerByte = 0; // only Read Signature Bytes implemented, return dummy value for other instructions if (msgBuffer[4]== 0x30) 1f2d4: 8f 81 ldd r24, Y+7 ; 0x07 1f2d6: 80 33 cpi r24, 0x30 ; 48 1f2d8: 11 f0 breq .+4 ; 0x1f2de 1f2da: 90 e0 ldi r25, 0x00 ; 0 1f2dc: 0a c0 rjmp .+20 ; 0x1f2f2 { unsigned char signatureIndex = msgBuffer[6]; 1f2de: 89 85 ldd r24, Y+9 ; 0x09 if (signatureIndex == 0) 1f2e0: 88 23 and r24, r24 1f2e2: 11 f4 brne .+4 ; 0x1f2e8 1f2e4: 9e e1 ldi r25, 0x1E ; 30 1f2e6: 05 c0 rjmp .+10 ; 0x1f2f2 answerByte = (SIGNATURE_BYTES >>16) & 0x000000FF; else if ( signatureIndex == 1 ) 1f2e8: 81 30 cpi r24, 0x01 ; 1 1f2ea: 11 f0 breq .+4 ; 0x1f2f0 1f2ec: 94 e0 ldi r25, 0x04 ; 4 1f2ee: 01 c0 rjmp .+2 ; 0x1f2f2 1f2f0: 97 e9 ldi r25, 0x97 ; 151 answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; else answerByte = SIGNATURE_BYTES & 0x000000FF; } msgLength = 7; msgBuffer[1] = STATUS_CMD_OK; 1f2f2: 1c 82 std Y+4, r1 ; 0x04 msgBuffer[2] = 0; 1f2f4: 1d 82 std Y+5, r1 ; 0x05 msgBuffer[3] = msgBuffer[4]; // Instruction Byte 1 1f2f6: 8f 81 ldd r24, Y+7 ; 0x07 1f2f8: 8e 83 std Y+6, r24 ; 0x06 msgBuffer[4] = msgBuffer[5]; // Instruction Byte 2 1f2fa: 88 85 ldd r24, Y+8 ; 0x08 1f2fc: 8f 83 std Y+7, r24 ; 0x07 msgBuffer[5] = answerByte; 1f2fe: 98 87 std Y+8, r25 ; 0x08 msgBuffer[6] = STATUS_CMD_OK; 1f300: 19 86 std Y+9, r1 ; 0x09 1f302: 74 01 movw r14, r8 1f304: 63 01 movw r12, r6 1f306: b7 e0 ldi r27, 0x07 ; 7 1f308: ab 2e mov r10, r27 1f30a: b1 2c mov r11, r1 1f30c: 73 c1 rjmp .+742 ; 0x1f5f4 break; #endif case CMD_SIGN_ON: msgLength = 11; msgBuffer[1] = STATUS_CMD_OK; 1f30e: 1c 82 std Y+4, r1 ; 0x04 msgBuffer[2] = 8; 1f310: 88 e0 ldi r24, 0x08 ; 8 1f312: 8d 83 std Y+5, r24 ; 0x05 msgBuffer[3] = 'A'; 1f314: 81 e4 ldi r24, 0x41 ; 65 1f316: 8e 83 std Y+6, r24 ; 0x06 msgBuffer[4] = 'V'; 1f318: 86 e5 ldi r24, 0x56 ; 86 1f31a: 8f 83 std Y+7, r24 ; 0x07 msgBuffer[5] = 'R'; 1f31c: 82 e5 ldi r24, 0x52 ; 82 1f31e: 88 87 std Y+8, r24 ; 0x08 msgBuffer[6] = 'I'; 1f320: 89 e4 ldi r24, 0x49 ; 73 1f322: 89 87 std Y+9, r24 ; 0x09 msgBuffer[7] = 'S'; 1f324: 83 e5 ldi r24, 0x53 ; 83 1f326: 8a 87 std Y+10, r24 ; 0x0a msgBuffer[8] = 'P'; 1f328: 80 e5 ldi r24, 0x50 ; 80 1f32a: 8b 87 std Y+11, r24 ; 0x0b msgBuffer[9] = '_'; 1f32c: 8f e5 ldi r24, 0x5F ; 95 1f32e: 8c 87 std Y+12, r24 ; 0x0c msgBuffer[10] = '2'; 1f330: 82 e3 ldi r24, 0x32 ; 50 1f332: 8d 87 std Y+13, r24 ; 0x0d 1f334: 74 01 movw r14, r8 1f336: 63 01 movw r12, r6 1f338: ab e0 ldi r26, 0x0B ; 11 1f33a: aa 2e mov r10, r26 1f33c: b1 2c mov r11, r1 1f33e: 5a c1 rjmp .+692 ; 0x1f5f4 case CMD_GET_PARAMETER: { unsigned char value; switch(msgBuffer[1]) 1f340: 8c 81 ldd r24, Y+4 ; 0x04 1f342: 81 39 cpi r24, 0x91 ; 145 1f344: 41 f0 breq .+16 ; 0x1f356 1f346: 82 39 cpi r24, 0x92 ; 146 1f348: 41 f0 breq .+16 ; 0x1f35a 1f34a: 80 39 cpi r24, 0x90 ; 144 1f34c: 11 f4 brne .+4 ; 0x1f352 1f34e: 8f e0 ldi r24, 0x0F ; 15 1f350: 05 c0 rjmp .+10 ; 0x1f35c 1f352: 80 e0 ldi r24, 0x00 ; 0 1f354: 03 c0 rjmp .+6 ; 0x1f35c 1f356: 82 e0 ldi r24, 0x02 ; 2 1f358: 01 c0 rjmp .+2 ; 0x1f35c case PARAM_HW_VER: value = CONFIG_PARAM_HW_VER; break; case PARAM_SW_MAJOR: value = CONFIG_PARAM_SW_MAJOR; break; 1f35a: 8a e0 ldi r24, 0x0A ; 10 default: value = 0; break; } msgLength = 3; msgBuffer[1] = STATUS_CMD_OK; 1f35c: 1c 82 std Y+4, r1 ; 0x04 msgBuffer[2] = value; 1f35e: 8d 83 std Y+5, r24 ; 0x05 1f360: 74 01 movw r14, r8 1f362: 63 01 movw r12, r6 1f364: f3 e0 ldi r31, 0x03 ; 3 1f366: af 2e mov r10, r31 1f368: b1 2c mov r11, r1 1f36a: 44 c1 rjmp .+648 ; 0x1f5f4 case CMD_SET_PARAMETER: case CMD_ENTER_PROGMODE_ISP: case CMD_LEAVE_PROGMODE_ISP: msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; 1f36c: 1c 82 std Y+4, r1 ; 0x04 1f36e: 3d c1 rjmp .+634 ; 0x1f5ea break; case CMD_READ_SIGNATURE_ISP: { unsigned char signatureIndex = msgBuffer[4]; 1f370: 8f 81 ldd r24, Y+7 ; 0x07 unsigned char signature; if ( signatureIndex == 0 ) 1f372: 88 23 and r24, r24 1f374: 11 f4 brne .+4 ; 0x1f37a 1f376: 8e e1 ldi r24, 0x1E ; 30 1f378: 2f c0 rjmp .+94 ; 0x1f3d8 signature = (SIGNATURE_BYTES >>16) & 0x000000FF; else if ( signatureIndex == 1 ) 1f37a: 81 30 cpi r24, 0x01 ; 1 1f37c: 11 f0 breq .+4 ; 0x1f382 1f37e: 84 e0 ldi r24, 0x04 ; 4 1f380: 2b c0 rjmp .+86 ; 0x1f3d8 1f382: 87 e9 ldi r24, 0x97 ; 151 1f384: 29 c0 rjmp .+82 ; 0x1f3d8 } break; case CMD_READ_LOCK_ISP: msgLength = 4; msgBuffer[1] = STATUS_CMD_OK; 1f386: 1c 82 std Y+4, r1 ; 0x04 msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS ); 1f388: 89 e0 ldi r24, 0x09 ; 9 1f38a: e1 e0 ldi r30, 0x01 ; 1 1f38c: f0 e0 ldi r31, 0x00 ; 0 1f38e: 80 93 57 00 sts 0x0057, r24 1f392: 84 91 lpm r24, Z+ 1f394: 8d 83 std Y+5, r24 ; 0x05 msgBuffer[3] = STATUS_CMD_OK; 1f396: 1e 82 std Y+6, r1 ; 0x06 1f398: 74 01 movw r14, r8 1f39a: 63 01 movw r12, r6 1f39c: e4 e0 ldi r30, 0x04 ; 4 1f39e: ae 2e mov r10, r30 1f3a0: b1 2c mov r11, r1 1f3a2: 28 c1 rjmp .+592 ; 0x1f5f4 case CMD_READ_FUSE_ISP: { unsigned char fuseBits; if (msgBuffer[2] == 0x50) 1f3a4: 8d 81 ldd r24, Y+5 ; 0x05 1f3a6: 80 35 cpi r24, 0x50 ; 80 1f3a8: 89 f4 brne .+34 ; 0x1f3cc { if ( msgBuffer[3] == 0x08 ) 1f3aa: 8e 81 ldd r24, Y+6 ; 0x06 1f3ac: 88 30 cpi r24, 0x08 ; 8 1f3ae: 39 f4 brne .+14 ; 0x1f3be fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS ); 1f3b0: 89 e0 ldi r24, 0x09 ; 9 1f3b2: e2 e0 ldi r30, 0x02 ; 2 1f3b4: f0 e0 ldi r31, 0x00 ; 0 1f3b6: 80 93 57 00 sts 0x0057, r24 1f3ba: 84 91 lpm r24, Z+ 1f3bc: 0d c0 rjmp .+26 ; 0x1f3d8 else fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS ); 1f3be: 89 e0 ldi r24, 0x09 ; 9 1f3c0: e0 e0 ldi r30, 0x00 ; 0 1f3c2: f0 e0 ldi r31, 0x00 ; 0 1f3c4: 80 93 57 00 sts 0x0057, r24 1f3c8: 84 91 lpm r24, Z+ 1f3ca: 06 c0 rjmp .+12 ; 0x1f3d8 } else fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS ); 1f3cc: 89 e0 ldi r24, 0x09 ; 9 1f3ce: e3 e0 ldi r30, 0x03 ; 3 1f3d0: f0 e0 ldi r31, 0x00 ; 0 1f3d2: 80 93 57 00 sts 0x0057, r24 1f3d6: 84 91 lpm r24, Z+ msgLength = 4; msgBuffer[1] = STATUS_CMD_OK; 1f3d8: 1c 82 std Y+4, r1 ; 0x04 1f3da: dc cf rjmp .-72 ; 0x1f394 } break; case CMD_CHIP_ERASE_ISP: eraseAddress = 0; boot_page_erase(eraseAddress); // Erase the first page so that AVR will stay 1f3dc: 80 e0 ldi r24, 0x00 ; 0 1f3de: 90 e0 ldi r25, 0x00 ; 0 1f3e0: a0 e0 ldi r26, 0x00 ; 0 1f3e2: b0 e0 ldi r27, 0x00 ; 0 1f3e4: 33 e0 ldi r19, 0x03 ; 3 1f3e6: fc 01 movw r30, r24 1f3e8: a0 93 5b 00 sts 0x005B, r26 1f3ec: 30 93 57 00 sts 0x0057, r19 1f3f0: e8 95 spm boot_spm_busy_wait(); // in Bootlaoder until Flash is programmed again 1f3f2: 07 b6 in r0, 0x37 ; 55 1f3f4: 00 fc sbrc r0, 0 1f3f6: fd cf rjmp .-6 ; 0x1f3f2 boot_rww_enable(); 1f3f8: 81 e1 ldi r24, 0x11 ; 17 1f3fa: 80 93 57 00 sts 0x0057, r24 1f3fe: e8 95 spm msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; 1f400: 1c 82 std Y+4, r1 ; 0x04 1f402: 74 01 movw r14, r8 1f404: 63 01 movw r12, r6 1f406: c0 5e subi r28, 0xE0 ; 224 1f408: de 4f sbci r29, 0xFE ; 254 1f40a: 18 82 st Y, r1 1f40c: 19 82 std Y+1, r1 ; 0x01 1f40e: 1a 82 std Y+2, r1 ; 0x02 1f410: 1b 82 std Y+3, r1 ; 0x03 1f412: c0 52 subi r28, 0x20 ; 32 1f414: d1 40 sbci r29, 0x01 ; 1 1f416: eb c0 rjmp .+470 ; 0x1f5ee 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; 1f418: 8c 81 ldd r24, Y+4 ; 0x04 1f41a: 90 e0 ldi r25, 0x00 ; 0 1f41c: a0 e0 ldi r26, 0x00 ; 0 1f41e: b0 e0 ldi r27, 0x00 ; 0 1f420: f8 2e mov r15, r24 1f422: ee 24 eor r14, r14 1f424: dd 24 eor r13, r13 1f426: cc 24 eor r12, r12 1f428: 8d 81 ldd r24, Y+5 ; 0x05 1f42a: 90 e0 ldi r25, 0x00 ; 0 1f42c: a0 e0 ldi r26, 0x00 ; 0 1f42e: b0 e0 ldi r27, 0x00 ; 0 1f430: dc 01 movw r26, r24 1f432: 99 27 eor r25, r25 1f434: 88 27 eor r24, r24 1f436: c8 2a or r12, r24 1f438: d9 2a or r13, r25 1f43a: ea 2a or r14, r26 1f43c: fb 2a or r15, r27 1f43e: 8f 81 ldd r24, Y+7 ; 0x07 1f440: 90 e0 ldi r25, 0x00 ; 0 1f442: a0 e0 ldi r26, 0x00 ; 0 1f444: b0 e0 ldi r27, 0x00 ; 0 1f446: c8 2a or r12, r24 1f448: d9 2a or r13, r25 1f44a: ea 2a or r14, r26 1f44c: fb 2a or r15, r27 1f44e: 8e 81 ldd r24, Y+6 ; 0x06 1f450: 90 e0 ldi r25, 0x00 ; 0 1f452: a0 e0 ldi r26, 0x00 ; 0 1f454: b0 e0 ldi r27, 0x00 ; 0 1f456: ba 2f mov r27, r26 1f458: a9 2f mov r26, r25 1f45a: 98 2f mov r25, r24 1f45c: 88 27 eor r24, r24 1f45e: c8 2a or r12, r24 1f460: d9 2a or r13, r25 1f462: ea 2a or r14, r26 1f464: fb 2a or r15, r27 1f466: cc 0c add r12, r12 1f468: dd 1c adc r13, r13 1f46a: ee 1c adc r14, r14 1f46c: ff 1c adc r15, r15 1f46e: 82 c0 rjmp .+260 ; 0x1f574 msgBuffer[1] = STATUS_CMD_OK; break; case CMD_PROGRAM_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 1f470: 8c 81 ldd r24, Y+4 ; 0x04 1f472: 9d 81 ldd r25, Y+5 ; 0x05 unsigned char highByte, lowByte; address_t tempaddress = address; if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP ) { if (eraseAddress < APP_END) // erase only main section (bootloader protection) 1f474: c0 5e subi r28, 0xE0 ; 224 1f476: de 4f sbci r29, 0xFE ; 254 1f478: 48 81 ld r20, Y 1f47a: 59 81 ldd r21, Y+1 ; 0x01 1f47c: 6a 81 ldd r22, Y+2 ; 0x02 1f47e: 7b 81 ldd r23, Y+3 ; 0x03 1f480: c0 52 subi r28, 0x20 ; 32 1f482: d1 40 sbci r29, 0x01 ; 1 1f484: 40 30 cpi r20, 0x00 ; 0 1f486: e0 ef ldi r30, 0xF0 ; 240 1f488: 5e 07 cpc r21, r30 1f48a: e1 e0 ldi r30, 0x01 ; 1 1f48c: 6e 07 cpc r22, r30 1f48e: e0 e0 ldi r30, 0x00 ; 0 1f490: 7e 07 cpc r23, r30 1f492: f0 f4 brcc .+60 ; 0x1f4d0 { boot_page_erase(eraseAddress); // Perform page erase 1f494: 23 e0 ldi r18, 0x03 ; 3 1f496: fa 01 movw r30, r20 1f498: 60 93 5b 00 sts 0x005B, r22 1f49c: 20 93 57 00 sts 0x0057, r18 1f4a0: e8 95 spm boot_spm_busy_wait(); // Wait until the memory is erased. 1f4a2: 07 b6 in r0, 0x37 ; 55 1f4a4: 00 fc sbrc r0, 0 1f4a6: fd cf rjmp .-6 ; 0x1f4a2 eraseAddress += SPM_PAGESIZE; // point to next page to be erase 1f4a8: c0 5e subi r28, 0xE0 ; 224 1f4aa: de 4f sbci r29, 0xFE ; 254 1f4ac: 48 81 ld r20, Y 1f4ae: 59 81 ldd r21, Y+1 ; 0x01 1f4b0: 6a 81 ldd r22, Y+2 ; 0x02 1f4b2: 7b 81 ldd r23, Y+3 ; 0x03 1f4b4: c0 52 subi r28, 0x20 ; 32 1f4b6: d1 40 sbci r29, 0x01 ; 1 1f4b8: 40 50 subi r20, 0x00 ; 0 1f4ba: 5f 4f sbci r21, 0xFF ; 255 1f4bc: 6f 4f sbci r22, 0xFF ; 255 1f4be: 7f 4f sbci r23, 0xFF ; 255 1f4c0: c0 5e subi r28, 0xE0 ; 224 1f4c2: de 4f sbci r29, 0xFE ; 254 1f4c4: 48 83 st Y, r20 1f4c6: 59 83 std Y+1, r21 ; 0x01 1f4c8: 6a 83 std Y+2, r22 ; 0x02 1f4ca: 7b 83 std Y+3, r23 ; 0x03 1f4cc: c0 52 subi r28, 0x20 ; 32 1f4ce: d1 40 sbci r29, 0x01 ; 1 msgBuffer[1] = STATUS_CMD_OK; break; case CMD_PROGRAM_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 1f4d0: cb 5d subi r28, 0xDB ; 219 1f4d2: de 4f sbci r29, 0xFE ; 254 1f4d4: 88 83 st Y, r24 1f4d6: c5 52 subi r28, 0x25 ; 37 1f4d8: d1 40 sbci r29, 0x01 ; 1 1f4da: cc 5d subi r28, 0xDC ; 220 1f4dc: de 4f sbci r29, 0xFE ; 254 1f4de: 18 82 st Y, r1 1f4e0: c4 52 subi r28, 0x24 ; 36 1f4e2: d1 40 sbci r29, 0x01 ; 1 1f4e4: 49 2f mov r20, r25 1f4e6: 50 e0 ldi r21, 0x00 ; 0 1f4e8: cc 5d subi r28, 0xDC ; 220 1f4ea: de 4f sbci r29, 0xFE ; 254 1f4ec: 68 81 ld r22, Y 1f4ee: 79 81 ldd r23, Y+1 ; 0x01 1f4f0: c4 52 subi r28, 0x24 ; 36 1f4f2: d1 40 sbci r29, 0x01 ; 1 1f4f4: 46 2b or r20, r22 1f4f6: 57 2b or r21, r23 1f4f8: 74 01 movw r14, r8 1f4fa: 63 01 movw r12, r6 1f4fc: de 01 movw r26, r28 1f4fe: 1d 96 adiw r26, 0x0d ; 13 eraseAddress += SPM_PAGESIZE; // point to next page to be erase } /* Write FLASH */ do { lowByte = *p++; 1f500: 8c 91 ld r24, X highByte = *p++; 1f502: 11 96 adiw r26, 0x01 ; 1 1f504: 2c 91 ld r18, X 1f506: 11 97 sbiw r26, 0x01 ; 1 } int main(void) { 1f508: 12 96 adiw r26, 0x02 ; 2 do { lowByte = *p++; highByte = *p++; data = (highByte << 8) | lowByte; boot_page_fill(address,data); 1f50a: c9 5d subi r28, 0xD9 ; 217 1f50c: de 4f sbci r29, 0xFE ; 254 1f50e: 28 83 st Y, r18 1f510: c7 52 subi r28, 0x27 ; 39 1f512: d1 40 sbci r29, 0x01 ; 1 1f514: ca 5d subi r28, 0xDA ; 218 1f516: de 4f sbci r29, 0xFE ; 254 1f518: 18 82 st Y, r1 1f51a: c6 52 subi r28, 0x26 ; 38 1f51c: d1 40 sbci r29, 0x01 ; 1 1f51e: 90 e0 ldi r25, 0x00 ; 0 1f520: ca 5d subi r28, 0xDA ; 218 1f522: de 4f sbci r29, 0xFE ; 254 1f524: e8 81 ld r30, Y 1f526: f9 81 ldd r31, Y+1 ; 0x01 1f528: c6 52 subi r28, 0x26 ; 38 1f52a: d1 40 sbci r29, 0x01 ; 1 1f52c: 8e 2b or r24, r30 1f52e: 9f 2b or r25, r31 1f530: 21 e0 ldi r18, 0x01 ; 1 1f532: 0c 01 movw r0, r24 1f534: f6 01 movw r30, r12 1f536: e0 92 5b 00 sts 0x005B, r14 1f53a: 20 93 57 00 sts 0x0057, r18 1f53e: e8 95 spm 1f540: 11 24 eor r1, r1 address = address + 2; // Select next word in memory 1f542: 62 e0 ldi r22, 0x02 ; 2 1f544: 70 e0 ldi r23, 0x00 ; 0 1f546: 80 e0 ldi r24, 0x00 ; 0 1f548: 90 e0 ldi r25, 0x00 ; 0 1f54a: c6 0e add r12, r22 1f54c: d7 1e adc r13, r23 1f54e: e8 1e adc r14, r24 1f550: f9 1e adc r15, r25 size -= 2; // Reduce number of bytes to write by two 1f552: 42 50 subi r20, 0x02 ; 2 1f554: 50 40 sbci r21, 0x00 ; 0 } while(size); // Loop until all bytes written 1f556: a1 f6 brne .-88 ; 0x1f500 boot_page_write(tempaddress); 1f558: 75 e0 ldi r23, 0x05 ; 5 1f55a: f3 01 movw r30, r6 1f55c: 80 92 5b 00 sts 0x005B, r8 1f560: 70 93 57 00 sts 0x0057, r23 1f564: e8 95 spm boot_spm_busy_wait(); 1f566: 07 b6 in r0, 0x37 ; 55 1f568: 00 fc sbrc r0, 0 1f56a: fd cf rjmp .-6 ; 0x1f566 boot_rww_enable(); // Re-enable the RWW section 1f56c: 81 e1 ldi r24, 0x11 ; 17 1f56e: 80 93 57 00 sts 0x0057, r24 1f572: e8 95 spm } msgLength = 2; msgBuffer[1] = STATUS_CMD_OK; 1f574: 1c 82 std Y+4, r1 ; 0x04 1f576: 3b c0 rjmp .+118 ; 0x1f5ee } break; case CMD_READ_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 1f578: 8c 81 ldd r24, Y+4 ; 0x04 1f57a: c7 5d subi r28, 0xD7 ; 215 1f57c: de 4f sbci r29, 0xFE ; 254 1f57e: 88 83 st Y, r24 1f580: c9 52 subi r28, 0x29 ; 41 1f582: d1 40 sbci r29, 0x01 ; 1 1f584: c8 5d subi r28, 0xD8 ; 216 1f586: de 4f sbci r29, 0xFE ; 254 1f588: 18 82 st Y, r1 1f58a: c8 52 subi r28, 0x28 ; 40 1f58c: d1 40 sbci r29, 0x01 ; 1 1f58e: 8d 81 ldd r24, Y+5 ; 0x05 1f590: 08 2f mov r16, r24 1f592: 10 e0 ldi r17, 0x00 ; 0 1f594: c8 5d subi r28, 0xD8 ; 216 1f596: de 4f sbci r29, 0xFE ; 254 1f598: e8 81 ld r30, Y 1f59a: f9 81 ldd r31, Y+1 ; 0x01 1f59c: c8 52 subi r28, 0x28 ; 40 1f59e: d1 40 sbci r29, 0x01 ; 1 1f5a0: 0e 2b or r16, r30 1f5a2: 1f 2b or r17, r31 unsigned char *p = msgBuffer+1; msgLength = size+3; *p++ = STATUS_CMD_OK; 1f5a4: 1c 82 std Y+4, r1 ; 0x04 if (msgBuffer[0] == CMD_READ_FLASH_ISP ) 1f5a6: 98 01 movw r18, r16 1f5a8: de 01 movw r26, r28 1f5aa: 15 96 adiw r26, 0x05 ; 5 unsigned int data; /* Read FLASH */ do { #if defined(RAMPZ) data = pgm_read_word_far(address); 1f5ac: 8b be out 0x3b, r8 ; 59 1f5ae: f3 01 movw r30, r6 1f5b0: 87 91 elpm r24, Z+ 1f5b2: 96 91 elpm r25, Z+ #else data = pgm_read_word_near(address); #endif *p++ = (unsigned char)data; //LSB 1f5b4: 8c 93 st X, r24 *p++ = (unsigned char)(data >> 8); //MSB 1f5b6: 11 96 adiw r26, 0x01 ; 1 1f5b8: 9c 93 st X, r25 1f5ba: 11 97 sbiw r26, 0x01 ; 1 } int main(void) { 1f5bc: 12 96 adiw r26, 0x02 ; 2 #else data = pgm_read_word_near(address); #endif *p++ = (unsigned char)data; //LSB *p++ = (unsigned char)(data >> 8); //MSB address += 2; // Select next word in memory 1f5be: 42 e0 ldi r20, 0x02 ; 2 1f5c0: 50 e0 ldi r21, 0x00 ; 0 1f5c2: 60 e0 ldi r22, 0x00 ; 0 1f5c4: 70 e0 ldi r23, 0x00 ; 0 1f5c6: 64 0e add r6, r20 1f5c8: 75 1e adc r7, r21 1f5ca: 86 1e adc r8, r22 1f5cc: 97 1e adc r9, r23 size -= 2; 1f5ce: 22 50 subi r18, 0x02 ; 2 1f5d0: 30 40 sbci r19, 0x00 ; 0 }while (size); 1f5d2: 61 f7 brne .-40 ; 0x1f5ac case CMD_READ_FLASH_ISP: { unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; unsigned char *p = msgBuffer+1; msgLength = size+3; 1f5d4: 33 e0 ldi r19, 0x03 ; 3 1f5d6: a3 2e mov r10, r19 1f5d8: b1 2c mov r11, r1 1f5da: a0 0e add r10, r16 1f5dc: b1 1e adc r11, r17 address += 2; // Select next word in memory size -= 2; }while (size); } *p++ = STATUS_CMD_OK; 1f5de: 1c 92 st X, r1 1f5e0: 74 01 movw r14, r8 1f5e2: 63 01 movw r12, r6 1f5e4: 07 c0 rjmp .+14 ; 0x1f5f4 } break; default: msgLength = 2; msgBuffer[1] = STATUS_CMD_FAILED; 1f5e6: 80 ec ldi r24, 0xC0 ; 192 1f5e8: 8c 83 std Y+4, r24 ; 0x04 1f5ea: 74 01 movw r14, r8 1f5ec: 63 01 movw r12, r6 1f5ee: 22 e0 ldi r18, 0x02 ; 2 1f5f0: a2 2e mov r10, r18 1f5f2: b1 2c mov r11, r1 break; } /* Now send answer message back */ sendchar(MESSAGE_START); 1f5f4: 8b e1 ldi r24, 0x1B ; 27 1f5f6: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 checksum = MESSAGE_START^0; sendchar(seqNum); 1f5fa: 84 2d mov r24, r4 1f5fc: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 checksum ^= seqNum; c = ((msgLength>>8)&0xFF); sendchar(c); 1f600: 8b 2d mov r24, r11 1f602: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 checksum ^= c; c = msgLength & 0x00FF; sendchar(c); 1f606: 8a 2d mov r24, r10 1f608: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 checksum ^= c; sendchar(TOKEN); 1f60c: 8e e0 ldi r24, 0x0E ; 14 1f60e: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 sendchar(seqNum); checksum ^= seqNum; c = ((msgLength>>8)&0xFF); sendchar(c); checksum ^= c; 1f612: 95 e1 ldi r25, 0x15 ; 21 1f614: 59 2e mov r5, r25 1f616: 54 24 eor r5, r4 c = msgLength & 0x00FF; sendchar(c); checksum ^= c; 1f618: 5a 24 eor r5, r10 sendchar(TOKEN); checksum ^= TOKEN; 1f61a: 5b 24 eor r5, r11 1f61c: 83 e0 ldi r24, 0x03 ; 3 1f61e: 88 2e mov r8, r24 1f620: 91 2c mov r9, r1 1f622: 8c 0e add r8, r28 1f624: 9d 1e adc r9, r29 1f626: 0a c0 rjmp .+20 ; 0x1f63c p = msgBuffer; while (msgLength) { sendchar(*p); 1f628: f4 01 movw r30, r8 1f62a: 11 91 ld r17, Z+ 1f62c: 4f 01 movw r8, r30 1f62e: 81 2f mov r24, r17 1f630: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 checksum ^=*p++; 1f634: 51 26 eor r5, r17 msgLength--; 1f636: 08 94 sec 1f638: a1 08 sbc r10, r1 1f63a: b1 08 sbc r11, r1 sendchar(TOKEN); checksum ^= TOKEN; p = msgBuffer; while (msgLength) 1f63c: a1 14 cp r10, r1 1f63e: b1 04 cpc r11, r1 1f640: 99 f7 brne .-26 ; 0x1f628 { sendchar(*p); checksum ^=*p++; msgLength--; } sendchar(checksum); 1f642: 85 2d mov r24, r5 1f644: 0e 94 58 fb call 0x1f6b0 ; 0x1f6b0 seqNum++; uint16_t volatile j=0; 1f648: 1a 82 std Y+2, r1 ; 0x02 1f64a: 19 82 std Y+1, r1 ; 0x01 while(1); } else { j=0; PORTG ^= (1 << PG5); 1f64c: 20 e2 ldi r18, 0x20 ; 32 1f64e: 28 c0 rjmp .+80 ; 0x1f6a0 uint16_t volatile j=0; while(!newDataAvailable()) { if(j++>20000) 1f650: 89 81 ldd r24, Y+1 ; 0x01 1f652: 9a 81 ldd r25, Y+2 ; 0x02 1f654: 01 96 adiw r24, 0x01 ; 1 1f656: 9a 83 std Y+2, r25 ; 0x02 1f658: 89 83 std Y+1, r24 ; 0x01 1f65a: 01 97 sbiw r24, 0x01 ; 1 1f65c: 81 52 subi r24, 0x21 ; 33 1f65e: 9e 44 sbci r25, 0x4E ; 78 1f660: d0 f0 brcs .+52 ; 0x1f696 { if(pgm_read_word(0x0000) != 0xFFFF) 1f662: c6 5d subi r28, 0xD6 ; 214 1f664: de 4f sbci r29, 0xFE ; 254 1f666: 48 81 ld r20, Y 1f668: 59 81 ldd r21, Y+1 ; 0x01 1f66a: ca 52 subi r28, 0x2A ; 42 1f66c: d1 40 sbci r29, 0x01 ; 1 1f66e: 4f 5f subi r20, 0xFF ; 255 1f670: 5f 4f sbci r21, 0xFF ; 255 1f672: 61 f0 breq .+24 ; 0x1f68c { wdt_enable(WDTO_15MS); 1f674: 28 e0 ldi r18, 0x08 ; 8 1f676: 88 e1 ldi r24, 0x18 ; 24 1f678: 90 e0 ldi r25, 0x00 ; 0 1f67a: 0f b6 in r0, 0x3f ; 63 1f67c: f8 94 cli 1f67e: a8 95 wdr 1f680: 80 93 60 00 sts 0x0060, r24 1f684: 0f be out 0x3f, r0 ; 63 1f686: 20 93 60 00 sts 0x0060, r18 1f68a: ff cf rjmp .-2 ; 0x1f68a while(1); } else { j=0; 1f68c: 1a 82 std Y+2, r1 ; 0x02 1f68e: 19 82 std Y+1, r1 ; 0x01 PORTG ^= (1 << PG5); 1f690: 84 b3 in r24, 0x14 ; 20 1f692: 82 27 eor r24, r18 1f694: 84 bb out 0x14, r24 ; 20 1f696: 80 e0 ldi r24, 0x00 ; 0 } } for(uint8_t i=0;i<50;i++) asm volatile("nop"); 1f698: 00 00 nop 1f69a: 8f 5f subi r24, 0xFF ; 255 1f69c: 82 33 cpi r24, 0x32 ; 50 1f69e: e1 f7 brne .-8 ; 0x1f698 sendchar(checksum); seqNum++; uint16_t volatile j=0; while(!newDataAvailable()) 1f6a0: 80 91 c0 00 lds r24, 0x00C0 1f6a4: 87 ff sbrs r24, 7 1f6a6: d4 cf rjmp .-88 ; 0x1f650 sendchar(*p); checksum ^=*p++; msgLength--; } sendchar(checksum); seqNum++; 1f6a8: 43 94 inc r4 1f6aa: 36 01 movw r6, r12 1f6ac: 47 01 movw r8, r14 1f6ae: 89 cd rjmp .-1262 ; 0x1f1c2 0001f6b0 : #include "communication.h" /* send single byte to USART, wait until transmission is completed */ void sendchar(char c) { 1f6b0: 98 2f mov r25, r24 while (!( UART_STATUS_REG & (1< ; /* Put data into buffer, sends the data */ UART_DATA_REG = c; 1f6ba: 90 93 c6 00 sts 0x00C6, r25 } 1f6be: 08 95 ret 0001f6c0 : /* Read single byte from USART, block if no data available */ unsigned char recchar(void) { while(!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE))); // wait for data 1f6c0: 80 91 c0 00 lds r24, 0x00C0 1f6c4: 87 ff sbrs r24, 7 1f6c6: fc cf rjmp .-8 ; 0x1f6c0 return UART_DATA_REG; 1f6c8: 80 91 c6 00 lds r24, 0x00C6 } 1f6cc: 08 95 ret 0001f6ce <_exit>: 1f6ce: f8 94 cli 0001f6d0 <__stop_program>: 1f6d0: ff cf rjmp .-2 ; 0x1f6d0 <__stop_program>