Started unifying sprite implementations for setax001/x002 chips [David Haywood]

This commit is contained in:
Angelo Salese 2011-05-03 15:20:11 +00:00
parent 9ff27abf55
commit fe2561055f
15 changed files with 1160 additions and 849 deletions

2
.gitattributes vendored
View File

@ -4305,6 +4305,8 @@ src/mame/video/seibuspi.c svneol=native#text/plain
src/mame/video/seicross.c svneol=native#text/plain
src/mame/video/senjyo.c svneol=native#text/plain
src/mame/video/seta.c svneol=native#text/plain
src/mame/video/seta001.c svneol=native#text/plain
src/mame/video/seta001.h svneol=native#text/plain
src/mame/video/seta2.c svneol=native#text/plain
src/mame/video/sf.c svneol=native#text/plain
src/mame/video/shadfrce.c svneol=native#text/plain

View File

@ -36,7 +36,7 @@ cha3 $10d8
#include "cpu/z80/z80.h"
#include "includes/tnzs.h"
#include "sound/ay8910.h"
#include "video/seta001.h"
class cchance_state : public tnzs_state
{
@ -80,9 +80,8 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 )
AM_RANGE(0xc000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xe1ff) AM_RAM AM_BASE_MEMBER(cchance_state, m_vdcram)
AM_RANGE(0xe200, 0xe2ff) AM_RAM AM_BASE_MEMBER(cchance_state, m_scrollram) /* scrolling info */
AM_RANGE(0xe300, 0xe303) AM_RAM AM_MIRROR(0xfc) AM_BASE_MEMBER(cchance_state, m_objctrl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xe000, 0xe2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xe300, 0xe303) AM_RAM AM_MIRROR(0xfc) AM_MIRROR(0xfc) AM_DEVWRITE("spritegen", spritectrl_w8) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE_MEMBER(cchance_state, m_bg_flag) /* enable / disable background transparency */
AM_RANGE(0xf000, 0xf000) AM_READNOP AM_WRITENOP //???
@ -225,6 +224,8 @@ static MACHINE_CONFIG_START( cchance, cchance_state )
MCFG_GFXDECODE(cchance)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.5)

View File

@ -155,7 +155,7 @@ Notes:
#include "sound/x1_010.h"
#include "machine/nvram.h"
#include "includes/tnzs.h"
#include "video/seta001.h"
class champbwl_state : public tnzs_state
{
@ -195,24 +195,14 @@ static WRITE8_HANDLER( champbwl_misc_w )
memory_set_bank(space->machine(), "bank1", (data & 0x30) >> 4);
}
static WRITE8_HANDLER( champbwl_objctrl_w )
{
champbwl_state *state = space->machine().driver_data<champbwl_state>();
if(offset != 0)
data ^= 0xff;
state->m_objctrl[offset] = data;
}
static ADDRESS_MAP_START( champbwl_map, AS_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_REGION("maincpu", 0x10000)
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0xa000, 0xbfff) AM_RAM AM_BASE_MEMBER(champbwl_state, m_objram)
AM_RANGE(0xc000, 0xdfff) AM_DEVREADWRITE("x1snd", seta_sound_r, seta_sound_w)
AM_RANGE(0xe000, 0xe1ff) AM_RAM AM_BASE_MEMBER(champbwl_state, m_vdcram)
AM_RANGE(0xe200, 0xe2ff) AM_RAM AM_BASE_MEMBER(champbwl_state, m_scrollram) /* scrolling info */
AM_RANGE(0xe300, 0xe303) AM_MIRROR(0xfc) AM_WRITE(champbwl_objctrl_w) AM_BASE_MEMBER(champbwl_state, m_objctrl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xe000, 0xe2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xe300, 0xe303) AM_MIRROR(0xfc) AM_DEVWRITE("spritegen", spritectrl_w8_champbwl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE_MEMBER(champbwl_state, m_bg_flag) /* enable / disable background transparency */
AM_RANGE(0xf000, 0xf000) AM_READ(trackball_r)
@ -379,6 +369,8 @@ static MACHINE_CONFIG_START( champbwl, champbwl_state )
MCFG_MACHINE_START(champbwl)
MCFG_MACHINE_RESET(champbwl)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.5)

View File

