mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
swp30: Add waverom reading
This commit is contained in:
parent
f0fee97749
commit
72d9e52a69
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user