Merge pull request #1195 from mamehaze/master

Street Fight and Cross Shooter (Street Fight type hw) use a common mo…
This commit is contained in:
R. Belmont 2016-08-07 15:54:25 -04:00 committed by GitHub
commit 22f74309ed
11 changed files with 1036 additions and 998 deletions

View File

@ -3285,9 +3285,12 @@ files {
MAME_DIR .. "src/mame/video/seibuspi.cpp",
MAME_DIR .. "src/mame/drivers/sengokmj.cpp",
MAME_DIR .. "src/mame/drivers/stfight.cpp",
MAME_DIR .. "src/mame/video/stfight_dev.cpp",
MAME_DIR .. "src/mame/video/stfight_dev.h",
MAME_DIR .. "src/mame/video/airraid_dev.cpp",
MAME_DIR .. "src/mame/video/airraid_dev.h",
MAME_DIR .. "src/mame/includes/stfight.h",
MAME_DIR .. "src/mame/machine/stfight.cpp",
MAME_DIR .. "src/mame/video/stfight.cpp",
MAME_DIR .. "src/mame/drivers/toki.cpp",
MAME_DIR .. "src/mame/includes/toki.h",
MAME_DIR .. "src/mame/video/toki.cpp",

View File

@ -1,6 +1,9 @@
// license:LGPL-2.1+
// copyright-holders:Tomasz Slanina, Angelo Salese, hap
/* Cross Shooter (c) 1987 Seibu
/* Air Raid (aka Cross Shooter) (c) 1987 Seibu
this driver is for the single board version on the S-0087-011A-0 PCB
for the version using a S-0086-002-B0 base PCB and separate video board see stfight.cpp
Custom Modules note:
@ -54,13 +57,6 @@ Stephh's notes (based on the game Z80 code and some tests) :
the error.log file.
- Interrupts notes :
* I think that they aren't handled correctly : after a few frames,
the number of lives are reset to 0, causing a "GAME OVER" 8(
* - or is this protection from the 68705, haze
- Inputs notes :
* COINx don't work correcly : see "cshooter_coin_r" read handler.
@ -155,256 +151,47 @@ Stephh's notes (based on the game Z80 code and some tests) :
#include "emu.h"
#include "cpu/z80/z80.h"
#include "audio/seibu.h"
#include "video/airraid_dev.h"
class cshooter_state : public driver_device
class airraid_state : public driver_device
{
public:
cshooter_state(const machine_config &mconfig, device_type type, const char *tag)
airraid_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_seibu_sound(*this, "seibu_sound"),
m_txram(*this, "txram"),
m_vregs(*this, "vregs"),
m_mainram(*this, "mainram"),
m_spriteram(*this, "spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_tx_clut(*this, "tx_clut"),
m_fg_clut(*this, "fg_clut"),
m_bg_clut(*this, "bg_clut"),
m_spr_clut(*this, "spr_clut")
m_airraid_video(*this,"airraid_vid")
{ }
required_device<cpu_device> m_maincpu;
optional_device<seibu_sound_device> m_seibu_sound;
required_shared_ptr<UINT8> m_txram;
required_shared_ptr<UINT8> m_vregs;
optional_shared_ptr<UINT8> m_mainram;
optional_shared_ptr<UINT8> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
optional_shared_ptr<UINT8> m_decrypted_opcodes;
required_region_ptr<UINT8> m_tx_clut;
required_region_ptr<UINT8> m_fg_clut;
required_region_ptr<UINT8> m_bg_clut;
required_region_ptr<UINT8> m_spr_clut;
required_device<airraid_video_device> m_airraid_video;
TILEMAP_MAPPER_MEMBER(bg_scan);
TILEMAP_MAPPER_MEMBER(fg_scan);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
tilemap_t *m_bg_tilemap;
TILE_GET_INFO_MEMBER(get_fg_tile_info);
tilemap_t *m_fg_tilemap;
TILE_GET_INFO_MEMBER(get_cstx_tile_info);
tilemap_t *m_tx_tilemap;
UINT16 m_hw;
bitmap_ind16 m_temp_bitmap;
DECLARE_WRITE8_MEMBER(cshooter_txram_w);
DECLARE_READ8_MEMBER(cshooter_coin_r);
DECLARE_WRITE8_MEMBER(cshooter_c500_w);
DECLARE_WRITE8_MEMBER(cshooter_c700_w);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(vregs_w);
DECLARE_READ8_MEMBER(seibu_sound_comms_r);
DECLARE_WRITE8_MEMBER(seibu_sound_comms_w);
DECLARE_DRIVER_INIT(cshootere);
DECLARE_DRIVER_INIT(cshooter);
virtual void video_start() override;
DECLARE_PALETTE_INIT(cshooter);
DECLARE_MACHINE_RESET(cshooter);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* clut, int base);
UINT32 screen_update_airraid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(cshooter_scanline);
};
PALETTE_INIT_MEMBER(cshooter_state, cshooter)
{
// we use the PROMs in the video drawing code instead because
// it controls transparency as well as the colour lookup.
// (bit 0x40 set in a CLUT PROM means 'transparent pen')
}
TILEMAP_MAPPER_MEMBER(cshooter_state::bg_scan)
{
return ((row&0xf) * 0x10) + (col&0xf) + (((col&0x7f0) >> 4)*0x100) + ((row & 0x30)>>4) * 0x8000;
}
TILEMAP_MAPPER_MEMBER(cshooter_state::fg_scan)
{
return ((row&0xf) * 0x10) + (col&0xf) + (((col&0x0f0) >> 4)*0x100) + ((row & 0x1f0)>>4) * 0x1000;
}
TILE_GET_INFO_MEMBER(cshooter_state::get_bg_tile_info)
{
UINT8 *bgMap = memregion("bg_map")->base();
int tile = bgMap[(tile_index*2)+1] & 0xff;
int attr = bgMap[(tile_index*2)+0] & 0xff;
tile |= (attr & 0x70) << 4;
SET_TILE_INFO_MEMBER(2,
tile,
attr&0xf,
0);
}
TILE_GET_INFO_MEMBER(cshooter_state::get_fg_tile_info)
{
UINT8 *bgMap = memregion("fg_map")->base();
int tile = bgMap[(tile_index*2)+1] & 0xff;
int attr = bgMap[(tile_index*2)+0] & 0xff;
tile |= (attr & 0x70) << 4;
SET_TILE_INFO_MEMBER(3,
tile,
attr&0xf,
0);
}
TILE_GET_INFO_MEMBER(cshooter_state::get_cstx_tile_info)
{
int code = (m_txram[tile_index*2]);
int attr = (m_txram[tile_index*2+1]);
int color = attr & 0xf;
SET_TILE_INFO_MEMBER(0, (code << 1) | ((attr & 0x20) >> 5), color, 0);
}
WRITE8_MEMBER(cshooter_state::cshooter_txram_w)
{
m_txram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset/2);
}
void cshooter_state::video_start()
{
// there might actually be 4 banks of 2048 x 16 tilemaps in here as the upper scroll bits are with the rom banking.
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(cshooter_state::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(cshooter_state::bg_scan),this),16,16,2048, 64);
// which could in turn mean this is actually 256 x 128, not 256 x 512
// m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(cshooter_state::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(cshooter_state::fg_scan),this),16,16,256, 512);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(cshooter_state::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(cshooter_state::fg_scan),this),16,16,256, 128);
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(cshooter_state::get_cstx_tile_info),this),TILEMAP_SCAN_ROWS, 8,8,32,32);
// m_fg_tilemap->set_transparent_pen(0);
// m_tx_tilemap->set_transparent_pen(0);
// we do manual mixing using a temp bitmap
m_screen->register_screen_bitmap(m_temp_bitmap);
}
void cshooter_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int i = m_spriteram.bytes() - 4; i >= 0 ; i -= 4)
{
if (m_spriteram[i+1]&0x80)
continue;
UINT16 tile = (m_spriteram[i]);
tile |= (m_spriteram[i + 1] & 0x70) << 4;
UINT16 col = (m_spriteram[i+1] & 0x0f);
//col |= (m_spriteram[i+1] & 0x80)<<3;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, tile,col, 0, 0, m_spriteram[i+3],m_spriteram[i+2],0);
}
}
#define DISPLAY_SPR 1
#define DISPLAY_FG 2
#define DISPLAY_BG 4
#define DISPLAY_TXT 8
#define DM_GETSCROLL(n) (((m_vregs[(n)]<<1)&0xff) + ((m_vregs[(n)]&0x80)?1:0) +( ((m_vregs[(n)-1]<<4) | (m_vregs[(n)-1]<<12) )&0xff00))
void cshooter_state::mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* clut, int base)
{
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT16 *dest = &bitmap.pix16(y);
UINT16 *src = &m_temp_bitmap.pix16(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
UINT8 pix = src[x] & 0xff;
UINT8 real = clut[pix];
if (!(real & 0x40))
{
dest[x] = (real & 0x3f) + base;
}
}
}
}
UINT32 cshooter_state::screen_update_airraid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
UINT16 bgscrolly = DM_GETSCROLL(0x6);
// this is more likely to be 'bank' than scroll, like NMK16
bgscrolly += ((m_hw & 0xc0) >> 6) * 256;
m_bg_tilemap->set_scrollx(0, DM_GETSCROLL(0x2));
m_bg_tilemap->set_scrolly(0, bgscrolly);
m_fg_tilemap->set_scrollx(0, DM_GETSCROLL(0xa));
m_fg_tilemap->set_scrolly(0, DM_GETSCROLL(0xe));
// draw screen
bitmap.fill(0x80, cliprect); // temp
// m_temp_bitmap.fill(0x00, cliprect);
if ((m_hw & DISPLAY_BG) == 0x00)
{
m_bg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_bg_clut, 0x80);
}
if ((m_hw & DISPLAY_FG) == 0x00)
{
m_fg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_fg_clut, 0x00);
}
if (m_hw & DISPLAY_SPR)
{
m_temp_bitmap.fill(0x00, cliprect);
draw_sprites(m_temp_bitmap, cliprect); // technically this should draw manually because 0x40 in the prom is transparency and our code just assumes it to be 0.
mix_layer(screen, bitmap, cliprect, m_spr_clut, 0x40);
}
if (m_hw & DISPLAY_TXT)
{
m_tx_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_tx_clut, 0xc0);
}
return 0;
}
/* main cpu */
TIMER_DEVICE_CALLBACK_MEMBER(cshooter_state::cshooter_scanline)
TIMER_DEVICE_CALLBACK_MEMBER(airraid_state::cshooter_scanline)
{
int scanline = param;
@ -416,19 +203,19 @@ TIMER_DEVICE_CALLBACK_MEMBER(cshooter_state::cshooter_scanline)
}
MACHINE_RESET_MEMBER(cshooter_state,cshooter)
MACHINE_RESET_MEMBER(airraid_state,cshooter)
{
}
WRITE8_MEMBER(cshooter_state::cshooter_c500_w)
WRITE8_MEMBER(airraid_state::cshooter_c500_w)
{
}
WRITE8_MEMBER(cshooter_state::cshooter_c700_w)
WRITE8_MEMBER(airraid_state::cshooter_c700_w)
{
}
WRITE8_MEMBER(cshooter_state::bank_w)
WRITE8_MEMBER(airraid_state::bank_w)
{
// format of this address is TTBB tbfs
@ -439,35 +226,27 @@ WRITE8_MEMBER(cshooter_state::bank_w)
// f = fg layer disable
// s = sprite layer enable
// printf("bankw %02x\n", data & 0xc0);
m_hw = data;
membank("bank1")->set_entry((data>>4)&3);
m_airraid_video->layer_enable_w(data & 0xcf);
}
READ8_MEMBER(cshooter_state::seibu_sound_comms_r)
READ8_MEMBER(airraid_state::seibu_sound_comms_r)
{
return m_seibu_sound->main_word_r(space,offset,0x00ff);
}
WRITE8_MEMBER(cshooter_state::seibu_sound_comms_w)
WRITE8_MEMBER(airraid_state::seibu_sound_comms_w)
{
m_seibu_sound->main_word_w(space,offset,data,0x00ff);
}
WRITE8_MEMBER(cshooter_state::vregs_w)
{
m_vregs[offset] = data;
if ((offset != 0x2) && (offset != 0x01) && (offset != 0xa) && (offset != 0x09) && (offset != 0xe) && (offset != 0x0d) )
printf("vregs_w %02x: %02x\n", offset, data);
}
static ADDRESS_MAP_START( airraid_map, AS_PROGRAM, 8, cshooter_state )
static ADDRESS_MAP_START( airraid_map, AS_PROGRAM, 8, airraid_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_WRITENOP // rld result write-back
AM_RANGE(0xc000, 0xc000) AM_READ_PORT("IN0")
@ -479,22 +258,22 @@ static ADDRESS_MAP_START( airraid_map, AS_PROGRAM, 8, cshooter_state )
// AM_RANGE(0xc600, 0xc600) AM_WRITE(cshooter_c600_w) // see notes
AM_RANGE(0xc700, 0xc700) AM_WRITE(cshooter_c700_w)
// AM_RANGE(0xc801, 0xc801) AM_WRITE(cshooter_c801_w) // see notes
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(cshooter_txram_w) AM_SHARE("txram")
AM_RANGE(0xd000, 0xd7ff) AM_RAM_DEVWRITE("airraid_vid", airraid_video_device, txram_w) AM_SHARE("txram")
AM_RANGE(0xd800, 0xd8ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0xda00, 0xdaff) AM_RAM_DEVWRITE("palette", palette_device, write_ext) AM_SHARE("palette_ext")
AM_RANGE(0xdc11, 0xdc11) AM_WRITE(bank_w)
AM_RANGE(0xdc00, 0xdc0f) AM_RAM_WRITE(vregs_w) AM_SHARE("vregs")
AM_RANGE(0xdc00, 0xdc0f) AM_RAM_DEVWRITE("airraid_vid", airraid_video_device, vregs_w) AM_SHARE("vregs")
// AM_RANGE(0xdc10, 0xdc10) AM_RAM
AM_RANGE(0xdc11, 0xdc11) AM_WRITE(bank_w)
// AM_RANGE(0xdc19, 0xdc19) AM_RAM
// AM_RANGE(0xdc1e, 0xdc1e) AM_RAM
// AM_RANGE(0xdc1f, 0xdc1f) AM_RAM
AM_RANGE(0xde00, 0xde0f) AM_READWRITE(seibu_sound_comms_r,seibu_sound_comms_w)
AM_RANGE(0xe000, 0xfdff) AM_RAM AM_SHARE("mainram")
AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("sprite_ram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cshooter_state )
static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, airraid_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes")
ADDRESS_MAP_END
@ -582,68 +361,22 @@ INPUT_PORTS_END
static const gfx_layout cshooter_charlayout =
{
8,8, /* 8*8 characters */
RGN_FRAC(1,1), /* 512 characters */
2, /* 4 bits per pixel */
{ 0,4 },
{ 8,9,10,11,0,1,2,3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
128*1
};
static const gfx_layout cshooter_char16layout =
{
16,16, /* 8*8 characters */
RGN_FRAC(1,1), /* 512 characters */
4, /* 4 bits per pixel */
// { 0,8,4,12 },
{ 0,4,8,12 },
// { 12,4,8,0 },
{ 0,1,2,3, 16,17,18,19, 512+0,512+1,512+2,512+3, 512+16,512+17,512+18,512+19},
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*32
};
static GFXDECODE_START( cshooter )
GFXDECODE_ENTRY( "tx_gfx", 0, cshooter_charlayout, 0, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0, cshooter_char16layout, 0, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0, cshooter_char16layout, 0, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0, cshooter_char16layout, 0, 16 )
GFXDECODE_END
static MACHINE_CONFIG_START( airraid, cshooter_state )
static MACHINE_CONFIG_START( airraid, airraid_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,XTAL_12MHz/2) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(airraid_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cshooter_state, cshooter_scanline, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", airraid_state, cshooter_scanline, "airraid_vid:screen", 0, 1)
SEIBU2_AIRRAID_SOUND_SYSTEM_CPU(XTAL_14_31818MHz/4) /* verified on pcb */
SEIBU_SOUND_SYSTEM_ENCRYPTED_LOW()
MCFG_QUANTUM_PERFECT_CPU("maincpu")
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16)
MCFG_SCREEN_UPDATE_DRIVER(cshooter_state, screen_update_airraid)
MCFG_SCREEN_PALETTE("palette")
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_PALETTE_ADD("palette", 0x100)
MCFG_PALETTE_FORMAT(xxxxBBBBGGGGRRRR)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", cshooter)
MCFG_AIRRAID_VIDEO_ADD("airraid_vid")
/* sound hardware */
SEIBU_AIRRAID_SOUND_SYSTEM_YM2151_INTERFACE(XTAL_14_31818MHz/4)
@ -692,41 +425,41 @@ ROM_START( airraid )
ROM_LOAD( "5.6f", 0x00000, 0x02000, CRC(30be398c) SHA1(6c61200ee8888d6270c8cec50423b3b5602c2027) )
ROM_LOAD( "4.7f", 0x10000, 0x08000, CRC(3cd715b4) SHA1(da735fb5d262908ddf7ed7dacdea68899f1723ff) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) // TX Layer
ROM_LOAD( "3.13e", 0x00000, 0x02000, CRC(672ec0e8) SHA1(a11cd90d6494251ceee3bc7c72f4e7b1580b77e2) )
ROM_REGION( 0x100, "tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different proms when compared to the cshootert hardware PCB where they were dumped
ROM_LOAD( "pr.c19", 0x0000, 0x0200, NO_DUMP )
ROM_LOAD( "6308.a13", 0x0000, 0x0100, NO_DUMP )
ROM_REGION( 0x02000, "airraid_vid:tx_gfx", 0 ) // TX Layer
ROM_LOAD( "3.13e", 0x00000, 0x02000, CRC(672ec0e8) SHA1(a11cd90d6494251ceee3bc7c72f4e7b1580b77e2) )
ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
/* ### MODULE 1 ### Background generation / graphics */
ROM_REGION( 0x40000, "bg_map", 0 )
ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "bg_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:bg_gfx", 0 )
ROM_LOAD16_BYTE( "bg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "bg_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 2 ### Foreground generation / graphics */
ROM_REGION( 0x40000, "fg_map", 0 )
ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "fg_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:fg_gfx", 0 )
ROM_LOAD16_BYTE( "fg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "fg_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 3 ### Sprite graphics */
ROM_REGION( 0x40000, "spr_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "spr_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:spr_clut", 0 )
ROM_LOAD( "spr_clut", 0x000, 0x100, NO_DUMP )
ROM_END
@ -775,52 +508,53 @@ ROM_START( cshooter )
ROM_LOAD( "5.6f", 0x00000, 0x02000, CRC(30be398c) SHA1(6c61200ee8888d6270c8cec50423b3b5602c2027) ) // 5.g6
ROM_LOAD( "4.7f", 0x10000, 0x08000, CRC(3cd715b4) SHA1(da735fb5d262908ddf7ed7dacdea68899f1723ff) ) // 4.g8
ROM_REGION( 0x02000, "tx_gfx", 0 ) // TX Layer
ROM_LOAD( "3.f11", 0x00000, 0x02000, CRC(67b50a47) SHA1(b1f4aefc9437edbeefba5371149cc08c0b55c741) )
ROM_REGION( 0x100, "tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
ROM_REGION( 0x0200, "proms", 0 ) // this PCB type has different proms when compared to the cshootert hardware PCB where they were dumped
ROM_LOAD( "pr.c19", 0x0000, 0x0200, NO_DUMP )
ROM_LOAD( "6308.a13", 0x0000, 0x0100, NO_DUMP )
ROM_REGION( 0x02000, "airraid_vid:tx_gfx", 0 ) // TX Layer
ROM_LOAD( "3.f11", 0x00000, 0x02000, CRC(67b50a47) SHA1(b1f4aefc9437edbeefba5371149cc08c0b55c741) )
ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 ) // taken from cshootert, not verified for this PCB
ROM_LOAD( "63s281.d16", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
/* ### MODULE 1 ### Background generation / graphics */
ROM_REGION( 0x40000, "bg_map", 0 )
ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "bg_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:bg_gfx", 0 )
ROM_LOAD16_BYTE( "bg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "bg_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 2 ### Foreground generation / graphics */
ROM_REGION( 0x40000, "fg_map", 0 )
ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "fg_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:fg_gfx", 0 )
ROM_LOAD16_BYTE( "fg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "fg_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 3 ### Sprite graphics */
ROM_REGION( 0x40000, "spr_gfx", 0 )
ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "spr_clut", 0 )
ROM_REGION( 0x100, "airraid_vid:spr_clut", 0 )
ROM_LOAD( "spr_clut", 0x000, 0x100, NO_DUMP )
ROM_END
DRIVER_INIT_MEMBER(cshooter_state, cshooter)
DRIVER_INIT_MEMBER(airraid_state, cshooter)
{
membank("bank1")->configure_entries(0, 4, memregion("maindata")->base(), 0x4000);
}
DRIVER_INIT_MEMBER(cshooter_state,cshootere)
DRIVER_INIT_MEMBER(airraid_state,cshootere)
{
UINT8 *rom = memregion("maincpu")->base();
@ -853,8 +587,7 @@ DRIVER_INIT_MEMBER(cshooter_state,cshootere)
}
GAME( 1987, cshooter, airraid, airraid_crypt, airraid, cshooter_state, cshootere, ROT270, "Seibu Kaihatsu (J.K.H. license)", "Cross Shooter (Single PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
GAME( 1987, airraid, 0, airraid_crypt, airraid, cshooter_state, cshootere, ROT270, "Seibu Kaihatsu", "Air Raid (Single PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
// There's also an undumped International Games version
GAME( 1987, cshooter, airraid, airraid_crypt, airraid, airraid_state, cshootere, ROT270, "Seibu Kaihatsu (J.K.H. license)", "Cross Shooter (Single PCB)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1987, airraid, 0, airraid_crypt, airraid, airraid_state, cshootere, ROT270, "Seibu Kaihatsu", "Air Raid (Single PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )

View File

@ -4,6 +4,17 @@
*** STREET FIGHT hardware *** This has been adapted from the excellent
***************************** Psychic 5 description (by Roberto Ventura)
Notes: Lower Board - CPU board S-0086-002-B0 (both games)
Top Board - GFX board S-0086-002A-A0 (Street Fight)
Top Board - GFX board S-0087-807 (Cross Shooter)
for the single PCB version of Air Raid / Cross Shooter on the S-0087-011A-0 PCB,
see airraid.cpp
---
Street Fight (c) Seibu Kaihatsu (1986)
@ -180,8 +191,6 @@ colors on screen.
Each color component (RGB) depth is 4 bits, two bytes $100 apart are used
for each color code (12 bits).
format: unknown - probably RRRRGGGG - 0000BBBB
I suspect that the colors are organized in sub-palettes, since the graphics
layers are all 4 bits (16 colors) each. Each of the text/graphics layers
have 'attribute' bytes associated with them that would define the palette
@ -190,14 +199,16 @@ usage for each character/tile.
The 16 colours at offset $C0 appear to be the text palette. This group of
colours does not appear to change throughout the game, and the lower 192
colours fade in/out independently of these 16 - consistent with observations
of the real game. You'd think then that the palette would be reaonably
easy to deduce from the text video ram attribute byte - go ahead and try! :P
The mapping of graphics pixels to palette similarly escapes me, though I
must admit I haven't exhausted all avenues of investigation just yet!
of the real game.
There is a related mystery with the transparency colour. For the most part
colour 15 corresponds to the transparent colour, except in a few cases.
(for some Seibu PCB types transparency is handled by bit 0x40 in the CLUT
PROMs, but not here, unless they've been dumped incorrectly)
-----
Notes below are for Street Fight video board only
6) TILE-BASED LAYERS
@ -232,7 +243,6 @@ conventional RAM. See the memory map for sprite data format.
****************************************************************************
TODO:
- palette is incorporated - fix!!!
- handle transparency in text layer properly (how?)
- second bank of sf02 is this used? (probably NOT)
- stfight/empcity YM2203s should be clocked at 1.5MHz but this results in
@ -254,8 +264,8 @@ TODO:
static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM, 8, stfight_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") /* sf02.bin */
AM_RANGE(0xc000, 0xc0ff) AM_RAM_DEVWRITE("palette", palette_device, write_indirect) AM_SHARE("palette")
AM_RANGE(0xc100, 0xc1ff) AM_RAM_DEVWRITE("palette", palette_device, write_indirect_ext) AM_SHARE("palette_ext")
AM_RANGE(0xc000, 0xc0ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0xc100, 0xc1ff) AM_RAM_DEVWRITE("palette", palette_device, write_ext) AM_SHARE("palette_ext")
AM_RANGE(0xc200, 0xc200) AM_READ_PORT("P1")
AM_RANGE(0xc201, 0xc201) AM_READ_PORT("P2")
AM_RANGE(0xc202, 0xc202) AM_READ_PORT("START")
@ -267,26 +277,34 @@ static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM, 8, stfight_state )
AM_RANGE(0xc700, 0xc700) AM_WRITE(stfight_coin_w)
AM_RANGE(0xc804, 0xc804) AM_WRITE(stfight_io_w)
AM_RANGE(0xc806, 0xc806) AM_WRITENOP /* TBD */
AM_RANGE(0xc807, 0xc807) AM_WRITE(stfight_sprite_bank_w)
AM_RANGE(0xd000, 0xd3ff) AM_RAM_WRITE(stfight_text_char_w) AM_SHARE("text_char_ram")
AM_RANGE(0xd400, 0xd7ff) AM_RAM_WRITE(stfight_text_attr_w) AM_SHARE("text_attr_ram")
AM_RANGE(0xd800, 0xd808) AM_WRITE(stfight_vh_latch_w) AM_SHARE("vh_latch_ram")
AM_RANGE(0xe000, 0xefff) AM_RAM
AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("sprite_ram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( stfight_cpu1_map, AS_PROGRAM, 8, stfight_state )
AM_RANGE(0xc807, 0xc807) AM_DEVWRITE("stfight_vid", stfight_video_device, stfight_sprite_bank_w)
AM_RANGE(0xd000, 0xd7ff) AM_RAM_DEVWRITE("stfight_vid", stfight_video_device, stfight_text_char_w) AM_SHARE("txram")
AM_RANGE(0xd800, 0xd808) AM_RAM_DEVWRITE("stfight_vid", stfight_video_device, stfight_vh_latch_w) AM_SHARE("vregs")
AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE("sprite_ram")
AM_IMPORT_FROM(cpu1_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, stfight_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes")
ADDRESS_MAP_END
static ADDRESS_MAP_START( cshooter_cpu1_map, AS_PROGRAM, 8, stfight_state )
AM_RANGE(0xc801, 0xc801) AM_WRITE(stfight_bank_w)
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(cshooter_text_w) AM_SHARE("tx_vram")
AM_RANGE(0xd000, 0xd7ff) AM_RAM_DEVWRITE("airraid_vid", airraid_video_device, txram_w) AM_SHARE("txram")
AM_RANGE(0xd800, 0xd80f) AM_RAM_DEVWRITE("airraid_vid", airraid_video_device, vregs_w) AM_SHARE("vregs") // wrong?
AM_RANGE(0xe000, 0xfdff) AM_RAM
AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("sprite_ram")
AM_IMPORT_FROM(cpu1_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8, stfight_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ym1", ym2203_device, read, write)
@ -433,115 +451,15 @@ static INPUT_PORTS_START( cshooter )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" )
INPUT_PORTS_END
/* text-layer characters */
static const gfx_layout charlayout =
{
8,8, /* 8*8 pixels */
512, /* 512 characters */
2, /* 2 bits per pixel */
{ 4, 0 },
{ 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
8*16 /* every char takes 16 consecutive bytes */
};
static const gfx_layout cshooter_charlayout =
{
8,8, /* 8*8 characters */
RGN_FRAC(1,1), /* 512 characters */
2, /* 4 bits per pixel */
{ 0,4 },
{ 8,9,10,11,0,1,2,3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
128*1
};
/* foreground tiles */
static const gfx_layout fglayout =
{
16,16, /* 16*16 pixels */
1024, /* 1024 tiles */
4, /* 4 bits per pixel */
{ 64*1024*8+0, 64*1024*8+4, 0, 4 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
32*8+0, 32*8+1, 32*8+ 2, 32*8+ 3,
32*8+8, 32*8+9, 32*8+10, 32*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
64*8 /* every char takes 64 consecutive bytes */
};
/*
* The background tiles are interleaved in banks of 2
* - so we need to create two separate layout structs
* to handle them properly with tilemaps
*/
/* background tiles */
static const gfx_layout bglayout =
{
16,16, /* 16*16 pixels */
512, /* 512 tiles */
4, /* 4 bits per pixel */
{ 64*1024*8+4, 64*1024*8+0, 4, 0 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
64*8+0, 64*8+1, 64*8+ 2, 64*8+ 3,
64*8+8, 64*8+9, 64*8+10, 64*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
128*8 /* every tile takes 64/128 consecutive bytes */
};
/* sprites */
static const gfx_layout spritelayout =
{
16,16, /* 16*16 pixels */
1024, /* 1024 sprites */
4, /* 4 bits per pixel */
{ 64*1024*8+0, 64*1024*8+4, 0, 4 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
32*8+0, 32*8+1, 32*8+ 2, 32*8+ 3,
32*8+8, 32*8+9, 32*8+10, 32*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
64*8 /* every sprite takes 64 consecutive bytes */
};
static GFXDECODE_START( stfight )
GFXDECODE_ENTRY( "tx_gfx", 0x0000, charlayout, 0, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0x0000, fglayout, 16*16, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0000, bglayout, 16*16+16*16, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0020, bglayout, 16*16+16*16, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0x0000, spritelayout, 16*16+16*16+16*16, 16 )
GFXDECODE_END
static GFXDECODE_START( cshooter )
GFXDECODE_ENTRY( "tx_gfx", 0x0000, cshooter_charlayout,0, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0x0000, fglayout, 16*16, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0000, bglayout, 16*16+16*16, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0020, bglayout, 16*16+16*16, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0x0000, spritelayout, 16*16+16*16+16*16, 16 )
GFXDECODE_END
static MACHINE_CONFIG_START( stfight, stfight_state )
static MACHINE_CONFIG_START( stfight_base, stfight_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz / 4)
MCFG_CPU_PROGRAM_MAP(cpu1_map)
MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", stfight_state, stfight_vb_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("stfight_vid:screen", stfight_state, stfight_vb_interrupt)
MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz / 4)
MCFG_CPU_PROGRAM_MAP(cpu2_map)
@ -552,21 +470,8 @@ static MACHINE_CONFIG_START( stfight, stfight_state )
MCFG_QUANTUM_TIME(attotime::from_hz(600))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(stfight_state, screen_update_stfight)
MCFG_SCREEN_PALETTE("palette")
MCFG_VIDEO_START_OVERRIDE(stfight_state,stfight)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", stfight)
MCFG_PALETTE_ADD("palette", 16*16+16*16+16*16+16*16)
MCFG_PALETTE_INDIRECT_ENTRIES(256)
MCFG_PALETTE_ADD("palette", 256)
MCFG_PALETTE_FORMAT(xxxxBBBBRRRRGGGG)
MCFG_PALETTE_INIT_OWNER(stfight_state, stfight)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@ -590,30 +495,22 @@ static MACHINE_CONFIG_START( stfight, stfight_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( stfight, stfight_base )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(stfight_cpu1_map)
MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map)
MCFG_CPU_VBLANK_INT_DRIVER("stfight_vid:screen", stfight_state, stfight_vb_interrupt)
static MACHINE_CONFIG_DERIVED( cshooter, stfight )
MCFG_CPU_REPLACE("maincpu", Z80, XTAL_12MHz / 2)
MCFG_STFIGHT_VIDEO_ADD("stfight_vid")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( cshooter, stfight_base )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(cshooter_cpu1_map)
MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_DECRYPTED_OPCODES)
MCFG_CPU_VBLANK_INT_DRIVER("screen", stfight_state, stfight_vb_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("airraid_vid:screen", stfight_state, stfight_vb_interrupt)
MCFG_CPU_REPLACE("audiocpu", Z80, XTAL_12MHz / 2)
MCFG_CPU_PROGRAM_MAP(cpu2_map)
MCFG_CPU_PERIODIC_INT_DRIVER(stfight_state, irq0_line_hold, 120)
MCFG_QUANTUM_TIME(attotime::from_hz(600))
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(stfight_state, screen_update_cshooter)
MCFG_GFXDECODE_MODIFY("gfxdecode", cshooter)
MCFG_VIDEO_START_OVERRIDE(stfight_state,cshooter)
MCFG_SOUND_MODIFY("ym1")
MCFG_SOUND_CLOCK(XTAL_12MHz / 8)
MCFG_SOUND_MODIFY("ym2")
MCFG_SOUND_CLOCK(XTAL_12MHz / 8)
MCFG_AIRRAID_VIDEO_ADD("airraid_vid")
MACHINE_CONFIG_END
@ -635,47 +532,47 @@ ROM_START( empcity )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "empcityu_68705.3j", 0x0000, 0x0800, CRC(182f7616) SHA1(38b4f23a559ae13f8ca1b974407a2a40fc52879f) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -697,47 +594,47 @@ ROM_START( empcityu )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "empcityu_68705.3j", 0x0000, 0x0800, CRC(182f7616) SHA1(38b4f23a559ae13f8ca1b974407a2a40fc52879f) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "vid.2p", 0x0000, 0x2000, CRC(15593793) SHA1(ac9ca8a0aa0ce3810f45aa41e74d4946ecced245) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -762,47 +659,47 @@ ROM_START( empcityj )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "empcityj_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(19bdb0a9) SHA1(6baba9a46d64ae8349c7e9713419141f76a7af96) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -824,47 +721,47 @@ ROM_START( stfight )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "stfight_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -888,47 +785,47 @@ ROM_START( stfighta )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "stfight_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -950,47 +847,47 @@ ROM_START( empcityi ) // very similar to above set
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "empcityi_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(b1817d44) SHA1(395aad763eb054514f658a14c12b92c1b90c02ce) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -1012,47 +909,47 @@ ROM_START( stfightgb )
ROM_REGION( 0x0800, "mcu", 0 )
ROM_LOAD( "stfightgb_68705.3J", 0x0000, 0x0800, BAD_DUMP CRC(3b1b2660) SHA1(8d5d853a0861ff9cdea27eb3588586b441cc77b1) ) //hand-crafted, to be dumped
ROM_REGION( 0x02000, "tx_gfx", 0 ) /* character data */
ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */
ROM_LOAD( "17.2N", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) )
ROM_REGION( 0x20000, "fg_gfx", 0 ) /* foreground tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */
ROM_LOAD( "7.4C", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) )
ROM_LOAD( "8.5C", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) )
ROM_LOAD( "5.2C", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) )
ROM_LOAD( "6.3C", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) )
ROM_REGION( 0x20000, "bg_gfx", 0 ) /* background tile pixel data */
ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */
ROM_LOAD( "13.4C", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) )
ROM_LOAD( "14.5J", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) )
ROM_LOAD( "11.2J", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) )
ROM_LOAD( "12.3J", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) )
ROM_REGION( 0x20000, "spr_gfx", 0 ) /* sprite data */
ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */
ROM_LOAD( "20.8W", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) )
ROM_LOAD( "21.9W", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) )
ROM_LOAD( "18.6W", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) )
ROM_LOAD( "19.7W", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) )
ROM_REGION( 0x10000, "fg_map", 0 ) /* foreground map data */
ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */
ROM_LOAD( "9.7C", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) )
ROM_LOAD( "10.8C", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) )
ROM_REGION( 0x10000, "bg_map", 0 ) /* background map data */
ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */
ROM_LOAD( "15.7J", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) )
ROM_LOAD( "16.8J", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) )
ROM_REGION( 0x0100, "tx_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 )
ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */
ROM_REGION( 0x0100, "fg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */
ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) )
ROM_REGION( 0x0100, "bg_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */
ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) )
ROM_REGION( 0x0100, "spr_clut", 0 )
ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 )
ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */
ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) )
@ -1083,13 +980,6 @@ TB 4E 82S129 2.BPR 00DC [ motion objects ]
TB 16A 63S281 x x [ clut ] NOTE: dumped much later
LB 3J 68705
Notes: LB - CPU board S-0086-002-0B
TB - GFX board S-0087-807
The PCB looks like a prototype, due to the modifications
to the PCB. The game is probably licensed from Seibu.
The 0/1/2 bipolar PROMs are not used for colour.
However, this contradicts Guru's findings: "If I short some of the pins(of 0.bpr at 7A)
@ -1128,45 +1018,48 @@ ROM_START( cshootert )
ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "crshooter.3j", 0x0000, 0x0800, CRC(aae61ce7) SHA1(bb2b9887ec73a5b82604b9b64c533c2242d20d0f) )
ROM_REGION( 0x02000, "tx_gfx", 0 ) // TX Layer
ROM_LOAD( "r3.11a", 0x00000, 0x02000, CRC(67b50a47) SHA1(b1f4aefc9437edbeefba5371149cc08c0b55c741) )
ROM_REGION( 0x100, "tx_clut", 0 )
ROM_LOAD( "63s281.16a", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
/* ### MODULE 1 ### Background generation / graphics */
ROM_REGION( 0x40000, "bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "bg_gfx", 0 )
ROM_LOAD16_BYTE( "bg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 2 ### Foreground generation / graphics */
ROM_REGION( 0x40000, "fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "fg_gfx", 0 )
ROM_LOAD16_BYTE( "fg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 3 ### Sprite graphics */
ROM_REGION( 0x40000, "spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "spr_clut", 0 )
ROM_LOAD( "spr_clut", 0x000, 0x100, NO_DUMP )
ROM_REGION( 0x820, "proms", 0 )
ROM_LOAD( "82s129.9s", 0x0500, 0x0100, CRC(cf14ba30) SHA1(3284b6809075756b3c8e07d9705fc7eacb7556f1) ) // timing? (not used)
ROM_LOAD( "82s129.4e", 0x0600, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used)
ROM_LOAD( "82s123.7a", 0x0800, 0x0020, CRC(93e2d292) SHA1(af8edd0cfe85f28ede9604cfaf4516d54e5277c9) ) // ? (not used)
// below are from the video board
ROM_REGION( 0x02000, "airraid_vid:tx_gfx", 0 ) // TX Layer
ROM_LOAD( "r3.11a", 0x00000, 0x02000, CRC(67b50a47) SHA1(b1f4aefc9437edbeefba5371149cc08c0b55c741) )
ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 )
ROM_LOAD( "63s281.16a", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut
/* ### MODULE 1 ### Background generation / graphics */
ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 )
ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "airraid_vid:bg_gfx", 0 )
ROM_LOAD16_BYTE( "bg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "bg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 )
ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 2 ### Foreground generation / graphics */
ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 )
ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x40000, "airraid_vid:fg_gfx", 0 )
ROM_LOAD16_BYTE( "fg_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "fg_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 )
ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP )
/* ### MODULE 3 ### Sprite graphics */
ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 )
ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP )
ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP )
ROM_REGION( 0x100, "airraid_vid:spr_clut", 0 )
ROM_LOAD( "spr_clut", 0x000, 0x100, NO_DUMP )
ROM_END
// Note: Marked MACHINE_IMPERFECT_SOUND due to YM2203 clock issue
GAME( 1986, empcity, 0, stfight, stfight, stfight_state, empcity, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // different title logo
@ -1176,5 +1069,5 @@ GAME( 1986, stfight, empcity, stfight, stfight, stfight_state, stfight, ROT0,
GAME( 1986, stfighta, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu", "Street Fight (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1986, stfightgb,empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany - Benelux)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* Cross Shooter runs on a slightly modified PCB, with a different text tilemap and gfx blobs (see also airraid.c) */
/* Cross Shooter uses the same base board, but different video board */
GAME( 1987, cshootert, airraid, cshooter, cshooter, stfight_state, cshooter, ROT270, "Seibu Kaihatsu (Taito license)", "Cross Shooter (2 PCB Stack)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -1,6 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:Mark McDougall
#include "sound/msm5205.h"
#include "video/stfight_dev.h"
#include "video/airraid_dev.h"
class stfight_state : public driver_device
{
@ -16,28 +18,21 @@ public:
m_audiocpu(*this, "audiocpu"),
m_mcu(*this, "mcu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_text_char_ram(*this, "text_char_ram"),
m_text_attr_ram(*this, "text_attr_ram"),
m_tx_vram(*this, "tx_vram"),
m_vh_latch_ram(*this, "vh_latch_ram"),
m_sprite_ram(*this, "sprite_ram"),
m_decrypted_opcodes(*this, "decrypted_opcodes") { }
m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_stfight_video(*this, "stfight_vid"),
m_airraid_video(*this, "airraid_vid")
{ }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_mcu;
required_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_shared_ptr<UINT8> m_text_char_ram;
optional_shared_ptr<UINT8> m_text_attr_ram;
optional_shared_ptr<UINT8> m_tx_vram;
required_shared_ptr<UINT8> m_vh_latch_ram;
required_shared_ptr<UINT8> m_sprite_ram;
optional_shared_ptr<UINT8> m_decrypted_opcodes;
optional_device<stfight_video_device> m_stfight_video;
optional_device<airraid_video_device> m_airraid_video;
UINT8 *m_decrypt;
UINT8 m_fm_data;
@ -49,10 +44,6 @@ public:
UINT8 m_adpcm_reset;
UINT8 m_coin_state;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
tilemap_t *m_tx_tilemap;
int m_sprite_base;
DECLARE_WRITE_LINE_MEMBER(stfight_adpcm_int);
@ -67,31 +58,15 @@ public:
DECLARE_WRITE8_MEMBER(stfight_mcu_w);
DECLARE_WRITE8_MEMBER(stfight_bank_w);
DECLARE_WRITE8_MEMBER(stfight_text_char_w);
DECLARE_WRITE8_MEMBER(stfight_text_attr_w);
DECLARE_WRITE8_MEMBER(stfight_sprite_bank_w);
DECLARE_WRITE8_MEMBER(stfight_vh_latch_w);
DECLARE_WRITE8_MEMBER(cshooter_text_w);
DECLARE_READ8_MEMBER(stfight_fm_r);
TILEMAP_MAPPER_MEMBER(fg_scan);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILEMAP_MAPPER_MEMBER(bg_scan);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILE_GET_INFO_MEMBER(get_cshooter_tx_tile_info);
DECLARE_VIDEO_START(stfight);
DECLARE_VIDEO_START(cshooter);
virtual void machine_start() override;
virtual void machine_reset() override;
DECLARE_PALETTE_INIT(stfight);
UINT32 screen_update_stfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_cshooter(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(stfight_vb_interrupt);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void cshooter_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
/*
MCU specifics

View File

@ -82,7 +82,6 @@ void stfight_state::machine_start()
save_item(NAME(m_adpcm_nibble));
save_item(NAME(m_adpcm_reset));
save_item(NAME(m_coin_state));
save_item(NAME(m_sprite_base));
save_item(NAME(m_portA_out));
save_item(NAME(m_portA_in));
save_item(NAME(m_portB_out));
@ -94,6 +93,7 @@ void stfight_state::machine_start()
save_item(NAME(m_ddrC));
}
void stfight_state::machine_reset()
{
m_fm_data = 0;

View File

@ -10285,7 +10285,7 @@ psattack // 2004 Uniana
topbladv // 2002 Sonokong. Top Blade V
trivrus // 2009 AGT. Trivia R Us
@source:cshooter.cpp
@source:airraid.cpp
airraid // (c) 1987 Seibu Kaihatsu
cshooter // (c) 1987 JKH (bootleg)

View File

@ -0,0 +1,261 @@
// license:BSD-3-Clause
// copyright-holders:Tomasz Slanina, Angelo Salese, hap, David Haywood
/* There are 2 versions of the Air Raid / Cross Shooter hardware, one has everything integrated on a single PCB
the other is a Air Raid specific video PCB used with the Street Fight motherboard, there could be differences.
This is very similar to Dark Mist */
#include "emu.h"
#include "airraid_dev.h"
extern const device_type AIRRAID_VIDEO = &device_creator<airraid_video_device>;
airraid_video_device::airraid_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, AIRRAID_VIDEO, "Seibu Air Raid Video", tag, owner, clock, "airraid_vid", __FILE__),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "^palette"),
m_screen(*this, "screen"),
m_tx_clut(*this, "tx_clut"),
m_fg_clut(*this, "fg_clut"),
m_bg_clut(*this, "bg_clut"),
m_spr_clut(*this, "spr_clut"),
m_fgmap(*this, "fg_map"),
m_bgmap(*this, "bg_map"),
m_sprite_ram(*this, "^sprite_ram"),
m_txram(*this,"^txram"),
m_vregs(*this,"^vregs"),
m_hw(0x09)
{
}
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
RGN_FRAC(1,1), /* 512 characters */
2, /* 4 bits per pixel */
{ 0,4 },
{ 8,9,10,11,0,1,2,3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
128*1
};
static const gfx_layout char16layout =
{
16,16, /* 8*8 characters */
RGN_FRAC(1,1), /* 512 characters */
4, /* 4 bits per pixel */
{ 0,4,8,12 },
{ 0,1,2,3, 16,17,18,19, 512+0,512+1,512+2,512+3, 512+16,512+17,512+18,512+19},
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*32
};
static GFXDECODE_START( cshooter )
GFXDECODE_ENTRY( "tx_gfx", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0, char16layout, 0, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0, char16layout, 0, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0, char16layout, 0, 16 )
GFXDECODE_END
static MACHINE_CONFIG_FRAGMENT( airraid_vid )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16)
MCFG_SCREEN_UPDATE_DRIVER(airraid_video_device, screen_update_airraid)
MCFG_SCREEN_PALETTE("^palette")
MCFG_GFXDECODE_ADD("gfxdecode", "^palette", cshooter)
MACHINE_CONFIG_END
machine_config_constructor airraid_video_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( airraid_vid );
}
void airraid_video_device::device_start()
{
save_item(NAME(m_hw));
// there might actually be 4 banks of 2048 x 16 tilemaps in here as the upper scroll bits are with the rom banking.
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(airraid_video_device::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(airraid_video_device::bg_scan),this),16,16,2048, 64);
// which could in turn mean this is actually 256 x 128, not 256 x 512
// m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(airraid_video_device::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(airraid_video_device::fg_scan),this),16,16,256, 512);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(airraid_video_device::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(airraid_video_device::fg_scan),this),16,16,256, 128);
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(airraid_video_device::get_cstx_tile_info),this),TILEMAP_SCAN_ROWS, 8,8,32,32);
// m_fg_tilemap->set_transparent_pen(0);
// m_tx_tilemap->set_transparent_pen(0);
// we do manual mixing using a temp bitmap
m_screen->register_screen_bitmap(m_temp_bitmap);
}
void airraid_video_device::device_reset()
{
}
TILEMAP_MAPPER_MEMBER(airraid_video_device::bg_scan)
{
return ((row&0xf) * 0x10) + (col&0xf) + (((col&0x7f0) >> 4)*0x100) + ((row & 0x30)>>4) * 0x8000;
}
TILEMAP_MAPPER_MEMBER(airraid_video_device::fg_scan)
{
return ((row&0xf) * 0x10) + (col&0xf) + (((col&0x0f0) >> 4)*0x100) + ((row & 0x1f0)>>4) * 0x1000;
}
TILE_GET_INFO_MEMBER(airraid_video_device::get_bg_tile_info)
{
int tile = m_bgmap[(tile_index*2)+1] & 0xff;
int attr = m_bgmap[(tile_index*2)+0] & 0xff;
tile |= (attr & 0x70) << 4;
SET_TILE_INFO_MEMBER(2,
tile,
attr&0xf,
0);
}
TILE_GET_INFO_MEMBER(airraid_video_device::get_fg_tile_info)
{
int tile = m_fgmap[(tile_index*2)+1] & 0xff;
int attr = m_fgmap[(tile_index*2)+0] & 0xff;
tile |= (attr & 0x70) << 4;
SET_TILE_INFO_MEMBER(3,
tile,
attr&0xf,
0);
}
TILE_GET_INFO_MEMBER(airraid_video_device::get_cstx_tile_info)
{
int code = (m_txram[tile_index*2]);
int attr = (m_txram[tile_index*2+1]);
int color = attr & 0xf;
SET_TILE_INFO_MEMBER(0, (code << 1) | ((attr & 0x20) >> 5), color, 0);
}
void airraid_video_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int i = 0x200 - 4; i >= 0 ; i -= 4)
{
if (m_sprite_ram[i+1]&0x80)
continue;
UINT16 tile = (m_sprite_ram[i]);
tile |= (m_sprite_ram[i + 1] & 0x70) << 4;
UINT16 col = (m_sprite_ram[i+1] & 0x0f);
//col |= (m_sprite_ram[i+1] & 0x80)<<3;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, tile,col, 0, 0, m_sprite_ram[i+3],m_sprite_ram[i+2],0);
}
}
#define DISPLAY_SPR 1
#define DISPLAY_FG 2
#define DISPLAY_BG 4
#define DISPLAY_TXT 8
#define DM_GETSCROLL(n) (((m_vregs[(n)]<<1)&0xff) + ((m_vregs[(n)]&0x80)?1:0) +( ((m_vregs[(n)-1]<<4) | (m_vregs[(n)-1]<<12) )&0xff00))
void airraid_video_device::mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* clut, int base)
{
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT16 *dest = &bitmap.pix16(y);
UINT16 *src = &m_temp_bitmap.pix16(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
UINT8 pix = src[x] & 0xff;
UINT8 real = clut[pix];
if (!(real & 0x40))
{
dest[x] = (real & 0x3f) + base;
}
}
}
}
UINT32 airraid_video_device::screen_update_airraid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
UINT16 bgscrolly = DM_GETSCROLL(0x6);
// this is more likely to be 'bank' than scroll, like NMK16
bgscrolly += ((m_hw & 0xc0) >> 6) * 256;
m_bg_tilemap->set_scrollx(0, DM_GETSCROLL(0x2));
m_bg_tilemap->set_scrolly(0, bgscrolly);
m_fg_tilemap->set_scrollx(0, DM_GETSCROLL(0xa));
m_fg_tilemap->set_scrolly(0, DM_GETSCROLL(0xe));
// draw screen
bitmap.fill(0x80, cliprect); // temp
// m_temp_bitmap.fill(0x00, cliprect);
if ((m_hw & DISPLAY_BG) == 0x00)
{
m_bg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_bg_clut, 0x80);
}
if ((m_hw & DISPLAY_FG) == 0x00)
{
m_fg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_fg_clut, 0x00);
}
if (m_hw & DISPLAY_SPR)
{
m_temp_bitmap.fill(0x00, cliprect);
draw_sprites(m_temp_bitmap, cliprect); // technically this should draw manually because 0x40 in the prom is transparency and our code just assumes it to be 0.
mix_layer(screen, bitmap, cliprect, m_spr_clut, 0x40);
}
if (m_hw & DISPLAY_TXT)
{
m_tx_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_layer(screen, bitmap, cliprect, m_tx_clut, 0xc0);
}
return 0;
}
// public functions
WRITE8_MEMBER(airraid_video_device::txram_w)
{
m_txram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset/2);
}
WRITE8_MEMBER(airraid_video_device::vregs_w)
{
m_vregs[offset] = data;
if ((offset != 0x2) && (offset != 0x01) && (offset != 0xa) && (offset != 0x09) && (offset != 0xe) && (offset != 0x0d) )
printf("vregs_w %02x: %02x\n", offset, data);
}
void airraid_video_device::layer_enable_w(UINT8 enable)
{
m_hw = enable;
}

