more work on Z80 support
This commit is contained in:
1 parent
3054a44e7c
commit
76f25a36e2
16 files changed
+763
-201
No files matched your search
+110
-60
@@ -1,73 +1,116 @@
|
||||
|
||||
!addr REG_AF = $02 ; 16-bit combined register
|
||||
!addr REG_F = REG_AF+0 ; 8-bit flag register
|
||||
!addr REG_A = REG_AF+1 ; 8-bit accumulator
|
||||
!addr REG_BC = $04
|
||||
!addr REG_C = REG_BC+0
|
||||
!addr REG_B = REG_BC+1
|
||||
!addr REG_DE = $06
|
||||
!addr REG_E = REG_DE+0
|
||||
!addr REG_D = REG_DE+1
|
||||
!addr REG_HL = $08
|
||||
!addr REG_L = REG_HL+0
|
||||
!addr REG_H = REG_HL+1
|
||||
;
|
||||
; Z80 CPU state/emulation data
|
||||
;
|
||||
|
||||
!addr REG_F_SH = $0A ; shadow registers
|
||||
!addr REG_A_SH = $0B
|
||||
!addr REG_C_SH = $0C
|
||||
!addr REG_B_SH = $0D
|
||||
!addr REG_E_SH = $0E
|
||||
!addr REG_D_SH = $0F
|
||||
!addr REG_L_SH = $10
|
||||
!addr REG_H_SH = $11
|
||||
!addr z80_cpustate__start = $02
|
||||
|
||||
!addr REG_IX = $12 ; 16-bit index register
|
||||
!addr REG_IXL = $12
|
||||
!addr REG_IXH = $13
|
||||
!addr REG_IY = $14 ; 16-bit index register
|
||||
!addr REG_IYL = $14
|
||||
!addr REG_IYH = $15
|
||||
!addr REG_SP = $16 ; 16-bit stack pointer
|
||||
!addr REG_PC = $18 ; 16-bit program counter
|
||||
!addr REG_AF = $02 ; 2 bytes - combined register
|
||||
!addr REG_F = REG_AF+0 ; - flag register
|
||||
!addr REG_A = REG_AF+1 ; - accumulator
|
||||
|
||||
!addr REG_I = $1A ; 8-bit interrupt vector base
|
||||
!addr REG_R06 = $1B ; refresh counter, bits 0-6 (bit 7 is garbage)
|
||||
!addr REG_R7 = $1C ; refresh counter, bit 7 (bits 0-6 are garbage)
|
||||
!addr REG_BC = $04 ; 2 bytes - combined register
|
||||
!addr REG_C = REG_BC+0
|
||||
!addr REG_B = REG_BC+1
|
||||
!addr REG_BC_EXT1 = $06 ; 2 bytes - helper for faster access via BC in bank 1
|
||||
|
||||
!addr PTR_IXY_d = $1D ; 16-bit calculated address IX+d / IY+d XXX - important!!!
|
||||
!addr PTR_DATA = $1F ; data source address XXX - important!!!
|
||||
!addr REG_DE = $08 ; 2 bytes - combined register
|
||||
!addr REG_E = REG_DE+0
|
||||
!addr REG_D = REG_DE+1
|
||||
!addr REG_DE_EXT1 = $0A ; 2 bytes - helper for faster access via DE in bank 1
|
||||
|
||||
!addr REG_IFF1 = $23 ; interrupt flip-flop flag 1
|
||||
!addr REG_IFF2 = $24 ; interrupt flip-flop flag 2
|
||||
!addr REG_HL = $0C ; 2 bytes - combined register
|
||||
!addr REG_L = REG_HL+0
|
||||
!addr REG_H = REG_HL+1
|
||||
!addr REG_HL_EXT1 = $0E ; 2 bytes - helper for faster access via HL in bank 1
|
||||
|
||||
!addr REG_TMP1 = $25 ; emulation-specific temporary storage
|
||||
!addr REG_TMP2 = $26
|
||||
!addr ADDR_IO = $27 ; 16-bit address for fetching/storing the IO
|
||||
!addr REG_SHADOW = $10 ; 8 bytes - shadow registers
|
||||
!addr REG_F_SH = REG_SHADOW+0
|
||||
!addr REG_A_SH = REG_SHADOW+1
|
||||
!addr REG_C_SH = REG_SHADOW+2
|
||||
!addr REG_B_SH = REG_SHADOW+3
|
||||
!addr REG_E_SH = REG_SHADOW+4
|
||||
!addr REG_D_SH = REG_SHADOW+5
|
||||
!addr REG_L_SH = REG_SHADOW+6
|
||||
!addr REG_H_SH = REG_SHADOW+7
|
||||
|
||||
!addr REG_SP = $18 ; 2 bytes - stack pointer
|
||||
!addr REG_SP_EXT1 = $1A ; 2 bytes - helper for faster access via SP in bank 1
|
||||
!addr REG_PC = $1C ; 2 bytes - sprogram counter
|
||||
!addr REG_PC_EXT1 = $1E ; 2 bytes - helper for faster access via PC in bank 1
|
||||
|
||||
!addr VEC_MOVE_fetch = $30 ; vector to byte fetch routine, for BIOS routine MOVE
|
||||
!addr VEC_MOVE_store = $32 ; vector to byte store routine, for BIOS routine MOVE
|
||||
!addr VEC_DISKIO_store = $34 ; vector to byte store routine, for BIOS disk I/O operations
|
||||
!addr REG_IX = $20 ; 2 bytes - index register
|
||||
!addr REG_IXL = REG_IX+0
|
||||
!addr REG_IXH = REG_IX+1
|
||||
!addr REG_IY = $22 ; 2 bytes - index register
|
||||
!addr REG_IYL = REG_IY+0
|
||||
!addr REG_IYH = REG_IY+1
|
||||
|
||||
!addr VEC_fetch_value = $50
|
||||
!addr VEC_fetch_stack = $52
|
||||
!addr VEC_store_stack = $54
|
||||
!addr VEC_fetch_via_BC = $56 ; XXX add routines
|
||||
!addr VEC_store_via_BC = $58 ; XXX add routines
|
||||
!addr VEC_fetch_via_DE = $5A ; XXX add routines
|
||||
!addr VEC_store_via_DE = $5C ; XXX add routines
|
||||
!addr VEC_fetch_via_HL = $5E
|
||||
!addr VEC_store_via_HL = $60
|
||||
!addr VEC_fetch_via_IX_d = $62
|
||||
!addr VEC_fetch_via_IY_d = $64
|
||||
!addr VEC_store_via_IX_d = $66
|
||||
!addr VEC_store_via_IY_d = $68
|
||||
!addr VEC_fetch_via_nn = $6A
|
||||
!addr VEC_store_via_nn = $6C
|
||||
!addr VEC_fetch_via_plus1 = $6E ; XXX add routines
|
||||
!addr VEC_store_via_plus1 = $70 ; XXX add routines XXX jump to next directly?
|
||||
!addr VEC_xchng_stack_lo = $72 ; XXX add routines
|
||||
!addr VEC_xchng_stack_hi = $74 ; XXX add routines
|
||||
!addr REG_IFF1 = $24 ; 1 byte - interrupt flip-flop flag 1
|
||||
!addr REG_IFF2 = $25 ; 1 byte - interrupt flip-flop flag 2
|
||||
!addr REG_R06 = $26 ; 1 byte - refresh counter, bits 0-6 (bit 7 is garbage)
|
||||
!addr REG_R7 = $27 ; 1 byte - refresh counter, bit 7 (bits 0-6 are garbage)
|
||||
!addr REG_I = $28 ; 1 byte - interrupt vector base
|
||||
|
||||
!addr z80_cpustate__end = $28
|
||||
|
||||
!addr BANK_ID = $29 ; 1 byte - currently selected bank
|
||||
|
||||
;
|
||||
; BIOS vectors
|
||||
;
|
||||
|
||||
!addr VEC_MOVE_fetch = $2A ; 2 bytes - vector to byte fetch routine, for BIOS routine MOVE
|
||||
!addr VEC_MOVE_store = $2C ; 2 bytes - vector to byte store routine, for BIOS routine MOVE
|
||||
!addr VEC_DISKIO_store = $2E ; 2 bytes - vector to byte store routine, for BIOS disk I/O operations
|
||||
|
||||
;
|
||||
; Z80 emulation temporary area
|
||||
;
|
||||
|
||||
!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_EXT1 = PTR_DATA+2
|
||||
!addr ADDR_IO = $38 ; 4 bytes - address for fetching/storing the IO
|
||||
|
||||
!addr REG_TMP1 = $3C ; 1 byte - emulation-specific temporary storage
|
||||
!addr REG_TMP2 = $3D ; 1 byte - emulation-specific temporary storage
|
||||
|
||||
; $3E ; 2 bytes - reserved
|
||||
|
||||
;
|
||||
; Memory banking vectors
|
||||
;
|
||||
|
||||
!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
|
||||
|
||||
; XXX implement routines for vectors below
|
||||
|
||||
!addr VEC_fetch_stack = $42
|
||||
!addr VEC_store_stack = $44
|
||||
!addr VEC_fetch_via_BC = $46
|
||||
!addr VEC_store_via_BC = $48
|
||||
!addr VEC_fetch_via_DE = $4A
|
||||
!addr VEC_store_via_DE = $4C
|
||||
!addr VEC_fetch_via_HL = $4E
|
||||
!addr VEC_store_via_HL = $50
|
||||
!addr VEC_fetch_via_IX_d = $52
|
||||
!addr VEC_fetch_via_IY_d = $54
|
||||
!addr VEC_store_via_IX_d = $56
|
||||
!addr VEC_store_via_IY_d = $58
|
||||
!addr VEC_fetch_via_nn = $5A
|
||||
!addr VEC_store_via_nn = $5C
|
||||
!addr VEC_fetch_via_plus1 = $5E
|
||||
!addr VEC_store_via_plus1 = $60 ; XXX jump to next directly?
|
||||
!addr VEC_xchng_stack_lo = $62
|
||||
!addr VEC_xchng_stack_hi = $64
|
||||
|
||||
;
|
||||
; Constant/macros definitions
|
||||
;
|
||||
|
||||
; Masks for Z80 flag (F) register
|
||||
|
||||
@@ -101,3 +144,10 @@
|
||||
!macro Z80_PUT_0_NF { rmb1 REG_F }
|
||||
!macro Z80_PUT_1_CF { smb0 REG_F }
|
||||
!macro Z80_PUT_0_CF { rmb0 REG_F }
|
||||
|
||||
;
|
||||
; Helper tables for CPU emulation, downwards from $2000
|
||||
;
|
||||
|
||||
!addr z80_atable_mi_bank0 = $1FF0 ; table for bank 0 memory address conversion
|
||||
!addr z80_atable_hi_bank0 = $1FE0 ; table for bank 0 memory address conversion
|
||||
Reference in new issue
Block a user