所以我在整理了一些东西后回答了我自己的问题。实际上,您可以使用以下寄存器创建常量:
REGISTER_A equ [esi+CPU_CORE.registers.A]
但你只能像这样加载它:
mov eax, REGISTER_A ;EAX will now contain the value of the register A.
然后我发现您可以直接访问结构的偏移量(我不知道为什么我以前从未使用过它。)
REGISTER_A equ CPU_CORE.registers.A
由于这行得通,我创建了一个名为PARAM的结构,如下所示:
PARAM struct
pointer DWORD ? ;Register pointer
flags BYTE ? ;BIT 0: Content Flag, BIT 1: 8 or 16 bit
desc DWORD ? ;Description of the parameter
PARAM ends
我刚刚为 LD R,R 操作码创建了一个参数列表。看起来像:
PARAM_LIST_R PARAM <CPU_CORE.registers.B, 0, _stro('B')>
PARAM <CPU_CORE.registers._C, 0, _stro('C')>
PARAM <CPU_CORE.registers.D, 0, _stro('D')>
PARAM <CPU_CORE.registers.E, 0, _stro('E')>
PARAM <CPU_CORE.registers.H, 0, _stro('H')>
PARAM <CPU_CORE.registers.L, 0, _stro('L')>
PARAM <CPU_CORE.registers.H, 1, _stro('(HL)')>
PARAM <CPU_CORE.registers.A, 0, _stro('A')>
和一个从寄存器中读取的函数
LoadParam proc cpu_core:DWORD, param:DWORD
LOCAL value:DWORD
pushad
mov esi, cpu_core
mov edi, param
assume esi:ptr CPU_CORE
assume edi:ptr PARAM
add esi, [edi].pointer
movzx ebx, [edi].flags
bt ebx, 0
test ebx, ebx
jnc @NO_CONTENT
movzx edx, word ptr ds:[esi]
;-- ADDING CPU_READ FUNCTION --;
jmp @DONE
@NO_CONTENT:
bt ebx, 1
jc @GET16Bit
movzx eax, byte ptr ds:[esi]
jmp @DONE
@GET16Bit:
movzx eax, word ptr ds:[esi]
@DONE:
mov value, eax
assume esi:ptr NOTHING
assume edi:ptr NOTHING
popad
mov eax, value
ret
LoadParam endp
该函数加载CPU_CORE
intoESI
和PARAM
into EDI
,将 get 的指针PARAM
添加到CPU_CORE
. 之后标志被测试,如果BIT 0
设置它从 CPU 内存中读取(例如:)(HL)
,如果它没有设置它只会从寄存器中获取值。如果BIT 1
设置了大小,则函数将读取 16 位寄存器 ( BC
, DE
, HL
) 或 8 位寄存器 ( B
, C
, D
, E
, H
, L
, A
)。
我希望你能明白我写的东西。如果您有任何问题,请随时提出,这是迄今为止我解决问题的“最简单”的方法。
如果您想知道我为什么要创建该表:您可以“解码”操作码以获取更多信息 google “z80 解码”。