[Coco] Preliminary Support for SDC in HDBDOS
William Astle
lost at l-w.ca
Tue Nov 25 15:30:08 EST 2014
On 14-11-25 01:00 PM, Luis Antoniosi (CoCoDemus) wrote:
> With a little work it would work. SECB is copied to RAM. Whenever it should
> access the upper 8K, it must toggle the ROM. Any function jumping or
> calling an upper bank, should do it first and then return to RAM.
It also turns out that doing so in a manner that "just works" on any
version of the coco isn't that difficult either.
You just need a "bounce" routine to perform the correct switching.
Basically, you detect if you're in ROM mode and if so, just transfer
control directly. Otherwise, switch to ROM mode, call the routine, and
switch back to RAM mode.
For anyone wondering, you can do something like this:
BOUNCE BSR HICALL
JMP REALCALL
HICALL INC L1
L1 BRA L2
DEC L1
STA $FFDE
JSR [,S++]
PSHS CC
STA $FFDF
PULS CC,PC
L2 RTS
This is roughly with the SDCDOS bit does. The way it works is you call
BOUNCE as usual. It then calls the HICALL routine to do the ROM/RAM
switch if required.
If the system is running in ROM mode, HICALL does nothing and returns to
the BOUNCE routine and goes on with the JMP instruction. (In ROM mode,
the INC instruction does nothing.)
If, however, the system is running in RAM mode, the INC turns the BRA
instruction into BRN and then execution goes on with the DEC instruction
(which restores the BRA instruction). Then it switches to ROM mode and
calls the code after the BSR HICALL instruction. Then it goes back to
RAM mode (taking care to preserve CC in this case) and returns to the
original caller of BOUNCE.
In other words, the upper 8K of the DECB ROM can be swapped in as
required by simply having a number of similar "BOUNCE" routines.
Obviously, code located in the high half of the ROM can just call other
code in the high half directly.
The fun part is that the code in the high half doesn't need to know that
it was called specially though it does mean that you can't use the stack
to pass parameters (in the ROM/RAM switch case, there's an extra return
address on the stack) but DECB routines don't generally do that anyway.
More information about the Coco
mailing list