summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z80/z80.lst
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/z80/z80.lst')
-rw-r--r--src/devices/cpu/z80/z80.lst110
1 files changed, 61 insertions, 49 deletions
diff --git a/src/devices/cpu/z80/z80.lst b/src/devices/cpu/z80/z80.lst
index 12bd39360ba..a31e651748b 100644
--- a/src/devices/cpu/z80/z80.lst
+++ b/src/devices/cpu/z80/z80.lst
@@ -206,10 +206,14 @@ macro r800:ld_r_a
macro ld_a_r
call nomreq_ir 1
- A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+ A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2));
+ if (HAS_LDAIR_QUIRK)
+ set_service_attention<SA_AFTER_LDAIR, 1>();
macro r800:ld_a_r
- A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+ A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2));
+ if (HAS_LDAIR_QUIRK)
+ set_service_attention<SA_AFTER_LDAIR, 1>();
macro ld_i_a
call nomreq_ir 1
@@ -220,10 +224,14 @@ macro r800:ld_i_a
macro ld_a_i
call nomreq_ir 1
- A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+ A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2));
+ if (HAS_LDAIR_QUIRK)
+ set_service_attention<SA_AFTER_LDAIR, 1>();
macro r800:ld_a_i
- A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+ A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2));
+ if (HAS_LDAIR_QUIRK)
+ set_service_attention<SA_AFTER_LDAIR, 1>();
macro rst addr
TDAT = PC;
@@ -531,8 +539,8 @@ macro r800:otdr
PC -= 2; block_io_interrupted_flags();
}
-macro jump %opcode
- m_ref = 0x%opcode00;
+macro jump %po
+ m_ref = 0x%po00;
goto process;
macro jump_prefixed %prefix
@@ -542,10 +550,9 @@ macro jump_prefixed %prefix
macro take_nmi
// Check if processor was halted
leave_halt();
- #if HAS_LDAIR_QUIRK
+ if (HAS_LDAIR_QUIRK)
// reset parity flag after LD A,I or LD A,R
- if (m_after_ldair) F &= ~PF;
- #endif
+ if (get_service_attention<SA_AFTER_LDAIR>()) F &= ~PF;
m_iff1 = 0;
m_r++;
+ 5
@@ -553,7 +560,7 @@ macro take_nmi
call wm16_sp
PC = 0x0066;
WZ = PC;
- m_nmi_pending = false;
+ set_service_attention<SA_NMI_PENDING, 0>();
macro irqfetch
{
@@ -640,27 +647,26 @@ macro take_interrupt
}
}
WZ = PC;
- #if HAS_LDAIR_QUIRK
+ if (HAS_LDAIR_QUIRK)
// reset parity flag after LD A,I or LD A,R
- if (m_after_ldair) F &= ~PF;
- #endif
+ if (get_service_attention<SA_AFTER_LDAIR>()) F &= ~PF;
macro check_interrupts
- if (m_nmi_pending) {
+ if (get_service_attention<SA_NMI_PENDING>()) {
call take_nmi
- } else if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) {
+ } else if (m_irq_state != CLEAR_LINE && m_iff1 && !get_service_attention<SA_AFTER_EI>()) { // SA_IRQ_ON
call take_interrupt
}
macro z80n:check_interrupts
- if (m_nmi_pending) {
+ if (get_service_attention<SA_NMI_PENDING>()) {
if (m_stackless) {
// on take_nmi
m_out_nextreg_cb(0xc2, m_pc.b.l);
m_out_nextreg_cb(0xc3, m_pc.b.h);
}
call take_nmi
- } else if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) {
+ } else if (m_irq_state != CLEAR_LINE && m_iff1 && !get_service_attention<SA_AFTER_EI>()) {
call take_interrupt
}
@@ -688,17 +694,16 @@ macro nsc800_take_interrupt
;
}
WZ = PC;
- #if HAS_LDAIR_QUIRK
+ if (HAS_LDAIR_QUIRK)
// reset parity flag after LD A,I or LD A,R
- if (m_after_ldair) F &= ~PF;
- #endif
+ if (get_service_attention<SA_AFTER_LDAIR>()) F &= ~PF;
macro nsc800:check_interrupts
- if (m_nmi_pending) {
+ if (get_service_attention<SA_NMI_PENDING>()) {
call take_nmi
- } else if ((m_nsc800_irq_state[0] != CLEAR_LINE || m_nsc800_irq_state[1] != CLEAR_LINE || m_nsc800_irq_state[2] != CLEAR_LINE) && m_iff1 && !m_after_ei) {
+ } else if (get_service_attention<SA_NSC800_IRQ_ON>() && m_iff1 && !get_service_attention<SA_AFTER_EI>()) {
call nsc800_take_interrupt
- } else if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) {
+ } else if (m_irq_state != CLEAR_LINE && m_iff1 && !get_service_attention<SA_AFTER_EI>()) { // SA_IRQ_ON
call take_interrupt
}
@@ -707,35 +712,42 @@ macro nsc800:check_interrupts
# ROP
##########################################################
ffff
- m_ref = 0xffff00;
- if (m_icount <= 0) return;
- if (m_busrq_state) {
- if (!m_busack_state) {
- m_busack_state = 1;
- m_busack_cb(1);
- }
- if (m_icount > 0)
- m_icount = 0;
+ if (m_icount <= 0) {
+ m_ref = 0xffff00;
return;
- } else if (m_busack_state) {
- m_busack_state = 0;
- m_busack_cb(0);
}
- call check_interrupts
- m_after_ei = false;
- m_after_ldair = false;
- if (m_halt) {
- debugger_wait_hook();
- call rop
- PC--;
- continue;
- } else {
- PRVPC = PC;
- debugger_instruction_hook(PC);
- call rop
- m_ref = (0x00 << 16) | (TDAT8 << 8);
- goto process;
+ if (m_service_attention) {
+ if (m_busrq_state) { // SA_BUSRQ
+ if (!m_busack_state) {
+ m_busack_state = 1;
+ set_service_attention<SA_BUSACK, 1>();
+ m_busack_cb(1);
+ }
+ if (m_icount > 0)
+ m_icount = 0;
+ m_ref = 0xffff00;
+ return;
+ } else if (m_busack_state) { // SA_BUSACK
+ m_busack_state = 0;
+ set_service_attention<SA_BUSACK, 0>();
+ m_busack_cb(0);
+ }
+ call check_interrupts
+ set_service_attention<SA_AFTER_EI, 0>(); // SA_AFTER_EI
+ if (HAS_LDAIR_QUIRK)
+ set_service_attention<SA_AFTER_LDAIR, 0>(); // SA_AFTER_LDAIR
+ if (m_halt) { // SA_HALT
+ debugger_wait_hook();
+ call rop
+ PC--;
+ continue;
+ }
}
+ PRVPC = PC;
+ debugger_instruction_hook(PC);
+ call rop
+ m_ref = (0x00 << 16) | (TDAT8 << 8);
+ goto process;
##########################################################