From 2f428400fdcd7473f0b0025e03c0fe94c74ceb57 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 18 Feb 2019 02:00:34 +0100 Subject: fidel*: put designer display in its own file (nw) --- scripts/target/mame/mess.lua | 2 +- src/mame/drivers/fidel6502.cpp | 155 -------------- src/mame/drivers/fidel68k.cpp | 152 -------------- src/mame/drivers/fidel_desdis.cpp | 356 ++++++++++++++++++++++++++++++++ src/mame/includes/fidel_desdis_common.h | 33 --- src/mame/mame.lst | 10 +- src/mame/mess.flt | 1 + 7 files changed, 364 insertions(+), 345 deletions(-) create mode 100644 src/mame/drivers/fidel_desdis.cpp delete mode 100644 src/mame/includes/fidel_desdis_common.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index aa122a10aee..ba905b8d6a5 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2131,9 +2131,9 @@ createMESSProjects(_target, _subtarget, "fidelity") files { MAME_DIR .. "src/mame/drivers/fidelbase.cpp", MAME_DIR .. "src/mame/includes/fidelbase.h", + MAME_DIR .. "src/mame/includes/fidel_desdis.cpp", MAME_DIR .. "src/mame/drivers/fidel_sc6.cpp", MAME_DIR .. "src/mame/drivers/fidel6502.cpp", - MAME_DIR .. "src/mame/includes/fidel_desdis_common.h", MAME_DIR .. "src/mame/drivers/fidel68k.cpp", } diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index 9995d55a560..b2c5dc68e40 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -442,7 +442,6 @@ I/O is via TTL, very similar to Designer Display #include "emu.h" #include "includes/fidelbase.h" -#include "includes/fidel_desdis_common.h" #include "cpu/m6502/m6502.h" #include "cpu/m6502/r65c02.h" @@ -459,7 +458,6 @@ I/O is via TTL, very similar to Designer Display #include "fidel_chesster.lh" // clickable #include "fidel_csc.lh" // clickable, with preliminary boardpieces simulation #include "fidel_des.lh" // clickable -#include "fidel_desdis.lh" // clickable #include "fidel_eag.lh" // clickable #include "fidel_eas.lh" // clickable #include "fidel_ex.lh" // clickable @@ -727,23 +725,6 @@ void su9_state::su9_set_cpu_freq() -class desdis_state : public desdis_common_state -{ -public: - desdis_state(const machine_config &mconfig, device_type type, const char *tag) : - desdis_common_state(mconfig, type, tag) - { } - - void fdes2000d(machine_config &config); - void fdes2100d(machine_config &config); - void init_fdes2100d(); - -private: - void fdes2100d_map(address_map &map); -}; - - - /*************************************************************************** Helper Functions @@ -1240,70 +1221,6 @@ READ8_MEMBER(excel_state::fexcelb_ttl_r) -/****************************************************************************** - Designer Display -******************************************************************************/ - -// TTL/generic - -WRITE8_MEMBER(desdis_common_state::control_w) -{ - u8 q3_old = m_led_select & 8; - - // a0-a2,d7: 74259 - u8 mask = 1 << offset; - m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? 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 Q2: book rom A14 - if (m_rombank != nullptr) - m_rombank->set_entry(~m_led_select >> 2 & 1); - - // 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(); -} - -WRITE8_MEMBER(desdis_common_state::lcd_w) -{ - // a0-a2,d0-d3: 4*74259 to lcd digit segments - u32 mask = bitswap<8>(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) ? 0 : mask); - mask <<= 8; - } -} - -READ8_MEMBER(desdis_common_state::input_r) -{ - // a0-a2,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; -} - -void desdis_state::init_fdes2100d() -{ - m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000); -} - - /****************************************************************************** Phantom @@ -1514,15 +1431,6 @@ void excel_state::fexcelb_map(address_map &map) // Designer Display, Phantom, Chesster -void desdis_state::fdes2100d_map(address_map &map) -{ - map(0x0000, 0x1fff).ram(); - map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w)); - map(0x4000, 0x7fff).bankr("rombank"); - map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w)); - map(0x8000, 0xffff).rom(); -} - void fidel6502_state::fphantom_map(address_map &map) { map(0x0000, 0x1fff).ram(); @@ -1872,20 +1780,6 @@ static INPUT_PORTS_START( fdes ) INPUT_PORTS_END -INPUT_PORTS_START( desdis ) - 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( chesster ) PORT_INCLUDE( fidel_cb_buttons ) @@ -2271,36 +2165,6 @@ void excel_state::fexceld(machine_config &config) config.set_default_layout(layout_fidel_exd); } -void desdis_state::fdes2100d(machine_config &config) -{ - /* basic machine hardware */ - M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6 - m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); - - const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) - TIMER(config, m_irq_on).configure_periodic(FUNC(desdis_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config, "irq_off").configure_periodic(FUNC(desdis_state::irq_off), irq_period); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_desdis); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void desdis_state::fdes2000d(machine_config &config) -{ - fdes2100d(config); - - /* basic machine hardware */ - R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3 - m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); -} void fidel6502_state::fphantom(machine_config &config) { @@ -2849,22 +2713,6 @@ ROM_START( fdes2100 ) // model 6103, PCB label 510.1129A01 ROM_END -ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01. The 'rev B' dump came from a post-release bugfix by Fidelity - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // WSI 27C256L-12 - - ROM_REGION( 0x8000, "rombank", 0 ) - ROM_LOAD("bk3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // WSI 27C256L-12 -ROM_END - -ROM_START( fdes2000d ) // model 6105, PCB label 510.1130A01 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("27c256.ic9", 0x8000, 0x8000, CRC(b136d1a1) SHA1(8438790a62f45284ff33a0255c5c89f526726d3e) ) // 27C256, no label - - ROM_REGION( 0x8000, "rombank", ROMREGION_ERASEFF ) // no rom in ic10 -ROM_END - - ROM_START( fphantom ) // model 6100, PCB label 510.1128A01 ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256 @@ -2963,9 +2811,6 @@ CONS( 1986, granits, fexcelp, 0, granits, fexcel, excel_state, empty_in CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - CONS( 1988, fphantom, 0, 0, fphantom, fphantom, fidel6502_state, init_fphantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) CONS( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index 175e82d2b79..4606c527242 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -38,27 +38,6 @@ 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. - -Designer Mach IV Master 2325 (model 6129) ------------------------------------------ -32KB(4*P5164-70) + 512KB(TC518512PL-80) RAM, 64KB ROM(TMS 27C512-120JL) -MC68EC020RP25 CPU, 20MHz XTAL -PCB label 510.1149A01 -It has a green "Shift" led instead of red, and ROM is not scrambled. - - -****************************************************************************** - - Elite Avant Garde (EAG, model 6114) ----------------------------------- @@ -181,7 +160,6 @@ B0000x-xxxxxx: see V7, -800000 #include "emu.h" #include "includes/fidelbase.h" -#include "includes/fidel_desdis_common.h" #include "cpu/m68000/m68000.h" #include "machine/ram.h" @@ -190,8 +168,6 @@ B0000x-xxxxxx: see V7, -800000 #include "speaker.h" // internal artwork -#include "fidel_desdis_68kg.lh" // clickable -#include "fidel_desdis_68kr.lh" // clickable #include "fidel_ex_68k.lh" // clickable #include "fidel_eag_68k.lh" // clickable @@ -233,28 +209,6 @@ protected: }; -class desmas_state : public desdis_common_state -{ -public: - desmas_state(const machine_config &mconfig, device_type type, const char *tag) : - desdis_common_state(mconfig, type, tag) - { } - - void fdes2265(machine_config &config); - void fdes2325(machine_config &config); - - void init_fdes2265(); - -private: - void fdes2265_map(address_map &map); - void fdes2325_map(address_map &map); - - // I/O handlers - virtual DECLARE_WRITE8_MEMBER(control_w) override; - virtual DECLARE_WRITE8_MEMBER(lcd_w) override; -}; - - class excel68k_state : public eag_state { public: @@ -295,37 +249,6 @@ WRITE8_MEMBER(excel68k_state::mux_w) -/****************************************************************************** - Designer Master -******************************************************************************/ - -WRITE8_MEMBER(desmas_state::control_w) -{ - // same as desdis, d0 instead of d7 - desdis_common_state::control_w(space, offset, data << 7); -} - -WRITE8_MEMBER(desmas_state::lcd_w) -{ - // same as desdis, inverted data - desdis_common_state::lcd_w(space, offset, ~data); -} - -void desmas_state::init_fdes2265() -{ - u16 *rom = (u16*)memregion("maincpu")->base(); - const u32 len = memregion("maincpu")->bytes() / 2; - - // descramble data lines - for (int i = 0; i < len; i++) - rom[i] = bitswap<16>(rom[i], 15,14,8,13,9,12,10,11, 3,4,5,7,6,0,1,2); - - // descramble address lines - std::vector buf(len); - memcpy(&buf[0], rom, len*2); - for (int i = 0; i < len; i++) - rom[i] = buf[bitswap<24>(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)]; -} @@ -413,30 +336,6 @@ void excel68k_state::fex68km3_map(address_map &map) } -// Designer Master - -void desmas_state::fdes2265_map(address_map &map) -{ - map.unmap_value_high(); - map(0x000000, 0x00ffff).rom(); - map(0x000000, 0x00000f).w(FUNC(desmas_state::lcd_w)).umask16(0x00ff); - map(0x044000, 0x047fff).ram(); - map(0x100000, 0x10ffff).ram(); - map(0x140000, 0x14000f).r(FUNC(desmas_state::input_r)).umask16(0xff00); - map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask16(0x00ff); -} - -void desmas_state::fdes2325_map(address_map &map) -{ - map.unmap_value_high(); - map(0x000000, 0x00ffff).rom(); - map(0x100000, 0x10000f).w(FUNC(desmas_state::lcd_w)).umask32(0x00ff00ff); - map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask32(0x00ff00ff); - map(0x180000, 0x18000f).r(FUNC(desmas_state::input_r)).umask32(0xff00ff00); - map(0x300000, 0x37ffff).ram(); - map(0x500000, 0x507fff).ram(); -} - // EAG @@ -583,39 +482,6 @@ void excel68k_state::fex68km3(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km3_map); } -void desmas_state::fdes2265(machine_config &config) -{ - /* basic machine hardware */ - M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F - m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2265_map); - - const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured - TIMER(config, m_irq_on).configure_periodic(FUNC(desmas_state::irq_on), irq_period); - m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us - TIMER(config, "irq_off").configure_periodic(FUNC(desmas_state::irq_off), irq_period); - - TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); - config.set_default_layout(layout_fidel_desdis_68kr); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); - voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); - vref.set_output(5.0); - vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); -} - -void desmas_state::fdes2325(machine_config &config) -{ - fdes2265(config); - - /* basic machine hardware */ - M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25 - m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2325_map); - - config.set_default_layout(layout_fidel_desdis_68kg); -} - void eag_state::eag_base(machine_config &config) { /* basic machine hardware */ @@ -740,21 +606,6 @@ 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( fdes2325 ) // model 6129, PCB label 510.1149A01 - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("61_29_white.ic10", 0x00000, 0x10000, CRC(f74157e1) SHA1(87f3f2d584e292f81593e053240d022cc477834d) ) // 27c512 - - ROM_REGION( 0x100, "pals", 0 ) - ROM_LOAD("101-1097a01.ic19", 0x000, 0x100, NO_DUMP ) // PALCE16V8Q-25PC -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 @@ -824,9 +675,6 @@ CONS( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_in CONS( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) - CONS( 1989, feagv2, 0, 0, eag, eag, eag_state, init_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, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1989, feagv5, feagv2, 0, eagv5, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp new file mode 100644 index 00000000000..aeae9e53604 --- /dev/null +++ b/src/mame/drivers/fidel_desdis.cpp @@ -0,0 +1,356 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger,yoyo_chessboard +/****************************************************************************** + +Designer 2100 Display (model 6106) +---------------- +8KB RAM(MS6264L-10), 2*32KB ROM(27C256) +WDC W65C02P-6 CPU, 6MHz XTAL +4-digit LCD panel +PCB label 510.1130A01 + +Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz + +****************************************************************************** + +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. + +Designer Mach IV Master 2325 (model 6129) +----------------------------------------- +32KB(4*P5164-70) + 512KB(TC518512PL-80) RAM, 64KB ROM(TMS 27C512-120JL) +MC68EC020RP25 CPU, 20MHz XTAL +PCB label 510.1149A01 +It has a green "Shift" led instead of red, and ROM is not scrambled. + +******************************************************************************/ + +#include "emu.h" +#include "includes/fidelbase.h" + +#include "cpu/m6502/r65c02.h" +#include "cpu/m6502/m65sc02.h" +#include "cpu/m68000/m68000.h" +#include "sound/volt_reg.h" +#include "speaker.h" + +// internal artwork +#include "fidel_desdis.lh" // clickable +#include "fidel_desdis_68kg.lh" // clickable +#include "fidel_desdis_68kr.lh" // clickable + + +namespace { + +class desdis_state : public fidelbase_state +{ +public: + desdis_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) + { } + + void fdes2000d(machine_config &config); + void fdes2100d(machine_config &config); + + void init_fdes2100d(); + +protected: + void fdes2100d_map(address_map &map); + + // I/O handlers + virtual DECLARE_WRITE8_MEMBER(control_w); + virtual DECLARE_WRITE8_MEMBER(lcd_w); + virtual DECLARE_READ8_MEMBER(input_r); +}; + +class desmas_state : public desdis_state +{ +public: + desmas_state(const machine_config &mconfig, device_type type, const char *tag) : + desdis_state(mconfig, type, tag) + { } + + void fdes2265(machine_config &config); + void fdes2325(machine_config &config); + + void init_fdes2265(); + +private: + void fdes2265_map(address_map &map); + void fdes2325_map(address_map &map); + + // I/O handlers, slightly different (control_w is d0 instead of d7, lcd_w is inverted) + virtual DECLARE_WRITE8_MEMBER(control_w) override { desdis_state::control_w(space, offset, data << 7); } + virtual DECLARE_WRITE8_MEMBER(lcd_w) override { desdis_state::lcd_w(space, offset, ~data); } +}; + + +// init + +void desdis_state::init_fdes2100d() +{ + m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000); +} + +void desmas_state::init_fdes2265() +{ + u16 *rom = (u16*)memregion("maincpu")->base(); + const u32 len = memregion("maincpu")->bytes() / 2; + + // descramble data lines + for (int i = 0; i < len; i++) + rom[i] = bitswap<16>(rom[i], 15,14,8,13,9,12,10,11, 3,4,5,7,6,0,1,2); + + // descramble address lines + std::vector buf(len); + memcpy(&buf[0], rom, len*2); + for (int i = 0; i < len; i++) + rom[i] = buf[bitswap<24>(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)]; +} + + + +/****************************************************************************** + Devices, I/O +******************************************************************************/ + +// TTL/generic + +WRITE8_MEMBER(desdis_state::control_w) +{ + u8 q3_old = m_led_select & 8; + + // a0-a2,d7: 74259 + u8 mask = 1 << offset; + m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? 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 Q2: book rom A14 + if (m_rombank != nullptr) + m_rombank->set_entry(~m_led_select >> 2 & 1); + + // 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(); +} + +WRITE8_MEMBER(desdis_state::lcd_w) +{ + // a0-a2,d0-d3: 4*74259 to lcd digit segments + u32 mask = bitswap<8>(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) ? 0 : mask); + mask <<= 8; + } +} + +READ8_MEMBER(desdis_state::input_r) +{ + // a0-a2,d7: multiplexed inputs (active low) + return (read_inputs(9) >> offset & 1) ? 0 : 0x80; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void desdis_state::fdes2100d_map(address_map &map) +{ + map(0x0000, 0x1fff).ram(); + map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w)); + map(0x4000, 0x7fff).bankr("rombank"); + map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w)); + map(0x8000, 0xffff).rom(); +} + +void desmas_state::fdes2265_map(address_map &map) +{ + map.unmap_value_high(); + map(0x000000, 0x00ffff).rom(); + map(0x000000, 0x00000f).w(FUNC(desmas_state::lcd_w)).umask16(0x00ff); + map(0x044000, 0x047fff).ram(); + map(0x100000, 0x10ffff).ram(); + map(0x140000, 0x14000f).r(FUNC(desmas_state::input_r)).umask16(0xff00); + map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask16(0x00ff); +} + +void desmas_state::fdes2325_map(address_map &map) +{ + map.unmap_value_high(); + map(0x000000, 0x00ffff).rom(); + map(0x100000, 0x10000f).w(FUNC(desmas_state::lcd_w)).umask32(0x00ff00ff); + map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask32(0x00ff00ff); + map(0x180000, 0x18000f).r(FUNC(desmas_state::input_r)).umask32(0xff00ff00); + map(0x300000, 0x37ffff).ram(); + map(0x500000, 0x507fff).ram(); +} + + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( desdis ) + 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 + + + +/****************************************************************************** + Machine Drivers +******************************************************************************/ + +void desdis_state::fdes2100d(machine_config &config) +{ + /* basic machine hardware */ + M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6 + m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); + + const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) + TIMER(config, m_irq_on).configure_periodic(FUNC(desdis_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config, "irq_off").configure_periodic(FUNC(desdis_state::irq_off), irq_period); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_desdis); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref")); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void desdis_state::fdes2000d(machine_config &config) +{ + fdes2100d(config); + + /* basic machine hardware */ + R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3 + m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map); +} + +void desmas_state::fdes2265(machine_config &config) +{ + /* basic machine hardware */ + M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F + m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2265_map); + + const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(desmas_state::irq_on), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us + TIMER(config, "irq_off").configure_periodic(FUNC(desmas_state::irq_off), irq_period); + + TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); + config.set_default_layout(layout_fidel_desdis_68kr); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.set_output(5.0); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + +void desmas_state::fdes2325(machine_config &config) +{ + fdes2265(config); + + /* basic machine hardware */ + M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25 + m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2325_map); + + config.set_default_layout(layout_fidel_desdis_68kg); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01. The 'rev B' dump came from a post-release bugfix by Fidelity + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // WSI 27C256L-12 + + ROM_REGION( 0x8000, "rombank", 0 ) + ROM_LOAD("bk3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // WSI 27C256L-12 +ROM_END + +ROM_START( fdes2000d ) // model 6105, PCB label 510.1130A01 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("27c256.ic9", 0x8000, 0x8000, CRC(b136d1a1) SHA1(8438790a62f45284ff33a0255c5c89f526726d3e) ) // 27C256, no label + + ROM_REGION( 0x8000, "rombank", ROMREGION_ERASEFF ) // no rom in ic10 +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( fdes2325 ) // model 6129, PCB label 510.1149A01 + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("61_29_white.ic10", 0x00000, 0x10000, CRC(f74157e1) SHA1(87f3f2d584e292f81593e053240d022cc477834d) ) // 27c512 + + ROM_REGION( 0x100, "pals", 0 ) + ROM_LOAD("101-1097a01.ic19", 0x000, 0x100, NO_DUMP ) // PALCE16V8Q-25PC +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1988, fdes2000d, fdes2100d, 0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) + +CONS( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/includes/fidel_desdis_common.h b/src/mame/includes/fidel_desdis_common.h deleted file mode 100644 index c6721b32aa7..00000000000 --- a/src/mame/includes/fidel_desdis_common.h +++ /dev/null @@ -1,33 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** -* -* Fidelity Electronics Designer Display common class -* -******************************************************************************/ - -#pragma once - -#ifndef MAME_INCLUDES_DESDIS_COMMON_H -#define MAME_INCLUDES_DESDIS_COMMON_H - -#include "includes/fidelbase.h" - -class desdis_common_state : public fidelbase_state -{ -public: - desdis_common_state(const machine_config &mconfig, device_type type, const char *tag) : - fidelbase_state(mconfig, type, tag) - { } - -protected: - // I/O handlers - virtual DECLARE_WRITE8_MEMBER(control_w); - virtual DECLARE_WRITE8_MEMBER(lcd_w); - virtual DECLARE_READ8_MEMBER(input_r); -}; - - -INPUT_PORTS_EXTERN( desdis ); - -#endif // MAME_INCLUDES_DESDIS_COMMON_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 50419ca0fe2..6a6b57070f5 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12849,6 +12849,12 @@ feversoc // (c) 2004 fgoal // TF (c) 1979 Taito Corporation fgoala // MF (c) 1979 Taito Corporation +@source:fidel_desdis.cpp +fdes2000d // +fdes2100d // +fdes2265 // +fdes2325 // + @source:fidel_sc6.cpp fscc6 // @@ -12862,8 +12868,6 @@ cscg // * German cscsp // * Spanish fdes2000 // fdes2100 // -fdes2000d // -fdes2100d // feasbu // EAS: Elite A/S Challenger (Budapest program, English) feasbufr // * French feasbug // * German @@ -12908,8 +12912,6 @@ super9ccg // * German super9ccsp // * Spanish @source:fidel68k.cpp -fdes2265 // -fdes2325 // feagv10 // feagv11 // feagv2 // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 5971cac2f34..0b7a45010f9 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -241,6 +241,7 @@ fb01.cpp fc100.cpp fccpu20.cpp fccpu30.cpp +fidel_desdis.cpp fidel_sc6.cpp fidel6502.cpp fidel68k.cpp -- cgit v1.2.3