diff --git a/src/mame/drivers/splus.cpp b/src/mame/drivers/splus.cpp index 19fbeba80d8..7208d09f72e 100644 --- a/src/mame/drivers/splus.cpp +++ b/src/mame/drivers/splus.cpp @@ -38,17 +38,19 @@ class splus_state : public driver_device { public: splus_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_cmosl_ram(*this, "cmosl"), - m_cmosh_ram(*this, "cmosh"), - m_program_ram(*this, "program_ram"), - m_reel_ram(*this, "reel_ram"), - m_i10(*this, "I10"), - m_i20(*this, "I20"), - m_i30(*this, "I30"), - m_sensor(*this, "SENSOR"), - m_maincpu(*this, "maincpu"), - m_i2cmem(*this, "i2cmem") + : driver_device(mconfig, type, tag) + , m_cmosl_ram(*this, "cmosl") + , m_cmosh_ram(*this, "cmosh") + , m_program_ram(*this, "program_ram") + , m_reel_ram(*this, "reel_ram") + , m_i10(*this, "I10") + , m_i20(*this, "I20") + , m_i30(*this, "I30") + , m_sensor(*this, "SENSOR") + , m_maincpu(*this, "maincpu") + , m_i2cmem(*this, "i2cmem") + , m_digits(*this, "digit%u", 0U) + , m_leds(*this, "s_bnk%u%u", 0U, 0U) { m_sda_dir = 0; m_coin_state = 0; @@ -69,20 +71,25 @@ public: return 0; } - // Pointers to External RAM - required_shared_ptr m_cmosl_ram; - required_shared_ptr m_cmosh_ram; - - // Program and Reel Data - optional_shared_ptr m_program_ram; - required_shared_ptr m_reel_ram; - - // IO Ports - required_ioport m_i10; - required_ioport m_i20; - required_ioport m_i30; - required_ioport m_sensor; + DECLARE_WRITE8_MEMBER(splus_p1_w); + DECLARE_WRITE8_MEMBER(splus_load_pulse_w); + DECLARE_WRITE8_MEMBER(splus_serial_w); + DECLARE_WRITE8_MEMBER(splus_7seg_w); + DECLARE_WRITE8_MEMBER(splus_duart_w); + DECLARE_READ8_MEMBER(splus_serial_r); + DECLARE_READ8_MEMBER(splus_m_reel_ram_r); + DECLARE_READ8_MEMBER(splus_p3_r); + DECLARE_READ8_MEMBER(splus_duart_r); + DECLARE_READ8_MEMBER(splus_watchdog_r); + DECLARE_READ8_MEMBER(splus_registers_r); + DECLARE_WRITE8_MEMBER(i2c_nvram_w); + DECLARE_READ8_MEMBER(splus_reel_optics_r); + DECLARE_DRIVER_INIT(splus); + void splus(machine_config &config); + void splus_iomap(address_map &map); + void splus_map(address_map &map); +private: // EEPROM States int m_sda_dir; @@ -104,25 +111,29 @@ public: int16_t m_stepper_pos[5]; uint8_t m_stop_pos[5]; - DECLARE_WRITE8_MEMBER(splus_p1_w); - DECLARE_WRITE8_MEMBER(splus_load_pulse_w); - DECLARE_WRITE8_MEMBER(splus_serial_w); - DECLARE_WRITE8_MEMBER(splus_7seg_w); - DECLARE_WRITE8_MEMBER(splus_duart_w); - DECLARE_READ8_MEMBER(splus_serial_r); - DECLARE_READ8_MEMBER(splus_m_reel_ram_r); - DECLARE_READ8_MEMBER(splus_p3_r); - DECLARE_READ8_MEMBER(splus_duart_r); - DECLARE_READ8_MEMBER(splus_watchdog_r); - DECLARE_READ8_MEMBER(splus_registers_r); - DECLARE_WRITE8_MEMBER(i2c_nvram_w); - DECLARE_READ8_MEMBER(splus_reel_optics_r); - DECLARE_DRIVER_INIT(splus); + virtual void machine_start() override + { + m_digits.resolve(); + m_leds.resolve(); + } + + // Pointers to External RAM + required_shared_ptr m_cmosl_ram; + required_shared_ptr m_cmosh_ram; + + // Program and Reel Data + optional_shared_ptr m_program_ram; + required_shared_ptr m_reel_ram; + + // IO Ports + required_ioport m_i10; + required_ioport m_i20; + required_ioport m_i30; + required_ioport m_sensor; required_device m_maincpu; required_device m_i2cmem; - void splus(machine_config &config); - void splus_iomap(address_map &map); - void splus_map(address_map &map); + output_finder<9> m_digits; + output_finder<5,8> m_leds; }; /* Static Variables */ @@ -170,20 +181,26 @@ WRITE8_MEMBER(splus_state::splus_p1_w) m_p1_unknown = (~data & 0x80); // Stepper Motor Engaged - if (((m_bank40 >> 0) & 1) == 0x01) { + if (BIT(m_bank40, 0)) + { // Reel Controllers Only m_p1_reels = (data & 0x1f); // Loop through Reel Controllers - for (int x = 0; x < 5; x++) { + for (int x = 0; x < 5; x++) + { // Test Reel Controller - if (((m_p1_reels >> x) & 1) == 0x01) { + if (BIT(m_p1_reels, x)) + { // Forward Direction - if (((m_bank10 >> 5) & 1) == 0x01) { + if (BIT(m_bank10, 5)) + { m_stepper_pos[x]++; if (m_stepper_pos[x] == MAX_STEPPER) m_stepper_pos[x] = 0; - } else { + } + else + { m_stepper_pos[x]--; if (m_stepper_pos[x] < 0) m_stepper_pos[x] = MAX_STEPPER - 1; @@ -194,7 +211,7 @@ WRITE8_MEMBER(splus_state::splus_p1_w) } #if DEBUG_OUTPUT if ((data & 0x1f) == 0x01) - osd_printf_info("Steppers %02X-%02X-%02X-%02X-%02X Motor=%02X Dir=%02X reels=%02X unk=%02X\n", m_stop_pos[0],m_stop_pos[1],m_stop_pos[2],m_stop_pos[3],m_stop_pos[4],((m_bank40 >> 0) & 1),((m_bank10 >> 5) & 1),(data & 0x1f), m_p1_unknown); + osd_printf_info("Steppers %02X-%02X-%02X-%02X-%02X Motor=%02X Dir=%02X reels=%02X unk=%02X\n", m_stop_pos[0],m_stop_pos[1],m_stop_pos[2],m_stop_pos[3],m_stop_pos[4],BIT(m_bank40, 0),BIT(m_bank10, 5),(data & 0x1f), m_p1_unknown); #endif } } @@ -213,135 +230,111 @@ WRITE8_MEMBER(splus_state::splus_serial_w) switch (out) { case 0x00: // Bank 10 - if (((m_bank10 >> 0) & 1) != ((data >> 0) & 1)) { #if DEBUG_OUTPUT - osd_printf_info("Coin Drop Meter =%02X\n",(data >> 0) & 1); + if (BIT(m_bank10, 0) != BIT(data, 0)) { + osd_printf_info("Coin Drop Meter =%02X\n",BIT(data, 0); + } + if (BIT(m_bank10, 1) != BIT(data, 1)) { + osd_printf_info("Coin Out Meter =%02X\n",BIT(data, 1); + } + if (BIT(m_bank10, 2) != BIT(data, 2)) { + osd_printf_info("Coin In Meter =%02X\n",BIT(data, 2); + } + if (BIT(m_bank10, 3) != BIT(data, 3)) { + //osd_printf_info("B Switch for SDS =%02X\n",BIT(data, 3); + } + if (BIT(m_bank10, 4) != BIT(data, 4)) { + osd_printf_info("Hopper Drive 2 =%02X\n",BIT(data, 4); + } + if (BIT(m_bank10, 5) != BIT(data, 5)) { + osd_printf_info("Stepper Motor Direction =%02X\n",BIT(data, 5); + } + if (BIT(m_bank10, 6) != BIT(data, 6)) { + osd_printf_info("Mechanical Bell =%02X\n",BIT(data, 6); + } + if (BIT(m_bank10, 7) != BIT(data, 7)) { + osd_printf_info("Cancelled Credits Meter =%02X\n",BIT(data, 7); + } #endif - } - if (((m_bank10 >> 1) & 1) != ((data >> 1) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Coin Out Meter =%02X\n",(data >> 1) & 1); -#endif - } - if (((m_bank10 >> 2) & 1) != ((data >> 2) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Coin In Meter =%02X\n",(data >> 2) & 1); -#endif - } - if (((m_bank10 >> 3) & 1) != ((data >> 3) & 1)) { - //osd_printf_info("B Switch for SDS =%02X\n",(data >> 3) & 1); - } - if (((m_bank10 >> 4) & 1) != ((data >> 4) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Hopper Drive 2 =%02X\n",(data >> 4) & 1); -#endif - } - if (((m_bank10 >> 5) & 1) != ((data >> 5) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Stepper Motor Direction =%02X\n",(data >> 5) & 1); -#endif - } - if (((m_bank10 >> 6) & 1) != ((data >> 6) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Mechanical Bell =%02X\n",(data >> 6) & 1); -#endif - } - if (((m_bank10 >> 7) & 1) != ((data >> 7) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Cancelled Credits Meter =%02X\n",(data >> 7) & 1); -#endif - } m_bank10 = data; - output().set_value("s_bnk10",(data >> 0) & 1); // Coin Drop Meter - output().set_value("s_bnk11",(data >> 1) & 1); // Coin Out Meter - output().set_value("s_bnk12",(data >> 2) & 1); // Coin In Meter - output().set_value("s_bnk13",(data >> 3) & 1); // B Switch for SDS - output().set_value("s_bnk14",(data >> 4) & 1); // Hopper Drive 2 - output().set_value("s_bnk15",(data >> 5) & 1); // Stepper Motor Direction - output().set_value("s_bnk16",(data >> 6) & 1); // Mechanical Bell - output().set_value("s_bnk17",(data >> 7) & 1); // Cancelled Credits Meter + m_leds[1][0] = BIT(data, 0); // Coin Drop Meter + m_leds[1][1] = BIT(data, 1); // Coin Out Meter + m_leds[1][2] = BIT(data, 2); // Coin In Meter + m_leds[1][3] = BIT(data, 3); // B Switch for SDS + m_leds[1][4] = BIT(data, 4); // Hopper Drive 2 + m_leds[1][5] = BIT(data, 5); // Stepper Motor Direction + m_leds[1][6] = BIT(data, 6); // Mechanical Bell + m_leds[1][7] = BIT(data, 7); // Cancelled Credits Meter break; case 0x01: // Bank 20 - if (((m_bank20 >> 5) & 1) != ((data >> 5) & 1)) { #if DEBUG_OUTPUT - osd_printf_info("Games Played Meter =%02X\n",(data >> 5) & 1); -#endif + if (BIT(m_bank20, 5) != BIT(data, 5)) { + osd_printf_info("Games Played Meter =%02X\n",BIT(data, 5); } - if (((m_bank20 >> 6) & 1) != ((data >> 6) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Bill Acceptor Enable =%02X\n",(data >> 6) & 1); -#endif + if (BIT(m_bank20, 6) != BIT(data, 6)) { + osd_printf_info("Bill Acceptor Enable =%02X\n",BIT(data, 6); } - if (((m_bank20 >> 7) & 1) != ((data >> 7) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Jackpots Meter =%02X\n",(data >> 7) & 1); -#endif + if (BIT(m_bank20, 7) != BIT(data, 7)) { + osd_printf_info("Jackpots Meter =%02X\n",BIT(data, 7); } +#endif m_bank20 = data; - output().set_value("s_bnk20",(data >> 0) & 1); // Payline Lamp 3 - output().set_value("s_bnk21",(data >> 1) & 1); // Payline Lamp 4 - output().set_value("s_bnk22",(data >> 2) & 1); // Payline Lamp 5 - output().set_value("s_bnk23",(data >> 3) & 1); // Payline Lamp 6 - output().set_value("s_bnk24",(data >> 4) & 1); // Door Optics Transmitter - output().set_value("s_bnk25",(data >> 5) & 1); // Games Played Meter - output().set_value("s_bnk26",(data >> 6) & 1); // Bill Acceptor Enable - output().set_value("s_bnk27",(data >> 7) & 1); // Jackpots Meter + m_leds[2][0] = BIT(data, 0); // Payline Lamp 3 + m_leds[2][1] = BIT(data, 1); // Payline Lamp 4 + m_leds[2][2] = BIT(data, 2); // Payline Lamp 5 + m_leds[2][3] = BIT(data, 3); // Payline Lamp 6 + m_leds[2][4] = BIT(data, 4); // Door Optics Transmitter + m_leds[2][5] = BIT(data, 5); // Games Played Meter + m_leds[2][6] = BIT(data, 6); // Bill Acceptor Enable + m_leds[2][7] = BIT(data, 7); // Jackpots Meter break; case 0x02: // Bank 30 - if (((m_bank30 >> 2) & 1) != ((data >> 2) & 1)) { #if DEBUG_OUTPUT - osd_printf_info("Handle Release =%02X\n",(data >> 2) & 1); -#endif + if (BIT(m_bank30, 2) != BIT(data, 2)) { + osd_printf_info("Handle Release =%02X\n",BIT(data, 2); } - if (((m_bank30 >> 3) & 1) != ((data >> 3) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Diverter =%02X\n",(data >> 3) & 1); -#endif + if (BIT(m_bank30, 3) != BIT(data, 3)) { + osd_printf_info("Diverter =%02X\n",BIT(data, 3); } - if (((m_bank30 >> 4) & 1) != ((data >> 4) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Coin Lockout =%02X\n",(data >> 4) & 1); -#endif + if (BIT(m_bank30, 4) != BIT(data, 4)) { + osd_printf_info("Coin Lockout =%02X\n",BIT(data, 4); } - if (((m_bank30 >> 5) & 1) != ((data >> 5) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Hopper Drive 1 =%02X\n",(data >> 5) & 1); -#endif + if (BIT(m_bank30, 5) != BIT(data, 5)) { + osd_printf_info("Hopper Drive 1 =%02X\n",BIT(data, 5); } +#endif m_bank30 = data; - output().set_value("s_bnk30",(data >> 0) & 1); // Change Candle Lamp Bottom - output().set_value("s_bnk31",(data >> 1) & 1); // Change Candle Lamp Top - output().set_value("s_bnk32",(data >> 2) & 1); // Handle Release - output().set_value("s_bnk33",(data >> 3) & 1); // Diverter - output().set_value("s_bnk34",(data >> 4) & 1); // Coin Lockout - output().set_value("s_bnk35",(data >> 5) & 1); // Hopper Drive 1 - output().set_value("s_bnk36",(data >> 6) & 1); // Payline Lamp 1 - output().set_value("s_bnk37",(data >> 7) & 1); // Payline Lamp 2 + m_leds[3][0] = BIT(data, 0); // Change Candle Lamp Bottom + m_leds[3][1] = BIT(data, 1); // Change Candle Lamp Top + m_leds[3][2] = BIT(data, 2); // Handle Release + m_leds[3][3] = BIT(data, 3); // Diverter + m_leds[3][4] = BIT(data, 4); // Coin Lockout + m_leds[3][5] = BIT(data, 5); // Hopper Drive 1 + m_leds[3][6] = BIT(data, 6); // Payline Lamp 1 + m_leds[3][7] = BIT(data, 7); // Payline Lamp 2 break; case 0x04: // Bank 40 - if (((m_bank40 >> 0) & 1) != ((data >> 0) & 1)) { #if DEBUG_OUTPUT - osd_printf_info("Stepper Motor Power Supply =%02X\n",(data >> 0) & 1); -#endif + if (BIT(m_bank40, 0) != BIT(data, 0)) { + osd_printf_info("Stepper Motor Power Supply =%02X\n",BIT(data, 0); } - if (((m_bank40 >> 3) & 1) != ((data >> 3) & 1)) { -#if DEBUG_OUTPUT - osd_printf_info("Jackpot/Hand Pay Lamp =%02X\n",(data >> 3) & 1); -#endif + if (BIT(m_bank40, 3) != BIT(data, 3)) { + osd_printf_info("Jackpot/Hand Pay Lamp =%02X\n",BIT(data, 3); } +#endif m_bank40 = data; - output().set_value("s_bnk40",(data >> 0) & 1); // Stepper Motor Power Supply - output().set_value("s_bnk41",(data >> 1) & 1); // Insert Coin Lamp - output().set_value("s_bnk42",(data >> 2) & 1); // Coin Accepted Lamp - output().set_value("s_bnk43",(data >> 3) & 1); // Jackpot/Hand Pay Lamp - output().set_value("s_bnk44",(data >> 4) & 1); // Play Max Credits Lamp - output().set_value("s_bnk45",(data >> 5) & 1); // Bet One Credit Lamp - output().set_value("s_bnk46",(data >> 6) & 1); // Cashout Credit Lamp - output().set_value("s_bnk47",(data >> 7) & 1); // Spin Button Lamp + m_leds[4][0] = BIT(data, 0); // Stepper Motor Power Supply + m_leds[4][1] = BIT(data, 1); // Insert Coin Lamp + m_leds[4][2] = BIT(data, 2); // Coin Accepted Lamp + m_leds[4][3] = BIT(data, 3); // Jackpot/Hand Pay Lamp + m_leds[4][4] = BIT(data, 4); // Play Max Credits Lamp + m_leds[4][5] = BIT(data, 5); // Bet One Credit Lamp + m_leds[4][6] = BIT(data, 6); // Cashout Credit Lamp + m_leds[4][7] = BIT(data, 7); // Spin Button Lamp break; } } @@ -357,8 +350,8 @@ WRITE8_MEMBER(splus_state::splus_7seg_w) val = (~data & 0x0f); // Digit Value // Need to add ~m_io_port1-1 to seg value - if (seg < 0x0a && (m_io_port1 & 0xe0) == 0xe0) - output().set_digit_value(seg, ls48_map[val]); + if (seg < 9 && (m_io_port1 & 0xe0) == 0xe0) + m_digits[seg] = ls48_map[val]; } WRITE8_MEMBER(splus_state::splus_duart_w) @@ -449,10 +442,10 @@ READ8_MEMBER(splus_state::splus_serial_r) if ((m_i10->read() & 0x08) == 0x08) door_optics = 0x08; else - door_optics = (((m_bank20 >> 4) & 1) << 3); // Use Door Optics Transmitter + door_optics = BIT(m_bank20, 4) << 3; // Use Door Optics Transmitter // Test if Hopper 1 and Hopper 2 Motors On - if (((m_bank10 >> 4) & 1) || ((m_bank30 >> 5) & 1)) { + if (BIT(m_bank10, 4) || BIT(m_bank30, 5)) { if (m_coin_out_state == 0) m_coin_out_state = 3; } else {