vgmplay: Supports C140 [smf]

This commit is contained in:
smf- 2018-08-10 01:06:38 +01:00
parent aadfb7e096
commit a407202cc8
6 changed files with 61 additions and 31 deletions

View File

@ -89,14 +89,13 @@ static inline int limit(int32_t in)
c140_device::c140_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, C140, tag, owner, clock)
, device_sound_interface(mconfig, *this)
, device_rom_interface(mconfig, *this, 21)
, m_sample_rate(0)
, m_stream(nullptr)
, m_banking_type(C140_TYPE::SYSTEM2)
, m_mixer_buffer_left(nullptr)
, m_mixer_buffer_right(nullptr)
, m_baserate(0)
, m_rom_ptr(*this, DEVICE_SELF)
, m_pRom(nullptr)
{
memset(m_REG, 0, sizeof(uint8_t)*0x200);
memset(m_pcmtbl, 0, sizeof(int16_t)*8);
@ -113,11 +112,6 @@ void c140_device::device_start()
m_stream = stream_alloc(0, 2, m_sample_rate);
if (m_rom_ptr != nullptr)
{
m_pRom = m_rom_ptr;
}
/* make decompress pcm table */ //2000.06.26 CAB
int32_t segbase = 0;
for(int i = 0; i < 8; i++)
@ -135,7 +129,7 @@ void c140_device::device_start()
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
m_mixer_buffer_left = std::make_unique<int16_t[]>(m_sample_rate);
m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate);;
m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate);
save_item(NAME(m_REG));
@ -159,6 +153,24 @@ void c140_device::device_start()
}
void c140_device::device_clock_changed()
{
m_sample_rate = m_baserate = clock();
m_stream->set_sample_rate(m_sample_rate);
/* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */
m_mixer_buffer_left = std::make_unique<int16_t[]>(m_sample_rate);
m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate);;
}
void c140_device::rom_bank_updated()
{
m_stream->update();
}
//-------------------------------------------------
// sound_stream_update - handle a stream update
//-------------------------------------------------
@ -172,7 +184,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
int32_t sdt;
int32_t st,ed,sz;
int8_t *pSampleData;
long sampleData;
int32_t frequency,delta,offset,pos;
int32_t cnt, voicecnt;
int32_t lastdt,prevdt,dltdt;
@ -219,7 +231,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
sz=ed-st;
/* Retrieve base pointer to the sample data */
pSampleData = m_pRom + find_sample(st, v->bank, i);
sampleData = find_sample(st, v->bank, i);
/* Fetch back previous data pointers */
offset=v->ptoffset;
@ -257,7 +269,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
}
/* Read the chosen sample byte */
dt=pSampleData[pos];
dt = (int8_t) read_byte(sampleData + pos);
/* decompress to 13bit range */ //2000.06.26 CAB
sdt=dt>>3; //signed
@ -307,7 +319,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
if (m_banking_type == C140_TYPE::ASIC219)
{
lastdt = pSampleData[BYTE_XOR_BE(pos)];
lastdt = (int8_t) read_byte(sampleData + BYTE_XOR_BE(pos));
// Sign + magnitude format
if ((v->mode & 0x01) && (lastdt & 0x80))
@ -319,7 +331,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
}
else
{
lastdt=pSampleData[pos];
lastdt = (int8_t) read_byte(sampleData + pos);
}
dltdt = (lastdt - prevdt);
@ -431,12 +443,6 @@ WRITE8_MEMBER( c140_device::c140_w )
}
void c140_device::set_base(void *base)
{
m_pRom = (int8_t *)base;
}
void c140_device::init_voice( C140_VOICE *v )
{
v->key=0;

View File

@ -16,7 +16,8 @@
// ======================> c140_device
class c140_device : public device_t,
public device_sound_interface
public device_sound_interface,
public device_rom_interface
{
public:
enum class C140_TYPE
@ -34,11 +35,12 @@ public:
DECLARE_READ8_MEMBER( c140_r );
DECLARE_WRITE8_MEMBER( c140_w );
void set_base(void *base);
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_clock_changed() override;
virtual void rom_bank_updated() override;
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
@ -80,8 +82,6 @@ private:
std::unique_ptr<int16_t[]> m_mixer_buffer_right;
int m_baserate;
optional_region_ptr<int8_t> m_rom_ptr;
int8_t *m_pRom;
uint8_t m_REG[0x200];
int16_t m_pcmtbl[8]; //2000.06.26 CAB

View File

@ -568,6 +568,11 @@ void namcona1_state::namcona1_main_map(address_map &map)
map(0xfff000, 0xffffff).ram().share("spriteram"); /* spriteram */
}
void namcona1_state::namcona1_c140_map(address_map &map)
{
map(0x000000, 0x07ffff).ram().share("workram");
}
READ8_MEMBER(xday2_namcona2_state::printer_r)
{
// --xx ---- printer status related, if bit 5 held 1 long enough causes printer error
@ -718,8 +723,6 @@ WRITE8_MEMBER(namcona1_state::port8_w)
void namcona1_state::machine_start()
{
m_mEnableInterrupts = 0;
m_c140->set_base(m_workram);
save_item(NAME(m_mEnableInterrupts));
save_item(NAME(m_count));
save_item(NAME(m_mcu_mailbox));
@ -993,6 +996,7 @@ MACHINE_CONFIG_START(namcona1_state::namcona1)
C140(config, m_c140, 44100);
m_c140->set_bank_type(c140_device::C140_TYPE::ASIC219);
m_c140->set_addrmap(0, &namcona1_state::namcona1_c140_map);
m_c140->add_route(0, "rspeaker", 1.00);
m_c140->add_route(1, "lspeaker", 1.00);
MACHINE_CONFIG_END

View File

@ -192,6 +192,7 @@ public:
template<int Chip> DECLARE_READ8_MEMBER(ymf271_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(ymz280b_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(multipcm_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(c140_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(k053260_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(okim6295_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(k054539_rom_r);
@ -389,6 +390,7 @@ public:
template<int Chip> void multipcm_map(address_map &map);
template<int Chip> void okim6295_map(address_map &map);
template<int Chip> void k054539_map(address_map &map);
template<int Chip> void c140_map(address_map &map);
template<int Chip> void k053260_map(address_map &map);
template<int Chip> void qsound_map(address_map &map);
template<int Chip> void wswan_map(address_map &map);
@ -1423,7 +1425,11 @@ void vgmplay_device::execute_run()
case 0xd4:
{
pulse_act_led(LED_C140);
// TODO: c140
uint8_t offset = m_file->read_byte(m_pc + 1);
if (offset & 0x80)
m_io->write_byte(A_C140_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3));
else
m_io->write_byte(A_C140_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3));
m_pc += 4;
break;
}
@ -2021,6 +2027,12 @@ READ8_MEMBER(vgmplay_device::k054539_rom_r)
return rom_r(Chip, 0x8c, offset);
}
template<int Chip>
READ8_MEMBER(vgmplay_device::c140_rom_r)
{
return rom_r(Chip, 0x8d, offset);
}
template<int Chip>
READ8_MEMBER(vgmplay_device::k053260_rom_r)
{
@ -2646,7 +2658,8 @@ void vgmplay_state::soundchips_map(address_map &map)
map(vgmplay_device::A_K054539_1, vgmplay_device::A_K054539_1 + 0x22f).w(m_k054539[1], FUNC(k054539_device::write));
map(vgmplay_device::A_C6280_0, vgmplay_device::A_C6280_0 + 0xf).w("huc6280.0:psg", FUNC(c6280_device::c6280_w));
map(vgmplay_device::A_C6280_1, vgmplay_device::A_C6280_1 + 0xf).w("huc6280.1:psg", FUNC(c6280_device::c6280_w));
// TODO: c140
map(vgmplay_device::A_C140_0, vgmplay_device::A_C140_0 + 0x1ff).w(m_c140[0], FUNC(c140_device::c140_w));
map(vgmplay_device::A_C140_1, vgmplay_device::A_C140_1 + 0x1ff).w(m_c140[1], FUNC(c140_device::c140_w));
map(vgmplay_device::A_K053260_0, vgmplay_device::A_K053260_0 + 0x2f).w(m_k053260[0], FUNC(k053260_device::write));
map(vgmplay_device::A_K053260_1, vgmplay_device::A_K053260_1 + 0x2f).w(m_k053260[1], FUNC(k053260_device::write));
map(vgmplay_device::A_POKEY_0, vgmplay_device::A_POKEY_0 + 0xf).w(m_pokey[0], FUNC(pokey_device::write));
@ -2733,6 +2746,12 @@ void vgmplay_state::k054539_map(address_map &map)
map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<Chip>));
}
template<int Chip>
void vgmplay_state::c140_map(address_map &map)
{
map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::c140_rom_r<Chip>));
}
template<int Chip>
void vgmplay_state::k053260_map(address_map &map)
{
@ -3065,10 +3084,12 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
m_huc6280[1]->add_route(1, "rspeaker", 1);
C140(config, m_c140[0], 0);
m_c140[0]->set_addrmap(0, &vgmplay_state::c140_map<0>);
m_c140[0]->add_route(0, "lspeaker", 0.50);
m_c140[0]->add_route(1, "rspeaker", 0.50);
C140(config, m_c140[1], 0);
m_c140[1]->set_addrmap(0, &vgmplay_state::c140_map<1>);
m_c140[1]->add_route(0, "lspeaker", 0.50);
m_c140[1]->add_route(1, "rspeaker", 0.50);
@ -3192,8 +3213,6 @@ ROM_START( vgmplay )
ROM_REGION( 0x80000, "y8950.1", ROMREGION_ERASE00 )
ROM_REGION( 0x80000, "upd7759.0", ROMREGION_ERASE00 )
ROM_REGION( 0x80000, "upd7759.1", ROMREGION_ERASE00 )
ROM_REGION( 0x80000, "c140.0", ROMREGION_ERASE00 )
ROM_REGION( 0x80000, "c141.1", ROMREGION_ERASE00 )
ROM_REGION( 0x80000, "scsp", ROMREGION_ERASE00 )
// TODO: split up 32x to remove dependencies
ROM_REGION( 0x4000, "master", ROMREGION_ERASE00 )

View File

@ -83,6 +83,7 @@ protected:
void namcona1_main_map(address_map &map);
void namcona1_mcu_io_map(address_map &map);
void namcona1_mcu_map(address_map &map);
void namcona1_c140_map(address_map &map);
virtual void machine_start() override;
virtual void machine_reset() override;

View File

@ -80,7 +80,7 @@
<element name="act_label_k051649"><text string="K051649" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_k054539"><text string="K054539" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_c6280"><text string="HuC6280" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_c140"><text string="C140" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element>
<element name="act_label_c140"><text string="C140" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_k053260"><text string="K053260" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_pokey"><text string="POKEY" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="act_label_qsound"><text string="QSound™" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element>