1
0
mirror of https://github.com/Optiboot/optiboot.git synced 2025-09-05 23:03:58 +03:00

Now version 6.2

https://code.google.com/p/optiboot/issues/detail?id=110
Make the "length" variable types be dependent on SPM_PAGESIZE.
Having it be uint8_t on smaller chips saves significant code
space, but it really should be uint16_t on bigger chips.

(Also, fix the luminet makefile target.  Not that the code works.)
This commit is contained in:
westfw
2014-08-18 22:19:26 -07:00
parent 452fdbedf8
commit c0c10a8798
19 changed files with 1900 additions and 2075 deletions

View File

@@ -62,8 +62,8 @@ attiny84: TARGET = attiny84
attiny84: MCU_TARGET = attiny84 attiny84: MCU_TARGET = attiny84
attiny84: CFLAGS += $(COMMON_OPTIONS) -DSOFT_UART -DVIRTUAL_BOOT_PARTITION attiny84: CFLAGS += $(COMMON_OPTIONS) -DSOFT_UART -DVIRTUAL_BOOT_PARTITION
attiny84: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1ffe attiny84: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1ffe
attiny84: $(PROGRAM)_attiny84p.hex attiny84: $(PROGRAM)_attiny84.hex
attiny84: $(PROGRAM)_attiny84p.lst attiny84: $(PROGRAM)_attiny84.lst

View File

