psychic5.c: added save state support, converted to configured banking (nw)

This commit is contained in:
Ivan Vangelista 2015-02-26 18:17:27 +01:00
parent 8e08d034be
commit c9a2700bb1
4 changed files with 122 additions and 98 deletions

View File

@ -69,7 +69,7 @@ execution of two different restart (RST) instructions.
RST 10,the main IRQ,is to be triggered each time the screen is refreshed.
RST 08 must be triggered in order to make the game work properly
(e.g. demo game),I guess sound has something to do with this IRQ,but I
don't know whether it is sinchronized with video beam neither I know whether
don't know whether it is synchronized with video beam neither I know whether
it can be disabled.
Sound CPU runs in IM1.
@ -237,7 +237,7 @@ background intensity.
Background intensity is encoded in the same way of colors,and
affects the intensity of each color component (BGR).
The least significant nibble of c5ff is unknown,it assumes value
0xf occasionaly when the other nibbles are changed.The only
0xf occasionally when the other nibbles are changed.The only
value which is not 0 neither 0xf is 2 and it is assumed by this nibble
during the ride on the witches' broom.
@ -265,7 +265,7 @@ Background virtual screen is 1024 pixels tall and 512 pixel wide.
Two consecutive bytes identify one tile.
O7 O6 O5 O4 O3 O2 O1 O0 gfx Offset
O9 O8 FX FY C3 C2 C1 C0 Attibute
O9 O8 FX FY C3 C2 C1 C0 Attribute
O= GFX offset (1024 tiles)
F= Flip X and Y
@ -315,6 +315,20 @@ The first sprite data is located at f20b,then f21b and so on.
#include "includes/psychic5.h"
MACHINE_START_MEMBER(psychic5_state, psychic5)
{
membank("mainbank")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
save_item(NAME(m_bank_latch));
}
MACHINE_START_MEMBER(psychic5_state, bombsa)
{
membank("mainbank")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
save_item(NAME(m_bank_latch));
}
void psychic5_state::machine_reset()
{
m_bank_latch = 0xff;
@ -327,7 +341,7 @@ void psychic5_state::machine_reset()
***************************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(psychic5_state::psychic5_scanline)
TIMER_DEVICE_CALLBACK_MEMBER(psychic5_state::scanline)
{
int scanline = param;
@ -346,34 +360,26 @@ TIMER_DEVICE_CALLBACK_MEMBER(psychic5_state::psychic5_scanline)
***************************************************************************/
READ8_MEMBER(psychic5_state::psychic5_bankselect_r)
READ8_MEMBER(psychic5_state::bankselect_r)
{
return m_bank_latch;
}
WRITE8_MEMBER(psychic5_state::psychic5_bankselect_w)
{
UINT8 *RAM = memregion("maincpu")->base();
int bankaddress;
if (m_bank_latch != data)
{
m_bank_latch = data;
bankaddress = 0x10000 + ((data & 3) * 0x4000);
membank("bank1")->set_base(&RAM[bankaddress]); /* Select 4 banks of 16k */
membank("mainbank")->set_entry(data & 3); /* Select 4 banks of 16k */
}
}
WRITE8_MEMBER(psychic5_state::bombsa_bankselect_w)
{
UINT8 *RAM = memregion("maincpu")->base();
int bankaddress;
if (m_bank_latch != data)
{
m_bank_latch = data;
bankaddress = 0x10000 + ((data & 7) * 0x4000);
membank("bank1")->set_base(&RAM[bankaddress]); /* Select 8 banks of 16k */
membank("mainbank")->set_entry(data & 7); /* Select 8 banks of 16k */
}
}
@ -407,13 +413,13 @@ WRITE8_MEMBER(psychic5_state::bombsa_flipscreen_w)
static ADDRESS_MAP_START( psychic5_main_map, AS_PROGRAM, 8, psychic5_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("mainbank")
AM_RANGE(0xc000, 0xdfff) AM_DEVICE("vrambank", address_map_bank_device, amap8)
AM_RANGE(0xe000, 0xefff) AM_RAM
AM_RANGE(0xf000, 0xf000) AM_WRITE(soundlatch_byte_w)
AM_RANGE(0xf001, 0xf001) AM_READNOP AM_WRITE(psychic5_coin_counter_w)
AM_RANGE(0xf002, 0xf002) AM_READWRITE(psychic5_bankselect_r, psychic5_bankselect_w)
AM_RANGE(0xf003, 0xf003) AM_READWRITE(psychic5_vram_page_select_r, psychic5_vram_page_select_w)
AM_RANGE(0xf002, 0xf002) AM_READWRITE(bankselect_r, psychic5_bankselect_w)
AM_RANGE(0xf003, 0xf003) AM_READWRITE(vram_page_select_r, vram_page_select_w)
AM_RANGE(0xf004, 0xf004) AM_NOP // ???
AM_RANGE(0xf005, 0xf005) AM_READNOP AM_WRITE(psychic5_title_screen_w)
AM_RANGE(0xf006, 0xf1ff) AM_NOP
@ -458,14 +464,14 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bombsa_main_map, AS_PROGRAM, 8, psychic5_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("mainbank")
AM_RANGE(0xc000, 0xcfff) AM_RAM
/* ports look like the other games */
AM_RANGE(0xd000, 0xd000) AM_WRITE(soundlatch_byte_w) // confirmed
AM_RANGE(0xd001, 0xd001) AM_WRITE(bombsa_flipscreen_w)
AM_RANGE(0xd002, 0xd002) AM_READWRITE(psychic5_bankselect_r, bombsa_bankselect_w)
AM_RANGE(0xd003, 0xd003) AM_READWRITE(psychic5_vram_page_select_r, psychic5_vram_page_select_w)
AM_RANGE(0xd002, 0xd002) AM_READWRITE(bankselect_r, bombsa_bankselect_w)
AM_RANGE(0xd003, 0xd003) AM_READWRITE(vram_page_select_r, vram_page_select_w)
AM_RANGE(0xd005, 0xd005) AM_WRITE(bombsa_unknown_w) // ?
AM_RANGE(0xd000, 0xd1ff) AM_RAM
@ -682,18 +688,12 @@ static GFXDECODE_START( bombsa )
GFXDECODE_END
WRITE_LINE_MEMBER(psychic5_state::irqhandler)
{
m_audiocpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
}
static MACHINE_CONFIG_START( psychic5, psychic5_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2)
MCFG_CPU_PROGRAM_MAP(psychic5_main_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", psychic5_state, psychic5_scanline, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", psychic5_state, scanline, "screen", 0, 1)
MCFG_DEVICE_ADD("vrambank", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(psychic5_vrambank_map)
@ -707,6 +707,8 @@ static MACHINE_CONFIG_START( psychic5, psychic5_state )
MCFG_CPU_IO_MAP(psychic5_soundport_map)
MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* Allow time for 2nd cpu to interleave */
MCFG_MACHINE_START_OVERRIDE(psychic5_state,psychic5)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -727,7 +729,7 @@ static MACHINE_CONFIG_START( psychic5, psychic5_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ym1", YM2203, XTAL_12MHz/8)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(psychic5_state, irqhandler))
MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
MCFG_SOUND_ROUTE(0, "mono", 0.15)
MCFG_SOUND_ROUTE(1, "mono", 0.15)
MCFG_SOUND_ROUTE(2, "mono", 0.15)
@ -745,7 +747,7 @@ static MACHINE_CONFIG_START( bombsa, psychic5_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2 ) /* 6 MHz */
MCFG_CPU_PROGRAM_MAP(bombsa_main_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", psychic5_state, psychic5_scanline, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", psychic5_state, scanline, "screen", 0, 1)
MCFG_DEVICE_ADD("vrambank", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(bombsa_vrambank_map)
@ -759,6 +761,8 @@ static MACHINE_CONFIG_START( bombsa, psychic5_state )
MCFG_CPU_IO_MAP(bombsa_soundport_map)
MCFG_QUANTUM_TIME(attotime::from_hz(600))
MCFG_MACHINE_START_OVERRIDE(psychic5_state,bombsa)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -778,7 +782,7 @@ static MACHINE_CONFIG_START( bombsa, psychic5_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ym1", YM2203, XTAL_12MHz/8)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(psychic5_state, irqhandler))
MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
MCFG_SOUND_ROUTE(0, "mono", 0.30)
MCFG_SOUND_ROUTE(1, "mono", 0.30)
MCFG_SOUND_ROUTE(2, "mono", 0.30)
@ -944,6 +948,6 @@ ROM_START( bombsa )
ROM_END
GAME( 1987, psychic5, 0, psychic5, psychic5, driver_device, 0, ROT270, "Jaleco / NMK", "Psychic 5 (World)", 0 ) // "Oversea's version V2.00 CHANGED BY TAMIO NAKASATO" text present in ROM, various modifications (English names, more complete attract demo etc.)
GAME( 1987, psychic5j, psychic5, psychic5, psychic5, driver_device, 0, ROT270, "Jaleco / NMK", "Psychic 5 (Japan)", 0 )
GAME( 1988, bombsa, 0, bombsa, bombsa, driver_device, 0, ROT270, "Jaleco", "Bombs Away", GAME_NOT_WORKING )
GAME( 1987, psychic5, 0, psychic5, psychic5, driver_device, 0, ROT270, "Jaleco / NMK", "Psychic 5 (World)", GAME_SUPPORTS_SAVE ) // "Oversea's version V2.00 CHANGED BY TAMIO NAKASATO" text present in ROM, various modifications (English names, more complete attract demo etc.)
GAME( 1987, psychic5j, psychic5, psychic5, psychic5, driver_device, 0, ROT270, "Jaleco / NMK", "Psychic 5 (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1988, bombsa, 0, bombsa, bombsa, driver_device, 0, ROT270, "Jaleco", "Bombs Away", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )

View File

@ -5,27 +5,38 @@ class psychic5_state : public driver_device
public:
psychic5_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_vrambank(*this, "vrambank"),
m_spriteram(*this, "spriteram"),
m_fg_videoram(*this, "fg_videoram"),
m_bg_videoram(*this, "bg_videoram"),
m_bg_control(*this, "bg_control"),
m_ps5_palette_ram_bg(*this, "palette_ram_bg"),
m_ps5_palette_ram_sp(*this, "palette_ram_sp"),
m_ps5_palette_ram_tx(*this, "palette_ram_tx")
{ }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_device<address_map_bank_device> m_vrambank;
required_shared_ptr<UINT8> m_spriteram;
required_shared_ptr<UINT8> m_fg_videoram;
required_shared_ptr<UINT8> m_bg_videoram;
required_shared_ptr<UINT8> m_bg_control;
required_shared_ptr<UINT8> m_ps5_palette_ram_bg;
required_shared_ptr<UINT8> m_ps5_palette_ram_sp;
required_shared_ptr<UINT8> m_ps5_palette_ram_tx;
UINT8 m_bank_latch;
UINT8 m_ps5_vram_page;
UINT8 m_bg_clip_mode;
UINT8 m_title_screen;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
UINT16 m_palette_intensity;
@ -33,50 +44,44 @@ public:
int m_sx1;
int m_sy1;
int m_sy2;
required_shared_ptr<UINT8> m_spriteram;
DECLARE_READ8_MEMBER(psychic5_bankselect_r);
DECLARE_WRITE8_MEMBER(psychic5_bankselect_w);
DECLARE_WRITE8_MEMBER(bombsa_bankselect_w);
DECLARE_WRITE8_MEMBER(psychic5_coin_counter_w);
DECLARE_WRITE8_MEMBER(bombsa_flipscreen_w);
DECLARE_READ8_MEMBER(psychic5_vram_page_select_r);
DECLARE_WRITE8_MEMBER(psychic5_vram_page_select_w);
DECLARE_WRITE8_MEMBER(psychic5_title_screen_w);
DECLARE_WRITE8_MEMBER(bombsa_unknown_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_reset();
DECLARE_VIDEO_START(psychic5);
DECLARE_VIDEO_RESET(psychic5);
DECLARE_VIDEO_START(bombsa);
UINT32 screen_update_psychic5(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_bombsa(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(psychic5_scanline);
void psychic5_change_palette(int offset, UINT8* palram, int palbase);
void psychic5_change_bg_palette(int color, int lo_offs, int hi_offs);
void set_background_palette_intensity();
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(irqhandler);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_device<address_map_bank_device> m_vrambank;
required_shared_ptr<UINT8> m_fg_videoram;
required_shared_ptr<UINT8> m_bg_videoram;
required_shared_ptr<UINT8> m_bg_control;
required_shared_ptr<UINT8> m_ps5_palette_ram_bg;
required_shared_ptr<UINT8> m_ps5_palette_ram_sp;
required_shared_ptr<UINT8> m_ps5_palette_ram_tx;
DECLARE_READ8_MEMBER(bankselect_r);
DECLARE_READ8_MEMBER(vram_page_select_r);
DECLARE_WRITE8_MEMBER(vram_page_select_w);
DECLARE_WRITE8_MEMBER(fg_videoram_w);
DECLARE_WRITE8_MEMBER(bg_videoram_w);
DECLARE_WRITE8_MEMBER(sprite_col_w);
DECLARE_WRITE8_MEMBER(bg_col_w);
DECLARE_WRITE8_MEMBER(tx_col_w);
/* psychic5 specific */
DECLARE_WRITE8_MEMBER(psychic5_coin_counter_w);
DECLARE_WRITE8_MEMBER(psychic5_bankselect_w);
DECLARE_WRITE8_MEMBER(psychic5_title_screen_w);
/* bombsa specific */
DECLARE_WRITE8_MEMBER(bombsa_bankselect_w);
DECLARE_WRITE8_MEMBER(bombsa_flipscreen_w);
DECLARE_WRITE8_MEMBER(bombsa_unknown_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_reset();
DECLARE_MACHINE_START(psychic5);
DECLARE_MACHINE_START(bombsa);
virtual void video_start();
DECLARE_VIDEO_START(psychic5);
DECLARE_VIDEO_START(bombsa);
DECLARE_VIDEO_RESET(psychic5);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
UINT32 screen_update_psychic5(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_bombsa(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void change_palette(int offset, UINT8* palram, int palbase);
void change_bg_palette(int color, int lo_offs, int hi_offs);
void set_background_palette_intensity();
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
};

View File

@ -30,6 +30,7 @@ void jal_blend_init(running_machine &machine, int enable)
{
jal_blend_table = auto_alloc_array_clear(machine, UINT8, 0xc00);
machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(jal_blend_reset), &machine));
machine.save().save_pointer(NAME(jal_blend_table), 0xc00);
}
else
{

View File

@ -19,7 +19,7 @@
Palette color
***************************************************************************/
void psychic5_state::psychic5_change_palette(int offset, UINT8* palram, int palbase)
void psychic5_state::change_palette(int offset, UINT8* palram, int palbase)
{
UINT8 lo = palram[(offset) & ~1];
UINT8 hi = palram[(offset) | 1];
@ -30,7 +30,7 @@ void psychic5_state::psychic5_change_palette(int offset, UINT8* palram, int palb
m_palette->set_pen_color(palbase + color, pal4bit(lo >> 4), pal4bit(lo), pal4bit(hi >> 4));
}
void psychic5_state::psychic5_change_bg_palette(int color, int lo_offs, int hi_offs)
void psychic5_state::change_bg_palette(int color, int lo_offs, int hi_offs)
{
UINT8 r,g,b,lo,hi,ir,ig,ib,ix;
rgb_t irgb;
@ -77,7 +77,7 @@ void psychic5_state::set_background_palette_intensity()
/* for all of the background palette */
for (i = 0; i < 0x100; i++)
psychic5_change_bg_palette(i+0x100,i*2,i*2+1);
change_bg_palette(i+0x100,i*2,i*2+1);
}
@ -85,12 +85,12 @@ void psychic5_state::set_background_palette_intensity()
Memory handler
***************************************************************************/
READ8_MEMBER(psychic5_state::psychic5_vram_page_select_r)
READ8_MEMBER(psychic5_state::vram_page_select_r)
{
return m_ps5_vram_page;
}
WRITE8_MEMBER(psychic5_state::psychic5_vram_page_select_w)
WRITE8_MEMBER(psychic5_state::vram_page_select_w)
{
m_ps5_vram_page = data & 1;
m_vrambank->set_bank(data);
@ -106,19 +106,19 @@ WRITE8_MEMBER(psychic5_state::psychic5_title_screen_w)
WRITE8_MEMBER(psychic5_state::sprite_col_w)
{
m_ps5_palette_ram_sp[offset] = data;
psychic5_change_palette(offset,m_ps5_palette_ram_sp, 0x000);
change_palette(offset,m_ps5_palette_ram_sp, 0x000);
}
WRITE8_MEMBER(psychic5_state::bg_col_w)
{
m_ps5_palette_ram_bg[offset] = data;
psychic5_change_palette(offset,m_ps5_palette_ram_bg, 0x100);
change_palette(offset,m_ps5_palette_ram_bg, 0x100);
}
WRITE8_MEMBER(psychic5_state::tx_col_w)
{
m_ps5_palette_ram_tx[offset] = data;
psychic5_change_palette(offset,m_ps5_palette_ram_tx, 0x200);
change_palette(offset,m_ps5_palette_ram_tx, 0x200);
}
@ -173,21 +173,40 @@ TILE_GET_INFO_MEMBER(psychic5_state::get_fg_tile_info)
Initialize and destroy video hardware emulation
***************************************************************************/
void psychic5_state::video_start()
{
save_item(NAME(m_ps5_vram_page));
save_item(NAME(m_bg_clip_mode));
save_item(NAME(m_palette_intensity));
save_item(NAME(m_sx1));
save_item(NAME(m_sy1));
save_item(NAME(m_sy2));
}
VIDEO_START_MEMBER(psychic5_state,psychic5)
{
video_start();
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, 16, 16, 64, 32);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32);
m_fg_tilemap->set_transparent_pen(15);
jal_blend_init(machine(), 1);
save_item(NAME(m_title_screen));
}
VIDEO_START_MEMBER(psychic5_state,bombsa)
{
video_start();
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, 16, 16, 128, 32);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32);
m_fg_tilemap->set_transparent_pen(15);
jal_blend_init(machine(), 0);
save_item(NAME(m_bombsa_unknown));
}
VIDEO_RESET_MEMBER(psychic5_state,psychic5)
@ -208,19 +227,16 @@ VIDEO_RESET_MEMBER(psychic5_state,psychic5)
void psychic5_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
UINT8 *spriteram = m_spriteram;
int offs;
/* Draw the sprites */
for (offs = 0; offs < m_spriteram.bytes(); offs += 16)
for (int offs = 0; offs < m_spriteram.bytes(); offs += 16)
{
int attr = spriteram[offs + 13];
int code = spriteram[offs + 14] | ((attr & 0xc0) << 2);
int color = spriteram[offs + 15] & 0x0f;
int attr = m_spriteram[offs + 13];
int code = m_spriteram[offs + 14] | ((attr & 0xc0) << 2);
int color = m_spriteram[offs + 15] & 0x0f;
int flipx = attr & 0x10;
int flipy = attr & 0x20;
int sx = spriteram[offs + 12];
int sy = spriteram[offs + 11];
int sx = m_spriteram[offs + 12];
int sy = m_spriteram[offs + 11];
int size = (attr & 0x08) ? 32:16;
if (attr & 0x01) sx -= 256;
@ -261,8 +277,6 @@ void psychic5_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec
void psychic5_state::draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
UINT8 *spriteram = m_spriteram;
rectangle clip = cliprect;
set_background_palette_intensity();
@ -278,9 +292,9 @@ void psychic5_state::draw_background(screen_device &screen, bitmap_rgb32 &bitmap
int sx1_old = m_sx1;
int sy2_old = m_sy2;
m_sy1 = spriteram[11]; /* sprite 0 */
m_sx1 = spriteram[12];
m_sy2 = spriteram[11+128]; /* sprite 8 */
m_sy1 = m_spriteram[11]; /* sprite 0 */
m_sx1 = m_spriteram[12];
m_sy2 = m_spriteram[11+128]; /* sprite 8 */
switch (m_bg_clip_mode)
{