summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/saitek_ssystem3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/saitek_ssystem3.cpp')
-rw-r--r--src/mame/drivers/saitek_ssystem3.cpp359
1 files changed, 0 insertions, 359 deletions
diff --git a/src/mame/drivers/saitek_ssystem3.cpp b/src/mame/drivers/saitek_ssystem3.cpp
deleted file mode 100644
index 2cef2729391..00000000000
--- a/src/mame/drivers/saitek_ssystem3.cpp
+++ /dev/null
@@ -1,359 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Berger
-/******************************************************************************
-
-SciSys / Novag Chess Champion: Super System III (aka MK III), distributed by
-both SciSys and Novag. Which company was responsible for which part of the
-manufacturing chain is unknown. The software is by SciSys (no mention of Novag
-in the ROM, it has "COPYRIGHT SCISYS LTD 1979").
-
-This is their 1st original product. MK II was licensed from Commodore, and
-MK I was, to put it bluntly, a bootleg. The chess engine is by Mike Johnson,
-with support from David Levy.
-
-Hardware notes: (main unit)
-- Synertek 6502A @ 2MHz (4MHz XTAL)
-- Synertek 6522 VIA
-- 8KB ROM (2*Synertek 2332)
-- 1KB RAM (2*HM472114P-3)
-- MD4332BE + a bunch of TTL for the LCD
-- 13 buttons, 4 switches, no leds or sensorboard
-- connectors for: PSU, Power Pack, Chess Unit, Printer Unit
-
-Chess Unit:
-- PCB label: Radofin XM-2057-0C
-- Fairchild F6808P CPU @ ?MHz (M6808 compatible)
-- Fairchild F6821P PIA
-- C28A97M 4KB ROM(2332), 128x8 RAM(F6810P)
-- 2*HLCD0438, chessboard LCD
-
-Printer Unit:
-- unknown hardware, assume own CPU like the chess unit
-
-PSU ("permanent storage unit"?) is just a 256x4 battery-backed RAM (TC5501P)
-module, not sure why it was so expensive (~180DM).
-A chess clock accessory was also announced but unreleased.
-
-SciSys Super System IV is on similar hardware.
-
-TODO:
-- 6522 ACR register is initialized with 0xe3. Meaning: PA and PB inputs are set
- to latch mode, but the program then never clocks the latch, it functions as if
- it meant to write 0xe0. Maybe 6522 CA1 pin emulation is wrong? Documentation
- says it's edge-triggered, but here it's tied to VCC. I added a trivial hack to
- work around this, see rom defs.
-- 6522 timer runs too fast, currently worked around by clocking it at 1MHz. PB6/PB7
- was measured 997Hz on real device, it's 1989Hz on MAME at 2MHz, both 50% duty cycle.
-- 2nd 7474 /2 clock divider on each 4000-7fff access, this also applies to 6522 clock
- (doesn't affect chess calculation speed, only I/O access, eg. beeper pitch).
- Should be doable to add, but 6522 device doesn't support live clock changes.
-- LCD TC pin? connects to the display, source is a 50hz timer(from power supply),
- probably to keep refreshing the LCD when inactive, there is no need to emulate it
-- dump/add chessboard lcd and printer unit
-- dump/add 1980 program revision, were the BTANB fixed?
-
-BTANB:
-- If the TIME switch is held up, it will sometimes recognize the wrong input when
- another button is pressed. I assume they noticed this bug too late and tried to
- lessen the chance by adding a spring to the switch.
-- Similar to the TIME switch bug, pressing 2 buttons simultaneously can cause it
- to malfunction, eg. press A+CE or C+CE and an "8" appears in the display.
-
-******************************************************************************/
-
-#include "emu.h"
-#include "cpu/m6502/m6502.h"
-#include "machine/6522via.h"
-#include "machine/nvram.h"
-#include "sound/dac.h"
-#include "sound/volt_reg.h"
-#include "video/md4330b.h"
-#include "video/pwm.h"
-
-#include "screen.h"
-#include "speaker.h"
-
-// internal artwork
-#include "saitek_ssystem3.lh" // clickable
-
-
-namespace {
-
-class ssystem3_state : public driver_device
-{
-public:
- ssystem3_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_via(*this, "via"),
- m_lcd(*this, "lcd"),
- m_display(*this, "display"),
- m_dac(*this, "dac"),
- m_nvram(*this, "nvram"),
- m_inputs(*this, "IN.%u", 0)
- { }
-
- // machine drivers
- void ssystem3(machine_config &config);
-
-protected:
- virtual void machine_start() override;
-
-private:
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- required_device<via6522_device> m_via;
- required_device<md4332b_device> m_lcd;
- required_device<pwm_display_device> m_display;
- required_device<dac_bit_interface> m_dac;
- required_shared_ptr<u8> m_nvram;
- required_ioport_array<4+2> m_inputs;
-
- // address maps
- void main_map(address_map &map);
-
- // I/O handlers
- DECLARE_WRITE32_MEMBER(lcd_q_w) { m_lcd_q = data; }
- DECLARE_WRITE8_MEMBER(nvram_w);
- DECLARE_READ8_MEMBER(nvram_r);
- DECLARE_WRITE8_MEMBER(input_w);
- DECLARE_READ8_MEMBER(input_r);
- DECLARE_WRITE8_MEMBER(control_w);
- DECLARE_READ8_MEMBER(control_r);
-
- u8 m_inp_mux;
- u8 m_control;
- u8 m_shift;
- u32 m_lcd_q;
-};
-
-void ssystem3_state::machine_start()
-{
- // zerofill
- m_inp_mux = 0;
- m_control = 0;
- m_shift = 0;
- m_lcd_q = 0;
-
- // register for savestates
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_control));
- save_item(NAME(m_shift));
- save_item(NAME(m_lcd_q));
-}
-
-
-
-/******************************************************************************
- I/O
-******************************************************************************/
-
-WRITE8_MEMBER(ssystem3_state::nvram_w)
-{
- // nvram is only d0-d3
- if (m_inputs[5]->read() & 1)
- m_nvram[offset] = data & 0x0f;
-}
-
-READ8_MEMBER(ssystem3_state::nvram_r)
-{
- return (m_inputs[5]->read() & 1) ? (m_nvram[offset] & 0x0f) : 0;
-}
-
-WRITE8_MEMBER(ssystem3_state::input_w)
-{
- // PA0-PA7: input mux
- m_inp_mux = ~data;
-}
-
-READ8_MEMBER(ssystem3_state::input_r)
-{
- u8 data = m_inp_mux;
-
- // PA1-PA3: multiplexed inputs from PA4-PA7
- // PA0: blocked by diodes
- for (int i = 0; i < 4; i++)
- if (BIT(m_inp_mux, i+4))
- data |= m_inputs[i]->read() & 0xe;
-
- // PA4-PA7: multiplexed inputs from PA0-PA3
- for (int i = 0; i < 4; i++)
- if (m_inp_mux & m_inputs[i]->read())
- data |= 1 << (i+4);
-
- return ~data;
-}
-
-WRITE8_MEMBER(ssystem3_state::control_w)
-{
- // PB0: speaker out
- m_dac->write(~data & m_inputs[4]->read() & 1);
-
- // PB1: LCD DI
- // PB2: LCD CLK
- m_lcd->di_w(BIT(data, 1));
- m_lcd->clk_w(BIT(data, 2));
-
- // PB2 also clocks a 4015B
- // DA: LCD DO, DB: Q3A
- if (data & ~m_control & 4)
- {
- m_shift = m_shift << 1 | m_lcd->do_r();
-
- // weird TTL maze, I assume it's a hw kludge to fix a bug after the maskroms were already manufactured
- u8 xorval = (BIT(m_shift, 3) & ~(BIT(m_shift, 1) ^ BIT(m_shift, 4)) & ~(BIT(m_lcd_q, 7) & BIT(m_lcd_q, 23))) ? 0x12 : 0;
-
- // update display
- for (int i = 0; i < 4; i++)
- m_display->write_row(i, m_lcd_q >> (8*i) & 0xff);
- m_display->write_row(4, (m_shift ^ xorval) | 0x100);
- m_display->update();
- }
-
- // PB3: device serial out
-
- // PB7: tied to PB6 (pulse timer 2)
- m_via->write_pb6(BIT(data, 7));
-
- m_control = data;
-}
-
-READ8_MEMBER(ssystem3_state::control_r)
-{
- // PB4: device busy
- // PB5: device attached?
- return 0xff;
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-void ssystem3_state::main_map(address_map &map)
-{
- map(0x0000, 0x03ff).mirror(0x3c00).ram();
- map(0x4000, 0x40ff).mirror(0x1f00).ram().rw(FUNC(ssystem3_state::nvram_r), FUNC(ssystem3_state::nvram_w)).share("nvram");
- map(0x6000, 0x600f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map));
- map(0x8000, 0x9fff).mirror(0x6000).rom();
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-static INPUT_PORTS_START( ssystem3 )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / EP / C SQ")
- 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_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / MD / C Board")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) PORT_NAME("F 6 / Knight / Clock")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_LEFT) PORT_NAME("E 5 / Bishop / Left")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE / Interrupt")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("G 7 / Pawn / Right")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D) PORT_NAME("D 4 / Rook / #")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A) PORT_NAME("A 1 / White")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Time") // spring-loaded
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H) PORT_NAME("H 8 / Black")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) PORT_NAME("C 3 / Queen / #50")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) PORT_NAME("B 2 / King / FP")
-
- PORT_START("IN.4") // switches
- PORT_CONFNAME( 0x01, 0x01, "Sound" )
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x01, DEF_STR( On ) )
- PORT_CONFNAME( 0x02, 0x02, "LCD Light" )
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x02, DEF_STR( On ) )
-
- PORT_START("IN.5") // accessories
- PORT_CONFNAME( 0x01, 0x01, "Memory Unit" )
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x01, DEF_STR( On ) )
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-void ssystem3_state::ssystem3(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 4_MHz_XTAL / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &ssystem3_state::main_map);
-
- VIA6522(config, m_via, 4_MHz_XTAL / 4); // WRONG! should be 2MHz
- m_via->writepa_handler().set(FUNC(ssystem3_state::input_w));
- m_via->readpa_handler().set(FUNC(ssystem3_state::input_r));
- m_via->writepb_handler().set(FUNC(ssystem3_state::control_w));
- m_via->readpb_handler().set(FUNC(ssystem3_state::control_r));
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-
- /* video hardware */
- MD4332B(config, m_lcd);
- m_lcd->write_q().set(FUNC(ssystem3_state::lcd_q_w));
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
- screen.set_refresh_hz(60);
- screen.set_size(1920/2, 729/2);
- screen.set_visarea_full();
-
- PWM_DISPLAY(config, m_display).set_size(5, 9);
- m_display->set_segmask(0xf, 0x7f);
- m_display->set_bri_levels(0.25);
-
- config.set_default_layout(layout_saitek_ssystem3);
-
- /* 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( ssystem3 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("c19081e_ss-3-lrom.u4", 0x8000, 0x1000, CRC(9ea46ed3) SHA1(34eef85b356efbea6ddac1d1705b104fc8e2731a) ) // 2332
- ROM_LOAD("c19082_ss-3-hrom.u5", 0x9000, 0x1000, CRC(52741e0b) SHA1(2a7b950f9810c5a14a1b9d5e6b2bd93da621662e) ) // "
-
- // HACK! 6522 ACR register setup
- ROM_FILL(0x946d, 1, 0xe0) // was 0xe3
-
- ROM_REGION( 0x100, "nvram", 0 ) // default settings
- ROM_LOAD( "nvram", 0, 0x100, CRC(b5dddc7b) SHA1(3be9ec8359cc9ef16a04f28dfd24f9ffe1a2fca9) )
-
- ROM_REGION( 53552, "screen", 0)
- ROM_LOAD( "ssystem3.svg", 0, 53552, CRC(6047f88f) SHA1(2ff9cfce01cd3811a3f46f84b47fdc4ea2cf2ba8) )
-ROM_END
-
-} // anonymous namespace
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
-CONS( 1979, ssystem3, 0, 0, ssystem3, ssystem3, ssystem3_state, empty_init, "SciSys / Novag", "Chess Champion: Super System III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )