diff options
Diffstat (limited to 'src/mame/drivers/saitek_stratos.cpp')
-rw-r--r-- | src/mame/drivers/saitek_stratos.cpp | 70 |
1 files changed, 43 insertions, 27 deletions
diff --git a/src/mame/drivers/saitek_stratos.cpp b/src/mame/drivers/saitek_stratos.cpp index 2d6ca005429..9ef63d74484 100644 --- a/src/mame/drivers/saitek_stratos.cpp +++ b/src/mame/drivers/saitek_stratos.cpp @@ -68,7 +68,8 @@ public: m_rombank(*this, "rombank"), m_nvrambank(*this, "nvrambank"), m_board(*this, "board"), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -86,18 +87,19 @@ private: required_memory_bank m_nvrambank; required_device<sensorboard_device> m_board; required_device<dac_bit_interface> m_dac; + required_ioport_array<8+1> m_inputs; void main_map(address_map &map); - void update_leds(); // I/O handlers + void update_leds(); DECLARE_WRITE8_MEMBER(select_w); DECLARE_READ8_MEMBER(chessboard_r); DECLARE_WRITE8_MEMBER(sound_w); DECLARE_WRITE8_MEMBER(leds_w); DECLARE_READ8_MEMBER(control_r); DECLARE_WRITE8_MEMBER(control_w); - DECLARE_READ8_MEMBER(lcd_r); + DECLARE_READ8_MEMBER(lcd_data_r); DECLARE_READ8_MEMBER(extrom_r); std::unique_ptr<u8[]> m_nvram_data; @@ -117,11 +119,13 @@ void saitek_stratos_state::machine_start() // zerofill m_power = false; + m_lcd_ready = false; m_lcd_count = 0; m_lcd_address = 0; // register for savestates save_item(NAME(m_power)); + save_item(NAME(m_lcd_ready)); save_item(NAME(m_lcd_count)); save_item(NAME(m_lcd_address)); save_item(NAME(m_lcd_data)); @@ -130,6 +134,7 @@ void saitek_stratos_state::machine_start() void saitek_stratos_state::machine_reset() { m_power = true; + m_lcd_ready = false; m_lcd_count = 0; clear_lcd(); @@ -241,16 +246,16 @@ void saitek_stratos_state::update_lcd() m_out_digit[0] = 0; // where? - // upper digits + // upper digits (colon is at 0x00) for (int i = 0; i < 4; i++) m_out_digit[i + 1] = (m_lcd_data[0x01 + i * 2] << 4 | m_lcd_data[0x01 + i * 2 + 1]) & 0x7f; - // lower digits + // lower digits (colon is at 0x10) for (int i = 0; i < 4; i++) m_out_digit[i + 5] = (m_lcd_data[0x11 + i * 2] << 4 | m_lcd_data[0x11 + i * 2 + 1]) & 0x7f; } -void saitek_stratos_state::lcd_w(u8 data) +void saitek_stratos_state::lcd_data_w(u8 data) { // d0-d3: lcd data // d4-d7: unused? @@ -274,14 +279,12 @@ void saitek_stratos_state::lcd_w(u8 data) } else m_lcd_count++; - - m_lcd_busy->adjust(attotime::from_usec(50)); // ? } -READ8_MEMBER(stratos_state::lcd_r) +void saitek_stratos_state::lcd_reset_w(u8 data) { - // unknown, maybe resets lcd controller - return 0; + m_lcd_count = 0; + m_lcd_ready = true; } @@ -294,7 +297,7 @@ void stratos_state::update_leds() WRITE8_MEMBER(stratos_state::leds_w) { - // d0-d7: button leds data + // d0-d7: button led data m_led_data = data; update_leds(); @@ -327,11 +330,12 @@ READ8_MEMBER(stratos_state::control_r) if (sel == 8) { - // lcd busy flag? - if (m_lcd_busy->enabled()) + // d5: lcd status flag? + if (m_lcd_ready) data |= 0x20; + m_lcd_ready = false; - // battery low + // d7: battery low data |= m_inputs[8]->read(); } @@ -354,7 +358,7 @@ WRITE8_MEMBER(stratos_state::control_w) m_nvrambank->set_entry((data >> 1) & 1); // d2: mode led state - // d5: button leds select + // d5: button led select update_leds(); // d6 falling edge: power-off request @@ -362,6 +366,13 @@ WRITE8_MEMBER(stratos_state::control_w) power_off(); } +READ8_MEMBER(stratos_state::lcd_data_r) +{ + // reset lcd? + lcd_reset_w(); + return 0; +} + /****************************************************************************** @@ -376,7 +387,7 @@ void stratos_state::main_map(address_map &map) map(0x2400, 0x2400).w(FUNC(stratos_state::leds_w)); map(0x2600, 0x2600).rw(FUNC(stratos_state::control_r), FUNC(stratos_state::control_w)); map(0x2800, 0x37ff).bankrw("nvrambank"); - map(0x3800, 0x3800).rw(FUNC(stratos_state::lcd_r), FUNC(stratos_state::lcd_w)); + map(0x3800, 0x3800).rw(FUNC(stratos_state::lcd_data_r), FUNC(stratos_state::lcd_data_w)); map(0x4000, 0x7fff).r(FUNC(stratos_state::extrom_r)); map(0x8000, 0xffff).bankr("rombank"); } @@ -421,7 +432,7 @@ INPUT_PORTS_START( saitek_stratos ) PORT_START("IN.6") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Library") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Info") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_CUSTOM) // freq sel + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_CUSTOM) // freq sel PORT_START("IN.7") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) @@ -443,9 +454,16 @@ INPUT_PORTS_START( saitek_stratos ) PORT_CONFSETTING( 0x01, "5.67MHz" ) INPUT_PORTS_END -static INPUT_PORTS_START( tking2 ) +static INPUT_PORTS_START( stratos ) PORT_INCLUDE( saitek_stratos ) + PORT_MODIFY("IN.6") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_CUSTOM) +INPUT_PORTS_END + +static INPUT_PORTS_START( tking2 ) + PORT_INCLUDE( stratos ) + PORT_MODIFY("IN.5") PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_CUSTOM) INPUT_PORTS_END @@ -474,8 +492,6 @@ void stratos_state::stratos(machine_config &config) PWM_DISPLAY(config, m_display).set_size(2+4, 8+1); config.set_default_layout(layout_saitek_stratos); - TIMER(config, "lcd_busy").configure_generic(timer_device::expired_delegate()); - /* sound hardware */ SPEAKER(config, "speaker").front_center(); DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); @@ -540,10 +556,10 @@ ROM_END Drivers ******************************************************************************/ -/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1986, stratos, 0, 0, stratos, saitek_stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1986, stratosa, stratos, 0, stratos, saitek_stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) +/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ +CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1986, stratosa, stratos, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1990, tking, 0, 0, tking2, tking2, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 1, ver. D)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II -CONS( 1988, tkinga, tking, 0, stratos, saitek_stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // oldest? -CONS( 1988, tkingb, tking, 0, stratos, saitek_stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, tking, 0, 0, tking2, tking2, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 1, ver. D)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II +CONS( 1988, tkinga, tking, 0, stratos, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // oldest? +CONS( 1988, tkingb, tking, 0, stratos, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) |