home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 2
/
FFMCD02.bin
/
new
/
misc
/
emu
/
z80
/
z80_struct.i
< prev
next >
Wrap
Text File
|
1993-12-21
|
8KB
|
283 lines
IFND Z80_STRUCT_I
Z80_STRUCT_I SET 1
** The Z80 emulator control structure.
** Could be allocated in public memory, and shared between
** an emulating process and one or several supervising processes.
**
** Define Z80_ENV_SIZE in 'user.i' if you want that added to the
** structure size, otherwise it will be defined to 0. See the bottom
** of this file for more details.
** ------------
IFD VERBOSE
LIST
** Compiling the Z80_struct.i file.
NOLIST
ENDC
IFND Z80_INCLUDE
INCLUDE Z80.i
ENDC
** Macro definitions for creating structure offsets:
Z80_STRUCT MACRO ;Begin structure.
Z80_OFFSET SET 0
ENDM
Z80_BYTE MACRO ;label
\1 EQU Z80_OFFSET
Z80_OFFSET SET Z80_OFFSET+1
ENDM
Z80_WORD MACRO ;label ;not auto-aligned!
\1 EQU Z80_OFFSET
Z80_OFFSET SET Z80_OFFSET+2
ENDM
Z80_LONG MACRO ;label ;not auto-aligned!
\1 EQU Z80_OFFSET
Z80_OFFSET SET Z80_OFFSET+4
ENDM
Z80_BYTEARR MACRO ;name,size ;array of bytes
\1 EQU Z80_OFFSET
Z80_OFFSET SET Z80_OFFSET+\2
ENDM
;Set label without bumping the offset
Z80_LABEL MACRO ;label
\1 EQU Z80_OFFSET
ENDM
;Bump offset without setting a label
Z80_BUMP MACRO ;nbytes
Z80_OFFSET SET Z80_OFFSET+\1
ENDM
;Set label to distance from other offset to current
Z80_SIZE MACRO ;label,from_offs
\1 EQU Z80_OFFSET-\2
ENDM
Z80_ALIGN_W MACRO ;word-align
Z80_OFFSET SET (Z80_OFFSET+1)&$fffffffe
ENDM
** ============
** The entries begin here:
Z80_STRUCT
;The base address is referred to as TableBase from now on.
** This longword is for temporary storage, byte swapping and so on.
** Presently, it must be at TableBase, since Work and TableB are the
** same register.
Z80_LONG Z80_Workspace
** ------------
** Index-accessed stuff. OFFSET FROM TABLEBASE MUST NEVER BE > +127 !
** Public:
Z80_BYTEARR Z80_AccessCnt,4*Z80_MEM_CNTNUM
;Memory write access counters (longwords).
;private:
Z80_BCDSTACKSIZE EQU 7 ;BCD stack (must be word-aligned!)
Z80_BYTEARR Z80_BCDstack,6*Z80_BCDSTACKSIZE
** Public:
Z80_BYTEARR Z80_CntType,Z80_MEM_CNTNUM
;Counter type designations (bytes).
;Zero for write, nonzero for no write.
Z80_BYTEARR Z80_Parity,256 ;Parity translation table
IFNE Z80_Parity>127
FAIL Bad offset for indexed object (parity table).
ENDC
** end of index-accessed stuff.
** ------------
Z80_ALIGN_W
IFD Z80_MAIN
Z80_LABEL PROT_FIELDS ;Start of stuff that survives coldstart.
ENDC
** Public:
Z80_LONG Z80_Memory ;Pointer to the Z80 address space memory
Z80_LONG Z80_Cachemem ;Pointer to the cache memory
** Public:
Z80_LONG Z80_Flagmem ;Pointer to the flag memory
Z80_LONG Z80_MemHandler ;Pointer to User Memory Exception Handler
Z80_ALIGN_W
IFD Z80_MAIN
Z80_SIZE PROT_SIZE,PROT_FIELDS ;End of survive-coldstart stuff
ENDC
** Public (read-only):
Z80_LONG Z80_zero ;Pointer to Z80 address 0. The (signed)
;word-sized Z80 registers (like Z80_HL)
;can be used as offsets from this base
;to access the Z80 memory space.
Z80_LONG Z80_cachezero ;Corresponds to Z80_Zero in the cache.
Z80_LONG Z80_flagzero ;Corresponds to Z80_zero in flag memory.
** Public (read-only):
Z80_WORD Z80_Running ;Nonzero if running, zero if not
; Private:
Z80_WORD Z80_Request ;Request pointer (offset from InstrBase).
Z80_WORD Z80_ReqLvl ;Current request priority level.
Z80_WORD Z80_alt_CCR ;This is the internal F' in CCR format
Z80_WORD Z80_BCD_SP ;Stack pointer for the BCD stack.
** ------------
;The CPU status structure begins here.
;(All offsets still relative to TableBase.)
** The public fields:
**
** The label naming conventions are simple: Z80_<register>
** The alternative registers are referred to as Z80_alt_<register>
** <register> here is one of:
** byte-valued A, B, C, D, E, H, L, F, I, R
** word-valued HL, IX, IY, SP, PC
** special IFF, INTMOD
** Accessing HL will affect H and L and vice versa (HL is an 'alias').
** Only the word-valued entries are guaranteed to also be word-aligned.
** IFF and INTMOD are byte-sized, and should be interpreted as follows:
** IFF Bit 7 holds IFF2. Bit 6 holds IFF1. Bits 5-0 are zero.
** INTMOD The values in the range -1 to 1 correspond to interrupt
** modes 0 to 2, respectively.
** None of these entries should be written to (and rather not read either)
** unless the emulator is stopped, since their contents are then undefined.
** Most are never updated or read from except upon exiting and continuing.
Z80_ALIGN_W
Z80_LABEL Z80_CpuStatus ;offset of substructure start
;Storage area for 680x0 registers at exit. Remember to change
;these labels if you rearrange the register usage.
;Movem is of course used to write and restore, therefore it MUST
;be at least word-aligned.
Z80_LABEL Z80_RegStorage
Z80_BUMP 1 ;d0, high word
Z80_BYTE Z80_alt_A
Z80_BUMP 1 ;d0, low word
Z80_BYTE Z80_A
Z80_BUMP 1 ;d1, high word
Z80_BYTE Z80_alt_B
Z80_BUMP 1 ;d1, low word
Z80_BYTE Z80_B
Z80_BUMP 1 ;d2, high word
Z80_BYTE Z80_alt_C
Z80_BUMP 1 ;d2, low word
Z80_BYTE Z80_C
Z80_BUMP 1 ;d3, high word
Z80_BYTE Z80_alt_D
Z80_BUMP 1 ;d3, low word
Z80_BYTE Z80_D
Z80_BUMP 1 ;d4, high word
Z80_BYTE Z80_alt_E
Z80_BUMP 1 ;d4, low word
Z80_BYTE Z80_E
Z80_BUMP 2 ;d5, high word (garbage)
Z80_LABEL Z80_HL ;HL (for word-access)
Z80_BYTE Z80_H ;d5, low word
Z80_BYTE Z80_L
;d6 (current flags on CCR form) is recalculated at continue.
;d7 holds nothing between instructions.
;a0 (TableB) always comes as a parameter.
;a1 (Pseudo-PC) is recalculated at Continue.
Z80_BUMP 2 ;a2, high word
Z80_WORD Z80_SP ;a2, low word
;Private fields
Z80_LONG Z80_Z0 ;a3
Z80_LONG Z80_CacheB ;a4
Z80_LONG Z80_FlagsB ;a5
Z80_BUMP 4 ;a6 (holds InstrB)
;a7 (user sp) is never stored.
;End of 680x0 register storage
Z80_LABEL Z80_IX ;IX (for word-access)
Z80_BYTE Z80_XH ;high byte
Z80_BYTE Z80_XL ;low byte
Z80_LABEL Z80_IY ;IY (for word-access)
Z80_BYTE Z80_YH ;high byte
Z80_BYTE Z80_YL ;low byte
Z80_LABEL Z80_alt_HL ;H'L' (for word-access)
Z80_BYTE Z80_alt_H ;H'
Z80_BYTE Z80_alt_L ;L'
Z80_WORD Z80_PC ;PC (written/read only at exit/continue)
Z80_BYTE Z80_F ;These flags are calculated upon exit.
Z80_BYTE Z80_alt_F ; During emulation, they are unused.
Z80_BYTE Z80_IFF ;IFF2 in bit 7, IFF1 in bit 6
Z80_BYTE Z80_INTMOD ;Interruptmode (-1 to 1) = (modes 0 to 2)
Z80_BYTE Z80_I ;Interrupt register
Z80_BYTE Z80_R ;Refresh register
;word aligned here
;These could be inspected. If nonzero, a request has been
;received but not yet served.
Z80_WORD Z80_INT_FF ;INTreq status
Z80_WORD Z80_NMI_FF ;NMIreq status
Z80_WORD Z80_RES_FF ;RESETreq status
;Private fields
Z80_LABEL Z80_BCD_DATA ;BCD data size is fixed: 6 bytes.
Z80_WORD Z80_BCD_OP ;BCD operation
Z80_WORD Z80_BCD_C ;BCD carry in bit 0. Word-sized for shifts.
Z80_BYTE Z80_BCD_A ;BCD destination
Z80_BYTE Z80_BCD_B ;BCD source
Z80_SIZE Z80_CpuStatusSize,Z80_CpuStatus
;The CPU status structure ends here.
** ------------
** Beginning of user environment data area. It is word-aligned,
** and has the size (in bytes) defined in Z80_ENV_SIZE, which could
** be just about anything, including zero. No entries follow it.
** It is intended mainly for accessing from the environment-specific
** instructions (see 'impldept.i' and 'generic_macs.i').
Z80_ALIGN_W
IFND Z80_ENV_SIZE
Z80_ENV_SIZE EQU 0
ENDC
Z80_BYTEARR Z80_Envdata,Z80_ENV_SIZE
IFNE Z80_Envdata>$7fff
FAIL Environment data is beyond word-sized offset from TableBase.
ENDC
** ------------
** The table entries end here.
Z80_LABEL Z80_StructSize
** ======================================================================
ENDC ;IFD Z80_STRUCT_I