mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
stratos: add stop/go buttons (nw)
This commit is contained in:
parent
752d51a80b
commit
62068a844f
@ -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 )
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user