summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel68k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel68k.cpp')
-rw-r--r--src/mame/drivers/fidel68k.cpp179
1 files changed, 166 insertions, 13 deletions
diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp
index a149a583b9e..581aba0581c 100644
--- a/src/mame/drivers/fidel68k.cpp
+++ b/src/mame/drivers/fidel68k.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:hap
-// thanks-to:Berger
+// thanks-to:Berger,yoyo_chessboard
/******************************************************************************
Fidelity Electronics 68000 based board driver
@@ -12,7 +12,6 @@
TODO:
- fex68km3 addressmap RAM mirror? PCB has 2*32K RAM, emulated has 16K+64K
- - how does dual-CPU work?
- USART is not emulated
- V9(68030 @ 32MHz) is faster than V10(68040 @ 25MHz) but it should be the other
way around, culprit is unemulated cache?
@@ -37,6 +36,20 @@ I/O is via TTL, overall very similar to EAG.
******************************************************************************
+Designer Mach III Master 2265 (model 6113)
+------------------------------------------
+80KB RAM(2*KM6264AL-10, 2*KM62256AP-10), 64KB ROM(2*WSI 27C256L-12)
+MC68HC000P12F CPU, 16MHz XTAL
+IRQ(IPL2) from 555 timer, 1.67ms low, 6us high
+PCB label 510.1134A02
+
+ROM address/data lines are scrambled, presumed for easy placement on PCB and not
+for obfuscation. I/O is nearly the same as Designer Display on 6502 hardware.
+
+
+******************************************************************************
+
+
Elite Avant Garde (EAG, model 6114)
-----------------------------------
@@ -168,6 +181,7 @@ B0000x-xxxxxx: see V7, -800000
#include "speaker.h"
// internal artwork
+#include "fidel_desdis_68k.lh" // clickable
#include "fidel_ex_68k.lh" // clickable
#include "fidel_eag_68k.lh" // clickable
@@ -188,6 +202,12 @@ public:
// Excel 68000
DECLARE_WRITE8_MEMBER(fex68k_mux_w);
+ // Designer Master
+ DECLARE_WRITE8_MEMBER(fdes2265_control_w);
+ DECLARE_READ8_MEMBER(fdes2265_input_r);
+ DECLARE_WRITE8_MEMBER(fdes2265_lcd_w);
+ DECLARE_DRIVER_INIT(fdes2265);
+
// EAG(6114/6117)
DECLARE_DRIVER_INIT(eag);
void eag_prepare_display();
@@ -219,6 +239,76 @@ WRITE8_MEMBER(fidel68k_state::fex68k_mux_w)
/******************************************************************************
+ Designer Master
+******************************************************************************/
+
+WRITE8_MEMBER(fidel68k_state::fdes2265_control_w)
+{
+ u8 q3_old = m_led_select & 8;
+
+ // a1-a3,d0: 74259
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
+
+ // 74259 Q4-Q7: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // 74259 Q0,Q1: led select (active low)
+ display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
+
+ // 74259 Q3: lcd common, update on rising edge
+ if (~q3_old & m_led_select & 8)
+ {
+ for (int i = 0; i < 4; i++)
+ m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
+ }
+
+ m_display_maxy += 4;
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+}
+
+READ8_MEMBER(fidel68k_state::fdes2265_input_r)
+{
+ // a1-a3,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+WRITE8_MEMBER(fidel68k_state::fdes2265_lcd_w)
+{
+ // a1-a3,d0-d3: 4*74259 to lcd digit segments
+ u32 mask = BITSWAP8(1 << offset,3,7,6,0,1,2,4,5);
+ for (int i = 0; i < 4; i++)
+ {
+ m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? mask : 0);
+ mask <<= 8;
+ }
+}
+
+DRIVER_INIT_MEMBER(fidel68k_state, fdes2265)
+{
+ u16 *rom = (u16*)memregion("maincpu")->base();
+ unsigned const len = memregion("maincpu")->bytes() / 2;
+
+ // descramble data lines
+ for (int i = 0; i < len; i++)
+ rom[i] = BITSWAP16(rom[i], 15,14,8,13,9,12,10,11, 3,4,5,7,6,0,1,2);
+
+ // descramble address lines
+ std::vector<u16> buf(len);
+ memcpy(&buf[0], rom, len*2);
+ for (int i = 0; i < len; i++)
+ rom[i] = buf[BITSWAP24(i, 23,22,21,20,19,18,17,16, 15,14,13,12,11,8,10,9, 7,6,5,4,3,2,1,0)];
+}
+
+
+
+/******************************************************************************
EAG
******************************************************************************/
@@ -298,6 +388,19 @@ static ADDRESS_MAP_START( fex68km3_map, AS_PROGRAM, 16, fidel68k_state )
ADDRESS_MAP_END
+// Designer Master
+
+static ADDRESS_MAP_START( fdes2265_map, AS_PROGRAM, 16, fidel68k_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x00ffff) AM_ROM
+ AM_RANGE(0x000000, 0x00000f) AM_WRITE8(fdes2265_lcd_w, 0x00ff)
+ AM_RANGE(0x044000, 0x047fff) AM_RAM
+ AM_RANGE(0x100000, 0x10ffff) AM_RAM
+ AM_RANGE(0x140000, 0x14000f) AM_READ8(fdes2265_input_r, 0xff00)
+ AM_RANGE(0x140000, 0x14000f) AM_WRITE8(fdes2265_control_w, 0x00ff)
+ADDRESS_MAP_END
+
+
// EAG
DRIVER_INIT_MEMBER(fidel68k_state, eag)
@@ -366,6 +469,21 @@ static INPUT_PORTS_START( fex68k )
INPUT_PORTS_END
+static INPUT_PORTS_START( fdes )
+ PORT_INCLUDE( fidel_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( eag )
PORT_INCLUDE( fidel_cb_magnets )
@@ -429,6 +547,25 @@ static MACHINE_CONFIG_DERIVED( fex68km3, fex68k )
MCFG_CPU_PROGRAM_MAP(fex68km3_map)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_START( fdes2265 )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) // MC68HC000P12F
+ MCFG_CPU_PROGRAM_MAP(fdes2265_map)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(597)) // from 555 timer, measured
+ MCFG_TIMER_START_DELAY(attotime::from_hz(597) - attotime::from_nsec(6000)) // active for 6us
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel68k_state, irq_off, attotime::from_hz(597))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_fidel_desdis_68k)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("speaker")
+ MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
+ MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
+ MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( eag )
/* basic machine hardware */
@@ -519,6 +656,13 @@ ROM_START( fex68km3 ) // model 6098, PCB label 510.1120B01
ROM_END
+ROM_START( fdes2265 ) // model 6113, PCB label 510.1134A02
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("13e_red.ic11", 0x00000, 0x08000, CRC(15a35628) SHA1(8213862e129951c6943a80f73cd0b63a31bb1357) ) // 27c256
+ ROM_LOAD16_BYTE("13o_blue.ic10", 0x00001, 0x08000, CRC(81ce7ab2) SHA1(f01a70bcf2fbfe66c7a77d3c4437d897e5cc682d) ) // "
+ROM_END
+
+
ROM_START( feagv2 ) // from a V2 board
ROM_REGION16_BE( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE("6114_e5_yellow.u22", 0x00000, 0x10000, CRC(f9c7bada) SHA1(60e545f829121b9a4f1100d9e85ac83797715e80) ) // 27c512
@@ -537,6 +681,12 @@ ROM_START( feagv7 )
ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(506b688f) SHA1(0a091c35d0f01166b57f964b111cde51c5720d58) )
ROM_END
+ROM_START( feagv7a )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(44baefbf) SHA1(dbc24340d7e3013cc8f111ebb2a59169c5dcb8e8) )
+ ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(951a7857) SHA1(dad21b049fd4f411a79d4faefb922c1277569c0e) )
+ROM_END
+
ROM_START( feagv9 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD16_BYTE("eag-v9b", 0x00000, 0x10000, CRC(60523199) SHA1(a308eb6b782732af1ab2fd0ed8b046de7a8dd24b) )
@@ -565,14 +715,17 @@ ROM_END
Drivers
******************************************************************************/
-// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
-CONS( 1987, fex68k, 0, 0, fex68k, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fex68km2, fex68k, 0, fex68km2, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fex68km3, fex68k, 0, fex68km3, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000 Mach III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv10, feagv2, 0, eagv10, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-CONS( 2002, feagv11, feagv2, 0, eagv11, eag, fidel68k_state, 0, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1987, fex68k, 0, 0, fex68k, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fex68km2, fex68k, 0, fex68km2, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fex68km3, fex68k, 0, fex68km3, fex68k, fidel68k_state, 0, "Fidelity Electronics", "Excel 68000 Mach III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1989, fdes2265, 0, 0, fdes2265, fdes, fidel68k_state, fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv10, feagv2, 0, eagv10, eag, fidel68k_state, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 2002, feagv11, feagv2, 0, eagv11, eag, fidel68k_state, 0, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )