mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
vgmplay: Supports C140 [smf]
This commit is contained in:
parent
aadfb7e096
commit
a407202cc8
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user