@ -1315,7 +1315,7 @@ Note: on screen copyright is (c)1998 Coinmaster.
#include "sound/okim6295.h"
#include "sound/x1_010.h"
#include "sound/2151intf.h"
#include "video/seta001.h"
#if __uPD71054_TIMER
@ -1548,18 +1548,7 @@ static READ8_DEVICE_HANDLER( dsw2_r )
static SCREEN_EOF( seta_buffer_sprites )
{
seta_state *state = machine.driver_data<seta_state>();
UINT16 *spriteram16 = state->m_spriteram;
int ctrl2 = spriteram16[ 0x602/2 ];
if (~ctrl2 & 0x20)
{
UINT16 *spriteram2 = state->m_spriteram2;
if (ctrl2 & 0x40)
memcpy(&spriteram2[0x0000/2],&spriteram2[0x2000/2],0x2000/2);
else
memcpy(&spriteram2[0x2000/2],&spriteram2[0x0000/2],0x2000/2);
}
machine.device<seta001_device>("spritegen")->setac_eof( state->m_spriteram2);
}
@ -1596,7 +1585,9 @@ static ADDRESS_MAP_START( tndrcade_map, AS_PROGRAM, 16 )
AM_RANGE(0x300000, 0x300001) AM_WRITENOP // ? 0 / 1
AM_RANGE(0x380000, 0x3803ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
/**/AM_RANGE(0x400000, 0x400001) AM_WRITENOP // ? $4000
/**/AM_RANGE(0x600000, 0x600607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0x600000, 0x6005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0x600600, 0x600607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0x800000, 0x800007) AM_WRITE(sub_ctrl_w) // Sub CPU Control?
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(sharedram_68000_r,sharedram_68000_w) // Shared RAM
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
@ -1624,7 +1615,8 @@ static ADDRESS_MAP_START( downtown_map, AS_PROGRAM, 16 )
AM_RANGE(0xa00000, 0xa00007) AM_WRITE(sub_ctrl_w) // Sub CPU Control?
AM_RANGE(0xb00000, 0xb00fff) AM_READWRITE(sharedram_68000_r,sharedram_68000_w) // Shared RAM
AM_RANGE(0xc00000, 0xc00001) AM_WRITENOP // ? $4000
AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xf00000, 0xffffff) AM_RAM // RAM
ADDRESS_MAP_END
@ -1683,7 +1675,8 @@ static ADDRESS_MAP_START( calibr50_map, AS_PROGRAM, 16 )
AM_RANGE(0x904000, 0x904fff) AM_RAM //
AM_RANGE(0xa00000, 0xa00019) AM_READ(calibr50_ip_r) // Input Ports
/**/AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xb00000, 0xb00001) AM_READWRITE(soundlatch2_word_r,calibr50_soundlatch_w) // From Sub CPU
/**/AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? $4000
@ -1754,7 +1747,8 @@ static WRITE16_HANDLER( usclssic_lockout_w )
static ADDRESS_MAP_START( usclssic_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM
AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM
AM_RANGE(0x800000, 0x800607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0x800000, 0x8005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0x800600, 0x800607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0x900000, 0x900001) AM_RAM // ? $4000
AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM Ctrl
/**/AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
@ -1787,7 +1781,8 @@ static ADDRESS_MAP_START( atehate_map, AS_PROGRAM, 16 )
AM_RANGE(0x500000, 0x500001) AM_WRITENOP // ? (end of lev 1: bit 4 goes 1,0,1)
AM_RANGE(0x600000, 0x600003) AM_READ(seta_dsw_r) // DSW
AM_RANGE(0x700000, 0x7003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xb00000, 0xb00001) AM_READ_PORT("P1") // P1
AM_RANGE(0xb00002, 0xb00003) AM_READ_PORT("P2") // P2
AM_RANGE(0xb00004, 0xb00005) AM_READ_PORT("COINS") // Coins
@ -1813,7 +1808,8 @@ static ADDRESS_MAP_START( blandia_map, AS_PROGRAM, 16 )
AM_RANGE(0x700000, 0x7003ff) AM_RAM // (rezon,jjsquawk)
AM_RANGE(0x700400, 0x700fff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0x703c00, 0x7047ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram2, m_paletteram2_size) // 2nd Palette for the palette offset effect
/**/AM_RANGE(0x800000, 0x800607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0x800000, 0x8005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0x800600, 0x800607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0x880000, 0x880001) AM_RAM // ? 0xc000
AM_RANGE(0x900000, 0x903fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
@ -1853,7 +1849,8 @@ static ADDRESS_MAP_START( blandiap_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x88ffff) AM_RAM // (jjsquawk)
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc03fff) AM_DEVREADWRITE("x1snd", seta_sound_word_r,seta_sound_word_w) // Sound
@ -1935,7 +1932,8 @@ static ADDRESS_MAP_START( wrofaero_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x88ffff) AM_RAM // (jjsquawk)
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc03fff) AM_DEVREADWRITE("x1snd", seta_sound_word_r,seta_sound_word_w) // Sound
@ -1977,7 +1975,8 @@ static ADDRESS_MAP_START( zingzipbl_map, AS_PROGRAM, 16 )
AM_RANGE(0x902010, 0x902013) AM_READ( zingzipbl_unknown_r )
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc03fff) AM_RAM // soundram on original
@ -2009,7 +2008,8 @@ static ADDRESS_MAP_START( jjsquawb_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x88ffff) AM_RAM // (jjsquawk)
AM_RANGE(0x908000, 0x908005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
AM_RANGE(0x909000, 0x909005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
AM_RANGE(0xa0a000, 0xa0a607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // RZ: Sprites Y
AM_RANGE(0xa0a000, 0xa0a5ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // RZ: Sprites Y
AM_RANGE(0xa0a600, 0xa0a607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
// AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb0c000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // RZ: Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc03fff) AM_DEVREADWRITE("x1snd", seta_sound_word_r,seta_sound_word_w) // Sound
@ -2043,7 +2043,8 @@ static ADDRESS_MAP_START( orbs_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0xd00000, 0xd00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xe00000, 0xe00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xe00000, 0xe005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xe00600, 0xe00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
ADDRESS_MAP_END
/***************************************************************************
@ -2128,7 +2129,8 @@ static ADDRESS_MAP_START( keroppi_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0xd00000, 0xd00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xe00000, 0xe00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xe00000, 0xe005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xe00600, 0xe00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
ADDRESS_MAP_END
static MACHINE_START( keroppi )
@ -2159,7 +2161,8 @@ static ADDRESS_MAP_START( blockcar_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0xd00000, 0xd00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xe00000, 0xe00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xe00000, 0xe005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xe00600, 0xe00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
ADDRESS_MAP_END
@ -2185,7 +2188,9 @@ static ADDRESS_MAP_START( daioh_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x88ffff) AM_RAM //
AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xb04000, 0xb13fff) AM_RAM
@ -2216,7 +2221,8 @@ static ADDRESS_MAP_START( drgnunit_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00004, 0xb00005) AM_READ_PORT("COINS") // Coins
AM_RANGE(0xb00006, 0xb00007) AM_READNOP // unused (qzkklogy)
/**/AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? $4000
/**/AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
ADDRESS_MAP_END
@ -2259,10 +2265,11 @@ static READ16_HANDLER( setaroul_d4_10_r )
return 0x00;// space->machine().rand();
}
#if 0
// ?? looks like sprite ram access is 8-bit not 16?
static WRITE16_HANDLER( setaroul_spr_w )
{
seta_state *state = space->machine().driver_data<seta_state>();
UINT16 *spriteram16 = state->m_spriteram;
int realoffs = offset;
@ -2276,7 +2283,9 @@ static WRITE16_HANDLER( setaroul_spr_w )
}
COMBINE_DATA(&spriteram16[realoffs]);
}
#endif
static ADDRESS_MAP_START( setaroul_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM // ROM
@ -2302,7 +2311,8 @@ static ADDRESS_MAP_START( setaroul_map, AS_PROGRAM, 16 )
AM_RANGE(0xe00000, 0xe03fff) AM_RAM_WRITE(seta_vram_0_w) AM_BASE_MEMBER(seta_state, m_vram_0 ) // VRAM - draws wheel if you reset enough times..
AM_RANGE(0xe40000, 0xe40005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM Ctrl
AM_RANGE(0xf00000, 0xf03fff) AM_RAM
AM_RANGE(0xf40000, 0xf40c11) AM_WRITE(setaroul_spr_w) AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xf40000, 0xf40bff) AM_RAM // AM_WRITE(setaroul_spr_w) AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xf40c00, 0xf40c11) AM_RAM // AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16) // probably wrong hookup
ADDRESS_MAP_END
/***************************************************************************
@ -2330,7 +2340,8 @@ static ADDRESS_MAP_START( extdwnhl_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x88ffff) AM_RAM //
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xb04000, 0xb13fff) AM_RAM //
@ -2361,7 +2372,8 @@ static ADDRESS_MAP_START( kamenrid_map, AS_PROGRAM, 16 )
AM_RANGE(0x884000, 0x887fff) AM_RAM // tested
AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? $4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xb04000, 0xb07fff) AM_RAM // tested
@ -2390,7 +2402,8 @@ static ADDRESS_MAP_START( madshark_map, AS_PROGRAM, 16 )
AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? $4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
#if __uPD71054_TIMER
@ -2447,7 +2460,8 @@ static ADDRESS_MAP_START( krzybowl_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0xd00000, 0xd00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xe00000, 0xe00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xe00000, 0xe005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xe00600, 0xe00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
ADDRESS_MAP_END
@ -2480,7 +2494,8 @@ static ADDRESS_MAP_START( msgundam_map, AS_PROGRAM, 16 )
AM_RANGE(0x500000, 0x500005) AM_RAM_WRITE(msgundam_vregs_w) AM_BASE_MEMBER(seta_state, m_vregs) // Coin Lockout + Video Registers
AM_RANGE(0x600000, 0x600003) AM_READ(seta_dsw_r) // DSW
AM_RANGE(0x700400, 0x700fff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0x800000, 0x800607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0x800000, 0x8005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0x800600, 0x800607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0x880000, 0x880001) AM_RAM // ? 0x4000
AM_RANGE(0x900000, 0x903fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xa00000, 0xa03fff) AM_RAM_WRITE(seta_vram_0_w) AM_BASE_MEMBER(seta_state, m_vram_0) // VRAM 0&1
@ -2516,7 +2531,8 @@ static ADDRESS_MAP_START( oisipuzl_map, AS_PROGRAM, 16 )
AM_RANGE(0x880000, 0x883fff) AM_RAM_WRITE(seta_vram_2_w) AM_BASE_MEMBER(seta_state, m_vram_2) // VRAM 2&3
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00400, 0xc00fff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
@ -2544,7 +2560,8 @@ static ADDRESS_MAP_START( triplfun_map, AS_PROGRAM, 16 )
AM_RANGE(0x880000, 0x883fff) AM_RAM_WRITE(seta_vram_2_w) AM_BASE_MEMBER(seta_state, m_vram_2) // VRAM 2&3
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
/**/AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00400, 0xc00fff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
@ -2599,7 +2616,8 @@ static ADDRESS_MAP_START( kiwame_map, AS_PROGRAM, 16 )
AM_RANGE(0xfffc00, 0xffffff) AM_READWRITE(kiwame_nvram_r, kiwame_nvram_w) AM_BASE_MEMBER(seta_state, m_kiwame_nvram) // NVRAM + Regs ?
AM_RANGE(0x800000, 0x803fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
/**/AM_RANGE(0x900000, 0x900001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xb00000, 0xb003ff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_DEVREADWRITE("x1snd", seta_sound_word_r,seta_sound_word_w) // Sound
AM_RANGE(0xd00000, 0xd00009) AM_READ(kiwame_input_r) // mahjong panel
@ -2640,7 +2658,8 @@ static ADDRESS_MAP_START( thunderl_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00008, 0xb00009) AM_READ_PORT("P3") // P3 (wits)
AM_RANGE(0xb0000a, 0xb0000b) AM_READ_PORT("P4") // P4 (wits)
/**/AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xe04000, 0xe07fff) AM_RAM // (wits)
ADDRESS_MAP_END
@ -2663,7 +2682,8 @@ static ADDRESS_MAP_START( thunderlbl_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00008, 0xb00009) AM_READ_PORT("P3") // P3 (wits)
AM_RANGE(0xb0000a, 0xb0000b) AM_READ_PORT("P4") // P4 (wits)
/**/AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xe04000, 0xe07fff) AM_RAM // (wits)
ADDRESS_MAP_END
@ -2704,7 +2724,8 @@ static ADDRESS_MAP_START( wiggie_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00008, 0xb00009) AM_READ_PORT("P3") // P3 (wits)
AM_RANGE(0xb0000a, 0xb0000b) AM_READ_PORT("P4") // P4 (wits)
/**/AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? 0x4000
/**/AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
/**/AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xe04000, 0xe07fff) AM_RAM // (wits)
ADDRESS_MAP_END
@ -2733,7 +2754,8 @@ static ADDRESS_MAP_START( umanclub_map, AS_PROGRAM, 16 )
AM_RANGE(0x400004, 0x400005) AM_WRITENOP // ? (end of lev 2)
AM_RANGE(0x500000, 0x500001) AM_RAM_WRITE(seta_vregs_w) AM_BASE_MEMBER(seta_state, m_vregs) // Coin Lockout + Video Registers
AM_RANGE(0x600000, 0x600003) AM_READ(seta_dsw_r) // DSW
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
/**/AM_RANGE(0xa80000, 0xa80001) AM_RAM // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc03fff) AM_DEVREADWRITE("x1snd", seta_sound_word_r,seta_sound_word_w) // Sound
@ -2766,7 +2788,8 @@ static ADDRESS_MAP_START( utoukond_map, AS_PROGRAM, 16 )
AM_RANGE(0x880000, 0x883fff) AM_RAM_WRITE(seta_vram_2_w) AM_BASE_MEMBER(seta_state, m_vram_2) // VRAM 2&3
AM_RANGE(0x900000, 0x900005) AM_WRITEONLY AM_BASE_MEMBER(seta_state, m_vctrl_0)// VRAM 0&1 Ctrl
AM_RANGE(0x980000, 0x980005) AM_WRITEONLY AM_BASE_MEMBER(seta_state, m_vctrl_2)// VRAM 2&3 Ctrl
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xc00000, 0xc00001) AM_WRITE(utoukond_soundlatch_w) // To Sound CPU (cause an IRQ)
AM_RANGE(0xe00000, 0xe00001) AM_WRITENOP // ? ack
@ -2809,7 +2832,8 @@ static ADDRESS_MAP_START( pairlove_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb00fff) AM_RAM AM_BASE_SIZE_MEMBER(seta_state, m_paletteram, m_paletteram_size) // Palette
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xd00000, 0xd00001) AM_RAM // ? 0x4000
AM_RANGE(0xe00000, 0xe00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xe00000, 0xe005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xe00600, 0xe00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM
ADDRESS_MAP_END
@ -2835,7 +2859,8 @@ static ADDRESS_MAP_START( crazyfgt_map, AS_PROGRAM, 16 )
AM_RANGE(0x880000, 0x883fff) AM_WRITE(seta_vram_0_w) AM_BASE_MEMBER(seta_state, m_vram_0) // VRAM 0
AM_RANGE(0x900000, 0x900005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_2) // VRAM 2&3 Ctrl
AM_RANGE(0x980000, 0x980005) AM_RAM AM_BASE_MEMBER(seta_state, m_vctrl_0) // VRAM 0&1 Ctrl
AM_RANGE(0xa00000, 0xa00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xa00000, 0xa005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xa00600, 0xa00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xa80000, 0xa80001) AM_WRITENOP // ? 0x4000
AM_RANGE(0xb00000, 0xb03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
ADDRESS_MAP_END
@ -2904,7 +2929,9 @@ static ADDRESS_MAP_START( inttoote_map, AS_PROGRAM, 16 )
AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? 0x4000
AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xffc000, 0xffffff) AM_RAM // RAM
@ -2969,7 +2996,9 @@ static ADDRESS_MAP_START( jockeyc_map, AS_PROGRAM, 16 )
AM_RANGE(0xc00000, 0xc00001) AM_RAM // ? 0x4000
AM_RANGE(0xd00000, 0xd00607) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(seta_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xffc000, 0xffffff) AM_RAM // RAM
@ -6974,6 +7003,8 @@ static MACHINE_CONFIG_START( tndrcade, seta_state )
MCFG_CPU_PROGRAM_MAP(tndrcade_sub_map)
MCFG_CPU_VBLANK_INT_HACK(tndrcade_sub_interrupt,TNDRCADE_SUB_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7023,6 +7054,8 @@ static MACHINE_CONFIG_START( twineagl, seta_state )
MCFG_CPU_PROGRAM_MAP(twineagl_sub_map)
MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7064,6 +7097,8 @@ static MACHINE_CONFIG_START( downtown, seta_state )
MCFG_CPU_PROGRAM_MAP(downtown_sub_map)
MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */
@ -7123,6 +7158,8 @@ static MACHINE_CONFIG_START( usclssic, seta_state )
MCFG_MACHINE_RESET(calibr50)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7171,6 +7208,8 @@ static MACHINE_CONFIG_START( calibr50, seta_state )
MCFG_MACHINE_RESET(calibr50)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */
@ -7210,6 +7249,8 @@ static MACHINE_CONFIG_START( metafox, seta_state )
MCFG_CPU_PROGRAM_MAP(metafox_sub_map)
MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7245,6 +7286,8 @@ static MACHINE_CONFIG_START( atehate, seta_state )
MCFG_CPU_PROGRAM_MAP(atehate_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7286,6 +7329,8 @@ static MACHINE_CONFIG_START( blandia, seta_state )
MCFG_CPU_PROGRAM_MAP(blandia_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7318,6 +7363,8 @@ static MACHINE_CONFIG_START( blandiap, seta_state )
MCFG_CPU_PROGRAM_MAP(blandiap_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7355,6 +7402,8 @@ static MACHINE_CONFIG_START( blockcar, seta_state )
MCFG_CPU_PROGRAM_MAP(blockcar_map)
MCFG_CPU_VBLANK_INT("screen", irq3_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7390,6 +7439,8 @@ static MACHINE_CONFIG_START( daioh, seta_state )
MCFG_CPU_PROGRAM_MAP(daioh_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7430,6 +7481,8 @@ static MACHINE_CONFIG_START( drgnunit, seta_state )
MCFG_CPU_PROGRAM_MAP(drgnunit_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7464,6 +7517,8 @@ static MACHINE_CONFIG_START( qzkklgy2, seta_state )
MCFG_CPU_PROGRAM_MAP(drgnunit_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7510,6 +7565,8 @@ static MACHINE_CONFIG_START( setaroul, seta_state )
MCFG_CPU_PROGRAM_MAP(setaroul_map)
MCFG_CPU_VBLANK_INT_HACK(setaroul_interrupt,SETAROUL_INTERRUPTS_NUM) // and 6?
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7547,6 +7604,8 @@ static MACHINE_CONFIG_START( eightfrc, seta_state )
MCFG_CPU_PROGRAM_MAP(wrofaero_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7587,6 +7646,8 @@ static MACHINE_CONFIG_START( extdwnhl, seta_state )
MCFG_CPU_PROGRAM_MAP(extdwnhl_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7648,6 +7709,8 @@ static MACHINE_CONFIG_START( gundhara, seta_state )
MCFG_MACHINE_START( wrofaero )
#endif // __uPD71054_TIMER
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7688,6 +7751,8 @@ static MACHINE_CONFIG_START( jjsquawk, seta_state )
MCFG_CPU_PROGRAM_MAP(wrofaero_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7719,6 +7784,8 @@ static MACHINE_CONFIG_START( jjsquawb, seta_state )
MCFG_CPU_PROGRAM_MAP(jjsquawb_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7759,6 +7826,8 @@ static MACHINE_CONFIG_START( kamenrid, seta_state )
MCFG_MACHINE_START( wrofaero )
#endif // __uPD71054_TIMER
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7795,6 +7864,8 @@ static MACHINE_CONFIG_START( orbs, seta_state )
MCFG_CPU_PROGRAM_MAP(orbs_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7832,6 +7903,8 @@ static MACHINE_CONFIG_START( keroppi, seta_state )
MCFG_MACHINE_START(keroppi)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7867,6 +7940,8 @@ static MACHINE_CONFIG_START( krzybowl, seta_state )
MCFG_CPU_PROGRAM_MAP(krzybowl_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7907,6 +7982,8 @@ static MACHINE_CONFIG_START( madshark, seta_state )
MCFG_MACHINE_START( wrofaero )
#endif // __uPD71054_TIMER
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -7953,6 +8030,8 @@ static MACHINE_CONFIG_START( msgundam, seta_state )
MCFG_MACHINE_START( wrofaero )
#endif // __uPD71054_TIMER
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(56.66) /* between 56 and 57 to match a real PCB's game speed */
@ -7990,6 +8069,8 @@ static MACHINE_CONFIG_START( oisipuzl, seta_state )
MCFG_CPU_PROGRAM_MAP(oisipuzl_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8026,6 +8107,8 @@ static MACHINE_CONFIG_START( triplfun, seta_state )
MCFG_CPU_PROGRAM_MAP(triplfun_map)
MCFG_CPU_VBLANK_INT("screen", irq3_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8060,6 +8143,8 @@ static MACHINE_CONFIG_START( kiwame, seta_state )
MCFG_CPU_VBLANK_INT("screen", irq1_line_hold)/* lev 1-7 are the same. WARNING:
the interrupt table is written to. */
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8098,6 +8183,8 @@ static MACHINE_CONFIG_START( rezon, seta_state )
MCFG_CPU_PROGRAM_MAP(wrofaero_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8136,6 +8223,8 @@ static MACHINE_CONFIG_START( thunderl, seta_state )
MCFG_CPU_PROGRAM_MAP(thunderl_map)
MCFG_CPU_VBLANK_INT("screen", irq2_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8206,6 +8295,8 @@ static MACHINE_CONFIG_START( wiggie, seta_state )
MCFG_CPU_ADD("audiocpu", Z80, 16000000/4) /* 4 MHz */
MCFG_CPU_PROGRAM_MAP(wiggie_sound_map)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8239,6 +8330,8 @@ static MACHINE_CONFIG_START( wits, seta_state )
MCFG_CPU_PROGRAM_MAP(thunderl_map)
MCFG_CPU_VBLANK_INT("screen", irq2_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8274,6 +8367,8 @@ static MACHINE_CONFIG_START( umanclub, seta_state )
MCFG_CPU_PROGRAM_MAP(umanclub_map)
MCFG_CPU_VBLANK_INT("screen", irq3_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8313,6 +8408,8 @@ static MACHINE_CONFIG_START( utoukond, seta_state )
MCFG_CPU_PROGRAM_MAP(utoukond_sound_map)
MCFG_CPU_IO_MAP(utoukond_sound_io_map)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8361,6 +8458,8 @@ static MACHINE_CONFIG_START( wrofaero, seta_state )
MCFG_MACHINE_START( wrofaero )
#endif // __uPD71054_TIMER
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8403,6 +8502,8 @@ static MACHINE_CONFIG_START( zingzip, seta_state )
MCFG_CPU_PROGRAM_MAP(wrofaero_map)
MCFG_CPU_VBLANK_INT("screen", irq3_line_hold)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8453,6 +8554,8 @@ static MACHINE_CONFIG_START( pairlove, seta_state )
MCFG_CPU_PROGRAM_MAP(pairlove_map)
MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8497,6 +8600,8 @@ static MACHINE_CONFIG_START( crazyfgt, seta_state )
MCFG_CPU_PROGRAM_MAP(crazyfgt_map)
MCFG_CPU_VBLANK_INT_HACK(crazyfgt_interrupt,1+5)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -8590,6 +8695,8 @@ static MACHINE_CONFIG_START( inttoote, seta_state )
MCFG_PIA6821_ADD("pia0", inttoote_pia0_intf)
MCFG_PIA6821_ADD("pia1", inttoote_pia1_intf)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -62,6 +62,7 @@ Note:
#include "sound/msm5205.h"
#include "includes/srmp2.h"
#include "machine/nvram.h"
#include "video/seta001.h"
/***************************************************************************
@ -394,7 +395,8 @@ static ADDRESS_MAP_START( srmp2_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x0c0000, 0x0c3fff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x140000, 0x143fff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram2.u16) /* Sprites Code + X + Attr */
AM_RANGE(0x180000, 0x180609) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram1.u16) /* Sprites Y */
AM_RANGE(0x180000, 0x1805ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) /* Sprites Y */
AM_RANGE(0x180600, 0x180607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0x1c0000, 0x1c0001) AM_WRITENOP /* ??? */
AM_RANGE(0x800000, 0x800001) AM_WRITE(srmp2_flags_w) /* ADPCM bank, Color bank, etc. */
AM_RANGE(0x900000, 0x900001) AM_READ_PORT("SYSTEM") /* Coinage */
@ -441,7 +443,9 @@ static ADDRESS_MAP_START( mjyuugi_map, AS_PROGRAM, 16 )
AM_RANGE(0xb00000, 0xb00001) AM_DEVREAD8("aysnd", ay8910_r, 0x00ff)
AM_RANGE(0xb00000, 0xb00003) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff)
AM_RANGE(0xc00000, 0xc00001) AM_WRITENOP /* ??? */
AM_RANGE(0xd00000, 0xd00609) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram1.u16) /* Sprites Y */
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) /* Sprites Y */
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xd02000, 0xd023ff) AM_RAM /* ??? only writes $00fa */
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram2.u16) /* Sprites Code + X + Attr */
AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_SHARE("nvram")
@ -472,7 +476,8 @@ static ADDRESS_MAP_START( srmp3_map, AS_PROGRAM, 8 )
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1") /* rom bank */
AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_SHARE("nvram") /* work ram */
AM_RANGE(0xa800, 0xa800) AM_WRITENOP /* flag ? */
AM_RANGE(0xb000, 0xb303) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram1.u8) /* Sprites Y */
AM_RANGE(0xb000, 0xb2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xb300, 0xb303) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r8, spritectrl_w8)
AM_RANGE(0xb800, 0xb800) AM_WRITENOP /* flag ? */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram2.u8) /* Sprites Code + X + Attr */
AM_RANGE(0xe000, 0xffff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram3.u8)
@ -495,7 +500,8 @@ static ADDRESS_MAP_START( rmgoldyh_map, AS_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1") /* rom bank */
AM_RANGE(0xa000, 0xafff) AM_RAM AM_SHARE("nvram") /* work ram */
AM_RANGE(0xb000, 0xb303) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram1.u8) /* Sprites Y */
AM_RANGE(0xb000, 0xb2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xb300, 0xb303) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r8, spritectrl_w8)
AM_RANGE(0xb800, 0xb800) AM_WRITENOP /* flag ? */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram2.u8) /* Sprites Code + X + Attr */
AM_RANGE(0xe000, 0xffff) AM_RAM AM_BASE_MEMBER(srmp2_state,m_spriteram3.u8)
@ -1176,6 +1182,8 @@ static MACHINE_CONFIG_START( srmp2, srmp2_state )
MCFG_MACHINE_START(srmp2)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1216,6 +1224,8 @@ static MACHINE_CONFIG_START( srmp3, srmp2_state )
MCFG_MACHINE_START(srmp3)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1265,6 +1275,8 @@ static MACHINE_CONFIG_START( mjyuugi, srmp2_state )
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -319,7 +319,7 @@ Stephh's notes (based on the game M68000 code and some tests) :
#include "sound/2610intf.h"
#include "sound/2151intf.h"
#include "includes/cchip.h"
#include "video/seta001.h"
class taitox_state : public seta_state
{
@ -433,7 +433,8 @@ static ADDRESS_MAP_START( superman_map, AS_PROGRAM, 16 )
AM_RANGE(0x900802, 0x900803) AM_READWRITE(cchip1_ctrl_r, cchip1_ctrl_w)
AM_RANGE(0x900c00, 0x900c01) AM_WRITE(cchip1_bank_w)
AM_RANGE(0xb00000, 0xb00fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xf00000, 0xf03fff) AM_RAM /* Main RAM */
ADDRESS_MAP_END
@ -447,7 +448,8 @@ static ADDRESS_MAP_START( daisenpu_map, AS_PROGRAM, 16 )
AM_RANGE(0x800002, 0x800003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_comm_r, tc0140syt_comm_w, 0x00ff)
AM_RANGE(0x900000, 0x90000f) AM_READWRITE(daisenpu_input_r, daisenpu_input_w)
AM_RANGE(0xb00000, 0xb00fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xf00000, 0xf03fff) AM_RAM /* Main RAM */
ADDRESS_MAP_END
@ -461,7 +463,8 @@ static ADDRESS_MAP_START( gigandes_map, AS_PROGRAM, 16 )
AM_RANGE(0x800002, 0x800003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_comm_r, tc0140syt_comm_w, 0x00ff)
AM_RANGE(0x900000, 0x90000f) AM_READWRITE(daisenpu_input_r, daisenpu_input_w)
AM_RANGE(0xb00000, 0xb00fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xf00000, 0xf03fff) AM_RAM /* Main RAM */
ADDRESS_MAP_END
@ -475,7 +478,8 @@ static ADDRESS_MAP_START( ballbros_map, AS_PROGRAM, 16 )
AM_RANGE(0x800002, 0x800003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_comm_r, tc0140syt_comm_w, 0x00ff)
AM_RANGE(0x900000, 0x90000f) AM_READWRITE(daisenpu_input_r, daisenpu_input_w)
AM_RANGE(0xb00000, 0xb00fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram) // Sprites Y
AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r16, spriteylow_w16) // Sprites Y
AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", spritectrl_r16, spritectrl_w16)
AM_RANGE(0xe00000, 0xe03fff) AM_RAM AM_BASE_MEMBER(taitox_state, m_spriteram2) // Sprites Code + X + Attr
AM_RANGE(0xf00000, 0xf03fff) AM_RAM /* Main RAM */
ADDRESS_MAP_END
@ -927,6 +931,8 @@ static MACHINE_CONFIG_START( superman, taitox_state )
MCFG_MACHINE_START(taitox)
MCFG_MACHINE_RESET(cchip1)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.43)
@ -968,6 +974,8 @@ static MACHINE_CONFIG_START( daisenpu, taitox_state )
MCFG_MACHINE_START(taitox)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1007,6 +1015,8 @@ static MACHINE_CONFIG_START( gigandes, taitox_state )
MCFG_MACHINE_START(taitox)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1048,6 +1058,8 @@ static MACHINE_CONFIG_START( ballbros, taitox_state )
MCFG_MACHINE_START(taitox)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -628,6 +628,7 @@ Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 1999/11/06
#include "sound/samples.h"
#include "includes/tnzs.h"
#include "sound/2151intf.h"
#include "video/seta001.h"
static SAMPLES_START( kageki_init_samples )
{
@ -751,9 +752,8 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 )
AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank1") /* ROM + RAM */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_objram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1")
AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_vdcram)
AM_RANGE(0xf200, 0xf2ff) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_scrollram) /* scrolling info */
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_objctrl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf000, 0xf2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_DEVWRITE("spritegen", spritectrl_w8) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf400, 0xf400) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_bg_flag) /* enable / disable background transparency */
AM_RANGE(0xf600, 0xf600) AM_READNOP AM_WRITE(tnzs_bankswitch_w)
/* arknoid2, extrmatn, plumppop and drtoppel have PROMs instead of RAM */
@ -767,9 +767,8 @@ static ADDRESS_MAP_START( cpu0_type2, AS_PROGRAM, 8 )
AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank1") /* ROM + RAM */
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_objram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1")
AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_vdcram)
AM_RANGE(0xf200, 0xf2ff) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_scrollram) /* scrolling info */
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_objctrl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf000, 0xf2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_DEVWRITE("spritegen", spritectrl_w8) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf400, 0xf400) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_bg_flag) /* enable / disable background transparency */
AM_RANGE(0xf600, 0xf600) AM_WRITE(tnzs_bankswitch_w)
/* kabukiz still writes here but it's not used (it's paletteram in type1 map) */
@ -889,9 +888,8 @@ static ADDRESS_MAP_START( jpopnics_main_map, AS_PROGRAM, 8 )
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_objram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1") /* WORK RAM (shared by the 2 z80's) */
AM_RANGE(0xf000, 0xf1ff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_vdcram) /* VDC RAM */
AM_RANGE(0xf200, 0xf2ff) AM_RAM AM_BASE_MEMBER(tnzs_state, m_scrollram) /* scrolling info */
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_objctrl) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf000, 0xf2ff) AM_RAM AM_DEVREADWRITE("spritegen", spriteylow_r8, spriteylow_w8)
AM_RANGE(0xf300, 0xf303) AM_MIRROR(0xfc) AM_DEVWRITE("spritegen", spritectrl_w8) /* control registers (0x80 mirror used by Arkanoid 2) */
AM_RANGE(0xf400, 0xf400) AM_WRITEONLY AM_BASE_MEMBER(tnzs_state, m_bg_flag) /* enable / disable background transparency */
AM_RANGE(0xf600, 0xf600) AM_READNOP AM_WRITE(tnzs_bankswitch_w)
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(jpopnics_palette_w) AM_BASE_GENERIC(paletteram)
@ -1623,6 +1621,8 @@ static MACHINE_CONFIG_START( arknoid2, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1663,6 +1663,8 @@ static MACHINE_CONFIG_START( drtoppel, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1706,6 +1708,8 @@ static MACHINE_CONFIG_START( tnzs, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(59.15) /* it should be the same as the newer pcb vsync */
@ -1745,6 +1749,8 @@ static MACHINE_CONFIG_START( insectx, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1783,6 +1789,8 @@ static MACHINE_CONFIG_START( kageki, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@ -1832,6 +1840,8 @@ static MACHINE_CONFIG_START( tnzsb, tnzs_state )
MCFG_MACHINE_START(tnzs)
MCFG_MACHINE_RESET(tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(59.15) /* verified on pcb */
@ -1894,6 +1904,8 @@ static MACHINE_CONFIG_START( jpopnics, tnzs_state )
MCFG_MACHINE_START(jpopnics)
MCFG_MACHINE_RESET(jpopnics)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)

View File

@ -37,7 +37,6 @@ public:
UINT16 *m_vctrl_0;
UINT16 *m_vram_2;
UINT16 *m_vctrl_2;
UINT16 *m_spriteram;
UINT16 *m_spriteram2;
UINT16 *m_paletteram;
size_t m_paletteram_size;

View File

@ -26,7 +26,7 @@ public:
{
UINT8 *u8;
UINT16 *u16;
} m_spriteram1, m_spriteram2, m_spriteram3;
} m_spriteram2, m_spriteram3;
iox_t m_iox;
};

View File

@ -23,9 +23,6 @@ public:
/* memory pointers */
UINT8 * m_objram;
UINT8 * m_vdcram;
UINT8 * m_scrollram;
UINT8 * m_objctrl;
UINT8 * m_bg_flag;
// UINT8 * m_paletteram; // currently this uses generic palette handling

View File

@ -138,7 +138,7 @@ Note: if MAME_DEBUG is defined, pressing Z with:
#include "emu.h"
#include "sound/x1_010.h"
#include "includes/seta.h"
#include "video/seta001.h"
/* note that drgnunit, stg and qzkklogy run on the same board, yet they need different alignment */
static const game_offset game_offsets[] =
@ -752,178 +752,6 @@ static void usclssic_set_pens(running_machine &machine)
/***************************************************************************
Sprites Drawing
***************************************************************************/
static void draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
seta_state *state = machine.driver_data<seta_state>();
UINT16 *spriteram16 = state->m_spriteram;
int offs, col;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = spriteram16[ 0x600/2 ];
int ctrl2 = spriteram16[ 0x602/2 ];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x000f;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = state->m_spriteram2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int upper = ( spriteram16[ 0x604/2 ] & 0xFF ) +
( spriteram16[ 0x606/2 ] & 0xFF ) * 256;
int max_y = 0xf0;
int col0; /* Kludge, needed for krzybowl and kiwame */
switch (ctrl & 0x0f)
{
case 0x01: col0 = 0x4; break; // krzybowl
case 0x06: col0 = 0x8; break; // kiwame
default: col0 = 0x0;
}
xoffs = 0;
yoffs = flip ? 1 : -1;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1)
numcol = 16;
/* The first column is the frontmost, see twineagl test mode
BM 071204 - first column frontmost breaks superman.
*/
// for ( col = numcol - 1 ; col >= 0; col -- )
for ( col = 0 ; col < numcol; col ++ )
{
int x = spriteram16[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = spriteram16[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for ( offs = 0 ; offs < 0x40/2; offs += 2/2 )
{
int code = src[((col+col0)&0xf) * 0x40/2 + offs + 0x800/2];
int color = src[((col+col0)&0xf) * 0x40/2 + offs + 0xc00/2];
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int bank = (color & 0x0600) >> 9;
/*
twineagl: 010 02d 0f 10 (ship)
tndrcade: 058 02d 07 18 (start of game - yes, flip on!)
arbalest: 018 02d 0f 10 (logo)
metafox : 018 021 0f f0 (bomb)
zingzip : 010 02c 00 0f (bomb)
wrofaero: 010 021 00 ff (test mode)
thunderl: 010 06c 00 ff (always?)
krzybowl: 011 028 c0 ff (game)
kiwame : 016 021 7f 00 (logo)
oisipuzl: 059 020 00 00 (game - yes, flip on!)
superman: 010 021 07 38 (game)
twineagl: 000 027 00 0f (test mode)
*/
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16;
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - sy;
flipx = !flipx;
flipy = !flipy;
}
color = ( color >> (16-5) ) % total_color_codes;
code = (code & 0x3fff) + (bank * 0x4000);
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx, flipy,
((sx + 0x10) & 0x1ff) - 0x10,((sy + 8) & 0x0ff) - 8,0);
}
/* next column */
}
}
static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
seta_state *state = machine.driver_data<seta_state>();
UINT16 *spriteram16 = state->m_spriteram;
int offs;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = spriteram16[ 0x600/2 ];
int ctrl2 = spriteram16[ 0x602/2 ];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = state->m_spriteram2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = 0xf0;
draw_sprites_map(machine,bitmap,cliprect);
xoffs = state->m_global_offsets->sprite_offs[flip ? 1 : 0];
yoffs = -2;
for ( offs = (0x400-2)/2 ; offs >= 0/2; offs -= 2/2 )
{
int code = src[offs + 0x000/2];
int x = src[offs + 0x400/2];
int y = spriteram16[offs + 0x000/2] & 0xff;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int bank = (x & 0x0600) >> 9;
int color = ( x >> (16-5) ) % total_color_codes;
if (flip)
{
y = (0x100 - machine.primary_screen->height()) + max_y - y;
flipx = !flipx;
flipy = !flipy;
}
code = (code & 0x3fff) + (bank * 0x4000);
y = max_y - y;
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx, flipy,
((x + xoffs + 0x10) & 0x1ff) - 0x10,((y - yoffs + 8) & 0x0ff) - 8,0);
}
}
static void draw_tilemap_palette_effect(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tilemap, int scrollx, int scrolly, int gfxnum, int flipscreen)
{
@ -984,9 +812,10 @@ static void draw_tilemap_palette_effect(running_machine &machine, bitmap_t *bitm
/* For games without tilemaps */
SCREEN_UPDATE( seta_no_layers )
{
seta_state *state = screen->machine().driver_data<seta_state>();
set_pens(screen->machine());
bitmap_fill(bitmap,cliprect,0x1f0);
draw_sprites(screen->machine(),bitmap,cliprect);
screen->machine().device<seta001_device>("spritegen")->setac_draw_sprites(screen->machine(),bitmap,cliprect, state->m_spriteram2, state->m_global_offsets->sprite_offs[1], state->m_global_offsets->sprite_offs[0]);
return 0;
}
@ -999,7 +828,7 @@ static SCREEN_UPDATE( seta_layers )
int enab_0, enab_1, x_0, x_1=0, y_0, y_1=0;
int order = 0;
int flip = (state->m_spriteram[ 0x600/2 ] & 0x40) >> 6;
int flip = 0;//reenable (state->m_spriteram[ 0x600/2 ] & 0x40) >> 6;
const rectangle &visarea = screen->visible_area();
int vis_dimy = visarea.max_y - visarea.min_y + 1;
@ -1109,7 +938,7 @@ if (input_code_pressed(screen->machine(), KEYCODE_Z))
if (order & 2) // layer-sprite priority?
{
if (layers_ctrl & 8) draw_sprites(screen->machine(),bitmap,cliprect);
if (layers_ctrl & 8) screen->machine().device<seta001_device>("spritegen")->setac_draw_sprites(screen->machine(),bitmap,cliprect, state->m_spriteram2, state->m_global_offsets->sprite_offs[1], state->m_global_offsets->sprite_offs[0]);
if(order & 4)
{
@ -1129,7 +958,7 @@ if (input_code_pressed(screen->machine(), KEYCODE_Z))
if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0);
if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0);
if (layers_ctrl & 8) draw_sprites(screen->machine(), bitmap,cliprect);
if (layers_ctrl & 8) screen->machine().device<seta001_device>("spritegen")->setac_draw_sprites(screen->machine(), bitmap,cliprect, state->m_spriteram2, state->m_global_offsets->sprite_offs[1], state->m_global_offsets->sprite_offs[0]);
}
}
else
@ -1139,7 +968,7 @@ if (input_code_pressed(screen->machine(), KEYCODE_Z))
if (order & 2) // layer-sprite priority?
{
if (layers_ctrl & 8) draw_sprites(screen->machine(), bitmap,cliprect);
if (layers_ctrl & 8) screen->machine().device<seta001_device>("spritegen")->setac_draw_sprites(screen->machine(), bitmap,cliprect, state->m_spriteram2, state->m_global_offsets->sprite_offs[1], state->m_global_offsets->sprite_offs[0]);
if((order & 4) && state->m_paletteram2 != NULL)
{
@ -1193,7 +1022,7 @@ if (input_code_pressed(screen->machine(), KEYCODE_Z))
}
}
if (layers_ctrl & 8) draw_sprites(screen->machine(), bitmap,cliprect);
if (layers_ctrl & 8) screen->machine().device<seta001_device>("spritegen")->setac_draw_sprites(screen->machine(), bitmap,cliprect, state->m_spriteram2, state->m_global_offsets->sprite_offs[1], state->m_global_offsets->sprite_offs[0]);
}
}
return 0;

