Files
open-roms/src/zvm_m65/zvm_banking.s
T

144 lines
1.8 KiB
ArmAsm

;
; Z80 Virtual Machine banking support
;
ZVM_bank0_vectab:
!word ZVM_bank0_fetch_via_PC_inc
!word ZVM_bank0_fetch_stack
!word ZVM_bank0_store_stack
; XXX add remaining routines here
ZVM_bank1_vectab:
!word ZVM_bank1_fetch_via_PC_inc
!word ZVM_bank1_fetch_stack
!word ZVM_bank1_store_stack
; XXX add remaining routines here
;
; Bank switching routines
;
ZVM_set_bank_0:
lda #$00
sta BANK_ID
; XXX use DMAgic to switch banks (vectors on zeropage)
rts
ZVM_set_bank_1:
lda #$01
sta BANK_ID
; XXX use DMAgic to switch banks (vectors on zeropage)
; Since all the Z80 bank 1 memory is located in $0005:$xxxx,
; we can set some bytes in certain pointers for faster execution
lda #$05
sta PTR_IXY_d+2
sta PTR_DATA+2
rts
;
; Memory access routines
;
ZVM_bank0_fetch_via_PC_inc:
lda REG_PC+0
sta PTR_DATA+0
ldy REG_PC+1
lda z80_atable_mi_bank0,y
sta PTR_DATA+1
lda z80_atable_hi_bank0,y
sta PTR_DATA+2
lda [PTR_DATA], z
inw REG_PC
rts
ZVM_bank1_fetch_via_PC_inc:
lda [REG_PC], z
inw REG_PC
rts
ZVM_bank0_fetch_stack:
ldx REG_SP+0
stx PTR_DATA+0
ldy REG_SP+1
ldx z80_atable_mi_bank0,y
stx PTR_DATA+1
ldx z80_atable_hi_bank0,y
stx PTR_DATA+2
lda [PTR_DATA], z
inw REG_SP
rts
ZVM_bank1_fetch_stack:
lda [REG_SP], z
inw REG_SP
rts
ZVM_bank0_store_stack:
dew REG_SP
ldx REG_SP+0
stx PTR_DATA+0
ldy REG_SP+1
ldx z80_atable_mi_bank0,y
stx PTR_DATA+1
ldx z80_atable_hi_bank0,y
stx PTR_DATA+2
sta [PTR_DATA], z
rts
ZVM_bank1_store_stack:
dew REG_SP
sta [REG_SP], z
rts
; XXX cleanup code below
ZVM_fetch_IO:
; XXX fetch addresses via ADDR_IO - but which ones are safe? Should we have a whitelist?
lda #$00
sta REG_A
rts
ZVM_store_IO:
; XXX again, we should have a whitelist of addresses
rts