Based on the lack of responses, and the branches of sdcc with modifications to fix bank switching, I believe the banking in the official version is broken. The documentation should be updated to indicate this so future users don't waste their time trying to use it.
The branched version are not keeping up with the latest sdcc releases, they only support 2.7.0 and 2.8.0. If you are curious you should look at this sdcc branch, modified "with banking" http://sourceforge.net/projects/ccflasher/files/ If there is any way to make the bank switching work in the mainline code, I am willing to help test and document it. Anthony Anthony Asterisk wrote: > Hello SDCC-users, > > From reading the sdcc documentation, bank switching for the mcs51 is > supported through the sdcc specific keyword __banked, a codeseg > command line switch (or inline pragma) and the trampoline calls > __sdcc_banked_call and __sdcc_banked_ret. The cc2430 chip that I am > using provides a bank switching SFR called FMAP that is functionally > similar to the crtbank.asm examples PSBANK, therefore I expect the > crtbank.asm trampoline should work with no changes. However when I > mark any routine as banked, even if it is in the HOME bank, the code > does not work... > Changes that I notice when using banking: > > The trampoline functions get added to final map file (demo.map) > > Area Addr Size Decimal Bytes > (Attributes) > -------------------------------- ---- ---- ------- ----- > ------------ > HOME 0000 00AC = 172. bytes > (REL,CON,CODE) > > Value Global > -------- -------------------------------- > 0C:0000 __sdcc_banked_call > 0C:0016 __sdcc_banked_ret > 0C:009F __sdcc_program_startup > 0C:00A4 __sdcc_call_dptr > 0C:00A6 _hello_world > > > ** Is the location of __sdcc_banked_call at address 0000 in the HOME > segment a problem? I expected the start up routines would normally go > at 0000. > > ** From discussions with some other users of the cc2430/sdcc, it seems > the banked mode does not work as described in the documentation. > Specifically, I have been informed of some undocumented requirements... > - generated hex file is in an unusual format that is not compatible > with "commercial" programmers and must converted somehow > - all code must be assigned to a bank, it will not work if any code > is unassigned > - all banks must have some code assigned to it > > > ** Does anyone have the documented approach to bank switching > working? Is there some source code online that I can study? > > ** If the documented method does not work, I would be willing to help > update the documentation if someone can explain the current > requirements and implementation. > > > Here are the bank switching assembly routines... > > .area HOME (CODE) > > __sdcc_banked_call:: > push _PSBANK ;save return bank > xch a,r0 ;save Acc in r0, do not assume any > register bank > push acc ;push LSB address > mov a,r1 > push acc ;push MSB address > mov a,r2 ;get new bank > anl a,#0x0F ;remove storage class indicator > anl _PSBANK,#0xF0 > orl _PSBANK,a ;select bank > xch a,r0 ;restore Acc > ret ;make the call > > __sdcc_banked_ret:: > pop _PSBANK ;restore bank > ret ;return to caller > > > Generated assembly code for a banked call: > > ; demo.c:82: abc=hello_world(); > mov r0,#_hello_world > mov r1,#(_hello_world >> 8) > mov r2,#(_hello_world >> 16) > lcall __sdcc_banked_call > mov r2,dpl > mov r3,dph > > > > ; hello_world.c:15: return 123; > mov dptr,#0x007B > ljmp __sdcc_banked_ret > > > Questions: > > - the parameters passed on the stack to banked routine would come > before _PSBANK. Will the banked routine skip over the stored _PSBANK > to reach them? So far I have only attempted to routines without > parameters. ------------------------------------------------------------------------------ Return on Information: Google Enterprise Search pays you back Get the facts. http://p.sf.net/sfu/google-dev2dev _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user