864
src/mame/video/seta001.c Normal file
View File

@ -0,0 +1,864 @@
/*
emulation of Seta sprite chips
X1-001A X1-002A (SDIP64)
these always seem to be used as a pair, some board have been seen without the
'A', so it's probably a chip revision / bugfix.
used by:
seta.c
taito_x.c
tnzs.c
srmp2.c
champbwl.c
cchance.c
note: the data bus is almost certainly 8-bit, dating back to the earliest
hardware the games were used on. the RAM arrangements changes
slightly between games depending on how the RAM is hooked up to the
main cpu.
todo: unify implementation, there are currently 5 different ones when there should only be one!
'y' low bits are NEVER buffered?
*/
#include "emu.h"
#include "seta001.h"
const device_type SETA001_SPRITE = &device_creator<seta001_device>;
seta001_device::seta001_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, SETA001_SPRITE, "seta001_device", tag, owner, clock)
{
}
void seta001_device::device_start()
{
}
void seta001_device::device_reset()
{
}
READ16_DEVICE_HANDLER( spritectrl_r16 )
{
seta001_device *dev = (seta001_device *)device;
return dev->m_spritectrl[offset];
}
WRITE16_DEVICE_HANDLER( spritectrl_w16 )
{
seta001_device *dev = (seta001_device *)device;
if (ACCESSING_BITS_0_7)
{
dev->m_spritectrl[offset] = data;
}
}
READ8_DEVICE_HANDLER( spritectrl_r8 )
{
seta001_device *dev = (seta001_device *)device;
return dev->m_spritectrl[offset];
}
WRITE8_DEVICE_HANDLER( spritectrl_w8 )
{
seta001_device *dev = (seta001_device *)device;
dev->m_spritectrl[offset] = data;
}
WRITE8_DEVICE_HANDLER( spritectrl_w8_champbwl )
{
seta001_device *dev = (seta001_device *)device;
// hack??
if (offset!=0) data ^=0xff;
dev->m_spritectrl[offset] = data;
}
READ16_DEVICE_HANDLER( spriteylow_r16 )
{
seta001_device *dev = (seta001_device *)device;
return dev->m_spriteylow[offset];
}
WRITE16_DEVICE_HANDLER( spriteylow_w16 )
{
seta001_device *dev = (seta001_device *)device;
if (ACCESSING_BITS_0_7)
{
dev->m_spriteylow[offset] = data;
}
}
READ8_DEVICE_HANDLER( spriteylow_r8 )
{
seta001_device *dev = (seta001_device *)device;
return dev->m_spriteylow[offset];
}
WRITE8_DEVICE_HANDLER( spriteylow_w8 )
{
seta001_device *dev = (seta001_device *)device;
dev->m_spriteylow[offset] = data;
}
/***************************************************************************
Sprites Drawing
***************************************************************************/
void seta001_device::setac_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2)
{
int offs, col;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = m_spritectrl[0];
int ctrl2 = m_spritectrl[1];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x000f;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int upper = ( m_spritectrl[2] ) +
( m_spritectrl[3] ) * 256;
int max_y = 0xf0;
int col0; /* Kludge, needed for krzybowl and kiwame */
switch (ctrl & 0x0f)
{
case 0x01: col0 = 0x4; break; // krzybowl
case 0x06: col0 = 0x8; break; // kiwame
default: col0 = 0x0;
}
xoffs = 0;
yoffs = flip ? 1 : -1;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1)
numcol = 16;
/* The first column is the frontmost, see twineagl test mode
BM 071204 - first column frontmost breaks superman.
*/
// for ( col = numcol - 1 ; col >= 0; col -- )
for ( col = 0 ; col < numcol; col ++ )
{
int x = m_spriteylow[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = m_spriteylow[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for ( offs = 0 ; offs < 0x40/2; offs += 2/2 )
{
int code = src[((col+col0)&0xf) * 0x40/2 + offs + 0x800/2];
int color = src[((col+col0)&0xf) * 0x40/2 + offs + 0xc00/2];
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int bank = (color & 0x0600) >> 9;
/*
twineagl: 010 02d 0f 10 (ship)
tndrcade: 058 02d 07 18 (start of game - yes, flip on!)
arbalest: 018 02d 0f 10 (logo)
metafox : 018 021 0f f0 (bomb)
zingzip : 010 02c 00 0f (bomb)
wrofaero: 010 021 00 ff (test mode)
thunderl: 010 06c 00 ff (always?)
krzybowl: 011 028 c0 ff (game)
kiwame : 016 021 7f 00 (logo)
oisipuzl: 059 020 00 00 (game - yes, flip on!)
superman: 010 021 07 38 (game)
twineagl: 000 027 00 0f (test mode)
*/
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16;
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - sy;
flipx = !flipx;
flipy = !flipy;
}
color = ( color >> (16-5) ) % total_color_codes;
code = (code & 0x3fff) + (bank * 0x4000);
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx, flipy,
((sx + 0x10) & 0x1ff) - 0x10,((sy + 8) & 0x0ff) - 8,0);
}
/* next column */
}
}
void seta001_device::setac_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int flipxoffs, int noflipxoffs)
{
int offs;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = m_spritectrl[0];
int ctrl2 = m_spritectrl[1];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = 0xf0;
setac_draw_sprites_map(machine,bitmap,cliprect, spriteram16_2);
xoffs = flip ? flipxoffs:noflipxoffs;
yoffs = -2;
for ( offs = (0x400-2)/2 ; offs >= 0/2; offs -= 2/2 )
{
int code = src[offs + 0x000/2];
int x = src[offs + 0x400/2];
int y = m_spriteylow[offs + 0x000/2] & 0xff;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int bank = (x & 0x0600) >> 9;
int color = ( x >> (16-5) ) % total_color_codes;
if (flip)
{
y = (0x100 - machine.primary_screen->height()) + max_y - y;
flipx = !flipx;
flipy = !flipy;
}
code = (code & 0x3fff) + (bank * 0x4000);
y = max_y - y;
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx, flipy,
((x + xoffs + 0x10) & 0x1ff) - 0x10,((y - yoffs + 8) & 0x0ff) - 8,0);
}
}
void seta001_device::tnzs_draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *m, UINT8* scrollram, UINT8* bg_flag, int screenflip)
{
int x, y, column, tot, transpen;
int scrollx, scrolly;
UINT32 upperbits;
int ctrl2 = m_spritectrl[1];
if ((ctrl2 ^ (~ctrl2 << 1)) & 0x40)
m += 0x800;
if (bg_flag[0] & 0x80)
transpen = -1;
else
transpen = 0;
/* The byte at f200 is the y-scroll value for the first column.
The byte at f204 is the LSB of x-scroll value for the first column.
The other columns follow at 16-byte intervals.
The 9th bit of each x-scroll value is combined into 2 bytes
at f302-f303 */
/* f301 controls how many columns are drawn. */
tot = m_spritectrl[1] & 0x1f;
if (tot == 1)
tot = 16;
upperbits = m_spritectrl[2] + m_spritectrl[3] * 256;
for (column = 0; column < tot; column++)
{
scrollx = scrollram[column * 16 + 4] - ((upperbits & 0x01) * 256);
if (screenflip)
scrolly = scrollram[column * 16] + 1 - 256;
else
scrolly = -scrollram[column * 16] + 1;
for (y = 0; y < 16; y++)
{
for (x = 0; x < 2; x++)
{
int code, color, flipx, flipy, sx, sy;
int i = 32 * (column ^ 8) + 2 * y + x;
code = m[i] + ((m[i + 0x1000] & 0x3f) << 8);
color = (m[i + 0x1200] & 0xf8) >> 3; /* colours at d600-d7ff */
sx = x * 16;
sy = y * 16;
flipx = m[i + 0x1000] & 0x80;
flipy = m[i + 0x1000] & 0x40;
if (screenflip)
{
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + scrollx,(sy + scrolly) & 0xff,
transpen);
/* wrap around x */
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + 512 + scrollx,(sy + scrolly) & 0xff,
transpen);
}
}
upperbits >>= 1;
}
}
void seta001_device::setac_eof( UINT16* spriteram2)
{
int ctrl2 = m_spritectrl[1];
if (~ctrl2 & 0x20)
{
if (ctrl2 & 0x40)
memcpy(&spriteram2[0x0000/2],&spriteram2[0x2000/2],0x2000/2);
else
memcpy(&spriteram2[0x2000/2],&spriteram2[0x0000/2],0x2000/2);
}
}
void seta001_device::tnzs_draw_foreground( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect,
UINT8 *char_pointer, UINT8 *x_pointer, UINT8 *y_pointer, UINT8 *ctrl_pointer, UINT8 *color_pointer, int screenflip)
{
int i;
int ctrl2 = m_spritectrl[1];
if ((ctrl2 ^ (~ctrl2 << 1)) & 0x40)
{
char_pointer += 0x800;
x_pointer += 0x800;
ctrl_pointer += 0x800;
color_pointer += 0x800;
}
/* Draw all 512 sprites */
for (i = 0x1ff; i >= 0; i--)
{
int code, color, sx, sy, flipx, flipy;
code = char_pointer[i] + ((ctrl_pointer[i] & 0x3f) << 8);
color = (color_pointer[i] & 0xf8) >> 3;
sx = x_pointer[i] - ((color_pointer[i] & 1) << 8);
sy = 240 - y_pointer[i];
flipx = ctrl_pointer[i] & 0x80;
flipy = ctrl_pointer[i] & 0x40;
if (screenflip)
{
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
/* hack to hide Chuka Taisens grey line, top left corner */
if ((sy == 0) && (code == 0)) sy += 240;
}
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx,sy+2,0);
/* wrap around x */
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + 512,sy+2,0);
}
}
void seta001_device::tnzs_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* objram, UINT8* bg_flag )
{
/* Fill the background */
bitmap_fill(bitmap, cliprect, 0x1f0);
/* If the byte at f300 has bit 6 set, flip the screen
(I'm not 100% sure about this) */
int screenflip = (m_spritectrl[0] & 0x40) >> 6;
/* Redraw the background tiles (c400-c5ff) */
tnzs_draw_background(machine, bitmap, cliprect, objram + 0x400, m_spriteylow+0x200, bg_flag, screenflip);
/* Draw the sprites on top */
tnzs_draw_foreground(machine, bitmap, cliprect,
objram + 0x0000, /* chars : c000 */
objram + 0x0200, /* x : c200 */
m_spriteylow, /* y : f000 */
objram + 0x1000, /* ctrl : d000 */
objram + 0x1200, /* color : d200 */
screenflip);
}
void seta001_device::tnzs_eof( UINT8* objram)
{
int ctrl2 = m_spritectrl[1];
if (~ctrl2 & 0x20)
{
// note I copy sprites only. setac implementation also copies the "floating tilemap"
if (ctrl2 & 0x40)
{
memcpy(&objram[0x0000], &objram[0x0800], 0x0400);
memcpy(&objram[0x1000], &objram[0x1800], 0x0400);
}
else
{
memcpy(&objram[0x0800], &objram[0x0000], 0x0400);
memcpy(&objram[0x1800], &objram[0x1000], 0x0400);
}
// and I copy the "floating tilemap" BACKWARDS - this fixes kabukiz
memcpy(&objram[0x0400], &objram[0x0c00], 0x0400);
memcpy(&objram[0x1400], &objram[0x1c00], 0x0400);
}
}
// no bgmap stuff?
void seta001_device::srmp2_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int color_bank)
{
/*
Sprite RAM A: spriteram16_2
==============
+ 0x000 - 0x3ff
x--- ---- ---- ---- : Flip X
-x-- ---- ---- ---- : Flip Y
--xx xxxx xxxx xxxx : Tile number
+ 0x400 - 0x7ff
xxxx x--- ---- ---- : Color
---- ---x xxxx xxxx : X coords
Sprite RAM B: spriteram16
==============
+ 0x000 - 0x3ff
---- ---- xxxx xxxx : Y coords
+ 0x600
---- ---- -x-- ---- : Flip screen
*/
int offs;
int xoffs, yoffs;
int ctrl = m_spritectrl[ 0 ];
int ctrl2 = m_spritectrl[ 1 ];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = machine.primary_screen->height();
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x05 : 0x07;
for (offs = (0x400-2)/2; offs >= 0/2; offs -= 2/2)
{
int code = src[offs + 0x000/2];
int x = src[offs + 0x400/2];
int y = m_spriteylow[offs + 0x000/2] & 0xff;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int color = (x >> 11) & 0x1f;
if (flip)
{
y = max_y - y;
flipx = !flipx;
flipy = !flipy;
}
code = code & 0x3fff;
if (color_bank) color |= 0x20;
drawgfx_transpen(bitmap, cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 15);
}
}
void seta001_device::srmp3_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* spriteram_2, UINT8* spriteram_3)
{
int offs, col;
int xoffs, yoffs;
int ctrl = m_spritectrl[ 0 ];
int ctrl2 = m_spritectrl[ 1 ];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x0f;
int upper = ( m_spritectrl[ 2 ] ) +
( m_spritectrl[ 3 ] ) * 256;
int max_y = 0xf0;
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? -0x01 : -0x01;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1) numcol = 16;
/* The first column is the frontmost, see twineagl test mode */
for (col = numcol - 1; col >= 0; col--)
{
int x = m_spriteylow[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = m_spriteylow[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for (offs = 0; offs < 0x40/2; offs += 2/2)
{
int code = (((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0x800/2] & 0xff) << 8) + (spriteram_2[((col)&0xf) * 0x40/2 + offs + 0x800/2] & 0xff));
int color = ((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0xc00/2] & 0xf8) >> 3);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16 -
(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - 14 - sy - 0x100;
flipx = !flipx;
flipy = !flipy;
}
code = code & 0x1fff;
#define DRAWTILE(_x_, _y_) \
drawgfx_transpen(bitmap, \
cliprect, machine.gfx[0], \
code, \
color, \
flipx, flipy, \
_x_, _y_, 0);
DRAWTILE(sx - 0x000, sy + 0x000)
DRAWTILE(sx - 0x200, sy + 0x000)
DRAWTILE(sx - 0x000, sy + 0x100)
DRAWTILE(sx - 0x200, sy + 0x100)
}
/* next column */
}
}
void seta001_device::srmp3_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* spriteram_2, UINT8* spriteram_3, int gfx_bank)
{
/*
Sprite RAM A: spriteram_2
==============
+ 0x000 - 0x1ff
xxxx xxxx : Tile number (low)
+ 0x200 - 0x3ff
xxxx xxxx : X coords (low)
Sprite RAM B: spriteram_3
==============
+ 0x000 - 0x1ff
x--- ---- : Flip X ?
-x-- ---- : Flip Y ?
--x- ---- : Use GFX bank flag
---x xxxx : Tile number (high)
+ 0x200 - 0x3ff
xxxx x--- : Color
---- ---x : X coords (high)
Sprite RAM C: spriteram
==============
+ 0x000 - 0x1ff
xxxx xxxx : Y coords (low)
+ 0x300
-x-- ---- : Flip screen
*/
int offs;
int xoffs, yoffs;
int max_y = machine.primary_screen->height();
int ctrl = m_spritectrl[ 0 ];
//int ctrl2 = m_spritectrl[ 1 ];
int flip = ctrl & 0x40;
srmp3_draw_sprites_map(machine, bitmap, cliprect, spriteram_2, spriteram_3);
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x06 : 0x06;
for (offs = 0x200 - 1; offs >= 0; offs--)
{
int code = (((spriteram_3[offs + 0x000] & 0xff) << 8) + (spriteram_2[offs + 0x000] & 0xff));
int gfxbank = (spriteram_3[offs + 0x000] & 0x20);
int color = ((spriteram_3[offs + 0x200] & 0xf8) >> 3);
int x = (((spriteram_3[offs + 0x200] & 0x01) << 8) + (spriteram_2[offs + 0x200] & 0xff));
int y = (m_spriteylow[offs + 0x000] & 0xff);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
code = (code & 0x1fff);
if (gfxbank) code += ((gfx_bank + 1) * 0x2000);
if (flip)
{
y = max_y - y;
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 0);
}
}
void seta001_device::mjyuugi_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2)
{
int offs, col;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = m_spritectrl[ 0 ];
int ctrl2 = m_spritectrl[ 1 ];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x000f;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int upper = ( m_spritectrl[2] ) +
( m_spritectrl[3] ) * 256;
int max_y = 0xf0;
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x09 : 0x07;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1) numcol = 16;
/* The first column is the frontmost, see twineagl test mode */
for (col = numcol - 1; col >= 0; col--)
{
int x = m_spriteylow[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = m_spriteylow[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for (offs = 0; offs < 0x40/2; offs += 2/2)
{
int code = src[((col)&0xf) * 0x40/2 + offs + 0x800/2];
int color = src[((col)&0xf) * 0x40/2 + offs + 0xc00/2];
int gfxbank = color & 0x0200;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16 -
(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - 16 - sy - 0x100;
flipx = !flipx;
flipy = !flipy;
}
color = ((color >> (16-5)) % total_color_codes);
code = (code & 0x3fff) + (gfxbank ? 0x4000 : 0);
#define DRAWTILE(_x_, _y_) \
drawgfx_transpen(bitmap, \
cliprect, machine.gfx[0], \
code, \
color, \
flipx, flipy, \
_x_, _y_, 0);
DRAWTILE(sx - 0x000, sy + 0x000)
DRAWTILE(sx - 0x200, sy + 0x000)
DRAWTILE(sx - 0x000, sy + 0x100)
DRAWTILE(sx - 0x200, sy + 0x100)
}
/* next column */
}
}
void seta001_device::mjyuugi_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int gfx_bank)
{
/*
Sprite RAM A: spriteram16_2
==============
+ 0x000 - 0x3ff
x--- ---- ---- ---- : Flip X
-x-- ---- ---- ---- : Flip Y
--x- ---- ---- ---- : Use GFX bank flag
---x xxxx xxxx xxxx : Tile number
+ 0x400 - 0x7ff
xxxx x--- ---- ---- : Color
---- ---x xxxx xxxx : X coords
Sprite RAM B: spriteram16
==============
+ 0x000 - 0x3ff
---- ---- xxxx xxxx : Y coords
+ 0x600
---- ---- -x-- ---- : Flip screen
*/
int offs;
int xoffs, yoffs;
int ctrl = m_spritectrl[ 0 ];
int ctrl2 = m_spritectrl[ 1 ];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = machine.primary_screen->height();
mjyuugi_draw_sprites_map(machine, bitmap, cliprect, spriteram16_2);
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x06 : 0x06;
for (offs = (0x400 - 6) / 2; offs >= 0 / 2; offs -= 2 / 2)
{
int code = src[offs + 0x000 / 2];
int gfxbank = code & 0x2000;
int color = ((src[offs + 0x400 / 2] >> 11) & 0x1f);
int x = (src[offs + 0x400 / 2] & 0x1ff);
int y = (m_spriteylow[offs + 0x000 / 2] & 0xff);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
code = (code & 0x1fff);
if (gfxbank) code += ((gfx_bank + 1) * 0x2000);
if (flip)
{
y = max_y - y
+(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 0);
}
}

57
src/mame/video/seta001.h Normal file
View File

@ -0,0 +1,57 @@
class seta001_device : public device_t
{
public:
seta001_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
void setac_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int flipxoffs, int noflipxoffs);
void setac_eof( UINT16* spriteram2);
void tnzs_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* objram, UINT8* bg_flag );
void tnzs_eof( UINT8* objram);
void srmp2_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int color_bank);
void srmp3_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* spriteram_2, UINT8* spriteram_3, int gfx_bank);
void mjyuugi_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2, int gfx_bank);
UINT8 m_spritectrl[4];
UINT8 m_spriteylow[0x300]; // 0x200 low y + 0x100 bg stuff
protected:
virtual void device_start();
virtual void device_reset();
private:
private:
void setac_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2);
void tnzs_draw_foreground( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *char_pointer, UINT8 *x_pointer, UINT8 *y_pointer, UINT8 *ctrl_pointer, UINT8 *color_pointer, int screenflip);
void tnzs_draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *m, UINT8* scrollram, UINT8* bg_flag, int screenflip);
void srmp3_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* spriteram_2, UINT8* spriteram_3);
void mjyuugi_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16_2);
};
READ16_DEVICE_HANDLER( spritectrl_r16 );
WRITE16_DEVICE_HANDLER( spritectrl_w16 );
READ8_DEVICE_HANDLER( spritectrl_r8 );
WRITE8_DEVICE_HANDLER( spritectrl_w8 );
WRITE8_DEVICE_HANDLER( spritectrl_w8_champbwl );
READ16_DEVICE_HANDLER( spriteylow_r16 );
WRITE16_DEVICE_HANDLER( spriteylow_w16 );
READ8_DEVICE_HANDLER( spriteylow_r8 );
WRITE8_DEVICE_HANDLER( spriteylow_w8 );
extern const device_type SETA001_SPRITE;

