mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-01 13:50:30 +00:00
93 lines
1.6 KiB
Plaintext
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
|