apple/apple2.cpp,apple2e.cpp: More realistic (Control-)Reset behavior. [R. Belmont]

* The 6502 is now held in reset until you let go of the keys, like hardware
* IIe-class machines now reset the language card and MMU registers, like hardware
This commit is contained in:
arbee 2023-05-18 23:07:09 -04:00
parent 80fdfaaf8c
commit 4890c04318
2 changed files with 70 additions and 10 deletions

View File

@ -177,6 +177,8 @@ private:
int m_inh_bank;
bool m_reset_latch;
double m_x_calibration, m_y_calibration;
device_a2bus_card_interface *m_slotdevice[8];
@ -292,6 +294,7 @@ void apple2_state::machine_start()
}
m_joystick_x1_time = m_joystick_x2_time = m_joystick_y1_time = m_joystick_y2_time = 0;
m_reset_latch = false;
// setup save states
save_item(NAME(m_speaker_state));
@ -307,6 +310,7 @@ void apple2_state::machine_start()
save_item(NAME(m_inh_bank));
save_item(NAME(m_cnxx_slot));
save_item(NAME(m_anykeydown));
save_item(NAME(m_reset_latch));
// setup video pointers
m_video->set_ram_pointers(m_ram_ptr, m_ram_ptr);
@ -337,14 +341,38 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2_state::apple2_interrupt)
{ // CTRL-RESET
if ((m_kbspecial->read() & 0x88) == 0x88)
{
m_maincpu->reset();
if (!m_reset_latch)
{
m_reset_latch = true;
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
}
else
{
if (m_reset_latch)
{
m_reset_latch = false;
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
}
}
else // plain RESET
{
if (m_kbspecial->read() & 0x80)
{
m_maincpu->reset();
if (!m_reset_latch)
{
m_reset_latch = true;
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
}
else
{
if (m_reset_latch)
{
m_reset_latch = false;
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
}
}
}

View File

@ -440,6 +440,7 @@ private:
bool m_romswitch;
bool m_mockingboard4c;
bool m_intc8rom;
bool m_reset_latch;
bool m_isiic, m_isiicplus, m_iscec, m_iscecm, m_iscec2000, m_pal;
u8 m_migram[0x800];
@ -1033,6 +1034,7 @@ void apple2e_state::machine_start()
}
m_joystick_x1_time = m_joystick_x2_time = m_joystick_y1_time = m_joystick_y2_time = 0;
m_reset_latch = false;
// setup save states
save_item(NAME(m_speaker_state));
@ -1111,6 +1113,7 @@ void apple2e_state::machine_start()
save_item(NAME(m_ace2200_axxx_bank));
save_item(NAME(m_laser_speed));
save_item(NAME(m_laser_fdc_on));
save_item(NAME(m_reset_latch));
}
void apple2e_state::machine_reset()
@ -1304,18 +1307,47 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::apple2_interrupt)
// check for ctrl-reset
if ((m_kbspecial->read() & 0x88) == 0x88)
{
m_maincpu->reset();
if (!m_reset_latch)
{
m_reset_latch = true;
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
// reset intcxrom to default
if ((m_isiic) || (m_isace500))
{
m_intcxrom = true;
// As per Sather: LC resets to read ROM, write RAM, no pre-write, bank 2
m_lcram = false;
m_lcram2 = true;
m_lcprewrite = false;
m_lcwriteenable = true;
// More Sather: all MMU switches off (80STORE, RAMRD, RAMWRT, INTCXROM, ALTZP, SLOTC3ROM, PAGE2, HIRES, INTC8ROM)
m_video->a80store_w(false);
m_altzp = false;
m_ramrd = false;
m_ramwrt = false;
m_altzp = false;
m_video->page2_w(false);
m_video->res_w(0);
// reset intcxrom to default
if ((m_isiic) || (m_isace500))
{
m_intcxrom = true;
}
else
{
m_intcxrom = false;
m_slotc3rom = false;
}
auxbank_update();
update_slotrom_banks();
}
else
}
else // user released Control-Reset
{
if (m_reset_latch)
{
m_intcxrom = false;
m_reset_latch = false;
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
update_slotrom_banks();
}
// check Franklin F-keys