From a03b6c6a8daaf1bbf5ec62809367472fb31341ef Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 24 Aug 2019 18:21:04 +0200 Subject: ssystem3: add nvram (nw) --- src/mame/drivers/novag_savant.cpp | 10 ++++++++-- src/mame/drivers/saitek_ssystem3.cpp | 30 +++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/novag_savant.cpp b/src/mame/drivers/novag_savant.cpp index f422b4504fb..f0e37bb471d 100644 --- a/src/mame/drivers/novag_savant.cpp +++ b/src/mame/drivers/novag_savant.cpp @@ -89,6 +89,7 @@ private: void mcu_io(address_map &map); // I/O handlers + DECLARE_WRITE8_MEMBER(nvram_w); DECLARE_READ8_MEMBER(nvram_r); DECLARE_READ8_MEMBER(stall_r); DECLARE_WRITE8_MEMBER(stall_w); @@ -136,9 +137,14 @@ void savant_state::machine_start() // Z80 side -READ8_MEMBER(savant_state::nvram_r) +WRITE8_MEMBER(savant_state::nvram_w) { // nvram is only d0-d3 + m_nvram[offset] = data & 0xf; +} + +READ8_MEMBER(savant_state::nvram_r) +{ return m_nvram[offset] & 0xf; } @@ -273,7 +279,7 @@ void savant_state::main_map(address_map &map) { map(0x0000, 0x5fff).rom(); map(0xc000, 0xcfff).ram(); - map(0xd000, 0xd0ff).mirror(0x0300).ram().r(FUNC(savant_state::nvram_r)).share("nvram"); + map(0xd000, 0xd0ff).mirror(0x0300).ram().rw(FUNC(savant_state::nvram_r), FUNC(savant_state::nvram_w)).share("nvram"); } void savant_state::main_io(address_map &map) diff --git a/src/mame/drivers/saitek_ssystem3.cpp b/src/mame/drivers/saitek_ssystem3.cpp index d09f7d1a7d8..612b6c734f3 100644 --- a/src/mame/drivers/saitek_ssystem3.cpp +++ b/src/mame/drivers/saitek_ssystem3.cpp @@ -52,7 +52,6 @@ TODO: probably to keep refreshing the LCD when inactive, there is no need to emulate it - dump/add chessboard lcd and printer unit - dump/add 1980 program revision, were the BTANB fixed? -- add memory unit BTANB: - If the TIME switch is held up, it will sometimes recognize the wrong input when @@ -91,6 +90,7 @@ public: m_lcd(*this, "lcd"), m_display(*this, "display"), m_dac(*this, "dac"), + m_nvram(*this, "nvram"), m_inputs(*this, "IN.%u", 0) { } @@ -107,13 +107,16 @@ private: required_device m_lcd; required_device m_display; required_device m_dac; - required_ioport_array<4+1> m_inputs; + required_shared_ptr m_nvram; + required_ioport_array<4+2> m_inputs; // address maps void main_map(address_map &map); // I/O handlers DECLARE_WRITE32_MEMBER(lcd_q_w) { m_lcd_q = data; } + DECLARE_WRITE8_MEMBER(nvram_w); + DECLARE_READ8_MEMBER(nvram_r); DECLARE_WRITE8_MEMBER(input_w); DECLARE_READ8_MEMBER(input_r); DECLARE_WRITE8_MEMBER(control_w); @@ -146,6 +149,18 @@ void ssystem3_state::machine_start() I/O ******************************************************************************/ +WRITE8_MEMBER(ssystem3_state::nvram_w) +{ + // nvram is only d0-d3 + if (m_inputs[5]->read() & 1) + m_nvram[offset] = data & 0x0f; +} + +READ8_MEMBER(ssystem3_state::nvram_r) +{ + return (m_inputs[5]->read() & 1) ? (m_nvram[offset] & 0x0f) : 0; +} + WRITE8_MEMBER(ssystem3_state::input_w) { // PA0-PA7: input mux @@ -218,6 +233,7 @@ READ8_MEMBER(ssystem3_state::control_r) void ssystem3_state::main_map(address_map &map) { map(0x0000, 0x03ff).mirror(0x3c00).ram(); + map(0x4000, 0x40ff).mirror(0x1f00).ram().rw(FUNC(ssystem3_state::nvram_r), FUNC(ssystem3_state::nvram_w)).share("nvram"); map(0x6000, 0x600f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); map(0x8000, 0x9fff).mirror(0x6000).rom(); } @@ -260,6 +276,11 @@ static INPUT_PORTS_START( ssystem3 ) PORT_CONFNAME( 0x02, 0x02, "Light" ) PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) PORT_CONFSETTING( 0x02, DEF_STR( On ) ) + + PORT_START("IN.5") // accessories + PORT_CONFNAME( 0x01, 0x01, "Memory Unit" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) INPUT_PORTS_END @@ -280,7 +301,7 @@ void ssystem3_state::ssystem3(machine_config &config) m_via->writepb_handler().set(FUNC(ssystem3_state::control_w)); m_via->readpb_handler().set(FUNC(ssystem3_state::control_r)); - //NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ MD4332B(config, m_lcd); @@ -315,6 +336,9 @@ ROM_START( ssystem3 ) // HACK! 6522 ACR register setup ROM_FILL(0x946d, 1, 0xe0) // was 0xe3 + ROM_REGION( 0x100, "nvram", 0 ) // default settings + ROM_LOAD( "nvram", 0, 0x100, CRC(b5dddc7b) SHA1(3be9ec8359cc9ef16a04f28dfd24f9ffe1a2fca9) ) + ROM_REGION( 53511, "screen", 0) ROM_LOAD( "ssystem3.svg", 0, 53511, CRC(a2820cc8) SHA1(2e922bb2d4a244931c1e7dafa84910dee5ab2623) ) ROM_END -- cgit v1.2.3