(nw) output finder for gp_1,gp_2,gts3,gts3a,gts80. Fix for s11b,s11c.

This commit is contained in:
Robbbert 2018-04-05 00:40:54 +10:00
parent e6a80d2e54
commit 62d1435706
7 changed files with 32 additions and 19 deletions

View File

@ -49,6 +49,7 @@ public:
, m_io_x9(*this, "X9") , m_io_x9(*this, "X9")
, m_io_xa(*this, "XA") , m_io_xa(*this, "XA")
, m_io_xb(*this, "XB") , m_io_xb(*this, "XB")
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(gp_1); DECLARE_DRIVER_INIT(gp_1);
@ -66,6 +67,7 @@ private:
uint8_t m_digit; uint8_t m_digit;
uint8_t m_segment[16]; uint8_t m_segment[16];
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<z80ctc_device> m_ctc; required_device<z80ctc_device> m_ctc;
optional_device<sn76477_device> m_sn; optional_device<sn76477_device> m_sn;
@ -78,6 +80,7 @@ private:
required_ioport m_io_x9; required_ioport m_io_x9;
required_ioport m_io_xa; required_ioport m_io_xa;
required_ioport m_io_xb; required_ioport m_io_xb;
output_finder<40> m_digits;
}; };
@ -360,10 +363,10 @@ WRITE8_MEMBER( gp_1_state::porta_w )
else else
if (m_u14 == 8) if (m_u14 == 8)
{ {
output().set_digit_value(m_digit, patterns[m_segment[8]]); m_digits[m_digit] = patterns[m_segment[8]];
output().set_digit_value(m_digit+8, patterns[m_segment[9]]); m_digits[m_digit+8] = patterns[m_segment[9]];
output().set_digit_value(m_digit+16, patterns[m_segment[10]]); m_digits[m_digit+16] = patterns[m_segment[10]];
output().set_digit_value(m_digit+24, patterns[m_segment[11]]); m_digits[m_digit+24] = patterns[m_segment[11]];
} }
} }

View File

@ -12,7 +12,7 @@ the first high score at which a free credit is awarded. Then press 9 to set the
back to normal operation. If this setup is not done, each player will get 3 free back to normal operation. If this setup is not done, each player will get 3 free
games at the start of ball 1. games at the start of ball 1.
All the Z80 "maincpu" code is copied from gp_1.c All the Z80 "maincpu" code is copied from gp_1.cpp
Any bug fixes need to be applied both here and there. Any bug fixes need to be applied both here and there.
Sound boards: (each game has its own custom sounds) Sound boards: (each game has its own custom sounds)
@ -58,6 +58,7 @@ public:
, m_io_x9(*this, "X9") , m_io_x9(*this, "X9")
, m_io_xa(*this, "XA") , m_io_xa(*this, "XA")
, m_io_xb(*this, "XB") , m_io_xb(*this, "XB")
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(gp_2); DECLARE_DRIVER_INIT(gp_2);
@ -73,6 +74,7 @@ private:
uint8_t m_digit; uint8_t m_digit;
uint8_t m_segment[16]; uint8_t m_segment[16];
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<z80ctc_device> m_ctc; required_device<z80ctc_device> m_ctc;
required_ioport m_io_dsw0; required_ioport m_io_dsw0;
@ -84,6 +86,7 @@ private:
required_ioport m_io_x9; required_ioport m_io_x9;
required_ioport m_io_xa; required_ioport m_io_xa;
required_ioport m_io_xb; required_ioport m_io_xb;
output_finder<40> m_digits;
}; };
@ -543,11 +546,11 @@ WRITE8_MEMBER( gp_2_state::porta_w )
else else
if (m_u14 == 7) if (m_u14 == 7)
{ {
output().set_digit_value(m_digit, patterns[m_segment[7]]); m_digits[m_digit] = patterns[m_segment[7]];
output().set_digit_value(m_digit+8, patterns[m_segment[8]]); m_digits[m_digit+8] = patterns[m_segment[8]];
output().set_digit_value(m_digit+16, patterns[m_segment[9]]); m_digits[m_digit+16] = patterns[m_segment[9]];
output().set_digit_value(m_digit+24, patterns[m_segment[10]]); m_digits[m_digit+24] = patterns[m_segment[10]];
output().set_digit_value(m_digit+32, patterns[m_segment[11]]); m_digits[m_digit+32] = patterns[m_segment[11]];
} }
} }

