diff options
Diffstat (limited to 'src/mame/machine/atarifb.cpp')
-rw-r--r-- | src/mame/machine/atarifb.cpp | 125 |
1 files changed, 52 insertions, 73 deletions
diff --git a/src/mame/machine/atarifb.cpp b/src/mame/machine/atarifb.cpp index 74a5e59aa79..5c31ae29be3 100644 --- a/src/mame/machine/atarifb.cpp +++ b/src/mame/machine/atarifb.cpp @@ -11,25 +11,31 @@ #include "sound/discrete.h" +/************************************* + * + * Output ports + * + *************************************/ + void atarifb_state::atarifb_out1_w(uint8_t data) { - m_CTRLD = data; + m_ctrld = data; - m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle - m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit - m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract - m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker + m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle + m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit + m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract + m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker } void atarifb_state::atarifb4_out1_w(uint8_t data) { - m_CTRLD = data; + m_ctrld = data; - m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle - m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit - m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract - m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker + m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle + m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit + m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract + m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker machine().bookkeeping().coin_counter_w(1, data & 0x80); } @@ -37,46 +43,36 @@ void atarifb_state::atarifb4_out1_w(uint8_t data) void atarifb_state::abaseb_out1_w(uint8_t data) { - m_CTRLD = data; + m_ctrld = data; - m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle - m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit - m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract - m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker + m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle + m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit + m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract + m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker - if (data & 0x80) - { - /* Invert video */ - m_palette->set_pen_color(1, rgb_t(0x00,0x00,0x00)); /* black */ - m_palette->set_pen_color(0, rgb_t(0xff,0xff,0xff)); /* white */ - } - else - { - /* Regular video */ - m_palette->set_pen_color(0, rgb_t(0x00,0x00,0x00)); /* black */ - m_palette->set_pen_color(1, rgb_t(0xff,0xff,0xff)); /* white */ - } + // Invert Video + m_palette->set_pen_color(BIT(data, 7) ^ 0, rgb_t::white()); + m_palette->set_pen_color(BIT(data, 7) ^ 1, rgb_t::black()); } - void atarifb_state::soccer_out1_w(uint8_t data) { - m_CTRLD = data; + m_ctrld = data; /* bit 0 = whistle */ /* bit 1 = hit */ /* bit 2 = kicker */ /* bit 3 = unused */ - /* bit 4 = 2/4 Player LED */ // Say what? + /* bit 4 = 2/4 Player LED */ /* bit 5-6 = trackball CTRL bits */ /* bit 7 = Rule LED */ - m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle - m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit - m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract - m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker + m_discrete->write(ATARIFB_WHISTLE_EN, data & 0x01); // Whistle + m_discrete->write(ATARIFB_HIT_EN, data & 0x02); // Hit + m_discrete->write(ATARIFB_ATTRACT_EN, data & 0x10); // Attract + m_discrete->write(ATARIFB_NOISE_EN, data & 0x04); // Noise Enable / Kicker -// m_leds[0] = BIT(data, 4); // !!!!!!!!!! Is this correct???? + m_leds[0] = BIT(data, 4); m_leds[1] = BIT(data, 7); } @@ -88,7 +84,6 @@ void atarifb_state::atarifb_out2_w(uint8_t data) machine().bookkeeping().coin_counter_w(0, data & 0x10); } - void atarifb_state::soccer_out2_w(uint8_t data) { m_discrete->write(ATARIFB_CROWD_DATA, data & 0x0f); // Crowd @@ -99,44 +94,28 @@ void atarifb_state::soccer_out2_w(uint8_t data) } - -/************************************* - * - * LED control - * - *************************************/ - -/* FIXME: almost surely not tied with screen vertical position */ void atarifb_state::atarifb_out3_w(uint8_t data) { - int loop = m_screen->vpos() >= 123; + // 64V and 128V to 7442 to LED anodes (output 0 unused) + int led_select = m_screen->vpos() >> 6 & 3; - switch (loop) - { - case 0x00: - /* Player 1 play select lamp */ - output().set_value("ledleft0", (data >> 0) & 1); - output().set_value("ledleft1", (data >> 1) & 1); - output().set_value("ledleft2", (data >> 2) & 1); - output().set_value("ledleft3", (data >> 3) & 1); - output().set_value("ledleft4", (data >> 4) & 1); - break; - case 0x01: - /* Player 2 play select lamp */ - output().set_value("ledright0", (data >> 0) & 1); - output().set_value("ledright1", (data >> 1) & 1); - output().set_value("ledright2", (data >> 2) & 1); - output().set_value("ledright3", (data >> 3) & 1); - output().set_value("ledright4", (data >> 4) & 1); - break; - } -// logerror("out3_w, %02x:%02x\n", loop, data); + // bit 0-3 = LED cathodes + // bit 4 = atarifb4 4-player LED + m_led_pwm->matrix((1 << led_select) >> 1, data & 0xf); + m_leds[0] = BIT(data, 4); } + +/************************************* + * + * Input ports + * + *************************************/ + uint8_t atarifb_state::atarifb_in0_r() { - if ((m_CTRLD & 0x20) == 0x00) + if ((m_ctrld & 0x20) == 0x00) { int val; @@ -173,7 +152,7 @@ uint8_t atarifb_state::atarifb_in0_r() uint8_t atarifb_state::atarifb_in2_r() { - if ((m_CTRLD & 0x20) == 0x00) + if ((m_ctrld & 0x20) == 0x00) { return ioport("IN1")->read(); } @@ -203,7 +182,7 @@ uint8_t atarifb_state::atarifb_in2_r() uint8_t atarifb_state::atarifb4_in0_r() { /* LD1 and LD2 low, return sign bits */ - if ((m_CTRLD & 0x60) == 0x00) + if ((m_ctrld & 0x60) == 0x00) { int val; @@ -217,7 +196,7 @@ uint8_t atarifb_state::atarifb4_in0_r() (m_sign_y_1 >> 0); return val; } - else if ((m_CTRLD & 0x60) == 0x60) + else if ((m_ctrld & 0x60) == 0x60) /* LD1 and LD2 both high, return Team 1 right player (player 1) */ { int new_x, new_y; @@ -239,7 +218,7 @@ uint8_t atarifb_state::atarifb4_in0_r() return (((m_counter_y_in0 & 0x0f) << 4) | (m_counter_x_in0 & 0x0f)); } - else if ((m_CTRLD & 0x60) == 0x40) + else if ((m_ctrld & 0x60) == 0x40) /* LD1 high, LD2 low, return Team 1 left player (player 2) */ { int new_x, new_y; @@ -268,11 +247,11 @@ uint8_t atarifb_state::atarifb4_in0_r() uint8_t atarifb_state::atarifb4_in2_r() { - if ((m_CTRLD & 0x40) == 0x00) + if ((m_ctrld & 0x40) == 0x00) { return ioport("IN1")->read(); } - else if ((m_CTRLD & 0x60) == 0x60) + else if ((m_ctrld & 0x60) == 0x60) /* LD1 and LD2 both high, return Team 2 right player (player 3) */ { int new_x, new_y; @@ -294,7 +273,7 @@ uint8_t atarifb_state::atarifb4_in2_r() return (((m_counter_y_in2 & 0x0f) << 4) | (m_counter_x_in2 & 0x0f)); } - else if ((m_CTRLD & 0x60) == 0x40) + else if ((m_ctrld & 0x60) == 0x40) /* LD1 high, LD2 low, return Team 2 left player (player 4) */ { int new_x, new_y; |