summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/thayers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/thayers.cpp')
-rw-r--r--src/mame/drivers/thayers.cpp868
1 files changed, 0 insertions, 868 deletions
diff --git a/src/mame/drivers/thayers.cpp b/src/mame/drivers/thayers.cpp
deleted file mode 100644
index 77ba8526a6d..00000000000
--- a/src/mame/drivers/thayers.cpp
+++ /dev/null
@@ -1,868 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Andrew Gardner
-/*
-
- TODO:
-
- - LDV1000 mode
- - PR7820 INT/_EXT line
- - coin counter
- - convert SSI-263 to a sound device
- - dump laserdisc
-
-*/
-
-#include "emu.h"
-#include "cpu/cop400/cop400.h"
-#include "cpu/z80/z80.h"
-#include "machine/ldstub.h"
-#include "machine/ldv1000.h"
-#include "speaker.h"
-
-#include "thayers.lh"
-
-
-#define LOG 0
-
-struct ssi263_t
-{
- uint8_t dr;
- uint8_t p;
- uint16_t i;
- uint8_t r;
- uint8_t t;
- uint8_t c;
- uint8_t a;
- uint8_t f;
- uint8_t mode;
-};
-
-class thayers_state : public driver_device
-{
-public:
- thayers_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_pr7820(*this, "laserdisc")
- , m_ldv1000(*this, "ldv1000")
- , m_maincpu(*this, "maincpu")
- , m_row(*this, "ROW.%u", 0)
- , m_digits(*this, "digit%u", 0U)
- {
- }
-
- void thayers(machine_config &config);
-
- DECLARE_READ_LINE_MEMBER(laserdisc_enter_r);
- DECLARE_READ_LINE_MEMBER(laserdisc_ready_r);
-
-private:
- enum
- {
- TIMER_INTRQ_TICK,
- TIMER_SSI263_PHONEME_TICK
- };
-
- optional_device<pioneer_pr7820_device> m_pr7820;
- optional_device<pioneer_ldv1000_device> m_ldv1000;
- uint8_t m_laserdisc_data;
- int m_rx_bit;
- int m_keylatch;
- uint8_t m_keydata;
- bool m_kbdata;
- bool m_kbclk;
- uint8_t m_cop_data_latch;
- int m_cop_data_latch_enable;
- uint8_t m_cop_l;
- uint8_t m_cop_cmd_latch;
- int m_timer_int;
- int m_data_rdy_int;
- int m_ssi_data_request;
- int m_cart_present;
- int m_pr7820_enter;
- struct ssi263_t m_ssi263;
- void intrq_w(uint8_t data);
- uint8_t irqstate_r();
- void timer_int_ack_w(uint8_t data);
- void data_rdy_int_ack_w(uint8_t data);
- void cop_d_w(uint8_t data);
- uint8_t cop_data_r();
- void cop_data_w(uint8_t data);
- uint8_t cop_l_r();
- void cop_l_w(uint8_t data);
- uint8_t cop_g_r();
- void control_w(uint8_t data);
- void cop_g_w(uint8_t data);
- DECLARE_READ_LINE_MEMBER(kbdata_r);
- DECLARE_WRITE_LINE_MEMBER(kbclk_w);
- void control2_w(uint8_t data);
- uint8_t dsw_b_r();
- uint8_t laserdsc_data_r();
- void laserdsc_data_w(uint8_t data);
- void laserdsc_control_w(uint8_t data);
- void den1_w(uint8_t data);
- void den2_w(uint8_t data);
- void ssi263_register_w(offs_t offset, uint8_t data);
- uint8_t ssi263_register_r();
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
- void check_interrupt();
- required_device<cpu_device> m_maincpu;
- required_ioport_array<10> m_row;
- output_finder<16> m_digits;
-
- void thayers_io_map(address_map &map);
- void thayers_map(address_map &map);
-
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-};
-
-static const uint8_t led_map[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x00 };
-
-/* Interrupts */
-
-void thayers_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_INTRQ_TICK:
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- break;
- case TIMER_SSI263_PHONEME_TICK:
- m_ssi_data_request = 0;
- check_interrupt();
- break;
- default:
- throw emu_fatalerror("Unknown id in thayers_state::device_timer");
- }
-}
-
-void thayers_state::check_interrupt()
-{
- if (!m_timer_int || !m_data_rdy_int || !m_ssi_data_request)
- {
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- }
- else
- {
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- }
-}
-
-void thayers_state::intrq_w(uint8_t data)
-{
- // T = 1.1 * R30 * C53 = 1.1 * 750K * 0.01uF = 8.25 ms
-
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
-
- timer_set(attotime::from_usec(8250), TIMER_INTRQ_TICK);
-}
-
-uint8_t thayers_state::irqstate_r()
-{
- /*
-
- bit description
-
- 0
- 1
- 2 SSI263 A/_R
- 3 tied to +5V
- 4 _TIMER INT
- 5 _DATA RDY INT
- 6 _CART PRES
- 7
-
- */
-
- return m_cart_present << 6 | (m_data_rdy_int << 5) | (m_timer_int << 4) | 0x08 | (m_ssi_data_request << 2);
-}
-
-void thayers_state::timer_int_ack_w(uint8_t data)
-{
- if (LOG) logerror("%s %s TIMER INT ACK\n", machine().time().as_string(), machine().describe_context());
-
- m_timer_int = 1;
-
- check_interrupt();
-}
-
-void thayers_state::data_rdy_int_ack_w(uint8_t data)
-{
- if (LOG) logerror("%s %s DATA RDY INT ACK\n", machine().time().as_string(), machine().describe_context());
-
- m_data_rdy_int = 1;
-
- check_interrupt();
-}
-
-void thayers_state::cop_d_w(uint8_t data)
-{
- /*
-
- bit description
-
- D0 _TIMER INT
- D1 _DATA RDY INT
- D2
- D3
-
- */
-
- if (!BIT(data, 0))
- {
- if (LOG) logerror("%s %s TIMER INT\n", machine().time().as_string(), machine().describe_context());
- m_timer_int = 0;
- }
-
- if (!BIT(data, 1))
- {
- if (LOG) logerror("%s %s DATA RDY INT\n", machine().time().as_string(), machine().describe_context());
- m_data_rdy_int = 0;
- }
-
- check_interrupt();
-}
-
-/* COP Communication */
-
-uint8_t thayers_state::cop_data_r()
-{
- if (!m_cop_data_latch_enable)
- {
- return m_cop_data_latch;
- }
- else
- {
- return m_cop_l;
- }
-}
-
-void thayers_state::cop_data_w(uint8_t data)
-{
- m_cop_data_latch = data;
- if (LOG) logerror("COP DATA %02x\n", m_cop_data_latch);
-}
-
-uint8_t thayers_state::cop_l_r()
-{
- if (!m_cop_data_latch_enable)
- {
- return m_cop_data_latch;
- }
- else
- {
- return 0;
- }
-}
-
-void thayers_state::cop_l_w(uint8_t data)
-{
- m_cop_l = data;
- if (LOG) logerror("COP L %02x\n", m_cop_l);
-}
-
-uint8_t thayers_state::cop_g_r()
-{
- /*
-
- bit description
-
- G0 U16 Q0
- G1 U16 Q1
- G2 U16 Q2
- G3
-
- */
-
- return m_cop_cmd_latch;
-}
-
-void thayers_state::control_w(uint8_t data)
-{
- /*
-
- bit description
-
- 0
- 1 _CS128A
- 2 _BANKSEL1
- 3
- 4
- 5 COP G0
- 6 COP G1
- 7 COP G2
-
- */
-
- m_cop_cmd_latch = (data >> 5) & 0x07;
- if (LOG) logerror("COP G0..2 %u\n", m_cop_cmd_latch);
-}
-
-void thayers_state::cop_g_w(uint8_t data)
-{
- /*
-
- bit description
-
- G0
- G1
- G2
- G3 U17 enable
-
- */
-
- m_cop_data_latch_enable = BIT(data, 3);
- if (LOG) logerror("U17 enable %u\n", m_cop_data_latch_enable);
-}
-
-/* Keyboard */
-
-READ_LINE_MEMBER(thayers_state::kbdata_r)
-{
- if (LOG) logerror("%s KBDATA %u BIT %u\n",machine().time().as_string(),m_kbdata,m_rx_bit);
- return m_kbdata;
-}
-
-WRITE_LINE_MEMBER(thayers_state::kbclk_w)
-{
- if (m_kbclk != state) {
- if (LOG) logerror("%s %s KBCLK %u\n", machine().time().as_string(), machine().describe_context(),state);
- }
-
- if (!m_kbclk && state) {
- m_rx_bit++;
-
- // 1, 1, 0, 1, Q9, P3, P2, P1, P0, 0
- switch (m_rx_bit)
- {
- case 0: case 1: case 3:
- m_kbdata = 1;
- break;
-
- case 2: case 9:
- m_kbdata = 0;
- break;
-
- case 10:
- m_rx_bit = 0;
- m_kbdata = 1;
-
- m_keylatch++;
-
- if (m_keylatch == 10) {
- m_keylatch = 0;
- }
-
- m_keydata = m_row[m_keylatch]->read();
-
- if (LOG) logerror("keylatch %u\n",m_keylatch);
- break;
-
- case 4:
- m_kbdata = (m_keylatch == 9);
- break;
-
- default:
- m_kbdata = BIT(m_keydata, 3);
- m_keydata <<= 1;
-
- if (LOG) logerror("keydata %02x shift\n",m_keydata);
- break;
- }
- }
-
- m_kbclk = state;
-}
-
-/* I/O Board */
-
-void thayers_state::control2_w(uint8_t data)
-{
- /*
-
- bit description
-
- 0
- 1 _RESOI (?)
- 2 _ENCARTDET
- 3
- 4
- 5
- 6
- 7
-
- */
-
- if ((!BIT(data, 2)) & m_cart_present)
- {
- m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE);
- }
-}
-
-uint8_t thayers_state::dsw_b_r()
-{
- return (ioport("COIN")->read() & 0xf0) | (ioport("DSWB")->read() & 0x0f);
-}
-
-uint8_t thayers_state::laserdsc_data_r()
-{
- if (m_ldv1000 != nullptr) return m_ldv1000->status_r();
- if (m_pr7820 != nullptr) return m_pr7820->data_r();
- return 0;
-}
-
-void thayers_state::laserdsc_data_w(uint8_t data)
-{
- m_laserdisc_data = data;
-}
-
-void thayers_state::laserdsc_control_w(uint8_t data)
-{
- /*
-
- bit description
-
- 0
- 1
- 2
- 3
- 4 coin counter
- 5 U16 output enable
- 6 ENTER if switch B5 closed
- 7 INT/_EXT
-
- */
-
- machine().bookkeeping().coin_counter_w(0, BIT(data, 4));
-
- if (BIT(data, 5))
- {
- if (m_ldv1000 != nullptr)
- {
- m_ldv1000->data_w(m_laserdisc_data);
- m_ldv1000->enter_w(BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
- }
- if (m_pr7820 != nullptr)
- {
- m_pr7820->data_w(m_laserdisc_data);
- m_pr7820_enter = BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE;
- m_pr7820->enter_w(m_pr7820_enter);
- // BIT(data, 7) is INT/_EXT, but there is no such input line in laserdsc.h
- }
- }
-}
-
-void thayers_state::den1_w(uint8_t data)
-{
- /*
-
- bit description
-
- 0 DD0
- 1 DD1
- 2 DD2
- 3 DD3
- 4 DA0
- 5 DA1
- 6 DA2
- 7 DA3
-
- */
-
- m_digits[data >> 4] = led_map[data & 0x0f];
-}
-
-void thayers_state::den2_w(uint8_t data)
-{
- /*
-
- bit description
-
- 0 DD0
- 1 DD1
- 2 DD2
- 3 DD3
- 4 DA0
- 5 DA1
- 6 DA2
- 7 DA3
-
- */
-
- m_digits[8 + (data >> 4)] = led_map[data & 0x0f];
-}
-
-/* SSI-263 */
-
-/*
-
- The following information is from the SSI-263A data sheet.
-
- Thayer's Quest uses an SSI-263, so this might be inaccurate, but it works for now
-
-*/
-
-#define SSI263_CLOCK (XTAL(4'000'000)/2)
-
-static const char SSI263_PHONEMES[0x40][5] =
-{
- "PA", "E", "E1", "Y", "YI", "AY", "IE", "I", "A", "AI", "EH", "EH1", "AE", "AE1", "AH", "AH1", "W", "O", "OU", "OO", "IU", "IU1", "U", "U1", "UH", "UH1", "UH2", "UH3", "ER", "R", "R1", "R2",
- "L", "L1", "LF", "W", "B", "D", "KV", "P", "T", "K", "HV", "HVC", "HF", "HFC", "HN", "Z", "S", "J", "SCH", "V", "F", "THV", "TH", "M", "N", "NG", ":A", ":OH", ":U", ":UH", "E2", "LB"
-};
-
-void thayers_state::ssi263_register_w(offs_t offset, uint8_t data)
-{
- struct ssi263_t &ssi263 = m_ssi263;
- switch (offset)
- {
- case 0:
- {
- int frame_time = ((4096 * (16 - ssi263.r)) / 2); // us, /2 should actually be /SSI263_CLOCK, but this way we get microseconds directly
- int phoneme_time = frame_time * (4 - ssi263.dr); // us
-
- // duration/phoneme register
- ssi263.dr = (data >> 5) & 0x03;
- ssi263.p = data & 0x3f;
-
- m_ssi_data_request = 1;
- check_interrupt();
-
- switch (ssi263.mode)
- {
- case 0:
- case 1:
- // phoneme timing response
- timer_set(attotime::from_usec(phoneme_time), TIMER_SSI263_PHONEME_TICK);
- break;
- case 2:
- // frame timing response
- timer_set(attotime::from_usec(frame_time), TIMER_SSI263_PHONEME_TICK);
- break;
- case 3:
- // disable A/_R output
- break;
- }
-
- //logerror("SSI263 Phoneme Duration: %u\n", ssi263.dr);
- //logerror("SSI263 Phoneme: %02x %s\n", ssi263.p, SSI263_PHONEMES[ssi263.p]);
- if (LOG && ssi263.p) printf("%s ", SSI263_PHONEMES[ssi263.p]);
- }
- break;
-
- case 1:
- // inflection register
- ssi263.i = (data << 3) | (ssi263.i & 0x403);
-
- //logerror("SSI263 Inflection: %u\n", ssi263.i);
- break;
-
- case 2:
- // rate/inflection register
- ssi263.i = (BIT(data, 4) << 11) | (ssi263.i & 0x7f8) | (data & 0x07);
- ssi263.r = data >> 4;
-
- //logerror("SSI263 Inflection: %u\n", ssi263.i);
- //logerror("SSI263 Rate: %u\n", ssi263.r);
- break;
-
- case 3:
- // control/articulation/amplitude register
- if (ssi263.c && !BIT(data, 7))
- {
- ssi263.mode = ssi263.dr;
-
- switch (ssi263.mode)
- {
- case 0:
- //logerror("SSI263 Phoneme Timing Response, Transitioned Inflection\n");
- break;
-
- case 1:
- //logerror("SSI263 Phoneme Timing Response, Immediate Inflection\n");
- break;
-
- case 2:
- // activate A/_R
- //logerror("SSI263 Frame Timing Response, Immediate Inflection\n");
- break;
-
- case 3:
- // disable A/_R output
- //logerror("SSI263 A/R Output Disabled\n");
- break;
- }
- }
-
- ssi263.c = BIT(data, 7);
- ssi263.t = (data >> 4) & 0x07;
- ssi263.a = data & 0x0f;
-
- //logerror("SSI263 Control: %u\n", ssi263.c);
- //logerror("SSI263 Articulation: %u\n", ssi263.t);
- //logerror("SSI263 Amplitude: %u\n", ssi263.a);
- break;
-
- case 4:
- case 5:
- case 6:
- case 7:
- // filter frequency register
- ssi263.f = data;
- //logerror("SSI263 Filter Frequency: %u\n", ssi263.f);
- break;
- }
-}
-
-uint8_t thayers_state::ssi263_register_r()
-{
- // D7 becomes an output, as the inverted state of A/_R. The register address bits are ignored.
-
- return !m_ssi_data_request << 7;
-}
-
-/* Memory Maps */
-
-void thayers_state::thayers_map(address_map &map)
-{
- map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).ram();
- map(0xc000, 0xdfff).rom();
-}
-
-void thayers_state::thayers_io_map(address_map &map)
-{
- map.global_mask(0xff);
- map(0x00, 0x07).rw(FUNC(thayers_state::ssi263_register_r), FUNC(thayers_state::ssi263_register_w));
- map(0x20, 0x20).w(FUNC(thayers_state::control_w));
- map(0x40, 0x40).rw(FUNC(thayers_state::irqstate_r), FUNC(thayers_state::control2_w));
- map(0x80, 0x80).rw(FUNC(thayers_state::cop_data_r), FUNC(thayers_state::cop_data_w));
- map(0xa0, 0xa0).w(FUNC(thayers_state::timer_int_ack_w));
- map(0xc0, 0xc0).w(FUNC(thayers_state::data_rdy_int_ack_w));
- map(0xf0, 0xf0).r(FUNC(thayers_state::laserdsc_data_r));
- map(0xf1, 0xf1).r(FUNC(thayers_state::dsw_b_r));
- map(0xf2, 0xf2).portr("DSWA");
- map(0xf3, 0xf3).w(FUNC(thayers_state::intrq_w));
- map(0xf4, 0xf4).w(FUNC(thayers_state::laserdsc_data_w));
- map(0xf5, 0xf5).w(FUNC(thayers_state::laserdsc_control_w));
- map(0xf6, 0xf6).w(FUNC(thayers_state::den1_w));
- map(0xf7, 0xf7).w(FUNC(thayers_state::den2_w));
-}
-
-/* Input Ports */
-
-READ_LINE_MEMBER(thayers_state::laserdisc_enter_r)
-{
- if (m_pr7820 != nullptr) return m_pr7820_enter;
- if (m_ldv1000 != nullptr) return (m_ldv1000->status_strobe_r() == ASSERT_LINE) ? 0 : 1;
- return 0;
-}
-
-READ_LINE_MEMBER(thayers_state::laserdisc_ready_r)
-{
- if (m_pr7820 != nullptr) return (m_pr7820->ready_r() == ASSERT_LINE) ? 0 : 1;
- if (m_ldv1000 != nullptr) return (m_ldv1000->command_strobe_r() == ASSERT_LINE) ? 0 : 1;
- return 0;
-}
-
-static INPUT_PORTS_START( thayers )
- PORT_START("DSWA")
- PORT_DIPNAME( 0x07, 0x07, "Time Per Coin" ) PORT_DIPLOCATION( "A:3,2,1" )
- PORT_DIPSETTING( 0x07, "110 Seconds" )
- PORT_DIPSETTING( 0x06, "95 Seconds" )
- PORT_DIPSETTING( 0x05, "80 Seconds" )
- PORT_DIPSETTING( 0x04, "70 Seconds" )
- PORT_DIPSETTING( 0x03, "60 Seconds" )
- PORT_DIPSETTING( 0x02, "45 Seconds" )
- PORT_DIPSETTING( 0x01, "30 Seconds" )
- PORT_DIPSETTING( 0x00, DEF_STR ( Free_Play ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coinage ) ) PORT_DIPLOCATION( "A:4" )
- PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) ) PORT_DIPLOCATION( "A:5" )
- PORT_DIPSETTING( 0x10, "3" )
- PORT_DIPSETTING( 0x00, "5" )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION( "A:6" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x20, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, "Attract Mode Audio" ) PORT_DIPLOCATION( "A:7" )
- PORT_DIPSETTING( 0x40, "Always Playing" )
- PORT_DIPSETTING( 0x00, "One Out of 8 Times" )
- PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "A:8" )
-
- PORT_START("DSWB")
- PORT_SERVICE_DIPLOC( 0x01, 0x01, "B:1" )
- PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "B:2" )
- PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "B:3" )
- PORT_DIPNAME( 0x18, 0x00, "LD Player" ) PORT_DIPLOCATION( "B:5,4" )
- PORT_DIPSETTING( 0x18, "LDV-1000" )
- PORT_DIPSETTING( 0x00, "PR-7820" )
- PORT_DIPUNUSED_DIPLOC( 0xe0, IP_ACTIVE_LOW, "B:8,7,6" )
-
- PORT_START("COIN")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(thayers_state, laserdisc_enter_r)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(thayers_state, laserdisc_ready_r)
-
- PORT_START("ROW.0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 YES") PORT_CODE(KEYCODE_1)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1 CLEAR") PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2)
-
- PORT_START("ROW.1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 ITEMS") PORT_CODE(KEYCODE_2)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W AMULET") PORT_CODE(KEYCODE_W)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z SPELL OF RELEASE") PORT_CODE(KEYCODE_Z)
-
- PORT_START("ROW.2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 DROP ITEM") PORT_CODE(KEYCODE_3)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E BLACK MACE") PORT_CODE(KEYCODE_E)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S DAGGER") PORT_CODE(KEYCODE_S)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X SCEPTER") PORT_CODE(KEYCODE_X)
-
- PORT_START("ROW.3")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 GIVE SCORE") PORT_CODE(KEYCODE_4)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R BLOOD SWORD") PORT_CODE(KEYCODE_R)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D GREAT CIRCLET") PORT_CODE(KEYCODE_D)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C SPELL OF SEEING") PORT_CODE(KEYCODE_C)
-
- PORT_START("ROW.4")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 REPLAY") PORT_CODE(KEYCODE_5)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T CHALICE") PORT_CODE(KEYCODE_T)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F HUNTING HORN") PORT_CODE(KEYCODE_F)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V SHIELD") PORT_CODE(KEYCODE_V)
-
- PORT_START("ROW.5")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 COMBINE ACTION") PORT_CODE(KEYCODE_6)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y COINS") PORT_CODE(KEYCODE_Y)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G LONG BOW") PORT_CODE(KEYCODE_G)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B SILVER WHEAT") PORT_CODE(KEYCODE_B)
-
- PORT_START("ROW.6")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 SAVE GAME") PORT_CODE(KEYCODE_7)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U COLD FIRE") PORT_CODE(KEYCODE_U)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H MEDALLION") PORT_CODE(KEYCODE_H)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N STAFF") PORT_CODE(KEYCODE_N)
-
- PORT_START("ROW.7")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 UPDATE") PORT_CODE(KEYCODE_8)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I CROWN") PORT_CODE(KEYCODE_I)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J ONYX SEAL") PORT_CODE(KEYCODE_J)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M SPELL OF UNDERSTANDING") PORT_CODE(KEYCODE_M)
-
- PORT_START("ROW.8")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 HINT") PORT_CODE(KEYCODE_9)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O CRYSTAL") PORT_CODE(KEYCODE_O)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K ORB OF QUOID") PORT_CODE(KEYCODE_K)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4 SPACE") PORT_CODE(KEYCODE_F4) PORT_CODE(KEYCODE_SPACE)
-
- PORT_START("ROW.9")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 NO") PORT_CODE(KEYCODE_0)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3 ENTER") PORT_CODE(KEYCODE_F3) PORT_CODE(KEYCODE_ENTER)
-INPUT_PORTS_END
-
-/* Machine Initialization */
-
-void thayers_state::machine_start()
-{
- m_digits.resolve();
- memset(&m_ssi263, 0, sizeof(m_ssi263));
-}
-
-void thayers_state::machine_reset()
-{
- m_laserdisc_data = 0;
-
- m_rx_bit = 0;
- m_kbdata = 1;
- m_keylatch = 0;
- m_keydata = m_row[m_keylatch]->read();
-
- m_cop_data_latch = 0;
- m_cop_data_latch_enable = 0;
- m_cop_l = 0;
- m_cop_cmd_latch = 0;
-
- m_timer_int = 1;
- m_data_rdy_int = 1;
- m_ssi_data_request = 1;
-
- m_cart_present = 0;
- m_pr7820_enter = 0;
-}
-
-/* Machine Driver */
-
-void thayers_state::thayers(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, XTAL(4'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &thayers_state::thayers_map);
- m_maincpu->set_addrmap(AS_IO, &thayers_state::thayers_io_map);
-
- cop421_cpu_device &mcu(COP421(config, "mcu", XTAL(4'000'000)/2)); // COP421L-PCA/N
- mcu.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false);
- mcu.read_l().set(FUNC(thayers_state::cop_l_r));
- mcu.write_l().set(FUNC(thayers_state::cop_l_w));
- mcu.read_g().set(FUNC(thayers_state::cop_g_r));
- mcu.write_g().set(FUNC(thayers_state::cop_g_w));
- mcu.write_d().set(FUNC(thayers_state::cop_d_w));
- mcu.read_si().set(FUNC(thayers_state::kbdata_r));
- mcu.write_so().set(FUNC(thayers_state::kbclk_w));
-
- /* video hardware */
- PIONEER_PR7820(config, m_pr7820, 0);
- m_pr7820->set_screen("screen");
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_video_attributes(VIDEO_SELF_RENDER);
- screen.set_raw(XTAL(14'318'181)*2, 910, 0, 704, 525, 44, 524);
- screen.set_screen_update("laserdisc", FUNC(laserdisc_device::screen_update));
-
- PALETTE(config, "palette").set_entries(256);
-
- /* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- // SSI 263 @ 2MHz
-
- m_pr7820->add_route(0, "lspeaker", 1.0);
- m_pr7820->add_route(1, "rspeaker", 1.0);
-}
-
-/* ROMs */
-
-ROM_START( thayers )
- ROM_REGION( 0xe000, "maincpu", 0 )
- ROM_LOAD( "tq_u33.bin", 0x0000, 0x8000, CRC(82df5d89) SHA1(58dfd62bf8c5a55d1eba397d2c284e99a4685a3f) )
- ROM_LOAD( "tq_u1.bin", 0xc000, 0x2000, CRC(e8e7f566) SHA1(df7b83ef465c65446c8418bc6007447693b75021) )
-
- ROM_REGION( 0x400, "mcu", 0 )
- ROM_LOAD( "tq_cop.bin", 0x000, 0x400, CRC(6748e6b3) SHA1(5d7d1ecb57c1501ef6a2d9691eecc9970586606b) )
-
- DISK_REGION( "laserdisc" )
- DISK_IMAGE_READONLY( "thayers", 0, NO_DUMP )
-ROM_END
-
-ROM_START( thayersa )
- ROM_REGION( 0xe000, "maincpu", 0 )
- ROM_LOAD( "tq_u33.bin", 0x0000, 0x8000, CRC(82df5d89) SHA1(58dfd62bf8c5a55d1eba397d2c284e99a4685a3f) )
- ROM_LOAD( "tq_u1.bin", 0xc000, 0x2000, CRC(33817e25) SHA1(f9750da863dd57fe2f5b6e8fce9c6695dc5c9adc) ) // sldh
-
- ROM_REGION( 0x400, "mcu", 0 )
- ROM_LOAD( "tq_cop.bin", 0x000, 0x400, CRC(6748e6b3) SHA1(5d7d1ecb57c1501ef6a2d9691eecc9970586606b) )
-
- DISK_REGION( "laserdisc" )
- DISK_IMAGE_READONLY( "thayers", 0, NO_DUMP )
-ROM_END
-
-/* Game Drivers */
-
-// YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY FULLNAME FLAGS LAYOUT
-GAMEL( 1984, thayers, 0, thayers, thayers, thayers_state, empty_init, ROT0, "RDI Video Systems", "Thayer's Quest (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_thayers)
-GAMEL( 1984, thayersa, thayers, thayers, thayers, thayers_state, empty_init, ROT0, "RDI Video Systems", "Thayer's Quest (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_thayers)