mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
(nw) output finder for splus,cpp
This commit is contained in:
parent
707764f7d6
commit
5512e70061
@ -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<uint8_t> m_cmosl_ram;
|
||||
required_shared_ptr<uint8_t> m_cmosh_ram;
|
||||
|
||||
// Program and Reel Data
|
||||
optional_shared_ptr<uint8_t> m_program_ram;
|
||||
required_shared_ptr<uint8_t> 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<uint8_t> m_cmosl_ram;
|
||||
required_shared_ptr<uint8_t> m_cmosh_ram;
|
||||
|
||||
// Program and Reel Data
|
||||
optional_shared_ptr<uint8_t> m_program_ram;
|
||||
required_shared_ptr<uint8_t> m_reel_ram;
|
||||
|
||||
// IO Ports
|
||||
required_ioport m_i10;
|
||||
required_ioport m_i20;
|
||||
required_ioport m_i30;
|
||||
required_ioport m_sensor;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<i2cmem_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 {
|
||||
|
Loading…
Reference in New Issue
Block a user