View File

@ -0,0 +1,75 @@
// license:BSD-3-Clause
// copyright-holders:Tomasz Slanina, Angelo Salese, hap, David Haywood
#pragma once
#ifndef __AIRRAID_VIDEO__
#define __AIRRAID_VIDEO__
extern const device_type AIRRAID_VIDEO;
#define MCFG_AIRRAID_VIDEO_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, AIRRAID_VIDEO, 0)
class airraid_video_device : public device_t
/* public device_video_interface */
{
public:
// construction/destruction
airraid_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_WRITE8_MEMBER(txram_w);
DECLARE_WRITE8_MEMBER(vregs_w);
void layer_enable_w(UINT8 enable);
UINT32 screen_update_airraid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual void device_start() override;
virtual void device_reset() override;
private:
// devices
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
// region pointers
required_region_ptr<UINT8> m_tx_clut;
required_region_ptr<UINT8> m_fg_clut;
required_region_ptr<UINT8> m_bg_clut;
required_region_ptr<UINT8> m_spr_clut;
required_region_ptr<UINT8> m_fgmap;
required_region_ptr<UINT8> m_bgmap;
// memory pointers
required_shared_ptr<UINT8> m_sprite_ram;
required_shared_ptr<UINT8> m_txram;
required_shared_ptr<UINT8> m_vregs;
// tilemaps
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_tx_tilemap;
TILEMAP_MAPPER_MEMBER(bg_scan);
TILEMAP_MAPPER_MEMBER(fg_scan);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_cstx_tile_info);
// internal variables
UINT16 m_hw;
// rendering / mixing
bitmap_ind16 m_temp_bitmap;
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* clut, int base);
};
#endif

