diff options
Diffstat (limited to 'src/mame/drivers/ave_arb.cpp')
-rw-r--r-- | src/mame/drivers/ave_arb.cpp | 81 |
1 files changed, 62 insertions, 19 deletions
diff --git a/src/mame/drivers/ave_arb.cpp b/src/mame/drivers/ave_arb.cpp index 6a3742bbe4e..d09991ade35 100644 --- a/src/mame/drivers/ave_arb.cpp +++ b/src/mame/drivers/ave_arb.cpp @@ -10,6 +10,7 @@ by Chafitz, and in Germany by Sandy Electronic. TODO: - verify gms40 module memory layout +- need to add checkers pieces and custom initial position when Avelan gets dumped ******************************************************************************* @@ -41,10 +42,10 @@ running at 16MHz. ******************************************************************************/ #include "emu.h" -#include "includes/chessbase.h" - #include "cpu/m6502/m6502.h" #include "cpu/m6502/m65c02.h" +#include "video/pwm.h" +#include "machine/sensorboard.h" #include "machine/6522via.h" #include "machine/nvram.h" #include "sound/dac.h" @@ -60,19 +61,22 @@ running at 16MHz. namespace { -class arb_state : public chessbase_state +class arb_state : public driver_device { public: arb_state(const machine_config &mconfig, device_type type, const char *tag) : - chessbase_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), m_via(*this, "via"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // halt button is tied to NMI, reset button to RESET(but only if halt button is held) - void update_reset() { m_maincpu->set_input_line(INPUT_LINE_RESET, (m_inp_matrix[9]->read() == 3) ? ASSERT_LINE : CLEAR_LINE); } + void update_reset() { m_maincpu->set_input_line(INPUT_LINE_RESET, (m_inputs[1]->read() == 3) ? ASSERT_LINE : CLEAR_LINE); } DECLARE_INPUT_CHANGED_MEMBER(reset_button) { update_reset(); } DECLARE_INPUT_CHANGED_MEMBER(halt_button) { m_maincpu->set_input_line(M6502_NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE); update_reset(); } @@ -80,12 +84,18 @@ public: void arb(machine_config &config); void v2(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device<cpu_device> m_maincpu; + required_device<pwm_display_device> m_display; + required_device<sensorboard_device> m_board; required_device<via6522_device> m_via; required_device<dac_bit_interface> m_dac; optional_device<generic_slot_device> m_cart; + required_ioport_array<2> m_inputs; // address maps void main_map(address_map &map); @@ -101,8 +111,32 @@ private: DECLARE_WRITE8_MEMBER(leds_w); DECLARE_WRITE8_MEMBER(control_w); DECLARE_READ8_MEMBER(input_r); + + u16 m_inp_mux; + u16 m_led_select; + u8 m_led_group; + u8 m_led_latch; + u16 m_led_data; }; +void arb_state::machine_start() +{ + // zerofill + m_inp_mux = 0; + m_led_select = 0; + m_led_group = 0; + m_led_latch = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_group)); + save_item(NAME(m_led_latch)); + save_item(NAME(m_led_data)); +} + + /****************************************************************************** Devices, I/O @@ -137,11 +171,11 @@ void arb_state::update_display() { // 12 led column data lines via 3 7475 u16 mask = 0; - mask |= (m_led_select & 1) ? 0xf00 : 0; - mask |= (m_led_select & 2) ? 0x0ff : 0; + mask |= (m_led_group & 1) ? 0xf00 : 0; + mask |= (m_led_group & 2) ? 0x0ff : 0; m_led_data = (m_led_data & ~mask) | ((m_led_latch << 8 | m_led_latch) & mask); - display_matrix(12, 9+1, m_led_data, m_inp_mux | 0x200); + m_display->matrix(m_led_select | 0x200, m_led_data); } WRITE8_MEMBER(arb_state::leds_w) @@ -155,10 +189,11 @@ WRITE8_MEMBER(arb_state::control_w) { // PB0-PB3: 74145 A-D // 74145 0-8: input mux, led row select - m_inp_mux = 1 << (data & 0xf) & 0x1ff; + m_inp_mux = data & 0xf; + m_led_select = 1 << (data & 0xf) & 0x1ff; // PB4,PB5: led group select - m_led_select = data >> 4 & 3; + m_led_group = data >> 4 & 3; update_display(); // PB7: speaker out @@ -167,8 +202,15 @@ WRITE8_MEMBER(arb_state::control_w) READ8_MEMBER(arb_state::input_r) { + u8 data = 0; + // PA0-PA7: multiplexed inputs - return ~read_inputs(9); + if (m_inp_mux < 8) + data = m_board->read_file(m_inp_mux); + else if (m_inp_mux < 9) + data = m_inputs[m_inp_mux - 8]->read(); + + return ~data; } @@ -199,9 +241,7 @@ void arb_state::v2_map(address_map &map) ******************************************************************************/ static INPUT_PORTS_START( arb ) - PORT_INCLUDE( generic_cb_magnets ) - - PORT_START("IN.8") + PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_7) PORT_NAME("Hint / Black") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_6) PORT_NAME("Variable / Clear / White / 6") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_5) PORT_NAME("Monitor / Take Back / King / 5") @@ -211,7 +251,7 @@ static INPUT_PORTS_START( arb ) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_1) PORT_NAME("Change Level / Knight / 1") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_0) PORT_NAME("New Game / Options / Pawn / 0") - PORT_START("IN.9") + PORT_START("IN.1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F2) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, reset_button, nullptr) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_F2) PORT_NAME("Halt") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, halt_button, nullptr) INPUT_PORTS_END @@ -236,7 +276,10 @@ void arb_state::v2(machine_config &config) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - TIMER(config, "display_decay").configure_periodic(FUNC(arb_state::display_decay_tick), attotime::from_msec(1)); + SENSORBOARD(config, m_board).set_preset(sensorboard_device::CHESS_MAGNETS); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9+1, 12); config.set_default_layout(layout_ave_arb); /* sound hardware */ @@ -288,5 +331,5 @@ ROM_END ******************************************************************************/ /* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) -CONS( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) |