mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
(nw) sorcerer: save state support
This commit is contained in:
parent
de7916d677
commit
707679ad82
@ -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 )
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user