more work on CP/M memory banking
This commit is contained in:
1 parent
d71ce24357
commit
05c68cd79d
4 files changed
+105
-26
No files matched your search
@@ -69,9 +69,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
!addr PTR_IXY_d = $30 ; 4 bytes - calculated address IX+d / IY+d XXX - review usage !!!
|
!addr PTR_IXY_d = $30 ; 4 bytes - calculated address IX+d / IY+d XXX - review usage !!!
|
||||||
!addr PTR_IXY_d_EXT1 = PTR_IXY_d+2
|
|
||||||
!addr PTR_DATA = $34 ; 4 bytes - calculated data source address XXX - review usage !!! also check functions using ZVM_store_next
|
!addr PTR_DATA = $34 ; 4 bytes - calculated data source address XXX - review usage !!! also check functions using ZVM_store_next
|
||||||
!addr PTR_DATA_EXT1 = PTR_DATA+2
|
|
||||||
!addr ADDR_IO = $38 ; 4 bytes - address for fetching/storing the IO
|
!addr ADDR_IO = $38 ; 4 bytes - address for fetching/storing the IO
|
||||||
|
|
||||||
!addr REG_TMP1 = $3C ; 1 byte - emulation-specific temporary storage
|
!addr REG_TMP1 = $3C ; 1 byte - emulation-specific temporary storage
|
||||||
@@ -80,17 +78,19 @@
|
|||||||
; $3E ; 2 bytes - reserved
|
; $3E ; 2 bytes - reserved
|
||||||
|
|
||||||
;
|
;
|
||||||
; Memory banking vectors
|
; Memory banking vectors - every single routine destroys .Y in case of bank 0
|
||||||
;
|
;
|
||||||
|
|
||||||
|
; XXX inline some of these routines - provide separate opcode implementations for various banks
|
||||||
|
|
||||||
!addr zvm_bankvectors__start = $40
|
!addr zvm_bankvectors__start = $40
|
||||||
|
|
||||||
!addr VEC_fetch_via_PC_inc = $40 ; fetch to .A from (PC), increment PC afterwards XXX consider providing dual-byte retrieval
|
!addr VEC_fetch_via_PC_inc = $40 ; fetch to .A from (PC), increment PC afterwards
|
||||||
|
!addr VEC_fetch_stack = $42 ; fetch to .A - stack POP operation, destroys .X
|
||||||
|
!addr VEC_store_stack = $44 ; store .A - stack PUSH operation, destroys .X
|
||||||
|
|
||||||
; XXX implement routines for vectors below
|
; XXX implement routines for vectors below
|
||||||
|
|
||||||
!addr VEC_fetch_stack = $42
|
|
||||||
!addr VEC_store_stack = $44
|
|
||||||
!addr VEC_fetch_via_BC = $46
|
!addr VEC_fetch_via_BC = $46
|
||||||
!addr VEC_store_via_BC = $48
|
!addr VEC_store_via_BC = $48
|
||||||
!addr VEC_fetch_via_DE = $4A
|
!addr VEC_fetch_via_DE = $4A
|
||||||
|
|||||||
+13
-3
@@ -23,15 +23,25 @@ Z80_reset:
|
|||||||
sta REG_R06
|
sta REG_R06
|
||||||
|
|
||||||
; The engine requires all the Z80 visible memory to be present within the 1st 16MB,
|
; The engine requires all the Z80 visible memory to be present within the 1st 16MB,
|
||||||
; so set the most significant buytes of 32-bit pointers to 0.
|
; so set the most significant bytes of 32-bit pointers to 0.
|
||||||
|
|
||||||
stz REG_BC_EXT1+1
|
stz REG_BC_EXT1+1
|
||||||
stz REG_DE_EXT1+1
|
stz REG_DE_EXT1+1
|
||||||
stz REG_HL_EXT1+1
|
stz REG_HL_EXT1+1
|
||||||
stz REG_SP_EXT1+1
|
stz REG_SP_EXT1+1
|
||||||
stz REG_PC_EXT1+1
|
stz REG_PC_EXT1+1
|
||||||
stz PTR_IXY_d_EXT1+1
|
stz PTR_IXY_d+3
|
||||||
stz PTR_DATA_EXT1+1
|
stz PTR_DATA+3
|
||||||
|
|
||||||
|
; Some pointers are useful for bank 0 only - we can set another byte there
|
||||||
|
|
||||||
|
lda #$05
|
||||||
|
|
||||||
|
sta REG_BC_EXT1+0
|
||||||
|
sta REG_DE_EXT1+0
|
||||||
|
sta REG_HL_EXT1+0
|
||||||
|
sta REG_SP_EXT1+0
|
||||||
|
sta REG_PC_EXT1+0
|
||||||
|
|
||||||
; Default bank is 1 (the fastest, continuous memory)
|
; Default bank is 1 (the fastest, continuous memory)
|
||||||
|
|
||||||
|
|||||||
@@ -12,36 +12,61 @@ z80_table_gen:
|
|||||||
;
|
;
|
||||||
; Generating: z80_atable_mi_bank0, z80_atable_hi_bank0
|
; Generating: z80_atable_mi_bank0, z80_atable_hi_bank0
|
||||||
; Dependencies: NONE
|
; Dependencies: NONE
|
||||||
|
; Destroys: NONE
|
||||||
;
|
;
|
||||||
|
|
||||||
ldx #$00
|
ldx #$00
|
||||||
|
|
||||||
@loop_atable_bank0:
|
@loop_atable_bank0:
|
||||||
|
|
||||||
cpx #$E0
|
cpx #$C0
|
||||||
bcs @common_addr
|
bcs @addr_common
|
||||||
|
|
||||||
; Memory area $0000-$DFFF - maps to $02000-$0FFFF - 56KB
|
; Memory area $0000-$BFFF - maps somewhere to $0xxxx range - 48KB total
|
||||||
|
|
||||||
lda #$04
|
lda #$00
|
||||||
sta z80_atable_hi_bank0, x
|
sta z80_atable_hi_bank0, x
|
||||||
|
|
||||||
txa
|
txa
|
||||||
|
cmp #$60
|
||||||
|
bcc @addr_lo
|
||||||
|
|
||||||
|
@addr_hi:
|
||||||
|
|
||||||
|
; Memory area $6000-$BFFF - maps to $0C000 - $0FFFF - 24 KB
|
||||||
|
|
||||||
clc
|
clc
|
||||||
|
adc #$40
|
||||||
|
|
||||||
|
@addr_lo:
|
||||||
|
|
||||||
|
; Memory area $0000-$5FFF - maps to $02000 - $07FFF - 24 KB
|
||||||
|
|
||||||
adc #$20
|
adc #$20
|
||||||
sta z80_atable_mi_bank0, x
|
sta z80_atable_mi_bank0, x
|
||||||
|
|
||||||
@common_addr:
|
bra @loop_atable_next
|
||||||
|
|
||||||
; Memory area $E000-$FFFF - maps to $4E000-$4FFFF - 8KB
|
@addr_common:
|
||||||
|
|
||||||
lda #$04
|
; Memory area $C000-$FFFF - maps to $5C000-$5FFFF - 16KB
|
||||||
|
|
||||||
|
lda #$05
|
||||||
sta z80_atable_hi_bank0, x
|
sta z80_atable_hi_bank0, x
|
||||||
txa
|
txa
|
||||||
sta z80_atable_mi_bank0, x
|
sta z80_atable_mi_bank0, x
|
||||||
|
|
||||||
|
@loop_atable_next:
|
||||||
|
|
||||||
inx
|
inx
|
||||||
bne @loop_atable_bank0
|
bne @loop_atable_bank0
|
||||||
|
|
||||||
|
;
|
||||||
|
; Generating: XXX
|
||||||
|
; Dependencies: NONE
|
||||||
|
; Destroys: NONE
|
||||||
|
;
|
||||||
|
|
||||||
; XXX add more tables here
|
; XXX add more tables here
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|||||||
+54
-10
@@ -7,11 +7,17 @@
|
|||||||
ZVM_bank0_vectab:
|
ZVM_bank0_vectab:
|
||||||
|
|
||||||
!word ZVM_bank0_fetch_via_PC_inc
|
!word ZVM_bank0_fetch_via_PC_inc
|
||||||
|
!word ZVM_bank0_fetch_stack
|
||||||
|
!word ZVM_bank0_store_stack
|
||||||
|
|
||||||
; XXX add remaining routines here
|
; XXX add remaining routines here
|
||||||
|
|
||||||
ZVM_bank1_vectab:
|
ZVM_bank1_vectab:
|
||||||
|
|
||||||
!word ZVM_bank1_fetch_via_PC_inc
|
!word ZVM_bank1_fetch_via_PC_inc
|
||||||
|
!word ZVM_bank1_fetch_stack
|
||||||
|
!word ZVM_bank1_store_stack
|
||||||
|
|
||||||
; XXX add remaining routines here
|
; XXX add remaining routines here
|
||||||
|
|
||||||
;
|
;
|
||||||
@@ -39,13 +45,8 @@ ZVM_set_bank_1:
|
|||||||
|
|
||||||
lda #$05
|
lda #$05
|
||||||
|
|
||||||
sta REG_BC_EXT1+0
|
sta PTR_IXY_d+2
|
||||||
sta REG_DE_EXT1+0
|
sta PTR_DATA+2
|
||||||
sta REG_HL_EXT1+0
|
|
||||||
sta REG_SP_EXT1+0
|
|
||||||
sta REG_PC_EXT1+0
|
|
||||||
sta PTR_IXY_d_EXT1+0
|
|
||||||
sta PTR_DATA_EXT1+0
|
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
@@ -61,21 +62,64 @@ ZVM_bank0_fetch_via_PC_inc:
|
|||||||
lda z80_atable_mi_bank0,y
|
lda z80_atable_mi_bank0,y
|
||||||
sta PTR_DATA+1
|
sta PTR_DATA+1
|
||||||
lda z80_atable_hi_bank0,y
|
lda z80_atable_hi_bank0,y
|
||||||
sta PTR_DATA+1
|
sta PTR_DATA+2
|
||||||
|
|
||||||
lda [PTR_DATA], z
|
lda [PTR_DATA], z
|
||||||
|
|
||||||
inw REG_PC
|
inw REG_PC
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
ZVM_bank1_fetch_via_PC_inc:
|
ZVM_bank1_fetch_via_PC_inc:
|
||||||
|
|
||||||
lda [REG_PC], z
|
lda [REG_PC], z
|
||||||
|
|
||||||
inw REG_PC
|
inw REG_PC
|
||||||
|
|
||||||
rts
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user