@@ -16,7 +16,6 @@
/* */ /* */
/* Enhancements: */ /* Enhancements: */
/* Fits in 512 bytes, saving 1.5K of code space */ /* Fits in 512 bytes, saving 1.5K of code space */
/* Background page erasing speeds up programming */
/* Higher baud rate speeds up programming */ /* Higher baud rate speeds up programming */
/* Written almost entirely in C */ /* Written almost entirely in C */
/* Customisable timeout with accurate timeconstant */ /* Customisable timeout with accurate timeconstant */
@@ -151,6 +150,9 @@
/* Edit History: */ /* Edit History: */
/* */ /* */
/* Aug 2014 */ /* Aug 2014 */
/* 6.2 WestfW: make size of length variables dependent */
/* on the SPM_PAGESIZE. This saves space */
/* on the chips where it's most important. */
/* 6.1 WestfW: Fix OPTIBOOT_CUSTOMVER (send it!) */ /* 6.1 WestfW: Fix OPTIBOOT_CUSTOMVER (send it!) */
/* Make no-wait mod less picky about */ /* Make no-wait mod less picky about */
/* skipping the bootloader. */ /* skipping the bootloader. */
@@ -218,7 +220,7 @@
/**********************************************************/ /**********************************************************/
#define OPTIBOOT_MAJVER 6 #define OPTIBOOT_MAJVER 6
#define OPTIBOOT_MINVER 1 #define OPTIBOOT_MINVER 2
/* /*
* OPTIBOOT_CUSTOMVER should be defined (by the makefile) for custom edits * OPTIBOOT_CUSTOMVER should be defined (by the makefile) for custom edits
@@ -320,6 +322,20 @@ optiboot_version = 256*(OPTIBOOT_MAJVER + OPTIBOOT_CUSTOMVER) + OPTIBOOT_MINVER;
#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) #define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE))
#endif #endif
/*
* We can never load flash with more than 1 page at a time, so we can save
* some code space on parts with smaller pagesize by using a smaller int.
*/
#if SPM_PAGESIZE > 255
typedef uint16_t pagelen_t ;
#define GETLENGTH(len) len = getch()<<8; len |= getch()
#else
typedef uint8_t pagelen_t;
#define GETLENGTH(len) (void) getch() /* skip high byte */; len = getch()
#endif
/* Function Prototypes /* Function Prototypes
* The main() function is in init9, which removes the interrupt vector table * The main() function is in init9, which removes the interrupt vector table
* we don't need. It is also 'OS_main', which means the compiler does not * we don't need. It is also 'OS_main', which means the compiler does not
@@ -338,9 +354,9 @@ static inline void getNch(uint8_t);
static inline void flash_led(uint8_t); static inline void flash_led(uint8_t);
static inline void watchdogReset(); static inline void watchdogReset();
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len); uint16_t address, pagelen_t len);
static inline void read_mem(uint8_t memtype, static inline void read_mem(uint8_t memtype,
uint16_t address, uint16_t len); uint16_t address, pagelen_t len);
#ifdef SOFT_UART #ifdef SOFT_UART
void uartDelay() __attribute__ ((naked)); void uartDelay() __attribute__ ((naked));
@@ -350,7 +366,7 @@ void appStart(uint8_t rstFlags) __attribute__ ((naked));
/* /*
* RAMSTART should be self-explanatory. It's bigger on parts with a * RAMSTART should be self-explanatory. It's bigger on parts with a
* lot of peripheral registers. Let 0x100 be the default * lot of peripheral registers. Let 0x100 be the default
* Note that RAMSTART need not be exactly at the start of RAM. * Note that RAMSTART (for optiboot) need not be exactly at the start of RAM.
*/ */
#if !defined(RAMSTART) // newer versions of gcc avr-libc define RAMSTART #if !defined(RAMSTART) // newer versions of gcc avr-libc define RAMSTART
#define RAMSTART 0x100 #define RAMSTART 0x100
@@ -385,7 +401,7 @@ int main(void) {
* necessary, and uses 4 bytes of flash.) * necessary, and uses 4 bytes of flash.)
*/ */
register uint16_t address = 0; register uint16_t address = 0;
register uint16_t length; register pagelen_t length;
// After the zero init loop, this is the first code to run. // After the zero init loop, this is the first code to run.
// //
@@ -504,10 +520,9 @@ int main(void) {
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
length |= getch();
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
@@ -545,8 +560,8 @@ int main(void) {
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
length |= getch();
desttype = getch(); desttype = getch();
verifySpace(); verifySpace();
@@ -755,7 +770,7 @@ void appStart(uint8_t rstFlags) {
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
case 'E': // EEPROM case 'E': // EEPROM
@@ -818,7 +833,7 @@ static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
} // switch } // switch
} }
static inline void read_mem(uint8_t memtype, uint16_t address, uint16_t length) static inline void read_mem(uint8_t memtype, uint16_t address, pagelen_t length)
{ {
uint8_t ch; uint8_t ch;

View File

@@ -6,7 +6,7 @@
:10FC40002093840096BBB09BFECF1F9AA89581504D :10FC40002093840096BBB09BFECF1F9AA89581504D
:10FC5000A9F7CC24DD248824839425E0A22E91E109 :10FC5000A9F7CC24DD248824839425E0A22E91E109
:10FC6000992EC2D0813471F4BFD0182FCFD0123862 :10FC6000992EC2D0813471F4BFD0182FCFD0123862
:10FC700011F481E005C0113811F486E001C083E081 :10FC700011F482E005C0113811F486E001C083E080
:10FC8000ABD0A7C0823411F484E103C0853419F4E9 :10FC8000ABD0A7C0823411F484E103C0853419F4E9
:10FC900085E0C4D09EC08535A1F4A6D0082F10E021 :10FC900085E0C4D09EC08535A1F4A6D0082F10E021
:10FCA000A3D0E82EFF24FE2CEE24E02AF12A8F2D8B :10FCA000A3D0E82EFF24FE2CEE24E02AF12A8F2D8B
@@ -38,6 +38,6 @@
:10FE4000F89A992780B50895262FF999FECF1FBA01 :10FE4000F89A992780B50895262FF999FECF1FBA01
:10FE500092BD81BD20BD0FB6F894FA9AF99A0FBEF3 :10FE500092BD81BD20BD0FB6F894FA9AF99A0FBEF3
:04FE6000019608956A :04FE6000019608956A
:02FFFE000106FA :02FFFE000206F9
:040000031000FC00ED :040000031000FC00ED
:00000001FF :00000001FF

View File

@@ -15,19 +15,19 @@ Idx Name Size VMA LMA File off Algn
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_pubnames 00000074 00000000 00000000 0000053f 2**0 5 .debug_pubnames 00000074 00000000 00000000 0000053f 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_info 000003e4 00000000 00000000 000005b3 2**0 6 .debug_info 000003f0 00000000 00000000 000005b3 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_abbrev 000001f1 00000000 00000000 00000997 2**0 7 .debug_abbrev 000001fe 00000000 00000000 000009a3 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_line 0000045b 00000000 00000000 00000b88 2**0 8 .debug_line 0000044b 00000000 00000000 00000ba1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_frame 00000080 00000000 00000000 00000fe4 2**2 9 .debug_frame 00000080 00000000 00000000 00000fec 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000172 00000000 00000000 00001064 2**0 10 .debug_str 0000017c 00000000 00000000 0000106c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
11 .debug_loc 000003b3 00000000 00000000 000011d6 2**0 11 .debug_loc 000003b3 00000000 00000000 000011e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
12 .debug_ranges 000000d0 00000000 00000000 00001589 2**0 12 .debug_ranges 000000d0 00000000 00000000 0000159b 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -183,7 +183,7 @@ void watchdogReset() {
1fc6e: 12 38 cpi r17, 0x82 ; 130 1fc6e: 12 38 cpi r17, 0x82 ; 130
1fc70: 11 f4 brne .+4 ; 0x1fc76 <main+0x76> 1fc70: 11 f4 brne .+4 ; 0x1fc76 <main+0x76>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
1fc72: 81 e0 ldi r24, 0x01 ; 1 1fc72: 82 e0 ldi r24, 0x02 ; 2
1fc74: 05 c0 rjmp .+10 ; 0x1fc80 <main+0x80> 1fc74: 05 c0 rjmp .+10 ; 0x1fc80 <main+0x80>
} else if (which == 0x81) { } else if (which == 0x81) {
1fc76: 11 38 cpi r17, 0x81 ; 129 1fc76: 11 38 cpi r17, 0x81 ; 129
@@ -273,14 +273,13 @@ void watchdogReset() {
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
1fcd4: 89 d0 rcall .+274 ; 0x1fde8 <getch> 1fcd4: 89 d0 rcall .+274 ; 0x1fde8 <getch>
1fcd6: 90 e0 ldi r25, 0x00 ; 0 1fcd6: 90 e0 ldi r25, 0x00 ; 0
1fcd8: 18 2f mov r17, r24 1fcd8: 18 2f mov r17, r24
1fcda: 00 27 eor r16, r16 1fcda: 00 27 eor r16, r16
length |= getch();
1fcdc: 85 d0 rcall .+266 ; 0x1fde8 <getch> 1fcdc: 85 d0 rcall .+266 ; 0x1fde8 <getch>
1fcde: 90 e0 ldi r25, 0x00 ; 0 1fcde: 90 e0 ldi r25, 0x00 ; 0
1fce0: 08 2b or r16, r24 1fce0: 08 2b or r16, r24
@@ -311,7 +310,7 @@ void watchdogReset() {
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
1fcfe: f5 e4 ldi r31, 0x45 ; 69 1fcfe: f5 e4 ldi r31, 0x45 ; 69
@@ -334,7 +333,7 @@ static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
1fd18: 97 d0 rcall .+302 ; 0x1fe48 <__eewr_byte_m1280> 1fd18: 97 d0 rcall .+302 ; 0x1fe48 <__eewr_byte_m1280>
1fd1a: 01 50 subi r16, 0x01 ; 1 1fd1a: 01 50 subi r16, 0x01 ; 1
1fd1c: 10 40 sbci r17, 0x00 ; 0 1fd1c: 10 40 sbci r17, 0x00 ; 0
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
case 'E': // EEPROM case 'E': // EEPROM
@@ -431,16 +430,16 @@ int main(void) {
1fd78: 84 37 cpi r24, 0x74 ; 116 1fd78: 84 37 cpi r24, 0x74 ; 116
1fd7a: f1 f4 brne .+60 ; 0x1fdb8 <main+0x1b8> 1fd7a: f1 f4 brne .+60 ; 0x1fdb8 <main+0x1b8>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
1fd7c: 35 d0 rcall .+106 ; 0x1fde8 <getch> 1fd7c: 35 d0 rcall .+106 ; 0x1fde8 <getch>
1fd7e: 90 e0 ldi r25, 0x00 ; 0 1fd7e: 90 e0 ldi r25, 0x00 ; 0
1fd80: d8 2f mov r29, r24 1fd80: d8 2f mov r29, r24
1fd82: cc 27 eor r28, r28 1fd82: cc 27 eor r28, r28
length |= getch();
1fd84: 31 d0 rcall .+98 ; 0x1fde8 <getch> 1fd84: 31 d0 rcall .+98 ; 0x1fde8 <getch>
1fd86: 90 e0 ldi r25, 0x00 ; 0 1fd86: 90 e0 ldi r25, 0x00 ; 0
1fd88: c8 2b or r28, r24 1fd88: c8 2b or r28, r24
1fd8a: d9 2b or r29, r25 1fd8a: d9 2b or r29, r25
desttype = getch(); desttype = getch();
1fd8c: 2d d0 rcall .+90 ; 0x1fde8 <getch> 1fd8c: 2d d0 rcall .+90 ; 0x1fde8 <getch>
1fd8e: 18 2f mov r17, r24 1fd8e: 18 2f mov r17, r24
@@ -448,7 +447,7 @@ int main(void) {
verifySpace(); verifySpace();
1fd90: 3d d0 rcall .+122 ; 0x1fe0c <verifySpace> 1fd90: 3d d0 rcall .+122 ; 0x1fe0c <verifySpace>
static inline void read_mem(uint8_t memtype, uint16_t address, uint16_t length) static inline void read_mem(uint8_t memtype, uint16_t address, pagelen_t length)
{ {
uint8_t ch; uint8_t ch;

View File

@@ -1,35 +1,33 @@
:107E0000112494B714BE892F8D7011F0892FEFD0F3 :107E0000112494B714BE892F8D7011F0892FDED004
:107E100085E08093810082E08093C00088E18093B8 :107E100085E08093810082E08093C00088E18093B8
:107E2000C10086E08093C20080E18093C4008EE0B0 :107E2000C10086E08093C20080E18093C4008EE0B0
:107E3000C8D0259A86E020E33CEF91E0309385009E :107E3000B7D0259A86E020E33CEF91E030938500AF
:107E40002093840096BBB09BFECF1D9AA8958150CD :107E40002093840096BBB09BFECF1D9AA8958150CD
:107E5000A9F7AA24BB2433E0832E7724739425E06A :107E5000A9F7EE24FF24B3E0AB2EBB24B394A5E036
:107E6000922E91E1C92EA1D0813471F49ED0182FA9 :107E6000DA2EF1E1CF2E90D0813471F48DD0082F2D
:107E7000AED0123811F481E005C0113811F486E05B :107E70009DD0023811F482E005C0013811F486E08B
:107E800001C083E08AD086C0823411F484E103C04B :107E800001C083E079D075C0823411F484E103C06D
:107E9000853419F485E0A3D07DC0853579F485D08B :107E9000853419F485E092D06CC0853579F474D0BE
:107EA000E82EFF2482D0082F10E0102F00270E2983 :107EA000E82EFF2471D0082F10E0102F00270E2994
:107EB0001F29000F111F8BD058016CC0863521F48B :107EB0001F29000F111F7AD078015BC0863521F48D
:107EC00084E08DD080E0DECF843609F041C06DD0F3 :107EC00084E07CD080E0DECF843609F035C05CD021
:107ED00090E0182F002769D090E0082B192B65D06F :107ED0005BD0182F59D0082FC0E0D1E055D089933E
:107EE000D82EE801E12CF1E0FF2E5FD0F70181935D :107EE0001C17E1F763D0053409F4FFCFF701A7BEF3
:107EF0007F012197D1F76BD0F5E4DF1609F4FFCFAE :107EF000E89507B600FCFDCFA701A0E0B1E02C910A
:107F0000F50187BEE89507B600FCFDCFB501A801D5 :107F000030E011968C91119790E0982F8827822B62
:107F1000A0E0B1E02C9130E011968C91119790E0A7 :107F1000932B1296FA010C01B7BEE89511244E5F1F
:107F2000982F8827822B932B1296FB010C0177BE8A :107F20005F4F1A1761F7F701D7BEE89507B600FC57
:107F3000E89511246E5F7F4F4250504059F7F5018C :107F3000FDCFC7BEE8951DC0843769F425D024D095
:107F400097BEE89507B600FCFDCFC7BEE89522C0F6 :107F4000082F22D033D0E701FE018591EF0114D034
:107F5000843791F42AD090E0D82FCC2726D090E017 :107F50000150D1F70EC0853739F428D08EE10CD00E
:107F6000C82BD92B22D033D08501F80185918F0100 :107F600085E90AD08FE08ECF813511F488E018D0F2
:107F700014D02197D1F70EC0853739F428D08EE17F :107F70001DD080E101D077CF982F8091C00085FF80
:107F80000CD085E90AD08FE07DCF813511F488E0EF :107F8000FCCF9093C60008958091C00087FFFCCF7E
:107F900018D01DD080E101D066CF982F8091C0000D :107F90008091C00084FD01C0A8958091C60008951D
:107FA00085FFFCCF9093C60008958091C00087FFA5 :107FA000E0E6F0E098E1908380830895EDDF803291
:107FB000FCCF8091C00084FD01C0A8958091C600CF :107FB00019F088E0F5DFFFCF84E1DECF1F93182FA3
:107FC0000895E0E6F0E098E1908380830895EDDF86 :107FC000E3DF1150E9F7F2DF1F910895282E80E0DA
:107FD000803219F088E0F5DFFFCF84E1DECF1F9318 :087FD000E7DFEE27FF2709940B
:107FE000182FE3DF1150E9F7F2DF1F910895282ED3 :027FFE00020679
:0A7FF00080E0E7DFEE27FF27099489
:027FFE0001067A
:0400000300007E007B :0400000300007E007B
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega328.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001fa 00007e00 00007e00 00000074 2**1 0 .text 000001d8 00007e00 00007e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00007ffe 00007ffe 0000026e 2**0 1 .version 00000002 00007ffe 00007ffe 0000024c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 00000270 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024e 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000298 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000276 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030c 2**0 4 .debug_info 000003ea 00000000 00000000 000002ea 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ec 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d4 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 0000043b 00000000 00000000 000008dd 2**0 6 .debug_line 0000042b 00000000 00000000 000008c3 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d18 2**2 7 .debug_frame 00000080 00000000 00000000 00000cf0 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d98 2**0 8 .debug_str 0000017c 00000000 00000000 00000d70 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f0a 2**0 9 .debug_loc 00000300 00000000 00000000 00000eec 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011e1 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011ec 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
7e0a: 11 f0 breq .+4 ; 0x7e10 <main+0x10> 7e0a: 11 f0 breq .+4 ; 0x7e10 <main+0x10>
appStart(ch); appStart(ch);
7e0c: 89 2f mov r24, r25 7e0c: 89 2f mov r24, r25
7e0e: ef d0 rcall .+478 ; 0x7fee <appStart> 7e0e: de d0 rcall .+444 ; 0x7fcc <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
7e2e: 8e e0 ldi r24, 0x0E ; 14 7e2e: 8e e0 ldi r24, 0x0E ; 14
7e30: c8 d0 rcall .+400 ; 0x7fc2 <watchdogConfig> 7e30: b7 d0 rcall .+366 ; 0x7fa0 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,66 +131,66 @@ void watchdogReset() {
} while (--count); } while (--count);
7e4e: 81 50 subi r24, 0x01 ; 1 7e4e: 81 50 subi r24, 0x01 ; 1
7e50: a9 f7 brne .-22 ; 0x7e3c <main+0x3c> 7e50: a9 f7 brne .-22 ; 0x7e3c <main+0x3c>
7e52: aa 24 eor r10, r10 7e52: ee 24 eor r14, r14
7e54: bb 24 eor r11, r11 7e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
7e56: 33 e0 ldi r19, 0x03 ; 3 7e56: b3 e0 ldi r27, 0x03 ; 3
7e58: 83 2e mov r8, r19 7e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
7e5a: 77 24 eor r7, r7 7e5a: bb 24 eor r11, r11
7e5c: 73 94 inc r7 7e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
7e5e: 25 e0 ldi r18, 0x05 ; 5 7e5e: a5 e0 ldi r26, 0x05 ; 5
7e60: 92 2e mov r9, r18 7e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
7e62: 91 e1 ldi r25, 0x11 ; 17 7e62: f1 e1 ldi r31, 0x11 ; 17
7e64: c9 2e mov r12, r25 7e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
7e66: a1 d0 rcall .+322 ; 0x7faa <getch> 7e66: 90 d0 rcall .+288 ; 0x7f88 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
7e68: 81 34 cpi r24, 0x41 ; 65 7e68: 81 34 cpi r24, 0x41 ; 65
7e6a: 71 f4 brne .+28 ; 0x7e88 <main+0x88> 7e6a: 71 f4 brne .+28 ; 0x7e88 <main+0x88>
unsigned char which = getch(); unsigned char which = getch();
7e6c: 9e d0 rcall .+316 ; 0x7faa <getch> 7e6c: 8d d0 rcall .+282 ; 0x7f88 <getch>
7e6e: 18 2f mov r17, r24 7e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
7e70: ae d0 rcall .+348 ; 0x7fce <verifySpace> 7e70: 9d d0 rcall .+314 ; 0x7fac <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
7e72: 12 38 cpi r17, 0x82 ; 130 7e72: 02 38 cpi r16, 0x82 ; 130
7e74: 11 f4 brne .+4 ; 0x7e7a <main+0x7a> 7e74: 11 f4 brne .+4 ; 0x7e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
7e76: 81 e0 ldi r24, 0x01 ; 1 7e76: 82 e0 ldi r24, 0x02 ; 2
7e78: 05 c0 rjmp .+10 ; 0x7e84 <main+0x84> 7e78: 05 c0 rjmp .+10 ; 0x7e84 <main+0x84>
} else if (which == 0x81) { } else if (which == 0x81) {
7e7a: 11 38 cpi r17, 0x81 ; 129 7e7a: 01 38 cpi r16, 0x81 ; 129
7e7c: 11 f4 brne .+4 ; 0x7e82 <main+0x82> 7e7c: 11 f4 brne .+4 ; 0x7e82 <main+0x82>
putch(optiboot_version >> 8); putch(optiboot_version >> 8);
7e7e: 86 e0 ldi r24, 0x06 ; 6 7e7e: 86 e0 ldi r24, 0x06 ; 6
@@ -202,8 +202,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
7e82: 83 e0 ldi r24, 0x03 ; 3 7e82: 83 e0 ldi r24, 0x03 ; 3
7e84: 8a d0 rcall .+276 ; 0x7f9a <putch> 7e84: 79 d0 rcall .+242 ; 0x7f78 <putch>
7e86: 86 c0 rjmp .+268 ; 0x7f94 <main+0x194> 7e86: 75 c0 rjmp .+234 ; 0x7f72 <main+0x172>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -220,8 +220,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
7e94: 85 e0 ldi r24, 0x05 ; 5 7e94: 85 e0 ldi r24, 0x05 ; 5
7e96: a3 d0 rcall .+326 ; 0x7fde <getNch> 7e96: 92 d0 rcall .+292 ; 0x7fbc <getNch>
7e98: 7d c0 rjmp .+250 ; 0x7f94 <main+0x194> 7e98: 6c c0 rjmp .+216 ; 0x7f72 <main+0x172>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
7e9a: 85 35 cpi r24, 0x55 ; 85 7e9a: 85 35 cpi r24, 0x55 ; 85
@@ -229,11 +229,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
7e9e: 85 d0 rcall .+266 ; 0x7faa <getch> 7e9e: 74 d0 rcall .+232 ; 0x7f88 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
7ea0: e8 2e mov r14, r24 7ea0: e8 2e mov r14, r24
7ea2: ff 24 eor r15, r15 7ea2: ff 24 eor r15, r15
7ea4: 82 d0 rcall .+260 ; 0x7faa <getch> 7ea4: 71 d0 rcall .+226 ; 0x7f88 <getch>
7ea6: 08 2f mov r16, r24 7ea6: 08 2f mov r16, r24
7ea8: 10 e0 ldi r17, 0x00 ; 0 7ea8: 10 e0 ldi r17, 0x00 ; 0
7eaa: 10 2f mov r17, r16 7eaa: 10 2f mov r17, r16
@@ -249,9 +249,9 @@ void watchdogReset() {
7eb4: 11 1f adc r17, r17 7eb4: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
7eb6: 8b d0 rcall .+278 ; 0x7fce <verifySpace> 7eb6: 7a d0 rcall .+244 ; 0x7fac <verifySpace>
7eb8: 58 01 movw r10, r16 7eb8: 78 01 movw r14, r16
7eba: 6c c0 rjmp .+216 ; 0x7f94 <main+0x194> 7eba: 5b c0 rjmp .+182 ; 0x7f72 <main+0x172>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
7ebc: 86 35 cpi r24, 0x56 ; 86 7ebc: 86 35 cpi r24, 0x56 ; 86
@@ -259,7 +259,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
7ec0: 84 e0 ldi r24, 0x04 ; 4 7ec0: 84 e0 ldi r24, 0x04 ; 4
7ec2: 8d d0 rcall .+282 ; 0x7fde <getNch> 7ec2: 7c d0 rcall .+248 ; 0x7fbc <getNch>
putch(0x00); putch(0x00);
7ec4: 80 e0 ldi r24, 0x00 ; 0 7ec4: 80 e0 ldi r24, 0x00 ; 0
7ec6: de cf rjmp .-68 ; 0x7e84 <main+0x84> 7ec6: de cf rjmp .-68 ; 0x7e84 <main+0x84>
@@ -268,339 +268,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
7ec8: 84 36 cpi r24, 0x64 ; 100 7ec8: 84 36 cpi r24, 0x64 ; 100
7eca: 09 f0 breq .+2 ; 0x7ece <main+0xce> 7eca: 09 f0 breq .+2 ; 0x7ece <main+0xce>
7ecc: 41 c0 rjmp .+130 ; 0x7f50 <main+0x150> 7ecc: 35 c0 rjmp .+106 ; 0x7f38 <main+0x138>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
7ece: 6d d0 rcall .+218 ; 0x7faa <getch> 7ece: 5c d0 rcall .+184 ; 0x7f88 <getch>
7ed0: 90 e0 ldi r25, 0x00 ; 0 7ed0: 5b d0 rcall .+182 ; 0x7f88 <getch>
7ed2: 18 2f mov r17, r24 7ed2: 18 2f mov r17, r24
7ed4: 00 27 eor r16, r16
length |= getch();
7ed6: 69 d0 rcall .+210 ; 0x7faa <getch>
7ed8: 90 e0 ldi r25, 0x00 ; 0
7eda: 08 2b or r16, r24
7edc: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
7ede: 65 d0 rcall .+202 ; 0x7faa <getch> 7ed4: 59 d0 rcall .+178 ; 0x7f88 <getch>
7ee0: d8 2e mov r13, r24 7ed6: 08 2f mov r16, r24
7ee2: e8 01 movw r28, r16 7ed8: c0 e0 ldi r28, 0x00 ; 0
7ee4: e1 2c mov r14, r1 7eda: d1 e0 ldi r29, 0x01 ; 1
7ee6: f1 e0 ldi r31, 0x01 ; 1
7ee8: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
7eea: 5f d0 rcall .+190 ; 0x7faa <getch> 7edc: 55 d0 rcall .+170 ; 0x7f88 <getch>
7eec: f7 01 movw r30, r14 7ede: 89 93 st Y+, r24
7eee: 81 93 st Z+, r24
7ef0: 7f 01 movw r14, r30
while (--length); while (--length);
7ef2: 21 97 sbiw r28, 0x01 ; 1 7ee0: 1c 17 cp r17, r28
7ef4: d1 f7 brne .-12 ; 0x7eea <main+0xea> 7ee2: e1 f7 brne .-8 ; 0x7edc <main+0xdc>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
7ef6: 6b d0 rcall .+214 ; 0x7fce <verifySpace> 7ee4: 63 d0 rcall .+198 ; 0x7fac <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
7ef8: f5 e4 ldi r31, 0x45 ; 69 7ee6: 05 34 cpi r16, 0x45 ; 69
7efa: df 16 cp r13, r31 7ee8: 09 f4 brne .+2 ; 0x7eec <main+0xec>
7efc: 09 f4 brne .+2 ; 0x7f00 <main+0x100> 7eea: ff cf rjmp .-2 ; 0x7eea <main+0xea>
7efe: ff cf rjmp .-2 ; 0x7efe <main+0xfe>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
7f00: f5 01 movw r30, r10 7eec: f7 01 movw r30, r14
7f02: 87 be out 0x37, r8 ; 55 7eee: a7 be out 0x37, r10 ; 55
7f04: e8 95 spm 7ef0: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
7f06: 07 b6 in r0, 0x37 ; 55 7ef2: 07 b6 in r0, 0x37 ; 55
7f08: 00 fc sbrc r0, 0 7ef4: 00 fc sbrc r0, 0
7f0a: fd cf rjmp .-6 ; 0x7f06 <main+0x106> 7ef6: fd cf rjmp .-6 ; 0x7ef2 <main+0xf2>
7f0c: b5 01 movw r22, r10 7ef8: a7 01 movw r20, r14
7f0e: a8 01 movw r20, r16 7efa: a0 e0 ldi r26, 0x00 ; 0
7f10: a0 e0 ldi r26, 0x00 ; 0 7efc: b1 e0 ldi r27, 0x01 ; 1
7f12: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
7f14: 2c 91 ld r18, X 7efe: 2c 91 ld r18, X
7f16: 30 e0 ldi r19, 0x00 ; 0 7f00: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
7f18: 11 96 adiw r26, 0x01 ; 1 7f02: 11 96 adiw r26, 0x01 ; 1
7f1a: 8c 91 ld r24, X 7f04: 8c 91 ld r24, X
7f1c: 11 97 sbiw r26, 0x01 ; 1 7f06: 11 97 sbiw r26, 0x01 ; 1
7f1e: 90 e0 ldi r25, 0x00 ; 0 7f08: 90 e0 ldi r25, 0x00 ; 0
7f20: 98 2f mov r25, r24 7f0a: 98 2f mov r25, r24
7f22: 88 27 eor r24, r24 7f0c: 88 27 eor r24, r24
7f24: 82 2b or r24, r18 7f0e: 82 2b or r24, r18
7f26: 93 2b or r25, r19 7f10: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
7f28: 12 96 adiw r26, 0x02 ; 2 7f12: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
7f2a: fb 01 movw r30, r22 7f14: fa 01 movw r30, r20
7f2c: 0c 01 movw r0, r24 7f16: 0c 01 movw r0, r24
7f2e: 77 be out 0x37, r7 ; 55 7f18: b7 be out 0x37, r11 ; 55
7f30: e8 95 spm 7f1a: e8 95 spm
7f32: 11 24 eor r1, r1 7f1c: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
7f34: 6e 5f subi r22, 0xFE ; 254 7f1e: 4e 5f subi r20, 0xFE ; 254
7f36: 7f 4f sbci r23, 0xFF ; 255 7f20: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
7f38: 42 50 subi r20, 0x02 ; 2 7f22: 1a 17 cp r17, r26
7f3a: 50 40 sbci r21, 0x00 ; 0 7f24: 61 f7 brne .-40 ; 0x7efe <main+0xfe>
7f3c: 59 f7 brne .-42 ; 0x7f14 <main+0x114>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
7f3e: f5 01 movw r30, r10 7f26: f7 01 movw r30, r14
7f40: 97 be out 0x37, r9 ; 55 7f28: d7 be out 0x37, r13 ; 55
7f42: e8 95 spm 7f2a: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
7f44: 07 b6 in r0, 0x37 ; 55 7f2c: 07 b6 in r0, 0x37 ; 55
7f46: 00 fc sbrc r0, 0 7f2e: 00 fc sbrc r0, 0
7f48: fd cf rjmp .-6 ; 0x7f44 <main+0x144> 7f30: fd cf rjmp .-6 ; 0x7f2c <main+0x12c>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
7f4a: c7 be out 0x37, r12 ; 55 7f32: c7 be out 0x37, r12 ; 55
7f4c: e8 95 spm 7f34: e8 95 spm
7f4e: 22 c0 rjmp .+68 ; 0x7f94 <main+0x194> 7f36: 1d c0 rjmp .+58 ; 0x7f72 <main+0x172>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
7f50: 84 37 cpi r24, 0x74 ; 116 7f38: 84 37 cpi r24, 0x74 ; 116
7f52: 91 f4 brne .+36 ; 0x7f78 <main+0x178> 7f3a: 69 f4 brne .+26 ; 0x7f56 <main+0x156>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
7f54: 2a d0 rcall .+84 ; 0x7faa <getch> 7f3c: 25 d0 rcall .+74 ; 0x7f88 <getch>
7f56: 90 e0 ldi r25, 0x00 ; 0 7f3e: 24 d0 rcall .+72 ; 0x7f88 <getch>
7f58: d8 2f mov r29, r24 7f40: 08 2f mov r16, r24
7f5a: cc 27 eor r28, r28
length |= getch();
7f5c: 26 d0 rcall .+76 ; 0x7faa <getch>
7f5e: 90 e0 ldi r25, 0x00 ; 0
7f60: c8 2b or r28, r24
7f62: d9 2b or r29, r25
desttype = getch(); desttype = getch();
7f64: 22 d0 rcall .+68 ; 0x7faa <getch> 7f42: 22 d0 rcall .+68 ; 0x7f88 <getch>
verifySpace(); verifySpace();
7f66: 33 d0 rcall .+102 ; 0x7fce <verifySpace> 7f44: 33 d0 rcall .+102 ; 0x7fac <verifySpace>
7f68: 85 01 movw r16, r10 7f46: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
7f6a: f8 01 movw r30, r16 7f48: fe 01 movw r30, r28
7f6c: 85 91 lpm r24, Z+ 7f4a: 85 91 lpm r24, Z+
7f6e: 8f 01 movw r16, r30 7f4c: ef 01 movw r28, r30
7f70: 14 d0 rcall .+40 ; 0x7f9a <putch> 7f4e: 14 d0 rcall .+40 ; 0x7f78 <putch>
} while (--length); } while (--length);
7f72: 21 97 sbiw r28, 0x01 ; 1 7f50: 01 50 subi r16, 0x01 ; 1
7f74: d1 f7 brne .-12 ; 0x7f6a <main+0x16a> 7f52: d1 f7 brne .-12 ; 0x7f48 <main+0x148>
7f76: 0e c0 rjmp .+28 ; 0x7f94 <main+0x194> 7f54: 0e c0 rjmp .+28 ; 0x7f72 <main+0x172>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
7f78: 85 37 cpi r24, 0x75 ; 117 7f56: 85 37 cpi r24, 0x75 ; 117
7f7a: 39 f4 brne .+14 ; 0x7f8a <main+0x18a> 7f58: 39 f4 brne .+14 ; 0x7f68 <main+0x168>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
7f7c: 28 d0 rcall .+80 ; 0x7fce <verifySpace> 7f5a: 28 d0 rcall .+80 ; 0x7fac <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
7f7e: 8e e1 ldi r24, 0x1E ; 30 7f5c: 8e e1 ldi r24, 0x1E ; 30
7f80: 0c d0 rcall .+24 ; 0x7f9a <putch> 7f5e: 0c d0 rcall .+24 ; 0x7f78 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
7f82: 85 e9 ldi r24, 0x95 ; 149 7f60: 85 e9 ldi r24, 0x95 ; 149
7f84: 0a d0 rcall .+20 ; 0x7f9a <putch> 7f62: 0a d0 rcall .+20 ; 0x7f78 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
7f86: 8f e0 ldi r24, 0x0F ; 15 7f64: 8f e0 ldi r24, 0x0F ; 15
7f88: 7d cf rjmp .-262 ; 0x7e84 <main+0x84> 7f66: 8e cf rjmp .-228 ; 0x7e84 <main+0x84>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
7f8a: 81 35 cpi r24, 0x51 ; 81 7f68: 81 35 cpi r24, 0x51 ; 81
7f8c: 11 f4 brne .+4 ; 0x7f92 <main+0x192> 7f6a: 11 f4 brne .+4 ; 0x7f70 <main+0x170>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
7f8e: 88 e0 ldi r24, 0x08 ; 8 7f6c: 88 e0 ldi r24, 0x08 ; 8
7f90: 18 d0 rcall .+48 ; 0x7fc2 <watchdogConfig> 7f6e: 18 d0 rcall .+48 ; 0x7fa0 <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
7f92: 1d d0 rcall .+58 ; 0x7fce <verifySpace> 7f70: 1d d0 rcall .+58 ; 0x7fac <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
7f94: 80 e1 ldi r24, 0x10 ; 16 7f72: 80 e1 ldi r24, 0x10 ; 16
7f96: 01 d0 rcall .+2 ; 0x7f9a <putch> 7f74: 01 d0 rcall .+2 ; 0x7f78 <putch>
7f98: 66 cf rjmp .-308 ; 0x7e66 <main+0x66> 7f76: 77 cf rjmp .-274 ; 0x7e66 <main+0x66>
00007f9a <putch>: 00007f78 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
7f9a: 98 2f mov r25, r24 7f78: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
7f9c: 80 91 c0 00 lds r24, 0x00C0 7f7a: 80 91 c0 00 lds r24, 0x00C0
7fa0: 85 ff sbrs r24, 5 7f7e: 85 ff sbrs r24, 5
7fa2: fc cf rjmp .-8 ; 0x7f9c <putch+0x2> 7f80: fc cf rjmp .-8 ; 0x7f7a <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
7fa4: 90 93 c6 00 sts 0x00C6, r25 7f82: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
7fa8: 08 95 ret 7f86: 08 95 ret
00007faa <getch>: 00007f88 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
7faa: 80 91 c0 00 lds r24, 0x00C0 7f88: 80 91 c0 00 lds r24, 0x00C0
7fae: 87 ff sbrs r24, 7 7f8c: 87 ff sbrs r24, 7
7fb0: fc cf rjmp .-8 ; 0x7faa <getch> 7f8e: fc cf rjmp .-8 ; 0x7f88 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
7fb2: 80 91 c0 00 lds r24, 0x00C0 7f90: 80 91 c0 00 lds r24, 0x00C0
7fb6: 84 fd sbrc r24, 4 7f94: 84 fd sbrc r24, 4
7fb8: 01 c0 rjmp .+2 ; 0x7fbc <getch+0x12> 7f96: 01 c0 rjmp .+2 ; 0x7f9a <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
7fba: a8 95 wdr 7f98: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
7fbc: 80 91 c6 00 lds r24, 0x00C6 7f9a: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
7fc0: 08 95 ret 7f9e: 08 95 ret
00007fc2 <watchdogConfig>: 00007fa0 <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
7fc2: e0 e6 ldi r30, 0x60 ; 96 7fa0: e0 e6 ldi r30, 0x60 ; 96
7fc4: f0 e0 ldi r31, 0x00 ; 0 7fa2: f0 e0 ldi r31, 0x00 ; 0
7fc6: 98 e1 ldi r25, 0x18 ; 24 7fa4: 98 e1 ldi r25, 0x18 ; 24
7fc8: 90 83 st Z, r25 7fa6: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
7fca: 80 83 st Z, r24 7fa8: 80 83 st Z, r24
} }
7fcc: 08 95 ret 7faa: 08 95 ret
00007fce <verifySpace>: 00007fac <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
7fce: ed df rcall .-38 ; 0x7faa <getch> 7fac: ed df rcall .-38 ; 0x7f88 <getch>
7fd0: 80 32 cpi r24, 0x20 ; 32 7fae: 80 32 cpi r24, 0x20 ; 32
7fd2: 19 f0 breq .+6 ; 0x7fda <verifySpace+0xc> 7fb0: 19 f0 breq .+6 ; 0x7fb8 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
7fd4: 88 e0 ldi r24, 0x08 ; 8 7fb2: 88 e0 ldi r24, 0x08 ; 8
7fd6: f5 df rcall .-22 ; 0x7fc2 <watchdogConfig> 7fb4: f5 df rcall .-22 ; 0x7fa0 <watchdogConfig>
7fd8: ff cf rjmp .-2 ; 0x7fd8 <verifySpace+0xa> 7fb6: ff cf rjmp .-2 ; 0x7fb6 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
7fda: 84 e1 ldi r24, 0x14 ; 20 7fb8: 84 e1 ldi r24, 0x14 ; 20
} }
7fdc: de cf rjmp .-68 ; 0x7f9a <putch> 7fba: de cf rjmp .-68 ; 0x7f78 <putch>
00007fde <getNch>: 00007fbc <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
7fde: 1f 93 push r17 7fbc: 1f 93 push r17
7fe0: 18 2f mov r17, r24 7fbe: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
7fe2: e3 df rcall .-58 ; 0x7faa <getch> 7fc0: e3 df rcall .-58 ; 0x7f88 <getch>
7fe4: 11 50 subi r17, 0x01 ; 1 7fc2: 11 50 subi r17, 0x01 ; 1
7fe6: e9 f7 brne .-6 ; 0x7fe2 <getNch+0x4> 7fc4: e9 f7 brne .-6 ; 0x7fc0 <getNch+0x4>
verifySpace(); verifySpace();
7fe8: f2 df rcall .-28 ; 0x7fce <verifySpace> 7fc6: f2 df rcall .-28 ; 0x7fac <verifySpace>
} }
7fea: 1f 91 pop r17 7fc8: 1f 91 pop r17
7fec: 08 95 ret 7fca: 08 95 ret
00007fee <appStart>: 00007fcc <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
7fee: 28 2e mov r2, r24 7fcc: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
7ff0: 80 e0 ldi r24, 0x00 ; 0 7fce: 80 e0 ldi r24, 0x00 ; 0
7ff2: e7 df rcall .-50 ; 0x7fc2 <watchdogConfig> 7fd0: e7 df rcall .-50 ; 0x7fa0 <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
7ff4: ee 27 eor r30, r30 7fd2: ee 27 eor r30, r30
7ff6: ff 27 eor r31, r31 7fd4: ff 27 eor r31, r31
7ff8: 09 94 ijmp 7fd6: 09 94 ijmp

View File

@@ -1,35 +1,33 @@
:107E0000112494B714BE892F8D7011F0892FEFD0F3 :107E0000112494B714BE892F8D7011F0892FDED004
:107E100085E08093810082E08093C00088E18093B8 :107E100085E08093810082E08093C00088E18093B8
:107E2000C10086E08093C20088E08093C4008EE0A9 :107E2000C10086E08093C20088E08093C4008EE0A9
:107E3000C8D0259A86E028E13EEF91E03093850096 :107E3000B7D0259A86E028E13EEF91E030938500A7
:107E40002093840096BBB09BFECF1D9AA8958150CD :107E40002093840096BBB09BFECF1D9AA8958150CD
:107E5000A9F7AA24BB2433E0832E7724739425E06A :107E5000A9F7EE24FF24B3E0AB2EBB24B394A5E036
:107E6000922E91E1C92EA1D0813471F49ED0182FA9 :107E6000DA2EF1E1CF2E90D0813471F48DD0082F2D
:107E7000AED0123811F481E005C0113811F486E05B :107E70009DD0023811F482E005C0013811F486E08B
:107E800001C083E08AD086C0823411F484E103C04B :107E800001C083E079D075C0823411F484E103C06D
:107E9000853419F485E0A3D07DC0853579F485D08B :107E9000853419F485E092D06CC0853579F474D0BE
:107EA000E82EFF2482D0082F10E0102F00270E2983 :107EA000E82EFF2471D0082F10E0102F00270E2994
:107EB0001F29000F111F8BD058016CC0863521F48B :107EB0001F29000F111F7AD078015BC0863521F48D
:107EC00084E08DD080E0DECF843609F041C06DD0F3 :107EC00084E07CD080E0DECF843609F035C05CD021
:107ED00090E0182F002769D090E0082B192B65D06F :107ED0005BD0182F59D0082FC0E0D1E055D089933E
:107EE000D82EE801E12CF1E0FF2E5FD0F70181935D :107EE0001C17E1F763D0053409F4FFCFF701A7BEF3
:107EF0007F012197D1F76BD0F5E4DF1609F4FFCFAE :107EF000E89507B600FCFDCFA701A0E0B1E02C910A
:107F0000F50187BEE89507B600FCFDCFB501A801D5 :107F000030E011968C91119790E0982F8827822B62
:107F1000A0E0B1E02C9130E011968C91119790E0A7 :107F1000932B1296FA010C01B7BEE89511244E5F1F
:107F2000982F8827822B932B1296FB010C0177BE8A :107F20005F4F1A1761F7F701D7BEE89507B600FC57
:107F3000E89511246E5F7F4F4250504059F7F5018C :107F3000FDCFC7BEE8951DC0843769F425D024D095
:107F400097BEE89507B600FCFDCFC7BEE89522C0F6 :107F4000082F22D033D0E701FE018591EF0114D034
:107F5000843791F42AD090E0D82FCC2726D090E017 :107F50000150D1F70EC0853739F428D08EE10CD00E
:107F6000C82BD92B22D033D08501F80185918F0100 :107F600085E90AD08FE08ECF813511F488E018D0F2
:107F700014D02197D1F70EC0853739F428D08EE17F :107F70001DD080E101D077CF982F8091C00085FF80
:107F80000CD085E90AD08FE07DCF813511F488E0EF :107F8000FCCF9093C60008958091C00087FFFCCF7E
:107F900018D01DD080E101D066CF982F8091C0000D :107F90008091C00084FD01C0A8958091C60008951D
:107FA00085FFFCCF9093C60008958091C00087FFA5 :107FA000E0E6F0E098E1908380830895EDDF803291
:107FB000FCCF8091C00084FD01C0A8958091C600CF :107FB00019F088E0F5DFFFCF84E1DECF1F93182FA3
:107FC0000895E0E6F0E098E1908380830895EDDF86 :107FC000E3DF1150E9F7F2DF1F910895282E80E0DA
:107FD000803219F088E0F5DFFFCF84E1DECF1F9318 :087FD000E7DFEE27FF2709940B
:107FE000182FE3DF1150E9F7F2DF1F910895282ED3 :027FFE00020679
:0A7FF00080E0E7DFEE27FF27099489
:027FFE0001067A
:0400000300007E007B :0400000300007E007B
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega328.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001fa 00007e00 00007e00 00000074 2**1 0 .text 000001d8 00007e00 00007e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00007ffe 00007ffe 0000026e 2**0 1 .version 00000002 00007ffe 00007ffe 0000024c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 00000270 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024e 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000298 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000276 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030c 2**0 4 .debug_info 000003ea 00000000 00000000 000002ea 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ec 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d4 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 0000043b 00000000 00000000 000008dd 2**0 6 .debug_line 0000042b 00000000 00000000 000008c3 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d18 2**2 7 .debug_frame 00000080 00000000 00000000 00000cf0 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d98 2**0 8 .debug_str 0000017c 00000000 00000000 00000d70 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f0a 2**0 9 .debug_loc 00000300 00000000 00000000 00000eec 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011e1 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011ec 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
7e0a: 11 f0 breq .+4 ; 0x7e10 <main+0x10> 7e0a: 11 f0 breq .+4 ; 0x7e10 <main+0x10>
appStart(ch); appStart(ch);
7e0c: 89 2f mov r24, r25 7e0c: 89 2f mov r24, r25
7e0e: ef d0 rcall .+478 ; 0x7fee <appStart> 7e0e: de d0 rcall .+444 ; 0x7fcc <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
7e2e: 8e e0 ldi r24, 0x0E ; 14 7e2e: 8e e0 ldi r24, 0x0E ; 14
7e30: c8 d0 rcall .+400 ; 0x7fc2 <watchdogConfig> 7e30: b7 d0 rcall .+366 ; 0x7fa0 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,66 +131,66 @@ void watchdogReset() {
} while (--count); } while (--count);
7e4e: 81 50 subi r24, 0x01 ; 1 7e4e: 81 50 subi r24, 0x01 ; 1
7e50: a9 f7 brne .-22 ; 0x7e3c <main+0x3c> 7e50: a9 f7 brne .-22 ; 0x7e3c <main+0x3c>
7e52: aa 24 eor r10, r10 7e52: ee 24 eor r14, r14
7e54: bb 24 eor r11, r11 7e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
7e56: 33 e0 ldi r19, 0x03 ; 3 7e56: b3 e0 ldi r27, 0x03 ; 3
7e58: 83 2e mov r8, r19 7e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
7e5a: 77 24 eor r7, r7 7e5a: bb 24 eor r11, r11
7e5c: 73 94 inc r7 7e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
7e5e: 25 e0 ldi r18, 0x05 ; 5 7e5e: a5 e0 ldi r26, 0x05 ; 5
7e60: 92 2e mov r9, r18 7e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
7e62: 91 e1 ldi r25, 0x11 ; 17 7e62: f1 e1 ldi r31, 0x11 ; 17
7e64: c9 2e mov r12, r25 7e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
7e66: a1 d0 rcall .+322 ; 0x7faa <getch> 7e66: 90 d0 rcall .+288 ; 0x7f88 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
7e68: 81 34 cpi r24, 0x41 ; 65 7e68: 81 34 cpi r24, 0x41 ; 65
7e6a: 71 f4 brne .+28 ; 0x7e88 <main+0x88> 7e6a: 71 f4 brne .+28 ; 0x7e88 <main+0x88>
unsigned char which = getch(); unsigned char which = getch();
7e6c: 9e d0 rcall .+316 ; 0x7faa <getch> 7e6c: 8d d0 rcall .+282 ; 0x7f88 <getch>
7e6e: 18 2f mov r17, r24 7e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
7e70: ae d0 rcall .+348 ; 0x7fce <verifySpace> 7e70: 9d d0 rcall .+314 ; 0x7fac <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
7e72: 12 38 cpi r17, 0x82 ; 130 7e72: 02 38 cpi r16, 0x82 ; 130
7e74: 11 f4 brne .+4 ; 0x7e7a <main+0x7a> 7e74: 11 f4 brne .+4 ; 0x7e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
7e76: 81 e0 ldi r24, 0x01 ; 1 7e76: 82 e0 ldi r24, 0x02 ; 2
7e78: 05 c0 rjmp .+10 ; 0x7e84 <main+0x84> 7e78: 05 c0 rjmp .+10 ; 0x7e84 <main+0x84>
} else if (which == 0x81) { } else if (which == 0x81) {
7e7a: 11 38 cpi r17, 0x81 ; 129 7e7a: 01 38 cpi r16, 0x81 ; 129
7e7c: 11 f4 brne .+4 ; 0x7e82 <main+0x82> 7e7c: 11 f4 brne .+4 ; 0x7e82 <main+0x82>
putch(optiboot_version >> 8); putch(optiboot_version >> 8);
7e7e: 86 e0 ldi r24, 0x06 ; 6 7e7e: 86 e0 ldi r24, 0x06 ; 6
@@ -202,8 +202,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
7e82: 83 e0 ldi r24, 0x03 ; 3 7e82: 83 e0 ldi r24, 0x03 ; 3
7e84: 8a d0 rcall .+276 ; 0x7f9a <putch> 7e84: 79 d0 rcall .+242 ; 0x7f78 <putch>
7e86: 86 c0 rjmp .+268 ; 0x7f94 <main+0x194> 7e86: 75 c0 rjmp .+234 ; 0x7f72 <main+0x172>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -220,8 +220,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
7e94: 85 e0 ldi r24, 0x05 ; 5 7e94: 85 e0 ldi r24, 0x05 ; 5
7e96: a3 d0 rcall .+326 ; 0x7fde <getNch> 7e96: 92 d0 rcall .+292 ; 0x7fbc <getNch>
7e98: 7d c0 rjmp .+250 ; 0x7f94 <main+0x194> 7e98: 6c c0 rjmp .+216 ; 0x7f72 <main+0x172>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
7e9a: 85 35 cpi r24, 0x55 ; 85 7e9a: 85 35 cpi r24, 0x55 ; 85
@@ -229,11 +229,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
7e9e: 85 d0 rcall .+266 ; 0x7faa <getch> 7e9e: 74 d0 rcall .+232 ; 0x7f88 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
7ea0: e8 2e mov r14, r24 7ea0: e8 2e mov r14, r24
7ea2: ff 24 eor r15, r15 7ea2: ff 24 eor r15, r15
7ea4: 82 d0 rcall .+260 ; 0x7faa <getch> 7ea4: 71 d0 rcall .+226 ; 0x7f88 <getch>
7ea6: 08 2f mov r16, r24 7ea6: 08 2f mov r16, r24
7ea8: 10 e0 ldi r17, 0x00 ; 0 7ea8: 10 e0 ldi r17, 0x00 ; 0
7eaa: 10 2f mov r17, r16 7eaa: 10 2f mov r17, r16
@@ -249,9 +249,9 @@ void watchdogReset() {
7eb4: 11 1f adc r17, r17 7eb4: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
7eb6: 8b d0 rcall .+278 ; 0x7fce <verifySpace> 7eb6: 7a d0 rcall .+244 ; 0x7fac <verifySpace>
7eb8: 58 01 movw r10, r16 7eb8: 78 01 movw r14, r16
7eba: 6c c0 rjmp .+216 ; 0x7f94 <main+0x194> 7eba: 5b c0 rjmp .+182 ; 0x7f72 <main+0x172>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
7ebc: 86 35 cpi r24, 0x56 ; 86 7ebc: 86 35 cpi r24, 0x56 ; 86
@@ -259,7 +259,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
7ec0: 84 e0 ldi r24, 0x04 ; 4 7ec0: 84 e0 ldi r24, 0x04 ; 4
7ec2: 8d d0 rcall .+282 ; 0x7fde <getNch> 7ec2: 7c d0 rcall .+248 ; 0x7fbc <getNch>
putch(0x00); putch(0x00);
7ec4: 80 e0 ldi r24, 0x00 ; 0 7ec4: 80 e0 ldi r24, 0x00 ; 0
7ec6: de cf rjmp .-68 ; 0x7e84 <main+0x84> 7ec6: de cf rjmp .-68 ; 0x7e84 <main+0x84>
@@ -268,339 +268,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
7ec8: 84 36 cpi r24, 0x64 ; 100 7ec8: 84 36 cpi r24, 0x64 ; 100
7eca: 09 f0 breq .+2 ; 0x7ece <main+0xce> 7eca: 09 f0 breq .+2 ; 0x7ece <main+0xce>
7ecc: 41 c0 rjmp .+130 ; 0x7f50 <main+0x150> 7ecc: 35 c0 rjmp .+106 ; 0x7f38 <main+0x138>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
7ece: 6d d0 rcall .+218 ; 0x7faa <getch> 7ece: 5c d0 rcall .+184 ; 0x7f88 <getch>
7ed0: 90 e0 ldi r25, 0x00 ; 0 7ed0: 5b d0 rcall .+182 ; 0x7f88 <getch>
7ed2: 18 2f mov r17, r24 7ed2: 18 2f mov r17, r24
7ed4: 00 27 eor r16, r16
length |= getch();
7ed6: 69 d0 rcall .+210 ; 0x7faa <getch>
7ed8: 90 e0 ldi r25, 0x00 ; 0
7eda: 08 2b or r16, r24
7edc: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
7ede: 65 d0 rcall .+202 ; 0x7faa <getch> 7ed4: 59 d0 rcall .+178 ; 0x7f88 <getch>
7ee0: d8 2e mov r13, r24 7ed6: 08 2f mov r16, r24
7ee2: e8 01 movw r28, r16 7ed8: c0 e0 ldi r28, 0x00 ; 0
7ee4: e1 2c mov r14, r1 7eda: d1 e0 ldi r29, 0x01 ; 1
7ee6: f1 e0 ldi r31, 0x01 ; 1
7ee8: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
7eea: 5f d0 rcall .+190 ; 0x7faa <getch> 7edc: 55 d0 rcall .+170 ; 0x7f88 <getch>
7eec: f7 01 movw r30, r14 7ede: 89 93 st Y+, r24
7eee: 81 93 st Z+, r24
7ef0: 7f 01 movw r14, r30
while (--length); while (--length);
7ef2: 21 97 sbiw r28, 0x01 ; 1 7ee0: 1c 17 cp r17, r28
7ef4: d1 f7 brne .-12 ; 0x7eea <main+0xea> 7ee2: e1 f7 brne .-8 ; 0x7edc <main+0xdc>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
7ef6: 6b d0 rcall .+214 ; 0x7fce <verifySpace> 7ee4: 63 d0 rcall .+198 ; 0x7fac <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
7ef8: f5 e4 ldi r31, 0x45 ; 69 7ee6: 05 34 cpi r16, 0x45 ; 69
7efa: df 16 cp r13, r31 7ee8: 09 f4 brne .+2 ; 0x7eec <main+0xec>
7efc: 09 f4 brne .+2 ; 0x7f00 <main+0x100> 7eea: ff cf rjmp .-2 ; 0x7eea <main+0xea>
7efe: ff cf rjmp .-2 ; 0x7efe <main+0xfe>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
7f00: f5 01 movw r30, r10 7eec: f7 01 movw r30, r14
7f02: 87 be out 0x37, r8 ; 55 7eee: a7 be out 0x37, r10 ; 55
7f04: e8 95 spm 7ef0: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
7f06: 07 b6 in r0, 0x37 ; 55 7ef2: 07 b6 in r0, 0x37 ; 55
7f08: 00 fc sbrc r0, 0 7ef4: 00 fc sbrc r0, 0
7f0a: fd cf rjmp .-6 ; 0x7f06 <main+0x106> 7ef6: fd cf rjmp .-6 ; 0x7ef2 <main+0xf2>
7f0c: b5 01 movw r22, r10 7ef8: a7 01 movw r20, r14
7f0e: a8 01 movw r20, r16 7efa: a0 e0 ldi r26, 0x00 ; 0
7f10: a0 e0 ldi r26, 0x00 ; 0 7efc: b1 e0 ldi r27, 0x01 ; 1
7f12: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
7f14: 2c 91 ld r18, X 7efe: 2c 91 ld r18, X
7f16: 30 e0 ldi r19, 0x00 ; 0 7f00: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
7f18: 11 96 adiw r26, 0x01 ; 1 7f02: 11 96 adiw r26, 0x01 ; 1
7f1a: 8c 91 ld r24, X 7f04: 8c 91 ld r24, X
7f1c: 11 97 sbiw r26, 0x01 ; 1 7f06: 11 97 sbiw r26, 0x01 ; 1
7f1e: 90 e0 ldi r25, 0x00 ; 0 7f08: 90 e0 ldi r25, 0x00 ; 0
7f20: 98 2f mov r25, r24 7f0a: 98 2f mov r25, r24
7f22: 88 27 eor r24, r24 7f0c: 88 27 eor r24, r24
7f24: 82 2b or r24, r18 7f0e: 82 2b or r24, r18
7f26: 93 2b or r25, r19 7f10: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
7f28: 12 96 adiw r26, 0x02 ; 2 7f12: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
7f2a: fb 01 movw r30, r22 7f14: fa 01 movw r30, r20
7f2c: 0c 01 movw r0, r24 7f16: 0c 01 movw r0, r24
7f2e: 77 be out 0x37, r7 ; 55 7f18: b7 be out 0x37, r11 ; 55
7f30: e8 95 spm 7f1a: e8 95 spm
7f32: 11 24 eor r1, r1 7f1c: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
7f34: 6e 5f subi r22, 0xFE ; 254 7f1e: 4e 5f subi r20, 0xFE ; 254
7f36: 7f 4f sbci r23, 0xFF ; 255 7f20: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
7f38: 42 50 subi r20, 0x02 ; 2 7f22: 1a 17 cp r17, r26
7f3a: 50 40 sbci r21, 0x00 ; 0 7f24: 61 f7 brne .-40 ; 0x7efe <main+0xfe>
7f3c: 59 f7 brne .-42 ; 0x7f14 <main+0x114>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
7f3e: f5 01 movw r30, r10 7f26: f7 01 movw r30, r14
7f40: 97 be out 0x37, r9 ; 55 7f28: d7 be out 0x37, r13 ; 55
7f42: e8 95 spm 7f2a: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
7f44: 07 b6 in r0, 0x37 ; 55 7f2c: 07 b6 in r0, 0x37 ; 55
7f46: 00 fc sbrc r0, 0 7f2e: 00 fc sbrc r0, 0
7f48: fd cf rjmp .-6 ; 0x7f44 <main+0x144> 7f30: fd cf rjmp .-6 ; 0x7f2c <main+0x12c>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
7f4a: c7 be out 0x37, r12 ; 55 7f32: c7 be out 0x37, r12 ; 55
7f4c: e8 95 spm 7f34: e8 95 spm
7f4e: 22 c0 rjmp .+68 ; 0x7f94 <main+0x194> 7f36: 1d c0 rjmp .+58 ; 0x7f72 <main+0x172>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
7f50: 84 37 cpi r24, 0x74 ; 116 7f38: 84 37 cpi r24, 0x74 ; 116
7f52: 91 f4 brne .+36 ; 0x7f78 <main+0x178> 7f3a: 69 f4 brne .+26 ; 0x7f56 <main+0x156>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
7f54: 2a d0 rcall .+84 ; 0x7faa <getch> 7f3c: 25 d0 rcall .+74 ; 0x7f88 <getch>
7f56: 90 e0 ldi r25, 0x00 ; 0 7f3e: 24 d0 rcall .+72 ; 0x7f88 <getch>
7f58: d8 2f mov r29, r24 7f40: 08 2f mov r16, r24
7f5a: cc 27 eor r28, r28
length |= getch();
7f5c: 26 d0 rcall .+76 ; 0x7faa <getch>
7f5e: 90 e0 ldi r25, 0x00 ; 0
7f60: c8 2b or r28, r24
7f62: d9 2b or r29, r25
desttype = getch(); desttype = getch();
7f64: 22 d0 rcall .+68 ; 0x7faa <getch> 7f42: 22 d0 rcall .+68 ; 0x7f88 <getch>
verifySpace(); verifySpace();
7f66: 33 d0 rcall .+102 ; 0x7fce <verifySpace> 7f44: 33 d0 rcall .+102 ; 0x7fac <verifySpace>
7f68: 85 01 movw r16, r10 7f46: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
7f6a: f8 01 movw r30, r16 7f48: fe 01 movw r30, r28
7f6c: 85 91 lpm r24, Z+ 7f4a: 85 91 lpm r24, Z+
7f6e: 8f 01 movw r16, r30 7f4c: ef 01 movw r28, r30
7f70: 14 d0 rcall .+40 ; 0x7f9a <putch> 7f4e: 14 d0 rcall .+40 ; 0x7f78 <putch>
} while (--length); } while (--length);
7f72: 21 97 sbiw r28, 0x01 ; 1 7f50: 01 50 subi r16, 0x01 ; 1
7f74: d1 f7 brne .-12 ; 0x7f6a <main+0x16a> 7f52: d1 f7 brne .-12 ; 0x7f48 <main+0x148>
7f76: 0e c0 rjmp .+28 ; 0x7f94 <main+0x194> 7f54: 0e c0 rjmp .+28 ; 0x7f72 <main+0x172>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
7f78: 85 37 cpi r24, 0x75 ; 117 7f56: 85 37 cpi r24, 0x75 ; 117
7f7a: 39 f4 brne .+14 ; 0x7f8a <main+0x18a> 7f58: 39 f4 brne .+14 ; 0x7f68 <main+0x168>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
7f7c: 28 d0 rcall .+80 ; 0x7fce <verifySpace> 7f5a: 28 d0 rcall .+80 ; 0x7fac <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
7f7e: 8e e1 ldi r24, 0x1E ; 30 7f5c: 8e e1 ldi r24, 0x1E ; 30
7f80: 0c d0 rcall .+24 ; 0x7f9a <putch> 7f5e: 0c d0 rcall .+24 ; 0x7f78 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
7f82: 85 e9 ldi r24, 0x95 ; 149 7f60: 85 e9 ldi r24, 0x95 ; 149
7f84: 0a d0 rcall .+20 ; 0x7f9a <putch> 7f62: 0a d0 rcall .+20 ; 0x7f78 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
7f86: 8f e0 ldi r24, 0x0F ; 15 7f64: 8f e0 ldi r24, 0x0F ; 15
7f88: 7d cf rjmp .-262 ; 0x7e84 <main+0x84> 7f66: 8e cf rjmp .-228 ; 0x7e84 <main+0x84>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
7f8a: 81 35 cpi r24, 0x51 ; 81 7f68: 81 35 cpi r24, 0x51 ; 81
7f8c: 11 f4 brne .+4 ; 0x7f92 <main+0x192> 7f6a: 11 f4 brne .+4 ; 0x7f70 <main+0x170>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
7f8e: 88 e0 ldi r24, 0x08 ; 8 7f6c: 88 e0 ldi r24, 0x08 ; 8
7f90: 18 d0 rcall .+48 ; 0x7fc2 <watchdogConfig> 7f6e: 18 d0 rcall .+48 ; 0x7fa0 <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
7f92: 1d d0 rcall .+58 ; 0x7fce <verifySpace> 7f70: 1d d0 rcall .+58 ; 0x7fac <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
7f94: 80 e1 ldi r24, 0x10 ; 16 7f72: 80 e1 ldi r24, 0x10 ; 16
7f96: 01 d0 rcall .+2 ; 0x7f9a <putch> 7f74: 01 d0 rcall .+2 ; 0x7f78 <putch>
7f98: 66 cf rjmp .-308 ; 0x7e66 <main+0x66> 7f76: 77 cf rjmp .-274 ; 0x7e66 <main+0x66>
00007f9a <putch>: 00007f78 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
7f9a: 98 2f mov r25, r24 7f78: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
7f9c: 80 91 c0 00 lds r24, 0x00C0 7f7a: 80 91 c0 00 lds r24, 0x00C0
7fa0: 85 ff sbrs r24, 5 7f7e: 85 ff sbrs r24, 5
7fa2: fc cf rjmp .-8 ; 0x7f9c <putch+0x2> 7f80: fc cf rjmp .-8 ; 0x7f7a <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
7fa4: 90 93 c6 00 sts 0x00C6, r25 7f82: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
7fa8: 08 95 ret 7f86: 08 95 ret
00007faa <getch>: 00007f88 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
7faa: 80 91 c0 00 lds r24, 0x00C0 7f88: 80 91 c0 00 lds r24, 0x00C0
7fae: 87 ff sbrs r24, 7 7f8c: 87 ff sbrs r24, 7
7fb0: fc cf rjmp .-8 ; 0x7faa <getch> 7f8e: fc cf rjmp .-8 ; 0x7f88 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
7fb2: 80 91 c0 00 lds r24, 0x00C0 7f90: 80 91 c0 00 lds r24, 0x00C0
7fb6: 84 fd sbrc r24, 4 7f94: 84 fd sbrc r24, 4
7fb8: 01 c0 rjmp .+2 ; 0x7fbc <getch+0x12> 7f96: 01 c0 rjmp .+2 ; 0x7f9a <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
7fba: a8 95 wdr 7f98: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
7fbc: 80 91 c6 00 lds r24, 0x00C6 7f9a: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
7fc0: 08 95 ret 7f9e: 08 95 ret
00007fc2 <watchdogConfig>: 00007fa0 <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
7fc2: e0 e6 ldi r30, 0x60 ; 96 7fa0: e0 e6 ldi r30, 0x60 ; 96
7fc4: f0 e0 ldi r31, 0x00 ; 0 7fa2: f0 e0 ldi r31, 0x00 ; 0
7fc6: 98 e1 ldi r25, 0x18 ; 24 7fa4: 98 e1 ldi r25, 0x18 ; 24
7fc8: 90 83 st Z, r25 7fa6: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
7fca: 80 83 st Z, r24 7fa8: 80 83 st Z, r24
} }
7fcc: 08 95 ret 7faa: 08 95 ret
00007fce <verifySpace>: 00007fac <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
7fce: ed df rcall .-38 ; 0x7faa <getch> 7fac: ed df rcall .-38 ; 0x7f88 <getch>
7fd0: 80 32 cpi r24, 0x20 ; 32 7fae: 80 32 cpi r24, 0x20 ; 32
7fd2: 19 f0 breq .+6 ; 0x7fda <verifySpace+0xc> 7fb0: 19 f0 breq .+6 ; 0x7fb8 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
7fd4: 88 e0 ldi r24, 0x08 ; 8 7fb2: 88 e0 ldi r24, 0x08 ; 8
7fd6: f5 df rcall .-22 ; 0x7fc2 <watchdogConfig> 7fb4: f5 df rcall .-22 ; 0x7fa0 <watchdogConfig>
7fd8: ff cf rjmp .-2 ; 0x7fd8 <verifySpace+0xa> 7fb6: ff cf rjmp .-2 ; 0x7fb6 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
7fda: 84 e1 ldi r24, 0x14 ; 20 7fb8: 84 e1 ldi r24, 0x14 ; 20
} }
7fdc: de cf rjmp .-68 ; 0x7f9a <putch> 7fba: de cf rjmp .-68 ; 0x7f78 <putch>
00007fde <getNch>: 00007fbc <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
7fde: 1f 93 push r17 7fbc: 1f 93 push r17
7fe0: 18 2f mov r17, r24 7fbe: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
7fe2: e3 df rcall .-58 ; 0x7faa <getch> 7fc0: e3 df rcall .-58 ; 0x7f88 <getch>
7fe4: 11 50 subi r17, 0x01 ; 1 7fc2: 11 50 subi r17, 0x01 ; 1
7fe6: e9 f7 brne .-6 ; 0x7fe2 <getNch+0x4> 7fc4: e9 f7 brne .-6 ; 0x7fc0 <getNch+0x4>
verifySpace(); verifySpace();
7fe8: f2 df rcall .-28 ; 0x7fce <verifySpace> 7fc6: f2 df rcall .-28 ; 0x7fac <verifySpace>
} }
7fea: 1f 91 pop r17 7fc8: 1f 91 pop r17
7fec: 08 95 ret 7fca: 08 95 ret
00007fee <appStart>: 00007fcc <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
7fee: 28 2e mov r2, r24 7fcc: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
7ff0: 80 e0 ldi r24, 0x00 ; 0 7fce: 80 e0 ldi r24, 0x00 ; 0
7ff2: e7 df rcall .-50 ; 0x7fc2 <watchdogConfig> 7fd0: e7 df rcall .-50 ; 0x7fa0 <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
7ff4: ee 27 eor r30, r30 7fd2: ee 27 eor r30, r30
7ff6: ff 27 eor r31, r31 7fd4: ff 27 eor r31, r31
7ff8: 09 94 ijmp 7fd6: 09 94 ijmp

