From fd1aef5462d35ffcab3dadef4592429d8c9b60dd Mon Sep 17 00:00:00 2001 From: Felipe Correa da Silva Sanches Date: Mon, 3 Nov 2025 12:06:06 -0300 Subject: [PATCH 1/3] [Access Virus B] Control Panel LEDs --- src/mame/access/acvirus.cpp | 16 +++++- src/mame/layout/virusb.lay | 106 ++++++++++++++++++------------------ 2 files changed, 68 insertions(+), 54 deletions(-) diff --git a/src/mame/access/acvirus.cpp b/src/mame/access/acvirus.cpp index ae4339f71b58c..d5c0157613732 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,6 +92,7 @@ class acvirus_state : public driver_device 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) { } @@ -122,6 +124,7 @@ class acvirus_state : public driver_device 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,6 +132,7 @@ class acvirus_state : public driver_device void palette_init(palette_device &palette) ATTR_COLD; required_ioport_array<32> m_knob; + optional_device m_leds; u8 m_scan; u8 m_an_select; @@ -171,10 +175,17 @@ u8 acvirus_state::p4_r() return m_row[m_scan & 3]->read(); } +void acvirus_state::p4_w(u8 data) +{ + m_leds->write_mx(data); +} + void acvirus_state::p5_w(u8 data) { m_scan = data & 7; m_rombank->set_entry((data >> 4) & 15); + + m_leds->write_my(1 << m_scan); } void acvirus_state::prog_map(address_map &map) @@ -186,7 +197,7 @@ void acvirus_state::prog_map(address_map &map) void acvirus_state::data_map(address_map &map) { map(0x0400, 0x0407).rw(m_dsp, FUNC(dsp563xx_device::hi08_r), FUNC(dsp563xx_device::hi08_w)); - map(0x2000, 0x7fff).ram(); // TODO: RAM banks + map(0x0408, 0x7fff).ram(); // TODO: RAM banks } void acvirus_state::dsp_p_map(address_map &map) @@ -260,6 +271,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 +295,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(7, 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); diff --git a/src/mame/layout/virusb.lay b/src/mame/layout/virusb.lay index c408792f1ff27..f5065c8161c4e 100644 --- a/src/mame/layout/virusb.lay +++ b/src/mame/layout/virusb.lay @@ -600,11 +600,11 @@ license:CC0-1.0 - - - - - + + + + + @@ -621,16 +621,16 @@ license:CC0-1.0 - + - - - - - + + + + + @@ -638,8 +638,8 @@ license:CC0-1.0 - - + + @@ -651,11 +651,11 @@ license:CC0-1.0 - - - - - + + + + + @@ -670,16 +670,16 @@ license:CC0-1.0 - + - - - - - + + + + + @@ -687,8 +687,8 @@ license:CC0-1.0 - - + + @@ -699,11 +699,11 @@ license:CC0-1.0 - - - - - + + + + + @@ -752,8 +752,8 @@ license:CC0-1.0 - - + + @@ -820,9 +820,9 @@ license:CC0-1.0 - - - + + + @@ -835,8 +835,8 @@ license:CC0-1.0 - - + + @@ -897,7 +897,7 @@ license:CC0-1.0 - + @@ -905,21 +905,21 @@ license:CC0-1.0 - + - + - + - + - + - + - + - + @@ -932,20 +932,20 @@ license:CC0-1.0 - + - + - + - + - - + + From 6061cdaadef8bbfa4b8edb9ea92b2532b8552726 Mon Sep 17 00:00:00 2001 From: Felipe Correa da Silva Sanches Date: Tue, 4 Nov 2025 10:50:31 -0300 Subject: [PATCH 2/3] [Access Virus B] Fix glitch on CPanel LEDs --- src/mame/access/acvirus.cpp | 21 ++++++++++++++++----- src/mame/layout/virusb.lay | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/mame/access/acvirus.cpp b/src/mame/access/acvirus.cpp index d5c0157613732..6a5c099b8ba7d 100644 --- a/src/mame/access/acvirus.cpp +++ b/src/mame/access/acvirus.cpp @@ -94,7 +94,8 @@ class acvirus_state : public driver_device 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; @@ -136,6 +137,7 @@ class acvirus_state : public driver_device u8 m_scan; u8 m_an_select; + u8 m_led_pattern; }; @@ -146,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() @@ -177,15 +180,22 @@ u8 acvirus_state::p4_r() void acvirus_state::p4_w(u8 data) { + if (BIT(m_scan, 3)) + { + m_led_pattern = data; + } m_leds->write_mx(data); } void acvirus_state::p5_w(u8 data) { - m_scan = data & 7; m_rombank->set_entry((data >> 4) & 15); - m_leds->write_my(1 << m_scan); + m_scan = data & 15; + if (!BIT(data, 3)) + m_leds->matrix(1 << (m_scan & 7), m_led_pattern); + else + m_leds->clear(); } void acvirus_state::prog_map(address_map &map) @@ -196,8 +206,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(0x0408, 0x7fff).ram(); // TODO: RAM banks + map(0x8000, 0xffff).ram(); // TODO: RAM banks } void acvirus_state::dsp_p_map(address_map &map) @@ -295,7 +306,7 @@ 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(7, 8); + 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); diff --git a/src/mame/layout/virusb.lay b/src/mame/layout/virusb.lay index f5065c8161c4e..eaa737cebebb3 100644 --- a/src/mame/layout/virusb.lay +++ b/src/mame/layout/virusb.lay @@ -621,7 +621,7 @@ license:CC0-1.0 - + @@ -670,7 +670,7 @@ license:CC0-1.0 - + From aac6adde1b221f9f5704e53104bf2897861b727d Mon Sep 17 00:00:00 2001 From: Felipe Correa da Silva Sanches Date: Wed, 5 Nov 2025 01:49:29 -0300 Subject: [PATCH 3/3] [Access Virus B] Simplify a bit the logic for controling CPanel LEDs --- src/mame/access/acvirus.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mame/access/acvirus.cpp b/src/mame/access/acvirus.cpp index 6a5c099b8ba7d..d88618d3e745b 100644 --- a/src/mame/access/acvirus.cpp +++ b/src/mame/access/acvirus.cpp @@ -180,11 +180,10 @@ u8 acvirus_state::p4_r() void acvirus_state::p4_w(u8 data) { + m_leds->write_mx(data); + if (BIT(m_scan, 3)) - { m_led_pattern = data; - } - m_leds->write_mx(data); } void acvirus_state::p5_w(u8 data) @@ -192,10 +191,7 @@ void acvirus_state::p5_w(u8 data) m_rombank->set_entry((data >> 4) & 15); m_scan = data & 15; - if (!BIT(data, 3)) - m_leds->matrix(1 << (m_scan & 7), m_led_pattern); - else - m_leds->clear(); + m_leds->matrix(1 << m_scan, m_led_pattern); } void acvirus_state::prog_map(address_map &map)