From 76ca04e4035bfbb4d147955b63b2a512a4f427d3 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 7 Jul 2019 01:28:31 +0200 Subject: group some saitek drivers (nw) --- scripts/target/mame/mess.lua | 14 +- src/mame/drivers/risc2500.cpp | 325 ---------------- src/mame/drivers/saitek_chesstrv.cpp | 234 ++++++++++++ src/mame/drivers/saitek_cp2000.cpp | 259 +++++++++++++ src/mame/drivers/saitek_risc2500.cpp | 325 ++++++++++++++++ src/mame/drivers/saitek_stratos.cpp | 379 ++++++++++++++++++ src/mame/drivers/scisys_chesstrv.cpp | 234 ------------ src/mame/drivers/scisys_cp2000.cpp | 259 ------------- src/mame/drivers/stratos.cpp | 379 ------------------ src/mame/layout/risc2500.lay | 479 ----------------------- src/mame/layout/saitek_chesstrv.lay | 571 ++++++++++++++++++++++++++++ src/mame/layout/saitek_cp2000.lay | 717 +++++++++++++++++++++++++++++++++++ src/mame/layout/saitek_risc2500.lay | 479 +++++++++++++++++++++++ src/mame/layout/scisys_chesstrv.lay | 571 ---------------------------- src/mame/layout/scisys_cp2000.lay | 717 ----------------------------------- src/mame/mame.lst | 26 +- src/mame/mess.flt | 8 +- 17 files changed, 2988 insertions(+), 2988 deletions(-) delete mode 100644 src/mame/drivers/risc2500.cpp create mode 100644 src/mame/drivers/saitek_chesstrv.cpp create mode 100644 src/mame/drivers/saitek_cp2000.cpp create mode 100644 src/mame/drivers/saitek_risc2500.cpp create mode 100644 src/mame/drivers/saitek_stratos.cpp delete mode 100644 src/mame/drivers/scisys_chesstrv.cpp delete mode 100644 src/mame/drivers/scisys_cp2000.cpp delete mode 100644 src/mame/drivers/stratos.cpp delete mode 100644 src/mame/layout/risc2500.lay create mode 100644 src/mame/layout/saitek_chesstrv.lay create mode 100644 src/mame/layout/saitek_cp2000.lay create mode 100644 src/mame/layout/saitek_risc2500.lay delete mode 100644 src/mame/layout/scisys_chesstrv.lay delete mode 100644 src/mame/layout/scisys_cp2000.lay diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 86b607d703c..83b8b4986dd 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2821,9 +2821,6 @@ files { MAME_DIR .. "src/mame/drivers/novag_savant.cpp", MAME_DIR .. "src/mame/drivers/novag_scon.cpp", MAME_DIR .. "src/mame/drivers/novag_sexpert.cpp", - MAME_DIR .. "src/mame/drivers/ssystem3.cpp", - MAME_DIR .. "src/mame/includes/ssystem3.h", - MAME_DIR .. "src/mame/video/ssystem3.cpp", } createMESSProjects(_target, _subtarget, "olivetti") @@ -3068,11 +3065,11 @@ files { createMESSProjects(_target, _subtarget, "saitek") files { - MAME_DIR .. "src/mame/drivers/risc2500.cpp", + MAME_DIR .. "src/mame/drivers/saitek_chesstrv.cpp", + MAME_DIR .. "src/mame/drivers/saitek_cp2000.cpp", MAME_DIR .. "src/mame/drivers/saitek_delta1.cpp", - MAME_DIR .. "src/mame/drivers/scisys_chesstrv.cpp", - MAME_DIR .. "src/mame/drivers/scisys_cp2000.cpp", - MAME_DIR .. "src/mame/drivers/stratos.cpp", + MAME_DIR .. "src/mame/drivers/saitek_risc2500.cpp", + MAME_DIR .. "src/mame/drivers/saitek_stratos.cpp", } createMESSProjects(_target, _subtarget, "samcoupe") @@ -4059,6 +4056,9 @@ files { MAME_DIR .. "src/mame/includes/softbox.h", MAME_DIR .. "src/mame/drivers/squale.cpp", MAME_DIR .. "src/mame/drivers/solbourne.cpp", + MAME_DIR .. "src/mame/drivers/ssystem3.cpp", + MAME_DIR .. "src/mame/includes/ssystem3.h", + MAME_DIR .. "src/mame/video/ssystem3.cpp", MAME_DIR .. "src/mame/drivers/swyft.cpp", MAME_DIR .. "src/mame/drivers/symbolics.cpp", MAME_DIR .. "src/mame/drivers/sys2900.cpp", diff --git a/src/mame/drivers/risc2500.cpp b/src/mame/drivers/risc2500.cpp deleted file mode 100644 index bb22d416e34..00000000000 --- a/src/mame/drivers/risc2500.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sandro Ronco -/****************************************************************************** - -Saitek RISC 2500, Mephisto Montreux - -The chess engine is also compatible with Tasc's The ChessMachine software. -Was the hardware+software subcontracted to Tasc? It has similarities with Tasc R30. - -notes: -- holding LEFT+RIGHT on boot load the QC TestMode -- holding UP+DOWN on boot load the TestMode - -TODO: -- bootrom disable timer shouldn't be needed, real ARM has already fetched the next opcode -- Sound is too short and high pitched, better when you underclock the cpu. - Is cpu cycle timing wrong? I suspect conditional branch timing due to cache miss - (pipeline has to refill). The delay loop between writing to the speaker is simply: - SUBS R2, R2, #$1, BNE $2000cd8 - -******************************************************************************/ - - -#include "emu.h" -#include "cpu/arm/arm.h" -#include "machine/ram.h" -#include "machine/nvram.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "sound/volt_reg.h" -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - -#include "risc2500.lh" - - -class risc2500_state : public driver_device -{ -public: - risc2500_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_ram(*this, "ram") - , m_nvram(*this, "nvram") - , m_dac(*this, "dac") - , m_board(*this, "board") - , m_inputs(*this, "P%u", 0) - , m_digits(*this, "digit%u", 0U) - , m_syms(*this, "sym%u", 0U) - , m_leds(*this, "led%u", 0U) - { } - - DECLARE_INPUT_CHANGED_MEMBER(on_button); - - void risc2500(machine_config &config); - -protected: - DECLARE_READ32_MEMBER(p1000_r); - DECLARE_WRITE32_MEMBER(p1000_w); - DECLARE_READ32_MEMBER(disable_boot_rom_r); - TIMER_CALLBACK_MEMBER(disable_boot_rom); - - virtual void machine_start() override; - virtual void machine_reset() override; - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void install_boot_rom(); - void remove_boot_rom(); - - void risc2500_mem(address_map &map); - -private: - required_device m_maincpu; - required_device m_ram; - required_device m_nvram; - required_device m_dac; - required_device m_board; - required_ioport_array<8> m_inputs; - output_finder<12> m_digits; - output_finder<14> m_syms; - output_finder<16> m_leds; - - uint32_t m_p1000; - uint16_t m_vram_addr; - uint8_t m_vram[0x100]; - emu_timer *m_boot_rom_disable_timer; -}; - - -void risc2500_state::install_boot_rom() -{ - m_maincpu->space(AS_PROGRAM).install_rom(0x00000000, 0x001ffff, memregion("maincpu")->base()); -} - -void risc2500_state::remove_boot_rom() -{ - m_maincpu->space(AS_PROGRAM).install_ram(0x00000000, m_ram->size() - 1, m_ram->pointer()); -} - -uint32_t risc2500_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - for(int c=0; c<12; c++) - { - // 12 characters 5 x 7 - for(int x=0; x<5; x++) - { - uint8_t gfx = bitswap<8>(m_vram[c*5 + x], 6,5,0,1,2,3,4,7); - - for(int y=0; y<7; y++) - bitmap.pix16(y, 71 - (c*6 + x)) = (gfx >> (y + 1)) & 1; - } - - // LCD digits and symbols - int data_addr = 0x40 + c * 5; - uint16_t data = ((m_vram[data_addr + 1] & 0x3) << 5) | ((m_vram[data_addr + 2] & 0x7) << 2) | (m_vram[data_addr + 4] & 0x3); - data = bitswap<8>(data, 7,3,0,1,4,6,5,2) | ((m_vram[data_addr - 1] & 0x04) ? 0x80 : 0); - - m_digits[c] = data; - m_syms[c] = BIT(m_vram[data_addr + 1], 2); - } - - m_syms[12] = BIT(m_vram[0x63], 0); - m_syms[13] = BIT(m_vram[0x4a], 0); - - return 0; -} - -INPUT_CHANGED_MEMBER(risc2500_state::on_button) -{ - if (newval) - { - install_boot_rom(); - m_maincpu->reset(); - } -} - -static INPUT_PORTS_START( risc2500 ) - PORT_START("P0") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACK") - - PORT_START("P1") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("ENTER") - - PORT_START("P2") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") - - PORT_START("P3") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") - - PORT_START("P4") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MENU") - - PORT_START("P5") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("PLAY") - - PORT_START("P6") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NEW GAME") - - PORT_START("P7") - PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") - PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("OFF") - - PORT_START("RESET") - PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("ON") PORT_CHANGED_MEMBER(DEVICE_SELF, risc2500_state, on_button, 0) -INPUT_PORTS_END - - -READ32_MEMBER(risc2500_state::p1000_r) -{ - uint32_t data = 0; - - for(int i=0; i<8; i++) - { - if (m_p1000 & (1 << i)) - { - data |= m_inputs[i]->read(); - data |= m_board->read_rank(i, true); - } - } - - return data; -} - -WRITE32_MEMBER(risc2500_state::p1000_w) -{ - if ((data & 0xff000000) == 0x01000000) // VRAM address - { - if (data & 0x80) - m_vram_addr = (m_vram_addr & ~0x40) | (data & 0x01 ? 0x40 : 0); - else - m_vram_addr = (m_vram_addr & 0x40) | (data & 0xff); - } - else if (data & 0x04000000) // VRAM write - { - if (!(data & 0x08000000)) - m_vram[m_vram_addr++ & 0x7f] = data & 0xff; - } - else if (data & 0x80000000) // Vertical LED - { - for(int i=0; i<8; i++) - m_leds[i] = BIT(data, i); - } - else if (data & 0x40000000) // Horizontal LED - { - for(int i=0; i<8; i++) - m_leds[8 + i] = BIT(data, i); - } - else if ((data & 0xff000000) == 0x08000000) // Power OFF - { - memset(m_vram, 0, sizeof(m_vram)); - } - - m_dac->write(data >> 28 & 3); // Speaker - - m_p1000 = data; -} - -READ32_MEMBER(risc2500_state::disable_boot_rom_r) -{ - m_boot_rom_disable_timer->adjust(m_maincpu->cycles_to_attotime(10)); - return 0; -} - -TIMER_CALLBACK_MEMBER(risc2500_state::disable_boot_rom) -{ - remove_boot_rom(); -} - -void risc2500_state::machine_start() -{ - m_digits.resolve(); - m_syms.resolve(); - m_leds.resolve(); - - m_nvram->set_base(m_ram->pointer(), m_ram->size()); - - m_boot_rom_disable_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(risc2500_state::disable_boot_rom), this)); - - save_item(NAME(m_p1000)); - save_item(NAME(m_vram_addr)); - save_item(NAME(m_vram)); - - machine().save().register_postload(save_prepost_delegate(FUNC(risc2500_state::remove_boot_rom), this)); -} - -void risc2500_state::machine_reset() -{ - m_p1000 = 0; - m_vram_addr = 0; - - install_boot_rom(); -} - -void risc2500_state::risc2500_mem(address_map &map) -{ - map(0x00000000, 0x0001ffff).ram(); - map(0x01800000, 0x01800003).r(FUNC(risc2500_state::disable_boot_rom_r)); - map(0x01000000, 0x01000003).rw(FUNC(risc2500_state::p1000_r), FUNC(risc2500_state::p1000_w)); - map(0x02000000, 0x0203ffff).rom().region("maincpu", 0); -} - -void risc2500_state::risc2500(machine_config &config) -{ - ARM(config, m_maincpu, XTAL(28'322'000) / 2); // VY86C010 - m_maincpu->set_addrmap(AS_PROGRAM, &risc2500_state::risc2500_mem); - m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); - m_maincpu->set_periodic_int(FUNC(risc2500_state::irq1_line_hold), attotime::from_hz(256)); - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(50); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - screen.set_size(12*6+1, 7); - screen.set_visarea(0, 12*6, 0, 7-1); - screen.set_screen_update(FUNC(risc2500_state::screen_update)); - screen.set_palette("palette"); - - config.set_default_layout(layout_risc2500); - - PALETTE(config, "palette", palette_device::MONOCHROME); - - SENSORBOARD(config, m_board); - m_board->set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(100)); - - RAM(config, m_ram).set_default_size("2M").set_extra_options("128K, 256K, 512K, 1M, 2M"); - - NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); - vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); -} - - -/* ROM definitions */ - -ROM_START( risc ) - ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE ) - ROM_SYSTEM_BIOS( 0, "v104", "v1.04" ) - ROMX_LOAD("s2500_v104.bin", 0x000000, 0x020000, CRC(84a06178) SHA1(66f4d9f53de6da865a3ebb4af1d6a3e245c59a3c), ROM_BIOS(0)) - ROM_SYSTEM_BIOS( 1, "v103", "v1.03" ) - ROMX_LOAD("s2500_v103.bin", 0x000000, 0x020000, CRC(7a707e82) SHA1(87187fa58117a442f3abd30092cfcc2a4d7c7efc), ROM_BIOS(1)) -ROM_END - -ROM_START( montreux ) - ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE ) - ROM_SYSTEM_BIOS( 0, "v100", "v1.00" ) - ROMX_LOAD("montreux.bin", 0x000000, 0x040000, CRC(db374cf3) SHA1(44dd60d56779084326c3dfb41d2137ebf0b4e0ac), ROM_BIOS(0)) -ROM_END - - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1992, risc, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek", "Kasparov RISC 2500", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) -CONS( 1995, montreux, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek", "Mephisto Montreux", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) // after Saitek bought Hegener & Glaser diff --git a/src/mame/drivers/saitek_chesstrv.cpp b/src/mame/drivers/saitek_chesstrv.cpp new file mode 100644 index 00000000000..35520a18960 --- /dev/null +++ b/src/mame/drivers/saitek_chesstrv.cpp @@ -0,0 +1,234 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco, hap +// thanks-to:Sean Riddle +/****************************************************************************** + +SciSys Chess Traveler + +Hardware notes: +- Fairchild 3870 MCU, label SL90387 (does not use the timer or irq at all) +- 256 bytes RAM(3539) +- 4-digit 7seg led panel + +It was also redistributed by Acetronic as "Chess Traveller"(British spelling there), +and by Prinztronic as well, another British brand + +SciSys/Novag's "Chess Champion: Pocket Chess" is assumed to be the same game, +with the exception that they added battery low voltage detection to it (rightmost +digit DP lights up). + +******************************************************************************/ + +#include "emu.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "video/pwm.h" +#include "machine/sensorboard.h" + +// internal artwork +#include "saitek_chesstrv.lh" // clickable + + +namespace { + +class chesstrv_state : public driver_device +{ +public: + chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_inputs(*this, "IN.%u", 0) + { } + + void chesstrv(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_ioport_array<4> m_inputs; + + void chesstrv_mem(address_map &map); + void chesstrv_io(address_map &map); + + void update_display(); + DECLARE_WRITE8_MEMBER(matrix_w); + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_READ8_MEMBER(input_r); + + // 256 bytes data RAM accessed via I/O ports + DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; } + DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; } + DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; } + DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; } + + std::unique_ptr m_ram; + u8 m_ram_address; + u8 m_inp_mux; + u8 m_7seg_data; +}; + +void chesstrv_state::machine_start() +{ + // zerofill + m_ram = make_unique_clear(0x100); + m_ram_address = 0; + m_inp_mux = 0; + m_7seg_data = 0; + + // register for savestates + save_pointer(NAME(m_ram), 0x100); + save_item(NAME(m_ram_address)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_7seg_data)); +} + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// F3870 ports + +void chesstrv_state::update_display() +{ + m_display->matrix(~m_inp_mux, m_7seg_data); +} + +WRITE8_MEMBER(chesstrv_state::digit_w) +{ + // digit segments + m_7seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7) & 0x7f; + update_display(); +} + +WRITE8_MEMBER(chesstrv_state::matrix_w) +{ + // d0-d3: input/digit select (active low) + m_inp_mux = data; + update_display(); +} + +READ8_MEMBER(chesstrv_state::input_r) +{ + u8 data = m_inp_mux; + + // d0-d3: multiplexed inputs from d4-d7 + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i+4)) + data |= m_inputs[i]->read(); + + // d4-d7: multiplexed inputs from d0-d3 + for (int i = 0; i < 4; i++) + if (m_inp_mux & m_inputs[i]->read()) + data |= 1 << (i+4); + + return data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void chesstrv_state::chesstrv_mem(address_map &map) +{ + map.global_mask(0x7ff); + map(0x0000, 0x07ff).rom(); +} + +void chesstrv_state::chesstrv_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_address_r), FUNC(chesstrv_state::ram_address_w)); + map(0x01, 0x01).w(FUNC(chesstrv_state::digit_w)); + map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( chesstrv ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A 1 / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B 2 / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C 3 / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4 / Rook") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E 5 / Queen") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F 6 / King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7 / White") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV / CS") // level/clear square + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("FP") // find position + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("EP") // enter position + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("CB") // clear board + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MM") // multi move + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void chesstrv_state::chesstrv(machine_config &config) +{ + /* basic machine hardware */ + F8(config, m_maincpu, 3000000/2); // Fairchild 3870, measured ~3MHz + m_maincpu->set_addrmap(AS_PROGRAM, &chesstrv_state::chesstrv_mem); + m_maincpu->set_addrmap(AS_IO, &chesstrv_state::chesstrv_io); + + f38t56_device &psu(F38T56(config, "psu", 3000000/2)); + psu.read_a().set(FUNC(chesstrv_state::ram_data_r)); + psu.write_a().set(FUNC(chesstrv_state::ram_data_w)); + psu.read_b().set(FUNC(chesstrv_state::input_r)); + psu.write_b().set(FUNC(chesstrv_state::matrix_w)); + + // built-in chessboard is not electronic + sensorboard_device &board(SENSORBOARD(config, "board").set_type(sensorboard_device::NOSENSORS)); + board.init_cb().set("board", FUNC(sensorboard_device::preset_chess)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_saitek_chesstrv); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( chesstrv ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/saitek_cp2000.cpp b/src/mame/drivers/saitek_cp2000.cpp new file mode 100644 index 00000000000..9d4befeb69f --- /dev/null +++ b/src/mame/drivers/saitek_cp2000.cpp @@ -0,0 +1,259 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:bataais +/****************************************************************************** + +SciSys Chess Partner 2000, also sold by Novag with the same name. +It's probably the last SciSys / Novag collaboration. + +- 3850PK CPU at ~2MHz, 3853PK memory interface +- 4KB ROM, 256 bytes RAM(2*2111N) +- 4-digit 7seg panel, sensory chessboard + +Entering moves is not as friendly as newer sensory games. The player is expected +to press ENTER after their own move, but if they (accidentally) press it after +doing the computer's move, the computer takes your turn. + +Capturing pieces is also unintuitive, having to press the destination square twice. + +******************************************************************************/ + +#include "emu.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "video/pwm.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "saitek_cp2000.lh" // clickable + + +namespace { + +class cp2000_state : public driver_device +{ +public: + cp2000_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine drivers + void cp2000(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_board; + required_device m_dac; + required_ioport_array<4> m_inputs; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + + // I/O handlers + void update_display(); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(digit_w); + DECLARE_READ8_MEMBER(input_r); + + u16 m_inp_mux; + u8 m_select; + u8 m_7seg_data; +}; + +void cp2000_state::machine_start() +{ + // zerofill + m_inp_mux = 0; + m_select = 0; + m_7seg_data = 0; + + // register for savestates + save_item(NAME(m_select)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_7seg_data)); +} + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// CPU I/O ports + +void cp2000_state::update_display() +{ + m_display->matrix(m_select, m_7seg_data); +} + +WRITE8_MEMBER(cp2000_state::control_w) +{ + // d0-d3: digit select + m_select = ~data; + update_display(); + + // d4: keypad/chessboard select + + // d5: speaker out + m_dac->write(BIT(~data, 5)); +} + +READ8_MEMBER(cp2000_state::input_r) +{ + u8 data = m_inp_mux; + + // read chessboard buttons + if (m_select & 0x10) + { + u8 cb = m_board->read_rank((m_inp_mux >> 1 & 7) ^ 3); + if (m_inp_mux & 1) + cb <<= 4; + data |= cb & 0xf0; + } + + // read keypad buttons + else + { + // d0-d3: multiplexed inputs from d4-d7 + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i+4)) + data |= m_inputs[i]->read(); + + // d4-d7: multiplexed inputs from d0-d3 + for (int i = 0; i < 4; i++) + if (m_inp_mux & m_inputs[i]->read()) + data |= 1 << (i+4); + } + + return data; +} + +WRITE8_MEMBER(cp2000_state::digit_w) +{ + // d0-d3: chessboard input mux (demux) + // d0-d7: keypad input mux (direct) + m_inp_mux = data; + + // also digit segment data + m_7seg_data = bitswap<8>(data,0,2,1,3,4,5,6,7); + update_display(); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void cp2000_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).rom(); + map(0x1000, 0x10ff).ram(); +} + +void cp2000_state::main_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(cp2000_state::input_r), FUNC(cp2000_state::digit_w)); + map(0x01, 0x01).w(FUNC(cp2000_state::control_w)); + map(0x0c, 0x0f).rw("f3853", FUNC(f3853_device::read), FUNC(f3853_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cp2000 ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Rook") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Black") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Find Position") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / White") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Enter Position") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Knight") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Cancel EP") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Clear Square / Level") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Queen") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Multi Move") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Clear Board / New Game") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void cp2000_state::cp2000(machine_config &config) +{ + /* basic machine hardware */ + F8(config, m_maincpu, 2000000); + m_maincpu->set_addrmap(AS_PROGRAM, &cp2000_state::main_map); + m_maincpu->set_addrmap(AS_IO, &cp2000_state::main_io); + m_maincpu->set_irq_acknowledge_callback("f3853", FUNC(f3853_device::int_acknowledge)); + + f3853_device &f3853(F3853(config, "f3853", 2000000)); + f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(100)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_saitek_cp2000); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( cp2000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("c55126_y01-rom.u3", 0x0000, 0x1000, CRC(aa7b8536) SHA1(62fb2c5631541e9058e51eb6bdc6e69569baeef3) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/saitek_risc2500.cpp b/src/mame/drivers/saitek_risc2500.cpp new file mode 100644 index 00000000000..7bef7e8a201 --- /dev/null +++ b/src/mame/drivers/saitek_risc2500.cpp @@ -0,0 +1,325 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco +/****************************************************************************** + +Saitek RISC 2500, Mephisto Montreux + +The chess engine is also compatible with Tasc's The ChessMachine software. +Was the hardware+software subcontracted to Tasc? It has similarities with Tasc R30. + +notes: +- holding LEFT+RIGHT on boot load the QC TestMode +- holding UP+DOWN on boot load the TestMode + +TODO: +- bootrom disable timer shouldn't be needed, real ARM has already fetched the next opcode +- Sound is too short and high pitched, better when you underclock the cpu. + Is cpu cycle timing wrong? I suspect conditional branch timing due to cache miss + (pipeline has to refill). The delay loop between writing to the speaker is simply: + SUBS R2, R2, #$1, BNE $2000cd8 + +******************************************************************************/ + + +#include "emu.h" +#include "cpu/arm/arm.h" +#include "machine/ram.h" +#include "machine/nvram.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + +#include "saitek_risc2500.lh" + + +class risc2500_state : public driver_device +{ +public: + risc2500_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_ram(*this, "ram") + , m_nvram(*this, "nvram") + , m_dac(*this, "dac") + , m_board(*this, "board") + , m_inputs(*this, "P%u", 0) + , m_digits(*this, "digit%u", 0U) + , m_syms(*this, "sym%u", 0U) + , m_leds(*this, "led%u", 0U) + { } + + DECLARE_INPUT_CHANGED_MEMBER(on_button); + + void risc2500(machine_config &config); + +protected: + DECLARE_READ32_MEMBER(p1000_r); + DECLARE_WRITE32_MEMBER(p1000_w); + DECLARE_READ32_MEMBER(disable_boot_rom_r); + TIMER_CALLBACK_MEMBER(disable_boot_rom); + + virtual void machine_start() override; + virtual void machine_reset() override; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void install_boot_rom(); + void remove_boot_rom(); + + void risc2500_mem(address_map &map); + +private: + required_device m_maincpu; + required_device m_ram; + required_device m_nvram; + required_device m_dac; + required_device m_board; + required_ioport_array<8> m_inputs; + output_finder<12> m_digits; + output_finder<14> m_syms; + output_finder<16> m_leds; + + uint32_t m_p1000; + uint16_t m_vram_addr; + uint8_t m_vram[0x100]; + emu_timer *m_boot_rom_disable_timer; +}; + + +void risc2500_state::install_boot_rom() +{ + m_maincpu->space(AS_PROGRAM).install_rom(0x00000000, 0x001ffff, memregion("maincpu")->base()); +} + +void risc2500_state::remove_boot_rom() +{ + m_maincpu->space(AS_PROGRAM).install_ram(0x00000000, m_ram->size() - 1, m_ram->pointer()); +} + +uint32_t risc2500_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for(int c=0; c<12; c++) + { + // 12 characters 5 x 7 + for(int x=0; x<5; x++) + { + uint8_t gfx = bitswap<8>(m_vram[c*5 + x], 6,5,0,1,2,3,4,7); + + for(int y=0; y<7; y++) + bitmap.pix16(y, 71 - (c*6 + x)) = (gfx >> (y + 1)) & 1; + } + + // LCD digits and symbols + int data_addr = 0x40 + c * 5; + uint16_t data = ((m_vram[data_addr + 1] & 0x3) << 5) | ((m_vram[data_addr + 2] & 0x7) << 2) | (m_vram[data_addr + 4] & 0x3); + data = bitswap<8>(data, 7,3,0,1,4,6,5,2) | ((m_vram[data_addr - 1] & 0x04) ? 0x80 : 0); + + m_digits[c] = data; + m_syms[c] = BIT(m_vram[data_addr + 1], 2); + } + + m_syms[12] = BIT(m_vram[0x63], 0); + m_syms[13] = BIT(m_vram[0x4a], 0); + + return 0; +} + +INPUT_CHANGED_MEMBER(risc2500_state::on_button) +{ + if (newval) + { + install_boot_rom(); + m_maincpu->reset(); + } +} + +static INPUT_PORTS_START( risc2500 ) + PORT_START("P0") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACK") + + PORT_START("P1") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("ENTER") + + PORT_START("P2") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") + + PORT_START("P3") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") + + PORT_START("P4") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MENU") + + PORT_START("P5") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("PLAY") + + PORT_START("P6") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NEW GAME") + + PORT_START("P7") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("OFF") + + PORT_START("RESET") + PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("ON") PORT_CHANGED_MEMBER(DEVICE_SELF, risc2500_state, on_button, 0) +INPUT_PORTS_END + + +READ32_MEMBER(risc2500_state::p1000_r) +{ + uint32_t data = 0; + + for(int i=0; i<8; i++) + { + if (m_p1000 & (1 << i)) + { + data |= m_inputs[i]->read(); + data |= m_board->read_rank(i, true); + } + } + + return data; +} + +WRITE32_MEMBER(risc2500_state::p1000_w) +{ + if ((data & 0xff000000) == 0x01000000) // VRAM address + { + if (data & 0x80) + m_vram_addr = (m_vram_addr & ~0x40) | (data & 0x01 ? 0x40 : 0); + else + m_vram_addr = (m_vram_addr & 0x40) | (data & 0xff); + } + else if (data & 0x04000000) // VRAM write + { + if (!(data & 0x08000000)) + m_vram[m_vram_addr++ & 0x7f] = data & 0xff; + } + else if (data & 0x80000000) // Vertical LED + { + for(int i=0; i<8; i++) + m_leds[i] = BIT(data, i); + } + else if (data & 0x40000000) // Horizontal LED + { + for(int i=0; i<8; i++) + m_leds[8 + i] = BIT(data, i); + } + else if ((data & 0xff000000) == 0x08000000) // Power OFF + { + memset(m_vram, 0, sizeof(m_vram)); + } + + m_dac->write(data >> 28 & 3); // Speaker + + m_p1000 = data; +} + +READ32_MEMBER(risc2500_state::disable_boot_rom_r) +{ + m_boot_rom_disable_timer->adjust(m_maincpu->cycles_to_attotime(10)); + return 0; +} + +TIMER_CALLBACK_MEMBER(risc2500_state::disable_boot_rom) +{ + remove_boot_rom(); +} + +void risc2500_state::machine_start() +{ + m_digits.resolve(); + m_syms.resolve(); + m_leds.resolve(); + + m_nvram->set_base(m_ram->pointer(), m_ram->size()); + + m_boot_rom_disable_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(risc2500_state::disable_boot_rom), this)); + + save_item(NAME(m_p1000)); + save_item(NAME(m_vram_addr)); + save_item(NAME(m_vram)); + + machine().save().register_postload(save_prepost_delegate(FUNC(risc2500_state::remove_boot_rom), this)); +} + +void risc2500_state::machine_reset() +{ + m_p1000 = 0; + m_vram_addr = 0; + + install_boot_rom(); +} + +void risc2500_state::risc2500_mem(address_map &map) +{ + map(0x00000000, 0x0001ffff).ram(); + map(0x01800000, 0x01800003).r(FUNC(risc2500_state::disable_boot_rom_r)); + map(0x01000000, 0x01000003).rw(FUNC(risc2500_state::p1000_r), FUNC(risc2500_state::p1000_w)); + map(0x02000000, 0x0203ffff).rom().region("maincpu", 0); +} + +void risc2500_state::risc2500(machine_config &config) +{ + ARM(config, m_maincpu, XTAL(28'322'000) / 2); // VY86C010 + m_maincpu->set_addrmap(AS_PROGRAM, &risc2500_state::risc2500_mem); + m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); + m_maincpu->set_periodic_int(FUNC(risc2500_state::irq1_line_hold), attotime::from_hz(256)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(50); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(12*6+1, 7); + screen.set_visarea(0, 12*6, 0, 7-1); + screen.set_screen_update(FUNC(risc2500_state::screen_update)); + screen.set_palette("palette"); + + config.set_default_layout(layout_saitek_risc2500); + + PALETTE(config, "palette", palette_device::MONOCHROME); + + SENSORBOARD(config, m_board); + m_board->set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(100)); + + RAM(config, m_ram).set_default_size("2M").set_extra_options("128K, 256K, 512K, 1M, 2M"); + + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); +} + + +/* ROM definitions */ + +ROM_START( risc2500 ) + ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE ) + ROM_SYSTEM_BIOS( 0, "v104", "v1.04" ) + ROMX_LOAD("s2500_v104.bin", 0x000000, 0x020000, CRC(84a06178) SHA1(66f4d9f53de6da865a3ebb4af1d6a3e245c59a3c), ROM_BIOS(0)) + ROM_SYSTEM_BIOS( 1, "v103", "v1.03" ) + ROMX_LOAD("s2500_v103.bin", 0x000000, 0x020000, CRC(7a707e82) SHA1(87187fa58117a442f3abd30092cfcc2a4d7c7efc), ROM_BIOS(1)) +ROM_END + +ROM_START( montreux ) + ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE ) + ROM_SYSTEM_BIOS( 0, "v100", "v1.00" ) + ROMX_LOAD("montreux.bin", 0x000000, 0x040000, CRC(db374cf3) SHA1(44dd60d56779084326c3dfb41d2137ebf0b4e0ac), ROM_BIOS(0)) +ROM_END + + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +CONS( 1992, risc2500, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek", "Kasparov RISC 2500", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) +CONS( 1995, montreux, 0, 0, risc2500, risc2500, risc2500_state, empty_init, "Saitek", "Mephisto Montreux", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) // after Saitek bought Hegener & Glaser diff --git a/src/mame/drivers/saitek_stratos.cpp b/src/mame/drivers/saitek_stratos.cpp new file mode 100644 index 00000000000..d77f9859ce5 --- /dev/null +++ b/src/mame/drivers/saitek_stratos.cpp @@ -0,0 +1,379 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + Saitek/Scisys Kasparov Stratos Chess Computer + +***************************************************************************/ + +#include "emu.h" +#include "cpu/m6502/m65c02.h" +#include "machine/nvram.h" +#include "machine/timer.h" +#include "screen.h" + +class stratos_state : public driver_device +{ +public: + stratos_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , maincpu(*this, "maincpu") + , nvram(*this, "nvram") + , bank_8000(*this, "bank_8000") + , bank_4000(*this, "bank_4000") + , nvram_bank(*this, "nvram_bank") + { } + + void stratos(machine_config &config); + + void init_stratos(); + +private: + DECLARE_WRITE8_MEMBER(p2000_w); + DECLARE_READ8_MEMBER(p2200_r); + DECLARE_WRITE8_MEMBER(p2200_w); + DECLARE_WRITE8_MEMBER(p2400_w); + DECLARE_READ8_MEMBER(control_r); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_READ8_MEMBER(lcd_r); + DECLARE_WRITE8_MEMBER(lcd_w); + + TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void stratos_mem(address_map &map); + + std::unique_ptr nvram_data; + uint8_t control, led_latch_control; + uint32_t individual_leds; + uint8_t latch_AH_red, latch_AH_green, latch_18_red, latch_18_green; + void show_leds(); + virtual void machine_reset() override; + + required_device maincpu; + required_device nvram; + required_memory_bank bank_8000; + required_memory_bank bank_4000; + required_memory_bank nvram_bank; +}; + +void stratos_state::init_stratos() +{ + nvram_data = std::make_unique(0x2000); + nvram->set_base(nvram_data.get(), 0x2000); + + bank_8000 ->configure_entries(0, 4, memregion("roms_8000")->base(), 0x8000); + bank_4000 ->configure_entries(0, 4, memregion("roms_4000")->base(), 0x4000); + nvram_bank->configure_entries(0, 2, nvram_data.get(), 0x1000); +} + +void stratos_state::machine_reset() +{ + control = 0x00; + led_latch_control = 0x00; + individual_leds = 0x00000; + latch_AH_red = 0; + latch_AH_green = 0; + latch_18_red = 0; + latch_18_green = 0; + bank_8000 ->set_entry(0); + bank_4000 ->set_entry(0); + nvram_bank->set_entry(0); +} + +void stratos_state::show_leds() +{ + static char const *const led_pos[18] = { + nullptr, nullptr, "gPawn", "gKnight", "gBishop", "gRook", "gQueen", "gKing", nullptr, nullptr, "rPawn", "rKnight", "rBishop", "rRook", "rQueen", "rKing", nullptr, nullptr + }; + char str_red[64]; + char str_green[64]; + + char *pr = str_red; + char *pg = str_green; + + *pr = *pg = 0; + + for(int i=0; i != 18; i++) + if(individual_leds & (1 << i)) { + const char *pos = led_pos[i]; + if(!pos) + pr += sprintf(pr, " <%d>", i); + else if(pos[0] == 'r') + pr += sprintf(pr, " %s", pos+1); + else + pg += sprintf(pg, " %s", pos+1); + } + + // Obviously slightly incorrect + if(!(led_latch_control & 8)) { + pr += sprintf(pr, " %c%c", 'A' + latch_AH_red, '1' + latch_18_red); + pg += sprintf(pg, " %c%c", 'A' + latch_AH_green, '1' + latch_18_green); + } + + logerror("leds R:%s -- G:%s (%s)\n", str_red, str_green, machine().describe_context()); +} + +TIMER_DEVICE_CALLBACK_MEMBER(stratos_state::irq_timer) +{ + maincpu->set_input_line(M65C02_IRQ_LINE, HOLD_LINE); +} + +uint32_t stratos_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + static bool nmi=false; + + if(machine().input().code_pressed(KEYCODE_W)) { + if(!nmi) { + maincpu->pulse_input_line(M65C02_NMI_LINE, attotime::zero); + nmi = true; + } + } else + nmi = false; + + + return 0; +} + +WRITE8_MEMBER(stratos_state::p2000_w) +{ + led_latch_control = data; + + if(!(data & 0x10)) + latch_18_red = data & 7; + if(!(data & 0x20)) + latch_18_green = data & 7; + if(!(data & 0x40)) + latch_AH_red = data & 7; + if(!(data & 0x80)) + latch_AH_green = data & 7; + + show_leds(); +} + +READ8_MEMBER(stratos_state::p2200_r) +{ + logerror("p2200_r (%s)\n", machine().describe_context()); + return machine().rand(); +} + +WRITE8_MEMBER(stratos_state::p2200_w) +{ + logerror("p2200_w %02x -> %02x (%s)\n", data, data^0xff, machine().describe_context()); +} + +WRITE8_MEMBER(stratos_state::p2400_w) +{ + if(control & 0x20) { + individual_leds = individual_leds & 0x100ff; + individual_leds |= (data ^ 0xff) << 8; + if(!(control & 0x04)) + individual_leds |= 0x20000; + } else { + individual_leds = individual_leds & 0x2ff00; + individual_leds |= data ^ 0xff; + if(!(control & 0x04)) + individual_leds |= 0x10000; + } +} + +READ8_MEMBER(stratos_state::control_r) +{ + static int xx = 0; + xx = !xx; + // [d659/d630] + // d64e: + // 2000 = f9 + // 2000 = f7 + // 8fb = (2600) & 20 + + // d625: test device? + // 8fb=00 : (00, 80) (05, 80) (06, 80) + // 8fb=20 : (03, 20) (06, 20) (04, 20) + // { 2000=f9, 2000=f0 | first, test (2600) & second + // -> 3-bit mask + // d518: 0c 0a 10 0e 14 18 0b 08 -> 1b, timing on loop at e788 + // d520: 02cc 035b 0219 0266 01ad 0166 0300 0432 -> 8d7/8 + + + // table at f70e (index on d545 somehow): + // 0c 0d 0e 0f 10 11 01 02 + + // table at d545: + // 00 4800 6800 + // 01 4802 6800 + // 02 4800 6802 + // 03 4801 6800 + // 04 4800 6801 + // 05 4801 6801 + // 06 4c00 6800 + // 07 4800 6c00 + // 08 4800 6c00 + // 09 4c00 6800 + // 0a 4c00 6c00 + // 0b 4c00 6c00 + // 0c 4880 6800 + // 0d 4840 6800 + // 0e 4820 6800 + // 0f 4810 6800 + // 10 4808 6800 + // 11 4804 6800 + // 12 4800 6880 + // 13 4800 6840 + // 14 4800 6820 + // 15 4800 6810 + // 16 4800 6808 + // 17 4800 6804 + // 18 4880 6880 + // 19 4840 6840 + // 1a 4820 6820 + // 1b 4810 6810 + // 1c 4808 6808 + // 1d 4804 6804 + + // Power up led test table + // 1208 Ki Green + // 1308 Qu + // 1408 Ro + // 1508 Bi + // 1608 Kn + // 1708 Pa + // 0727 8 + // 0026 7 + // 0025 6 + // 0024 5 + // 0023 4 + // 0022 3 + // 0021 2 + // 0020 1 + // 0080 A + // 0081 B + // 0082 C + // 0083 D + // 0084 E + // 0085 F + // 0086 G + // 0087 H + // 0008 - + // 0c08 Ki Red + // 0d08 Qu + // 0e08 Ro + // 0f08 Bi + // 1008 Kn + // 1108 Pa + // 0108 + // 0208 + // 0308 + // 0408 + // 0617 8 + // 0016 7 + // 0015 6 + // 0014 5 + // 0013 4 + // 0012 3 + // 0011 2 + // 0010 1 + // 0040 A + // 0041 B + // 0042 C + // 0043 D + // 0044 E + // 0045 F + // 0046 G + // 0047 H + // 0009 + // 00c2 + + // (20) = difficulty level + + logerror("control_r (%s)\n", machine().describe_context()); + return xx ? 0x20 : 0x00; +} + +WRITE8_MEMBER(stratos_state::control_w) +{ + logerror("control_w %02x bank %d (%s)\n", data, data & 3, machine().describe_context()); + + control = data; + bank_8000->set_entry(data & 3); + bank_4000->set_entry(data & 3); + nvram_bank->set_entry((data >> 1) & 1); +} + + +READ8_MEMBER(stratos_state::lcd_r) +{ + return 0x00; +} + +WRITE8_MEMBER(stratos_state::lcd_w) +{ + // 08 0b - 00? + // 04 06 - 05 + // 02 0d - 07 + // 01 00 - 05 + + static uint8_t vals[18]; + static int idx = 0; + if(data == 0) + idx = 0; + if(idx/2 >= 18) + return; + if(idx & 1) + vals[idx/2] = (vals[idx/2] & 0xf0) | (data & 0xf); + else + vals[idx/2] = (data & 0xf) << 4; + + idx++; + if(idx == 18*2) { + logerror("lcd"); + for(auto & val : vals) + logerror(" %02x", val); + logerror("\n"); + } +} + +void stratos_state::stratos_mem(address_map &map) +{ + map(0x0000, 0x1fff).ram(); + map(0x2000, 0x2000).w(FUNC(stratos_state::p2000_w)); + map(0x2200, 0x2200).rw(FUNC(stratos_state::p2200_r), FUNC(stratos_state::p2200_w)); + map(0x2400, 0x2400).w(FUNC(stratos_state::p2400_w)); + map(0x2600, 0x2600).rw(FUNC(stratos_state::control_r), FUNC(stratos_state::control_w)); + map(0x2800, 0x37ff).bankrw("nvram_bank"); + map(0x3800, 0x3800).rw(FUNC(stratos_state::lcd_r), FUNC(stratos_state::lcd_w)); + map(0x4000, 0x7fff).bankr("bank_4000"); + map(0x8000, 0xffff).bankr("bank_8000"); +} + +static INPUT_PORTS_START( stratos ) +INPUT_PORTS_END + +void stratos_state::stratos(machine_config &config) +{ + M65C02(config, maincpu, 5670000); + maincpu->set_addrmap(AS_PROGRAM, &stratos_state::stratos_mem); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(50); + screen.set_size(240, 64); + screen.set_visarea(0, 239, 0, 63); + screen.set_screen_update(FUNC(stratos_state::screen_update)); + + TIMER(config, "irq").configure_periodic(FUNC(stratos_state::irq_timer), attotime::from_hz(1000)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); +} + +ROM_START( stratos ) + ROM_REGION(0x20000, "roms_8000", 0) + ROM_LOAD("w1_728m_u3.u3", 0x0000, 0x8000, CRC(b58a7256) SHA1(75b3a3a65f4ca8d52aa5b17a06319bff59d9014f)) + ROM_LOAD("bw1_918n_u4.u4", 0x8000, 0x8000, CRC(cb0de631) SHA1(f78d40213be21775966cbc832d64acd9b73de632)) + ROM_FILL(0x10000, 0x10000, 0xff) + + ROM_REGION(0x10000, "roms_4000", 0) + ROM_FILL(0x00000, 0x10000, 0xff) +ROM_END + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, init_stratos, "SciSys", "Kasparov Stratos", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) diff --git a/src/mame/drivers/scisys_chesstrv.cpp b/src/mame/drivers/scisys_chesstrv.cpp deleted file mode 100644 index ddb2c6ac756..00000000000 --- a/src/mame/drivers/scisys_chesstrv.cpp +++ /dev/null @@ -1,234 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sandro Ronco, hap -// thanks-to:Sean Riddle -/****************************************************************************** - -SciSys Chess Traveler - -Hardware notes: -- Fairchild 3870 MCU, label SL90387 (does not use the timer or irq at all) -- 256 bytes RAM(3539) -- 4-digit 7seg led panel - -It was also redistributed by Acetronic as "Chess Traveller"(British spelling there), -and by Prinztronic as well, another British brand - -SciSys/Novag's "Chess Champion: Pocket Chess" is assumed to be the same game, -with the exception that they added battery low voltage detection to it (rightmost -digit DP lights up). - -******************************************************************************/ - -#include "emu.h" -#include "cpu/f8/f8.h" -#include "machine/f3853.h" -#include "video/pwm.h" -#include "machine/sensorboard.h" - -// internal artwork -#include "scisys_chesstrv.lh" // clickable - - -namespace { - -class chesstrv_state : public driver_device -{ -public: - chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_inputs(*this, "IN.%u", 0) - { } - - void chesstrv(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_ioport_array<4> m_inputs; - - void chesstrv_mem(address_map &map); - void chesstrv_io(address_map &map); - - void update_display(); - DECLARE_WRITE8_MEMBER(matrix_w); - DECLARE_WRITE8_MEMBER(digit_w); - DECLARE_READ8_MEMBER(input_r); - - // 256 bytes data RAM accessed via I/O ports - DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; } - DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; } - DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; } - DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; } - - std::unique_ptr m_ram; - u8 m_ram_address; - u8 m_inp_mux; - u8 m_7seg_data; -}; - -void chesstrv_state::machine_start() -{ - // zerofill - m_ram = make_unique_clear(0x100); - m_ram_address = 0; - m_inp_mux = 0; - m_7seg_data = 0; - - // register for savestates - save_pointer(NAME(m_ram), 0x100); - save_item(NAME(m_ram_address)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_7seg_data)); -} - - - -/****************************************************************************** - Devices, I/O -******************************************************************************/ - -// F3870 ports - -void chesstrv_state::update_display() -{ - m_display->matrix(~m_inp_mux, m_7seg_data); -} - -WRITE8_MEMBER(chesstrv_state::digit_w) -{ - // digit segments - m_7seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7) & 0x7f; - update_display(); -} - -WRITE8_MEMBER(chesstrv_state::matrix_w) -{ - // d0-d3: input/digit select (active low) - m_inp_mux = data; - update_display(); -} - -READ8_MEMBER(chesstrv_state::input_r) -{ - u8 data = m_inp_mux; - - // d0-d3: multiplexed inputs from d4-d7 - for (int i = 0; i < 4; i++) - if (BIT(m_inp_mux, i+4)) - data |= m_inputs[i]->read(); - - // d4-d7: multiplexed inputs from d0-d3 - for (int i = 0; i < 4; i++) - if (m_inp_mux & m_inputs[i]->read()) - data |= 1 << (i+4); - - return data; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void chesstrv_state::chesstrv_mem(address_map &map) -{ - map.global_mask(0x7ff); - map(0x0000, 0x07ff).rom(); -} - -void chesstrv_state::chesstrv_io(address_map &map) -{ - map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_address_r), FUNC(chesstrv_state::ram_address_w)); - map(0x01, 0x01).w(FUNC(chesstrv_state::digit_w)); - map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( chesstrv ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A 1 / Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B 2 / Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C 3 / Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4 / Rook") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E 5 / Queen") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F 6 / King") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7 / White") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV / CS") // level/clear square - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("FP") // find position - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("EP") // enter position - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("CB") // clear board - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MM") // multi move - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void chesstrv_state::chesstrv(machine_config &config) -{ - /* basic machine hardware */ - F8(config, m_maincpu, 3000000/2); // Fairchild 3870, measured ~3MHz - m_maincpu->set_addrmap(AS_PROGRAM, &chesstrv_state::chesstrv_mem); - m_maincpu->set_addrmap(AS_IO, &chesstrv_state::chesstrv_io); - - f38t56_device &psu(F38T56(config, "psu", 3000000/2)); - psu.read_a().set(FUNC(chesstrv_state::ram_data_r)); - psu.write_a().set(FUNC(chesstrv_state::ram_data_w)); - psu.read_b().set(FUNC(chesstrv_state::input_r)); - psu.write_b().set(FUNC(chesstrv_state::matrix_w)); - - // built-in chessboard is not electronic - sensorboard_device &board(SENSORBOARD(config, "board").set_type(sensorboard_device::NOSENSORS)); - board.init_cb().set("board", FUNC(sensorboard_device::preset_chess)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_scisys_chesstrv); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( chesstrv ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) ) -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/scisys_cp2000.cpp b/src/mame/drivers/scisys_cp2000.cpp deleted file mode 100644 index dca0d81a4ff..00000000000 --- a/src/mame/drivers/scisys_cp2000.cpp +++ /dev/null @@ -1,259 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:bataais -/****************************************************************************** - -SciSys Chess Partner 2000, also sold by Novag with the same name. -It's probably the last SciSys / Novag collaboration. - -- 3850PK CPU at ~2MHz, 3853PK memory interface -- 4KB ROM, 256 bytes RAM(2*2111N) -- 4-digit 7seg panel, sensory chessboard - -Entering moves is not as friendly as newer sensory games. The player is expected -to press ENTER after their own move, but if they (accidentally) press it after -doing the computer's move, the computer takes your turn. - -Capturing pieces is also unintuitive, having to press the destination square twice. - -******************************************************************************/ - -#include "emu.h" -#include "cpu/f8/f8.h" -#include "machine/f3853.h" -#include "video/pwm.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "sound/volt_reg.h" -#include "speaker.h" - -// internal artwork -#include "scisys_cp2000.lh" // clickable - - -namespace { - -class cp2000_state : public driver_device -{ -public: - cp2000_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_board(*this, "board"), - m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0) - { } - - // machine drivers - void cp2000(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_device m_board; - required_device m_dac; - required_ioport_array<4> m_inputs; - - // address maps - void main_map(address_map &map); - void main_io(address_map &map); - - // I/O handlers - void update_display(); - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_WRITE8_MEMBER(digit_w); - DECLARE_READ8_MEMBER(input_r); - - u16 m_inp_mux; - u8 m_select; - u8 m_7seg_data; -}; - -void cp2000_state::machine_start() -{ - // zerofill - m_inp_mux = 0; - m_select = 0; - m_7seg_data = 0; - - // register for savestates - save_item(NAME(m_select)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_7seg_data)); -} - - - -/****************************************************************************** - Devices, I/O -******************************************************************************/ - -// CPU I/O ports - -void cp2000_state::update_display() -{ - m_display->matrix(m_select, m_7seg_data); -} - -WRITE8_MEMBER(cp2000_state::control_w) -{ - // d0-d3: digit select - m_select = ~data; - update_display(); - - // d4: keypad/chessboard select - - // d5: speaker out - m_dac->write(BIT(~data, 5)); -} - -READ8_MEMBER(cp2000_state::input_r) -{ - u8 data = m_inp_mux; - - // read chessboard buttons - if (m_select & 0x10) - { - u8 cb = m_board->read_rank((m_inp_mux >> 1 & 7) ^ 3); - if (m_inp_mux & 1) - cb <<= 4; - data |= cb & 0xf0; - } - - // read keypad buttons - else - { - // d0-d3: multiplexed inputs from d4-d7 - for (int i = 0; i < 4; i++) - if (BIT(m_inp_mux, i+4)) - data |= m_inputs[i]->read(); - - // d4-d7: multiplexed inputs from d0-d3 - for (int i = 0; i < 4; i++) - if (m_inp_mux & m_inputs[i]->read()) - data |= 1 << (i+4); - } - - return data; -} - -WRITE8_MEMBER(cp2000_state::digit_w) -{ - // d0-d3: chessboard input mux (demux) - // d0-d7: keypad input mux (direct) - m_inp_mux = data; - - // also digit segment data - m_7seg_data = bitswap<8>(data,0,2,1,3,4,5,6,7); - update_display(); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void cp2000_state::main_map(address_map &map) -{ - map(0x0000, 0x0fff).rom(); - map(0x1000, 0x10ff).ram(); -} - -void cp2000_state::main_io(address_map &map) -{ - map(0x00, 0x00).rw(FUNC(cp2000_state::input_r), FUNC(cp2000_state::digit_w)); - map(0x01, 0x01).w(FUNC(cp2000_state::control_w)); - map(0x0c, 0x0f).rw("f3853", FUNC(f3853_device::read), FUNC(f3853_device::write)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cp2000 ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Rook") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Black") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Find Position") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / White") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Enter Position") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Knight") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / King") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Cancel EP") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Clear Square / Level") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Queen") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Multi Move") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Clear Board / New Game") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Drivers -******************************************************************************/ - -void cp2000_state::cp2000(machine_config &config) -{ - /* basic machine hardware */ - F8(config, m_maincpu, 2000000); - m_maincpu->set_addrmap(AS_PROGRAM, &cp2000_state::main_map); - m_maincpu->set_addrmap(AS_IO, &cp2000_state::main_io); - m_maincpu->set_irq_acknowledge_callback("f3853", FUNC(f3853_device::int_acknowledge)); - - f3853_device &f3853(F3853(config, "f3853", 2000000)); - f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(100)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_scisys_cp2000); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); - VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( cp2000 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("c55126_y01-rom.u3", 0x0000, 0x1000, CRC(aa7b8536) SHA1(62fb2c5631541e9058e51eb6bdc6e69569baeef3) ) -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/stratos.cpp b/src/mame/drivers/stratos.cpp deleted file mode 100644 index d77f9859ce5..00000000000 --- a/src/mame/drivers/stratos.cpp +++ /dev/null @@ -1,379 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert -/*************************************************************************** - - Saitek/Scisys Kasparov Stratos Chess Computer - -***************************************************************************/ - -#include "emu.h" -#include "cpu/m6502/m65c02.h" -#include "machine/nvram.h" -#include "machine/timer.h" -#include "screen.h" - -class stratos_state : public driver_device -{ -public: - stratos_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , maincpu(*this, "maincpu") - , nvram(*this, "nvram") - , bank_8000(*this, "bank_8000") - , bank_4000(*this, "bank_4000") - , nvram_bank(*this, "nvram_bank") - { } - - void stratos(machine_config &config); - - void init_stratos(); - -private: - DECLARE_WRITE8_MEMBER(p2000_w); - DECLARE_READ8_MEMBER(p2200_r); - DECLARE_WRITE8_MEMBER(p2200_w); - DECLARE_WRITE8_MEMBER(p2400_w); - DECLARE_READ8_MEMBER(control_r); - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_READ8_MEMBER(lcd_r); - DECLARE_WRITE8_MEMBER(lcd_w); - - TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - void stratos_mem(address_map &map); - - std::unique_ptr nvram_data; - uint8_t control, led_latch_control; - uint32_t individual_leds; - uint8_t latch_AH_red, latch_AH_green, latch_18_red, latch_18_green; - void show_leds(); - virtual void machine_reset() override; - - required_device maincpu; - required_device nvram; - required_memory_bank bank_8000; - required_memory_bank bank_4000; - required_memory_bank nvram_bank; -}; - -void stratos_state::init_stratos() -{ - nvram_data = std::make_unique(0x2000); - nvram->set_base(nvram_data.get(), 0x2000); - - bank_8000 ->configure_entries(0, 4, memregion("roms_8000")->base(), 0x8000); - bank_4000 ->configure_entries(0, 4, memregion("roms_4000")->base(), 0x4000); - nvram_bank->configure_entries(0, 2, nvram_data.get(), 0x1000); -} - -void stratos_state::machine_reset() -{ - control = 0x00; - led_latch_control = 0x00; - individual_leds = 0x00000; - latch_AH_red = 0; - latch_AH_green = 0; - latch_18_red = 0; - latch_18_green = 0; - bank_8000 ->set_entry(0); - bank_4000 ->set_entry(0); - nvram_bank->set_entry(0); -} - -void stratos_state::show_leds() -{ - static char const *const led_pos[18] = { - nullptr, nullptr, "gPawn", "gKnight", "gBishop", "gRook", "gQueen", "gKing", nullptr, nullptr, "rPawn", "rKnight", "rBishop", "rRook", "rQueen", "rKing", nullptr, nullptr - }; - char str_red[64]; - char str_green[64]; - - char *pr = str_red; - char *pg = str_green; - - *pr = *pg = 0; - - for(int i=0; i != 18; i++) - if(individual_leds & (1 << i)) { - const char *pos = led_pos[i]; - if(!pos) - pr += sprintf(pr, " <%d>", i); - else if(pos[0] == 'r') - pr += sprintf(pr, " %s", pos+1); - else - pg += sprintf(pg, " %s", pos+1); - } - - // Obviously slightly incorrect - if(!(led_latch_control & 8)) { - pr += sprintf(pr, " %c%c", 'A' + latch_AH_red, '1' + latch_18_red); - pg += sprintf(pg, " %c%c", 'A' + latch_AH_green, '1' + latch_18_green); - } - - logerror("leds R:%s -- G:%s (%s)\n", str_red, str_green, machine().describe_context()); -} - -TIMER_DEVICE_CALLBACK_MEMBER(stratos_state::irq_timer) -{ - maincpu->set_input_line(M65C02_IRQ_LINE, HOLD_LINE); -} - -uint32_t stratos_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - static bool nmi=false; - - if(machine().input().code_pressed(KEYCODE_W)) { - if(!nmi) { - maincpu->pulse_input_line(M65C02_NMI_LINE, attotime::zero); - nmi = true; - } - } else - nmi = false; - - - return 0; -} - -WRITE8_MEMBER(stratos_state::p2000_w) -{ - led_latch_control = data; - - if(!(data & 0x10)) - latch_18_red = data & 7; - if(!(data & 0x20)) - latch_18_green = data & 7; - if(!(data & 0x40)) - latch_AH_red = data & 7; - if(!(data & 0x80)) - latch_AH_green = data & 7; - - show_leds(); -} - -READ8_MEMBER(stratos_state::p2200_r) -{ - logerror("p2200_r (%s)\n", machine().describe_context()); - return machine().rand(); -} - -WRITE8_MEMBER(stratos_state::p2200_w) -{ - logerror("p2200_w %02x -> %02x (%s)\n", data, data^0xff, machine().describe_context()); -} - -WRITE8_MEMBER(stratos_state::p2400_w) -{ - if(control & 0x20) { - individual_leds = individual_leds & 0x100ff; - individual_leds |= (data ^ 0xff) << 8; - if(!(control & 0x04)) - individual_leds |= 0x20000; - } else { - individual_leds = individual_leds & 0x2ff00; - individual_leds |= data ^ 0xff; - if(!(control & 0x04)) - individual_leds |= 0x10000; - } -} - -READ8_MEMBER(stratos_state::control_r) -{ - static int xx = 0; - xx = !xx; - // [d659/d630] - // d64e: - // 2000 = f9 - // 2000 = f7 - // 8fb = (2600) & 20 - - // d625: test device? - // 8fb=00 : (00, 80) (05, 80) (06, 80) - // 8fb=20 : (03, 20) (06, 20) (04, 20) - // { 2000=f9, 2000=f0 | first, test (2600) & second - // -> 3-bit mask - // d518: 0c 0a 10 0e 14 18 0b 08 -> 1b, timing on loop at e788 - // d520: 02cc 035b 0219 0266 01ad 0166 0300 0432 -> 8d7/8 - - - // table at f70e (index on d545 somehow): - // 0c 0d 0e 0f 10 11 01 02 - - // table at d545: - // 00 4800 6800 - // 01 4802 6800 - // 02 4800 6802 - // 03 4801 6800 - // 04 4800 6801 - // 05 4801 6801 - // 06 4c00 6800 - // 07 4800 6c00 - // 08 4800 6c00 - // 09 4c00 6800 - // 0a 4c00 6c00 - // 0b 4c00 6c00 - // 0c 4880 6800 - // 0d 4840 6800 - // 0e 4820 6800 - // 0f 4810 6800 - // 10 4808 6800 - // 11 4804 6800 - // 12 4800 6880 - // 13 4800 6840 - // 14 4800 6820 - // 15 4800 6810 - // 16 4800 6808 - // 17 4800 6804 - // 18 4880 6880 - // 19 4840 6840 - // 1a 4820 6820 - // 1b 4810 6810 - // 1c 4808 6808 - // 1d 4804 6804 - - // Power up led test table - // 1208 Ki Green - // 1308 Qu - // 1408 Ro - // 1508 Bi - // 1608 Kn - // 1708 Pa - // 0727 8 - // 0026 7 - // 0025 6 - // 0024 5 - // 0023 4 - // 0022 3 - // 0021 2 - // 0020 1 - // 0080 A - // 0081 B - // 0082 C - // 0083 D - // 0084 E - // 0085 F - // 0086 G - // 0087 H - // 0008 - - // 0c08 Ki Red - // 0d08 Qu - // 0e08 Ro - // 0f08 Bi - // 1008 Kn - // 1108 Pa - // 0108 - // 0208 - // 0308 - // 0408 - // 0617 8 - // 0016 7 - // 0015 6 - // 0014 5 - // 0013 4 - // 0012 3 - // 0011 2 - // 0010 1 - // 0040 A - // 0041 B - // 0042 C - // 0043 D - // 0044 E - // 0045 F - // 0046 G - // 0047 H - // 0009 - // 00c2 - - // (20) = difficulty level - - logerror("control_r (%s)\n", machine().describe_context()); - return xx ? 0x20 : 0x00; -} - -WRITE8_MEMBER(stratos_state::control_w) -{ - logerror("control_w %02x bank %d (%s)\n", data, data & 3, machine().describe_context()); - - control = data; - bank_8000->set_entry(data & 3); - bank_4000->set_entry(data & 3); - nvram_bank->set_entry((data >> 1) & 1); -} - - -READ8_MEMBER(stratos_state::lcd_r) -{ - return 0x00; -} - -WRITE8_MEMBER(stratos_state::lcd_w) -{ - // 08 0b - 00? - // 04 06 - 05 - // 02 0d - 07 - // 01 00 - 05 - - static uint8_t vals[18]; - static int idx = 0; - if(data == 0) - idx = 0; - if(idx/2 >= 18) - return; - if(idx & 1) - vals[idx/2] = (vals[idx/2] & 0xf0) | (data & 0xf); - else - vals[idx/2] = (data & 0xf) << 4; - - idx++; - if(idx == 18*2) { - logerror("lcd"); - for(auto & val : vals) - logerror(" %02x", val); - logerror("\n"); - } -} - -void stratos_state::stratos_mem(address_map &map) -{ - map(0x0000, 0x1fff).ram(); - map(0x2000, 0x2000).w(FUNC(stratos_state::p2000_w)); - map(0x2200, 0x2200).rw(FUNC(stratos_state::p2200_r), FUNC(stratos_state::p2200_w)); - map(0x2400, 0x2400).w(FUNC(stratos_state::p2400_w)); - map(0x2600, 0x2600).rw(FUNC(stratos_state::control_r), FUNC(stratos_state::control_w)); - map(0x2800, 0x37ff).bankrw("nvram_bank"); - map(0x3800, 0x3800).rw(FUNC(stratos_state::lcd_r), FUNC(stratos_state::lcd_w)); - map(0x4000, 0x7fff).bankr("bank_4000"); - map(0x8000, 0xffff).bankr("bank_8000"); -} - -static INPUT_PORTS_START( stratos ) -INPUT_PORTS_END - -void stratos_state::stratos(machine_config &config) -{ - M65C02(config, maincpu, 5670000); - maincpu->set_addrmap(AS_PROGRAM, &stratos_state::stratos_mem); - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(50); - screen.set_size(240, 64); - screen.set_visarea(0, 239, 0, 63); - screen.set_screen_update(FUNC(stratos_state::screen_update)); - - TIMER(config, "irq").configure_periodic(FUNC(stratos_state::irq_timer), attotime::from_hz(1000)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); -} - -ROM_START( stratos ) - ROM_REGION(0x20000, "roms_8000", 0) - ROM_LOAD("w1_728m_u3.u3", 0x0000, 0x8000, CRC(b58a7256) SHA1(75b3a3a65f4ca8d52aa5b17a06319bff59d9014f)) - ROM_LOAD("bw1_918n_u4.u4", 0x8000, 0x8000, CRC(cb0de631) SHA1(f78d40213be21775966cbc832d64acd9b73de632)) - ROM_FILL(0x10000, 0x10000, 0xff) - - ROM_REGION(0x10000, "roms_4000", 0) - ROM_FILL(0x00000, 0x10000, 0xff) -ROM_END - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, init_stratos, "SciSys", "Kasparov Stratos", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) diff --git a/src/mame/layout/risc2500.lay b/src/mame/layout/risc2500.lay deleted file mode 100644 index b2b095749f2..00000000000 --- a/src/mame/layout/risc2500.lay +++ /dev/null @@ -1,479 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/saitek_chesstrv.lay b/src/mame/layout/saitek_chesstrv.lay new file mode 100644 index 00000000000..f71a5902764 --- /dev/null +++ b/src/mame/layout/saitek_chesstrv.lay @@ -0,0 +1,571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/saitek_cp2000.lay b/src/mame/layout/saitek_cp2000.lay new file mode 100644 index 00000000000..d6addead971 --- /dev/null +++ b/src/mame/layout/saitek_cp2000.lay @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/saitek_risc2500.lay b/src/mame/layout/saitek_risc2500.lay new file mode 100644 index 00000000000..b2b095749f2 --- /dev/null +++ b/src/mame/layout/saitek_risc2500.lay @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/scisys_chesstrv.lay b/src/mame/layout/scisys_chesstrv.lay deleted file mode 100644 index f71a5902764..00000000000 --- a/src/mame/layout/scisys_chesstrv.lay +++ /dev/null @@ -1,571 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/layout/scisys_cp2000.lay b/src/mame/layout/scisys_cp2000.lay deleted file mode 100644 index d6addead971..00000000000 --- a/src/mame/layout/scisys_cp2000.lay +++ /dev/null @@ -1,717 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3e54364ef64..d85fafd6a9e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -33658,10 +33658,6 @@ rex6000 // @source:rgum.cpp rgum // -@source:risc2500.cpp -risc // -montreux // - @source:riscpc.cpp a7000 // 1995 Acorn Archimedes 7000 a7000p // 1997 Acorn Archimedes 7000+ @@ -34088,9 +34084,22 @@ safarirj // (c) 1979 Shin Nihon Kikaku (SNK) @source:sage2.cpp sage2 // +@source:saitek_chesstrv.cpp +chesstrv // + +@source:saitek_cp2000.cpp +cp2000 // + @source:saitek_delta1.cpp ccdelta1 // +@source:saitek_risc2500.cpp +risc2500 // +montreux // + +@source:saitek_stratos.cpp +stratos // Kasparov Stratos Chess Computer + @source:sam.cpp 24_130 // 24_140 // @@ -34374,12 +34383,6 @@ sbuggera // (c) 1981 Game-A-Tron sc2 // sc2a // -@source:scisys_chesstrv.cpp -chesstrv // - -@source:scisys_cp2000.cpp -cp2000 // - @source:scm_500.cpp scm_500 // @@ -36512,9 +36515,6 @@ twinbrat // (c) 1995 twinbrata // (c) 1995 twinbratb // (c) 1995 -@source:stratos.cpp -stratos // Kasparov Stratos Chess Computer - @source:strkzn.cpp strkzn // (c) 1994 Purple Star diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 6076cdaeff3..988c0c620aa 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -679,7 +679,6 @@ rd100.cpp rd110.cpp replicator.cpp rex6000.cpp -risc2500.cpp riscpc.cpp rm380z.cpp rmnimbus.cpp @@ -692,7 +691,11 @@ rz1.cpp rzone.cpp sacstate.cpp sage2.cpp +saitek_chesstrv.cpp +saitek_cp2000.cpp saitek_delta1.cpp +saitek_risc2500.cpp +saitek_stratos.cpp samcoupe.cpp sansa_fuze.cpp sapi1.cpp @@ -702,8 +705,6 @@ savia84.cpp sbc6510.cpp sbrain.cpp sc2.cpp -scisys_chesstrv.cpp -scisys_cp2000.cpp scopus.cpp scorpion.cpp scv.cpp @@ -748,7 +749,6 @@ ssem.cpp ssystem3.cpp st17xx.cpp storio.cpp -stratos.cpp studio2.cpp sun1.cpp sun2.cpp -- cgit v1.2.3