nasco/suprgolf.cpp: modernize palette/vram memory view, reduce ADPCM aliasing, misc cleanups

This commit is contained in:
angelosa 2023-11-16 23:13:12 +01:00
parent ce7aa9f6a0
commit b574c62bfd

View File

@ -39,13 +39,15 @@ namespace {
class suprgolf_state : public driver_device
{
public:
suprgolf_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_videoram(*this, "videoram")
suprgolf_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_msm(*this, "msm")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_videoram(*this, "videoram")
, m_paletteram(*this, "paletteram")
, m_vram_palette_view(*this, "vram_palette_view")
{ }
void suprgolf(machine_config &config);
@ -65,20 +67,21 @@ private:
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_paletteram;
memory_view m_vram_palette_view;
tilemap_t *m_tilemap = nullptr;
std::unique_ptr<uint8_t[]> m_paletteram;
std::unique_ptr<uint8_t[]> m_bg_vram;
std::unique_ptr<uint16_t[]> m_bg_fb;
std::unique_ptr<uint16_t[]> m_fg_fb;
uint8_t m_bg_bank = 0;
uint8_t m_msm5205next = 0;
uint8_t m_msm_nmi_mask = 0;
bool m_msm_nmi_enable = 0;
uint8_t m_vreg_pen = 0;
uint8_t m_palette_switch = 0;
uint8_t m_toggle = 0;
uint8_t videoram_r(offs_t offset);
void paletteram_w(offs_t offset, uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
uint8_t bg_vram_r(offs_t offset);
void bg_vram_w(offs_t offset, uint8_t data);
@ -90,8 +93,6 @@ private:
uint8_t pedal_extra_bits_r();
uint8_t p1_r();
uint8_t p2_r();
void writeA(uint8_t data);
void writeB(uint8_t data);
void adpcm_int(int state);
TILE_GET_INFO_MEMBER(get_tile_info);
@ -114,18 +115,15 @@ TILE_GET_INFO_MEMBER(suprgolf_state::get_tile_info)
void suprgolf_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprgolf_state::get_tile_info)), TILEMAP_SCAN_ROWS,8,8,32,32 );
m_paletteram = std::make_unique<uint8_t[]>(0x1000);
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(suprgolf_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32 );
m_bg_vram = std::make_unique<uint8_t[]>(0x2000*0x20);
m_bg_fb = std::make_unique<uint16_t[]>(0x2000*0x20);
m_fg_fb = std::make_unique<uint16_t[]>(0x2000*0x20);
m_tilemap->set_transparent_pen(15);
m_tilemap->set_transparent_pen(0xf);
save_item(NAME(m_bg_bank));
save_item(NAME(m_vreg_pen));
save_item(NAME(m_palette_switch));
save_pointer(NAME(m_paletteram), 0x1000);
save_pointer(NAME(m_bg_vram), 0x2000*0x20);
save_pointer(NAME(m_bg_fb), 0x2000*0x20);
save_pointer(NAME(m_fg_fb), 0x2000*0x20);
@ -170,42 +168,34 @@ uint32_t suprgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
return 0;
}
uint8_t suprgolf_state::videoram_r(offs_t offset)
{
if (m_palette_switch)
return m_paletteram[offset];
else
return m_videoram[offset];
}
void suprgolf_state::videoram_w(offs_t offset, uint8_t data)
{
if(m_palette_switch)
{
int r,g,b,datax;
m_paletteram[offset] = data;
offset>>=1;
datax = m_paletteram[offset*2] + 256*m_paletteram[offset*2 + 1];
m_videoram[offset] = data;
m_tilemap->mark_tile_dirty((offset & 0x7fe) >> 1);
}
b = (datax & 0x8000) ? 0 : ((datax)&0x001f)>>0;
g = (datax & 0x8000) ? 0 : ((datax)&0x03e0)>>5;
r = (datax & 0x8000) ? 0 : ((datax)&0x7c00)>>10;
void suprgolf_state::paletteram_w(offs_t offset, uint8_t data)
{
u16 datax;
u16 r, g, b;
m_palette->set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b));
}
else
{
m_videoram[offset] = data;
m_tilemap->mark_tile_dirty((offset & 0x7fe) >> 1);
}
m_paletteram[offset] = data;
offset >>= 1;
datax = m_paletteram[offset * 2] + (m_paletteram[offset*2 + 1] << 8);
b = (datax & 0x8000) ? 0 : ((datax)&0x001f)>>0;
g = (datax & 0x8000) ? 0 : ((datax)&0x03e0)>>5;
r = (datax & 0x8000) ? 0 : ((datax)&0x7c00)>>10;
m_palette->set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b));
}
void suprgolf_state::vregs_w(uint8_t data)
{
//printf("%02x\n",data);
m_vram_palette_view.select(BIT(data, 7));
//bits 0,1,2 and probably 3 controls the background vram banking
m_palette_switch = (data & 0x80);
m_bg_bank = (data & 0x1f);
//if(data & 0x60)
@ -262,16 +252,6 @@ void suprgolf_state::bg_vram_w(offs_t offset, uint8_t data)
}
}
void suprgolf_state::machine_start()
{
membank("bank1")->configure_entries(0, 16, memregion("user2")->base(), 0x4000);
membank("bank2")->configure_entries(0, 64, memregion("user1")->base(), 0x4000);
save_item(NAME(m_msm5205next));
save_item(NAME(m_msm_nmi_mask));
save_item(NAME(m_toggle));
}
void suprgolf_state::pen_w(uint8_t data)
{
m_vreg_pen = data;
@ -284,21 +264,15 @@ void suprgolf_state::adpcm_data_w(uint8_t data)
void suprgolf_state::rom_bank_select_w(uint8_t data)
{
//popmessage("%08x %02x",((data & 0x3f) * 0x4000),data);
//osd_printf_debug("ROM_BANK 0x8000 - %X @%X\n",data,m_maincpu->pcbase());
membank("bank2")->set_entry(data & 0x3f);
m_msm_nmi_mask = data & 0x40;
flip_screen_set(data & 0x80);
m_msm_nmi_enable = bool(BIT(data, 6));
flip_screen_set(BIT(data, 7));
}
void suprgolf_state::rom2_bank_select_w(uint8_t data)
{
//osd_printf_debug("ROM_BANK 0x4000 - %X @%X\n",data,m_maincpu->pcbase());
membank("bank1")->set_entry(data & 0x0f);
//if(data & 0xf0)
// printf("Rom bank select 2 with data %02x activated\n",data);
}
uint8_t suprgolf_state::pedal_extra_bits_r()
@ -328,7 +302,9 @@ void suprgolf_state::suprgolf_map(address_map &map)
map(0x4000, 0x4000).w(FUNC(suprgolf_state::rom2_bank_select_w));
map(0x8000, 0xbfff).bankr("bank2");
map(0xc000, 0xdfff).rw(FUNC(suprgolf_state::bg_vram_r), FUNC(suprgolf_state::bg_vram_w)); // banked background vram
map(0xe000, 0xefff).rw(FUNC(suprgolf_state::videoram_r), FUNC(suprgolf_state::videoram_w)).share("videoram"); //foreground vram + paletteram
map(0xe000, 0xefff).view(m_vram_palette_view);
m_vram_palette_view[0](0xe000, 0xefff).ram().w(FUNC(suprgolf_state::videoram_w)).share("videoram");
m_vram_palette_view[1](0xe000, 0xefff).ram().w(FUNC(suprgolf_state::paletteram_w)).share("paletteram");
map(0xf000, 0xf000).w(FUNC(suprgolf_state::pen_w));
map(0xf800, 0xffff).ram();
}
@ -427,38 +403,36 @@ static INPUT_PORTS_START( suprgolf )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:8" )
INPUT_PORTS_END
void suprgolf_state::writeA(uint8_t data)
{
osd_printf_debug("ymwA\n");
}
void suprgolf_state::writeB(uint8_t data)
{
osd_printf_debug("ymwA\n");
}
void suprgolf_state::adpcm_int(int state)
{
m_msm->reset_w(0);
m_toggle ^= 1;
if(m_toggle)
{
m_msm->data_w((m_msm5205next & 0xf0) >> 4);
if(m_msm_nmi_mask) { m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); }
}
else
{
m_msm->data_w((m_msm5205next & 0x0f) >> 0);
}
m_msm->data_w(m_msm5205next & 0x0f);
if(m_toggle && m_msm_nmi_enable)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
m_msm5205next >>= 4;
}
static GFXDECODE_START( gfx_suprgolf )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 0x80 )
GFXDECODE_END
void suprgolf_state::machine_start()
{
membank("bank1")->configure_entries(0, 16, memregion("user2")->base(), 0x4000);
membank("bank2")->configure_entries(0, 64, memregion("user1")->base(), 0x4000);
save_item(NAME(m_msm5205next));
save_item(NAME(m_msm_nmi_enable));
save_item(NAME(m_toggle));
}
void suprgolf_state::machine_reset()
{
m_msm_nmi_mask = 0;
m_msm_nmi_enable = 0;
m_toggle = 0;
m_vram_palette_view.select(0);
}
#define MASTER_CLOCK XTAL(12'000'000)
@ -500,14 +474,13 @@ void suprgolf_state::suprgolf(machine_config &config)
//ymsnd.irq_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
ymsnd.port_a_read_callback().set_ioport("DSW0");
ymsnd.port_b_read_callback().set_ioport("DSW1");
ymsnd.port_a_write_callback().set(FUNC(suprgolf_state::writeA));
ymsnd.port_b_write_callback().set(FUNC(suprgolf_state::writeB));
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.5);
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.25);
MSM5205(config, m_msm, XTAL(384'000)); /* guess */
m_msm->vck_legacy_callback().set(FUNC(suprgolf_state::adpcm_int)); /* interrupt function */
m_msm->vck_legacy_callback().set(FUNC(suprgolf_state::adpcm_int));
m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 4KHz 4-bit */
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
// TODO: noticeable aliasing, high-pass filtered? Different frequency?
}
ROM_START( suprgolf )