pcktgal.c: added save state support, configured banking (nw)

This commit is contained in:
Ivan Vangelista 2015-06-30 19:27:30 +02:00
parent 0b7f2bedcb
commit 14f7f02159
3 changed files with 50 additions and 48 deletions

View File

@ -18,36 +18,33 @@
#include "cpu/m6502/m6502.h" #include "cpu/m6502/m6502.h"
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "sound/3812intf.h" #include "sound/3812intf.h"
#include "sound/msm5205.h"
#include "includes/pcktgal.h" #include "includes/pcktgal.h"
#include "machine/deco222.h" #include "machine/deco222.h"
/***************************************************************************/ /***************************************************************************/
WRITE8_MEMBER(pcktgal_state::pcktgal_bank_w) WRITE8_MEMBER(pcktgal_state::bank_w)
{ {
UINT8 *RAM = memregion("maincpu")->base(); if (data & 1) { membank("bank1")->set_entry(0); }
else { membank("bank1")->set_entry(1); }
if (data & 1) { membank("bank1")->set_base(&RAM[0x4000]); } if (data & 2) { membank("bank2")->set_entry(0); }
else { membank("bank1")->set_base(&RAM[0x10000]); } else { membank("bank2")->set_entry(1); }
if (data & 2) { membank("bank2")->set_base(&RAM[0x6000]); }
else { membank("bank2")->set_base(&RAM[0x12000]); }
} }
WRITE8_MEMBER(pcktgal_state::pcktgal_sound_bank_w) WRITE8_MEMBER(pcktgal_state::sound_bank_w)
{ {
membank("bank3")->set_entry((data >> 2) & 1); membank("bank3")->set_entry((data >> 2) & 1);
} }
WRITE8_MEMBER(pcktgal_state::pcktgal_sound_w) WRITE8_MEMBER(pcktgal_state::sound_w)
{ {
soundlatch_byte_w(space, 0, data); soundlatch_byte_w(space, 0, data);
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
} }
WRITE_LINE_MEMBER(pcktgal_state::pcktgal_adpcm_int) WRITE_LINE_MEMBER(pcktgal_state::adpcm_int)
{ {
m_msm->data_w(m_msm5205next >> 4); m_msm->data_w(m_msm5205next >> 4);
m_msm5205next <<= 4; m_msm5205next <<= 4;
@ -57,12 +54,12 @@ WRITE_LINE_MEMBER(pcktgal_state::pcktgal_adpcm_int)
m_audiocpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE); m_audiocpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
} }
WRITE8_MEMBER(pcktgal_state::pcktgal_adpcm_data_w) WRITE8_MEMBER(pcktgal_state::adpcm_data_w)
{ {
m_msm5205next = data; m_msm5205next = data;
} }
READ8_MEMBER(pcktgal_state::pcktgal_adpcm_reset_r) READ8_MEMBER(pcktgal_state::adpcm_reset_r)
{ {
m_msm->reset_w(0); m_msm->reset_w(0);
return 0; return 0;
@ -78,8 +75,8 @@ static ADDRESS_MAP_START( pcktgal_map, AS_PROGRAM, 8, pcktgal_state )
AM_RANGE(0x1800, 0x1807) AM_DEVWRITE("tilegen1", deco_bac06_device, pf_control0_8bit_w) AM_RANGE(0x1800, 0x1807) AM_DEVWRITE("tilegen1", deco_bac06_device, pf_control0_8bit_w)
AM_RANGE(0x1810, 0x181f) AM_DEVREADWRITE("tilegen1", deco_bac06_device, pf_control1_8bit_r, pf_control1_8bit_w) AM_RANGE(0x1810, 0x181f) AM_DEVREADWRITE("tilegen1", deco_bac06_device, pf_control1_8bit_r, pf_control1_8bit_w)
AM_RANGE(0x1a00, 0x1a00) AM_READ_PORT("P2") AM_WRITE(pcktgal_sound_w) AM_RANGE(0x1a00, 0x1a00) AM_READ_PORT("P2") AM_WRITE(sound_w)
AM_RANGE(0x1c00, 0x1c00) AM_READ_PORT("DSW") AM_WRITE(pcktgal_bank_w) AM_RANGE(0x1c00, 0x1c00) AM_READ_PORT("DSW") AM_WRITE(bank_w)
AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank1") AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank1")
AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank2") AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank2")
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
@ -92,10 +89,10 @@ static ADDRESS_MAP_START( pcktgal_sound_map, AS_PROGRAM, 8, pcktgal_state )
AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x0000, 0x07ff) AM_RAM
AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ym1", ym2203_device, write) AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ym1", ym2203_device, write)
AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ym2", ym3812_device, write) AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ym2", ym3812_device, write)
AM_RANGE(0x1800, 0x1800) AM_WRITE(pcktgal_adpcm_data_w) /* ADPCM data for the MSM5205 chip */ AM_RANGE(0x1800, 0x1800) AM_WRITE(adpcm_data_w) /* ADPCM data for the MSM5205 chip */
AM_RANGE(0x2000, 0x2000) AM_WRITE(pcktgal_sound_bank_w) AM_RANGE(0x2000, 0x2000) AM_WRITE(sound_bank_w)
AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_byte_r) AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_byte_r)
AM_RANGE(0x3400, 0x3400) AM_READ(pcktgal_adpcm_reset_r) /* ? not sure */ AM_RANGE(0x3400, 0x3400) AM_READ(adpcm_reset_r) /* ? not sure */
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank3") AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank3")
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -212,7 +209,12 @@ GFXDECODE_END
void pcktgal_state::machine_start() void pcktgal_state::machine_start()
{ {
membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x4000, 0xc000);
membank("bank2")->configure_entries(0, 2, memregion("maincpu")->base() + 0x6000, 0xc000);
membank("bank3")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x10000, 0x4000); membank("bank3")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x10000, 0x4000);
save_item(NAME(m_msm5205next));
save_item(NAME(m_toggle));
} }
static MACHINE_CONFIG_START( pcktgal, pcktgal_state ) static MACHINE_CONFIG_START( pcktgal, pcktgal_state )
@ -255,7 +257,7 @@ static MACHINE_CONFIG_START( pcktgal, pcktgal_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_SOUND_ADD("msm", MSM5205, 384000) MCFG_SOUND_ADD("msm", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(pcktgal_state, pcktgal_adpcm_int)) /* interrupt function */ MCFG_MSM5205_VCLK_CB(WRITELINE(pcktgal_state, adpcm_int)) /* interrupt function */
MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8KHz */ MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8KHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -440,9 +442,9 @@ DRIVER_INIT_MEMBER(pcktgal_state,pcktgal)
/***************************************************************************/ /***************************************************************************/
GAME( 1987, pcktgal, 0, pcktgal, pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal (Japan)", 0 ) GAME( 1987, pcktgal, 0, pcktgal, pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1987, pcktgalb, pcktgal, bootleg, pcktgal, driver_device, 0, ROT0, "bootleg", "Pocket Gal (bootleg)", 0 ) GAME( 1987, pcktgalb, pcktgal, bootleg, pcktgal, driver_device, 0, ROT0, "bootleg", "Pocket Gal (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1989, pcktgal2, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal 2 (English)", 0 ) GAME( 1989, pcktgal2, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal 2 (English)", GAME_SUPPORTS_SAVE )
GAME( 1989, pcktgal2j,pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal 2 (Japanese)", 0 ) GAME( 1989, pcktgal2j,pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Pocket Gal 2 (Japanese)", GAME_SUPPORTS_SAVE )
GAME( 1989, spool3, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Super Pool III (English)", 0 ) GAME( 1989, spool3, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation", "Super Pool III (English)", GAME_SUPPORTS_SAVE )
GAME( 1990, spool3i, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation (I-Vics license)", "Super Pool III (I-Vics)", 0 ) GAME( 1990, spool3i, pcktgal, pcktgal2,pcktgal, pcktgal_state, pcktgal, ROT0, "Data East Corporation (I-Vics license)", "Super Pool III (I-Vics)", GAME_SUPPORTS_SAVE )

View File

@ -12,30 +12,34 @@ public:
m_audiocpu(*this, "audiocpu"), m_audiocpu(*this, "audiocpu"),
m_msm(*this, "msm"), m_msm(*this, "msm"),
m_tilegen1(*this, "tilegen1"), m_tilegen1(*this, "tilegen1"),
m_spriteram(*this, "spriteram"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { } m_palette(*this, "palette"),
m_spriteram(*this, "spriteram") { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu; required_device<cpu_device> m_audiocpu;
required_device<msm5205_device> m_msm; required_device<msm5205_device> m_msm;
required_device<deco_bac06_device> m_tilegen1; required_device<deco_bac06_device> m_tilegen1;
required_shared_ptr<UINT8> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
DECLARE_WRITE8_MEMBER(pcktgal_bank_w); required_shared_ptr<UINT8> m_spriteram;
DECLARE_WRITE8_MEMBER(pcktgal_sound_bank_w);
DECLARE_WRITE8_MEMBER(pcktgal_sound_w);
DECLARE_WRITE8_MEMBER(pcktgal_adpcm_data_w);
DECLARE_READ8_MEMBER(pcktgal_adpcm_reset_r);
DECLARE_DRIVER_INIT(pcktgal);
int m_msm5205next; int m_msm5205next;
int m_toggle; int m_toggle;
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(sound_bank_w);
DECLARE_WRITE8_MEMBER(sound_w);
DECLARE_WRITE8_MEMBER(adpcm_data_w);
DECLARE_READ8_MEMBER(adpcm_reset_r);
DECLARE_WRITE_LINE_MEMBER(adpcm_int);
DECLARE_DRIVER_INIT(pcktgal);
DECLARE_PALETTE_INIT(pcktgal); DECLARE_PALETTE_INIT(pcktgal);
virtual void machine_start(); virtual void machine_start();
UINT32 screen_update_pcktgal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_pcktgal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_pcktgalb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_pcktgalb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(pcktgal_adpcm_int);
}; };

View File

@ -6,9 +6,8 @@
PALETTE_INIT_MEMBER(pcktgal_state, pcktgal) PALETTE_INIT_MEMBER(pcktgal_state, pcktgal)
{ {
const UINT8 *color_prom = memregion("proms")->base(); const UINT8 *color_prom = memregion("proms")->base();
int i;
for (i = 0;i < palette.entries();i++) for (int i = 0;i < palette.entries();i++)
{ {
int bit0,bit1,bit2,bit3,r,g,b; int bit0,bit1,bit2,bit3,r,g,b;
@ -34,21 +33,18 @@ PALETTE_INIT_MEMBER(pcktgal_state, pcktgal)
void pcktgal_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) void pcktgal_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
UINT8 *spriteram = m_spriteram; for (int offs = 0;offs < m_spriteram.bytes();offs += 4)
int offs;
for (offs = 0;offs < m_spriteram.bytes();offs += 4)
{ {
if (spriteram[offs] != 0xf8) if (m_spriteram[offs] != 0xf8)
{ {
int sx,sy,flipx,flipy; int sx,sy,flipx,flipy;
sx = 240 - spriteram[offs+2]; sx = 240 - m_spriteram[offs+2];
sy = 240 - spriteram[offs]; sy = 240 - m_spriteram[offs];
flipx = spriteram[offs+1] & 0x04; flipx = m_spriteram[offs+1] & 0x04;
flipy = spriteram[offs+1] & 0x02; flipy = m_spriteram[offs+1] & 0x02;
if (flip_screen()) { if (flip_screen()) {
sx=240-sx; sx=240-sx;
sy=240-sy; sy=240-sy;
@ -57,8 +53,8 @@ void pcktgal_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
} }
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
spriteram[offs+3] + ((spriteram[offs+1] & 1) << 8), m_spriteram[offs+3] + ((m_spriteram[offs+1] & 1) << 8),
(spriteram[offs+1] & 0x70) >> 4, (m_spriteram[offs+1] & 0x70) >> 4,
flipx,flipy, flipx,flipy,
sx,sy,0); sx,sy,0);
} }