From 2eb4a03cf55433667d83dd9fa39e70e33bf79220 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 16 Jul 2024 13:49:04 +0200 Subject: eag68k: add configuration for eas/prestige conversion --- src/mame/fidelity/eag68k.cpp | 131 +++++++++++++++++++++++++------------- src/mame/fidelity/elite.cpp | 125 +++++++++++++++--------------------- src/mame/layout/fidel_eag_68k.lay | 36 +++++------ src/mame/layout/fidel_ex_68k.lay | 6 +- src/mame/taito/buggychl.cpp | 9 ++- 5 files changed, 165 insertions(+), 142 deletions(-) diff --git a/src/mame/fidelity/eag68k.cpp b/src/mame/fidelity/eag68k.cpp index 69ccd789a9d..e3599e00592 100644 --- a/src/mame/fidelity/eag68k.cpp +++ b/src/mame/fidelity/eag68k.cpp @@ -80,7 +80,7 @@ ripple counter/divider). From Q13 output (counter=8192) we obtain the IRQ signal applied to IPL1 of 68000 (pin 24) 4,9152 MHz / 8192 = 600 Hz. The module slot pinout is different from SCC series. The data on those appears -to be compatible with EAG though and will load fine with an adapter. +to be compatible with EAG though, and will load fine with an adapter. The USART allows for a serial connection between the chess computer and another device, for example the Fidelity Challenger Printer, or a PC. It expects a baud @@ -90,6 +90,13 @@ Fidelity released a DOS tool called EAGLINK which featured PC printer support, complete I/O control, detailed information while the program is 'thinking', etc. It can be enabled with POP3 H3. +The chessboard is the same old wooden Auto Sensory board from EAS / Prestige. +6502-based EAG can easily be upgraded by swapping the PCB. Fidelity also provided +support for converting EAS and Prestige, via optional diode D8 next to the USART. + +To play with this EAS / Prestige configuration on MAME, the user needs to provide +external artwork, or copy internal artwork fidel_eas.lay or fidel_pc.lay. + Memory map: (of what is known) ----------- 000000-01FFFF: 128KB ROM @@ -98,7 +105,7 @@ Memory map: (of what is known) 300000-30000F W hi d0: NE591: 7seg data 300000-30000F W lo d0: NE591: LED data 300000-30000F R lo d7: 74259: keypad rows 0-7 -400000-400007 W lo d0: 74259,74145/7442: led/keypad mux, buzzer out +400000-40000F W lo d0: 74259,74145/7442: led/keypad mux, buzzer out 400000-4????? R hi: external module slot 700002-700003 R lo d7: 74251: keypad row 8 604000-607FFF: 16KB EEPROM @@ -271,9 +278,10 @@ protected: required_device m_board; required_device m_display; required_device m_dac; - optional_ioport_array<3> m_inputs; + optional_ioport_array<4> m_inputs; u8 m_select = 0; + u8 m_inp_mux = 0; u8 m_7seg_data = 0; u8 m_led_data = 0; @@ -287,7 +295,6 @@ protected: void update_dsr(); void mux_w(offs_t offset, u8 data); u8 input_r(offs_t offset); - virtual u8 board_r() { return m_board->read_rank(m_select, true); } void leds_w(offs_t offset, u8 data); void digit_w(offs_t offset, u8 data); }; @@ -296,6 +303,7 @@ void eag_state::machine_start() { // register for savestates save_item(NAME(m_select)); + save_item(NAME(m_inp_mux)); save_item(NAME(m_7seg_data)); save_item(NAME(m_led_data)); } @@ -381,7 +389,7 @@ void premiere_state::machine_reset() eag_state::machine_reset(); // program switch directly selects bank - const u8 bank = m_inputs[2]->read() & 1; + const u8 bank = m_inputs[3]->read() & 1; m_rombank->set_entry(bank); m_nvrambank->set_entry(bank); } @@ -408,9 +416,6 @@ private: void fex68km2_map(address_map &map); void fex68km3_map(address_map &map); void fex68km4_map(address_map &map); - - // I/O handlers - virtual u8 board_r() override { return m_board->read_file(m_select); } }; @@ -426,14 +431,15 @@ void eag_state::update_display() // Excel 68000: 4*7seg leds, 8*8 chessboard leds // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); - m_display->matrix(1 << m_select, m_led_data << 8 | seg_data); + u8 led_data = bitswap<8>(m_led_data,0,1,2,3,4,5,6,7); + m_display->matrix(1 << m_inp_mux, led_data << 8 | seg_data); } void eag_state::update_dsr() { - // USART DSR: 3 more buttons on EAG + // USART DSR: 3 more buttons (and optional diode) on EAG if (m_usart != nullptr) - m_usart->write_dsr(!BIT(m_inputs[1]->read(), m_select)); + m_usart->write_dsr(BIT(~m_inputs[1]->read(), m_inp_mux) & (BIT(m_select, 4) | m_inputs[2]->read())); } void eag_state::mux_w(offs_t offset, u8 data) @@ -442,13 +448,14 @@ void eag_state::mux_w(offs_t offset, u8 data) u8 mask = 1 << offset; m_select = (m_select & ~mask) | ((data & 1) ? mask : 0); - // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C) - m_select &= 0xf; + // 74259 Q0-Q3: 74145 A-D (Q5-Q7 N/C) + // 74259 Q4: optional diode to USART DSR on EAG + m_inp_mux = m_select & 0xf; update_dsr(); // 74145 0-8: input mux, digit/led select // 74145 9: speaker out - m_dac->write(BIT(1 << m_select, 9)); + m_dac->write(BIT(1 << m_inp_mux, 9)); update_display(); } @@ -458,14 +465,20 @@ u8 eag_state::input_r(offs_t offset) // a1-a3,d7: multiplexed inputs (active low) // read chessboard sensors - if (m_select < 8) - data = board_r(); + if (m_inp_mux < 8) + { + // EAG chessboard is rotated 90 degrees + if (m_inputs[2].read_safe(0) & 1) + data = m_board->read_rank(m_inp_mux); + else + data = m_board->read_file(m_inp_mux, true); + } // read button panel - else if (m_select == 8) + else if (m_inp_mux == 8) data = m_inputs[0]->read(); - return (data >> offset & 1) ? 0 : 0x80; + return ~data << offset & 0x80; } void eag_state::leds_w(offs_t offset, u8 data) @@ -560,7 +573,7 @@ void eag_state::eag_map(address_map &map) map(0x104000, 0x107fff).ram(); map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask16(0xff00).nopr(); map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input_r), FUNC(eag_state::leds_w)).umask16(0x00ff); - map(0x400000, 0x400007).w(FUNC(eag_state::mux_w)).umask16(0x00ff); + map(0x400000, 0x40000f).w(FUNC(eag_state::mux_w)).umask16(0x00ff); map(0x400000, 0x407fff).r("cartslot", FUNC(generic_slot_device::read_rom)).umask16(0xff00); map(0x604000, 0x607fff).ram().share("nvram"); map(0x700000, 0x700003).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); @@ -588,7 +601,7 @@ void eag_state::eagv7_map(address_map &map) map(0x104000, 0x107fff).ram(); map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr(); map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff); - map(0x400000, 0x400007).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff); + map(0x400000, 0x40000f).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff); map(0x400000, 0x407fff).r("cartslot", FUNC(generic_slot_device::read_rom)).umask32(0xff00ff00); map(0x604000, 0x607fff).ram().share("nvram"); map(0x700000, 0x700003).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x00ff00ff); @@ -601,7 +614,7 @@ void eag_state::eagv10_map(address_map &map) map(0x00280000, 0x0037ffff).ram(); map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr(); map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(eag_state::input_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff); - map(0x00c00000, 0x00c00007).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff); + map(0x00c00000, 0x00c0000f).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff); map(0x00c00000, 0x00c07fff).r("cartslot", FUNC(generic_slot_device::read_rom)).umask32(0xff00ff00); map(0x00e04000, 0x00e07fff).ram().share("nvram"); map(0x00f00000, 0x00f00003).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x00ff00ff); @@ -614,7 +627,7 @@ void premiere_state::main_map(address_map &map) map(0x100000, 0x13ffff).ram(); map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(premiere_state::digit_w)).umask16(0xff00).nopr(); map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(premiere_state::input_r), FUNC(premiere_state::leds_w)).umask16(0x00ff); - map(0x400000, 0x400007).w(FUNC(premiere_state::mux_w)).umask16(0x00ff); + map(0x400000, 0x40000f).w(FUNC(premiere_state::mux_w)).umask16(0x00ff); map(0x600000, 0x607fff).mirror(0x008000).bankrw(m_nvrambank); map(0x700000, 0x700003).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); } @@ -627,37 +640,67 @@ void premiere_state::main_map(address_map &map) static INPUT_PORTS_START( excel68k ) PORT_START("IN.0") - 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_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") INPUT_PORTS_END -static INPUT_PORTS_START( eag ) +// EAG or EAS / Prestige button panel +#define HOUSING(x) PORT_CONDITION("IN.2", 0x01, EQUALS, x) + +static INPUT_PORTS_START( eag_base ) PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_M) PORT_NAME("DM") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(1) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) +INPUT_PORTS_END + +static INPUT_PORTS_START( eag ) + PORT_INCLUDE( eag_base ) + + PORT_MODIFY("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("PB / King") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("PV / Queen") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TM / Rook") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("ST / Bishop") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("TB / Knight") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn") + + PORT_MODIFY("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_M) PORT_NAME("DM") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) HOUSING(0) PORT_CODE(KEYCODE_V) PORT_NAME("RV") PORT_CHANGED_MEMBER(DEVICE_SELF, eag_state, in1_changed, 0) + + PORT_START("IN.2") // factory set (diode) + PORT_CONFNAME( 0x01, 0x01, "Housing" ) + PORT_CONFSETTING( 0x00, "Elite A/S / Prestige" ) + PORT_CONFSETTING( 0x01, "Elite Avant Garde" ) INPUT_PORTS_END static INPUT_PORTS_START( premiere ) - PORT_INCLUDE( eag ) + PORT_INCLUDE( eag_base ) + + PORT_START("IN.2") // does not work on Vancouver + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_CUSTOM) - PORT_START("IN.2") + PORT_START("IN.3") PORT_CONFNAME( 0x01, 0x00, "Program" ) PORT_CONFSETTING( 0x00, "Vancouver" ) PORT_CONFSETTING( 0x01, "2265" ) diff --git a/src/mame/fidelity/elite.cpp b/src/mame/fidelity/elite.cpp index 274bec2ec24..3827ada2af7 100644 --- a/src/mame/fidelity/elite.cpp +++ b/src/mame/fidelity/elite.cpp @@ -20,7 +20,7 @@ Elite A/S Challenger (EAS) --------------------------------- This came out in 1983. 2 program updates were released in 1983 and 1984, named Budapest and Glasgow, places where Fidelity competed in chess computer -matches (they won it in 1983). A/S stands for auto sensory, it's the 1st +matches (they won it in 1983). A/S stands for Auto Sensory, it's the 1st Fidelity board with magnet sensors. The magnetic chessboard was licensed from AVE Micro Systems, in fact, the PC model board is the same one as in AVE's ARB. @@ -33,7 +33,7 @@ Hardware notes: - 8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs - module slot and printer port -*In West Germany, some distributors released it with overclocked CPUs, +*: In West Germany, some distributors released it with overclocked CPUs, advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL. Though model EWC(improved Budapest) had a 3.57MHz XTAL and EAS-C(Glasgow) had a 4MHz XTAL. Model E4.0 is also assumed to be 4MHz. @@ -104,8 +104,6 @@ namespace { // note: sub-class of fidel_clockdiv_state (see clockdiv.*) -// EAS / shared - class elite_state : public fidel_clockdiv_state { public: @@ -128,12 +126,16 @@ public: void ewc(machine_config &config); void easc(machine_config &config); void easx(machine_config &config); + void eag(machine_config &config); + void eag2100(machine_config &config); + + void init_eag() { m_rotate = true; } DECLARE_INPUT_CHANGED_MEMBER(change_cpu_freq); protected: virtual void machine_start() override; - virtual void machine_reset() override { fidel_clockdiv_state::machine_reset(); } + virtual void machine_reset() override; // devices/pointers optional_device m_ppi8255; @@ -146,15 +148,17 @@ protected: required_region_ptr m_language; required_ioport_array<2> m_inputs; + bool m_rotate = false; u8 m_led_data = 0; u8 m_7seg_data = 0; u8 m_inp_mux = 0; u8 m_speech_bank = 0; // address maps + void pc_map(address_map &map); void eas_map(address_map &map); void eag_map(address_map &map); - void pc_map(address_map &map); + void eag2100_map(address_map &map); // I/O handlers void update_display(); @@ -162,7 +166,6 @@ protected: void segment_w(offs_t offset, u8 data); void led_w(offs_t offset, u8 data); u8 input_r(); - virtual u8 board_r() { return m_board->read_file(m_inp_mux, true); } void ppi_porta_w(u8 data); u8 ppi_portb_r(); void ppi_portc_w(u8 data); @@ -172,6 +175,9 @@ void elite_state::machine_start() { fidel_clockdiv_state::machine_start(); + if (m_rombank != nullptr) + m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000); + // register for savestates save_item(NAME(m_led_data)); save_item(NAME(m_7seg_data)); @@ -179,50 +185,19 @@ void elite_state::machine_start() save_item(NAME(m_speech_bank)); } -INPUT_CHANGED_MEMBER(elite_state::change_cpu_freq) -{ - // known official CPU speeds: 3MHz(EAS), 3.57MHz(PC/EWC/Privat), 4MHz(PC/EAS-C) - static const XTAL xtal[3] = { 3_MHz_XTAL, 3.579545_MHz_XTAL, 4_MHz_XTAL }; - m_maincpu->set_unscaled_clock(xtal[newval % 3]); -} - - -// EAG - -class eag_state : public elite_state +void elite_state::machine_reset() { -public: - eag_state(const machine_config &mconfig, device_type type, const char *tag) : - elite_state(mconfig, type, tag) - { } + fidel_clockdiv_state::machine_reset(); - // machine configs - void eag(machine_config &config); - void eag2100(machine_config &config); - - void init_eag2100(); - -protected: - virtual void machine_reset() override; - -private: - void eag2100_map(address_map &map); - - // board is rotated 90 degrees - virtual u8 board_r() override { return m_board->read_rank(m_inp_mux); } -}; - -void eag_state::init_eag2100() -{ - m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000); + if (m_rombank != nullptr) + m_rombank->set_entry(0); } -void eag_state::machine_reset() +INPUT_CHANGED_MEMBER(elite_state::change_cpu_freq) { - elite_state::machine_reset(); - - if (m_rombank != nullptr) - m_rombank->set_entry(0); + // known official CPU speeds: 3MHz(EAS), 3.57MHz(PC/EWC/Privat), 4MHz(PC/EAS-C) + static const XTAL xtal[3] = { 3_MHz_XTAL, 3.579545_MHz_XTAL, 4_MHz_XTAL }; + m_maincpu->set_unscaled_clock(xtal[newval % 3]); } @@ -267,7 +242,13 @@ u8 elite_state::input_r() // multiplexed inputs (active low) // read chessboard sensors if (m_inp_mux < 8) - data = board_r(); + { + // EAG chessboard is rotated 90 degrees + if (m_rotate) + data = m_board->read_rank(m_inp_mux); + else + data = m_board->read_file(m_inp_mux, true); + } // read button panel else if (m_inp_mux == 8) @@ -377,7 +358,7 @@ void elite_state::eag_map(address_map &map) map(0xa000, 0xffff).rom(); } -void eag_state::eag2100_map(address_map &map) +void elite_state::eag2100_map(address_map &map) { eag_map(map); map(0xa000, 0xbfff).bankr(m_rombank); @@ -555,7 +536,7 @@ void elite_state::easx(machine_config &config) NVRAM(config, "nvram.ic6", nvram_device::DEFAULT_ALL_0); } -void eag_state::eag(machine_config &config) +void elite_state::eag(machine_config &config) { easx(config); @@ -564,12 +545,12 @@ void eag_state::eag(machine_config &config) config.set_default_layout(layout_fidel_eag); } -void eag_state::eag2100(machine_config &config) +void elite_state::eag2100(machine_config &config) { eag(config); // basic machine hardware - m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eag2100_map); + m_maincpu->set_addrmap(AS_PROGRAM, &elite_state::eag2100_map); } @@ -1136,24 +1117,24 @@ ROM_END Drivers *******************************************************************************/ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1983, feas, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (original program)", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, feasbu, feas, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EAS)", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, feasbua, feas, 0, ewc, ewc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EWC)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, feasgla, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 1)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, feasglaa, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, feasglab, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 3)", MACHINE_SUPPORTS_SAVE ) -SYST( 1985, feasx, feas, 0, easx, easx, elite_state, empty_init, "Fidelity Computer Products", "Elite A/S Challenger (experimental)", MACHINE_SUPPORTS_SAVE ) - -SYST( 1982, fpres, 0, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 1)", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, fpresa, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 2)", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, fpresb, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 3)", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, fpresc, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 4)", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, fpresd, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 5)", MACHINE_SUPPORTS_SAVE ) -SYST( 1982, fprese, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 6)", MACHINE_SUPPORTS_SAVE ) -SYST( 1983, fpresbu, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE ) -SYST( 1984, fpresgla, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Glasgow program)", MACHINE_SUPPORTS_SAVE ) - -SYST( 1986, feag, 0, 0, eag, eag, eag_state, empty_init, "Fidelity International", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE ) -SYST( 1986, feag2100, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity International", "Elite Avant Garde 2100 (set 1)", MACHINE_SUPPORTS_SAVE ) -SYST( 1986, feag2100a, feag, 0, eag2100, eag, eag_state, init_eag2100, "Fidelity International", "Elite Avant Garde 2100 (set 2)", MACHINE_SUPPORTS_SAVE ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1983, feas, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (original program)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, feasbu, feas, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EAS)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, feasbua, feas, 0, ewc, ewc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, model EWC)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasgla, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasglaa, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, feasglab, feas, 0, easc, easc, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1985, feasx, feas, 0, easx, easx, elite_state, empty_init, "Fidelity Computer Products", "Elite A/S Challenger (experimental)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1982, fpres, 0, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresa, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 2)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresb, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 3)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresc, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 4)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fpresd, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 5)", MACHINE_SUPPORTS_SAVE ) +SYST( 1982, fprese, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, set 6)", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, fpresbu, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE ) +SYST( 1984, fpresgla, fpres, 0, pc, pc, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Glasgow program)", MACHINE_SUPPORTS_SAVE ) + +SYST( 1986, feag, 0, 0, eag, eag, elite_state, init_eag, "Fidelity International", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, feag2100, feag, 0, eag2100, eag, elite_state, init_eag, "Fidelity International", "Elite Avant Garde 2100 (set 1)", MACHINE_SUPPORTS_SAVE ) +SYST( 1986, feag2100a, feag, 0, eag2100, eag, elite_state, init_eag, "Fidelity International", "Elite Avant Garde 2100 (set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/layout/fidel_eag_68k.lay b/src/mame/layout/fidel_eag_68k.lay index b0052feb4b9..92da831c94e 100644 --- a/src/mame/layout/fidel_eag_68k.lay +++ b/src/mame/layout/fidel_eag_68k.lay @@ -204,7 +204,7 @@ authors:hap - + @@ -452,21 +452,21 @@ authors:hap - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -475,8 +475,8 @@ authors:hap - - + + diff --git a/src/mame/layout/fidel_ex_68k.lay b/src/mame/layout/fidel_ex_68k.lay index fe83395f659..30a59198830 100644 --- a/src/mame/layout/fidel_ex_68k.lay +++ b/src/mame/layout/fidel_ex_68k.lay @@ -207,7 +207,7 @@ authors:hap - + @@ -450,7 +450,7 @@ authors:hap - + @@ -458,7 +458,7 @@ authors:hap - + diff --git a/src/mame/taito/buggychl.cpp b/src/mame/taito/buggychl.cpp index 618728ee1af..821800383f0 100644 --- a/src/mame/taito/buggychl.cpp +++ b/src/mame/taito/buggychl.cpp @@ -21,14 +21,13 @@ TODO: Game attempts to transfer content of videoram into spriteram/scrollram, then transfer back again into videoram. Maybe the host CPU cannot read contents of VRAM at all? -Notes: -- There is also a 4-channel version of the sound board for the cockpit - cabinet (ROMs not dumped) - -Other known undumped versions: +Known undumped versions: +- 4-channel version of the sound board for the cockpit cabinet (actually it is + dumped, but the MAME driver update is WIP) - Another ranking song version - ported to PS2 "Taito Memories". https://youtu.be/JXIvaM5508c?si=wCojMales2Kg9L7u&t=270 (Ranking 1st song) https://youtu.be/Btnl9FYTiL8?si=rrGTblIfOlIQo6NJ&t=308 (Ranking 2nd song) + (perhaps modified for PS2 due to cover song copyright?) - 2 player joystick version - after inserting a coin, instead of "START YOUR ENGINE", it displays "PUSH ONLY 1-PLAYER BUTTON". https://youtu.be/iE9-q4IruS4?si=eYL5_iXDZDyH9TS_&t=31 -- cgit v1.2.3