8bitworkshop/presets/vcs/vcslib/mapper_3e.ca65

93 lines
1.6 KiB
Plaintext

.importzp tmp4, ptr3, ptr4
.import callax
.export _bankselect
.export _ramselect
.export _xramset
.export _xramwrite
.export _xramread
.zeropage
; current ROM bank index (not used for RAM)
_currbank: .res 1
; must be in shared ROM bank
.code
;extern void bankselect(char index);
;#pragma wrapped-call (push, bankselect, 0)
;#pragma code-name (push, "ROM0")
;
; Wrapper function for selecting a ROM bank
;NOTE: this does not preserve Y
_bankselect:
tay
; save the old bank index
lda _currbank
pha
; select the new bank
lda tmp4
sta _currbank
sta $3F
tya
; call the wrapped function
call_wrapped_and_exit:
jsr call_wrapped_func
; restore the previous bank
pla
sta _currbank
sta $3F
rts
; Wrapper function for selecting the RAM bank
; This must be called from a ROM bank, because it
; will always exit into the last selected ROM bank
;NOTE: this does not preserve Y
_ramselect:
tay
; save the old bank index
lda _currbank
pha
; select the RAM bank
lda tmp4
sta $3E
lda #0 ; needed for Stella signature?
tya
jmp call_wrapped_and_exit
; Used to do: jsr (ptr4)
call_wrapped_func:
jmp (ptr4)
; Write a byte to address (ptr3) in RAM bank 0
_xramwrite:
; select the RAM bank
ldx #0
stx $3E
sta (ptr3,x)
restore_bank:
ldx _currbank
stx $3F
rts
; Read a byte to address (ptr4) in RAM bank 0
_xramread:
; modify the ptr4
; select the RAM bank
ldx #0
stx $3E
lda (ptr4,x)
jmp restore_bank
; Set the xram read/write address (in ptr3/ptr4)
_xramset:
sta ptr4+0
sta ptr3+0
stx ptr4+1 ; read
txa
ora #%00000100
sta ptr3+1 ; write
rts