View File

@ -1,365 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mark McDougall
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "includes/stfight.h"
/*
Graphics ROM Format
===================
Each tile is 8x8 pixels
Each composite tile is 2x2 tiles, 16x16 pixels
Each screen is 32x32 composite tiles, 64x64 tiles, 256x256 pixels
Each layer is a 4-plane bitmap 8x16 screens, 2048x4096 pixels
There are 4x256=1024 composite tiles defined for each layer
Each layer is mapped using 2 bytes/composite tile
- one byte for the tile
- one byte for the tile bank, attribute
- b7,b5 tile bank (0-3)
Each pixel is 4 bits = 16 colours.
*/
PALETTE_INIT_MEMBER(stfight_state, stfight)
{
UINT8 *color_prom = memregion("tx_clut")->base();
int i;
/* text uses colors 0xc0-0xff */
for (i = 0; i < 0x100; i++)
{
UINT8 ctabentry = (color_prom[i] & 0x3f) | 0xc0;
palette.set_pen_indirect(i, ctabentry);
}
color_prom = memregion("fg_clut")->base();
/* fg uses colors 0x40-0x7f */
for (i = 0x00; i < 0x100; i++)
{
UINT8 ctabentry = (color_prom[i] & 0x3f) | 0x40;
palette.set_pen_indirect(i+0x100, ctabentry);
}
color_prom = memregion("bg_clut")->base();
/* bg uses colors 0-0x3f */
for (i = 0x000; i < 0x100; i++)
{
UINT8 ctabentry = (color_prom[i] & 0x3f);
palette.set_pen_indirect(i+0x200, ctabentry);
}
color_prom = memregion("spr_clut")->base();
/* spr uses colors 0x80-0xbf */
for (i = 0x000; i < 0x100; i++)
{
UINT8 ctabentry = (color_prom[i] & 0x3f) | 0x80;
palette.set_pen_indirect(i+0x300, ctabentry);
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILEMAP_MAPPER_MEMBER(stfight_state::fg_scan)
{
/* logical (col,row) -> memory offset */
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x70) << 4) + ((row & 0xf0) << 7);
}
TILE_GET_INFO_MEMBER(stfight_state::get_fg_tile_info)
{
UINT8 *fgMap = memregion("fg_map")->base();
int attr,tile_base;
attr = fgMap[0x8000+tile_index];
tile_base = ((attr & 0x80) << 2) | ((attr & 0x20) << 3);
SET_TILE_INFO_MEMBER(1,
tile_base + fgMap[tile_index],
attr & 0x07,
0);
}
TILEMAP_MAPPER_MEMBER(stfight_state::bg_scan)
{
/* logical (col,row) -> memory offset */
return ((col & 0x0e) >> 1) + ((row & 0x0f) << 3) + ((col & 0x70) << 3) +
((row & 0x80) << 3) + ((row & 0x10) << 7) + ((col & 0x01) << 12) +
((row & 0x60) << 8);
}
TILE_GET_INFO_MEMBER(stfight_state::get_bg_tile_info)
{
UINT8 *bgMap = memregion("bg_map")->base();
int attr,tile_bank,tile_base;
attr = bgMap[0x8000+tile_index];
tile_bank = (attr & 0x20) >> 5;
tile_base = (attr & 0x80) << 1;
SET_TILE_INFO_MEMBER(2+tile_bank,
tile_base + bgMap[tile_index],
attr & 0x07,
0);
}
TILE_GET_INFO_MEMBER(stfight_state::get_tx_tile_info)
{
UINT8 attr = m_text_attr_ram[tile_index];
int color = attr & 0x0f;
tileinfo.group = color;
SET_TILE_INFO_MEMBER(0,
m_text_char_ram[tile_index] + ((attr & 0x80) << 1),
attr & 0x0f,
TILE_FLIPYX((attr & 0x60) >> 5));
}
TILE_GET_INFO_MEMBER(stfight_state::get_cshooter_tx_tile_info)
{
UINT8 tile = m_tx_vram[tile_index*2];
UINT8 attr = m_tx_vram[tile_index*2+1];
int color = attr & 0x0f;
tileinfo.group = color;
SET_TILE_INFO_MEMBER(0,
(tile << 1) | ((attr & 0x20) >> 5),
attr & 0x0f,
/*TILE_FLIPYX((attr & 0x60) >> 5)*/0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
VIDEO_START_MEMBER(stfight_state,stfight)
{
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_state::bg_scan),this),16,16,128,256);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_state::fg_scan),this),16,16,128,256);
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_tx_tile_info),this),TILEMAP_SCAN_ROWS, 8,8,32,32);
m_fg_tilemap->set_transparent_pen(0x0f);
m_tx_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0xcf);
}
VIDEO_START_MEMBER(stfight_state,cshooter)
{
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_state::bg_scan),this),16,16,128,256);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_state::fg_scan),this),16,16,128,256);
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_state::get_cshooter_tx_tile_info),this),TILEMAP_SCAN_ROWS, 8,8,32,32);
m_fg_tilemap->set_transparent_pen(0x0f);
m_tx_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0xcf);
}
/***************************************************************************
Memory handlers
***************************************************************************/
WRITE8_MEMBER(stfight_state::stfight_text_char_w)
{
m_text_char_ram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(stfight_state::stfight_text_attr_w)
{
m_text_attr_ram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(stfight_state::cshooter_text_w)
{
m_tx_vram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset/2);
}
WRITE8_MEMBER(stfight_state::stfight_sprite_bank_w)
{
m_sprite_base = ( ( data & 0x04 ) << 7 ) |
( ( data & 0x01 ) << 8 );
}
WRITE8_MEMBER(stfight_state::stfight_vh_latch_w)
{
int scroll;
m_vh_latch_ram[offset] = data;
switch( offset )
{
case 0x00:
case 0x01:
scroll = (m_vh_latch_ram[1] << 8) | m_vh_latch_ram[0];
m_fg_tilemap->set_scrollx(0,scroll);
break;
case 0x02:
case 0x03:
scroll = (m_vh_latch_ram[3] << 8) | m_vh_latch_ram[2];
m_fg_tilemap->set_scrolly(0,scroll);
break;
case 0x04:
case 0x05:
scroll = (m_vh_latch_ram[5] << 8) | m_vh_latch_ram[4];
m_bg_tilemap->set_scrollx(0,scroll);
break;
case 0x06:
case 0x08:
scroll = (m_vh_latch_ram[8] << 8) | m_vh_latch_ram[6];
m_bg_tilemap->set_scrolly(0,scroll);
break;
case 0x07:
m_tx_tilemap->enable(data & 0x80);
/* 0x40 = sprites */
m_bg_tilemap->enable(data & 0x20);
m_fg_tilemap->enable(data & 0x10);
flip_screen_set(data & 0x01);
break;
}
}
/***************************************************************************
Display refresh
***************************************************************************/
void stfight_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int offs,sx,sy;
for (offs = 0;offs < 4096;offs += 32)
{
int code;
int attr = m_sprite_ram[offs+1];
int flipx = attr & 0x10;
int color = attr & 0x0f;
int pri = (attr & 0x20) >> 5;
sy = m_sprite_ram[offs+2];
sx = m_sprite_ram[offs+3];
// non-active sprites have zero y coordinate value
if( sy > 0 )
{
// sprites which wrap onto/off the screen have
// a sign extension bit in the sprite attribute
if( sx >= 0xf0 )
{
if (attr & 0x80)
sx -= 0x100;
}
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
}
code = m_sprite_base + m_sprite_ram[offs];
m_gfxdecode->gfx(4)->prio_transpen(bitmap,cliprect,
code,
color,
flipx,flip_screen(),
sx,sy,
screen.priority(),
pri ? 0x02 : 0,0x0f);
}
}
}
UINT32 stfight_state::screen_update_stfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect); /* in case m_bg_tilemap is disabled */
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,1);
/* Draw sprites (may be obscured by foreground layer) */
if (m_vh_latch_ram[0x07] & 0x40)
draw_sprites(screen,bitmap,cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
}
void stfight_state::cshooter_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int i = m_sprite_ram.bytes() - 4; i >= 0 ; i -= 4)
{
if (m_sprite_ram[i+1]&0x80)
continue;
int attr = m_sprite_ram[i+1];
int flipx = attr & 0x10;
int color = attr & 0x0f;
int pri = (attr & 0x20) >> 5;
/* BCD debug code, to be removed in the end */
UINT8 tile_low = (m_sprite_ram[i]&0x0f);
UINT8 tile_high = ((m_sprite_ram[i]&0xf0)>>4);
tile_low += (tile_low > 0x9) ? 0x37 : 0x30;
tile_high += (tile_high > 0x9) ? 0x37 : 0x30;
m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, tile_high << 1, color, flipx, 0, m_sprite_ram[i+3],m_sprite_ram[i+2],screen.priority(),pri ? 0x02 : 0,0x00);
m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, tile_high << 1, color, flipx, 0, m_sprite_ram[i+3]+8,m_sprite_ram[i+2],screen.priority(),pri ? 0x02 : 0,0x00);
m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, tile_low << 1, color, flipx, 0, m_sprite_ram[i+3]+8,m_sprite_ram[i+2]+8,screen.priority(),pri ? 0x02 : 0,0x00);
m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, tile_low << 1, color, flipx, 0, m_sprite_ram[i+3],m_sprite_ram[i+2]+8,screen.priority(),pri ? 0x02 : 0,0x00);
}
}
UINT32 stfight_state::screen_update_cshooter(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect); /* in case m_bg_tilemap is disabled */
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,1);
/* Draw sprites (may be obscured by foreground layer) */
// if (m_vh_latch_ram[0x07] & 0x40)
cshooter_draw_sprites(screen,bitmap,cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
}

