summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-02-04 18:07:03 +0100
committer Olivier Galibert <galibert@pobox.com>2022-02-04 18:07:27 +0100
commit72d9e52a692153c7ad0ab45690a0c3d53c91dd0a (patch)
tree37a8b069450561af00290aa197989dd5bc2fab7d /src/devices/sound
parentf0fee97749dd0211112abbb966548f82cf839154 (diff)
swp30: Add waverom reading
Diffstat (limited to 'src/devices/sound')
-rw-r--r--src/devices/sound/swp30.cpp69
-rw-r--r--src/devices/sound/swp30.h11
2 files changed, 79 insertions, 1 deletions
diff --git a/src/devices/sound/swp30.cpp b/src/devices/sound/swp30.cpp
index e0a7abc71e2..f133f21dc5e 100644
--- a/src/devices/sound/swp30.cpp
+++ b/src/devices/sound/swp30.cpp
@@ -256,6 +256,10 @@ void swp30_device::device_start()
save_item(NAME(m_internal_adr));
save_item(NAME(m_program_address));
+ save_item(NAME(m_waverom_adr));
+ save_item(NAME(m_waverom_mode));
+ save_item(NAME(m_waverom_access));
+ save_item(NAME(m_waverom_val));
}
void swp30_device::device_reset()
@@ -291,6 +295,10 @@ void swp30_device::device_reset()
memset(m_routing, 0, sizeof(m_routing));
m_program_address = 0;
+ m_waverom_adr = 0;
+ m_waverom_mode = 0;
+ m_waverom_access = 0;
+ m_waverom_val = 0;
}
void swp30_device::rom_bank_updated()
@@ -341,7 +349,14 @@ void swp30_device::map(address_map &map)
// 00-01 missing
rctrl(map, 0x02).rw(FUNC(swp30_device::internal_adr_r), FUNC(swp30_device::internal_adr_w));
rctrl(map, 0x03).r (FUNC(swp30_device::internal_r));
- // 04-0b missing
+ rctrl(map, 0x04).rw(FUNC(swp30_device::waverom_adr_r<1>), FUNC(swp30_device::waverom_adr_w<1>));
+ rctrl(map, 0x05).rw(FUNC(swp30_device::waverom_adr_r<0>), FUNC(swp30_device::waverom_adr_w<0>));
+ rctrl(map, 0x06).rw(FUNC(swp30_device::waverom_mode_r<1>), FUNC(swp30_device::waverom_mode_w<1>));
+ rctrl(map, 0x07).rw(FUNC(swp30_device::waverom_mode_r<0>), FUNC(swp30_device::waverom_mode_w<0>));
+ rctrl(map, 0x08).rw(FUNC(swp30_device::waverom_access_r), FUNC(swp30_device::waverom_access_w));
+ rctrl(map, 0x09).r (FUNC(swp30_device::waverom_busy_r));
+ rctrl(map, 0x0a).r (FUNC(swp30_device::waverom_val_r<1>));
+ rctrl(map, 0x0b).r (FUNC(swp30_device::waverom_val_r<0>));
rctrl(map, 0x0c).rw(FUNC(swp30_device::keyon_mask_r<3>), FUNC(swp30_device::keyon_mask_w<3>));
rctrl(map, 0x0d).rw(FUNC(swp30_device::keyon_mask_r<2>), FUNC(swp30_device::keyon_mask_w<2>));
rctrl(map, 0x0e).rw(FUNC(swp30_device::keyon_mask_r<1>), FUNC(swp30_device::keyon_mask_w<1>));
@@ -454,6 +469,58 @@ template<int sel> void swp30_device::map_w(u16 data)
}
+template<int sel> void swp30_device::waverom_adr_w(u16 data)
+{
+ if(sel)
+ m_waverom_adr = (m_waverom_adr & 0x0000ffff) | (data << 16);
+ else
+ m_waverom_adr = (m_waverom_adr & 0xffff0000) | data;
+}
+
+template<int sel> u16 swp30_device::waverom_adr_r()
+{
+ return m_waverom_adr >> (16*sel);
+}
+
+template<int sel> void swp30_device::waverom_mode_w(u16 data)
+{
+ if(sel)
+ m_waverom_mode = (m_waverom_mode & 0x0000ffff) | (data << 16);
+ else
+ m_waverom_mode = (m_waverom_mode & 0xffff0000) | data;
+}
+
+template<int sel> u16 swp30_device::waverom_mode_r()
+{
+ return m_waverom_mode >> (16*sel);
+}
+
+void swp30_device::waverom_access_w(u16 data)
+{
+ m_waverom_access = data;
+ if(data == 0x8000) {
+ m_waverom_val = read_dword(m_waverom_adr << 2);
+ logerror("waverom read adr=%08x mode=%08x -> %08x\n", m_waverom_adr, m_waverom_mode, m_waverom_val);
+ }
+}
+
+u16 swp30_device::waverom_access_r()
+{
+ return m_waverom_access;
+}
+
+u16 swp30_device::waverom_busy_r()
+{
+ // 0 = busy reading the rom, non-0 = finished
+ return 0xffff;
+}
+
+template<int sel> u16 swp30_device::waverom_val_r()
+{
+ return m_waverom_val >> (16*sel);
+}
+
+
// AWM2 per-channel registers
u16 swp30_device::lpf_cutoff_r(offs_t offset)
{
diff --git a/src/devices/sound/swp30.h b/src/devices/sound/swp30.h
index 4aabfa50e45..b83913b1562 100644
--- a/src/devices/sound/swp30.h
+++ b/src/devices/sound/swp30.h
@@ -51,6 +51,9 @@ private:
u32 m_current_volume[0x40], m_target_volume[0x40];
s32 m_step_volume[0x40];
+ u32 m_waverom_adr, m_waverom_mode, m_waverom_val;
+ u16 m_waverom_access;
+
u16 m_program_pfp[0x180], m_program_pint[0x80], m_program_plfo[0x80];
u16 m_base_volume[0x40], m_freq[0x40], m_pan[0x40], m_dry_rev[0x40], m_cho_var[0x40];
@@ -125,6 +128,14 @@ private:
template<int sel> void prg_w(u16 data);
template<int sel> u16 map_r();
template<int sel> void map_w(u16 data);
+ template<int sel> void waverom_adr_w(u16 data);
+ template<int sel> u16 waverom_adr_r();
+ template<int sel> void waverom_mode_w(u16 data);
+ template<int sel> u16 waverom_mode_r();
+ void waverom_access_w(u16 data);
+ u16 waverom_access_r();
+ u16 waverom_busy_r();
+ template<int sel> u16 waverom_val_r();
// MEG registers
template<int sel> u16 prg_fp_r(offs_t offset);