i86: don't clear physical irq pins state at reset

This commit is contained in:
hap 2024-12-21 19:45:20 +01:00
parent 780490d9ac
commit 27fa7dec6e
4 changed files with 26 additions and 39 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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);