View File

@ -0,0 +1,387 @@
// license:BSD-3-Clause
// copyright-holders:Mark McDougall, David Haywood
// The Street Fight video appears to be 4 layers, very similar to Dark Mist and Air Raid, but at least without the CLUT transparency handling?
// which are presumably handled by the SEI0100BU chips on the other games (with the GFX inside the modules on Air Raid)
#include "emu.h"
#include "stfight_dev.h"
extern const device_type STFIGHT_VIDEO = &device_creator<stfight_video_device>;
stfight_video_device::stfight_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, STFIGHT_VIDEO, "Seibu Street Fight Video", tag, owner, clock, "stfight_vid", __FILE__),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this,"^palette"),
m_screen(*this, "screen"),
m_tx_clut(*this, "tx_clut"),
m_fg_clut(*this, "fg_clut"),
m_bg_clut(*this, "bg_clut"),
m_spr_clut(*this, "spr_clut"),
m_fgmap(*this,"fg_map"),
m_bgmap(*this,"bg_map"),
m_vregs(*this,"^vregs"),
m_sprite_ram(*this, "^sprite_ram"),
m_txram(*this, "^txram")
{
}
/* text-layer characters */
static const gfx_layout charlayout =
{
8,8, /* 8*8 pixels */
512, /* 512 characters */
2, /* 2 bits per pixel */
{ 4, 0 },
{ 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
8*16 /* every char takes 16 consecutive bytes */
};
/* foreground tiles */
static const gfx_layout fglayout =
{
16,16, /* 16*16 pixels */
1024, /* 1024 tiles */
4, /* 4 bits per pixel */
{ 64*1024*8+0, 64*1024*8+4, 0, 4 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
32*8+0, 32*8+1, 32*8+ 2, 32*8+ 3,
32*8+8, 32*8+9, 32*8+10, 32*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
64*8 /* every char takes 64 consecutive bytes */
};
/*
* The background tiles are interleaved in banks of 2
* - so we need to create two separate layout structs
* to handle them properly with tilemaps
*/
/* background tiles */
static const gfx_layout bglayout =
{
16,16, /* 16*16 pixels */
512, /* 512 tiles */
4, /* 4 bits per pixel */
{ 64*1024*8+4, 64*1024*8+0, 4, 0 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
64*8+0, 64*8+1, 64*8+ 2, 64*8+ 3,
64*8+8, 64*8+9, 64*8+10, 64*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
128*8 /* every tile takes 64/128 consecutive bytes */
};
/* sprites */
static const gfx_layout spritelayout =
{
16,16, /* 16*16 pixels */
1024, /* 1024 sprites */
4, /* 4 bits per pixel */
{ 64*1024*8+0, 64*1024*8+4, 0, 4 },
{ 0, 1, 2, 3,
8, 9, 10, 11,
32*8+0, 32*8+1, 32*8+ 2, 32*8+ 3,
32*8+8, 32*8+9, 32*8+10, 32*8+11 },
{ 0*8, 2*8, 4*8, 6*8,
8*8, 10*8, 12*8, 14*8,
16*8, 18*8, 20*8, 22*8,
24*8, 26*8, 28*8, 30*8 },
64*8 /* every sprite takes 64 consecutive bytes */
};
static GFXDECODE_START( stfight )
GFXDECODE_ENTRY( "tx_gfx", 0x0000, charlayout, 0, 16 )
GFXDECODE_ENTRY( "fg_gfx", 0x0000, fglayout, 0, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0000, bglayout, 0, 16 )
GFXDECODE_ENTRY( "bg_gfx", 0x0020, bglayout, 0, 16 )
GFXDECODE_ENTRY( "spr_gfx", 0x0000, spritelayout, 0, 32 )
GFXDECODE_END
static MACHINE_CONFIG_FRAGMENT( stfight_vid )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(stfight_video_device, screen_update_stfight)
MCFG_SCREEN_PALETTE("^palette")
MCFG_GFXDECODE_ADD("gfxdecode", "^palette", stfight)
MACHINE_CONFIG_END
machine_config_constructor stfight_video_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( stfight_vid );
}
/*
Graphics ROM Format
===================
Each tile is 8x8 pixels
Each composite tile is 2x2 tiles, 16x16 pixels
Each screen is 32x32 composite tiles, 64x64 tiles, 256x256 pixels
Each layer is a 4-plane bitmap 8x16 screens, 2048x4096 pixels
There are 4x256=1024 composite tiles defined for each layer
Each layer is mapped using 2 bytes/composite tile
- one byte for the tile
- one byte for the tile bank, attribute
- b7,b5 tile bank (0-3)
Each pixel is 4 bits = 16 colours.
*/
TILEMAP_MAPPER_MEMBER(stfight_video_device::fg_scan)
{
/* logical (col,row) -> memory offset */
return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x70) << 4) + ((row & 0xf0) << 7);
}
TILE_GET_INFO_MEMBER(stfight_video_device::get_fg_tile_info)
{
int attr,tile_base;
attr = m_fgmap[0x8000+tile_index];
tile_base = ((attr & 0x80) << 2) | ((attr & 0x20) << 3);
SET_TILE_INFO_MEMBER(1,
tile_base + m_fgmap[tile_index],
attr & 0x07,
0);
}
TILEMAP_MAPPER_MEMBER(stfight_video_device::bg_scan)
{
/* logical (col,row) -> memory offset */
return ((col & 0x0e) >> 1) + ((row & 0x0f) << 3) + ((col & 0x70) << 3) +
((row & 0x80) << 3) + ((row & 0x10) << 7) + ((col & 0x01) << 12) +
((row & 0x60) << 8);
}
TILE_GET_INFO_MEMBER(stfight_video_device::get_bg_tile_info)
{
int attr,tile_bank,tile_base;
attr = m_bgmap[0x8000+tile_index];
tile_bank = (attr & 0x20) >> 5;
tile_base = (attr & 0x80) << 1;
SET_TILE_INFO_MEMBER(2+tile_bank,
tile_base + m_bgmap[tile_index],
attr & 0x07,
0);
}
TILE_GET_INFO_MEMBER(stfight_video_device::get_tx_tile_info)
{
UINT8 attr = m_txram[tile_index+0x400];
int color = attr & 0x0f;
tileinfo.group = color;
SET_TILE_INFO_MEMBER(0,
m_txram[tile_index] + ((attr & 0x80) << 1),
attr & 0x0f,
TILE_FLIPYX((attr & 0x60) >> 5));
}
void stfight_video_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int offs, sx, sy;
for (offs = 4096 - 32;offs >= 0;offs -= 32)
{
int code;
int attr = m_sprite_ram[offs + 1];
int flipx = attr & 0x10;
int color = attr & 0x0f;
color |= (attr & 0x20) >> 1; // mix in priority bit
sy = m_sprite_ram[offs + 2];
sx = m_sprite_ram[offs + 3];
// non-active sprites have zero y coordinate value
if (sy > 0)
{
// sprites which wrap onto/off the screen have
// a sign extension bit in the sprite attribute
if (sx >= 0xf0)
{
if (attr & 0x80)
sx -= 0x100;
}
/*
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
}
*/
code = m_sprite_base + m_sprite_ram[offs];
m_gfxdecode->gfx(4)->transpen(bitmap, cliprect,
code,
color,
flipx, 0/*flip_screen()*/,
sx, sy,
0x0f);
}
}
}
UINT32 stfight_video_device::screen_update_stfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect); /* in case m_bg_tilemap is disabled */
m_temp_sprite_bitmap.fill(-1, cliprect);
draw_sprites(screen, m_temp_sprite_bitmap, cliprect);
m_temp_bitmap.fill(-1, cliprect);
m_bg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_txlayer(screen, bitmap, m_temp_bitmap, cliprect, m_bg_clut, 0x00, 0x00, 0x00, false);
if (m_vregs[0x07] & 0x40) mix_txlayer(screen, bitmap, m_temp_sprite_bitmap, cliprect, m_spr_clut, 0x80, 0x100, 0x100, false); // low priority sprites
m_temp_bitmap.fill(-1, cliprect);
m_fg_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_txlayer(screen, bitmap, m_temp_bitmap, cliprect, m_fg_clut, 0x40, 0x00, 0x00, false);
if (m_vregs[0x07] & 0x40) mix_txlayer(screen, bitmap, m_temp_sprite_bitmap, cliprect, m_spr_clut, 0x80, 0x100, 0x000, false); // high priority sprites
m_temp_bitmap.fill(-1, cliprect);
m_tx_tilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0);
mix_txlayer(screen, bitmap, m_temp_bitmap, cliprect, m_tx_clut, 0xc0, 0x00, 0x00, true);
//
return 0;
}
void stfight_video_device::mix_txlayer(screen_device &screen, bitmap_ind16 &bitmap, bitmap_ind16 &bitmap2, const rectangle &cliprect, UINT8* clut, int base, int mask, int condition, bool realcheck)
{
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT16 *dest = &bitmap.pix16(y);
UINT16 *src = &bitmap2.pix16(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
if (src[x] == -1)
continue;
if ((src[x] & mask) == condition)
{
UINT8 pix = src[x] & 0xff;
UINT8 real = clut[pix];
if (realcheck) // the text layer transparency appears to be 0xf *after* lookup
{
if ((real & 0x0f) != 0x0f)
{
dest[x] = (real & 0x3f) + base;
}
}
else if ((src[x] & 0xf) != 0xf) // other layers it's pre-lookup
{
dest[x] = (real & 0x3f) + base;
}
}
}
}
}
void stfight_video_device::device_start()
{
if(!m_gfxdecode->started())
throw device_missing_dependencies();
save_item(NAME(m_sprite_base));
m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_video_device::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_video_device::bg_scan),this),16,16,128,256);
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_video_device::get_fg_tile_info),this),tilemap_mapper_delegate(FUNC(stfight_video_device::fg_scan),this),16,16,128,256);
m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(stfight_video_device::get_tx_tile_info),this),TILEMAP_SCAN_ROWS, 8,8,32,32);
// we do manual mixing using a temp bitmap
m_screen->register_screen_bitmap(m_temp_sprite_bitmap);
m_screen->register_screen_bitmap(m_temp_bitmap);
}
void stfight_video_device::device_reset()
{
}
// public functions
WRITE8_MEMBER(stfight_video_device::stfight_text_char_w)
{
m_txram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset&0x3ff);
}
WRITE8_MEMBER(stfight_video_device::stfight_sprite_bank_w)
{
m_sprite_base = ( ( data & 0x04 ) << 7 ) |
( ( data & 0x01 ) << 8 );
}
WRITE8_MEMBER(stfight_video_device::stfight_vh_latch_w)
{
int scroll;
m_vregs[offset] = data;
switch( offset )
{
case 0x00:
case 0x01:
scroll = (m_vregs[1] << 8) | m_vregs[0];
m_fg_tilemap->set_scrollx(0,scroll);
break;
case 0x02:
case 0x03:
scroll = (m_vregs[3] << 8) | m_vregs[2];
m_fg_tilemap->set_scrolly(0,scroll);
break;
case 0x04:
case 0x05:
scroll = (m_vregs[5] << 8) | m_vregs[4];
m_bg_tilemap->set_scrollx(0,scroll);
break;
case 0x06:
case 0x08:
scroll = (m_vregs[8] << 8) | m_vregs[6];
m_bg_tilemap->set_scrolly(0,scroll);
break;
case 0x07:
m_tx_tilemap->enable(data & 0x80);
/* 0x40 = sprites */
m_bg_tilemap->enable(data & 0x20);
m_fg_tilemap->enable(data & 0x10);
//flip_screen_set(data & 0x01);
break;
}
}