View File

@ -45,6 +45,7 @@ public:
, m_u4(*this, "u4") , m_u4(*this, "u4")
, m_u5(*this, "u5") , m_u5(*this, "u5")
, m_switches(*this, "X.%u", 0) , m_switches(*this, "X.%u", 0)
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(gts3); DECLARE_DRIVER_INIT(gts3);
@ -64,10 +65,12 @@ private:
uint8_t m_segment[4]; uint8_t m_segment[4];
uint8_t m_u4b; uint8_t m_u4b;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<m65c02_device> m_maincpu; required_device<m65c02_device> m_maincpu;
required_device<via6522_device> m_u4; required_device<via6522_device> m_u4;
required_device<via6522_device> m_u5; required_device<via6522_device> m_u5;
required_ioport_array<12> m_switches; required_ioport_array<12> m_switches;
output_finder<40> m_digits;
}; };
@ -224,7 +227,8 @@ WRITE8_MEMBER( gts3_state::segbank_w )
m_segment[offset] = data; m_segment[offset] = data;
seg1 = m_segment[offset&2] | (m_segment[offset|1] << 8); seg1 = m_segment[offset&2] | (m_segment[offset|1] << 8);
seg2 = bitswap<32>(seg1,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,14,9,7,13,11,10,6,8,12,5,4,3,3,2,1,0,0); seg2 = bitswap<32>(seg1,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,14,9,7,13,11,10,6,8,12,5,4,3,3,2,1,0,0);
output().set_digit_value(m_digit+(BIT(offset, 1) ? 0 : 20), seg2); if (m_digit < 20)
m_digits[m_digit+(BIT(offset, 1) ? 0 : 20)] = seg2;
} }
WRITE8_MEMBER( gts3_state::u4b_w ) WRITE8_MEMBER( gts3_state::u4b_w )

View File

@ -38,6 +38,7 @@ public:
, m_u4(*this, "u4") , m_u4(*this, "u4")
, m_u5(*this, "u5") , m_u5(*this, "u5")
, m_switches(*this, "X.%u", 0) , m_switches(*this, "X.%u", 0)
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(gts3a); DECLARE_DRIVER_INIT(gts3a);
@ -64,11 +65,13 @@ private:
uint8_t m_u4b; uint8_t m_u4b;
uint8_t m_dmd; uint8_t m_dmd;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<m65c02_device> m_maincpu; required_device<m65c02_device> m_maincpu;
required_device<m65c02_device> m_dmdcpu; required_device<m65c02_device> m_dmdcpu;
required_device<via6522_device> m_u4; required_device<via6522_device> m_u4;
required_device<via6522_device> m_u5; required_device<via6522_device> m_u5;
required_ioport_array<12> m_switches; required_ioport_array<12> m_switches;
output_finder<40> m_digits;
}; };
@ -238,7 +241,7 @@ WRITE8_MEMBER( gts3a_state::segbank_w )
m_segment[offset] = data; m_segment[offset] = data;
seg1 = m_segment[offset&2] | (m_segment[offset|1] << 8); seg1 = m_segment[offset&2] | (m_segment[offset|1] << 8);
seg2 = bitswap<32>(seg1,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,14,9,7,13,11,10,6,8,12,5,4,3,3,2,1,0,0); seg2 = bitswap<32>(seg1,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,14,9,7,13,11,10,6,8,12,5,4,3,3,2,1,0,0);
output().set_digit_value(m_digit+(BIT(offset, 1) ? 0 : 20), seg2); m_digits[m_digit+(BIT(offset, 1) ? 0 : 20)] = seg2;
} }
WRITE8_MEMBER( gts3a_state::u4b_w ) WRITE8_MEMBER( gts3a_state::u4b_w )

