Maarten, Many thanks for the excellent response so far. Please bear with the following lengthy explanation....
It _IS_ a small app: the .map file shows all the code:- Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 407A 0CE8 = 3304. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:407A _app_entry 0C:40F7 _main 0C:40FD _Timer_Init 0C:4169 _Timer_Allocate 0C:4228 _Timer_AllocateTimeout 0C:4232 _Timer_Deallocate 0C:4270 _Timer_HasExpired 0C:42D4 _Timer_ISR0Guts 0C:43A9 _Timer_DelayUS 0C:43ED _Timer_DelayMS 0C:4419 _UART_Init 0C:4427 _UART_TxCh 0C:4431 _UART_RxAvailable 0C:4438 _UART_RxCh 0C:448D _UART_RxHexU08 0C:44B1 _UART_RxHexU16 0C:44D4 _UART_TxHexU08 0C:44EE _Console_PollOnce 0C:4673 _strlen 0C:4697 _putchar 0C:469A _HexToDec 0C:46D5 _DecToHex 0C:46F3 ___printf_no_irq 0C:4727 _do_stuff1 0C:473D _do_stuff0 0C:475E _vprintf 0C:4777 _printf 0C:4837 __print_format 0C:4D25 __mulint 0C:4D25 __mulint_dummy 0C:4D42 __gptrget 0C:4D5E __sdcc_external_startup However the .ihx output has inserted a spurious extended address record. <snippet> :0E4EB900616420524F4D2F434F4445206164E9 :0E4EC7006472657373203078585858580A0A80 :014ED50000DC :0E4ED6004F69202D2057617463682077686152 :0E4EE4007420796F7527726520646F696E67A0 :0E4EF200206661742066696E676572730A003F :020000040001F9 ; spurious! :08467300AA82AB83ACF07D00CC ; _strlen not in high segment :0E467B008A828B838CF0124D42FEA3AA82AB82 :0746890083EE60030D80EBDE </snippet> I've done some more work on this, and I'm pretty sure it's a linker bug. as/link/mcs51/lkihx.c reads as follows:- VOID hexRecord(unsigned addr, int rtvalIndex) { Addr_T chksum; int i, overrun, bytes; for (i = rtvalIndex, chksum = 0; i < rtcnt; i++) { if (rtflg[i]) { if (addr + ++chksum > 0xffff) break; } } if (chksum == 0) return; // nothing to output if ( (lastHexAddr > addr) && (rflag) ) { /* <-- BUG?? */ overrun = hexPageOverrun + 1; ihxExtendedLinearAddress(lastExtendedAddress + overrun); hexPageOverrun = overrun; hexRecord(addr, rtvalIndex); return; } ... etc. } I think the line I've marked assumes that the output is always ascending, therefore if (lastHexAddr > addr) it must have wrapped around into a different bank. However, look at the .ihx output above: the addresses are rising (E4ED, E4EE, E4EF) then the next address is 4673 - still in the common area, but less than the previous address, so it inserts the extended record. I've tried a replacement as follows. This 'fixes' the problem for this case, but is not extendable to >2 banks (and obviously I don't know the code that well, so I may break something else...) Can you confirm I'm on the right lines, or suggest a better way? unsigned masked1, masked2; masked1 = lastHexAddr & ~0xFFFFUL; masked2 = addr & ~0xFFFFUL; /* Is this record in the same bank as previous? */ if ( (masked1 != masked2) && (rflag) ) { overrun = hexPageOverrun + 1; ihxExtendedLinearAddress(lastExtendedAddress + overrun); hexPageOverrun = overrun; hexRecord(addr, rtvalIndex); return; } I've tried to compress the app even further, to get something small enough to submit as a how-to-reproduce sample. However the problem goes away if I get it any smaller. So, I'm stuck with 8 compilation units and makefile. I can send you this off-list if you need it. Regards, Andy > > Andy, > > If you still have code above 0x00010000 as indicated by > the second record you mention, you either have placed > code above that address yourself with a option for the > linker or your program is not "a small app". > > Maarten > > > Thanks a lot Maarten, > > > > I've made sense of the extended address record. However one > thing still > > confuses me. If I build a small app that all fits in the > common area, > > the output.ihx still contains two extended address records, > along the > > lines of:- > > > > :020000040000FA // I guess this means bank0? > > .. > > <some data records> > > .. > > :020000040001F9 // I guess this means bank1? > > .. > > <more data records> > > .. > > :0400000500000000F7 > > :00000001FF > > > > I guess the linker must think the banked area starts at a > lower address. > > How do I set the banked area? > > (or have I misunderstood completely?!) > > ------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user