Hello Maarten,

>From below reply, could you please explain what you mean with:

> Since .bndry is not working in the linker I would be careful with this.

During preparation of the original example I examined both the map file as
well as the produced binary, and they seem to confirm the desired memory
layout:

C:   00000089  __sdcc_program_startup             main
C:   00000100  _USBINT_AUTOVECTORS                main

00000080: F6 E6 A8 82 20 F5 D9 80 CF 12 01 6F 80 FE        #vf(. uY.O..o.~
00000100: 02 01 71    02 01 75    02 01 79    02 01 7D     #..q ..u ..y ..}
00000110: 75 81 08 12 01 81 E5 82 60 03 02 00 89 79 00 E9  #u.....e.`....y.i

Without specifying .bndry 256 this changes to:

C:   00000089  __sdcc_program_startup             main
C:   0000008E  _USBINT_AUTOVECTORS                main

00000080: F6 E6 A8 82 20 F5 D9 80 CF 12 00 FD 80 FE 02 00  #vf(. uY.O..}.~..
00000090: FF    02 01 03    02 01 07    02 01 0B    75 81  #. ... ... ... u.
000000A0: 08 12 01 0F E5 82 60 03 02 00 89 79 00 E9 44 00  #....e.`....y.iD.

Are you saying the former result is a lucky coincidence, and that the linker
may not produce correct results in other circumstances?

Eric



> -----Original Message-----
> From: Maarten Brock <[email protected]>
> Sent: Wednesday, 22 July 2026 15:25
> To: [email protected]
> Subject: Re: [Sdcc-user] Cypress FX2 USB vector "table"
>
> Hello Ian,
>
> [email protected] schreef op 2026-06-29 12:44:
> >
> > extern void USBINT_AUTOVECTORS(void) __interrupt(8) __naked;
>
> This is a good idea.
>
> > int main(void)
>
> Since main() has nothing to return any value to, make it return void.
>
> > {
> > __asm
> >   .area HOME (CODE)
> >   .bndry 256
> > _USBINT_AUTOVECTORS::
> >   ljmp _USBINT_SUDAV
> >   .ds 1
> >   ljmp _USBINT_SOF
> >   .ds 1
> >   ljmp _USBINT_SUTOK
> >   .ds 1
> >   ljmp _USBINT_SUSPEND
> >   .ds 1
> >
> >   // And so on...
> >
> >   .area CSEG (CODE)
> > __endasm;
> >
> >   while (1)
> >   {
> >   }
> > }
>
> Since .bndry is not working in the linker I would be careful with this.
> Also, don't place this inside main(). Put it in a separate dummy function,
> preferably at the end of the file containing main().
>
> static void dummy(void) __naked
> {
> __asm
>      ...
> __endasm;
> }
>
> Using ljmp instead of the magic number 0x02 is better IMO.
>
> > static volatile uint8_t i = 0;
> >
> > void USBINT_SUDAV(void) __interrupt
> > {
> >   i = 0;
> > }
>
> This is exactly right: __interrupt with no number.
>
> > void USBINT_SOF(void) __interrupt
> > {
> >   i = 1;
> > }
> >
> > void USBINT_SUTOK(void) __interrupt
> > {
> >   i = 2;
> > }
> >
> > void USBINT_SUSPEND(void) __interrupt
> > {
> >   i = 3;
> > }
> >
> > As compiled and linked with SDCC 4.6.0, this seems to give the desired
> > layout in code space.
> >
> >  Eric
> >
> >
> >
> >
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to