View File

@ -2,13 +2,12 @@
Functions to emulate the video hardware of the machine.
Video hardware is very similar with "seta" hardware except color PROM.
***************************************************************************/
#include "emu.h"
#include "includes/srmp2.h"
#include "video/seta001.h"
PALETTE_INIT( srmp2 )
{
@ -38,426 +37,26 @@ PALETTE_INIT( srmp3 )
}
static void srmp2_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
/*
Sprite RAM A: spriteram16_2
==============
+ 0x000 - 0x3ff
x--- ---- ---- ---- : Flip X
-x-- ---- ---- ---- : Flip Y
--xx xxxx xxxx xxxx : Tile number
+ 0x400 - 0x7ff
xxxx x--- ---- ---- : Color
---- ---x xxxx xxxx : X coords
Sprite RAM B: spriteram16
==============
+ 0x000 - 0x3ff
---- ---- xxxx xxxx : Y coords
+ 0x600
---- ---- -x-- ---- : Flip screen
*/
srmp2_state *state = machine.driver_data<srmp2_state>();
UINT16 *spriteram16 = state->m_spriteram1.u16;
UINT16 *spriteram16_2 = state->m_spriteram2.u16;
int offs;
int xoffs, yoffs;
int ctrl = spriteram16[ 0x600/2 ];
int ctrl2 = spriteram16[ 0x602/2 ];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = machine.primary_screen->height();
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x05 : 0x07;
for (offs = (0x400-2)/2; offs >= 0/2; offs -= 2/2)
{
int code = src[offs + 0x000/2];
int x = src[offs + 0x400/2];
int y = spriteram16[offs + 0x000/2] & 0xff;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int color = (x >> 11) & 0x1f;
if (flip)
{
y = max_y - y;
flipx = !flipx;
flipy = !flipy;
}
code = code & 0x3fff;
if (state->m_color_bank) color |= 0x20;
drawgfx_transpen(bitmap, cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 15);
}
}
static void srmp3_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
srmp2_state *state = machine.driver_data<srmp2_state>();
UINT8 *spriteram = state->m_spriteram1.u8;
UINT8 *spriteram_2 = state->m_spriteram2.u8;
UINT8 *spriteram_3 = state->m_spriteram3.u8;
int offs, col;
int xoffs, yoffs;
int ctrl = spriteram[ 0x600/2 ];
int ctrl2 = spriteram[ 0x602/2 ];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x0f;
int upper = ( spriteram[ 0x604/2 ] & 0xFF ) +
( spriteram[ 0x606/2 ] & 0xFF ) * 256;
int max_y = 0xf0;
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? -0x01 : -0x01;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1) numcol = 16;
/* The first column is the frontmost, see twineagl test mode */
for (col = numcol - 1; col >= 0; col--)
{
int x = spriteram[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = spriteram[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for (offs = 0; offs < 0x40/2; offs += 2/2)
{
int code = (((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0x800/2] & 0xff) << 8) + (spriteram_2[((col)&0xf) * 0x40/2 + offs + 0x800/2] & 0xff));
int color = ((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0xc00/2] & 0xf8) >> 3);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16 -
(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - 14 - sy - 0x100;
flipx = !flipx;
flipy = !flipy;
}
code = code & 0x1fff;
#define DRAWTILE(_x_, _y_) \
drawgfx_transpen(bitmap, \
cliprect, machine.gfx[0], \
code, \
color, \
flipx, flipy, \
_x_, _y_, 0);
DRAWTILE(sx - 0x000, sy + 0x000)
DRAWTILE(sx - 0x200, sy + 0x000)
DRAWTILE(sx - 0x000, sy + 0x100)
DRAWTILE(sx - 0x200, sy + 0x100)
}
/* next column */
}
}
static void srmp3_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
/*
Sprite RAM A: spriteram_2
==============
+ 0x000 - 0x1ff
xxxx xxxx : Tile number (low)
+ 0x200 - 0x3ff
---- ---- : Color
xxxx xxxx : X coords (low)
Sprite RAM B: spriteram_3
==============
+ 0x000 - 0x1ff
x--- ---- : Flip X ?
-x-- ---- : Flip Y ?
--x- ---- : Use GFX bank flag
---x xxxx : Tile number (high)
+ 0x200 - 0x3ff
xxxx x--- : Color
---- ---x : X coords (high)
Sprite RAM C: spriteram
==============
+ 0x000 - 0x1ff
xxxx xxxx : Y coords (low)
+ 0x300
-x-- ---- : Flip screen
*/
srmp2_state *state = machine.driver_data<srmp2_state>();
UINT8 *spriteram = state->m_spriteram1.u8;
UINT8 *spriteram_2 = state->m_spriteram2.u8;
UINT8 *spriteram_3 = state->m_spriteram3.u8;
int offs;
int xoffs, yoffs;
int max_y = machine.primary_screen->height();
int ctrl = spriteram[ 0x600/2 ];
//int ctrl2 = spriteram[ 0x602/2 ];
int flip = ctrl & 0x40;
srmp3_draw_sprites_map(machine, bitmap, cliprect);
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x06 : 0x06;
for (offs = 0x200 - 1; offs >= 0; offs--)
{
int code = (((spriteram_3[offs + 0x000] & 0xff) << 8) + (spriteram_2[offs + 0x000] & 0xff));
int gfxbank = (spriteram_3[offs + 0x000] & 0x20);
int color = ((spriteram_3[offs + 0x200] & 0xf8) >> 3);
int x = (((spriteram_3[offs + 0x200] & 0x01) << 8) + (spriteram_2[offs + 0x200] & 0xff));
int y = (spriteram[offs + 0x000] & 0xff);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
code = (code & 0x1fff);
if (gfxbank) code += ((state->m_gfx_bank + 1) * 0x2000);
if (flip)
{
y = max_y - y;
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 0);
}
}
static void mjyuugi_draw_sprites_map(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
srmp2_state *state = machine.driver_data<srmp2_state>();
UINT16 *spriteram16 = state->m_spriteram1.u16;
UINT16 *spriteram16_2 = state->m_spriteram2.u16;
int offs, col;
int xoffs, yoffs;
int total_color_codes = machine.config().m_gfxdecodeinfo[0].total_color_codes;
int ctrl = spriteram16[ 0x600/2 ];
int ctrl2 = spriteram16[ 0x602/2 ];
int flip = ctrl & 0x40;
int numcol = ctrl2 & 0x000f;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int upper = ( spriteram16[ 0x604/2 ] & 0xFF ) +
( spriteram16[ 0x606/2 ] & 0xFF ) * 256;
int max_y = 0xf0;
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x09 : 0x07;
/* Number of columns to draw - the value 1 seems special, meaning:
draw every column */
if (numcol == 1) numcol = 16;
/* The first column is the frontmost, see twineagl test mode */
for (col = numcol - 1; col >= 0; col--)
{
int x = spriteram16[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
int y = spriteram16[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
/* draw this column */
for (offs = 0; offs < 0x40/2; offs += 2/2)
{
int code = src[((col)&0xf) * 0x40/2 + offs + 0x800/2];
int color = src[((col)&0xf) * 0x40/2 + offs + 0xc00/2];
int gfxbank = color & 0x0200;
int flipx = code & 0x8000;
int flipy = code & 0x4000;
int sx = x + xoffs + (offs & 1) * 16;
int sy = -(y + yoffs) + (offs / 2) * 16 -
(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
if (upper & (1 << col)) sx += 256;
if (flip)
{
sy = max_y - 16 - sy - 0x100;
flipx = !flipx;
flipy = !flipy;
}
color = ((color >> (16-5)) % total_color_codes);
code = (code & 0x3fff) + (gfxbank ? 0x4000 : 0);
#define DRAWTILE(_x_, _y_) \
drawgfx_transpen(bitmap, \
cliprect, machine.gfx[0], \
code, \
color, \
flipx, flipy, \
_x_, _y_, 0);
DRAWTILE(sx - 0x000, sy + 0x000)
DRAWTILE(sx - 0x200, sy + 0x000)
DRAWTILE(sx - 0x000, sy + 0x100)
DRAWTILE(sx - 0x200, sy + 0x100)
}
/* next column */
}
}
static void mjyuugi_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
/*
Sprite RAM A: spriteram16_2
==============
+ 0x000 - 0x3ff
x--- ---- ---- ---- : Flip X
-x-- ---- ---- ---- : Flip Y
--x- ---- ---- ---- : Use GFX bank flag
---x xxxx xxxx xxxx : Tile number
+ 0x400 - 0x7ff
xxxx x--- ---- ---- : Color
---- ---x xxxx xxxx : X coords
Sprite RAM B: spriteram16
==============
+ 0x000 - 0x3ff
---- ---- xxxx xxxx : Y coords
+ 0x600
---- ---- -x-- ---- : Flip screen
*/
srmp2_state *state = machine.driver_data<srmp2_state>();
UINT16 *spriteram16 = state->m_spriteram1.u16;
UINT16 *spriteram16_2 = state->m_spriteram2.u16;
int offs;
int xoffs, yoffs;
int ctrl = spriteram16[ 0x600/2 ];
int ctrl2 = spriteram16[ 0x602/2 ];
int flip = ctrl & 0x40;
/* Sprites Banking and/or Sprites Buffering */
UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
int max_y = machine.primary_screen->height();
mjyuugi_draw_sprites_map(machine, bitmap, cliprect);
xoffs = flip ? 0x10 : 0x10;
yoffs = flip ? 0x06 : 0x06;
for (offs = (0x400 - 6) / 2; offs >= 0 / 2; offs -= 2 / 2)
{
int code = src[offs + 0x000 / 2];
int gfxbank = code & 0x2000;
int color = ((src[offs + 0x400 / 2] >> 11) & 0x1f);
int x = (src[offs + 0x400 / 2] & 0x1ff);
int y = (spriteram16[offs + 0x000 / 2] & 0xff);
int flipx = code & 0x8000;
int flipy = code & 0x4000;
code = (code & 0x1fff);
if (gfxbank) code += ((state->m_gfx_bank + 1) * 0x2000);
if (flip)
{
y = max_y - y
+(machine.primary_screen->height() - (machine.primary_screen->visible_area().max_y + 1));
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect, machine.gfx[0],
code,
color,
flipx, flipy,
(x + xoffs) & 0x1ff,
max_y - ((y + yoffs) & 0x0ff), 0);
}
}
SCREEN_UPDATE( srmp2 )
{
srmp2_state *state = screen->machine().driver_data<srmp2_state>();
bitmap_fill(bitmap, cliprect, 0x1ff);
srmp2_draw_sprites(screen->machine(), bitmap, cliprect);
screen->machine().device<seta001_device>("spritegen")->srmp2_draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2.u16, state->m_color_bank);
return 0;
}
SCREEN_UPDATE( srmp3 )
{
srmp2_state *state = screen->machine().driver_data<srmp2_state>();
bitmap_fill(bitmap, cliprect, 0x1f0);
srmp3_draw_sprites(screen->machine(), bitmap, cliprect);
screen->machine().device<seta001_device>("spritegen")->srmp3_draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2.u8, state->m_spriteram3.u8, state->m_gfx_bank);
return 0;
}
SCREEN_UPDATE( mjyuugi )
{
srmp2_state *state = screen->machine().driver_data<srmp2_state>();
bitmap_fill(bitmap, cliprect, 0x1f0);
mjyuugi_draw_sprites(screen->machine(), bitmap, cliprect);
screen->machine().device<seta001_device>("spritegen")->mjyuugi_draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2.u16, state->m_gfx_bank);
return 0;
}