View File

@ -38,6 +38,7 @@ public:
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_r0_sound(*this, "r0sound") , m_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound") , m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(gts80); DECLARE_DRIVER_INIT(gts80);
@ -59,9 +60,11 @@ private:
uint8_t m_lamprow; uint8_t m_lamprow;
uint8_t m_swrow; uint8_t m_swrow;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<gottlieb_sound_r0_device> m_r0_sound; optional_device<gottlieb_sound_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound; optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<56> m_digits;
}; };
void gts80_state::gts80_map(address_map &map) void gts80_state::gts80_map(address_map &map)
@ -306,15 +309,15 @@ WRITE8_MEMBER( gts80_state::port2a_w )
{ {
case 0x10: // player 1&2 case 0x10: // player 1&2
if (!BIT(m_segment, 7)) seg2 |= 0x300; // put '1' in the middle if (!BIT(m_segment, 7)) seg2 |= 0x300; // put '1' in the middle
output().set_digit_value(data & 15, seg2); m_digits[data & 15] = seg2;
break; break;
case 0x20: // player 3&4 case 0x20: // player 3&4
if (!BIT(m_segment, 7)) seg2 |= 0x300; // put '1' in the middle if (!BIT(m_segment, 7)) seg2 |= 0x300; // put '1' in the middle
output().set_digit_value((data & 15)+20, seg2); m_digits[(data & 15)+20] = seg2;
break; break;
case 0x40: // credits & balls case 0x40: // credits & balls
if (!BIT(m_segment, 7)) m_segment = 1; // turn '1' back to normal if (!BIT(m_segment, 7)) m_segment = 1; // turn '1' back to normal
output().set_digit_value((data & 15)+40, patterns[m_segment & 15]); m_digits[(data & 15)+40] = patterns[m_segment & 15];
break; break;
} }
} }

View File

@ -114,6 +114,7 @@ protected:
void set_segment2(uint32_t s) { m_segment2 = s; } void set_segment2(uint32_t s) { m_segment2 = s; }
void set_timer(emu_timer* t) { m_irq_timer = t; } void set_timer(emu_timer* t) { m_irq_timer = t; }
virtual void machine_start() override { m_digits.resolve(); }
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
static const device_timer_id TIMER_IRQ = 0; static const device_timer_id TIMER_IRQ = 0;
private: private:
@ -125,7 +126,6 @@ private:
uint32_t m_segment2; uint32_t m_segment2;
emu_timer* m_irq_timer; emu_timer* m_irq_timer;
bool m_irq_active; bool m_irq_active;
virtual void machine_start() override { m_digits.resolve(); }
}; };
#endif // MAME_INCLUDES_S11_H #endif // MAME_INCLUDES_S11_H

View File

@ -17,7 +17,6 @@ public:
s11b_state(const machine_config &mconfig, device_type type, const char *tag) s11b_state(const machine_config &mconfig, device_type type, const char *tag)
: s11a_state(mconfig, type, tag) : s11a_state(mconfig, type, tag)
, m_bg_hc55516(*this, "hc55516_bg") , m_bg_hc55516(*this, "hc55516_bg")
, m_digits(*this, "digit%u", 0U)
{ } { }
DECLARE_WRITE8_MEMBER(dig1_w); DECLARE_WRITE8_MEMBER(dig1_w);
@ -38,12 +37,10 @@ public:
void s11b_main_map(address_map &map); void s11b_main_map(address_map &map);
protected: protected:
optional_device<hc55516_device> m_bg_hc55516; optional_device<hc55516_device> m_bg_hc55516;
output_finder<64> m_digits;
void set_invert(bool inv) { m_invert = inv; } void set_invert(bool inv) { m_invert = inv; }
private: private:
virtual void machine_start() override { m_digits.resolve(); }
bool m_invert; // later System 11B games start expecting inverted data to the display LED segments. bool m_invert; // later System 11B games start expecting inverted data to the display LED segments.