summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/atarifb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/atarifb.cpp')
-rw-r--r--src/mame/machine/atarifb.cpp125
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;