summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/r2dx_v33.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/r2dx_v33.c')
-rw-r--r--trunk/src/mame/drivers/r2dx_v33.c871
1 files changed, 871 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/r2dx_v33.c b/trunk/src/mame/drivers/r2dx_v33.c
new file mode 100644
index 00000000000..28569b6a2bc
--- /dev/null
+++ b/trunk/src/mame/drivers/r2dx_v33.c
@@ -0,0 +1,871 @@
+/*
+
+Raiden 2 / DX V33 Version
+
+Temporary split from raiden2.c, it'll be re-merged at some point.
+
+Note:
+Please don't do any state machine refactoring of this.
+
+0x430-0x433
+1) appears to control where the first enemies turns, if clockwise or anticlockwise
+2) ...
+
+Raiden 2 / DX checks if there's the string "RAIDEN" at start-up inside the eeprom, otherwise it dies.
+Then it puts settings at 0x9e08 and 0x9e0a (bp 91acb)
+
+*/
+
+#include "emu.h"
+#include "cpu/nec/nec.h"
+#include "cpu/z80/z80.h"
+#include "audio/seibu.h"
+#include "machine/eeprom.h"
+#include "sound/okim6295.h"
+#include "includes/raiden2.h"
+
+
+class r2dx_v33_state : public driver_device
+{
+public:
+ r2dx_v33_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) { }
+
+ UINT16 *m_spriteram;
+};
+
+
+static UINT16 *seibu_crtc_regs;
+static UINT16 *bg_vram,*md_vram,*fg_vram,*tx_vram;
+static tilemap_t *bg_tilemap,*md_tilemap,*fg_tilemap,*tx_tilemap;
+
+static TILE_GET_INFO( get_bg_tile_info )
+{
+ int tile = bg_vram[tile_index];
+ int color = (tile>>12)&0xf;
+
+ tile &= 0xfff;
+
+ SET_TILE_INFO(1,tile + 0x0000,color,0);
+}
+
+static TILE_GET_INFO( get_md_tile_info )
+{
+ int tile = md_vram[tile_index];
+ int color = (tile>>12)&0xf;
+
+ tile &= 0xfff;
+
+ SET_TILE_INFO(2,tile + 0x2000,color,0);
+}
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ int tile = fg_vram[tile_index];
+ int color = (tile>>12)&0xf;
+
+ tile &= 0xfff;
+
+ SET_TILE_INFO(3,tile + 0x1000,color,0);
+}
+
+static TILE_GET_INFO( get_tx_tile_info )
+{
+ int tile = tx_vram[tile_index];
+ int color = (tile>>12)&0xf;
+
+ tile &= 0xfff;
+
+ SET_TILE_INFO(4,tile,color,0);
+}
+
+/* copied from Legionnaire */
+static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int pri)
+{
+ r2dx_v33_state *state = machine.driver_data<r2dx_v33_state>();
+ UINT16 *spriteram16 = state->m_spriteram;
+ int offs,fx,fy,x,y,color,sprite;
+// int cur_pri;
+ int dx,dy,ax,ay;
+
+ for (offs = 0x400-4;offs >= 0;offs -= 4)
+ {
+ UINT16 data = spriteram16[offs];
+ //if (!(data &0x8000)) continue;
+
+ //cur_pri = (spriteram16[offs+1] & 0xc000) >> 14;
+ //if (cur_pri!=pri) continue;
+
+ sprite = spriteram16[offs+1];
+
+ //sprite &= 0x7fff;
+ //if(data & 0x8000) sprite |= 0x4000;
+ //if(spriteram16[offs+3] & 0x8000) sprite |= 0x8000;//tile banking?,used in Denjin Makai
+
+ y = spriteram16[offs+3];
+ x = spriteram16[offs+2];
+
+ x&=0xfff;
+ y&=0xfff;
+
+ if (x&0x8000) x-=0x10000;
+ if (y&0x8000) y-=0x10000;
+
+ color = (data &0x3f);
+ fx = (data &0x8000) >> 15;
+ fy = (data &0x0800) >> 11;
+ dx = ((data &0x0700) >> 8) + 1;
+ dy = ((data &0x7000) >> 12) + 1;
+
+ if (!fx)
+ {
+ if(!fy)
+ {
+ for (ax=0; ax<dx; ax++)
+ for (ay=0; ay<dy; ay++)
+ {
+ drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
+ sprite++,
+ color,fx,fy,x+ax*16,y+ay*16,15);
+ }
+ }
+ else
+ {
+ for (ax=0; ax<dx; ax++)
+ for (ay=0; ay<dy; ay++)
+ {
+ drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
+ sprite++,
+ color,fx,fy,x+ax*16,y+(dy-ay-1)*16,15);
+ }
+ }
+ }
+ else
+ {
+ if(!fy)
+ {
+ for (ax=0; ax<dx; ax++)
+ for (ay=0; ay<dy; ay++)
+ {
+ drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
+ sprite++,
+ color,fx,fy,x+(dx-ax-1)*16,y+ay*16,15);
+ }
+ }
+ else
+ {
+ for (ax=0; ax<dx; ax++)
+ for (ay=0; ay<dy; ay++)
+ {
+ drawgfx_transpen(bitmap,cliprect,machine.gfx[0],
+ sprite++,
+ color,fx,fy,x+(dx-ax-1)*16,y+(dy-ay-1)*16,15);
+ }
+ }
+ }
+ }
+}
+
+static VIDEO_START( rdx_v33 )
+{
+ bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,16,16,32,32);
+ md_tilemap = tilemap_create(machine, get_md_tile_info, tilemap_scan_rows,16,16,32,32);
+ fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,16,16,32,32);
+ tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows,8, 8, 64,32);
+
+ tilemap_set_transparent_pen(bg_tilemap, 15);
+ tilemap_set_transparent_pen(md_tilemap, 15);
+ tilemap_set_transparent_pen(fg_tilemap, 15);
+ tilemap_set_transparent_pen(tx_tilemap, 15);
+}
+
+static SCREEN_UPDATE( rdx_v33 )
+{
+ bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine()));
+
+ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+ tilemap_draw(bitmap, cliprect, md_tilemap, 0, 0);
+ tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
+
+ draw_sprites(screen->machine(),bitmap,cliprect,0);
+
+ tilemap_draw(bitmap, cliprect, tx_tilemap, 0, 0);
+
+ /* debug DMA processing */
+ if(0)
+ {
+ static UINT32 src_addr = 0x100000;
+ static int frame;
+ address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM);
+
+ //if(screen->machine().input().code_pressed_once(KEYCODE_A))
+ // src_addr+=0x800;
+
+ //if(screen->machine().input().code_pressed_once(KEYCODE_S))
+ // src_addr-=0x800;
+
+ frame++;
+
+ popmessage("%08x 0",src_addr);
+
+ //if(screen->machine().input().code_pressed_once(KEYCODE_Z))
+ if(frame == 5)
+ {
+ int i,data;
+ static UINT8 *rom = space->machine().region("mainprg")->base();
+
+ for(i=0;i<0x800;i+=2)
+ {
+ data = rom[src_addr+i+0];
+ space->write_byte(i+0xd000+0, data);
+ data = rom[src_addr+i+1];
+ space->write_byte(i+0xd000+1, data);
+ }
+
+ popmessage("%08x 1",src_addr);
+ tilemap_mark_all_tiles_dirty(bg_tilemap);
+ frame = 0;
+ src_addr+=0x800;
+ }
+ }
+ return 0;
+}
+
+WRITE16_DEVICE_HANDLER( rdx_v33_eeprom_w )
+{
+ if (ACCESSING_BITS_0_7)
+ {
+ eeprom_device *eeprom = downcast<eeprom_device *>(device);
+ eeprom->set_clock_line((data & 0x10) ? ASSERT_LINE : CLEAR_LINE);
+ eeprom->write_bit(data & 0x20);
+ eeprom->set_cs_line((data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
+
+ if (data&0xc7) logerror("eeprom_w extra bits used %04x\n",data);
+ }
+ else
+ {
+ logerror("eeprom_w MSB used %04x",data);
+ }
+}
+
+/* new zero team uses the copd3 protection... and uploads a 0x400 byte table, probably the mcu code, encrypted */
+
+
+static UINT16 mcu_prog[0x800];
+static int mcu_prog_offs = 0;
+
+WRITE16_HANDLER( mcu_prog_w )
+{
+ mcu_prog[mcu_prog_offs*2] = data;
+}
+
+WRITE16_HANDLER( mcu_prog_w2 )
+{
+ mcu_prog[mcu_prog_offs*2+1] = data;
+
+ // both new zero team and raiden2/dx v33 version upload the same table..
+#if 0
+ {
+ char tmp[64];
+ FILE *fp;
+ sprintf(tmp,"cop3_%s.data", space->machine().system().name);
+
+ fp=fopen(tmp, "w+b");
+ if (fp)
+ {
+ fwrite(mcu_prog, 0x400, 2, fp);
+ fclose(fp);
+ }
+ }
+#endif
+}
+
+WRITE16_HANDLER( mcu_prog_offs_w )
+{
+ mcu_prog_offs = data;
+}
+
+static WRITE16_HANDLER( rdx_bg_vram_w )
+{
+ COMBINE_DATA(&bg_vram[offset]);
+ tilemap_mark_tile_dirty(bg_tilemap, offset);
+}
+
+static WRITE16_HANDLER( rdx_md_vram_w )
+{
+ COMBINE_DATA(&md_vram[offset]);
+ tilemap_mark_tile_dirty(md_tilemap, offset);
+}
+
+static WRITE16_HANDLER( rdx_fg_vram_w )
+{
+ COMBINE_DATA(&fg_vram[offset]);
+ tilemap_mark_tile_dirty(fg_tilemap, offset);
+}
+
+static WRITE16_HANDLER( rdx_tx_vram_w )
+{
+ COMBINE_DATA(&tx_vram[offset]);
+ tilemap_mark_tile_dirty(tx_tilemap, offset);
+}
+
+static READ16_HANDLER( rdx_v33_unknown_r )
+{
+ return space->machine().rand();
+}
+
+
+static UINT16 mcu_xval,mcu_yval;
+
+/* something sent to the MCU for X/Y global screen calculating ... */
+static WRITE16_HANDLER( mcu_xval_w )
+{
+ mcu_xval = data;
+ //popmessage("%04x %04x",mcu_xval,mcu_yval);
+}
+
+static WRITE16_HANDLER( mcu_yval_w )
+{
+ mcu_yval = data;
+ //popmessage("%04x %04x",mcu_xval,mcu_yval);
+}
+
+static UINT16 mcu_data[9];
+
+/* 0x400-0x407 seems some DMA hook-up, 0x420-0x427 looks like some x/y sprite calculation routine */
+static WRITE16_HANDLER( mcu_table_w )
+{
+ mcu_data[offset] = data;
+
+ //popmessage("%04x %04x %04x %04x | %04x %04x %04x %04x",mcu_data[0/2],mcu_data[2/2],mcu_data[4/2],mcu_data[6/2],mcu_data[8/2],mcu_data[0xa/2],mcu_data[0xc/2],mcu_data[0xe/2]);
+}
+
+static WRITE16_HANDLER( mcu_table2_w )
+{
+ mcu_data[offset+4] = data;
+
+ //popmessage("%04x %04x %04x %04x | %04x %04x %04x %04x",mcu_data[0/2],mcu_data[2/2],mcu_data[4/2],mcu_data[6/2],mcu_data[8/2],mcu_data[0xa/2],mcu_data[0xc/2],mcu_data[0xe/2]);
+}
+
+
+static ADDRESS_MAP_START( rdx_v33_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x00000, 0x003ff) AM_RAM // vectors copied here
+
+ AM_RANGE(0x00400, 0x00407) AM_WRITE(mcu_table_w)
+ AM_RANGE(0x00420, 0x00429) AM_WRITE(mcu_table2_w)
+
+ /* results from cop? */
+ AM_RANGE(0x00430, 0x00431) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00432, 0x00433) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00434, 0x00435) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00436, 0x00437) AM_READ(rdx_v33_unknown_r)
+
+ AM_RANGE(0x00600, 0x0064f) AM_RAM AM_BASE(&seibu_crtc_regs)
+ AM_RANGE(0x00650, 0x0068f) AM_RAM //???
+
+ AM_RANGE(0x0068e, 0x0068f) AM_WRITENOP // synch for the MCU?
+ AM_RANGE(0x006b0, 0x006b1) AM_WRITE(mcu_prog_w)
+ AM_RANGE(0x006b2, 0x006b3) AM_WRITE(mcu_prog_w2)
+// AM_RANGE(0x006b4, 0x006b5) AM_WRITENOP
+// AM_RANGE(0x006b6, 0x006b7) AM_WRITENOP
+ AM_RANGE(0x006bc, 0x006bd) AM_WRITE(mcu_prog_offs_w)
+ AM_RANGE(0x006be, 0x006bf) AM_WRITENOP // MCU program related
+ AM_RANGE(0x006d8, 0x006d9) AM_WRITE(mcu_xval_w)
+ AM_RANGE(0x006da, 0x006db) AM_WRITE(mcu_yval_w)
+// AM_RANGE(0x006dc, 0x006dd) AM_READ(rdx_v33_unknown2_r)
+// AM_RANGE(0x006de, 0x006df) AM_WRITE(mcu_unkaa_w) // mcu command related?
+
+ AM_RANGE(0x00700, 0x00701) AM_DEVWRITE("eeprom", rdx_v33_eeprom_w)
+// AM_RANGE(0x00740, 0x00741) AM_READ(rdx_v33_unknown2_r)
+ AM_RANGE(0x00744, 0x00745) AM_READ_PORT("INPUT")
+ AM_RANGE(0x0074c, 0x0074d) AM_READ_PORT("SYSTEM")
+ AM_RANGE(0x00762, 0x00763) AM_READNOP
+
+ AM_RANGE(0x00780, 0x00781) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // single OKI chip on this version
+
+ AM_RANGE(0x00800, 0x00fff) AM_RAM // copies eeprom here?
+ AM_RANGE(0x01000, 0x0bfff) AM_RAM
+
+ AM_RANGE(0x0c000, 0x0c7ff) AM_RAM AM_BASE_MEMBER(r2dx_v33_state, m_spriteram)
+ AM_RANGE(0x0c800, 0x0cfff) AM_RAM
+ AM_RANGE(0x0d000, 0x0d7ff) AM_RAM_WRITE(rdx_bg_vram_w) AM_BASE(&bg_vram)
+ AM_RANGE(0x0d800, 0x0dfff) AM_RAM_WRITE(rdx_md_vram_w) AM_BASE(&md_vram)
+ AM_RANGE(0x0e000, 0x0e7ff) AM_RAM_WRITE(rdx_fg_vram_w) AM_BASE(&fg_vram)
+ AM_RANGE(0x0e800, 0x0f7ff) AM_RAM_WRITE(rdx_tx_vram_w) AM_BASE(&tx_vram)
+ AM_RANGE(0x0f800, 0x0ffff) AM_RAM /* Stack area */
+ AM_RANGE(0x10000, 0x1efff) AM_RAM
+ AM_RANGE(0x1f000, 0x1ffff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
+
+ AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("bank1")
+ AM_RANGE(0x40000, 0xfffff) AM_ROM AM_REGION("mainprg", 0x40000 )
+ADDRESS_MAP_END
+
+static READ16_HANDLER( nzerotea_sound_comms_r )
+{
+ switch(offset+0x780)
+ {
+ case (0x788/2): return seibu_main_word_r(space,2,0xffff);
+ case (0x78c/2): return seibu_main_word_r(space,3,0xffff);
+ case (0x794/2): return seibu_main_word_r(space,5,0xffff);
+ }
+
+ return 0xffff;
+}
+
+
+static WRITE16_HANDLER( nzerotea_sound_comms_w )
+{
+ switch(offset+0x780)
+ {
+ case (0x780/2): { seibu_main_word_w(space,0,data,0x00ff); break; }
+ case (0x784/2): { seibu_main_word_w(space,1,data,0x00ff); break; }
+ //case (0x790/2): { seibu_main_word_w(space,4,data,0x00ff); break; }
+ case (0x794/2): { seibu_main_word_w(space,4,data,0x00ff); break; }
+ case (0x798/2): { seibu_main_word_w(space,6,data,0x00ff); break; }
+ }
+}
+
+static ADDRESS_MAP_START( nzerotea_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x00000, 0x003ff) AM_RAM //stack area
+
+ /* results from cop? */
+ AM_RANGE(0x00430, 0x00431) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00432, 0x00433) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00434, 0x00435) AM_READ(rdx_v33_unknown_r)
+ AM_RANGE(0x00436, 0x00437) AM_READ(rdx_v33_unknown_r)
+
+ AM_RANGE(0x00400, 0x00407) AM_WRITE(mcu_table_w)
+ AM_RANGE(0x00420, 0x00427) AM_WRITE(mcu_table2_w)
+
+ AM_RANGE(0x00600, 0x0064f) AM_RAM AM_BASE(&seibu_crtc_regs)
+
+ AM_RANGE(0x0068e, 0x0068f) AM_WRITENOP // synch for the MCU?
+ AM_RANGE(0x006b0, 0x006b1) AM_WRITE(mcu_prog_w)
+ AM_RANGE(0x006b2, 0x006b3) AM_WRITE(mcu_prog_w2)
+// AM_RANGE(0x006b4, 0x006b5) AM_WRITENOP
+// AM_RANGE(0x006b6, 0x006b7) AM_WRITENOP
+ AM_RANGE(0x006bc, 0x006bd) AM_WRITE(mcu_prog_offs_w)
+// AM_RANGE(0x006d8, 0x006d9) AM_WRITE(bbbbll_w) // scroll?
+// AM_RANGE(0x006dc, 0x006dd) AM_READ(nzerotea_unknown_r)
+// AM_RANGE(0x006de, 0x006df) AM_WRITE(mcu_unkaa_w) // mcu command related?
+ //AM_RANGE(0x00700, 0x00701) AM_DEVWRITE("eeprom", rdx_v33_eeprom_w)
+ AM_RANGE(0x00740, 0x00741) AM_READ_PORT("DSW")
+ AM_RANGE(0x00744, 0x00745) AM_READ_PORT("INPUT")
+ AM_RANGE(0x0074c, 0x0074d) AM_READ_PORT("SYSTEM")
+// AM_RANGE(0x00762, 0x00763) AM_READ(nzerotea_unknown_r)
+
+ AM_RANGE(0x00780, 0x0079f) AM_READWRITE(nzerotea_sound_comms_r,nzerotea_sound_comms_w)
+
+ AM_RANGE(0x00800, 0x00fff) AM_RAM
+ AM_RANGE(0x01000, 0x0bfff) AM_RAM
+
+ AM_RANGE(0x0c000, 0x0c7ff) AM_RAM AM_BASE_MEMBER(r2dx_v33_state, m_spriteram)
+ AM_RANGE(0x0c800, 0x0cfff) AM_RAM
+ AM_RANGE(0x0d000, 0x0d7ff) AM_RAM_WRITE(rdx_bg_vram_w) AM_BASE(&bg_vram)
+ AM_RANGE(0x0d800, 0x0dfff) AM_RAM_WRITE(rdx_md_vram_w) AM_BASE(&md_vram)
+ AM_RANGE(0x0e000, 0x0e7ff) AM_RAM_WRITE(rdx_fg_vram_w) AM_BASE(&fg_vram)
+ AM_RANGE(0x0e800, 0x0f7ff) AM_RAM_WRITE(rdx_tx_vram_w) AM_BASE(&tx_vram)
+ AM_RANGE(0x0f800, 0x0ffff) AM_RAM /* Stack area */
+ AM_RANGE(0x10000, 0x1efff) AM_RAM
+ AM_RANGE(0x1f000, 0x1ffff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
+
+ AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("bank1")
+ AM_RANGE(0x40000, 0xfffff) AM_ROM AM_REGION("mainprg", 0x40000 )
+ADDRESS_MAP_END
+
+static INTERRUPT_GEN( rdx_v33_interrupt )
+{
+ device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xc0/4); /* VBL */
+}
+
+static const gfx_layout rdx_v33_charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { 8,12,0,4 },
+ { 3,2,1,0,19,18,17,16 },
+ { STEP8(0,32) },
+ 32*8
+};
+
+
+static const gfx_layout rdx_v33_tilelayout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { 8,12,0,4 },
+ {
+ 3,2,1,0,
+ 19,18,17,16,
+ 3+64*8, 2+64*8, 1+64*8, 0+64*8,
+ 19+64*8,18+64*8,17+64*8,16+64*8,
+ },
+ { STEP16(0,32) },
+ 128*8
+};
+
+static const gfx_layout rdx_v33_spritelayout =
+{
+ 16, 16,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 4, 0, 12, 8, 20, 16, 28, 24, 36, 32, 44, 40, 52, 48, 60, 56 },
+ { STEP16(0,64) },
+ 16*16*4
+};
+
+static GFXDECODE_START( rdx_v33 )
+ GFXDECODE_ENTRY( "gfx3", 0x00000, rdx_v33_spritelayout, 0x000, 0x40 )
+ GFXDECODE_ENTRY( "gfx2", 0x00000, rdx_v33_tilelayout, 0x400, 0x10 )
+ GFXDECODE_ENTRY( "gfx2", 0x00000, rdx_v33_tilelayout, 0x500, 0x10 )
+ GFXDECODE_ENTRY( "gfx2", 0x00000, rdx_v33_tilelayout, 0x600, 0x10 )
+ GFXDECODE_ENTRY( "gfx1", 0x00000, rdx_v33_charlayout, 0x700, 0x10 )
+ GFXDECODE_ENTRY( "gfx1", 0x00000, rdx_v33_tilelayout, 0x700, 0x10 ) // debugging, to be removed
+GFXDECODE_END
+
+static INPUT_PORTS_START( rdx_v33 )
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x0040, 0x0040, "Test Mode" )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("INPUT")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_COIN2 )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( nzerotea )
+
+ SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+ //PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x0040, 0x0040, "Test Mode" )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("INPUT")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Service_Mode ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static MACHINE_CONFIG_START( rdx_v33, r2dx_v33_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", V33, 32000000/2 ) // ?
+ MCFG_CPU_PROGRAM_MAP(rdx_v33_map)
+ MCFG_CPU_VBLANK_INT("screen", rdx_v33_interrupt)
+
+ //MCFG_MACHINE_RESET(rdx_v33)
+
+ MCFG_EEPROM_93C46_ADD("eeprom")
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(64*8, 64*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
+ MCFG_SCREEN_UPDATE(rdx_v33)
+
+ MCFG_GFXDECODE(rdx_v33)
+ MCFG_PALETTE_LENGTH(2048)
+
+ MCFG_VIDEO_START(rdx_v33)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_OKIM6295_ADD("oki", 1000000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_START( nzerotea, r2dx_v33_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", V33,XTAL_32MHz/2) /* verified on pcb */
+ MCFG_CPU_PROGRAM_MAP(nzerotea_map)
+ MCFG_CPU_VBLANK_INT("screen", rdx_v33_interrupt)
+
+ MCFG_MACHINE_RESET(seibu_sound)
+
+// SEIBU2_RAIDEN2_SOUND_SYSTEM_CPU(14318180/4)
+ SEIBU_NEWZEROTEAM_SOUND_SYSTEM_CPU(14318180/4)
+
+ /* video hardware */
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(55.47) /* verified on pcb */
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate *//2)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(64*8, 64*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0, 32*8-1)
+ MCFG_SCREEN_UPDATE(rdx_v33)
+ MCFG_GFXDECODE(rdx_v33)
+ MCFG_PALETTE_LENGTH(2048)
+
+ MCFG_VIDEO_START(rdx_v33)
+
+ /* sound hardware */
+// SEIBU_SOUND_SYSTEM_YM2151_RAIDEN2_INTERFACE(28636360/8,28636360/28,1,2)
+ SEIBU_SOUND_SYSTEM_YM3812_INTERFACE(14318180/4,1320000)
+
+MACHINE_CONFIG_END
+
+
+static DRIVER_INIT(rdx_v33)
+{
+ memory_configure_bank(machine, "bank1", 0, 0x20, machine.region("mainprg")->base(), 0x20000);
+
+ raiden2_decrypt_sprites(machine);
+
+ memory_set_bank(machine, "bank1", 1);
+}
+
+static DRIVER_INIT(nzerotea)
+{
+ memory_configure_bank(machine, "bank1", 0, 2, machine.region("mainprg")->base(), 0x20000);
+
+ raiden2_decrypt_sprites(machine);
+
+ memory_set_bank(machine, "bank1", 1);
+
+}
+
+/*
+
+Raiden DX
+Seibu Kaihatsu, 1993/1996
+
+Note! PCB seems like an updated version. It uses _entirely_ SMD technology and
+is smaller than the previous hardware. I guess the game is still popular, so
+Seibu re-manufactured it using newer technology to meet demand.
+Previous version hardware is similar to Heated Barrel/Legionairre/Seibu Cup Soccer etc.
+It's possible that the BG and OBJ ROMs from this set can be used to complete the
+previous (incomplete) dump that runs on the V30 hardware, since most GFX chips are the same.
+
+PCB ID: (C) 1996 JJ4-China-Ver2.0 SEIBU KAIHATSU INC., MADE IN JAPAN
+CPU : NEC 70136AL-16 (V33)
+SOUND : Oki M6295
+OSC : 28.636360MHz
+RAM : CY7C199-15 (28 Pin SOIC, x11)
+ Breakdown of RAM locations...
+ (x2 near SIE150)
+ (x3 near SEI252)
+ (x2 near SEI0200)
+ (x4 near SEI360)
+
+DIPs : 8 position (x1)
+ 1-6 OFF (NOT USED)
+ 7 OFF = Normal Mode , ON = Test/Setting Mode
+ 8 OFF = Normal Screen, ON = FLIP Screen
+
+OTHER : Controls are 8-way + 3 Buttons
+ Amtel 93C46 EEPROM (SOIC8)
+ PALCE16V8 (x1, near BG ROM, SOIC20)
+ SEIBU SEI360 SB06-1937 (160 pin PQFP)
+ SEIBI SIE150 (100 pin PQFP, Note SIE, not a typo)
+ SEIBU SEI252 (208 pin PQFP)
+ SEIBU SEI333 (208 pin PQFP)
+ SEIBU SEI0200 TC110G21AF (100 pin PQFP)
+
+ Note: Most of the custom SEIBU chips are the same as the ones used on the
+ previous version hardware.
+
+ROMs : (filename is PCB label, extension is PCB 'u' location)
+
+ ROM ROM Probably Byte
+Filename Label Type Used... Note C'sum
+---------------------------------------------------------------------------------
+PCM.099 RAIDEN-X SOUND LH538100 (SOP32) Oki Samples 0 8539h
+FIX.613 RAIDEN-X FIX LH532048 (SOP40) ? (BG?) 1 182Dh
+COPX_D3.357 RAIDEN-X 333 LH530800A (SOP32) Protection? 2 CEE4h
+PRG.223 RAIDEN-X CHR-4A1 MX23C3210 (SOP44) V33 program 3 F276h
+OBJ1.724 RAIDEN-X CHR1 MX23C3210 (SOP44) Motion Objects 4 4148h
+OBJ2.725 RAIDEN-X CHR2 MX23C3210 (SOP44) Motion Objects 4 00C3h
+BG.612 RAIDEN-X CHR3 MX23C3210 (SOP44) Backgrounds 5 3280h
+
+
+Notes
+0. Located near Oki M6295
+1. Located near SEI0200 and BG ROM
+2. Located near SEI333
+3. Located near V33 and SEI333
+4. Located near V33 and SEI252
+5. Located near FIX ROM and SEI0200
+
+*/
+
+
+ROM_START( r2dx_v33 )
+ ROM_REGION( 0x400000, "mainprg", 0 ) /* v33 main cpu */
+ ROM_LOAD("prg.223", 0x000000, 0x400000, CRC(b3dbcf98) SHA1(30d6ec2090531c8c579dff74c4898889902d7d87) )
+
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) /* v33 main cpu */
+
+// ROM_REGION( 0x20000, "cpu1", ROMREGION_ERASE00 ) /* 64k code for sound Z80 */
+ /* nothing? no z80*/
+
+ ROM_REGION( 0x040000, "gfx1", 0 ) /* chars */
+ ROM_LOAD( "fix.613", 0x000000, 0x040000, CRC(3da27e39) SHA1(3d446990bf36dd0a3f8fadb68b15bed54904c8b5) )
+
+ ROM_REGION( 0x400000, "gfx2", 0 ) /* background gfx */
+ ROM_LOAD( "bg.612", 0x000000, 0x400000, CRC(162c61e9) SHA1(bd0a6a29804b84196ba6bf3402e9f30a25da9269) )
+
+ ROM_REGION( 0x800000, "gfx3", 0 ) /* sprite gfx (encrypted) */
+ ROM_LOAD32_WORD( "obj1.724", 0x000000, 0x400000, CRC(7d218985) SHA1(777241a533defcbea3d7e735f309478d260bad52) )
+ ROM_LOAD32_WORD( "obj2.725", 0x000002, 0x400000, CRC(b09434d9) SHA1(da75252b7693ab791fece4c10b8a4910edb76c88) )
+
+ ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "pcm.099", 0x00000, 0x100000, CRC(97ca2907) SHA1(bfe8189300cf72089d0beaeab8b1a0a1a4f0a5b6) )
+
+ ROM_REGION( 0x40000, "user2", 0 ) /* COPX */
+ ROM_LOAD( "copx_d3.357", 0x00000, 0x20000, CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) )
+
+ ROM_REGION16_BE( 0x80, "eeprom", 0 )
+ ROM_LOAD16_WORD( "eeprom-r2dx_v33.bin", 0x0000, 0x0080, CRC(ba454777) SHA1(101c5364e8664d17bfb1e759515d135a2673d67e) )
+ROM_END
+
+/* Different hardware, uses COPX-D3 for protection */
+ROM_START( nzerotea )
+ ROM_REGION( 0x100000, "mainprg", 0 ) /* v30 main cpu */
+ ROM_LOAD16_BYTE("prg1", 0x000000, 0x80000, CRC(3c7d9410) SHA1(25f2121b6c2be73f11263934266901ed5d64d2ee) )
+ ROM_LOAD16_BYTE("prg2", 0x000001, 0x80000, CRC(6cba032d) SHA1(bf5d488cd578fff09e62e3650efdee7658033e3f) )
+
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) /* v33 main cpu */
+
+ ROM_REGION( 0x40000, "user2", 0 ) /* COPX */
+ /* not from this set, assumed to be the same */
+ ROM_LOAD( "copx-d3.bin", 0x00000, 0x20000, BAD_DUMP CRC(fa2cf3ad) SHA1(13eee40704d3333874b6e3da9ee7d969c6dc662a) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k code for sound Z80 */
+ ROM_LOAD( "sound", 0x000000, 0x08000, CRC(7ec1fbc3) SHA1(48299d6530f641b18764cc49e283c347d0918a47) )
+ ROM_CONTINUE( 0x010000, 0x08000 ) /* banked stuff */
+ ROM_COPY( "audiocpu", 0, 0x018000, 0x08000 )
+
+ ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */
+ ROM_LOAD16_BYTE( "fix1", 0x000000, 0x010000, CRC(0c4895b0) SHA1(f595dbe5a19edb8a06ea60105ee26b95db4a2619) )
+ ROM_LOAD16_BYTE( "fix2", 0x000001, 0x010000, CRC(07d8e387) SHA1(52f54a6a4830592784cdf643a5f255aa3db53e50) )
+
+ ROM_REGION( 0x400000, "gfx2", 0 ) /* background gfx */
+ ROM_LOAD( "back-1", 0x000000, 0x100000, CRC(8b7f9219) SHA1(3412b6f8a4fe245e521ddcf185a53f2f4520eb57) )
+ ROM_LOAD( "back-2", 0x100000, 0x080000, CRC(ce61c952) SHA1(52a843c8ba428b121fab933dd3b313b2894d80ac) )
+
+ ROM_REGION( 0x800000, "gfx3", 0 ) /* sprite gfx (encrypted) (diff encrypt to raiden2? ) */
+ ROM_LOAD32_WORD( "obj-1", 0x000000, 0x200000, CRC(45be8029) SHA1(adc164f9dede9a86b96a4d709e9cba7d2ad0e564) )
+ ROM_LOAD32_WORD( "obj-2", 0x000002, 0x200000, CRC(cb61c19d) SHA1(151a2ce9c32f3321a974819e9b165dddc31c8153) )
+
+ ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "6.pcm", 0x00000, 0x40000, CRC(48be32b1) SHA1(969d2191a3c46871ee8bf93088b3cecce3eccf0c) )
+ROM_END
+
+// newer PCB, with V33 CPU and COPD3 protection, but weak sound hardware. - was marked as Raiden DX New in the rom dump, but boots as Raiden 2 New version, is it switchable?
+GAME( 1996, r2dx_v33, 0, rdx_v33, rdx_v33, rdx_v33, ROT270, "Seibu Kaihatsu", "Raiden II / DX (newer V33 PCB)", GAME_NOT_WORKING|GAME_NO_SOUND)
+
+// 'V33 system type_b' - uses V33 CPU, COPX-D3 external protection rom, but still has the proper sound system
+GAME( 1997, nzerotea, zeroteam, nzerotea, nzerotea, nzerotea, ROT0, "Seibu Kaihatsu", "New Zero Team", GAME_NOT_WORKING|GAME_NO_SOUND) // this uses a v33 and COPD3