mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
flower/wiping sound: added guessed clock() (nw)
This commit is contained in:
parent
9ee00a9096
commit
976a98cfc5
@ -3,26 +3,25 @@
|
||||
/***************************************************************************
|
||||
|
||||
Flower custom sound chip
|
||||
|
||||
|
||||
Similar to Wiping and Namco 15xx designs
|
||||
|
||||
TODO:
|
||||
- several unknown registers (effects and unknown register tied to repeat port);
|
||||
- repeat certainly needs a cutoff, which is unknown about how it works;
|
||||
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "flower.h"
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
// device type definition
|
||||
DEFINE_DEVICE_TYPE(FLOWER_CUSTOM, flower_sound_device, "flower_sound", "Flower Custom Audio")
|
||||
DEFINE_DEVICE_TYPE(FLOWER_CUSTOM, flower_sound_device, "flower_sound", "Flower Custom Sound")
|
||||
|
||||
// TODO: AM_SELECT unsupported by DEVICE_ADDRESS_MAP, so we need a trampoline here
|
||||
static ADDRESS_MAP_START( regs_map, AS_IO, 8, flower_sound_device )
|
||||
@ -62,20 +61,18 @@ flower_sound_device::flower_sound_device(const machine_config &mconfig, const ch
|
||||
|
||||
void flower_sound_device::device_start()
|
||||
{
|
||||
int i;
|
||||
m_iospace = &space(AS_IO);
|
||||
// TODO: clock
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 1, samplerate);
|
||||
|
||||
m_mixer_buffer = make_unique_clear<short[]>(samplerate);
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 1, clock()/2);
|
||||
|
||||
m_mixer_buffer = make_unique_clear<short[]>(clock()/2);
|
||||
make_mixer_table(MAX_VOICES, defgain);
|
||||
|
||||
m_last_channel = m_channel_list + MAX_VOICES;
|
||||
|
||||
|
||||
m_sample_rom = machine().root_device().memregion("samples")->base();
|
||||
m_volume_rom = machine().root_device().memregion("soundvol")->base();
|
||||
|
||||
for (i = 0; i < MAX_VOICES; i++)
|
||||
|
||||
for (int i = 0; i < MAX_VOICES; i++)
|
||||
{
|
||||
save_item(NAME(m_channel_list[i].start_address), i);
|
||||
save_item(NAME(m_channel_list[i].position), i);
|
||||
@ -85,7 +82,7 @@ void flower_sound_device::device_start()
|
||||
save_item(NAME(m_channel_list[i].effect), i);
|
||||
save_item(NAME(m_channel_list[i].enable), i);
|
||||
save_item(NAME(m_channel_list[i].repeat), i);
|
||||
|
||||
|
||||
// assign a channel number (debugger aid)
|
||||
m_channel_list[i].channel_number = i;
|
||||
}
|
||||
@ -95,9 +92,6 @@ void flower_sound_device::device_start()
|
||||
/* build a table to divide by the number of voices; gain is specified as gain*16 */
|
||||
void flower_sound_device::make_mixer_table(int voices, int gain)
|
||||
{
|
||||
int count = voices * 128;
|
||||
int i;
|
||||
|
||||
/* allocate memory */
|
||||
m_mixer_table = make_unique_clear<int16_t[]>(256 * voices);
|
||||
|
||||
@ -105,7 +99,7 @@ void flower_sound_device::make_mixer_table(int voices, int gain)
|
||||
m_mixer_lookup = m_mixer_table.get() + (128 * voices);
|
||||
|
||||
/* fill in the table - 16 bit case */
|
||||
for (i = 0; i < count; i++)
|
||||
for (int i = 0; i < voices * 128; i++)
|
||||
{
|
||||
int val = i * gain * 16 / voices;
|
||||
if (val > 32767) val = 32767;
|
||||
@ -137,26 +131,26 @@ void flower_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
|
||||
stream_sample_t *buffer = outputs[0];
|
||||
short *mix;
|
||||
uint8_t raw_sample;
|
||||
|
||||
|
||||
memset(m_mixer_buffer.get(), 0, samples * sizeof(short));
|
||||
|
||||
for (fl_sound_channel *voice = m_channel_list; voice < m_last_channel; voice++)
|
||||
{
|
||||
int ch_volume = voice->volume;
|
||||
int ch_frequency = voice->frequency;
|
||||
|
||||
if(voice->enable == false)
|
||||
|
||||
if (voice->enable == false)
|
||||
continue;
|
||||
|
||||
|
||||
mix = m_mixer_buffer.get();
|
||||
|
||||
for(int i=0;i<samples;i++)
|
||||
for (int i = 0; i < samples; i++)
|
||||
{
|
||||
if(voice->repeat == true)
|
||||
if (voice->repeat == true)
|
||||
{
|
||||
raw_sample = m_sample_rom[((voice->start_address >> 7) & 0x7e00) | ((voice->position >> 7) & 0x1ff)];
|
||||
// guess: cut off after a number of repetitions
|
||||
if((voice->position >> 7) & 0x20000)
|
||||
// guess: cut off after a number of repetitions
|
||||
if ((voice->position >> 7) & 0x20000)
|
||||
{
|
||||
voice->enable = false;
|
||||
break;
|
||||
@ -165,21 +159,19 @@ void flower_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
|
||||
else
|
||||
{
|
||||
raw_sample = m_sample_rom[((voice->start_address + voice->position) >> 7) & 0x7fff];
|
||||
if(raw_sample == 0xff)
|
||||
if (raw_sample == 0xff)
|
||||
{
|
||||
voice->enable = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ch_volume |= voice->volume_bank;
|
||||
|
||||
|
||||
*mix++ += m_volume_rom[(ch_volume << 8 | raw_sample) & 0x3fff] - 0x80;
|
||||
voice->position += ch_frequency;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* mix it down */
|
||||
mix = m_mixer_buffer.get();
|
||||
for (int i = 0; i < samples; i++)
|
||||
@ -203,13 +195,13 @@ device_memory_interface::space_config_vector flower_sound_device::memory_space_c
|
||||
//**************************************************************************
|
||||
|
||||
WRITE8_MEMBER( flower_sound_device::lower_write )
|
||||
{
|
||||
{
|
||||
m_stream->update();
|
||||
m_iospace->write_byte(offset,data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( flower_sound_device::upper_write )
|
||||
{
|
||||
{
|
||||
m_stream->update();
|
||||
m_iospace->write_byte(offset|0x40,data);
|
||||
}
|
||||
@ -220,9 +212,9 @@ WRITE8_MEMBER( flower_sound_device::frequency_w )
|
||||
fl_sound_channel *voice;
|
||||
|
||||
voice = &m_channel_list[ch];
|
||||
|
||||
|
||||
voice->raw_frequency[offset & 3] = data & 0xf;
|
||||
|
||||
|
||||
voice->frequency = voice->raw_frequency[2] << 12;
|
||||
voice->frequency|= voice->raw_frequency[3] << 8;
|
||||
voice->frequency|= voice->raw_frequency[0] << 4;
|
||||
@ -259,7 +251,7 @@ WRITE8_MEMBER( flower_sound_device::start_address_w )
|
||||
|
||||
voice = &m_channel_list[ch];
|
||||
voice->start_nibbles[offset & 7] = data & 0xf;
|
||||
if((offset & 7) == 4)
|
||||
if ((offset & 7) == 4)
|
||||
voice->effect = data >> 4;
|
||||
}
|
||||
|
||||
@ -274,7 +266,7 @@ WRITE8_MEMBER( flower_sound_device::sample_trigger_w )
|
||||
voice->volume_bank = (data & 3) << 4;
|
||||
voice->start_address = 0;
|
||||
voice->position = 0;
|
||||
for(int i=5;i>=0;i--)
|
||||
for (int i = 5; i >= 0; i--)
|
||||
{
|
||||
voice->start_address = (voice->start_address << 4) | voice->start_nibbles[i];
|
||||
}
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
// ======================> flower_sound_device
|
||||
|
||||
class flower_sound_device : public device_t,
|
||||
class flower_sound_device : public device_t,
|
||||
public device_sound_interface,
|
||||
public device_memory_interface
|
||||
{
|
||||
@ -59,15 +59,14 @@ private:
|
||||
|
||||
const address_space_config m_io_space_config;
|
||||
sound_stream *m_stream;
|
||||
|
||||
|
||||
static constexpr unsigned MAX_VOICES = 8;
|
||||
static constexpr int samplerate = 48000;
|
||||
static constexpr int defgain = 48;
|
||||
|
||||
|
||||
std::unique_ptr<int16_t[]> m_mixer_table;
|
||||
int16_t *m_mixer_lookup;
|
||||
std::unique_ptr<short[]> m_mixer_buffer;
|
||||
|
||||
|
||||
struct fl_sound_channel
|
||||
{
|
||||
uint8_t start_nibbles[6];
|
||||
@ -82,13 +81,13 @@ private:
|
||||
bool repeat;
|
||||
int channel_number;
|
||||
};
|
||||
|
||||
|
||||
/* data about the sound system */
|
||||
fl_sound_channel m_channel_list[MAX_VOICES];
|
||||
fl_sound_channel *m_last_channel;
|
||||
|
||||
|
||||
void make_mixer_table(int voices, int gain);
|
||||
|
||||
|
||||
const uint8_t *m_sample_rom;
|
||||
const uint8_t *m_volume_rom;
|
||||
};
|
||||
|
@ -4,20 +4,19 @@
|
||||
|
||||
Wiping sound driver (quick hack of the Namco sound driver)
|
||||
|
||||
used by wiping.c and clshroad.c
|
||||
used by wiping.cpp and clshroad.cpp
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "audio/wiping.h"
|
||||
|
||||
static constexpr int samplerate = 48000;
|
||||
static constexpr int defgain = 48;
|
||||
|
||||
DEFINE_DEVICE_TYPE(WIPING, wiping_sound_device, "wiping_sound", "Wiping Audio Custom")
|
||||
DEFINE_DEVICE_TYPE(WIPING_CUSTOM, wiping_sound_device, "wiping_sound", "Wiping Audio Custom")
|
||||
|
||||
wiping_sound_device::wiping_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, WIPING, tag, owner, clock),
|
||||
: device_t(mconfig, WIPING_CUSTOM, tag, owner, clock),
|
||||
device_sound_interface(mconfig, *this),
|
||||
m_last_channel(nullptr),
|
||||
m_sound_prom(nullptr),
|
||||
@ -43,10 +42,10 @@ void wiping_sound_device::device_start()
|
||||
wp_sound_channel *voice;
|
||||
|
||||
/* get stream channels */
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 1, samplerate);
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 1, clock()/2);
|
||||
|
||||
/* allocate a buffer to mix into - 1 second's worth should be more than enough */
|
||||
m_mixer_buffer = make_unique_clear<short[]>(samplerate);
|
||||
m_mixer_buffer = make_unique_clear<short[]>(clock()/2);
|
||||
|
||||
/* build the mixer table */
|
||||
make_mixer_table(8, defgain);
|
||||
@ -85,9 +84,6 @@ void wiping_sound_device::device_start()
|
||||
/* build a table to divide by the number of voices; gain is specified as gain*16 */
|
||||
void wiping_sound_device::make_mixer_table(int voices, int gain)
|
||||
{
|
||||
int count = voices * 128;
|
||||
int i;
|
||||
|
||||
/* allocate memory */
|
||||
m_mixer_table = make_unique_clear<int16_t[]>(256 * voices);
|
||||
|
||||
@ -95,7 +91,7 @@ void wiping_sound_device::make_mixer_table(int voices, int gain)
|
||||
m_mixer_lookup = m_mixer_table.get() + (128 * voices);
|
||||
|
||||
/* fill in the table - 16 bit case */
|
||||
for (i = 0; i < count; i++)
|
||||
for (int i = 0; i < voices * 128; i++)
|
||||
{
|
||||
int val = i * gain * 16 / voices;
|
||||
if (val > 32767) val = 32767;
|
||||
|
@ -58,6 +58,6 @@ private:
|
||||
void make_mixer_table(int voices, int gain);
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(WIPING, wiping_sound_device)
|
||||
DECLARE_DEVICE_TYPE(WIPING_CUSTOM, wiping_sound_device)
|
||||
|
||||
#endif // MAME_AUDIO_WIPING_H
|
||||
|
@ -306,7 +306,7 @@ static MACHINE_CONFIG_START( firebatl )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("custom", WIPING, 0)
|
||||
MCFG_SOUND_ADD("custom", WIPING_CUSTOM, 96000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
@ -346,7 +346,7 @@ static MACHINE_CONFIG_START( clshroad )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("custom", WIPING, 0)
|
||||
MCFG_SOUND_ADD("custom", WIPING_CUSTOM, 96000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
@ -560,15 +560,9 @@ ROM_END
|
||||
|
||||
DRIVER_INIT_MEMBER(clshroad_state,firebatl)
|
||||
{
|
||||
/*
|
||||
Pugsy> firebatl:0:05C6:C3:100:Fix the Game:It's a hack but seems to make it work!
|
||||
Pugsy> firebatl:0:05C7:8D:600:Fix the Game (2/3)
|
||||
Pugsy> firebatl:0:05C8:23:600:Fix the Game (3/3)
|
||||
|
||||
without this the death sequence never ends so the game is unplayable after you
|
||||
die once, it would be nice to avoid the hack however
|
||||
|
||||
*/
|
||||
// applying HACK to fix the game
|
||||
// without this the death sequence never ends so the game is unplayable after you
|
||||
// die once, it would be nice to avoid the hack however
|
||||
uint8_t *ROM = memregion("maincpu")->base();
|
||||
|
||||
ROM[0x05C6] = 0xc3;
|
||||
|
@ -8,10 +8,10 @@
|
||||
original "wiped off due of not anymore licenseable" driver by insideoutboy.
|
||||
|
||||
TODO:
|
||||
- priority might be wrong in some places (title screen stars around the
|
||||
- priority might be wrong in some places (title screen stars around the
|
||||
galaxy, planet ship 3rd boss, 2nd boss);
|
||||
- sound chips (similar to Namco custom chips?)
|
||||
|
||||
|
||||
===============================================================================
|
||||
|
||||
Flower (c)1986 Komax (USA license)
|
||||
@ -116,8 +116,8 @@ public:
|
||||
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
|
||||
INTERRUPT_GEN_MEMBER(master_vblank_irq);
|
||||
INTERRUPT_GEN_MEMBER(slave_vblank_irq);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
TILE_GET_INFO_MEMBER(get_fg_tile_info);
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
protected:
|
||||
@ -126,7 +126,7 @@ protected:
|
||||
virtual void machine_reset() override;
|
||||
|
||||
virtual void video_start() override;
|
||||
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_mastercpu;
|
||||
required_device<cpu_device> m_slavecpu;
|
||||
@ -142,10 +142,10 @@ private:
|
||||
required_shared_ptr<uint8_t> m_fgscroll;
|
||||
required_device<generic_latch_8_device> m_soundlatch;
|
||||
bitmap_ind16 m_temp_bitmap;
|
||||
|
||||
|
||||
void draw_legacy_text(bitmap_ind16 &bitmap,const rectangle &cliprect);
|
||||
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
|
||||
|
||||
|
||||
bool m_audio_nmi_enable;
|
||||
bool m_flip_screen;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
@ -155,7 +155,7 @@ private:
|
||||
TILE_GET_INFO_MEMBER(flower_state::get_bg_tile_info)
|
||||
{
|
||||
int code = m_bgvram[tile_index];
|
||||
int color = (m_bgvram[tile_index+0x100] & 0xf0) >> 4;
|
||||
int color = (m_bgvram[tile_index+0x100] & 0xf0) >> 4;
|
||||
|
||||
SET_TILE_INFO_MEMBER(1, code, color, 0);
|
||||
}
|
||||
@ -163,8 +163,8 @@ TILE_GET_INFO_MEMBER(flower_state::get_bg_tile_info)
|
||||
TILE_GET_INFO_MEMBER(flower_state::get_fg_tile_info)
|
||||
{
|
||||
int code = m_fgvram[tile_index];
|
||||
int color = (m_fgvram[tile_index+0x100] & 0xf0) >> 4;
|
||||
|
||||
int color = (m_fgvram[tile_index+0x100] & 0xf0) >> 4;
|
||||
|
||||
SET_TILE_INFO_MEMBER(1, code, color, 0);
|
||||
}
|
||||
|
||||
@ -172,12 +172,12 @@ void flower_state::video_start()
|
||||
{
|
||||
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(flower_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 16, 16);
|
||||
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(flower_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 16, 16);
|
||||
|
||||
m_screen->register_screen_bitmap(m_temp_bitmap);
|
||||
|
||||
m_screen->register_screen_bitmap(m_temp_bitmap);
|
||||
m_fg_tilemap->set_transparent_pen(15);
|
||||
|
||||
save_item(NAME(m_flip_screen));
|
||||
|
||||
|
||||
m_bg_tilemap->set_scrolldx(16, 0);
|
||||
m_fg_tilemap->set_scrolldx(16, 0);
|
||||
}
|
||||
@ -230,7 +230,7 @@ void flower_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
|
||||
{
|
||||
uint8_t *spr_ptr = &m_workram[0x1e08];
|
||||
gfx_element *gfx_2 = m_gfxdecode->gfx(2);
|
||||
|
||||
|
||||
// traverse from top to bottom
|
||||
for(int i=0x1f0;i>=0;i-=8)
|
||||
{
|
||||
@ -249,12 +249,12 @@ void flower_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
|
||||
uint32_t xshrink_zoom = ((spr_ptr[i+3] & 0x07) >> 0) + 1;
|
||||
yshrink_zoom <<= 13;
|
||||
xshrink_zoom <<= 13;
|
||||
int ypixels = (yshrink_zoom*16) >> 16;
|
||||
int ypixels = (yshrink_zoom*16) >> 16;
|
||||
int xpixels = (xshrink_zoom*16) >> 16;
|
||||
|
||||
|
||||
tile |= (attr & 1) << 6;
|
||||
tile |= (attr & 8) << 4;
|
||||
|
||||
|
||||
if(flip_screen())
|
||||
{
|
||||
x += xsize*16;
|
||||
@ -264,16 +264,16 @@ void flower_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
|
||||
|
||||
if(ysize == 2)
|
||||
y-=16;
|
||||
|
||||
|
||||
for(int yi=0;yi<ysize;yi++)
|
||||
{
|
||||
int yoffs = (16-ypixels)/ydiv;
|
||||
|
||||
|
||||
for(int xi=0;xi<xsize;xi++)
|
||||
{
|
||||
int tile_offs;
|
||||
int xoffs = (16-xpixels)/xdiv;
|
||||
|
||||
|
||||
tile_offs = fx ? (xsize-xi-1) * 8 : xi*8;
|
||||
tile_offs+= fy ? (ysize-yi-1) : yi;
|
||||
|
||||
@ -511,10 +511,10 @@ static MACHINE_CONFIG_START( flower )
|
||||
MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 256)
|
||||
|
||||
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
|
||||
|
||||
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("flower", FLOWER_CUSTOM, 0)
|
||||
MCFG_SOUND_ADD("flower", FLOWER_CUSTOM, 96000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -319,7 +319,7 @@ static MACHINE_CONFIG_START( wiping )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("wiping", WIPING, 0)
|
||||
MCFG_SOUND_ADD("wiping", WIPING_CUSTOM, 96000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user