cpu/z80: Flatten 16b rw operations in order to avoid vars manipulations (#13676)

This commit is contained in:
holub 2025-05-19 10:52:02 -04:00 committed by GitHub
parent 1a97bc2159
commit 720609f661
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 85 additions and 153 deletions

View File

@ -25,19 +25,15 @@ macro rm_reg %addr
@nomreq_addr %addr
macro rm16 %addr
@rm %addr
TDAT_H = TDAT_L;
@rm %addr+1
using std::swap;
swap(TDAT_H, TDAT_L);
m_memrq_cycles !! TDAT_L = data_read(%addr);
m_memrq_cycles !! TDAT_H = data_read(%addr+1);
macro wm %addr
m_memrq_cycles !! data_write(%addr, TDAT8);
macro wm16 %addr
@wm %addr
TDAT8 = TDAT_H;
@wm %addr+1
m_memrq_cycles !! data_write(%addr, TDAT_L);
m_memrq_cycles !! data_write(%addr+1, TDAT_H);
macro wm16_sp %d16
SP--;
@ -66,12 +62,12 @@ macro arg
m_memrq_cycles !! TDAT8 = arg_read();
PC++;
macro arg16
@arg
TDAT_H = TDAT_L;
@arg
using std::swap;
swap(TDAT_H, TDAT_L);
macro arg16 %dd
m_memrq_cycles !! TDAT_L = arg_read();
PC++;
m_memrq_cycles !! TDAT_H = arg_read();
PC++;
%dd = TDAT;
macro eax
@arg
@ -94,37 +90,31 @@ macro push %d16
@wm16_sp %d16
macro jp
@arg16
PC = TDAT;
@arg16 PC
WZ = PC;
macro t6a84:jp
@arg16
PC = TDAT;
@arg16 PC
WZ = PC;
paged_jump();
macro jp_cond
if (TDAT8) {
@arg16
PC = TDAT;
@arg16 PC
WZ = PC;
} else {
// implicit do PC += 2
@arg16
WZ = TDAT;
@arg16 WZ
}
macro t6a84:jp_cond
if (TDAT8) {
@arg16
PC = TDAT;
@arg16 PC
WZ = PC;
paged_jump();
} else {
// implicit do PC += 2
@arg16
WZ = TDAT;
@arg16 WZ
}
macro jr
@ -154,16 +144,14 @@ macro jr_cond
}
macro arg16_call
@arg16
m_ea = TDAT;
@arg16 m_ea
@nomreq_addr PC-1
WZ = m_ea;
@wm16_sp PC
PC = m_ea;
macro r800:arg16_call
@arg16
m_ea = TDAT;
@arg16 m_ea
@nomreq_addr PC-1
WZ = m_ea;
@wm16_sp PC
@ -173,8 +161,7 @@ macro call_cond
if (TDAT8) {
@arg16_call
} else {
@arg16
WZ = TDAT;
@arg16 WZ
}
macro ret_cond
@ -287,29 +274,29 @@ macro rld
A = (A & 0xf0) | (TDAT_H >> 4);
set_f((F & CF) | SZP[A]);
macro ex_sp %d16
macro ex_sp %dd
@pop
@nomreq_addr SP-1
@wm16_sp %d16
%d16 = TDAT;
@wm16_sp %dd
%dd = TDAT;
2 * @nomreq_addr SP
WZ = TDAT;
macro add16
macro add16 %dd1 %dd2
{
@nomreq_ir 7
u32 res = TDAT + TDAT2;
WZ = TDAT + 1;
set_f((F & (SF | ZF | VF)) | (((TDAT ^ res ^ TDAT2) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (YF | XF)));
TDAT = (u16)res;
u32 res = %dd1 + %dd2;
WZ = %dd1 + 1;
set_f((F & (SF | ZF | VF)) | (((%dd1 ^ res ^ %dd2) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (YF | XF)));
%dd1 = (u16)res;
}
macro r800:add16
macro r800:add16 %dd1 %dd2
{
u32 res = TDAT + TDAT2;
WZ = TDAT + 1;
set_f((F & (SF | ZF | VF)) | (((TDAT ^ res ^ TDAT2) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (YF | XF)));
TDAT = (u16)res;
u32 res = %dd1 + %dd2;
WZ = %dd1 + 1;
set_f((F & (SF | ZF | VF)) | (((%dd1 ^ res ^ %dd2) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (YF | XF)));
%dd1 = (u16)res;
}
macro adc_hl
@ -3179,10 +3166,7 @@ dd08 # DB DD
@jump 0008
dd09 # ADD IX,BC
TDAT = IX;
TDAT2 = BC;
@add16
IX = TDAT;
@add16 IX, BC
dd0a # DB DD
illegal_1();
@ -3245,10 +3229,7 @@ dd18 # DB DD
@jump 0018
dd19 # ADD IX,DE
TDAT = IX;
TDAT2 = DE;
@add16
IX = TDAT;
@add16 IX, DE
dd1a # DB DD
illegal_1();
@ -3279,12 +3260,10 @@ dd20 # DB DD
@jump 0020
dd21 # LD IX,w
@arg16
IX = TDAT;
@arg16 IX
dd22 # LD (w),IX
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = IX;
@wm16 m_ea
WZ = m_ea + 1;
@ -3312,14 +3291,10 @@ dd28 # DB DD
@jump 0028
dd29 # ADD IX,IX
TDAT = IX;
TDAT2 = IX;
@add16
IX = TDAT;
@add16 IX, IX
dd2a # LD IX,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
IX = TDAT;
WZ = m_ea + 1;
@ -3387,10 +3362,7 @@ dd38 # DB DD
@jump 0038
dd39 # ADD IX,SP
TDAT = IX;
TDAT2 = SP;
@add16
IX = TDAT;
@add16 IX, SP
dd3a # DB DD
illegal_1();
@ -4226,10 +4198,7 @@ fd08 # DB FD
@jump 0008
fd09 # ADD IY,BC
TDAT = IY;
TDAT2 = BC;
@add16
IY = TDAT;
@add16 IY, BC
fd0a # DB FD
illegal_1();
@ -4292,10 +4261,7 @@ fd18 # DB FD
@jump 0018
fd19 # ADD IY,DE
TDAT = IY;
TDAT2 = DE;
@add16
IY = TDAT;
@add16 IY, DE
fd1a # DB FD
illegal_1();
@ -4326,12 +4292,10 @@ fd20 # DB FD
@jump 0020
fd21 # LD IY,w
@arg16
IY = TDAT;
@arg16 IY
fd22 # LD (w),IY
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = IY;
@wm16 m_ea
WZ = m_ea + 1;
@ -4359,14 +4323,10 @@ fd28 # DB FD
@jump 0028
fd29 # ADD IY,IY
TDAT = IY;
TDAT2 = IY;
@add16
IY = TDAT;
@add16 IY, IY
fd2a # LD IY,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
IY = TDAT;
WZ = m_ea + 1;
@ -4434,10 +4394,7 @@ fd38 # DB FD
@jump 0038
fd39 # ADD IY,SP
TDAT = IY;
TDAT2 = SP;
@add16
IY = TDAT;
@add16 IY, SP
fd3a # DB FD
illegal_1();
@ -5444,8 +5401,7 @@ ed42 # SBC HL,BC
@sbc_hl
ed43 # LD (w),BC
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = BC;
@wm16 m_ea
WZ = m_ea + 1;
@ -5478,8 +5434,7 @@ ed4a # ADC HL,BC
@adc_hl
ed4b # LD BC,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
BC = TDAT;
WZ = m_ea + 1;
@ -5512,8 +5467,7 @@ ed52 # SBC HL,DE
@sbc_hl
ed53 # LD (w),DE
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = DE;
@wm16 m_ea
WZ = m_ea + 1;
@ -5546,8 +5500,7 @@ ed5a # ADC HL,DE
@adc_hl
ed5b # LD DE,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
DE = TDAT;
WZ = m_ea + 1;
@ -5580,8 +5533,7 @@ ed62 # SBC HL,HL
@sbc_hl
ed63 # LD (w),HL
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = HL;
@wm16 m_ea
WZ = m_ea + 1;
@ -5614,8 +5566,7 @@ ed6a # ADC HL,HL
@adc_hl
ed6b # LD HL,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
HL = TDAT;
WZ = m_ea + 1;
@ -5647,8 +5598,7 @@ ed72 # SBC HL,SP
@sbc_hl
ed73 # LD (w),SP
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = SP;
@wm16 m_ea
WZ = m_ea + 1;
@ -5681,8 +5631,7 @@ ed7a # ADC HL,SP
@adc_hl
ed7b # LD SP,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
SP = TDAT;
WZ = m_ea + 1;
@ -6090,8 +6039,7 @@ edff # DB ED
0000 # NOP
0001 # LD BC,w
@arg16
BC = TDAT;
@arg16 BC
0002 # LD (BC),A
TDAT8 = A;
@ -6121,10 +6069,7 @@ edff # DB ED
swap(m_af, m_af2);
0009 # ADD HL,BC
TDAT = HL;
TDAT2 = BC;
@add16
HL = TDAT;
@add16 HL, BC
000a # LD A,(BC)
@rm BC
@ -6154,8 +6099,7 @@ edff # DB ED
@jr_cond
0011 # LD DE,w
@arg16
DE = TDAT;
@arg16 DE
0012 # LD (DE),A
TDAT8 = A;
@ -6184,10 +6128,7 @@ edff # DB ED
@jr
0019 # ADD HL,DE
TDAT = HL;
TDAT2 = DE;
@add16
HL = TDAT;
@add16 HL, DE
001a # LD A,(DE)
@rm DE
@ -6216,12 +6157,10 @@ edff # DB ED
@jr_cond
0021 # LD HL,w
@arg16
HL = TDAT;
@arg16 HL
0022 # LD (w),HL
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT = HL;
@wm16 m_ea
WZ = m_ea + 1;
@ -6248,14 +6187,10 @@ edff # DB ED
@jr_cond
0029 # ADD HL,HL
TDAT = HL;
TDAT2 = HL;
@add16
HL = TDAT;
@add16 HL, HL
002a # LD HL,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm16 m_ea
HL = TDAT;
WZ = m_ea + 1;
@ -6283,12 +6218,10 @@ edff # DB ED
@jr_cond
0031 # LD SP,w
@arg16
SP = TDAT;
@arg16 SP
0032 # LD (w),A
@arg16
m_ea = TDAT;
@arg16 m_ea
TDAT8 = A;
@wm m_ea
WZ_L = (m_ea + 1) & 0xFF;
@ -6320,14 +6253,10 @@ edff # DB ED
@jr_cond
0039 # ADD HL,SP
TDAT = HL;
TDAT2 = SP;
@add16
HL = TDAT;
@add16 HL, SP
003a # LD A,(w)
@arg16
m_ea = TDAT;
@arg16 m_ea
@rm m_ea
A = TDAT8;
WZ = m_ea + 1;
@ -8905,15 +8834,15 @@ z80n:ed33 # add bc,a
BC += A;
z80n:ed34 # add hl,**
@arg16
@arg16 TDAT
HL += TDAT;
z80n:ed35 # add de,**
@arg16
@arg16 TDAT
DE += TDAT;
z80n:ed36 # add bc,**
@arg16
@arg16 TDAT
BC += TDAT;
z80n:ed8a # push **
@ -8928,7 +8857,7 @@ z80n:ed90 # outinb
HL++;
z80n:ed91 # nextreg *,*
@arg16
@arg16 TDAT
m_out_nextreg_cb(TDAT_L, TDAT_H);
z80n:ed92 # nextreg *,a

View File

@ -141,14 +141,17 @@ class Opcode:
print("\t\t}", file=f)
class Macro:
def __init__(self, name, arg_name = None):
def __init__(self, name, arg_names = None):
self.name = name
self.source = []
self.arg_name = arg_name
self.arg_names = arg_names
def apply(self, arg):
if self.arg_name is not None:
return [ r.replace(self.arg_name, arg) for r in self.source ]
def apply(self, args):
if self.arg_names is not None:
src = self.source
for i, arg in enumerate(args.split(",")):
src = [ r.replace(self.arg_names[i], arg) for r in src ]
return src
else:
return self.source
@ -184,16 +187,16 @@ class OpcodeList:
# New opcode
tokens = line.split()
if tokens[0] == "macro":
arg_name = None
arg_names = None
if len(tokens) > 2:
arg_name = tokens[2]
arg_names = tokens[2:]
nnames = tokens[1].split(":")
if len(nnames) == 2:
inf = Macro(nnames[1], arg_name)
inf = Macro(nnames[1], arg_names)
if nnames[0] == self.gen:
self.macros[nnames[1]] = inf
else:
inf = Macro(nnames[0], arg_name)
inf = Macro(nnames[0], arg_names)
if None == self.gen:
if nnames[0] in self.macros:
sys.stderr.write("Replacing macro: %s\n" % nnames[0])
@ -242,12 +245,12 @@ class OpcodeList:
for i in range(times):
if line_toc[0].startswith('@'):
name = line_toc[0][1:]
arg = None
args = None
if len(line_toc) > 1:
arg = " ".join(line_toc[1:])
args = " ".join(line_toc[1:])
if name in self.macros:
macro = self.macros[name]
([out.extend(self.pre_process(il)) for il in macro.apply(arg)])
([out.extend(self.pre_process(il)) for il in macro.apply(args)])
else:
sys.stderr.write("Macro not found %s\n" % name)
out.append(iline.with_str("... %s" % name))