Skip to content

Commit fe50bb7

Browse files
authored
cpu/z80: Improved z80 code generation (#13558)
1 parent d914e2a commit fe50bb7

File tree

10 files changed

+25
-34
lines changed

10 files changed

+25
-34
lines changed

src/devices/cpu/z80/nsc800.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ void nsc800_device::device_reset()
4747
//-------------------------------------------------
4848
// execute
4949
//-------------------------------------------------
50-
51-
void nsc800_device::do_op()
50+
void nsc800_device::execute_run()
5251
{
5352
#include "cpu/z80/ncs800.hxx"
5453
}

src/devices/cpu/z80/nsc800.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class nsc800_device : public z80_device
2626
virtual void device_reset() override ATTR_COLD;
2727

2828
// device_execute_interface implementation
29+
virtual void execute_run() override;
2930
virtual void execute_set_input(int inputnum, int state) override;
3031

31-
virtual void do_op() override;
3232
u8 m_nsc800_irq_state[3]; // state of NSC800 restart interrupts A, B, C
3333
};
3434

src/devices/cpu/z80/r800.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void r800_device::muluw(u16 value)
9797
set_f((F & (HF|NF)) | z | c);
9898
}
9999

100-
void r800_device::do_op()
100+
void r800_device::execute_run()
101101
{
102102
#include "cpu/z80/r800.hxx"
103103
}

src/devices/cpu/z80/r800.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ class r800_device : public z80_device
3333
// device_execute_interface overrides
3434
virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 4 - 1) / 4; }
3535
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 4); }
36+
virtual void execute_run() override;
3637

3738
// device_disasm_interface implementation
3839
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
3940

4041
u8 r800_sll(u8 value);
4142
void mulub(u8 value);
4243
void muluw(u16 value);
43-
44-
virtual void do_op() override;
4544
};
4645

4746
// device type declaration

src/devices/cpu/z80/z80.cpp

+1-15
Original file line numberDiff line numberDiff line change
@@ -699,26 +699,12 @@ void z80_device::device_reset()
699699
m_iff2 = 0;
700700
}
701701

702-
void z80_device::do_op()
703-
{
704-
#include "cpu/z80/z80.hxx"
705-
}
706-
707702
/****************************************************************************
708703
* Execute 'cycles' T-states.
709704
****************************************************************************/
710705
void z80_device::execute_run()
711706
{
712-
if (m_wait_state)
713-
{
714-
m_icount = 0; // stalled
715-
return;
716-
}
717-
718-
while (m_icount > 0)
719-
{
720-
do_op();
721-
}
707+
#include "cpu/z80/z80.hxx"
722708
}
723709

724710
void z80_device::execute_set_input(int inputnum, int state)

src/devices/cpu/z80/z80.h

-2
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ class z80_device : public cpu_device, public z80_daisy_chain_interface
121121
void set_f(u8 f);
122122
void block_io_interrupted_flags();
123123

124-
virtual void do_op();
125-
126124
virtual u8 data_read(u16 addr);
127125
virtual void data_write(u16 addr, u8 value);
128126
virtual u8 stack_read(u16 addr) { return data_read(addr); }

src/devices/cpu/z80/z80.lst

+7-5
Original file line numberDiff line numberDiff line change
@@ -508,11 +508,11 @@ macro r800:otdr
508508

509509
macro jump %opcode
510510
m_ref = 0x%opcode00;
511-
if (true) return;
511+
continue;
512512

513513
macro jump_prefixed %prefix
514514
m_ref = (%prefix << 16) | (TDAT8 << 8);
515-
if (true) return;
515+
continue;
516516

517517
macro take_nmi
518518
// Check if processor was halted
@@ -671,6 +671,9 @@ macro ncs800:check_interrupts
671671
# ROP
672672
##########################################################
673673
ffff
674+
rop:
675+
m_ref = 0xffff00;
676+
if (m_icount <= 0) return;
674677
if (m_busrq_state) {
675678
if (!m_busack_state) {
676679
m_busack_state = 1;
@@ -690,14 +693,13 @@ ffff
690693
debugger_wait_hook();
691694
call rop
692695
PC--;
693-
m_ref = 0xffff00;
694-
return;
696+
goto rop;
695697
} else {
696698
PRVPC = PC;
697699
debugger_instruction_hook(PC);
698700
call rop
699701
m_ref = (0x00 << 16) | (TDAT8 << 8);
700-
return;
702+
continue;
701703
}
702704

703705

src/devices/cpu/z80/z80make.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ def save_dasm(self, f):
6666
step = 0
6767
for i in range(0, len(self.source)):
6868
il = self.source[i]
69+
if not has_steps:
70+
il.indent = ""
6971
line = il.line()
7072
tokens = line.split()
7173
if tokens[0] == '+':
@@ -220,6 +222,12 @@ def pre_process(self, iline):
220222

221223
def save_exec(self, f):
222224
prefix = None
225+
print("if (m_wait_state)", file=f)
226+
print("{", file=f)
227+
print("\tm_icount = 0; // stalled", file=f)
228+
print("\treturn;", file=f)
229+
print("}", file=f)
230+
print("while (true) {", file=f)
223231
print("switch (u8(m_ref >> 16)) // prefix", file=f)
224232
print("{", file=f)
225233
for opc in self.opcode_info:
@@ -237,18 +245,16 @@ def save_exec(self, f):
237245
print("\tswitch (u8(m_ref >> 8)) // opcode", file=f)
238246
print("\t{", file=f)
239247
print("\tcase 0x%s:" % (opc.code[2:]), file=f)
240-
#print("\t{", file=f)
241248
opc.save_dasm(f)
242-
#print("\t}", file=f)
243-
print("\t\tbreak;", file=f)
249+
print("\t\tgoto rop;", file=f)
244250
print("", file=f)
245251
print("\t} // switch opcode", file=f)
246252
print("}", file=f)
247253
print("break; // prefix: 0x%s" % (prefix), file=f)
248254
print("", file=f)
249255
print("} // switch prefix", file=f)
250256
print("", file=f)
251-
print("m_ref = 0xffff00;", file=f)
257+
print("} // while (true)", file=f)
252258

253259
def main(argv):
254260
if len(argv) != 3 and len(argv) != 4:

src/devices/cpu/z80/z80n.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ z80n_device::z80n_device(const machine_config &mconfig, const char *tag, device_
3131
{
3232
}
3333

34-
void z80n_device::do_op()
34+
void z80n_device::execute_run()
3535
{
3636
#include "cpu/z80/z80n.hxx"
3737
}

src/devices/cpu/z80/z80n.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ class z80n_device : public z80_device
2626
virtual void device_start() override ATTR_COLD;
2727
virtual void device_reset() override ATTR_COLD;
2828

29-
virtual void do_op() override;
29+
// device_execute_interface implementation
30+
virtual void execute_run() override;
3031

3132
devcb_write8 m_out_retn_seen_cb;
3233
devcb_read8 m_in_nextreg_cb;

0 commit comments

Comments
 (0)