Purpose: Gosub in another bank
Call address: $FF6E (hex) 65390 (decimal)
Preparation:
Registers: none Memory: system map, also: $02 -> bank (0-15) $03 -> PC high $04 -> PC low $05 -> .S (status $06 -> .A $07 -> .X $08 -> .Y Flags: none Calls: noneResults:
Registers: none Memory: as per call, also: $05 -> .S (status) $06 -> .A $07 -> .X $08 -> .Y Flags: none
Description: The routine JSRFAR, enable code executing in the
system bank of memory to call a routine in any other bank. In the case
of JSRFAR, a return will be made to the caller's bank. It should be noted that
JSRFAR calls JMPFAR, which calls GETCFG. When calling a non-system bank,
the user should take necessary precautions to ensure that interrupts (IRQ's and NMI's)
will be handled properly (or disabled beforehand). Both JSRFAR and JMPFAR are
RAM-based routines located in common (shared) RAM at $2CD and $2E3
respectively.
The following code illustrates how to call a subroutine in the second RAM
bank from the system bank. Note that we need not worry about IRQ's and NMI's in
this case because the system will handle them properly in any configuration that has
the Kernal ROM or any valid RAM bank in context at the top page of memory.
EXAMPLE:
STY $08 ;assumes registers and status STX $07 ;already setup for call STA $06 PHP PLA STA $05 LDA #1 ;want to call $2000 in bank 1 LDY #$20 LDX #$00 STA $02 STY $03 STX $04 JSR $FF6E ;JSRFAR LDA $05 ;restore status and registers PHA LDA $06 LDX $07 LDY $08 PLP