From 27fa7dec6ec35b470500d2eee4e83e1a88d03878 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Dec 2024 19:45:20 +0100 Subject: i86: don't clear physical irq pins state at reset --- src/devices/cpu/i86/i286.cpp | 14 +++++--------- src/devices/cpu/i86/i86.cpp | 17 ++++------------- src/devices/cpu/i86/i86.h | 1 - src/mame/atari/atarig1.h | 33 +++++++++++++++++---------------- 4 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/devices/cpu/i86/i286.cpp b/src/devices/cpu/i86/i286.cpp index b18abd01f89..bfe4dc7c728 100644 --- a/src/devices/cpu/i86/i286.cpp +++ b/src/devices/cpu/i86/i286.cpp @@ -384,21 +384,16 @@ void i80286_cpu_device::execute_set_input(int inptnum, int state) { if(inptnum == INPUT_LINE_NMI) { - if(m_nmi_state == state) - { - return; - } - m_nmi_state = state; - if(state != CLEAR_LINE) + if(!m_nmi_state && state) { m_pending_irq |= NMI_IRQ; } + m_nmi_state = state; } else if(inptnum == INPUT_LINE_A20) m_amask = m_a20_callback(state); else { - m_irq_state = state; if(state == CLEAR_LINE) { m_pending_irq &= ~INT_IRQ; @@ -760,7 +755,7 @@ void i80286_cpu_device::code_descriptor(uint16_t selector, uint16_t offset, int throw TRAP(FAULT_GP, IDXTBL(selector)); if(!PRES(r)) - throw TRAP(FAULT_NP, IDXTBL(selector)); // this order is important + throw TRAP(FAULT_NP, IDXTBL(selector)); // this order is important if(offset > LIMIT(desc)) throw TRAP(FAULT_GP, 0); @@ -774,7 +769,8 @@ void i80286_cpu_device::code_descriptor(uint16_t selector, uint16_t offset, int m_prev_ip = m_ip = offset; } else - { // systemdescriptor + { + // systemdescriptor uint16_t gatesel = GATESEL(desc); if(!gate) diff --git a/src/devices/cpu/i86/i86.cpp b/src/devices/cpu/i86/i86.cpp index 55f6de6b458..9d6ca4cf384 100644 --- a/src/devices/cpu/i86/i86.cpp +++ b/src/devices/cpu/i86/i86.cpp @@ -367,7 +367,6 @@ i8086_common_cpu_device::i8086_common_cpu_device(const machine_config &mconfig, , m_int_vector(0) , m_pending_irq(0) , m_nmi_state(0) - , m_irq_state(0) , m_test_state(1) , m_pc(0) , m_lock(false) @@ -489,7 +488,6 @@ void i8086_common_cpu_device::device_start() save_item(NAME(m_int_vector)); save_item(NAME(m_pending_irq)); save_item(NAME(m_nmi_state)); - save_item(NAME(m_irq_state)); save_item(NAME(m_AuxVal)); save_item(NAME(m_OverVal)); save_item(NAME(m_ZeroVal)); @@ -555,9 +553,7 @@ void i8086_common_cpu_device::device_reset() m_NT = 1; // 8086 NT always 1 m_MF = 1; // 8086 MF always 1, 80286 always 0 m_int_vector = 0; - m_pending_irq = 0; - m_nmi_state = 0; - m_irq_state = 0; + m_pending_irq &= INT_IRQ; m_no_interrupt = 0; m_fire_trap = 0; m_prefix_seg = 0; @@ -577,7 +573,7 @@ void i8086_common_cpu_device::device_reset() void i8086_common_cpu_device::interrupt(int int_num, int trap) { - PUSH( CompressFlags() ); + PUSH(CompressFlags()); m_TF = m_IF = 0; if (int_num == -1) @@ -599,15 +595,11 @@ void i8086_common_cpu_device::execute_set_input( int inptnum, int state ) { if (inptnum == INPUT_LINE_NMI) { - if ( m_nmi_state == state ) - { - return; - } - m_nmi_state = state; - if (state != CLEAR_LINE) + if (!m_nmi_state && state) { m_pending_irq |= NMI_IRQ; } + m_nmi_state = state; } else if (inptnum == INPUT_LINE_TEST) { @@ -615,7 +607,6 @@ void i8086_common_cpu_device::execute_set_input( int inptnum, int state ) } else { - m_irq_state = state; if (state == CLEAR_LINE) { m_pending_irq &= ~INT_IRQ; diff --git a/src/devices/cpu/i86/i86.h b/src/devices/cpu/i86/i86.h index 5f67265638e..3ceb94f672d 100644 --- a/src/devices/cpu/i86/i86.h +++ b/src/devices/cpu/i86/i86.h @@ -290,7 +290,6 @@ protected: uint32_t m_int_vector; uint32_t m_pending_irq; uint32_t m_nmi_state; - uint32_t m_irq_state; uint8_t m_no_interrupt; uint8_t m_fire_trap; uint8_t m_test_state; diff --git a/src/mame/atari/atarig1.h b/src/mame/atari/atarig1.h index c9e5df83bae..43a8b627ea0 100644 --- a/src/mame/atari/atarig1.h +++ b/src/mame/atari/atarig1.h @@ -18,17 +18,18 @@ class atarig1_state : public atarigen_state { public: - atarig1_state(const machine_config &mconfig, device_type type, const char *tag) - : atarigen_state(mconfig, type, tag), - m_slapstic(*this, "slapstic"), - m_slapstic_bank(*this, "slapstic_bank"), - m_jsa(*this, "jsa"), - m_playfield_tilemap(*this, "playfield"), - m_alpha_tilemap(*this, "alpha"), - m_rle(*this, "rle"), - m_adc(*this, "adc"), - m_in1(*this, "IN1"), - m_mo_command(*this, "mo_command") { } + atarig1_state(const machine_config &mconfig, device_type type, const char *tag) : + atarigen_state(mconfig, type, tag), + m_slapstic(*this, "slapstic"), + m_slapstic_bank(*this, "slapstic_bank"), + m_jsa(*this, "jsa"), + m_playfield_tilemap(*this, "playfield"), + m_alpha_tilemap(*this, "alpha"), + m_rle(*this, "rle"), + m_adc(*this, "adc"), + m_in1(*this, "IN1"), + m_mo_command(*this, "mo_command") + { } void atarig1(machine_config &config); void pfslap111(machine_config &config); @@ -64,11 +65,11 @@ private: bool m_bslapstic_primed = false; - uint8_t m_pfscroll_xoffset = 0; - uint16_t m_current_control = 0; - uint8_t m_playfield_tile_bank = 0; - uint16_t m_playfield_xscroll = 0; - uint16_t m_playfield_yscroll = 0; + uint8_t m_pfscroll_xoffset = 0; + uint16_t m_current_control = 0; + uint8_t m_playfield_tile_bank = 0; + uint16_t m_playfield_xscroll = 0; + uint16_t m_playfield_yscroll = 0; void video_int_ack_w(uint16_t data = 0); TIMER_DEVICE_CALLBACK_MEMBER(scanline_update); -- cgit v1.2.3