View File

@@ -3,27 +3,27 @@ optiboot_atmega168.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001f8 00003e00 00003e00 00000074 2**1 0 .text 000001d6 00003e00 00003e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00003ffe 00003ffe 0000026c 2**0 1 .version 00000002 00003ffe 00003ffe 0000024a 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 0000026e 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000296 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000274 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030a 2**0 4 .debug_info 000003ea 00000000 00000000 000002e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ea 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 00000433 00000000 00000000 000008db 2**0 6 .debug_line 00000423 00000000 00000000 000008c1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d10 2**2 7 .debug_frame 00000080 00000000 00000000 00000ce4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d90 2**0 8 .debug_str 0000017c 00000000 00000000 00000d64 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f02 2**0 9 .debug_loc 00000300 00000000 00000000 00000ee0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011d9 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011e0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10> 3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10>
appStart(ch); appStart(ch);
3e0c: 89 2f mov r24, r25 3e0c: 89 2f mov r24, r25
3e0e: ee d0 rcall .+476 ; 0x3fec <appStart> 3e0e: dd d0 rcall .+442 ; 0x3fca <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
3e2e: 8e e0 ldi r24, 0x0E ; 14 3e2e: 8e e0 ldi r24, 0x0E ; 14
3e30: c7 d0 rcall .+398 ; 0x3fc0 <watchdogConfig> 3e30: b6 d0 rcall .+364 ; 0x3f9e <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,68 +131,68 @@ void watchdogReset() {
} while (--count); } while (--count);
3e4e: 81 50 subi r24, 0x01 ; 1 3e4e: 81 50 subi r24, 0x01 ; 1
3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c> 3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c>
3e52: aa 24 eor r10, r10 3e52: ee 24 eor r14, r14
3e54: bb 24 eor r11, r11 3e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3e56: 33 e0 ldi r19, 0x03 ; 3 3e56: b3 e0 ldi r27, 0x03 ; 3
3e58: 83 2e mov r8, r19 3e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3e5a: 77 24 eor r7, r7 3e5a: bb 24 eor r11, r11
3e5c: 73 94 inc r7 3e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3e5e: 25 e0 ldi r18, 0x05 ; 5 3e5e: a5 e0 ldi r26, 0x05 ; 5
3e60: 92 2e mov r9, r18 3e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3e62: 91 e1 ldi r25, 0x11 ; 17 3e62: f1 e1 ldi r31, 0x11 ; 17
3e64: c9 2e mov r12, r25 3e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
3e66: a0 d0 rcall .+320 ; 0x3fa8 <getch> 3e66: 8f d0 rcall .+286 ; 0x3f86 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
3e68: 81 34 cpi r24, 0x41 ; 65 3e68: 81 34 cpi r24, 0x41 ; 65
3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86> 3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86>
unsigned char which = getch(); unsigned char which = getch();
3e6c: 9d d0 rcall .+314 ; 0x3fa8 <getch> 3e6c: 8c d0 rcall .+280 ; 0x3f86 <getch>
3e6e: 18 2f mov r17, r24 3e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
3e70: ad d0 rcall .+346 ; 0x3fcc <verifySpace> 3e70: 9c d0 rcall .+312 ; 0x3faa <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
3e72: 12 38 cpi r17, 0x82 ; 130 3e72: 02 38 cpi r16, 0x82 ; 130
3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a> 3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
3e76: 81 e0 ldi r24, 0x01 ; 1 3e76: 82 e0 ldi r24, 0x02 ; 2
3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82> 3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82>
} else if (which == 0x81) { } else if (which == 0x81) {
3e7a: 11 38 cpi r17, 0x81 ; 129 3e7a: 01 38 cpi r16, 0x81 ; 129
3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80> 3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80>
3e7e: 82 c0 rjmp .+260 ; 0x3f84 <main+0x184> 3e7e: 71 c0 rjmp .+226 ; 0x3f62 <main+0x162>
} else { } else {
/* /*
* GET PARAMETER returns a generic 0x03 reply for * GET PARAMETER returns a generic 0x03 reply for
@@ -200,8 +200,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
3e80: 83 e0 ldi r24, 0x03 ; 3 3e80: 83 e0 ldi r24, 0x03 ; 3
3e82: 8a d0 rcall .+276 ; 0x3f98 <putch> 3e82: 79 d0 rcall .+242 ; 0x3f76 <putch>
3e84: 86 c0 rjmp .+268 ; 0x3f92 <main+0x192> 3e84: 75 c0 rjmp .+234 ; 0x3f70 <main+0x170>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -218,8 +218,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
3e92: 85 e0 ldi r24, 0x05 ; 5 3e92: 85 e0 ldi r24, 0x05 ; 5
3e94: a3 d0 rcall .+326 ; 0x3fdc <getNch> 3e94: 92 d0 rcall .+292 ; 0x3fba <getNch>
3e96: 7d c0 rjmp .+250 ; 0x3f92 <main+0x192> 3e96: 6c c0 rjmp .+216 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
3e98: 85 35 cpi r24, 0x55 ; 85 3e98: 85 35 cpi r24, 0x55 ; 85
@@ -227,11 +227,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
3e9c: 85 d0 rcall .+266 ; 0x3fa8 <getch> 3e9c: 74 d0 rcall .+232 ; 0x3f86 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
3e9e: e8 2e mov r14, r24 3e9e: e8 2e mov r14, r24
3ea0: ff 24 eor r15, r15 3ea0: ff 24 eor r15, r15
3ea2: 82 d0 rcall .+260 ; 0x3fa8 <getch> 3ea2: 71 d0 rcall .+226 ; 0x3f86 <getch>
3ea4: 08 2f mov r16, r24 3ea4: 08 2f mov r16, r24
3ea6: 10 e0 ldi r17, 0x00 ; 0 3ea6: 10 e0 ldi r17, 0x00 ; 0
3ea8: 10 2f mov r17, r16 3ea8: 10 2f mov r17, r16
@@ -247,9 +247,9 @@ void watchdogReset() {
3eb2: 11 1f adc r17, r17 3eb2: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
3eb4: 8b d0 rcall .+278 ; 0x3fcc <verifySpace> 3eb4: 7a d0 rcall .+244 ; 0x3faa <verifySpace>
3eb6: 58 01 movw r10, r16 3eb6: 78 01 movw r14, r16
3eb8: 6c c0 rjmp .+216 ; 0x3f92 <main+0x192> 3eb8: 5b c0 rjmp .+182 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
3eba: 86 35 cpi r24, 0x56 ; 86 3eba: 86 35 cpi r24, 0x56 ; 86
@@ -257,7 +257,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
3ebe: 84 e0 ldi r24, 0x04 ; 4 3ebe: 84 e0 ldi r24, 0x04 ; 4
3ec0: 8d d0 rcall .+282 ; 0x3fdc <getNch> 3ec0: 7c d0 rcall .+248 ; 0x3fba <getNch>
putch(0x00); putch(0x00);
3ec2: 80 e0 ldi r24, 0x00 ; 0 3ec2: 80 e0 ldi r24, 0x00 ; 0
3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82> 3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82>
@@ -266,339 +266,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
3ec6: 84 36 cpi r24, 0x64 ; 100 3ec6: 84 36 cpi r24, 0x64 ; 100
3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc> 3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc>
3eca: 41 c0 rjmp .+130 ; 0x3f4e <main+0x14e> 3eca: 35 c0 rjmp .+106 ; 0x3f36 <main+0x136>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3ecc: 6d d0 rcall .+218 ; 0x3fa8 <getch> 3ecc: 5c d0 rcall .+184 ; 0x3f86 <getch>
3ece: 90 e0 ldi r25, 0x00 ; 0 3ece: 5b d0 rcall .+182 ; 0x3f86 <getch>
3ed0: 18 2f mov r17, r24 3ed0: 18 2f mov r17, r24
3ed2: 00 27 eor r16, r16
length |= getch();
3ed4: 69 d0 rcall .+210 ; 0x3fa8 <getch>
3ed6: 90 e0 ldi r25, 0x00 ; 0
3ed8: 08 2b or r16, r24
3eda: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
3edc: 65 d0 rcall .+202 ; 0x3fa8 <getch> 3ed2: 59 d0 rcall .+178 ; 0x3f86 <getch>
3ede: d8 2e mov r13, r24 3ed4: 08 2f mov r16, r24
3ee0: e8 01 movw r28, r16 3ed6: c0 e0 ldi r28, 0x00 ; 0
3ee2: e1 2c mov r14, r1 3ed8: d1 e0 ldi r29, 0x01 ; 1
3ee4: f1 e0 ldi r31, 0x01 ; 1
3ee6: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
3ee8: 5f d0 rcall .+190 ; 0x3fa8 <getch> 3eda: 55 d0 rcall .+170 ; 0x3f86 <getch>
3eea: f7 01 movw r30, r14 3edc: 89 93 st Y+, r24
3eec: 81 93 st Z+, r24
3eee: 7f 01 movw r14, r30
while (--length); while (--length);
3ef0: 21 97 sbiw r28, 0x01 ; 1 3ede: 1c 17 cp r17, r28
3ef2: d1 f7 brne .-12 ; 0x3ee8 <main+0xe8> 3ee0: e1 f7 brne .-8 ; 0x3eda <main+0xda>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
3ef4: 6b d0 rcall .+214 ; 0x3fcc <verifySpace> 3ee2: 63 d0 rcall .+198 ; 0x3faa <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
3ef6: f5 e4 ldi r31, 0x45 ; 69 3ee4: 05 34 cpi r16, 0x45 ; 69
3ef8: df 16 cp r13, r31 3ee6: 09 f4 brne .+2 ; 0x3eea <main+0xea>
3efa: 09 f4 brne .+2 ; 0x3efe <main+0xfe> 3ee8: ff cf rjmp .-2 ; 0x3ee8 <main+0xe8>
3efc: ff cf rjmp .-2 ; 0x3efc <main+0xfc>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3efe: f5 01 movw r30, r10 3eea: f7 01 movw r30, r14
3f00: 87 be out 0x37, r8 ; 55 3eec: a7 be out 0x37, r10 ; 55
3f02: e8 95 spm 3eee: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f04: 07 b6 in r0, 0x37 ; 55 3ef0: 07 b6 in r0, 0x37 ; 55
3f06: 00 fc sbrc r0, 0 3ef2: 00 fc sbrc r0, 0
3f08: fd cf rjmp .-6 ; 0x3f04 <main+0x104> 3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3f0a: b5 01 movw r22, r10 3ef6: a7 01 movw r20, r14
3f0c: a8 01 movw r20, r16 3ef8: a0 e0 ldi r26, 0x00 ; 0
3f0e: a0 e0 ldi r26, 0x00 ; 0 3efa: b1 e0 ldi r27, 0x01 ; 1
3f10: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
3f12: 2c 91 ld r18, X 3efc: 2c 91 ld r18, X
3f14: 30 e0 ldi r19, 0x00 ; 0 3efe: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
3f16: 11 96 adiw r26, 0x01 ; 1 3f00: 11 96 adiw r26, 0x01 ; 1
3f18: 8c 91 ld r24, X 3f02: 8c 91 ld r24, X
3f1a: 11 97 sbiw r26, 0x01 ; 1 3f04: 11 97 sbiw r26, 0x01 ; 1
3f1c: 90 e0 ldi r25, 0x00 ; 0 3f06: 90 e0 ldi r25, 0x00 ; 0
3f1e: 98 2f mov r25, r24 3f08: 98 2f mov r25, r24
3f20: 88 27 eor r24, r24 3f0a: 88 27 eor r24, r24
3f22: 82 2b or r24, r18 3f0c: 82 2b or r24, r18
3f24: 93 2b or r25, r19 3f0e: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
3f26: 12 96 adiw r26, 0x02 ; 2 3f10: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3f28: fb 01 movw r30, r22 3f12: fa 01 movw r30, r20
3f2a: 0c 01 movw r0, r24 3f14: 0c 01 movw r0, r24
3f2c: 77 be out 0x37, r7 ; 55 3f16: b7 be out 0x37, r11 ; 55
3f2e: e8 95 spm 3f18: e8 95 spm
3f30: 11 24 eor r1, r1 3f1a: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
3f32: 6e 5f subi r22, 0xFE ; 254 3f1c: 4e 5f subi r20, 0xFE ; 254
3f34: 7f 4f sbci r23, 0xFF ; 255 3f1e: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
3f36: 42 50 subi r20, 0x02 ; 2 3f20: 1a 17 cp r17, r26
3f38: 50 40 sbci r21, 0x00 ; 0 3f22: 61 f7 brne .-40 ; 0x3efc <main+0xfc>
3f3a: 59 f7 brne .-42 ; 0x3f12 <main+0x112>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3f3c: f5 01 movw r30, r10 3f24: f7 01 movw r30, r14
3f3e: 97 be out 0x37, r9 ; 55 3f26: d7 be out 0x37, r13 ; 55
3f40: e8 95 spm 3f28: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f42: 07 b6 in r0, 0x37 ; 55 3f2a: 07 b6 in r0, 0x37 ; 55
3f44: 00 fc sbrc r0, 0 3f2c: 00 fc sbrc r0, 0
3f46: fd cf rjmp .-6 ; 0x3f42 <main+0x142> 3f2e: fd cf rjmp .-6 ; 0x3f2a <main+0x12a>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3f48: c7 be out 0x37, r12 ; 55 3f30: c7 be out 0x37, r12 ; 55
3f4a: e8 95 spm 3f32: e8 95 spm
3f4c: 22 c0 rjmp .+68 ; 0x3f92 <main+0x192> 3f34: 1d c0 rjmp .+58 ; 0x3f70 <main+0x170>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
3f4e: 84 37 cpi r24, 0x74 ; 116 3f36: 84 37 cpi r24, 0x74 ; 116
3f50: 91 f4 brne .+36 ; 0x3f76 <main+0x176> 3f38: 69 f4 brne .+26 ; 0x3f54 <main+0x154>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3f52: 2a d0 rcall .+84 ; 0x3fa8 <getch> 3f3a: 25 d0 rcall .+74 ; 0x3f86 <getch>
3f54: 90 e0 ldi r25, 0x00 ; 0 3f3c: 24 d0 rcall .+72 ; 0x3f86 <getch>
3f56: d8 2f mov r29, r24 3f3e: 08 2f mov r16, r24
3f58: cc 27 eor r28, r28
length |= getch();
3f5a: 26 d0 rcall .+76 ; 0x3fa8 <getch>
3f5c: 90 e0 ldi r25, 0x00 ; 0
3f5e: c8 2b or r28, r24
3f60: d9 2b or r29, r25
desttype = getch(); desttype = getch();
3f62: 22 d0 rcall .+68 ; 0x3fa8 <getch> 3f40: 22 d0 rcall .+68 ; 0x3f86 <getch>
verifySpace(); verifySpace();
3f64: 33 d0 rcall .+102 ; 0x3fcc <verifySpace> 3f42: 33 d0 rcall .+102 ; 0x3faa <verifySpace>
3f66: 85 01 movw r16, r10 3f44: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
3f68: f8 01 movw r30, r16 3f46: fe 01 movw r30, r28
3f6a: 85 91 lpm r24, Z+ 3f48: 85 91 lpm r24, Z+
3f6c: 8f 01 movw r16, r30 3f4a: ef 01 movw r28, r30
3f6e: 14 d0 rcall .+40 ; 0x3f98 <putch> 3f4c: 14 d0 rcall .+40 ; 0x3f76 <putch>
} while (--length); } while (--length);
3f70: 21 97 sbiw r28, 0x01 ; 1 3f4e: 01 50 subi r16, 0x01 ; 1
3f72: d1 f7 brne .-12 ; 0x3f68 <main+0x168> 3f50: d1 f7 brne .-12 ; 0x3f46 <main+0x146>
3f74: 0e c0 rjmp .+28 ; 0x3f92 <main+0x192> 3f52: 0e c0 rjmp .+28 ; 0x3f70 <main+0x170>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
3f76: 85 37 cpi r24, 0x75 ; 117 3f54: 85 37 cpi r24, 0x75 ; 117
3f78: 39 f4 brne .+14 ; 0x3f88 <main+0x188> 3f56: 39 f4 brne .+14 ; 0x3f66 <main+0x166>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
3f7a: 28 d0 rcall .+80 ; 0x3fcc <verifySpace> 3f58: 28 d0 rcall .+80 ; 0x3faa <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
3f7c: 8e e1 ldi r24, 0x1E ; 30 3f5a: 8e e1 ldi r24, 0x1E ; 30
3f7e: 0c d0 rcall .+24 ; 0x3f98 <putch> 3f5c: 0c d0 rcall .+24 ; 0x3f76 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
3f80: 84 e9 ldi r24, 0x94 ; 148 3f5e: 84 e9 ldi r24, 0x94 ; 148
3f82: 0a d0 rcall .+20 ; 0x3f98 <putch> 3f60: 0a d0 rcall .+20 ; 0x3f76 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
3f84: 86 e0 ldi r24, 0x06 ; 6 3f62: 86 e0 ldi r24, 0x06 ; 6
3f86: 7d cf rjmp .-262 ; 0x3e82 <main+0x82> 3f64: 8e cf rjmp .-228 ; 0x3e82 <main+0x82>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f88: 81 35 cpi r24, 0x51 ; 81 3f66: 81 35 cpi r24, 0x51 ; 81
3f8a: 11 f4 brne .+4 ; 0x3f90 <main+0x190> 3f68: 11 f4 brne .+4 ; 0x3f6e <main+0x16e>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
3f8c: 88 e0 ldi r24, 0x08 ; 8 3f6a: 88 e0 ldi r24, 0x08 ; 8
3f8e: 18 d0 rcall .+48 ; 0x3fc0 <watchdogConfig> 3f6c: 18 d0 rcall .+48 ; 0x3f9e <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
3f90: 1d d0 rcall .+58 ; 0x3fcc <verifySpace> 3f6e: 1d d0 rcall .+58 ; 0x3faa <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
3f92: 80 e1 ldi r24, 0x10 ; 16 3f70: 80 e1 ldi r24, 0x10 ; 16
3f94: 01 d0 rcall .+2 ; 0x3f98 <putch> 3f72: 01 d0 rcall .+2 ; 0x3f76 <putch>
3f96: 67 cf rjmp .-306 ; 0x3e66 <main+0x66> 3f74: 78 cf rjmp .-272 ; 0x3e66 <main+0x66>
00003f98 <putch>: 00003f76 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
3f98: 98 2f mov r25, r24 3f76: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
3f9a: 80 91 c0 00 lds r24, 0x00C0 3f78: 80 91 c0 00 lds r24, 0x00C0
3f9e: 85 ff sbrs r24, 5 3f7c: 85 ff sbrs r24, 5
3fa0: fc cf rjmp .-8 ; 0x3f9a <putch+0x2> 3f7e: fc cf rjmp .-8 ; 0x3f78 <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
3fa2: 90 93 c6 00 sts 0x00C6, r25 3f80: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
3fa6: 08 95 ret 3f84: 08 95 ret
00003fa8 <getch>: 00003f86 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
3fa8: 80 91 c0 00 lds r24, 0x00C0 3f86: 80 91 c0 00 lds r24, 0x00C0
3fac: 87 ff sbrs r24, 7 3f8a: 87 ff sbrs r24, 7
3fae: fc cf rjmp .-8 ; 0x3fa8 <getch> 3f8c: fc cf rjmp .-8 ; 0x3f86 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
3fb0: 80 91 c0 00 lds r24, 0x00C0 3f8e: 80 91 c0 00 lds r24, 0x00C0
3fb4: 84 fd sbrc r24, 4 3f92: 84 fd sbrc r24, 4
3fb6: 01 c0 rjmp .+2 ; 0x3fba <getch+0x12> 3f94: 01 c0 rjmp .+2 ; 0x3f98 <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
3fb8: a8 95 wdr 3f96: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
3fba: 80 91 c6 00 lds r24, 0x00C6 3f98: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
3fbe: 08 95 ret 3f9c: 08 95 ret
00003fc0 <watchdogConfig>: 00003f9e <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
3fc0: e0 e6 ldi r30, 0x60 ; 96 3f9e: e0 e6 ldi r30, 0x60 ; 96
3fc2: f0 e0 ldi r31, 0x00 ; 0 3fa0: f0 e0 ldi r31, 0x00 ; 0
3fc4: 98 e1 ldi r25, 0x18 ; 24 3fa2: 98 e1 ldi r25, 0x18 ; 24
3fc6: 90 83 st Z, r25 3fa4: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
3fc8: 80 83 st Z, r24 3fa6: 80 83 st Z, r24
} }
3fca: 08 95 ret 3fa8: 08 95 ret
00003fcc <verifySpace>: 00003faa <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
3fcc: ed df rcall .-38 ; 0x3fa8 <getch> 3faa: ed df rcall .-38 ; 0x3f86 <getch>
3fce: 80 32 cpi r24, 0x20 ; 32 3fac: 80 32 cpi r24, 0x20 ; 32
3fd0: 19 f0 breq .+6 ; 0x3fd8 <verifySpace+0xc> 3fae: 19 f0 breq .+6 ; 0x3fb6 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3fd2: 88 e0 ldi r24, 0x08 ; 8 3fb0: 88 e0 ldi r24, 0x08 ; 8
3fd4: f5 df rcall .-22 ; 0x3fc0 <watchdogConfig> 3fb2: f5 df rcall .-22 ; 0x3f9e <watchdogConfig>
3fd6: ff cf rjmp .-2 ; 0x3fd6 <verifySpace+0xa> 3fb4: ff cf rjmp .-2 ; 0x3fb4 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
3fd8: 84 e1 ldi r24, 0x14 ; 20 3fb6: 84 e1 ldi r24, 0x14 ; 20
} }
3fda: de cf rjmp .-68 ; 0x3f98 <putch> 3fb8: de cf rjmp .-68 ; 0x3f76 <putch>
00003fdc <getNch>: 00003fba <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
3fdc: 1f 93 push r17 3fba: 1f 93 push r17
3fde: 18 2f mov r17, r24 3fbc: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
3fe0: e3 df rcall .-58 ; 0x3fa8 <getch> 3fbe: e3 df rcall .-58 ; 0x3f86 <getch>
3fe2: 11 50 subi r17, 0x01 ; 1 3fc0: 11 50 subi r17, 0x01 ; 1
3fe4: e9 f7 brne .-6 ; 0x3fe0 <getNch+0x4> 3fc2: e9 f7 brne .-6 ; 0x3fbe <getNch+0x4>
verifySpace(); verifySpace();
3fe6: f2 df rcall .-28 ; 0x3fcc <verifySpace> 3fc4: f2 df rcall .-28 ; 0x3faa <verifySpace>
} }
3fe8: 1f 91 pop r17 3fc6: 1f 91 pop r17
3fea: 08 95 ret 3fc8: 08 95 ret
00003fec <appStart>: 00003fca <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fec: 28 2e mov r2, r24 3fca: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
3fee: 80 e0 ldi r24, 0x00 ; 0 3fcc: 80 e0 ldi r24, 0x00 ; 0
3ff0: e7 df rcall .-50 ; 0x3fc0 <watchdogConfig> 3fce: e7 df rcall .-50 ; 0x3f9e <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
3ff2: ee 27 eor r30, r30 3fd0: ee 27 eor r30, r30
3ff4: ff 27 eor r31, r31 3fd2: ff 27 eor r31, r31
3ff6: 09 94 ijmp 3fd4: 09 94 ijmp

View File

@@ -1,35 +1,33 @@
:103E0000112494B714BE892F8D7011F0892FEED034 :103E0000112494B714BE892F8D7011F0892FDDD045
:103E100085E08093810082E08093C00088E18093F8 :103E100085E08093810082E08093C00088E18093F8
:103E2000C10086E08093C20088E08093C4008EE0E9 :103E2000C10086E08093C20088E08093C4008EE0E9
:103E3000C7D0259A86E028E13EEF91E030938500D7 :103E3000B6D0259A86E028E13EEF91E030938500E8
:103E40002093840096BBB09BFECF1D9AA89581500D :103E40002093840096BBB09BFECF1D9AA89581500D
:103E5000A9F7AA24BB2433E0832E7724739425E0AA :103E5000A9F7EE24FF24B3E0AB2EBB24B394A5E076
:103E6000922E91E1C92EA0D0813469F49DD0182FF3 :103E6000DA2EF1E1CF2E8FD0813469F48CD0082F77
:103E7000ADD0123811F481E004C0113809F482C0C9 :103E70009CD0023811F482E004C0013809F471C00A
:103E800083E08AD086C0823411F484E103C0853493 :103E800083E079D075C0823411F484E103C08534B5
:103E900019F485E0A3D07DC0853579F485D0E82E6E :103E900019F485E092D06CC0853579F474D0E82EA1
:103EA000FF2482D0082F10E0102F00270E291F2991 :103EA000FF2471D0082F10E0102F00270E291F29A2
:103EB000000F111F8BD058016CC0863521F484E0AF :103EB000000F111F7AD078015BC0863521F484E0B1
:103EC0008DD080E0DECF843609F041C06DD090E027 :103EC0007CD080E0DECF843609F035C05CD05BD09A
:103ED000182F002769D090E0082B192B65D0D82E19 :103ED000182F59D0082FC0E0D1E055D089931C1776
:103EE000E801E12CF1E0FF2E5FD0F70181937F0123 :103EE000E1F763D0053409F4FFCFF701A7BEE895E9
:103EF0002197D1F76BD0F5E4DF1609F4FFCFF50178 :103EF00007B600FCFDCFA701A0E0B1E02C9130E0B7
:103F000087BEE89507B600FCFDCFB501A801A0E08B :103F000011968C91119790E0982F8827822B932BF4
:103F1000B1E02C9130E011968C91119790E0982FA0 :103F10001296FA010C01B7BEE89511244E5F5F4F6F
:103F20008827822B932B1296FB010C0177BEE89514 :103F20001A1761F7F701D7BEE89507B600FCFDCF79
:103F300011246E5F7F4F4250504059F7F50197BEF4 :103F3000C7BEE8951DC0843769F425D024D0082F6A
:103F4000E89507B600FCFDCFC7BEE89522C08437D0 :103F400022D033D0E701FE018591EF0114D001505A
:103F500091F42AD090E0D82FCC2726D090E0C82B1F :103F5000D1F70EC0853739F428D08EE10CD084E932
:103F6000D92B22D033D08501F80185918F0114D04F :103F60000AD086E08ECF813511F488E018D01DD0BC
:103F70002197D1F70EC0853739F428D08EE10CD0C7 :103F700080E101D078CF982F8091C00085FFFCCFE1
:103F800084E90AD086E07DCF813511F488E018D02D :103F80009093C60008958091C00087FFFCCF809178
:103F90001DD080E101D067CF982F8091C00085FFB0 :103F9000C00084FD01C0A8958091C6000895E0E6A8
:103FA000FCCF9093C60008958091C00087FFFCCF9E :103FA000F0E098E1908380830895EDDF803219F08E
:103FB0008091C00084FD01C0A8958091C60008953D :103FB00088E0F5DFFFCF84E1DECF1F93182FE3DF2A
:103FC000E0E6F0E098E1908380830895EDDF8032B1 :103FC0001150E9F7F2DF1F910895282E80E0E7DF16
:103FD00019F088E0F5DFFFCF84E1DECF1F93182FC3 :063FD000EE27FF27099413
:103FE000E3DF1150E9F7F2DF1F910895282E80E0FA :023FFE000206B9
:083FF000E7DFEE27FF2709942B
:023FFE000106BA
:0400000300003E00BB :0400000300003E00BB
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega168.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001f8 00003e00 00003e00 00000074 2**1 0 .text 000001d6 00003e00 00003e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00003ffe 00003ffe 0000026c 2**0 1 .version 00000002 00003ffe 00003ffe 0000024a 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 0000026e 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000296 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000274 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030a 2**0 4 .debug_info 000003ea 00000000 00000000 000002e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ea 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 00000433 00000000 00000000 000008db 2**0 6 .debug_line 00000423 00000000 00000000 000008c1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d10 2**2 7 .debug_frame 00000080 00000000 00000000 00000ce4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d90 2**0 8 .debug_str 0000017c 00000000 00000000 00000d64 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f02 2**0 9 .debug_loc 00000300 00000000 00000000 00000ee0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011d9 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011e0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10> 3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10>
appStart(ch); appStart(ch);
3e0c: 89 2f mov r24, r25 3e0c: 89 2f mov r24, r25
3e0e: ee d0 rcall .+476 ; 0x3fec <appStart> 3e0e: dd d0 rcall .+442 ; 0x3fca <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
3e2e: 8e e0 ldi r24, 0x0E ; 14 3e2e: 8e e0 ldi r24, 0x0E ; 14
3e30: c7 d0 rcall .+398 ; 0x3fc0 <watchdogConfig> 3e30: b6 d0 rcall .+364 ; 0x3f9e <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,68 +131,68 @@ void watchdogReset() {
} while (--count); } while (--count);
3e4e: 81 50 subi r24, 0x01 ; 1 3e4e: 81 50 subi r24, 0x01 ; 1
3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c> 3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c>
3e52: aa 24 eor r10, r10 3e52: ee 24 eor r14, r14
3e54: bb 24 eor r11, r11 3e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3e56: 33 e0 ldi r19, 0x03 ; 3 3e56: b3 e0 ldi r27, 0x03 ; 3
3e58: 83 2e mov r8, r19 3e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3e5a: 77 24 eor r7, r7 3e5a: bb 24 eor r11, r11
3e5c: 73 94 inc r7 3e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3e5e: 25 e0 ldi r18, 0x05 ; 5 3e5e: a5 e0 ldi r26, 0x05 ; 5
3e60: 92 2e mov r9, r18 3e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3e62: 91 e1 ldi r25, 0x11 ; 17 3e62: f1 e1 ldi r31, 0x11 ; 17
3e64: c9 2e mov r12, r25 3e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
3e66: a0 d0 rcall .+320 ; 0x3fa8 <getch> 3e66: 8f d0 rcall .+286 ; 0x3f86 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
3e68: 81 34 cpi r24, 0x41 ; 65 3e68: 81 34 cpi r24, 0x41 ; 65
3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86> 3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86>
unsigned char which = getch(); unsigned char which = getch();
3e6c: 9d d0 rcall .+314 ; 0x3fa8 <getch> 3e6c: 8c d0 rcall .+280 ; 0x3f86 <getch>
3e6e: 18 2f mov r17, r24 3e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
3e70: ad d0 rcall .+346 ; 0x3fcc <verifySpace> 3e70: 9c d0 rcall .+312 ; 0x3faa <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
3e72: 12 38 cpi r17, 0x82 ; 130 3e72: 02 38 cpi r16, 0x82 ; 130
3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a> 3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
3e76: 81 e0 ldi r24, 0x01 ; 1 3e76: 82 e0 ldi r24, 0x02 ; 2
3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82> 3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82>
} else if (which == 0x81) { } else if (which == 0x81) {
3e7a: 11 38 cpi r17, 0x81 ; 129 3e7a: 01 38 cpi r16, 0x81 ; 129
3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80> 3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80>
3e7e: 82 c0 rjmp .+260 ; 0x3f84 <main+0x184> 3e7e: 71 c0 rjmp .+226 ; 0x3f62 <main+0x162>
} else { } else {
/* /*
* GET PARAMETER returns a generic 0x03 reply for * GET PARAMETER returns a generic 0x03 reply for
@@ -200,8 +200,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
3e80: 83 e0 ldi r24, 0x03 ; 3 3e80: 83 e0 ldi r24, 0x03 ; 3
3e82: 8a d0 rcall .+276 ; 0x3f98 <putch> 3e82: 79 d0 rcall .+242 ; 0x3f76 <putch>
3e84: 86 c0 rjmp .+268 ; 0x3f92 <main+0x192> 3e84: 75 c0 rjmp .+234 ; 0x3f70 <main+0x170>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -218,8 +218,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
3e92: 85 e0 ldi r24, 0x05 ; 5 3e92: 85 e0 ldi r24, 0x05 ; 5
3e94: a3 d0 rcall .+326 ; 0x3fdc <getNch> 3e94: 92 d0 rcall .+292 ; 0x3fba <getNch>
3e96: 7d c0 rjmp .+250 ; 0x3f92 <main+0x192> 3e96: 6c c0 rjmp .+216 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
3e98: 85 35 cpi r24, 0x55 ; 85 3e98: 85 35 cpi r24, 0x55 ; 85
@@ -227,11 +227,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
3e9c: 85 d0 rcall .+266 ; 0x3fa8 <getch> 3e9c: 74 d0 rcall .+232 ; 0x3f86 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
3e9e: e8 2e mov r14, r24 3e9e: e8 2e mov r14, r24
3ea0: ff 24 eor r15, r15 3ea0: ff 24 eor r15, r15
3ea2: 82 d0 rcall .+260 ; 0x3fa8 <getch> 3ea2: 71 d0 rcall .+226 ; 0x3f86 <getch>
3ea4: 08 2f mov r16, r24 3ea4: 08 2f mov r16, r24
3ea6: 10 e0 ldi r17, 0x00 ; 0 3ea6: 10 e0 ldi r17, 0x00 ; 0
3ea8: 10 2f mov r17, r16 3ea8: 10 2f mov r17, r16
@@ -247,9 +247,9 @@ void watchdogReset() {
3eb2: 11 1f adc r17, r17 3eb2: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
3eb4: 8b d0 rcall .+278 ; 0x3fcc <verifySpace> 3eb4: 7a d0 rcall .+244 ; 0x3faa <verifySpace>
3eb6: 58 01 movw r10, r16 3eb6: 78 01 movw r14, r16
3eb8: 6c c0 rjmp .+216 ; 0x3f92 <main+0x192> 3eb8: 5b c0 rjmp .+182 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
3eba: 86 35 cpi r24, 0x56 ; 86 3eba: 86 35 cpi r24, 0x56 ; 86
@@ -257,7 +257,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
3ebe: 84 e0 ldi r24, 0x04 ; 4 3ebe: 84 e0 ldi r24, 0x04 ; 4
3ec0: 8d d0 rcall .+282 ; 0x3fdc <getNch> 3ec0: 7c d0 rcall .+248 ; 0x3fba <getNch>
putch(0x00); putch(0x00);
3ec2: 80 e0 ldi r24, 0x00 ; 0 3ec2: 80 e0 ldi r24, 0x00 ; 0
3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82> 3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82>
@@ -266,339 +266,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
3ec6: 84 36 cpi r24, 0x64 ; 100 3ec6: 84 36 cpi r24, 0x64 ; 100
3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc> 3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc>
3eca: 41 c0 rjmp .+130 ; 0x3f4e <main+0x14e> 3eca: 35 c0 rjmp .+106 ; 0x3f36 <main+0x136>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3ecc: 6d d0 rcall .+218 ; 0x3fa8 <getch> 3ecc: 5c d0 rcall .+184 ; 0x3f86 <getch>
3ece: 90 e0 ldi r25, 0x00 ; 0 3ece: 5b d0 rcall .+182 ; 0x3f86 <getch>
3ed0: 18 2f mov r17, r24 3ed0: 18 2f mov r17, r24
3ed2: 00 27 eor r16, r16
length |= getch();
3ed4: 69 d0 rcall .+210 ; 0x3fa8 <getch>
3ed6: 90 e0 ldi r25, 0x00 ; 0
3ed8: 08 2b or r16, r24
3eda: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
3edc: 65 d0 rcall .+202 ; 0x3fa8 <getch> 3ed2: 59 d0 rcall .+178 ; 0x3f86 <getch>
3ede: d8 2e mov r13, r24 3ed4: 08 2f mov r16, r24
3ee0: e8 01 movw r28, r16 3ed6: c0 e0 ldi r28, 0x00 ; 0
3ee2: e1 2c mov r14, r1 3ed8: d1 e0 ldi r29, 0x01 ; 1
3ee4: f1 e0 ldi r31, 0x01 ; 1
3ee6: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
3ee8: 5f d0 rcall .+190 ; 0x3fa8 <getch> 3eda: 55 d0 rcall .+170 ; 0x3f86 <getch>
3eea: f7 01 movw r30, r14 3edc: 89 93 st Y+, r24
3eec: 81 93 st Z+, r24
3eee: 7f 01 movw r14, r30
while (--length); while (--length);
3ef0: 21 97 sbiw r28, 0x01 ; 1 3ede: 1c 17 cp r17, r28
3ef2: d1 f7 brne .-12 ; 0x3ee8 <main+0xe8> 3ee0: e1 f7 brne .-8 ; 0x3eda <main+0xda>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
3ef4: 6b d0 rcall .+214 ; 0x3fcc <verifySpace> 3ee2: 63 d0 rcall .+198 ; 0x3faa <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
3ef6: f5 e4 ldi r31, 0x45 ; 69 3ee4: 05 34 cpi r16, 0x45 ; 69
3ef8: df 16 cp r13, r31 3ee6: 09 f4 brne .+2 ; 0x3eea <main+0xea>
3efa: 09 f4 brne .+2 ; 0x3efe <main+0xfe> 3ee8: ff cf rjmp .-2 ; 0x3ee8 <main+0xe8>
3efc: ff cf rjmp .-2 ; 0x3efc <main+0xfc>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3efe: f5 01 movw r30, r10 3eea: f7 01 movw r30, r14
3f00: 87 be out 0x37, r8 ; 55 3eec: a7 be out 0x37, r10 ; 55
3f02: e8 95 spm 3eee: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f04: 07 b6 in r0, 0x37 ; 55 3ef0: 07 b6 in r0, 0x37 ; 55
3f06: 00 fc sbrc r0, 0 3ef2: 00 fc sbrc r0, 0
3f08: fd cf rjmp .-6 ; 0x3f04 <main+0x104> 3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3f0a: b5 01 movw r22, r10 3ef6: a7 01 movw r20, r14
3f0c: a8 01 movw r20, r16 3ef8: a0 e0 ldi r26, 0x00 ; 0
3f0e: a0 e0 ldi r26, 0x00 ; 0 3efa: b1 e0 ldi r27, 0x01 ; 1
3f10: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
3f12: 2c 91 ld r18, X 3efc: 2c 91 ld r18, X
3f14: 30 e0 ldi r19, 0x00 ; 0 3efe: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
3f16: 11 96 adiw r26, 0x01 ; 1 3f00: 11 96 adiw r26, 0x01 ; 1
3f18: 8c 91 ld r24, X 3f02: 8c 91 ld r24, X
3f1a: 11 97 sbiw r26, 0x01 ; 1 3f04: 11 97 sbiw r26, 0x01 ; 1
3f1c: 90 e0 ldi r25, 0x00 ; 0 3f06: 90 e0 ldi r25, 0x00 ; 0
3f1e: 98 2f mov r25, r24 3f08: 98 2f mov r25, r24
3f20: 88 27 eor r24, r24 3f0a: 88 27 eor r24, r24
3f22: 82 2b or r24, r18 3f0c: 82 2b or r24, r18
3f24: 93 2b or r25, r19 3f0e: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
3f26: 12 96 adiw r26, 0x02 ; 2 3f10: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3f28: fb 01 movw r30, r22 3f12: fa 01 movw r30, r20
3f2a: 0c 01 movw r0, r24 3f14: 0c 01 movw r0, r24
3f2c: 77 be out 0x37, r7 ; 55 3f16: b7 be out 0x37, r11 ; 55
3f2e: e8 95 spm 3f18: e8 95 spm
3f30: 11 24 eor r1, r1 3f1a: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
3f32: 6e 5f subi r22, 0xFE ; 254 3f1c: 4e 5f subi r20, 0xFE ; 254
3f34: 7f 4f sbci r23, 0xFF ; 255 3f1e: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
3f36: 42 50 subi r20, 0x02 ; 2 3f20: 1a 17 cp r17, r26
3f38: 50 40 sbci r21, 0x00 ; 0 3f22: 61 f7 brne .-40 ; 0x3efc <main+0xfc>
3f3a: 59 f7 brne .-42 ; 0x3f12 <main+0x112>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3f3c: f5 01 movw r30, r10 3f24: f7 01 movw r30, r14
3f3e: 97 be out 0x37, r9 ; 55 3f26: d7 be out 0x37, r13 ; 55
3f40: e8 95 spm 3f28: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f42: 07 b6 in r0, 0x37 ; 55 3f2a: 07 b6 in r0, 0x37 ; 55
3f44: 00 fc sbrc r0, 0 3f2c: 00 fc sbrc r0, 0
3f46: fd cf rjmp .-6 ; 0x3f42 <main+0x142> 3f2e: fd cf rjmp .-6 ; 0x3f2a <main+0x12a>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3f48: c7 be out 0x37, r12 ; 55 3f30: c7 be out 0x37, r12 ; 55
3f4a: e8 95 spm 3f32: e8 95 spm
3f4c: 22 c0 rjmp .+68 ; 0x3f92 <main+0x192> 3f34: 1d c0 rjmp .+58 ; 0x3f70 <main+0x170>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
3f4e: 84 37 cpi r24, 0x74 ; 116 3f36: 84 37 cpi r24, 0x74 ; 116
3f50: 91 f4 brne .+36 ; 0x3f76 <main+0x176> 3f38: 69 f4 brne .+26 ; 0x3f54 <main+0x154>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3f52: 2a d0 rcall .+84 ; 0x3fa8 <getch> 3f3a: 25 d0 rcall .+74 ; 0x3f86 <getch>
3f54: 90 e0 ldi r25, 0x00 ; 0 3f3c: 24 d0 rcall .+72 ; 0x3f86 <getch>
3f56: d8 2f mov r29, r24 3f3e: 08 2f mov r16, r24
3f58: cc 27 eor r28, r28
length |= getch();
3f5a: 26 d0 rcall .+76 ; 0x3fa8 <getch>
3f5c: 90 e0 ldi r25, 0x00 ; 0
3f5e: c8 2b or r28, r24
3f60: d9 2b or r29, r25
desttype = getch(); desttype = getch();
3f62: 22 d0 rcall .+68 ; 0x3fa8 <getch> 3f40: 22 d0 rcall .+68 ; 0x3f86 <getch>
verifySpace(); verifySpace();
3f64: 33 d0 rcall .+102 ; 0x3fcc <verifySpace> 3f42: 33 d0 rcall .+102 ; 0x3faa <verifySpace>
3f66: 85 01 movw r16, r10 3f44: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
3f68: f8 01 movw r30, r16 3f46: fe 01 movw r30, r28
3f6a: 85 91 lpm r24, Z+ 3f48: 85 91 lpm r24, Z+
3f6c: 8f 01 movw r16, r30 3f4a: ef 01 movw r28, r30
3f6e: 14 d0 rcall .+40 ; 0x3f98 <putch> 3f4c: 14 d0 rcall .+40 ; 0x3f76 <putch>
} while (--length); } while (--length);
3f70: 21 97 sbiw r28, 0x01 ; 1 3f4e: 01 50 subi r16, 0x01 ; 1
3f72: d1 f7 brne .-12 ; 0x3f68 <main+0x168> 3f50: d1 f7 brne .-12 ; 0x3f46 <main+0x146>
3f74: 0e c0 rjmp .+28 ; 0x3f92 <main+0x192> 3f52: 0e c0 rjmp .+28 ; 0x3f70 <main+0x170>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
3f76: 85 37 cpi r24, 0x75 ; 117 3f54: 85 37 cpi r24, 0x75 ; 117
3f78: 39 f4 brne .+14 ; 0x3f88 <main+0x188> 3f56: 39 f4 brne .+14 ; 0x3f66 <main+0x166>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
3f7a: 28 d0 rcall .+80 ; 0x3fcc <verifySpace> 3f58: 28 d0 rcall .+80 ; 0x3faa <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
3f7c: 8e e1 ldi r24, 0x1E ; 30 3f5a: 8e e1 ldi r24, 0x1E ; 30
3f7e: 0c d0 rcall .+24 ; 0x3f98 <putch> 3f5c: 0c d0 rcall .+24 ; 0x3f76 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
3f80: 84 e9 ldi r24, 0x94 ; 148 3f5e: 84 e9 ldi r24, 0x94 ; 148
3f82: 0a d0 rcall .+20 ; 0x3f98 <putch> 3f60: 0a d0 rcall .+20 ; 0x3f76 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
3f84: 86 e0 ldi r24, 0x06 ; 6 3f62: 86 e0 ldi r24, 0x06 ; 6
3f86: 7d cf rjmp .-262 ; 0x3e82 <main+0x82> 3f64: 8e cf rjmp .-228 ; 0x3e82 <main+0x82>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f88: 81 35 cpi r24, 0x51 ; 81 3f66: 81 35 cpi r24, 0x51 ; 81
3f8a: 11 f4 brne .+4 ; 0x3f90 <main+0x190> 3f68: 11 f4 brne .+4 ; 0x3f6e <main+0x16e>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
3f8c: 88 e0 ldi r24, 0x08 ; 8 3f6a: 88 e0 ldi r24, 0x08 ; 8
3f8e: 18 d0 rcall .+48 ; 0x3fc0 <watchdogConfig> 3f6c: 18 d0 rcall .+48 ; 0x3f9e <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
3f90: 1d d0 rcall .+58 ; 0x3fcc <verifySpace> 3f6e: 1d d0 rcall .+58 ; 0x3faa <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
3f92: 80 e1 ldi r24, 0x10 ; 16 3f70: 80 e1 ldi r24, 0x10 ; 16
3f94: 01 d0 rcall .+2 ; 0x3f98 <putch> 3f72: 01 d0 rcall .+2 ; 0x3f76 <putch>
3f96: 67 cf rjmp .-306 ; 0x3e66 <main+0x66> 3f74: 78 cf rjmp .-272 ; 0x3e66 <main+0x66>
00003f98 <putch>: 00003f76 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
3f98: 98 2f mov r25, r24 3f76: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
3f9a: 80 91 c0 00 lds r24, 0x00C0 3f78: 80 91 c0 00 lds r24, 0x00C0
3f9e: 85 ff sbrs r24, 5 3f7c: 85 ff sbrs r24, 5
3fa0: fc cf rjmp .-8 ; 0x3f9a <putch+0x2> 3f7e: fc cf rjmp .-8 ; 0x3f78 <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
3fa2: 90 93 c6 00 sts 0x00C6, r25 3f80: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
3fa6: 08 95 ret 3f84: 08 95 ret
00003fa8 <getch>: 00003f86 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
3fa8: 80 91 c0 00 lds r24, 0x00C0 3f86: 80 91 c0 00 lds r24, 0x00C0
3fac: 87 ff sbrs r24, 7 3f8a: 87 ff sbrs r24, 7
3fae: fc cf rjmp .-8 ; 0x3fa8 <getch> 3f8c: fc cf rjmp .-8 ; 0x3f86 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
3fb0: 80 91 c0 00 lds r24, 0x00C0 3f8e: 80 91 c0 00 lds r24, 0x00C0
3fb4: 84 fd sbrc r24, 4 3f92: 84 fd sbrc r24, 4
3fb6: 01 c0 rjmp .+2 ; 0x3fba <getch+0x12> 3f94: 01 c0 rjmp .+2 ; 0x3f98 <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
3fb8: a8 95 wdr 3f96: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
3fba: 80 91 c6 00 lds r24, 0x00C6 3f98: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
3fbe: 08 95 ret 3f9c: 08 95 ret
00003fc0 <watchdogConfig>: 00003f9e <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
3fc0: e0 e6 ldi r30, 0x60 ; 96 3f9e: e0 e6 ldi r30, 0x60 ; 96
3fc2: f0 e0 ldi r31, 0x00 ; 0 3fa0: f0 e0 ldi r31, 0x00 ; 0
3fc4: 98 e1 ldi r25, 0x18 ; 24 3fa2: 98 e1 ldi r25, 0x18 ; 24
3fc6: 90 83 st Z, r25 3fa4: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
3fc8: 80 83 st Z, r24 3fa6: 80 83 st Z, r24
} }
3fca: 08 95 ret 3fa8: 08 95 ret
00003fcc <verifySpace>: 00003faa <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
3fcc: ed df rcall .-38 ; 0x3fa8 <getch> 3faa: ed df rcall .-38 ; 0x3f86 <getch>
3fce: 80 32 cpi r24, 0x20 ; 32 3fac: 80 32 cpi r24, 0x20 ; 32
3fd0: 19 f0 breq .+6 ; 0x3fd8 <verifySpace+0xc> 3fae: 19 f0 breq .+6 ; 0x3fb6 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3fd2: 88 e0 ldi r24, 0x08 ; 8 3fb0: 88 e0 ldi r24, 0x08 ; 8
3fd4: f5 df rcall .-22 ; 0x3fc0 <watchdogConfig> 3fb2: f5 df rcall .-22 ; 0x3f9e <watchdogConfig>
3fd6: ff cf rjmp .-2 ; 0x3fd6 <verifySpace+0xa> 3fb4: ff cf rjmp .-2 ; 0x3fb4 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
3fd8: 84 e1 ldi r24, 0x14 ; 20 3fb6: 84 e1 ldi r24, 0x14 ; 20
} }
3fda: de cf rjmp .-68 ; 0x3f98 <putch> 3fb8: de cf rjmp .-68 ; 0x3f76 <putch>
00003fdc <getNch>: 00003fba <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
3fdc: 1f 93 push r17 3fba: 1f 93 push r17
3fde: 18 2f mov r17, r24 3fbc: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
3fe0: e3 df rcall .-58 ; 0x3fa8 <getch> 3fbe: e3 df rcall .-58 ; 0x3f86 <getch>
3fe2: 11 50 subi r17, 0x01 ; 1 3fc0: 11 50 subi r17, 0x01 ; 1
3fe4: e9 f7 brne .-6 ; 0x3fe0 <getNch+0x4> 3fc2: e9 f7 brne .-6 ; 0x3fbe <getNch+0x4>
verifySpace(); verifySpace();
3fe6: f2 df rcall .-28 ; 0x3fcc <verifySpace> 3fc4: f2 df rcall .-28 ; 0x3faa <verifySpace>
} }
3fe8: 1f 91 pop r17 3fc6: 1f 91 pop r17
3fea: 08 95 ret 3fc8: 08 95 ret
00003fec <appStart>: 00003fca <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fec: 28 2e mov r2, r24 3fca: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
3fee: 80 e0 ldi r24, 0x00 ; 0 3fcc: 80 e0 ldi r24, 0x00 ; 0
3ff0: e7 df rcall .-50 ; 0x3fc0 <watchdogConfig> 3fce: e7 df rcall .-50 ; 0x3f9e <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
3ff2: ee 27 eor r30, r30 3fd0: ee 27 eor r30, r30
3ff4: ff 27 eor r31, r31 3fd2: ff 27 eor r31, r31
3ff6: 09 94 ijmp 3fd4: 09 94 ijmp

View File

@@ -1,41 +1,39 @@
:101D0000112484B714BE81FF24D185E08EBD8EE0FE :101D0000112494B714BE892F8D7011F0892F0ED134
:101D10000CD1D49AD29A86E023EC3FEF91E03DBDFE :101D10008EE0F8D0D29AEE24FF2493E0B92EAA24C4
:101D20002CBD9BB9589BFECFCC9AA8958150B9F792 :101D2000A39485E0982E0FE7D02E1EECC12ED7D0BD
:101D3000EE24FF2493E0992EBB24B39485E0A82ED3 :101D3000813471F4D4D0082FE9D0023811F482E054
:101D40000FE7D02E1EECC12EDDD0813461F4DAD045 :101D400005C0013811F486E001C083E0B9D0B5C008
:101D5000082FEFD0023829F1013811F485E001C0D5 :101D5000823411F484E103C0853419F485E0DED0C7
:101D600083E0C1D0BDC0823411F484E103C0853466 :101D6000ACC0853579F4BBD0E82EFF24B8D0082F5D
:101D700019F485E0E6D0B4C0853579F4C3D0E82EF7 :101D700010E0102F00270E291F29000F111FC6D0B9
:101D8000FF24C0D0082F10E0102F00270E291F2994 :101D800078019BC0863521F484E0C8D080E0DECFA6
:101D9000000F111FCED07801A3C0863521F484E056 :101D9000843609F05EC0A3D0A2D0182FA0D0082F9F
:101DA000D0D080E0DECF843609F05FC0ABD0AAD0BF :101DA000C0E0D1E09CD089931C17E1F7AFD0E114DB
:101DB000182FA8D0C0E0D1E0A5D089931C17E1F777 :101DB000F10441F5809100012091010130E0322FC2
:101DC000F70197BEE895B5D007B600FCFDCFE1144A :101DC000222790E0282B392B309385012093840122
:101DD000F10411F0A7012AC08091000120910101B6 :101DD000409108018091090190E0982F882750E0F8
:101DE00030E0322F222790E0282B392B30938501C9 :101DE000842B952B9093870180938601245030405B
:101DF00020938401409108018091090190E0982F7F :101DF00020930801232F332720930901D09200015B
:101E0000882750E0842B952B90938701809386013F :101E0000C0920101053409F4FFCFF701B7BEE89590
:101E10002450304020930801232F332720930901B9 :101E100007B600FCFDCFA701A0E0B1E02C9130E0B7
:101E2000D0920001C092010140E050E0A0E0B1E09A :101E200011968C91119790E0982F8827822B932BF5
:101E30002C9130E011968C91119790E0982F882783 :101E30001296FA010C01A7BEE89511244E5F5F4F80
:101E4000822B932B1296FA010C01B7BEE895112450 :101E40001A1761F7F70197BEE89507B600FCFDCFBA
:101E50004E5F5F4FF1E0A034BF0751F7F701A7BE17 :101E500034C0843721F543D042D0082F40D056D02B
:101E6000E89507B600FCFDCF3BC0843759F54AD052 :101E6000E701209719F48091840114C0C130D10595
:101E700049D0182F47D05DD0E701012F209719F4E2 :101E700019F4809185010EC0C830D10519F4809104
:101E80008091840114C0C130D10519F4809185017D :101E8000860108C0C930D10519F48091870102C0CC
:101E90000EC0C830D10519F48091860108C0C93040 :101E9000FE01849115D0015081F02196E2CF853763
:101EA000D10519F48091870102C0FE018491219629 :101EA00039F434D08EE10CD083E90AD08CE04ECFE7
:101EB0001AD0015019F70894E11CF11C1150E10EE1 :101EB000813511F488E026D029D080E101D037CFD8
:101EC000F11C0EC0853739F434D08EE10CD083E993 :101EC0002AE030E08095089410F4DA9802C0DA9A9B
:101ED0000AD08CE046CF813511F488E026D029D095 :101ED000000014D013D086952A95B1F7089529E013
:101EE00080E101D031CF2AE030E08095089410F4F1 :101EE00030E0CB99FECF0AD009D008D08894CB99A6
:101EF000DA9802C0DA9A000014D013D086952A9599 :101EF00008942A9511F08795F7CF08959EE09A955A
:101F0000B1F7089529E030E0CB99FECF0AD009D08F :101F0000F1F7089598E191BD81BD0895E8DF803231
:101F100008D08894CB9908942A9511F08795F7CF2B :101F100019F088E0F7DFFFCF84E1D2CF1F93182FAD
:101F200008959EE09A95F1F7089598E191BD81BDDD :101F2000DEDF1150E9F7F2DF1F910895282E80E0DF
:101F30000895E8DF803219F088E0F7DFFFCF84E111 :081F3000E9DFE4E0FF2709945A
:101F4000D2CF1F93182FDEDF1150E9F7F2DF1F9178 :021FFE000206D9
:0E1F50000895282E80E0E9DFE4E0FF270994E1
:021EFE000005DD
:0400000300001D00DC :0400000300001D00DC
:00000001FF :00000001FF

File diff suppressed because it is too large Load Diff

View File

@@ -1,35 +1,33 @@
:103E0000112494B714BE892F8D7011F0892FEED034 :103E0000112494B714BE892F8D7011F0892FDDD045
:103E100085E08093810082E08093C00088E18093F8 :103E100085E08093810082E08093C00088E18093F8
:103E2000C10086E08093C20080E18093C4008EE0F0 :103E2000C10086E08093C20080E18093C4008EE0F0
:103E3000C7D0259A86E020E33CEF91E030938500DF :103E3000B6D0259A86E020E33CEF91E030938500F0
:103E40002093840096BBB09BFECF1D9AA89581500D :103E40002093840096BBB09BFECF1D9AA89581500D
:103E5000A9F7AA24BB2433E0832E7724739425E0AA :103E5000A9F7EE24FF24B3E0AB2EBB24B394A5E076
:103E6000922E91E1C92EA0D0813469F49DD0182FF3 :103E6000DA2EF1E1CF2E8FD0813469F48CD0082F77
:103E7000ADD0123811F481E004C0113809F482C0C9 :103E70009CD0023811F482E004C0013809F471C00A
:103E800083E08AD086C0823411F484E103C0853493 :103E800083E079D075C0823411F484E103C08534B5
:103E900019F485E0A3D07DC0853579F485D0E82E6E :103E900019F485E092D06CC0853579F474D0E82EA1
:103EA000FF2482D0082F10E0102F00270E291F2991 :103EA000FF2471D0082F10E0102F00270E291F29A2
:103EB000000F111F8BD058016CC0863521F484E0AF :103EB000000F111F7AD078015BC0863521F484E0B1
:103EC0008DD080E0DECF843609F041C06DD090E027 :103EC0007CD080E0DECF843609F035C05CD05BD09A
:103ED000182F002769D090E0082B192B65D0D82E19 :103ED000182F59D0082FC0E0D1E055D089931C1776
:103EE000E801E12CF1E0FF2E5FD0F70181937F0123 :103EE000E1F763D0053409F4FFCFF701A7BEE895E9
:103EF0002197D1F76BD0F5E4DF1609F4FFCFF50178 :103EF00007B600FCFDCFA701A0E0B1E02C9130E0B7
:103F000087BEE89507B600FCFDCFB501A801A0E08B :103F000011968C91119790E0982F8827822B932BF4
:103F1000B1E02C9130E011968C91119790E0982FA0 :103F10001296FA010C01B7BEE89511244E5F5F4F6F
:103F20008827822B932B1296FB010C0177BEE89514 :103F20001A1761F7F701D7BEE89507B600FCFDCF79
:103F300011246E5F7F4F4250504059F7F50197BEF4 :103F3000C7BEE8951DC0843769F425D024D0082F6A
:103F4000E89507B600FCFDCFC7BEE89522C08437D0 :103F400022D033D0E701FE018591EF0114D001505A
:103F500091F42AD090E0D82FCC2726D090E0C82B1F :103F5000D1F70EC0853739F428D08EE10CD084E932
:103F6000D92B22D033D08501F80185918F0114D04F :103F60000AD086E08ECF813511F488E018D01DD0BC
:103F70002197D1F70EC0853739F428D08EE10CD0C7 :103F700080E101D078CF982F8091C00085FFFCCFE1
:103F800084E90AD086E07DCF813511F488E018D02D :103F80009093C60008958091C00087FFFCCF809178
:103F90001DD080E101D067CF982F8091C00085FFB0 :103F9000C00084FD01C0A8958091C6000895E0E6A8
:103FA000FCCF9093C60008958091C00087FFFCCF9E :103FA000F0E098E1908380830895EDDF803219F08E
:103FB0008091C00084FD01C0A8958091C60008953D :103FB00088E0F5DFFFCF84E1DECF1F93182FE3DF2A
:103FC000E0E6F0E098E1908380830895EDDF8032B1 :103FC0001150E9F7F2DF1F910895282E80E0E7DF16
:103FD00019F088E0F5DFFFCF84E1DECF1F93182FC3 :063FD000EE27FF27099413
:103FE000E3DF1150E9F7F2DF1F910895282E80E0FA :023FFE000206B9
:083FF000E7DFEE27FF2709942B
:023FFE000106BA
:0400000300003E00BB :0400000300003E00BB
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega168.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001f8 00003e00 00003e00 00000074 2**1 0 .text 000001d6 00003e00 00003e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00003ffe 00003ffe 0000026c 2**0 1 .version 00000002 00003ffe 00003ffe 0000024a 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 0000026e 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000296 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000274 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030a 2**0 4 .debug_info 000003ea 00000000 00000000 000002e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ea 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 00000433 00000000 00000000 000008db 2**0 6 .debug_line 00000423 00000000 00000000 000008c1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d10 2**2 7 .debug_frame 00000080 00000000 00000000 00000ce4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d90 2**0 8 .debug_str 0000017c 00000000 00000000 00000d64 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f02 2**0 9 .debug_loc 00000300 00000000 00000000 00000ee0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011d9 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011e0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10> 3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10>
appStart(ch); appStart(ch);
3e0c: 89 2f mov r24, r25 3e0c: 89 2f mov r24, r25
3e0e: ee d0 rcall .+476 ; 0x3fec <appStart> 3e0e: dd d0 rcall .+442 ; 0x3fca <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
3e2e: 8e e0 ldi r24, 0x0E ; 14 3e2e: 8e e0 ldi r24, 0x0E ; 14
3e30: c7 d0 rcall .+398 ; 0x3fc0 <watchdogConfig> 3e30: b6 d0 rcall .+364 ; 0x3f9e <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,68 +131,68 @@ void watchdogReset() {
} while (--count); } while (--count);
3e4e: 81 50 subi r24, 0x01 ; 1 3e4e: 81 50 subi r24, 0x01 ; 1
3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c> 3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c>
3e52: aa 24 eor r10, r10 3e52: ee 24 eor r14, r14
3e54: bb 24 eor r11, r11 3e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3e56: 33 e0 ldi r19, 0x03 ; 3 3e56: b3 e0 ldi r27, 0x03 ; 3
3e58: 83 2e mov r8, r19 3e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3e5a: 77 24 eor r7, r7 3e5a: bb 24 eor r11, r11
3e5c: 73 94 inc r7 3e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3e5e: 25 e0 ldi r18, 0x05 ; 5 3e5e: a5 e0 ldi r26, 0x05 ; 5
3e60: 92 2e mov r9, r18 3e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3e62: 91 e1 ldi r25, 0x11 ; 17 3e62: f1 e1 ldi r31, 0x11 ; 17
3e64: c9 2e mov r12, r25 3e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
3e66: a0 d0 rcall .+320 ; 0x3fa8 <getch> 3e66: 8f d0 rcall .+286 ; 0x3f86 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
3e68: 81 34 cpi r24, 0x41 ; 65 3e68: 81 34 cpi r24, 0x41 ; 65
3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86> 3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86>
unsigned char which = getch(); unsigned char which = getch();
3e6c: 9d d0 rcall .+314 ; 0x3fa8 <getch> 3e6c: 8c d0 rcall .+280 ; 0x3f86 <getch>
3e6e: 18 2f mov r17, r24 3e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
3e70: ad d0 rcall .+346 ; 0x3fcc <verifySpace> 3e70: 9c d0 rcall .+312 ; 0x3faa <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
3e72: 12 38 cpi r17, 0x82 ; 130 3e72: 02 38 cpi r16, 0x82 ; 130
3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a> 3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
3e76: 81 e0 ldi r24, 0x01 ; 1 3e76: 82 e0 ldi r24, 0x02 ; 2
3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82> 3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82>
} else if (which == 0x81) { } else if (which == 0x81) {
3e7a: 11 38 cpi r17, 0x81 ; 129 3e7a: 01 38 cpi r16, 0x81 ; 129
3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80> 3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80>
3e7e: 82 c0 rjmp .+260 ; 0x3f84 <main+0x184> 3e7e: 71 c0 rjmp .+226 ; 0x3f62 <main+0x162>
} else { } else {
/* /*
* GET PARAMETER returns a generic 0x03 reply for * GET PARAMETER returns a generic 0x03 reply for
@@ -200,8 +200,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
3e80: 83 e0 ldi r24, 0x03 ; 3 3e80: 83 e0 ldi r24, 0x03 ; 3
3e82: 8a d0 rcall .+276 ; 0x3f98 <putch> 3e82: 79 d0 rcall .+242 ; 0x3f76 <putch>
3e84: 86 c0 rjmp .+268 ; 0x3f92 <main+0x192> 3e84: 75 c0 rjmp .+234 ; 0x3f70 <main+0x170>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -218,8 +218,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
3e92: 85 e0 ldi r24, 0x05 ; 5 3e92: 85 e0 ldi r24, 0x05 ; 5
3e94: a3 d0 rcall .+326 ; 0x3fdc <getNch> 3e94: 92 d0 rcall .+292 ; 0x3fba <getNch>
3e96: 7d c0 rjmp .+250 ; 0x3f92 <main+0x192> 3e96: 6c c0 rjmp .+216 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
3e98: 85 35 cpi r24, 0x55 ; 85 3e98: 85 35 cpi r24, 0x55 ; 85
@@ -227,11 +227,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
3e9c: 85 d0 rcall .+266 ; 0x3fa8 <getch> 3e9c: 74 d0 rcall .+232 ; 0x3f86 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
3e9e: e8 2e mov r14, r24 3e9e: e8 2e mov r14, r24
3ea0: ff 24 eor r15, r15 3ea0: ff 24 eor r15, r15
3ea2: 82 d0 rcall .+260 ; 0x3fa8 <getch> 3ea2: 71 d0 rcall .+226 ; 0x3f86 <getch>
3ea4: 08 2f mov r16, r24 3ea4: 08 2f mov r16, r24
3ea6: 10 e0 ldi r17, 0x00 ; 0 3ea6: 10 e0 ldi r17, 0x00 ; 0
3ea8: 10 2f mov r17, r16 3ea8: 10 2f mov r17, r16
@@ -247,9 +247,9 @@ void watchdogReset() {
3eb2: 11 1f adc r17, r17 3eb2: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
3eb4: 8b d0 rcall .+278 ; 0x3fcc <verifySpace> 3eb4: 7a d0 rcall .+244 ; 0x3faa <verifySpace>
3eb6: 58 01 movw r10, r16 3eb6: 78 01 movw r14, r16
3eb8: 6c c0 rjmp .+216 ; 0x3f92 <main+0x192> 3eb8: 5b c0 rjmp .+182 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
3eba: 86 35 cpi r24, 0x56 ; 86 3eba: 86 35 cpi r24, 0x56 ; 86
@@ -257,7 +257,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
3ebe: 84 e0 ldi r24, 0x04 ; 4 3ebe: 84 e0 ldi r24, 0x04 ; 4
3ec0: 8d d0 rcall .+282 ; 0x3fdc <getNch> 3ec0: 7c d0 rcall .+248 ; 0x3fba <getNch>
putch(0x00); putch(0x00);
3ec2: 80 e0 ldi r24, 0x00 ; 0 3ec2: 80 e0 ldi r24, 0x00 ; 0
3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82> 3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82>
@@ -266,339 +266,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
3ec6: 84 36 cpi r24, 0x64 ; 100 3ec6: 84 36 cpi r24, 0x64 ; 100
3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc> 3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc>
3eca: 41 c0 rjmp .+130 ; 0x3f4e <main+0x14e> 3eca: 35 c0 rjmp .+106 ; 0x3f36 <main+0x136>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3ecc: 6d d0 rcall .+218 ; 0x3fa8 <getch> 3ecc: 5c d0 rcall .+184 ; 0x3f86 <getch>
3ece: 90 e0 ldi r25, 0x00 ; 0 3ece: 5b d0 rcall .+182 ; 0x3f86 <getch>
3ed0: 18 2f mov r17, r24 3ed0: 18 2f mov r17, r24
3ed2: 00 27 eor r16, r16
length |= getch();
3ed4: 69 d0 rcall .+210 ; 0x3fa8 <getch>
3ed6: 90 e0 ldi r25, 0x00 ; 0
3ed8: 08 2b or r16, r24
3eda: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
3edc: 65 d0 rcall .+202 ; 0x3fa8 <getch> 3ed2: 59 d0 rcall .+178 ; 0x3f86 <getch>
3ede: d8 2e mov r13, r24 3ed4: 08 2f mov r16, r24
3ee0: e8 01 movw r28, r16 3ed6: c0 e0 ldi r28, 0x00 ; 0
3ee2: e1 2c mov r14, r1 3ed8: d1 e0 ldi r29, 0x01 ; 1
3ee4: f1 e0 ldi r31, 0x01 ; 1
3ee6: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
3ee8: 5f d0 rcall .+190 ; 0x3fa8 <getch> 3eda: 55 d0 rcall .+170 ; 0x3f86 <getch>
3eea: f7 01 movw r30, r14 3edc: 89 93 st Y+, r24
3eec: 81 93 st Z+, r24
3eee: 7f 01 movw r14, r30
while (--length); while (--length);
3ef0: 21 97 sbiw r28, 0x01 ; 1 3ede: 1c 17 cp r17, r28
3ef2: d1 f7 brne .-12 ; 0x3ee8 <main+0xe8> 3ee0: e1 f7 brne .-8 ; 0x3eda <main+0xda>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
3ef4: 6b d0 rcall .+214 ; 0x3fcc <verifySpace> 3ee2: 63 d0 rcall .+198 ; 0x3faa <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
3ef6: f5 e4 ldi r31, 0x45 ; 69 3ee4: 05 34 cpi r16, 0x45 ; 69
3ef8: df 16 cp r13, r31 3ee6: 09 f4 brne .+2 ; 0x3eea <main+0xea>
3efa: 09 f4 brne .+2 ; 0x3efe <main+0xfe> 3ee8: ff cf rjmp .-2 ; 0x3ee8 <main+0xe8>
3efc: ff cf rjmp .-2 ; 0x3efc <main+0xfc>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3efe: f5 01 movw r30, r10 3eea: f7 01 movw r30, r14
3f00: 87 be out 0x37, r8 ; 55 3eec: a7 be out 0x37, r10 ; 55
3f02: e8 95 spm 3eee: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f04: 07 b6 in r0, 0x37 ; 55 3ef0: 07 b6 in r0, 0x37 ; 55
3f06: 00 fc sbrc r0, 0 3ef2: 00 fc sbrc r0, 0
3f08: fd cf rjmp .-6 ; 0x3f04 <main+0x104> 3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3f0a: b5 01 movw r22, r10 3ef6: a7 01 movw r20, r14
3f0c: a8 01 movw r20, r16 3ef8: a0 e0 ldi r26, 0x00 ; 0
3f0e: a0 e0 ldi r26, 0x00 ; 0 3efa: b1 e0 ldi r27, 0x01 ; 1
3f10: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
3f12: 2c 91 ld r18, X 3efc: 2c 91 ld r18, X
3f14: 30 e0 ldi r19, 0x00 ; 0 3efe: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
3f16: 11 96 adiw r26, 0x01 ; 1 3f00: 11 96 adiw r26, 0x01 ; 1
3f18: 8c 91 ld r24, X 3f02: 8c 91 ld r24, X
3f1a: 11 97 sbiw r26, 0x01 ; 1 3f04: 11 97 sbiw r26, 0x01 ; 1
3f1c: 90 e0 ldi r25, 0x00 ; 0 3f06: 90 e0 ldi r25, 0x00 ; 0
3f1e: 98 2f mov r25, r24 3f08: 98 2f mov r25, r24
3f20: 88 27 eor r24, r24 3f0a: 88 27 eor r24, r24
3f22: 82 2b or r24, r18 3f0c: 82 2b or r24, r18
3f24: 93 2b or r25, r19 3f0e: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
3f26: 12 96 adiw r26, 0x02 ; 2 3f10: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3f28: fb 01 movw r30, r22 3f12: fa 01 movw r30, r20
3f2a: 0c 01 movw r0, r24 3f14: 0c 01 movw r0, r24
3f2c: 77 be out 0x37, r7 ; 55 3f16: b7 be out 0x37, r11 ; 55
3f2e: e8 95 spm 3f18: e8 95 spm
3f30: 11 24 eor r1, r1 3f1a: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
3f32: 6e 5f subi r22, 0xFE ; 254 3f1c: 4e 5f subi r20, 0xFE ; 254
3f34: 7f 4f sbci r23, 0xFF ; 255 3f1e: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
3f36: 42 50 subi r20, 0x02 ; 2 3f20: 1a 17 cp r17, r26
3f38: 50 40 sbci r21, 0x00 ; 0 3f22: 61 f7 brne .-40 ; 0x3efc <main+0xfc>
3f3a: 59 f7 brne .-42 ; 0x3f12 <main+0x112>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3f3c: f5 01 movw r30, r10 3f24: f7 01 movw r30, r14
3f3e: 97 be out 0x37, r9 ; 55 3f26: d7 be out 0x37, r13 ; 55
3f40: e8 95 spm 3f28: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f42: 07 b6 in r0, 0x37 ; 55 3f2a: 07 b6 in r0, 0x37 ; 55
3f44: 00 fc sbrc r0, 0 3f2c: 00 fc sbrc r0, 0
3f46: fd cf rjmp .-6 ; 0x3f42 <main+0x142> 3f2e: fd cf rjmp .-6 ; 0x3f2a <main+0x12a>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3f48: c7 be out 0x37, r12 ; 55 3f30: c7 be out 0x37, r12 ; 55
3f4a: e8 95 spm 3f32: e8 95 spm
3f4c: 22 c0 rjmp .+68 ; 0x3f92 <main+0x192> 3f34: 1d c0 rjmp .+58 ; 0x3f70 <main+0x170>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
3f4e: 84 37 cpi r24, 0x74 ; 116 3f36: 84 37 cpi r24, 0x74 ; 116
3f50: 91 f4 brne .+36 ; 0x3f76 <main+0x176> 3f38: 69 f4 brne .+26 ; 0x3f54 <main+0x154>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3f52: 2a d0 rcall .+84 ; 0x3fa8 <getch> 3f3a: 25 d0 rcall .+74 ; 0x3f86 <getch>
3f54: 90 e0 ldi r25, 0x00 ; 0 3f3c: 24 d0 rcall .+72 ; 0x3f86 <getch>
3f56: d8 2f mov r29, r24 3f3e: 08 2f mov r16, r24
3f58: cc 27 eor r28, r28
length |= getch();
3f5a: 26 d0 rcall .+76 ; 0x3fa8 <getch>
3f5c: 90 e0 ldi r25, 0x00 ; 0
3f5e: c8 2b or r28, r24
3f60: d9 2b or r29, r25
desttype = getch(); desttype = getch();
3f62: 22 d0 rcall .+68 ; 0x3fa8 <getch> 3f40: 22 d0 rcall .+68 ; 0x3f86 <getch>
verifySpace(); verifySpace();
3f64: 33 d0 rcall .+102 ; 0x3fcc <verifySpace> 3f42: 33 d0 rcall .+102 ; 0x3faa <verifySpace>
3f66: 85 01 movw r16, r10 3f44: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
3f68: f8 01 movw r30, r16 3f46: fe 01 movw r30, r28
3f6a: 85 91 lpm r24, Z+ 3f48: 85 91 lpm r24, Z+
3f6c: 8f 01 movw r16, r30 3f4a: ef 01 movw r28, r30
3f6e: 14 d0 rcall .+40 ; 0x3f98 <putch> 3f4c: 14 d0 rcall .+40 ; 0x3f76 <putch>
} while (--length); } while (--length);
3f70: 21 97 sbiw r28, 0x01 ; 1 3f4e: 01 50 subi r16, 0x01 ; 1
3f72: d1 f7 brne .-12 ; 0x3f68 <main+0x168> 3f50: d1 f7 brne .-12 ; 0x3f46 <main+0x146>
3f74: 0e c0 rjmp .+28 ; 0x3f92 <main+0x192> 3f52: 0e c0 rjmp .+28 ; 0x3f70 <main+0x170>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
3f76: 85 37 cpi r24, 0x75 ; 117 3f54: 85 37 cpi r24, 0x75 ; 117
3f78: 39 f4 brne .+14 ; 0x3f88 <main+0x188> 3f56: 39 f4 brne .+14 ; 0x3f66 <main+0x166>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
3f7a: 28 d0 rcall .+80 ; 0x3fcc <verifySpace> 3f58: 28 d0 rcall .+80 ; 0x3faa <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
3f7c: 8e e1 ldi r24, 0x1E ; 30 3f5a: 8e e1 ldi r24, 0x1E ; 30
3f7e: 0c d0 rcall .+24 ; 0x3f98 <putch> 3f5c: 0c d0 rcall .+24 ; 0x3f76 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
3f80: 84 e9 ldi r24, 0x94 ; 148 3f5e: 84 e9 ldi r24, 0x94 ; 148
3f82: 0a d0 rcall .+20 ; 0x3f98 <putch> 3f60: 0a d0 rcall .+20 ; 0x3f76 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
3f84: 86 e0 ldi r24, 0x06 ; 6 3f62: 86 e0 ldi r24, 0x06 ; 6
3f86: 7d cf rjmp .-262 ; 0x3e82 <main+0x82> 3f64: 8e cf rjmp .-228 ; 0x3e82 <main+0x82>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f88: 81 35 cpi r24, 0x51 ; 81 3f66: 81 35 cpi r24, 0x51 ; 81
3f8a: 11 f4 brne .+4 ; 0x3f90 <main+0x190> 3f68: 11 f4 brne .+4 ; 0x3f6e <main+0x16e>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
3f8c: 88 e0 ldi r24, 0x08 ; 8 3f6a: 88 e0 ldi r24, 0x08 ; 8
3f8e: 18 d0 rcall .+48 ; 0x3fc0 <watchdogConfig> 3f6c: 18 d0 rcall .+48 ; 0x3f9e <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
3f90: 1d d0 rcall .+58 ; 0x3fcc <verifySpace> 3f6e: 1d d0 rcall .+58 ; 0x3faa <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
3f92: 80 e1 ldi r24, 0x10 ; 16 3f70: 80 e1 ldi r24, 0x10 ; 16
3f94: 01 d0 rcall .+2 ; 0x3f98 <putch> 3f72: 01 d0 rcall .+2 ; 0x3f76 <putch>
3f96: 67 cf rjmp .-306 ; 0x3e66 <main+0x66> 3f74: 78 cf rjmp .-272 ; 0x3e66 <main+0x66>
00003f98 <putch>: 00003f76 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
3f98: 98 2f mov r25, r24 3f76: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
3f9a: 80 91 c0 00 lds r24, 0x00C0 3f78: 80 91 c0 00 lds r24, 0x00C0
3f9e: 85 ff sbrs r24, 5 3f7c: 85 ff sbrs r24, 5
3fa0: fc cf rjmp .-8 ; 0x3f9a <putch+0x2> 3f7e: fc cf rjmp .-8 ; 0x3f78 <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
3fa2: 90 93 c6 00 sts 0x00C6, r25 3f80: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
3fa6: 08 95 ret 3f84: 08 95 ret
00003fa8 <getch>: 00003f86 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
3fa8: 80 91 c0 00 lds r24, 0x00C0 3f86: 80 91 c0 00 lds r24, 0x00C0
3fac: 87 ff sbrs r24, 7 3f8a: 87 ff sbrs r24, 7
3fae: fc cf rjmp .-8 ; 0x3fa8 <getch> 3f8c: fc cf rjmp .-8 ; 0x3f86 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
3fb0: 80 91 c0 00 lds r24, 0x00C0 3f8e: 80 91 c0 00 lds r24, 0x00C0
3fb4: 84 fd sbrc r24, 4 3f92: 84 fd sbrc r24, 4
3fb6: 01 c0 rjmp .+2 ; 0x3fba <getch+0x12> 3f94: 01 c0 rjmp .+2 ; 0x3f98 <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
3fb8: a8 95 wdr 3f96: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
3fba: 80 91 c6 00 lds r24, 0x00C6 3f98: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
3fbe: 08 95 ret 3f9c: 08 95 ret
00003fc0 <watchdogConfig>: 00003f9e <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
3fc0: e0 e6 ldi r30, 0x60 ; 96 3f9e: e0 e6 ldi r30, 0x60 ; 96
3fc2: f0 e0 ldi r31, 0x00 ; 0 3fa0: f0 e0 ldi r31, 0x00 ; 0
3fc4: 98 e1 ldi r25, 0x18 ; 24 3fa2: 98 e1 ldi r25, 0x18 ; 24
3fc6: 90 83 st Z, r25 3fa4: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
3fc8: 80 83 st Z, r24 3fa6: 80 83 st Z, r24
} }
3fca: 08 95 ret 3fa8: 08 95 ret
00003fcc <verifySpace>: 00003faa <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
3fcc: ed df rcall .-38 ; 0x3fa8 <getch> 3faa: ed df rcall .-38 ; 0x3f86 <getch>
3fce: 80 32 cpi r24, 0x20 ; 32 3fac: 80 32 cpi r24, 0x20 ; 32
3fd0: 19 f0 breq .+6 ; 0x3fd8 <verifySpace+0xc> 3fae: 19 f0 breq .+6 ; 0x3fb6 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3fd2: 88 e0 ldi r24, 0x08 ; 8 3fb0: 88 e0 ldi r24, 0x08 ; 8
3fd4: f5 df rcall .-22 ; 0x3fc0 <watchdogConfig> 3fb2: f5 df rcall .-22 ; 0x3f9e <watchdogConfig>
3fd6: ff cf rjmp .-2 ; 0x3fd6 <verifySpace+0xa> 3fb4: ff cf rjmp .-2 ; 0x3fb4 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
3fd8: 84 e1 ldi r24, 0x14 ; 20 3fb6: 84 e1 ldi r24, 0x14 ; 20
} }
3fda: de cf rjmp .-68 ; 0x3f98 <putch> 3fb8: de cf rjmp .-68 ; 0x3f76 <putch>
00003fdc <getNch>: 00003fba <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
3fdc: 1f 93 push r17 3fba: 1f 93 push r17
3fde: 18 2f mov r17, r24 3fbc: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
3fe0: e3 df rcall .-58 ; 0x3fa8 <getch> 3fbe: e3 df rcall .-58 ; 0x3f86 <getch>
3fe2: 11 50 subi r17, 0x01 ; 1 3fc0: 11 50 subi r17, 0x01 ; 1
3fe4: e9 f7 brne .-6 ; 0x3fe0 <getNch+0x4> 3fc2: e9 f7 brne .-6 ; 0x3fbe <getNch+0x4>
verifySpace(); verifySpace();
3fe6: f2 df rcall .-28 ; 0x3fcc <verifySpace> 3fc4: f2 df rcall .-28 ; 0x3faa <verifySpace>
} }
3fe8: 1f 91 pop r17 3fc6: 1f 91 pop r17
3fea: 08 95 ret 3fc8: 08 95 ret
00003fec <appStart>: 00003fca <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fec: 28 2e mov r2, r24 3fca: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
3fee: 80 e0 ldi r24, 0x00 ; 0 3fcc: 80 e0 ldi r24, 0x00 ; 0
3ff0: e7 df rcall .-50 ; 0x3fc0 <watchdogConfig> 3fce: e7 df rcall .-50 ; 0x3f9e <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
3ff2: ee 27 eor r30, r30 3fd0: ee 27 eor r30, r30
3ff4: ff 27 eor r31, r31 3fd2: ff 27 eor r31, r31
3ff6: 09 94 ijmp 3fd4: 09 94 ijmp

View File

@@ -1,35 +1,33 @@
:103E0000112494B714BE892F8D7011F0892FEED034 :103E0000112494B714BE892F8D7011F0892FDDD045
:103E100085E08093810082E08093C00088E18093F8 :103E100085E08093810082E08093C00088E18093F8
:103E2000C10086E08093C20085E18093C4008EE0EB :103E2000C10086E08093C20085E18093C4008EE0EB
:103E3000C7D0259A86E02CE33BEF91E030938500D4 :103E3000B6D0259A86E02CE33BEF91E030938500E5
:103E40002093840096BBB09BFECF1D9AA89581500D :103E40002093840096BBB09BFECF1D9AA89581500D
:103E5000A9F7AA24BB2433E0832E7724739425E0AA :103E5000A9F7EE24FF24B3E0AB2EBB24B394A5E076
:103E6000922E91E1C92EA0D0813469F49DD0182FF3 :103E6000DA2EF1E1CF2E8FD0813469F48CD0082F77
:103E7000ADD0123811F481E004C0113809F482C0C9 :103E70009CD0023811F482E004C0013809F471C00A
:103E800083E08AD086C0823411F484E103C0853493 :103E800083E079D075C0823411F484E103C08534B5
:103E900019F485E0A3D07DC0853579F485D0E82E6E :103E900019F485E092D06CC0853579F474D0E82EA1
:103EA000FF2482D0082F10E0102F00270E291F2991 :103EA000FF2471D0082F10E0102F00270E291F29A2
:103EB000000F111F8BD058016CC0863521F484E0AF :103EB000000F111F7AD078015BC0863521F484E0B1
:103EC0008DD080E0DECF843609F041C06DD090E027 :103EC0007CD080E0DECF843609F035C05CD05BD09A
:103ED000182F002769D090E0082B192B65D0D82E19 :103ED000182F59D0082FC0E0D1E055D089931C1776
:103EE000E801E12CF1E0FF2E5FD0F70181937F0123 :103EE000E1F763D0053409F4FFCFF701A7BEE895E9
:103EF0002197D1F76BD0F5E4DF1609F4FFCFF50178 :103EF00007B600FCFDCFA701A0E0B1E02C9130E0B7
:103F000087BEE89507B600FCFDCFB501A801A0E08B :103F000011968C91119790E0982F8827822B932BF4
:103F1000B1E02C9130E011968C91119790E0982FA0 :103F10001296FA010C01B7BEE89511244E5F5F4F6F
:103F20008827822B932B1296FB010C0177BEE89514 :103F20001A1761F7F701D7BEE89507B600FCFDCF79
:103F300011246E5F7F4F4250504059F7F50197BEF4 :103F3000C7BEE8951DC0843769F425D024D0082F6A
:103F4000E89507B600FCFDCFC7BEE89522C08437D0 :103F400022D033D0E701FE018591EF0114D001505A
:103F500091F42AD090E0D82FCC2726D090E0C82B1F :103F5000D1F70EC0853739F428D08EE10CD084E932
:103F6000D92B22D033D08501F80185918F0114D04F :103F60000AD086E08ECF813511F488E018D01DD0BC
:103F70002197D1F70EC0853739F428D08EE10CD0C7 :103F700080E101D078CF982F8091C00085FFFCCFE1
:103F800084E90AD086E07DCF813511F488E018D02D :103F80009093C60008958091C00087FFFCCF809178
:103F90001DD080E101D067CF982F8091C00085FFB0 :103F9000C00084FD01C0A8958091C6000895E0E6A8
:103FA000FCCF9093C60008958091C00087FFFCCF9E :103FA000F0E098E1908380830895EDDF803219F08E
:103FB0008091C00084FD01C0A8958091C60008953D :103FB00088E0F5DFFFCF84E1DECF1F93182FE3DF2A
:103FC000E0E6F0E098E1908380830895EDDF8032B1 :103FC0001150E9F7F2DF1F910895282E80E0E7DF16
:103FD00019F088E0F5DFFFCF84E1DECF1F93182FC3 :063FD000EE27FF27099413
:103FE000E3DF1150E9F7F2DF1F910895282E80E0FA :023FFE000206B9
:083FF000E7DFEE27FF2709942B
:023FFE000106BA
:0400000300003E00BB :0400000300003E00BB
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega168.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001f8 00003e00 00003e00 00000074 2**1 0 .text 000001d6 00003e00 00003e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00003ffe 00003ffe 0000026c 2**0 1 .version 00000002 00003ffe 00003ffe 0000024a 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 0000026e 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000296 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000274 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030a 2**0 4 .debug_info 000003ea 00000000 00000000 000002e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ea 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 00000433 00000000 00000000 000008db 2**0 6 .debug_line 00000423 00000000 00000000 000008c1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d10 2**2 7 .debug_frame 00000080 00000000 00000000 00000ce4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d90 2**0 8 .debug_str 0000017c 00000000 00000000 00000d64 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f02 2**0 9 .debug_loc 00000300 00000000 00000000 00000ee0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011d9 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011e0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10> 3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10>
appStart(ch); appStart(ch);
3e0c: 89 2f mov r24, r25 3e0c: 89 2f mov r24, r25
3e0e: ee d0 rcall .+476 ; 0x3fec <appStart> 3e0e: dd d0 rcall .+442 ; 0x3fca <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
3e2e: 8e e0 ldi r24, 0x0E ; 14 3e2e: 8e e0 ldi r24, 0x0E ; 14
3e30: c7 d0 rcall .+398 ; 0x3fc0 <watchdogConfig> 3e30: b6 d0 rcall .+364 ; 0x3f9e <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,68 +131,68 @@ void watchdogReset() {
} while (--count); } while (--count);
3e4e: 81 50 subi r24, 0x01 ; 1 3e4e: 81 50 subi r24, 0x01 ; 1
3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c> 3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c>
3e52: aa 24 eor r10, r10 3e52: ee 24 eor r14, r14
3e54: bb 24 eor r11, r11 3e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3e56: 33 e0 ldi r19, 0x03 ; 3 3e56: b3 e0 ldi r27, 0x03 ; 3
3e58: 83 2e mov r8, r19 3e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3e5a: 77 24 eor r7, r7 3e5a: bb 24 eor r11, r11
3e5c: 73 94 inc r7 3e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3e5e: 25 e0 ldi r18, 0x05 ; 5 3e5e: a5 e0 ldi r26, 0x05 ; 5
3e60: 92 2e mov r9, r18 3e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3e62: 91 e1 ldi r25, 0x11 ; 17 3e62: f1 e1 ldi r31, 0x11 ; 17
3e64: c9 2e mov r12, r25 3e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
3e66: a0 d0 rcall .+320 ; 0x3fa8 <getch> 3e66: 8f d0 rcall .+286 ; 0x3f86 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
3e68: 81 34 cpi r24, 0x41 ; 65 3e68: 81 34 cpi r24, 0x41 ; 65
3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86> 3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86>
unsigned char which = getch(); unsigned char which = getch();
3e6c: 9d d0 rcall .+314 ; 0x3fa8 <getch> 3e6c: 8c d0 rcall .+280 ; 0x3f86 <getch>
3e6e: 18 2f mov r17, r24 3e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
3e70: ad d0 rcall .+346 ; 0x3fcc <verifySpace> 3e70: 9c d0 rcall .+312 ; 0x3faa <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
3e72: 12 38 cpi r17, 0x82 ; 130 3e72: 02 38 cpi r16, 0x82 ; 130
3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a> 3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
3e76: 81 e0 ldi r24, 0x01 ; 1 3e76: 82 e0 ldi r24, 0x02 ; 2
3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82> 3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82>
} else if (which == 0x81) { } else if (which == 0x81) {
3e7a: 11 38 cpi r17, 0x81 ; 129 3e7a: 01 38 cpi r16, 0x81 ; 129
3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80> 3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80>
3e7e: 82 c0 rjmp .+260 ; 0x3f84 <main+0x184> 3e7e: 71 c0 rjmp .+226 ; 0x3f62 <main+0x162>
} else { } else {
/* /*
* GET PARAMETER returns a generic 0x03 reply for * GET PARAMETER returns a generic 0x03 reply for
@@ -200,8 +200,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
3e80: 83 e0 ldi r24, 0x03 ; 3 3e80: 83 e0 ldi r24, 0x03 ; 3
3e82: 8a d0 rcall .+276 ; 0x3f98 <putch> 3e82: 79 d0 rcall .+242 ; 0x3f76 <putch>
3e84: 86 c0 rjmp .+268 ; 0x3f92 <main+0x192> 3e84: 75 c0 rjmp .+234 ; 0x3f70 <main+0x170>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -218,8 +218,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
3e92: 85 e0 ldi r24, 0x05 ; 5 3e92: 85 e0 ldi r24, 0x05 ; 5
3e94: a3 d0 rcall .+326 ; 0x3fdc <getNch> 3e94: 92 d0 rcall .+292 ; 0x3fba <getNch>
3e96: 7d c0 rjmp .+250 ; 0x3f92 <main+0x192> 3e96: 6c c0 rjmp .+216 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
3e98: 85 35 cpi r24, 0x55 ; 85 3e98: 85 35 cpi r24, 0x55 ; 85
@@ -227,11 +227,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
3e9c: 85 d0 rcall .+266 ; 0x3fa8 <getch> 3e9c: 74 d0 rcall .+232 ; 0x3f86 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
3e9e: e8 2e mov r14, r24 3e9e: e8 2e mov r14, r24
3ea0: ff 24 eor r15, r15 3ea0: ff 24 eor r15, r15
3ea2: 82 d0 rcall .+260 ; 0x3fa8 <getch> 3ea2: 71 d0 rcall .+226 ; 0x3f86 <getch>
3ea4: 08 2f mov r16, r24 3ea4: 08 2f mov r16, r24
3ea6: 10 e0 ldi r17, 0x00 ; 0 3ea6: 10 e0 ldi r17, 0x00 ; 0
3ea8: 10 2f mov r17, r16 3ea8: 10 2f mov r17, r16
@@ -247,9 +247,9 @@ void watchdogReset() {
3eb2: 11 1f adc r17, r17 3eb2: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
3eb4: 8b d0 rcall .+278 ; 0x3fcc <verifySpace> 3eb4: 7a d0 rcall .+244 ; 0x3faa <verifySpace>
3eb6: 58 01 movw r10, r16 3eb6: 78 01 movw r14, r16
3eb8: 6c c0 rjmp .+216 ; 0x3f92 <main+0x192> 3eb8: 5b c0 rjmp .+182 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
3eba: 86 35 cpi r24, 0x56 ; 86 3eba: 86 35 cpi r24, 0x56 ; 86
@@ -257,7 +257,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
3ebe: 84 e0 ldi r24, 0x04 ; 4 3ebe: 84 e0 ldi r24, 0x04 ; 4
3ec0: 8d d0 rcall .+282 ; 0x3fdc <getNch> 3ec0: 7c d0 rcall .+248 ; 0x3fba <getNch>
putch(0x00); putch(0x00);
3ec2: 80 e0 ldi r24, 0x00 ; 0 3ec2: 80 e0 ldi r24, 0x00 ; 0
3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82> 3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82>
@@ -266,339 +266,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
3ec6: 84 36 cpi r24, 0x64 ; 100 3ec6: 84 36 cpi r24, 0x64 ; 100
3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc> 3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc>
3eca: 41 c0 rjmp .+130 ; 0x3f4e <main+0x14e> 3eca: 35 c0 rjmp .+106 ; 0x3f36 <main+0x136>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3ecc: 6d d0 rcall .+218 ; 0x3fa8 <getch> 3ecc: 5c d0 rcall .+184 ; 0x3f86 <getch>
3ece: 90 e0 ldi r25, 0x00 ; 0 3ece: 5b d0 rcall .+182 ; 0x3f86 <getch>
3ed0: 18 2f mov r17, r24 3ed0: 18 2f mov r17, r24
3ed2: 00 27 eor r16, r16
length |= getch();
3ed4: 69 d0 rcall .+210 ; 0x3fa8 <getch>
3ed6: 90 e0 ldi r25, 0x00 ; 0
3ed8: 08 2b or r16, r24
3eda: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
3edc: 65 d0 rcall .+202 ; 0x3fa8 <getch> 3ed2: 59 d0 rcall .+178 ; 0x3f86 <getch>
3ede: d8 2e mov r13, r24 3ed4: 08 2f mov r16, r24
3ee0: e8 01 movw r28, r16 3ed6: c0 e0 ldi r28, 0x00 ; 0
3ee2: e1 2c mov r14, r1 3ed8: d1 e0 ldi r29, 0x01 ; 1
3ee4: f1 e0 ldi r31, 0x01 ; 1
3ee6: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
3ee8: 5f d0 rcall .+190 ; 0x3fa8 <getch> 3eda: 55 d0 rcall .+170 ; 0x3f86 <getch>
3eea: f7 01 movw r30, r14 3edc: 89 93 st Y+, r24
3eec: 81 93 st Z+, r24
3eee: 7f 01 movw r14, r30
while (--length); while (--length);
3ef0: 21 97 sbiw r28, 0x01 ; 1 3ede: 1c 17 cp r17, r28
3ef2: d1 f7 brne .-12 ; 0x3ee8 <main+0xe8> 3ee0: e1 f7 brne .-8 ; 0x3eda <main+0xda>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
3ef4: 6b d0 rcall .+214 ; 0x3fcc <verifySpace> 3ee2: 63 d0 rcall .+198 ; 0x3faa <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
3ef6: f5 e4 ldi r31, 0x45 ; 69 3ee4: 05 34 cpi r16, 0x45 ; 69
3ef8: df 16 cp r13, r31 3ee6: 09 f4 brne .+2 ; 0x3eea <main+0xea>
3efa: 09 f4 brne .+2 ; 0x3efe <main+0xfe> 3ee8: ff cf rjmp .-2 ; 0x3ee8 <main+0xe8>
3efc: ff cf rjmp .-2 ; 0x3efc <main+0xfc>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3efe: f5 01 movw r30, r10 3eea: f7 01 movw r30, r14
3f00: 87 be out 0x37, r8 ; 55 3eec: a7 be out 0x37, r10 ; 55
3f02: e8 95 spm 3eee: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f04: 07 b6 in r0, 0x37 ; 55 3ef0: 07 b6 in r0, 0x37 ; 55
3f06: 00 fc sbrc r0, 0 3ef2: 00 fc sbrc r0, 0
3f08: fd cf rjmp .-6 ; 0x3f04 <main+0x104> 3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3f0a: b5 01 movw r22, r10 3ef6: a7 01 movw r20, r14
3f0c: a8 01 movw r20, r16 3ef8: a0 e0 ldi r26, 0x00 ; 0
3f0e: a0 e0 ldi r26, 0x00 ; 0 3efa: b1 e0 ldi r27, 0x01 ; 1
3f10: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
3f12: 2c 91 ld r18, X 3efc: 2c 91 ld r18, X
3f14: 30 e0 ldi r19, 0x00 ; 0 3efe: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
3f16: 11 96 adiw r26, 0x01 ; 1 3f00: 11 96 adiw r26, 0x01 ; 1
3f18: 8c 91 ld r24, X 3f02: 8c 91 ld r24, X
3f1a: 11 97 sbiw r26, 0x01 ; 1 3f04: 11 97 sbiw r26, 0x01 ; 1
3f1c: 90 e0 ldi r25, 0x00 ; 0 3f06: 90 e0 ldi r25, 0x00 ; 0
3f1e: 98 2f mov r25, r24 3f08: 98 2f mov r25, r24
3f20: 88 27 eor r24, r24 3f0a: 88 27 eor r24, r24
3f22: 82 2b or r24, r18 3f0c: 82 2b or r24, r18
3f24: 93 2b or r25, r19 3f0e: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
3f26: 12 96 adiw r26, 0x02 ; 2 3f10: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3f28: fb 01 movw r30, r22 3f12: fa 01 movw r30, r20
3f2a: 0c 01 movw r0, r24 3f14: 0c 01 movw r0, r24
3f2c: 77 be out 0x37, r7 ; 55 3f16: b7 be out 0x37, r11 ; 55
3f2e: e8 95 spm 3f18: e8 95 spm
3f30: 11 24 eor r1, r1 3f1a: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
3f32: 6e 5f subi r22, 0xFE ; 254 3f1c: 4e 5f subi r20, 0xFE ; 254
3f34: 7f 4f sbci r23, 0xFF ; 255 3f1e: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
3f36: 42 50 subi r20, 0x02 ; 2 3f20: 1a 17 cp r17, r26
3f38: 50 40 sbci r21, 0x00 ; 0 3f22: 61 f7 brne .-40 ; 0x3efc <main+0xfc>
3f3a: 59 f7 brne .-42 ; 0x3f12 <main+0x112>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3f3c: f5 01 movw r30, r10 3f24: f7 01 movw r30, r14
3f3e: 97 be out 0x37, r9 ; 55 3f26: d7 be out 0x37, r13 ; 55
3f40: e8 95 spm 3f28: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f42: 07 b6 in r0, 0x37 ; 55 3f2a: 07 b6 in r0, 0x37 ; 55
3f44: 00 fc sbrc r0, 0 3f2c: 00 fc sbrc r0, 0
3f46: fd cf rjmp .-6 ; 0x3f42 <main+0x142> 3f2e: fd cf rjmp .-6 ; 0x3f2a <main+0x12a>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3f48: c7 be out 0x37, r12 ; 55 3f30: c7 be out 0x37, r12 ; 55
3f4a: e8 95 spm 3f32: e8 95 spm
3f4c: 22 c0 rjmp .+68 ; 0x3f92 <main+0x192> 3f34: 1d c0 rjmp .+58 ; 0x3f70 <main+0x170>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
3f4e: 84 37 cpi r24, 0x74 ; 116 3f36: 84 37 cpi r24, 0x74 ; 116
3f50: 91 f4 brne .+36 ; 0x3f76 <main+0x176> 3f38: 69 f4 brne .+26 ; 0x3f54 <main+0x154>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3f52: 2a d0 rcall .+84 ; 0x3fa8 <getch> 3f3a: 25 d0 rcall .+74 ; 0x3f86 <getch>
3f54: 90 e0 ldi r25, 0x00 ; 0 3f3c: 24 d0 rcall .+72 ; 0x3f86 <getch>
3f56: d8 2f mov r29, r24 3f3e: 08 2f mov r16, r24
3f58: cc 27 eor r28, r28
length |= getch();
3f5a: 26 d0 rcall .+76 ; 0x3fa8 <getch>
3f5c: 90 e0 ldi r25, 0x00 ; 0
3f5e: c8 2b or r28, r24
3f60: d9 2b or r29, r25
desttype = getch(); desttype = getch();
3f62: 22 d0 rcall .+68 ; 0x3fa8 <getch> 3f40: 22 d0 rcall .+68 ; 0x3f86 <getch>
verifySpace(); verifySpace();
3f64: 33 d0 rcall .+102 ; 0x3fcc <verifySpace> 3f42: 33 d0 rcall .+102 ; 0x3faa <verifySpace>
3f66: 85 01 movw r16, r10 3f44: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
3f68: f8 01 movw r30, r16 3f46: fe 01 movw r30, r28
3f6a: 85 91 lpm r24, Z+ 3f48: 85 91 lpm r24, Z+
3f6c: 8f 01 movw r16, r30 3f4a: ef 01 movw r28, r30
3f6e: 14 d0 rcall .+40 ; 0x3f98 <putch> 3f4c: 14 d0 rcall .+40 ; 0x3f76 <putch>
} while (--length); } while (--length);
3f70: 21 97 sbiw r28, 0x01 ; 1 3f4e: 01 50 subi r16, 0x01 ; 1
3f72: d1 f7 brne .-12 ; 0x3f68 <main+0x168> 3f50: d1 f7 brne .-12 ; 0x3f46 <main+0x146>
3f74: 0e c0 rjmp .+28 ; 0x3f92 <main+0x192> 3f52: 0e c0 rjmp .+28 ; 0x3f70 <main+0x170>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
3f76: 85 37 cpi r24, 0x75 ; 117 3f54: 85 37 cpi r24, 0x75 ; 117
3f78: 39 f4 brne .+14 ; 0x3f88 <main+0x188> 3f56: 39 f4 brne .+14 ; 0x3f66 <main+0x166>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
3f7a: 28 d0 rcall .+80 ; 0x3fcc <verifySpace> 3f58: 28 d0 rcall .+80 ; 0x3faa <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
3f7c: 8e e1 ldi r24, 0x1E ; 30 3f5a: 8e e1 ldi r24, 0x1E ; 30
3f7e: 0c d0 rcall .+24 ; 0x3f98 <putch> 3f5c: 0c d0 rcall .+24 ; 0x3f76 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
3f80: 84 e9 ldi r24, 0x94 ; 148 3f5e: 84 e9 ldi r24, 0x94 ; 148
3f82: 0a d0 rcall .+20 ; 0x3f98 <putch> 3f60: 0a d0 rcall .+20 ; 0x3f76 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
3f84: 86 e0 ldi r24, 0x06 ; 6 3f62: 86 e0 ldi r24, 0x06 ; 6
3f86: 7d cf rjmp .-262 ; 0x3e82 <main+0x82> 3f64: 8e cf rjmp .-228 ; 0x3e82 <main+0x82>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f88: 81 35 cpi r24, 0x51 ; 81 3f66: 81 35 cpi r24, 0x51 ; 81
3f8a: 11 f4 brne .+4 ; 0x3f90 <main+0x190> 3f68: 11 f4 brne .+4 ; 0x3f6e <main+0x16e>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
3f8c: 88 e0 ldi r24, 0x08 ; 8 3f6a: 88 e0 ldi r24, 0x08 ; 8
3f8e: 18 d0 rcall .+48 ; 0x3fc0 <watchdogConfig> 3f6c: 18 d0 rcall .+48 ; 0x3f9e <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
3f90: 1d d0 rcall .+58 ; 0x3fcc <verifySpace> 3f6e: 1d d0 rcall .+58 ; 0x3faa <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
3f92: 80 e1 ldi r24, 0x10 ; 16 3f70: 80 e1 ldi r24, 0x10 ; 16
3f94: 01 d0 rcall .+2 ; 0x3f98 <putch> 3f72: 01 d0 rcall .+2 ; 0x3f76 <putch>
3f96: 67 cf rjmp .-306 ; 0x3e66 <main+0x66> 3f74: 78 cf rjmp .-272 ; 0x3e66 <main+0x66>
00003f98 <putch>: 00003f76 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
3f98: 98 2f mov r25, r24 3f76: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
3f9a: 80 91 c0 00 lds r24, 0x00C0 3f78: 80 91 c0 00 lds r24, 0x00C0
3f9e: 85 ff sbrs r24, 5 3f7c: 85 ff sbrs r24, 5
3fa0: fc cf rjmp .-8 ; 0x3f9a <putch+0x2> 3f7e: fc cf rjmp .-8 ; 0x3f78 <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
3fa2: 90 93 c6 00 sts 0x00C6, r25 3f80: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
3fa6: 08 95 ret 3f84: 08 95 ret
00003fa8 <getch>: 00003f86 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
3fa8: 80 91 c0 00 lds r24, 0x00C0 3f86: 80 91 c0 00 lds r24, 0x00C0
3fac: 87 ff sbrs r24, 7 3f8a: 87 ff sbrs r24, 7
3fae: fc cf rjmp .-8 ; 0x3fa8 <getch> 3f8c: fc cf rjmp .-8 ; 0x3f86 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
3fb0: 80 91 c0 00 lds r24, 0x00C0 3f8e: 80 91 c0 00 lds r24, 0x00C0
3fb4: 84 fd sbrc r24, 4 3f92: 84 fd sbrc r24, 4
3fb6: 01 c0 rjmp .+2 ; 0x3fba <getch+0x12> 3f94: 01 c0 rjmp .+2 ; 0x3f98 <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
3fb8: a8 95 wdr 3f96: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
3fba: 80 91 c6 00 lds r24, 0x00C6 3f98: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
3fbe: 08 95 ret 3f9c: 08 95 ret
00003fc0 <watchdogConfig>: 00003f9e <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
3fc0: e0 e6 ldi r30, 0x60 ; 96 3f9e: e0 e6 ldi r30, 0x60 ; 96
3fc2: f0 e0 ldi r31, 0x00 ; 0 3fa0: f0 e0 ldi r31, 0x00 ; 0
3fc4: 98 e1 ldi r25, 0x18 ; 24 3fa2: 98 e1 ldi r25, 0x18 ; 24
3fc6: 90 83 st Z, r25 3fa4: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
3fc8: 80 83 st Z, r24 3fa6: 80 83 st Z, r24
} }
3fca: 08 95 ret 3fa8: 08 95 ret
00003fcc <verifySpace>: 00003faa <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
3fcc: ed df rcall .-38 ; 0x3fa8 <getch> 3faa: ed df rcall .-38 ; 0x3f86 <getch>
3fce: 80 32 cpi r24, 0x20 ; 32 3fac: 80 32 cpi r24, 0x20 ; 32
3fd0: 19 f0 breq .+6 ; 0x3fd8 <verifySpace+0xc> 3fae: 19 f0 breq .+6 ; 0x3fb6 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3fd2: 88 e0 ldi r24, 0x08 ; 8 3fb0: 88 e0 ldi r24, 0x08 ; 8
3fd4: f5 df rcall .-22 ; 0x3fc0 <watchdogConfig> 3fb2: f5 df rcall .-22 ; 0x3f9e <watchdogConfig>
3fd6: ff cf rjmp .-2 ; 0x3fd6 <verifySpace+0xa> 3fb4: ff cf rjmp .-2 ; 0x3fb4 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
3fd8: 84 e1 ldi r24, 0x14 ; 20 3fb6: 84 e1 ldi r24, 0x14 ; 20
} }
3fda: de cf rjmp .-68 ; 0x3f98 <putch> 3fb8: de cf rjmp .-68 ; 0x3f76 <putch>
00003fdc <getNch>: 00003fba <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
3fdc: 1f 93 push r17 3fba: 1f 93 push r17
3fde: 18 2f mov r17, r24 3fbc: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
3fe0: e3 df rcall .-58 ; 0x3fa8 <getch> 3fbe: e3 df rcall .-58 ; 0x3f86 <getch>
3fe2: 11 50 subi r17, 0x01 ; 1 3fc0: 11 50 subi r17, 0x01 ; 1
3fe4: e9 f7 brne .-6 ; 0x3fe0 <getNch+0x4> 3fc2: e9 f7 brne .-6 ; 0x3fbe <getNch+0x4>
verifySpace(); verifySpace();
3fe6: f2 df rcall .-28 ; 0x3fcc <verifySpace> 3fc4: f2 df rcall .-28 ; 0x3faa <verifySpace>
} }
3fe8: 1f 91 pop r17 3fc6: 1f 91 pop r17
3fea: 08 95 ret 3fc8: 08 95 ret
00003fec <appStart>: 00003fca <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fec: 28 2e mov r2, r24 3fca: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
3fee: 80 e0 ldi r24, 0x00 ; 0 3fcc: 80 e0 ldi r24, 0x00 ; 0
3ff0: e7 df rcall .-50 ; 0x3fc0 <watchdogConfig> 3fce: e7 df rcall .-50 ; 0x3f9e <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
3ff2: ee 27 eor r30, r30 3fd0: ee 27 eor r30, r30
3ff4: ff 27 eor r31, r31 3fd2: ff 27 eor r31, r31
3ff6: 09 94 ijmp 3fd4: 09 94 ijmp

View File

@@ -1,35 +1,33 @@
:103E0000112494B714BE892F8D7011F0892FEED034 :103E0000112494B714BE892F8D7011F0892FDDD045
:103E100085E08093810082E08093C00088E18093F8 :103E100085E08093810082E08093C00088E18093F8
:103E2000C10086E08093C20088E08093C4008EE0E9 :103E2000C10086E08093C20088E08093C4008EE0E9
:103E3000C7D0259A86E028E13EEF91E030938500D7 :103E3000B6D0259A86E028E13EEF91E030938500E8
:103E40002093840096BBB09BFECF1D9AA89581500D :103E40002093840096BBB09BFECF1D9AA89581500D
:103E5000A9F7AA24BB2433E0832E7724739425E0AA :103E5000A9F7EE24FF24B3E0AB2EBB24B394A5E076
:103E6000922E91E1C92EA0D0813469F49DD0182FF3 :103E6000DA2EF1E1CF2E8FD0813469F48CD0082F77
:103E7000ADD0123811F481E004C0113809F482C0C9 :103E70009CD0023811F482E004C0013809F471C00A
:103E800083E08AD086C0823411F484E103C0853493 :103E800083E079D075C0823411F484E103C08534B5
:103E900019F485E0A3D07DC0853579F485D0E82E6E :103E900019F485E092D06CC0853579F474D0E82EA1
:103EA000FF2482D0082F10E0102F00270E291F2991 :103EA000FF2471D0082F10E0102F00270E291F29A2
:103EB000000F111F8BD058016CC0863521F484E0AF :103EB000000F111F7AD078015BC0863521F484E0B1
:103EC0008DD080E0DECF843609F041C06DD090E027 :103EC0007CD080E0DECF843609F035C05CD05BD09A
:103ED000182F002769D090E0082B192B65D0D82E19 :103ED000182F59D0082FC0E0D1E055D089931C1776
:103EE000E801E12CF1E0FF2E5FD0F70181937F0123 :103EE000E1F763D0053409F4FFCFF701A7BEE895E9
:103EF0002197D1F76BD0F5E4DF1609F4FFCFF50178 :103EF00007B600FCFDCFA701A0E0B1E02C9130E0B7
:103F000087BEE89507B600FCFDCFB501A801A0E08B :103F000011968C91119790E0982F8827822B932BF4
:103F1000B1E02C9130E011968C91119790E0982FA0 :103F10001296FA010C01B7BEE89511244E5F5F4F6F
:103F20008827822B932B1296FB010C0177BEE89514 :103F20001A1761F7F701D7BEE89507B600FCFDCF79
:103F300011246E5F7F4F4250504059F7F50197BEF4 :103F3000C7BEE8951DC0843769F425D024D0082F6A
:103F4000E89507B600FCFDCFC7BEE89522C08437D0 :103F400022D033D0E701FE018591EF0114D001505A
:103F500091F42AD090E0D82FCC2726D090E0C82B1F :103F5000D1F70EC0853739F428D08EE10CD084E932
:103F6000D92B22D033D08501F80185918F0114D04F :103F60000AD086E08ECF813511F488E018D01DD0BC
:103F70002197D1F70EC0853739F428D08EE10CD0C7 :103F700080E101D078CF982F8091C00085FFFCCFE1
:103F800084E90AD086E07DCF813511F488E018D02D :103F80009093C60008958091C00087FFFCCF809178
:103F90001DD080E101D067CF982F8091C00085FFB0 :103F9000C00084FD01C0A8958091C6000895E0E6A8
:103FA000FCCF9093C60008958091C00087FFFCCF9E :103FA000F0E098E1908380830895EDDF803219F08E
:103FB0008091C00084FD01C0A8958091C60008953D :103FB00088E0F5DFFFCF84E1DECF1F93182FE3DF2A
:103FC000E0E6F0E098E1908380830895EDDF8032B1 :103FC0001150E9F7F2DF1F910895282E80E0E7DF16
:103FD00019F088E0F5DFFFCF84E1DECF1F93182FC3 :063FD000EE27FF27099413
:103FE000E3DF1150E9F7F2DF1F910895282E80E0FA :023FFE000206B9
:083FF000E7DFEE27FF2709942B
:023FFE000106BA
:0400000300003E00BB :0400000300003E00BB
:00000001FF :00000001FF

View File

@@ -3,27 +3,27 @@ optiboot_atmega168.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 000001f8 00003e00 00003e00 00000074 2**1 0 .text 000001d6 00003e00 00003e00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00003ffe 00003ffe 0000026c 2**0 1 .version 00000002 00003ffe 00003ffe 0000024a 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .debug_aranges 00000028 00000000 00000000 0000026e 2**0 2 .debug_aranges 00000028 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 00000074 00000000 00000000 00000296 2**0 3 .debug_pubnames 00000074 00000000 00000000 00000274 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
4 .debug_info 000003e0 00000000 00000000 0000030a 2**0 4 .debug_info 000003ea 00000000 00000000 000002e8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000001f1 00000000 00000000 000006ea 2**0 5 .debug_abbrev 000001ef 00000000 00000000 000006d2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_line 00000433 00000000 00000000 000008db 2**0 6 .debug_line 00000423 00000000 00000000 000008c1 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000080 00000000 00000000 00000d10 2**2 7 .debug_frame 00000080 00000000 00000000 00000ce4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000172 00000000 00000000 00000d90 2**0 8 .debug_str 0000017c 00000000 00000000 00000d64 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_loc 000002d7 00000000 00000000 00000f02 2**0 9 .debug_loc 00000300 00000000 00000000 00000ee0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_ranges 000000b8 00000000 00000000 000011d9 2**0 10 .debug_ranges 000000b8 00000000 00000000 000011e0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -51,7 +51,7 @@ int main(void) {
3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10> 3e0a: 11 f0 breq .+4 ; 0x3e10 <main+0x10>
appStart(ch); appStart(ch);
3e0c: 89 2f mov r24, r25 3e0c: 89 2f mov r24, r25
3e0e: ee d0 rcall .+476 ; 0x3fec <appStart> 3e0e: dd d0 rcall .+442 ; 0x3fca <appStart>
#if LED_START_FLASHES > 0 #if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter // Set up Timer 1 for timeout counter
@@ -81,7 +81,7 @@ int main(void) {
// Set up watchdog to trigger after 500ms // Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S); watchdogConfig(WATCHDOG_1S);
3e2e: 8e e0 ldi r24, 0x0E ; 14 3e2e: 8e e0 ldi r24, 0x0E ; 14
3e30: c7 d0 rcall .+398 ; 0x3fc0 <watchdogConfig> 3e30: b6 d0 rcall .+364 ; 0x3f9e <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) #if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
/* Set LED pin as output */ /* Set LED pin as output */
@@ -131,68 +131,68 @@ void watchdogReset() {
} while (--count); } while (--count);
3e4e: 81 50 subi r24, 0x01 ; 1 3e4e: 81 50 subi r24, 0x01 ; 1
3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c> 3e50: a9 f7 brne .-22 ; 0x3e3c <main+0x3c>
3e52: aa 24 eor r10, r10 3e52: ee 24 eor r14, r14
3e54: bb 24 eor r11, r11 3e54: ff 24 eor r15, r15
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3e56: 33 e0 ldi r19, 0x03 ; 3 3e56: b3 e0 ldi r27, 0x03 ; 3
3e58: 83 2e mov r8, r19 3e58: ab 2e mov r10, r27
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3e5a: 77 24 eor r7, r7 3e5a: bb 24 eor r11, r11
3e5c: 73 94 inc r7 3e5c: b3 94 inc r11
} while (len -= 2); } while (len -= 2);
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3e5e: 25 e0 ldi r18, 0x05 ; 5 3e5e: a5 e0 ldi r26, 0x05 ; 5
3e60: 92 2e mov r9, r18 3e60: da 2e mov r13, r26
boot_spm_busy_wait(); boot_spm_busy_wait();
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3e62: 91 e1 ldi r25, 0x11 ; 17 3e62: f1 e1 ldi r31, 0x11 ; 17
3e64: c9 2e mov r12, r25 3e64: cf 2e mov r12, r31
#endif #endif
/* Forever loop: exits by causing WDT reset */ /* Forever loop: exits by causing WDT reset */
for (;;) { for (;;) {
/* get character from UART */ /* get character from UART */
ch = getch(); ch = getch();
3e66: a0 d0 rcall .+320 ; 0x3fa8 <getch> 3e66: 8f d0 rcall .+286 ; 0x3f86 <getch>
if(ch == STK_GET_PARAMETER) { if(ch == STK_GET_PARAMETER) {
3e68: 81 34 cpi r24, 0x41 ; 65 3e68: 81 34 cpi r24, 0x41 ; 65
3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86> 3e6a: 69 f4 brne .+26 ; 0x3e86 <main+0x86>
unsigned char which = getch(); unsigned char which = getch();
3e6c: 9d d0 rcall .+314 ; 0x3fa8 <getch> 3e6c: 8c d0 rcall .+280 ; 0x3f86 <getch>
3e6e: 18 2f mov r17, r24 3e6e: 08 2f mov r16, r24
verifySpace(); verifySpace();
3e70: ad d0 rcall .+346 ; 0x3fcc <verifySpace> 3e70: 9c d0 rcall .+312 ; 0x3faa <verifySpace>
/* /*
* Send optiboot version as "SW version" * Send optiboot version as "SW version"
* Note that the references to memory are optimized away. * Note that the references to memory are optimized away.
*/ */
if (which == 0x82) { if (which == 0x82) {
3e72: 12 38 cpi r17, 0x82 ; 130 3e72: 02 38 cpi r16, 0x82 ; 130
3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a> 3e74: 11 f4 brne .+4 ; 0x3e7a <main+0x7a>
putch(optiboot_version & 0xFF); putch(optiboot_version & 0xFF);
3e76: 81 e0 ldi r24, 0x01 ; 1 3e76: 82 e0 ldi r24, 0x02 ; 2
3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82> 3e78: 04 c0 rjmp .+8 ; 0x3e82 <main+0x82>
} else if (which == 0x81) { } else if (which == 0x81) {
3e7a: 11 38 cpi r17, 0x81 ; 129 3e7a: 01 38 cpi r16, 0x81 ; 129
3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80> 3e7c: 09 f4 brne .+2 ; 0x3e80 <main+0x80>
3e7e: 82 c0 rjmp .+260 ; 0x3f84 <main+0x184> 3e7e: 71 c0 rjmp .+226 ; 0x3f62 <main+0x162>
} else { } else {
/* /*
* GET PARAMETER returns a generic 0x03 reply for * GET PARAMETER returns a generic 0x03 reply for
@@ -200,8 +200,8 @@ void watchdogReset() {
*/ */
putch(0x03); putch(0x03);
3e80: 83 e0 ldi r24, 0x03 ; 3 3e80: 83 e0 ldi r24, 0x03 ; 3
3e82: 8a d0 rcall .+276 ; 0x3f98 <putch> 3e82: 79 d0 rcall .+242 ; 0x3f76 <putch>
3e84: 86 c0 rjmp .+268 ; 0x3f92 <main+0x192> 3e84: 75 c0 rjmp .+234 ; 0x3f70 <main+0x170>
} }
} }
else if(ch == STK_SET_DEVICE) { else if(ch == STK_SET_DEVICE) {
@@ -218,8 +218,8 @@ void watchdogReset() {
// SET DEVICE EXT is ignored // SET DEVICE EXT is ignored
getNch(5); getNch(5);
3e92: 85 e0 ldi r24, 0x05 ; 5 3e92: 85 e0 ldi r24, 0x05 ; 5
3e94: a3 d0 rcall .+326 ; 0x3fdc <getNch> 3e94: 92 d0 rcall .+292 ; 0x3fba <getNch>
3e96: 7d c0 rjmp .+250 ; 0x3f92 <main+0x192> 3e96: 6c c0 rjmp .+216 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_LOAD_ADDRESS) { else if(ch == STK_LOAD_ADDRESS) {
3e98: 85 35 cpi r24, 0x55 ; 85 3e98: 85 35 cpi r24, 0x55 ; 85
@@ -227,11 +227,11 @@ void watchdogReset() {
// LOAD ADDRESS // LOAD ADDRESS
uint16_t newAddress; uint16_t newAddress;
newAddress = getch(); newAddress = getch();
3e9c: 85 d0 rcall .+266 ; 0x3fa8 <getch> 3e9c: 74 d0 rcall .+232 ; 0x3f86 <getch>
newAddress = (newAddress & 0xff) | (getch() << 8); newAddress = (newAddress & 0xff) | (getch() << 8);
3e9e: e8 2e mov r14, r24 3e9e: e8 2e mov r14, r24
3ea0: ff 24 eor r15, r15 3ea0: ff 24 eor r15, r15
3ea2: 82 d0 rcall .+260 ; 0x3fa8 <getch> 3ea2: 71 d0 rcall .+226 ; 0x3f86 <getch>
3ea4: 08 2f mov r16, r24 3ea4: 08 2f mov r16, r24
3ea6: 10 e0 ldi r17, 0x00 ; 0 3ea6: 10 e0 ldi r17, 0x00 ; 0
3ea8: 10 2f mov r17, r16 3ea8: 10 2f mov r17, r16
@@ -247,9 +247,9 @@ void watchdogReset() {
3eb2: 11 1f adc r17, r17 3eb2: 11 1f adc r17, r17
address = newAddress; address = newAddress;
verifySpace(); verifySpace();
3eb4: 8b d0 rcall .+278 ; 0x3fcc <verifySpace> 3eb4: 7a d0 rcall .+244 ; 0x3faa <verifySpace>
3eb6: 58 01 movw r10, r16 3eb6: 78 01 movw r14, r16
3eb8: 6c c0 rjmp .+216 ; 0x3f92 <main+0x192> 3eb8: 5b c0 rjmp .+182 ; 0x3f70 <main+0x170>
} }
else if(ch == STK_UNIVERSAL) { else if(ch == STK_UNIVERSAL) {
3eba: 86 35 cpi r24, 0x56 ; 86 3eba: 86 35 cpi r24, 0x56 ; 86
@@ -257,7 +257,7 @@ void watchdogReset() {
// UNIVERSAL command is ignored // UNIVERSAL command is ignored
getNch(4); getNch(4);
3ebe: 84 e0 ldi r24, 0x04 ; 4 3ebe: 84 e0 ldi r24, 0x04 ; 4
3ec0: 8d d0 rcall .+282 ; 0x3fdc <getNch> 3ec0: 7c d0 rcall .+248 ; 0x3fba <getNch>
putch(0x00); putch(0x00);
3ec2: 80 e0 ldi r24, 0x00 ; 0 3ec2: 80 e0 ldi r24, 0x00 ; 0
3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82> 3ec4: de cf rjmp .-68 ; 0x3e82 <main+0x82>
@@ -266,339 +266,321 @@ void watchdogReset() {
else if(ch == STK_PROG_PAGE) { else if(ch == STK_PROG_PAGE) {
3ec6: 84 36 cpi r24, 0x64 ; 100 3ec6: 84 36 cpi r24, 0x64 ; 100
3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc> 3ec8: 09 f0 breq .+2 ; 0x3ecc <main+0xcc>
3eca: 41 c0 rjmp .+130 ; 0x3f4e <main+0x14e> 3eca: 35 c0 rjmp .+106 ; 0x3f36 <main+0x136>
// PROGRAM PAGE - we support flash programming only, not EEPROM // PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype; uint8_t desttype;
uint8_t *bufPtr; uint8_t *bufPtr;
uint16_t savelength; pagelen_t savelength;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3ecc: 6d d0 rcall .+218 ; 0x3fa8 <getch> 3ecc: 5c d0 rcall .+184 ; 0x3f86 <getch>
3ece: 90 e0 ldi r25, 0x00 ; 0 3ece: 5b d0 rcall .+182 ; 0x3f86 <getch>
3ed0: 18 2f mov r17, r24 3ed0: 18 2f mov r17, r24
3ed2: 00 27 eor r16, r16
length |= getch();
3ed4: 69 d0 rcall .+210 ; 0x3fa8 <getch>
3ed6: 90 e0 ldi r25, 0x00 ; 0
3ed8: 08 2b or r16, r24
3eda: 19 2b or r17, r25
savelength = length; savelength = length;
desttype = getch(); desttype = getch();
3edc: 65 d0 rcall .+202 ; 0x3fa8 <getch> 3ed2: 59 d0 rcall .+178 ; 0x3f86 <getch>
3ede: d8 2e mov r13, r24 3ed4: 08 2f mov r16, r24
3ee0: e8 01 movw r28, r16 3ed6: c0 e0 ldi r28, 0x00 ; 0
3ee2: e1 2c mov r14, r1 3ed8: d1 e0 ldi r29, 0x01 ; 1
3ee4: f1 e0 ldi r31, 0x01 ; 1
3ee6: ff 2e mov r15, r31
// read a page worth of contents // read a page worth of contents
bufPtr = buff; bufPtr = buff;
do *bufPtr++ = getch(); do *bufPtr++ = getch();
3ee8: 5f d0 rcall .+190 ; 0x3fa8 <getch> 3eda: 55 d0 rcall .+170 ; 0x3f86 <getch>
3eea: f7 01 movw r30, r14 3edc: 89 93 st Y+, r24
3eec: 81 93 st Z+, r24
3eee: 7f 01 movw r14, r30
while (--length); while (--length);
3ef0: 21 97 sbiw r28, 0x01 ; 1 3ede: 1c 17 cp r17, r28
3ef2: d1 f7 brne .-12 ; 0x3ee8 <main+0xe8> 3ee0: e1 f7 brne .-8 ; 0x3eda <main+0xda>
// Read command terminator, start reply // Read command terminator, start reply
verifySpace(); verifySpace();
3ef4: 6b d0 rcall .+214 ; 0x3fcc <verifySpace> 3ee2: 63 d0 rcall .+198 ; 0x3faa <verifySpace>
* void writebuffer(memtype, buffer, address, length) * void writebuffer(memtype, buffer, address, length)
*/ */
static inline void writebuffer(int8_t memtype, uint8_t *mybuff, static inline void writebuffer(int8_t memtype, uint8_t *mybuff,
uint16_t address, uint16_t len) uint16_t address, pagelen_t len)
{ {
switch (memtype) { switch (memtype) {
3ef6: f5 e4 ldi r31, 0x45 ; 69 3ee4: 05 34 cpi r16, 0x45 ; 69
3ef8: df 16 cp r13, r31 3ee6: 09 f4 brne .+2 ; 0x3eea <main+0xea>
3efa: 09 f4 brne .+2 ; 0x3efe <main+0xfe> 3ee8: ff cf rjmp .-2 ; 0x3ee8 <main+0xe8>
3efc: ff cf rjmp .-2 ; 0x3efc <main+0xfc>
* Start the page erase and wait for it to finish. There * Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over * used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight, * the serial link, but the performance improvement was slight,
* and we needed the space back. * and we needed the space back.
*/ */
__boot_page_erase_short((uint16_t)(void*)address); __boot_page_erase_short((uint16_t)(void*)address);
3efe: f5 01 movw r30, r10 3eea: f7 01 movw r30, r14
3f00: 87 be out 0x37, r8 ; 55 3eec: a7 be out 0x37, r10 ; 55
3f02: e8 95 spm 3eee: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f04: 07 b6 in r0, 0x37 ; 55 3ef0: 07 b6 in r0, 0x37 ; 55
3f06: 00 fc sbrc r0, 0 3ef2: 00 fc sbrc r0, 0
3f08: fd cf rjmp .-6 ; 0x3f04 <main+0x104> 3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3f0a: b5 01 movw r22, r10 3ef6: a7 01 movw r20, r14
3f0c: a8 01 movw r20, r16 3ef8: a0 e0 ldi r26, 0x00 ; 0
3f0e: a0 e0 ldi r26, 0x00 ; 0 3efa: b1 e0 ldi r27, 0x01 ; 1
3f10: b1 e0 ldi r27, 0x01 ; 1
/* /*
* Copy data from the buffer into the flash write buffer. * Copy data from the buffer into the flash write buffer.
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
3f12: 2c 91 ld r18, X 3efc: 2c 91 ld r18, X
3f14: 30 e0 ldi r19, 0x00 ; 0 3efe: 30 e0 ldi r19, 0x00 ; 0
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
3f16: 11 96 adiw r26, 0x01 ; 1 3f00: 11 96 adiw r26, 0x01 ; 1
3f18: 8c 91 ld r24, X 3f02: 8c 91 ld r24, X
3f1a: 11 97 sbiw r26, 0x01 ; 1 3f04: 11 97 sbiw r26, 0x01 ; 1
3f1c: 90 e0 ldi r25, 0x00 ; 0 3f06: 90 e0 ldi r25, 0x00 ; 0
3f1e: 98 2f mov r25, r24 3f08: 98 2f mov r25, r24
3f20: 88 27 eor r24, r24 3f0a: 88 27 eor r24, r24
3f22: 82 2b or r24, r18 3f0c: 82 2b or r24, r18
3f24: 93 2b or r25, r19 3f0e: 93 2b or r25, r19
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) #define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
#endif #endif
/* main program starts here */ /* main program starts here */
int main(void) { int main(void) {
3f26: 12 96 adiw r26, 0x02 ; 2 3f10: 12 96 adiw r26, 0x02 ; 2
*/ */
do { do {
uint16_t a; uint16_t a;
a = *bufPtr++; a = *bufPtr++;
a |= (*bufPtr++) << 8; a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a); __boot_page_fill_short((uint16_t)(void*)addrPtr,a);
3f28: fb 01 movw r30, r22 3f12: fa 01 movw r30, r20
3f2a: 0c 01 movw r0, r24 3f14: 0c 01 movw r0, r24
3f2c: 77 be out 0x37, r7 ; 55 3f16: b7 be out 0x37, r11 ; 55
3f2e: e8 95 spm 3f18: e8 95 spm
3f30: 11 24 eor r1, r1 3f1a: 11 24 eor r1, r1
addrPtr += 2; addrPtr += 2;
3f32: 6e 5f subi r22, 0xFE ; 254 3f1c: 4e 5f subi r20, 0xFE ; 254
3f34: 7f 4f sbci r23, 0xFF ; 255 3f1e: 5f 4f sbci r21, 0xFF ; 255
} while (len -= 2); } while (len -= 2);
3f36: 42 50 subi r20, 0x02 ; 2 3f20: 1a 17 cp r17, r26
3f38: 50 40 sbci r21, 0x00 ; 0 3f22: 61 f7 brne .-40 ; 0x3efc <main+0xfc>
3f3a: 59 f7 brne .-42 ; 0x3f12 <main+0x112>
/* /*
* Actually Write the buffer to flash (and wait for it to finish.) * Actually Write the buffer to flash (and wait for it to finish.)
*/ */
__boot_page_write_short((uint16_t)(void*)address); __boot_page_write_short((uint16_t)(void*)address);
3f3c: f5 01 movw r30, r10 3f24: f7 01 movw r30, r14
3f3e: 97 be out 0x37, r9 ; 55 3f26: d7 be out 0x37, r13 ; 55
3f40: e8 95 spm 3f28: e8 95 spm
boot_spm_busy_wait(); boot_spm_busy_wait();
3f42: 07 b6 in r0, 0x37 ; 55 3f2a: 07 b6 in r0, 0x37 ; 55
3f44: 00 fc sbrc r0, 0 3f2c: 00 fc sbrc r0, 0
3f46: fd cf rjmp .-6 ; 0x3f42 <main+0x142> 3f2e: fd cf rjmp .-6 ; 0x3f2a <main+0x12a>
#if defined(RWWSRE) #if defined(RWWSRE)
// Reenable read access to flash // Reenable read access to flash
boot_rww_enable(); boot_rww_enable();
3f48: c7 be out 0x37, r12 ; 55 3f30: c7 be out 0x37, r12 ; 55
3f4a: e8 95 spm 3f32: e8 95 spm
3f4c: 22 c0 rjmp .+68 ; 0x3f92 <main+0x192> 3f34: 1d c0 rjmp .+58 ; 0x3f70 <main+0x170>
writebuffer(desttype, buff, address, savelength); writebuffer(desttype, buff, address, savelength);
} }
/* Read memory block mode, length is big endian. */ /* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) { else if(ch == STK_READ_PAGE) {
3f4e: 84 37 cpi r24, 0x74 ; 116 3f36: 84 37 cpi r24, 0x74 ; 116
3f50: 91 f4 brne .+36 ; 0x3f76 <main+0x176> 3f38: 69 f4 brne .+26 ; 0x3f54 <main+0x154>
uint8_t desttype; uint8_t desttype;
length = getch()<<8; /* getlen() */ GETLENGTH(length);
3f52: 2a d0 rcall .+84 ; 0x3fa8 <getch> 3f3a: 25 d0 rcall .+74 ; 0x3f86 <getch>
3f54: 90 e0 ldi r25, 0x00 ; 0 3f3c: 24 d0 rcall .+72 ; 0x3f86 <getch>
3f56: d8 2f mov r29, r24 3f3e: 08 2f mov r16, r24
3f58: cc 27 eor r28, r28
length |= getch();
3f5a: 26 d0 rcall .+76 ; 0x3fa8 <getch>
3f5c: 90 e0 ldi r25, 0x00 ; 0
3f5e: c8 2b or r28, r24
3f60: d9 2b or r29, r25
desttype = getch(); desttype = getch();
3f62: 22 d0 rcall .+68 ; 0x3fa8 <getch> 3f40: 22 d0 rcall .+68 ; 0x3f86 <getch>
verifySpace(); verifySpace();
3f64: 33 d0 rcall .+102 ; 0x3fcc <verifySpace> 3f42: 33 d0 rcall .+102 ; 0x3faa <verifySpace>
3f66: 85 01 movw r16, r10 3f44: e7 01 movw r28, r14
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#else #else
// read a Flash byte and increment the address // read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address)); __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
#endif #endif
putch(ch); putch(ch);
3f68: f8 01 movw r30, r16 3f46: fe 01 movw r30, r28
3f6a: 85 91 lpm r24, Z+ 3f48: 85 91 lpm r24, Z+
3f6c: 8f 01 movw r16, r30 3f4a: ef 01 movw r28, r30
3f6e: 14 d0 rcall .+40 ; 0x3f98 <putch> 3f4c: 14 d0 rcall .+40 ; 0x3f76 <putch>
} while (--length); } while (--length);
3f70: 21 97 sbiw r28, 0x01 ; 1 3f4e: 01 50 subi r16, 0x01 ; 1
3f72: d1 f7 brne .-12 ; 0x3f68 <main+0x168> 3f50: d1 f7 brne .-12 ; 0x3f46 <main+0x146>
3f74: 0e c0 rjmp .+28 ; 0x3f92 <main+0x192> 3f52: 0e c0 rjmp .+28 ; 0x3f70 <main+0x170>
read_mem(desttype, address, length); read_mem(desttype, address, length);
} }
/* Get device signature bytes */ /* Get device signature bytes */
else if(ch == STK_READ_SIGN) { else if(ch == STK_READ_SIGN) {
3f76: 85 37 cpi r24, 0x75 ; 117 3f54: 85 37 cpi r24, 0x75 ; 117
3f78: 39 f4 brne .+14 ; 0x3f88 <main+0x188> 3f56: 39 f4 brne .+14 ; 0x3f66 <main+0x166>
// READ SIGN - return what Avrdude wants to hear // READ SIGN - return what Avrdude wants to hear
verifySpace(); verifySpace();
3f7a: 28 d0 rcall .+80 ; 0x3fcc <verifySpace> 3f58: 28 d0 rcall .+80 ; 0x3faa <verifySpace>
putch(SIGNATURE_0); putch(SIGNATURE_0);
3f7c: 8e e1 ldi r24, 0x1E ; 30 3f5a: 8e e1 ldi r24, 0x1E ; 30
3f7e: 0c d0 rcall .+24 ; 0x3f98 <putch> 3f5c: 0c d0 rcall .+24 ; 0x3f76 <putch>
putch(SIGNATURE_1); putch(SIGNATURE_1);
3f80: 84 e9 ldi r24, 0x94 ; 148 3f5e: 84 e9 ldi r24, 0x94 ; 148
3f82: 0a d0 rcall .+20 ; 0x3f98 <putch> 3f60: 0a d0 rcall .+20 ; 0x3f76 <putch>
putch(SIGNATURE_2); putch(SIGNATURE_2);
3f84: 86 e0 ldi r24, 0x06 ; 6 3f62: 86 e0 ldi r24, 0x06 ; 6
3f86: 7d cf rjmp .-262 ; 0x3e82 <main+0x82> 3f64: 8e cf rjmp .-228 ; 0x3e82 <main+0x82>
} }
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f88: 81 35 cpi r24, 0x51 ; 81 3f66: 81 35 cpi r24, 0x51 ; 81
3f8a: 11 f4 brne .+4 ; 0x3f90 <main+0x190> 3f68: 11 f4 brne .+4 ; 0x3f6e <main+0x16e>
// Adaboot no-wait mod // Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS); watchdogConfig(WATCHDOG_16MS);
3f8c: 88 e0 ldi r24, 0x08 ; 8 3f6a: 88 e0 ldi r24, 0x08 ; 8
3f8e: 18 d0 rcall .+48 ; 0x3fc0 <watchdogConfig> 3f6c: 18 d0 rcall .+48 ; 0x3f9e <watchdogConfig>
verifySpace(); verifySpace();
} }
else { else {
// This covers the response to commands like STK_ENTER_PROGMODE // This covers the response to commands like STK_ENTER_PROGMODE
verifySpace(); verifySpace();
3f90: 1d d0 rcall .+58 ; 0x3fcc <verifySpace> 3f6e: 1d d0 rcall .+58 ; 0x3faa <verifySpace>
} }
putch(STK_OK); putch(STK_OK);
3f92: 80 e1 ldi r24, 0x10 ; 16 3f70: 80 e1 ldi r24, 0x10 ; 16
3f94: 01 d0 rcall .+2 ; 0x3f98 <putch> 3f72: 01 d0 rcall .+2 ; 0x3f76 <putch>
3f96: 67 cf rjmp .-306 ; 0x3e66 <main+0x66> 3f74: 78 cf rjmp .-272 ; 0x3e66 <main+0x66>
00003f98 <putch>: 00003f76 <putch>:
} }
} }
void putch(char ch) { void putch(char ch) {
3f98: 98 2f mov r25, r24 3f76: 98 2f mov r25, r24
#ifndef SOFT_UART #ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0))); while (!(UART_SRA & _BV(UDRE0)));
3f9a: 80 91 c0 00 lds r24, 0x00C0 3f78: 80 91 c0 00 lds r24, 0x00C0
3f9e: 85 ff sbrs r24, 5 3f7c: 85 ff sbrs r24, 5
3fa0: fc cf rjmp .-8 ; 0x3f9a <putch+0x2> 3f7e: fc cf rjmp .-8 ; 0x3f78 <putch+0x2>
UART_UDR = ch; UART_UDR = ch;
3fa2: 90 93 c6 00 sts 0x00C6, r25 3f80: 90 93 c6 00 sts 0x00C6, r25
[uartBit] "I" (UART_TX_BIT) [uartBit] "I" (UART_TX_BIT)
: :
"r25" "r25"
); );
#endif #endif
} }
3fa6: 08 95 ret 3f84: 08 95 ret
00003fa8 <getch>: 00003f86 <getch>:
[uartBit] "I" (UART_RX_BIT) [uartBit] "I" (UART_RX_BIT)
: :
"r25" "r25"
); );
#else #else
while(!(UART_SRA & _BV(RXC0))) while(!(UART_SRA & _BV(RXC0)))
3fa8: 80 91 c0 00 lds r24, 0x00C0 3f86: 80 91 c0 00 lds r24, 0x00C0
3fac: 87 ff sbrs r24, 7 3f8a: 87 ff sbrs r24, 7
3fae: fc cf rjmp .-8 ; 0x3fa8 <getch> 3f8c: fc cf rjmp .-8 ; 0x3f86 <getch>
; ;
if (!(UART_SRA & _BV(FE0))) { if (!(UART_SRA & _BV(FE0))) {
3fb0: 80 91 c0 00 lds r24, 0x00C0 3f8e: 80 91 c0 00 lds r24, 0x00C0
3fb4: 84 fd sbrc r24, 4 3f92: 84 fd sbrc r24, 4
3fb6: 01 c0 rjmp .+2 ; 0x3fba <getch+0x12> 3f94: 01 c0 rjmp .+2 ; 0x3f98 <getch+0x12>
} }
#endif #endif
// Watchdog functions. These are only safe with interrupts turned off. // Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() { void watchdogReset() {
__asm__ __volatile__ ( __asm__ __volatile__ (
3fb8: a8 95 wdr 3f96: a8 95 wdr
* don't care that an invalid char is returned...) * don't care that an invalid char is returned...)
*/ */
watchdogReset(); watchdogReset();
} }
ch = UART_UDR; ch = UART_UDR;
3fba: 80 91 c6 00 lds r24, 0x00C6 3f98: 80 91 c6 00 lds r24, 0x00C6
LED_PIN |= _BV(LED); LED_PIN |= _BV(LED);
#endif #endif
#endif #endif
return ch; return ch;
} }
3fbe: 08 95 ret 3f9c: 08 95 ret
00003fc0 <watchdogConfig>: 00003f9e <watchdogConfig>:
"wdr\n" "wdr\n"
); );
} }
void watchdogConfig(uint8_t x) { void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = _BV(WDCE) | _BV(WDE);
3fc0: e0 e6 ldi r30, 0x60 ; 96 3f9e: e0 e6 ldi r30, 0x60 ; 96
3fc2: f0 e0 ldi r31, 0x00 ; 0 3fa0: f0 e0 ldi r31, 0x00 ; 0
3fc4: 98 e1 ldi r25, 0x18 ; 24 3fa2: 98 e1 ldi r25, 0x18 ; 24
3fc6: 90 83 st Z, r25 3fa4: 90 83 st Z, r25
WDTCSR = x; WDTCSR = x;
3fc8: 80 83 st Z, r24 3fa6: 80 83 st Z, r24
} }
3fca: 08 95 ret 3fa8: 08 95 ret
00003fcc <verifySpace>: 00003faa <verifySpace>:
do getch(); while (--count); do getch(); while (--count);
verifySpace(); verifySpace();
} }
void verifySpace() { void verifySpace() {
if (getch() != CRC_EOP) { if (getch() != CRC_EOP) {
3fcc: ed df rcall .-38 ; 0x3fa8 <getch> 3faa: ed df rcall .-38 ; 0x3f86 <getch>
3fce: 80 32 cpi r24, 0x20 ; 32 3fac: 80 32 cpi r24, 0x20 ; 32
3fd0: 19 f0 breq .+6 ; 0x3fd8 <verifySpace+0xc> 3fae: 19 f0 breq .+6 ; 0x3fb6 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3fd2: 88 e0 ldi r24, 0x08 ; 8 3fb0: 88 e0 ldi r24, 0x08 ; 8
3fd4: f5 df rcall .-22 ; 0x3fc0 <watchdogConfig> 3fb2: f5 df rcall .-22 ; 0x3f9e <watchdogConfig>
3fd6: ff cf rjmp .-2 ; 0x3fd6 <verifySpace+0xa> 3fb4: ff cf rjmp .-2 ; 0x3fb4 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes while (1) // and busy-loop so that WD causes
; // a reset and app start. ; // a reset and app start.
} }
putch(STK_INSYNC); putch(STK_INSYNC);
3fd8: 84 e1 ldi r24, 0x14 ; 20 3fb6: 84 e1 ldi r24, 0x14 ; 20
} }
3fda: de cf rjmp .-68 ; 0x3f98 <putch> 3fb8: de cf rjmp .-68 ; 0x3f76 <putch>
00003fdc <getNch>: 00003fba <getNch>:
::[count] "M" (UART_B_VALUE) ::[count] "M" (UART_B_VALUE)
); );
} }
#endif #endif
void getNch(uint8_t count) { void getNch(uint8_t count) {
3fdc: 1f 93 push r17 3fba: 1f 93 push r17
3fde: 18 2f mov r17, r24 3fbc: 18 2f mov r17, r24
do getch(); while (--count); do getch(); while (--count);
3fe0: e3 df rcall .-58 ; 0x3fa8 <getch> 3fbe: e3 df rcall .-58 ; 0x3f86 <getch>
3fe2: 11 50 subi r17, 0x01 ; 1 3fc0: 11 50 subi r17, 0x01 ; 1
3fe4: e9 f7 brne .-6 ; 0x3fe0 <getNch+0x4> 3fc2: e9 f7 brne .-6 ; 0x3fbe <getNch+0x4>
verifySpace(); verifySpace();
3fe6: f2 df rcall .-28 ; 0x3fcc <verifySpace> 3fc4: f2 df rcall .-28 ; 0x3faa <verifySpace>
} }
3fe8: 1f 91 pop r17 3fc6: 1f 91 pop r17
3fea: 08 95 ret 3fc8: 08 95 ret
00003fec <appStart>: 00003fca <appStart>:
void appStart(uint8_t rstFlags) { void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register // save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which // This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable. // executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fec: 28 2e mov r2, r24 3fca: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF); watchdogConfig(WATCHDOG_OFF);
3fee: 80 e0 ldi r24, 0x00 ; 0 3fcc: 80 e0 ldi r24, 0x00 ; 0
3ff0: e7 df rcall .-50 ; 0x3fc0 <watchdogConfig> 3fce: e7 df rcall .-50 ; 0x3f9e <watchdogConfig>
__asm__ __volatile__ ( __asm__ __volatile__ (
3ff2: ee 27 eor r30, r30 3fd0: ee 27 eor r30, r30
3ff4: ff 27 eor r31, r31 3fd2: ff 27 eor r31, r31
3ff6: 09 94 ijmp 3fd4: 09 94 ijmp