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

Reply via email to