View File

@ -0,0 +1,76 @@
// license:BSD-3-Clause
// copyright-holders:Mark McDougall, David Haywood
#pragma once
#ifndef __STFIGHT_VIDEO__
#define __STFIGHT_VIDEO__
extern const device_type STFIGHT_VIDEO;
#define MCFG_STFIGHT_VIDEO_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, STFIGHT_VIDEO, 0)
class stfight_video_device : public device_t
{
public:
// construction/destruction
stfight_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_WRITE8_MEMBER(stfight_text_char_w);
DECLARE_WRITE8_MEMBER(stfight_sprite_bank_w);
DECLARE_WRITE8_MEMBER(stfight_vh_latch_w);
UINT32 screen_update_stfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual void device_start() override;
virtual void device_reset() override;
private:
// devices
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
// region pointers
required_region_ptr<UINT8> m_tx_clut;
required_region_ptr<UINT8> m_fg_clut;
required_region_ptr<UINT8> m_bg_clut;
required_region_ptr<UINT8> m_spr_clut;
required_region_ptr<UINT8> m_fgmap;
required_region_ptr<UINT8> m_bgmap;
// memory pointers
required_shared_ptr<UINT8> m_vregs;
required_shared_ptr<UINT8> m_sprite_ram;
required_shared_ptr<UINT8> m_txram;
// tilemaps
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
tilemap_t *m_tx_tilemap;
TILEMAP_MAPPER_MEMBER(fg_scan);
TILEMAP_MAPPER_MEMBER(bg_scan);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
// internal variables
int m_sprite_base;
// rendering / mixing
bitmap_ind16 m_temp_bitmap;
bitmap_ind16 m_temp_sprite_bitmap;
void mix_txlayer(screen_device &screen, bitmap_ind16 &bitmap, bitmap_ind16 &bitmap2, const rectangle &cliprect, UINT8* clut, int base, int mask, int condition, bool realcheck);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
#endif