summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-07-19 01:50:57 +0200
committer hap <happppp@users.noreply.github.com>2019-07-19 01:50:57 +0200
commit62068a844f0dea769e6bd71903a449a94ce85d9c (patch)
tree1c5e0e9082ed64a05f8bf1964154316fd871f9ea
parent752d51a80bb73dd6fc919bcf9a2bd3e1d27ee1cb (diff)
stratos: add stop/go buttons (nw)
-rw-r--r--src/mame/drivers/saitek_stratos.cpp134
-rw-r--r--src/mame/layout/saitek_stratos.lay2
2 files changed, 85 insertions, 51 deletions
diff --git a/src/mame/drivers/saitek_stratos.cpp b/src/mame/drivers/saitek_stratos.cpp
index 4e29699ad97..71cb4f46291 100644
--- a/src/mame/drivers/saitek_stratos.cpp
+++ b/src/mame/drivers/saitek_stratos.cpp
@@ -10,13 +10,11 @@ TODO:
- add endgame rom (softwarelist?)
- clean up driver
- does nvram work? maybe both ram chips battery-backed
-- add soft power off with STOP button(writes 0 to control_w), power-on with GO button
***************************************************************************/
#include "emu.h"
#include "cpu/m6502/m65c02.h"
-#include "cpu/m6502/r65c02.h"
#include "machine/nvram.h"
#include "machine/sensorboard.h"
#include "machine/timer.h"
@@ -38,6 +36,7 @@ public:
bank_8000(*this, "bank_8000"),
bank_4000(*this, "bank_4000"),
nvram_bank(*this, "nvram_bank"),
+ m_irqtimer(*this, "irqtimer"),
m_lcd_busy(*this, "lcd_busy"),
m_board(*this, "board"),
m_display(*this, "display"),
@@ -47,11 +46,13 @@ public:
void stratos(machine_config &config);
void corona(machine_config &config);
- void tking(machine_config &config);
- void tkingd(machine_config &config);
+ void tking2(machine_config &config);
void init_stratos();
+ DECLARE_INPUT_CHANGED_MEMBER(cpu_freq) { set_cpu_freq(); }
+ DECLARE_INPUT_CHANGED_MEMBER(go_button);
+
private:
DECLARE_WRITE8_MEMBER(p2000_w);
DECLARE_READ8_MEMBER(p2200_r);
@@ -64,7 +65,8 @@ private:
void stratos_mem(address_map &map);
- TIMER_DEVICE_CALLBACK_MEMBER(helios_tick);
+ TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
+ void set_cpu_freq();
std::unique_ptr<uint8_t[]> nvram_data;
uint8_t control, m_select;
@@ -78,12 +80,14 @@ private:
u8 m_lcd_data;
void show_leds();
virtual void machine_reset() override;
+ virtual void machine_start() override;
required_device<m65c02_device> m_maincpu;
required_device<nvram_device> nvram;
required_memory_bank bank_8000;
required_memory_bank bank_4000;
required_memory_bank nvram_bank;
+ required_device<timer_device> m_irqtimer;
required_device<timer_device> m_lcd_busy;
required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display;
@@ -101,28 +105,50 @@ void stratos_state::init_stratos()
nvram_bank->configure_entries(0, 2, nvram_data.get(), 0x1000);
}
+
+void stratos_state::machine_start()
+{
+ control = 0x40;
+}
+
void stratos_state::machine_reset()
{
- control = 0x00;
+ set_cpu_freq();
+ control = 0x40;
m_select = 0x00;
bank_8000 ->set_entry(0);
bank_4000 ->set_entry(0);
nvram_bank->set_entry(0);
}
+void stratos_state::set_cpu_freq()
+{
+ m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? 5.67_MHz_XTAL : 5_MHz_XTAL);
+
+ attotime period = attotime::from_hz(m_maincpu->unscaled_clock() / 0x10000);
+ m_irqtimer->adjust(period, 0, period);
+}
+
void stratos_state::show_leds()
{
m_display->matrix_partial(2, 4, ~m_select >> 4 & 0xf, 1 << (m_select & 0xf), false);
m_display->matrix_partial(0, 2, 1 << (control >> 5 & 1), (~ind_leds & 0xff) | (~control << 6 & 0x100));
}
-TIMER_DEVICE_CALLBACK_MEMBER(stratos_state::helios_tick)
+TIMER_DEVICE_CALLBACK_MEMBER(stratos_state::interrupt)
{
-
-
m_maincpu->set_input_line(M65C02_IRQ_LINE, HOLD_LINE);
}
+INPUT_CHANGED_MEMBER(stratos_state::go_button)
+{
+ if (newval && ~control & 0x40)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
+ machine_reset();
+ }
+}
+
WRITE8_MEMBER(stratos_state::p2000_w)
{
m_dac->write(0); // guessed
@@ -172,12 +198,23 @@ READ8_MEMBER(stratos_state::control_r)
WRITE8_MEMBER(stratos_state::control_w)
{
+ u8 prev = control;
+
control = data;
bank_8000->set_entry(data >> 0 & 1);
bank_4000->set_entry(data >> 1 & 1); // ?
nvram_bank->set_entry((data >> 1) & 1);
show_leds();
+
+ // d6 falling edge: power-off request
+ if (~data & prev & 0x40)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+
+ // clear display
+ m_display->matrix(0, 0);
+ }
}
@@ -209,50 +246,58 @@ void stratos_state::stratos_mem(address_map &map)
static INPUT_PORTS_START( stratos )
PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) // setup
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) // level
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Set Up")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_L) PORT_NAME("Level")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) // sound
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) // stop?
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) // new game?
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Sound")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Stop")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) // rook
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) // pawn
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) // bishop
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Rook")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) // queen
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) // knight
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // king
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Queen")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("King")
PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // play
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) // tab/color
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) // -
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Play")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Tab / Color")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) // +
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) // function
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Function")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) // library
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) // info
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D)
+ 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_HIGH, IPT_UNUSED)
PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) // analysis
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) // normal
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Analysis")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Normal")
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CHANGED_MEMBER(DEVICE_SELF, stratos_state, go_button, nullptr) PORT_NAME("Go")
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, stratos_state, cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "5MHz" )
+ PORT_CONFSETTING( 0x01, "5.67MHz" )
INPUT_PORTS_END
void stratos_state::stratos(machine_config &config)
{
/* basic machine hardware */
- M65C02(config, m_maincpu, 5.67_MHz_XTAL);
+ M65C02(config, m_maincpu, 5_MHz_XTAL); // see set_cpu_freq
m_maincpu->set_addrmap(AS_PROGRAM, &stratos_state::stratos_mem);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -261,7 +306,7 @@ void stratos_state::stratos(machine_config &config)
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(350));
- TIMER(config, "helios").configure_periodic(FUNC(stratos_state::helios_tick), attotime::from_hz(5.67_MHz_XTAL / 0x10000));
+ TIMER(config, "irqtimer").configure_generic(FUNC(stratos_state::interrupt));
TIMER(config, "lcd_busy").configure_generic(timer_device::expired_delegate());
/* video hardware */
@@ -281,21 +326,10 @@ void stratos_state::corona(machine_config &config)
m_board->set_type(sensorboard_device::MAGNETS);
}
-void stratos_state::tking(machine_config &config)
+void stratos_state::tking2(machine_config &config)
{
stratos(config);
- /* basic machine hardware */
- R65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // R65C02P4
- m_maincpu->set_addrmap(AS_PROGRAM, &stratos_state::stratos_mem);
-
- TIMER(config.replace(), "helios").configure_periodic(FUNC(stratos_state::helios_tick), attotime::from_hz(5_MHz_XTAL / 0x10000));
-}
-
-void stratos_state::tkingd(machine_config &config)
-{
- tking(config);
-
// seems much more responsive
m_board->set_delay(attotime::from_msec(200));
}
@@ -360,8 +394,8 @@ ROM_END
CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, init_stratos, "SciSys", "Kasparov Stratos (rev. M)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
CONS( 1986, stratosl, stratos, 0, stratos, stratos, stratos_state, init_stratos, "SciSys", "Kasparov Stratos (rev. L)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1990, tking, 0, 0, tkingd, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. D)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II
-CONS( 1988, tkingl, tking, 0, tking, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. L)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1988, tkingp, tking, 0, tking, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. P)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, tking, 0, 0, tking2, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. D)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II
+CONS( 1988, tkingl, tking, 0, stratos, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. L)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1988, tkingp, tking, 0, stratos, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Turbo King (rev. P)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
CONS( 1988, corona, 0, 0, corona, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Corona (rev. G)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/layout/saitek_stratos.lay b/src/mame/layout/saitek_stratos.lay
index 8cc2fddfd0a..07c8be4afa6 100644
--- a/src/mame/layout/saitek_stratos.lay
+++ b/src/mame/layout/saitek_stratos.lay
@@ -4,7 +4,7 @@
<!-- define elements -->
<element name="black"><rect><color red="0.21" green="0.2" blue="0.2" /></rect></element>
- <element name="text_mode"><text string="Mode" align="1"><color red="0.21" green="0.2" blue="0.2" /></text></element>
+ <element name="text_mode"><text string="Mode" align="1"><color red="0.36" green="0.35" blue="0.35" /></text></element>
<element name="ledo">
<rect><color red="0.1" green="0.1" blue="0.1" /></rect>