From 707679ad825e5e480a867087f6da07a0aded87c0 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 21 May 2020 00:51:15 +1000 Subject: [PATCH] (nw) sorcerer: save state support --- src/mame/drivers/sorcerer.cpp | 11 ++++++----- src/mame/includes/sorcerer.h | 4 ++-- src/mame/machine/sorcerer.cpp | 37 +++++++++++++++++++++++------------ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/mame/drivers/sorcerer.cpp b/src/mame/drivers/sorcerer.cpp index fbf24e61baa..5f6bd274ad8 100644 --- a/src/mame/drivers/sorcerer.cpp +++ b/src/mame/drivers/sorcerer.cpp @@ -705,8 +705,9 @@ ROM_START(sorcererb) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME */ -COMP( 1979, sorcerer, 0, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer", 0 ) -COMP( 1979, sorcerer2, sorcerer, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer 2", 0 ) -COMP( 1979, sorcererd, sorcerer, 0, sorcererd, sorcerer, sorcererd_state, empty_init, "Exidy Inc", "Sorcerer (with Micropolis fdc)", 0 ) -COMP( 1979, sorcerera, sorcerer, 0, sorcerera, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Dreamdisk fdc)", 0 ) -COMP( 1979, sorcererb, sorcerer, 0, sorcererb, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Digitrio fdc)", 0 ) +COMP( 1979, sorcerer, 0, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, sorcerer2, sorcerer, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer 2", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, sorcererd, sorcerer, 0, sorcererd, sorcerer, sorcererd_state, empty_init, "Exidy Inc", "Sorcerer (with Micropolis fdc)", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, sorcerera, sorcerer, 0, sorcerera, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Dreamdisk fdc)", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, sorcererb, sorcerer, 0, sorcererb, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Digitrio fdc)", MACHINE_SUPPORTS_SAVE ) + diff --git a/src/mame/includes/sorcerer.h b/src/mame/includes/sorcerer.h index 475c8f16bcf..fb5db5b59b0 100644 --- a/src/mame/includes/sorcerer.h +++ b/src/mame/includes/sorcerer.h @@ -108,7 +108,7 @@ protected: void sorcerera_io(address_map &map); void sorcererb_io(address_map &map); - u8 m_fe; + u8 m_portfe; u8 m_keyboard_line; emu_timer *m_serial_timer; emu_timer *m_cassette_timer; @@ -178,7 +178,7 @@ private: void port2c_w(u8 data); void intrq2_w(bool state); void drq2_w(bool state); - u8 m_2c; + u8 m_port2c; bool m_wait; bool m_drq_off; bool m_intrq_off; diff --git a/src/mame/machine/sorcerer.cpp b/src/mame/machine/sorcerer.cpp index 2d75555b6a4..7f14dd60246 100644 --- a/src/mame/machine/sorcerer.cpp +++ b/src/mame/machine/sorcerer.cpp @@ -19,7 +19,7 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::serial_tc) Transmit and receive clocks are connected to the same clock. */ /* if rs232 is disabled, receive clock is linked to cassette hardware */ - if (BIT(m_fe, 7)) + if (BIT(m_portfe, 7)) { /* connect to rs232 */ m_rs232->write_txd(m_uart->so_r()); @@ -49,7 +49,7 @@ void sorcerer_state::device_timer(emu_timer &timer, device_timer_id id, int para TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc) { u8 cass_ws = 0; - switch (m_fe & 0xc0) /*/ bit 7 low indicates cassette */ + switch (m_portfe & 0xc0) /*/ bit 7 low indicates cassette */ { case 0x00: /* Cassette 300 baud */ @@ -58,7 +58,7 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc) m_cass_data.input.length++; - cass_ws = ((((m_fe & 0x20) ? m_cassette2 : m_cassette1))->input() > +0.02) ? 1 : 0; + cass_ws = ((((m_portfe & 0x20) ? m_cassette2 : m_cassette1))->input() > +0.02) ? 1 : 0; if (cass_ws != m_cass_data.input.level) { @@ -87,7 +87,7 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc) if (!((m_cass_data.output.bit == 0) && (m_cass_data.output.length & 4))) { m_cass_data.output.level ^= 1; // toggle output this, except on 2nd half of low bit - ((m_fe & 0x20) ? m_cassette2 : m_cassette1)->output(m_cass_data.output.level ? -1.0 : +1.0); + ((m_portfe & 0x20) ? m_cassette2 : m_cassette1)->output(m_cass_data.output.level ? -1.0 : +1.0); } } return; @@ -96,7 +96,7 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc) /* loading a tape */ m_cass_data.input.length++; - cass_ws = ((((m_fe & 0x20) ? m_cassette2 : m_cassette1))->input() > +0.02) ? 1 : 0; + cass_ws = ((((m_portfe & 0x20) ? m_cassette2 : m_cassette1))->input() > +0.02) ? 1 : 0; if (cass_ws != m_cass_data.input.level || m_cass_data.input.length == 10) { @@ -127,7 +127,7 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc) if (!((m_cass_data.output.bit == 0) && (m_cass_data.output.length & 8))) { m_cass_data.output.level ^= 1; // toggle output this, except on 2nd half of low bit - ((m_fe & 0x20) ? m_cassette2 : m_cassette1)->output(m_cass_data.output.level ? -1.0 : +1.0); + ((m_portfe & 0x20) ? m_cassette2 : m_cassette1)->output(m_cass_data.output.level ? -1.0 : +1.0); } } return; @@ -146,7 +146,7 @@ void sorcererd_state::intrq2_w(bool state) m_wait = false; } else - if (BIT(m_2c, 0) && m_drq_off && !m_wait) + if (BIT(m_port2c, 0) && m_drq_off && !m_wait) { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); m_wait = true; @@ -163,7 +163,7 @@ void sorcererd_state::drq2_w(bool state) m_wait = false; } else - if (BIT(m_2c, 0) && m_intrq_off && !m_wait) + if (BIT(m_port2c, 0) && m_intrq_off && !m_wait) { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); m_wait = true; @@ -176,7 +176,7 @@ void sorcererd_state::drq2_w(bool state) // bit 0 = enable wait generator, bit 2 = drive 0 select, bit 5 = ?? void sorcererd_state::port2c_w(u8 data) { - m_2c = data; + m_port2c = data; if (BIT(data, 0)) { @@ -321,8 +321,8 @@ void sorcerer_state::portfd_w(u8 data) void sorcerer_state::portfe_w(u8 data) { - u8 changed_bits = (m_fe ^ data) & 0xf0; - m_fe = data; + u8 changed_bits = (m_portfe ^ data) & 0xf0; + m_portfe = data; /* bits 0..3 */ m_keyboard_line = data & 0x0f; @@ -440,6 +440,10 @@ void sorcerer_state::machine_start_common(offs_t endmem) m_cassette_timer = timer_alloc(TIMER_CASSETTE); m_serial_timer = timer_alloc(TIMER_SERIAL); + // register for savestates + save_item(NAME(m_portfe)); + save_item(NAME(m_keyboard_line)); + address_space &space = m_maincpu->space(AS_PROGRAM); /* configure RAM */ switch (m_ram->size()) @@ -464,11 +468,18 @@ void sorcerer_state::machine_start_common(offs_t endmem) void sorcerer_state::machine_start() { machine_start_common(0xbfff); + save_item(NAME(m_port48)); + save_item(NAME(m_port34)); + save_item(NAME(m_halt)); } void sorcererd_state::machine_start() { machine_start_common(0xbbff); + save_item(NAME(m_port2c)); + save_item(NAME(m_wait)); + save_item(NAME(m_drq_off)); + save_item(NAME(m_intrq_off)); } void sorcerer_state::machine_reset_common() @@ -481,7 +492,7 @@ void sorcerer_state::machine_reset_common() m_cass_data.input.length = 0; m_cass_data.input.bit = 1; - m_fe = 0xff; + m_portfe = 0xff; portfe_w(0); space.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3 @@ -511,7 +522,7 @@ void sorcererd_state::machine_reset() m_drq_off = true; m_intrq_off = true; m_wait = false; - m_2c = 0; + m_port2c = 0; machine_reset_common(); }