summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/access/acvirus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/access/acvirus.cpp')
-rw-r--r--src/mame/access/acvirus.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/mame/access/acvirus.cpp b/src/mame/access/acvirus.cpp
index ae4339f71b5..d88618d3e74 100644
--- a/src/mame/access/acvirus.cpp
+++ b/src/mame/access/acvirus.cpp
@@ -70,6 +70,7 @@
#include "cpu/mcs51/sab80c535.h"
#include "machine/intelfsh.h"
#include "video/hd44780.h"
+#include "video/pwm.h"
#include "emupal.h"
#include "speaker.h"
@@ -91,8 +92,10 @@ public:
m_rombank(*this, "rombank"),
m_row(*this, "ROW%u", 0U),
m_knob(*this, "knob_%u", 0U),
+ m_leds(*this, "leds"),
m_scan(0),
- m_an_select(0)
+ m_an_select(0),
+ m_led_pattern(0)
{ }
void virusa(machine_config &config) ATTR_COLD;
@@ -122,6 +125,7 @@ private:
u8 p4_r();
void p1_w(u8 data);
void p3_w(u8 data);
+ void p4_w(u8 data);
void p5_w(u8 data);
u8 p402_r();
@@ -129,9 +133,11 @@ private:
void palette_init(palette_device &palette) ATTR_COLD;
required_ioport_array<32> m_knob;
+ optional_device<pwm_display_device> m_leds;
u8 m_scan;
u8 m_an_select;
+ u8 m_led_pattern;
};
@@ -142,6 +148,7 @@ void acvirus_state::machine_start()
save_item(NAME(m_scan));
save_item(NAME(m_an_select));
+ save_item(NAME(m_led_pattern));
}
void acvirus_state::machine_reset()
@@ -171,10 +178,20 @@ u8 acvirus_state::p4_r()
return m_row[m_scan & 3]->read();
}
+void acvirus_state::p4_w(u8 data)
+{
+ m_leds->write_mx(data);
+
+ if (BIT(m_scan, 3))
+ m_led_pattern = data;
+}
+
void acvirus_state::p5_w(u8 data)
{
- m_scan = data & 7;
m_rombank->set_entry((data >> 4) & 15);
+
+ m_scan = data & 15;
+ m_leds->matrix(1 << m_scan, m_led_pattern);
}
void acvirus_state::prog_map(address_map &map)
@@ -185,8 +202,9 @@ void acvirus_state::prog_map(address_map &map)
void acvirus_state::data_map(address_map &map)
{
+ map(0x0000, 0x7fff).ram();
map(0x0400, 0x0407).rw(m_dsp, FUNC(dsp563xx_device::hi08_r), FUNC(dsp563xx_device::hi08_w));
- map(0x2000, 0x7fff).ram(); // TODO: RAM banks
+ map(0x8000, 0xffff).ram(); // TODO: RAM banks
}
void acvirus_state::dsp_p_map(address_map &map)
@@ -260,6 +278,7 @@ void acvirus_state::virusb(machine_config &config)
m_maincpu->port_out_cb<1>().set(FUNC(acvirus_state::p1_w));
m_maincpu->port_out_cb<3>().set(FUNC(acvirus_state::p3_w));
m_maincpu->port_in_cb<4>().set(FUNC(acvirus_state::p4_r));
+ m_maincpu->port_out_cb<4>().set(FUNC(acvirus_state::p4_w));
m_maincpu->port_out_cb<5>().set(FUNC(acvirus_state::p5_w));
m_maincpu->an0_func().set([this] { return m_knob[4*0 + m_an_select]->read(); });
m_maincpu->an1_func().set([this] { return m_knob[4*1 + m_an_select]->read(); });
@@ -283,6 +302,8 @@ void acvirus_state::virusb(machine_config &config)
HD44780(config, m_lcdc, 270000); // TODO: clock not measured, datasheet typical clock used
m_lcdc->set_lcd_size(2, 16);
+ PWM_DISPLAY(config, m_leds).set_size(8, 8);
+
DSP56311(config, m_dsp, 108_MHz_XTAL);
m_dsp->set_addrmap(dsp563xx_device::AS_P, &acvirus_state::dsp_p_map);
m_dsp->set_addrmap(dsp563xx_device::AS_X, &acvirus_state::dsp_x_map);