View File

@ -8,7 +8,7 @@
#include "emu.h"
#include "includes/tnzs.h"
#include "video/seta001.h"
/***************************************************************************
@ -42,187 +42,15 @@ PALETTE_INIT( arknoid2 )
}
static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *m )
{
tnzs_state *state = machine.driver_data<tnzs_state>();
int x, y, column, tot, transpen;
int scrollx, scrolly;
UINT32 upperbits;
int ctrl2 = state->m_objctrl[1];
if ((ctrl2 ^ (~ctrl2 << 1)) & 0x40)
m += 0x800;
if (state->m_bg_flag[0] & 0x80)
transpen = -1;
else
transpen = 0;
/* The byte at f200 is the y-scroll value for the first column.
The byte at f204 is the LSB of x-scroll value for the first column.
The other columns follow at 16-byte intervals.
The 9th bit of each x-scroll value is combined into 2 bytes
at f302-f303 */
/* f301 controls how many columns are drawn. */
tot = state->m_objctrl[1] & 0x1f;
if (tot == 1)
tot = 16;
upperbits = state->m_objctrl[2] + state->m_objctrl[3] * 256;
for (column = 0; column < tot; column++)
{
scrollx = state->m_scrollram[column * 16 + 4] - ((upperbits & 0x01) * 256);
if (state->m_screenflip)
scrolly = state->m_scrollram[column * 16] + 1 - 256;
else
scrolly = -state->m_scrollram[column * 16] + 1;
for (y = 0; y < 16; y++)
{
for (x = 0; x < 2; x++)
{
int code, color, flipx, flipy, sx, sy;
int i = 32 * (column ^ 8) + 2 * y + x;
code = m[i] + ((m[i + 0x1000] & 0x3f) << 8);
color = (m[i + 0x1200] & 0xf8) >> 3; /* colours at d600-d7ff */
sx = x * 16;
sy = y * 16;
flipx = m[i + 0x1000] & 0x80;
flipy = m[i + 0x1000] & 0x40;
if (state->m_screenflip)
{
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + scrollx,(sy + scrolly) & 0xff,
transpen);
/* wrap around x */
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + 512 + scrollx,(sy + scrolly) & 0xff,
transpen);
}
}
upperbits >>= 1;
}
}
static void draw_foreground( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect,
UINT8 *char_pointer, UINT8 *x_pointer, UINT8 *y_pointer, UINT8 *ctrl_pointer, UINT8 *color_pointer)
{
tnzs_state *state = machine.driver_data<tnzs_state>();
int i;
int ctrl2 = state->m_objctrl[1];
if ((ctrl2 ^ (~ctrl2 << 1)) & 0x40)
{
char_pointer += 0x800;
x_pointer += 0x800;
ctrl_pointer += 0x800;
color_pointer += 0x800;
}
/* Draw all 512 sprites */
for (i = 0x1ff; i >= 0; i--)
{
int code, color, sx, sy, flipx, flipy;
code = char_pointer[i] + ((ctrl_pointer[i] & 0x3f) << 8);
color = (color_pointer[i] & 0xf8) >> 3;
sx = x_pointer[i] - ((color_pointer[i] & 1) << 8);
sy = 240 - y_pointer[i];
flipx = ctrl_pointer[i] & 0x80;
flipy = ctrl_pointer[i] & 0x40;
if (state->m_screenflip)
{
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
/* hack to hide Chuka Taisens grey line, top left corner */
if ((sy == 0) && (code == 0)) sy += 240;
}
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx,sy+2,0);
/* wrap around x */
drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
code,
color,
flipx,flipy,
sx + 512,sy+2,0);
}
}
SCREEN_UPDATE( tnzs )
{
tnzs_state *state = screen->machine().driver_data<tnzs_state>();
/* If the byte at f300 has bit 6 set, flip the screen
(I'm not 100% sure about this) */
state->m_screenflip = (state->m_objctrl[0] & 0x40) >> 6;
/* Fill the background */
bitmap_fill(bitmap, cliprect, 0x1f0);
/* Redraw the background tiles (c400-c5ff) */
draw_background(screen->machine(), bitmap, cliprect, state->m_objram + 0x400);
/* Draw the sprites on top */
draw_foreground(screen->machine(), bitmap, cliprect,
state->m_objram + 0x0000, /* chars : c000 */
state->m_objram + 0x0200, /* x : c200 */
state->m_vdcram + 0x0000, /* y : f000 */
state->m_objram + 0x1000, /* ctrl : d000 */
state->m_objram + 0x1200); /* color : d200 */
screen->machine().device<seta001_device>("spritegen")->tnzs_draw_sprites(screen->machine(), bitmap, cliprect, state->m_objram, state->m_bg_flag );
return 0;
}
SCREEN_EOF( tnzs )
{
tnzs_state *state = machine.driver_data<tnzs_state>();
int ctrl2 = state->m_objctrl[1];
if (~ctrl2 & 0x20)
{
// note I copy sprites only. seta.c also copies the "floating tilemap"
if (ctrl2 & 0x40)
{
memcpy(&state->m_objram[0x0000], &state->m_objram[0x0800], 0x0400);
memcpy(&state->m_objram[0x1000], &state->m_objram[0x1800], 0x0400);
}
else
{
memcpy(&state->m_objram[0x0800], &state->m_objram[0x0000], 0x0400);
memcpy(&state->m_objram[0x1800], &state->m_objram[0x1000], 0x0400);
}
// and I copy the "floating tilemap" BACKWARDS - this fixes kabukiz
memcpy(&state->m_objram[0x0400], &state->m_objram[0x0c00], 0x0400);
memcpy(&state->m_objram[0x1400], &state->m_objram[0x1c00], 0x0400);
}
machine.device<seta001_device>("spritegen")->tnzs_eof( state->m_objram);
}