(MESS)gamate : added newer bios and emulated protection [PeT]

This commit is contained in:
Miodrag Milanovic 2015-01-12 19:58:20 +01:00
parent ad848fe7a0
commit 50109a0cd7

View File

@ -11,6 +11,8 @@
#include "bus/generic/carts.h" #include "bus/generic/carts.h"
#include "rendlay.h" #include "rendlay.h"
//#define USE_GFX
class gamate_state : public driver_device class gamate_state : public driver_device
{ {
public: public:
@ -18,7 +20,9 @@ public:
: driver_device(mconfig, type, tag) : driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_cart(*this, "cartslot") , m_cart(*this, "cartslot")
// , m_gfxdecode(*this, "gfxdecode") #ifdef USE_GFX
, m_gfxdecode(*this, "gfxdecode")
#endif
, m_io_joy(*this, "JOY") , m_io_joy(*this, "JOY")
, m_palette(*this, "palette") , m_palette(*this, "palette")
, m_bios(*this, "bios") , m_bios(*this, "bios")
@ -26,6 +30,8 @@ public:
DECLARE_PALETTE_INIT(gamate); DECLARE_PALETTE_INIT(gamate);
DECLARE_READ8_MEMBER(protection_r); DECLARE_READ8_MEMBER(protection_r);
DECLARE_READ8_MEMBER(newer_protection_set);
DECLARE_WRITE8_MEMBER(protection_reset);
DECLARE_READ8_MEMBER(gamate_cart_protection_r); DECLARE_READ8_MEMBER(gamate_cart_protection_r);
DECLARE_WRITE8_MEMBER(gamate_cart_protection_w); DECLARE_WRITE8_MEMBER(gamate_cart_protection_w);
DECLARE_WRITE8_MEMBER(cart_bankswitchmulti_w); DECLARE_WRITE8_MEMBER(cart_bankswitchmulti_w);
@ -47,37 +53,44 @@ private:
struct struct
{ {
UINT8 reg[8]; UINT8 reg[8];
struct { struct {
bool write; bool write;
bool page2; // else page1 bool page2; // else page1
UINT8 ypos, xpos/*tennis*/; UINT8 ypos, xpos/*tennis*/;
UINT8 data[2][0x100][0x20]; UINT8 data[2][0x100][0x20];
} bitmap; } bitmap;
UINT8 x, y; UINT8 x, y;
bool y_increment; bool y_increment;
} video; } video;
struct { struct {
bool set;
int bit_shifter; int bit_shifter;
UINT8 cartridge_byte; UINT8 cartridge_byte;
UINT16 address; // in reality something more like short local cartridge address offset UINT16 address; // in reality something more like short local cartridge address offset
bool unprotected; bool unprotected;
bool failed; bool failed;
} card_protection; } card_protection;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<generic_slot_device> m_cart; required_device<generic_slot_device> m_cart;
// required_device<gfxdecode_device> m_gfxdecode; #ifdef USE_GFX
required_device<gfxdecode_device> m_gfxdecode;
#endif
required_ioport m_io_joy; required_ioport m_io_joy;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_bios; required_shared_ptr<UINT8> m_bios;
emu_timer *timer1; emu_timer *timer1;
emu_timer *timer2; emu_timer *timer2;
UINT8 bank_multi;
}; };
WRITE8_MEMBER( gamate_state::gamate_cart_protection_w ) WRITE8_MEMBER( gamate_state::gamate_cart_protection_w )
{ {
logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
switch (offset) { switch (offset) {
case 0: case 0:
card_protection.failed= card_protection.failed || ((card_protection.cartridge_byte&0x80)!=0) != ((data&4)!=0); card_protection.failed= card_protection.failed || ((card_protection.cartridge_byte&0x80)!=0) != ((data&4)!=0);
@ -91,54 +104,75 @@ WRITE8_MEMBER( gamate_state::gamate_cart_protection_w )
} }
READ8_MEMBER( gamate_state::gamate_cart_protection_r ) READ8_MEMBER( gamate_state::gamate_cart_protection_r )
{ {
UINT8 ret=1;
switch (offset) { UINT8 ret=1;
case 0: if (card_protection.bit_shifter==7 && card_protection.unprotected) {
ret=(card_protection.cartridge_byte&0x80)?2:0; ret=m_cart->get_rom_base()[bank_multi*0x4000];
card_protection.cartridge_byte<<=1; } else {
card_protection.bit_shifter++; card_protection.bit_shifter++;
if (card_protection.bit_shifter>=8) { if (card_protection.bit_shifter==8) {
card_protection.bit_shifter=0; card_protection.bit_shifter=0;
card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++]; card_protection.cartridge_byte='G';
card_protection.unprotected=true; card_protection.unprotected=true;
if (!card_protection.failed) {
} // now protection chip on cartridge activates cartridge chip select on cpu accesses
}
break;
} }
return ret; ret=(card_protection.cartridge_byte&0x80)?2:0;
if (card_protection.bit_shifter==7 && !card_protection.failed) { // now protection chip on cartridge activates cartridge chip select on cpu accesses
// m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working
}
card_protection.cartridge_byte<<=1;
}
logerror("%.6f protection read %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, ret, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
return ret;
}
READ8_MEMBER( gamate_state::protection_r ) { return card_protection.set? 3: 1; } // bits 0 and 1 checked
WRITE8_MEMBER( gamate_state::protection_reset )
{
// writes 0x20
card_protection.address=0x6005-0x6001;
card_protection.bit_shifter=0;
card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++];
card_protection.failed=false;
card_protection.unprotected=false;
}
READ8_MEMBER( gamate_state::newer_protection_set )
{
card_protection.set=true;
return 0;
} }
READ8_MEMBER( gamate_state::protection_r ) { return 1; }
WRITE8_MEMBER( gamate_state::gamate_video_w ) WRITE8_MEMBER( gamate_state::gamate_video_w )
{ {
video.reg[offset]=data; video.reg[offset]=data;
switch (offset) { switch (offset) {
case 1: video.bitmap.write=data&0xc0; // more addressing mode case 1: video.bitmap.write=data&0xc0; // more addressing mode
video.y_increment=data&0x40; video.y_increment=data&0x40;
break; break;
case 2: video.bitmap.xpos=data;break; // at least 7 bits case 2: video.bitmap.xpos=data;break; // at least 7 bits
case 3: video.bitmap.ypos=data;break; // at least 7 bits case 3: video.bitmap.ypos=data;break; // at least 7 bits
case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break; case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break;
case 5: video.y=data;break; case 5: video.y=data;break;
case 7: case 7:
if (video.bitmap.write) { if (video.bitmap.write) {
if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/) if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/)
video.bitmap.data[video.bitmap.page2][video.y][video.x]=data; video.bitmap.data[video.bitmap.page2][video.y][video.x]=data;
else else
logerror("%.6f %04x video bitmap x %x invalid\n",machine().time().as_double(), m_maincpu->pc(), video.x); logerror("%.6f %04x video bitmap x %x invalid\n",machine().time().as_double(), m_maincpu->pc(), video.x);
} else { } else {
video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data;
} }
if (video.y_increment) video.y++; if (video.y_increment) video.y++;
else video.x++; else video.x++;
} }
} }
WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w ) WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w )
{ {
membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data); bank_multi=data;
membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1);
} }
WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) WRITE8_MEMBER( gamate_state::cart_bankswitch_w )
@ -149,54 +183,55 @@ WRITE8_MEMBER( gamate_state::cart_bankswitch_w )
READ8_MEMBER( gamate_state::gamate_video_r ) READ8_MEMBER( gamate_state::gamate_video_r )
{ {
if (offset!=6) return 0; if (offset!=6) return 0;
UINT8 data=0; UINT8 data=0;
if (video.bitmap.write) { if (video.bitmap.write) {
if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/) if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/)
data=video.bitmap.data[video.bitmap.page2][video.y][video.x]; data=video.bitmap.data[video.bitmap.page2][video.y][video.x];
else else
logerror("%.6f video bitmap x %x invalid\n",machine().time().as_double(),video.x); logerror("%.6f video bitmap x %x invalid\n",machine().time().as_double(),video.x);
} else { } else {
data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)];
} }
if (m_maincpu->pc()<0xf000) if (m_maincpu->pc()<0xf000)
logerror("%.6f video read %04x %02x\n",machine().time().as_double(),offset, data); logerror("%.6f video read %04x %02x\n",machine().time().as_double(),offset, data);
return data; return data;
} }
WRITE8_MEMBER( gamate_state::gamate_audio_w ) WRITE8_MEMBER( gamate_state::gamate_audio_w )
{ {
logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data); logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data);
} }
READ8_MEMBER( gamate_state::gamate_audio_r ) READ8_MEMBER( gamate_state::gamate_audio_r )
{ {
logerror("%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset); logerror("%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset);
return 0; return 0;
} }
READ8_MEMBER( gamate_state::gamate_pad_r ) READ8_MEMBER( gamate_state::gamate_pad_r )
{ {
UINT8 data=m_io_joy->read(); UINT8 data=m_io_joy->read();
return data; return data;
} }
static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state ) static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state )
AM_RANGE(0x0000, 0x03ff) AM_RAM AM_RANGE(0x0000, 0x03ff) AM_RAM
AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w) AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w)
AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r) AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r)
AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w)
AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set)
AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset)
AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r)
AM_RANGE(0x6000, 0x9fff) AM_READ_BANK("bankmulti") AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti")
AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank") AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank")
AM_RANGE(0x6000, 0x6002) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w) AM_RANGE(0x6000, 0x6000) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w)
// AM_RANGE(0x6000, 0xdfff) AM_READWRITE(gamate_cart_r, gamate_cart_w)
AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_w) AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_w)
AM_RANGE(0xc000, 0xc000) AM_WRITE(cart_bankswitch_w) AM_RANGE(0xc000, 0xc000) AM_WRITE(cart_bankswitch_w)
AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios") AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios")
ADDRESS_MAP_END ADDRESS_MAP_END
@ -212,38 +247,39 @@ static INPUT_PORTS_START( gamate )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select")
INPUT_PORTS_END INPUT_PORTS_END
#ifdef UNUSED_CODE #ifdef USE_GFX
static const struct gfx_layout gamate_charlayout = static const struct gfx_layout gamate_charlayout =
{ {
4, /* width of object */ 4, /* width of object */
1, /* height of object */ 1, /* height of object */
256,/* 256 characters */ 256,/* 256 characters */
2, /* bits per pixel */ 2, /* bits per pixel */
{ 0,1 }, /* no bitplanes */ { 0,4 }, /* no bitplanes */
/* x offsets */ /* x offsets */
{ 0,2,4,6 }, { 0,1,2,3 },
/* y offsets */ /* y offsets */
{ 0 }, { 0 },
8*1 /* size of 1 object in bits */ 8*1 /* size of 1 object in bits */
}; };
static GFXDECODE_START( gamate )
GFXDECODE_ENTRY( "gfx1", 0x0000, gamate_charlayout, 0, 0x100 )
GFXDECODE_END
#endif
static const unsigned short gamate_palette[4] = static const unsigned short gamate_palette[4] =
{ {
0,1,2,3 0,1,2,3
}; };
static GFXDECODE_START( gamate_charlayout )
GFXDECODE_ENTRY( "gfx1", 0x0000, gamate_charlayout, 0, 0x100 )
GFXDECODE_END
#endif
/* palette in red, green, blue tribles */ /* palette in red, green, blue tribles */
static const unsigned char gamate_colors[4][3] = static const unsigned char gamate_colors[4][3] =
{ {
{ 255,255,255 }, { 255,255,255 },
{ 0xa0, 0xa0, 0xa0 }, { 0xa0, 0xa0, 0xa0 },
{ 0x60, 0x60, 0x60 }, { 0x60, 0x60, 0x60 },
{ 0, 0, 0 } { 0, 0, 0 }
}; };
PALETTE_INIT_MEMBER(gamate_state, gamate) PALETTE_INIT_MEMBER(gamate_state, gamate)
@ -254,16 +290,9 @@ PALETTE_INIT_MEMBER(gamate_state, gamate)
{ {
palette.set_pen_color(i, gamate_colors[i][0], gamate_colors[i][1], gamate_colors[i][2]); palette.set_pen_color(i, gamate_colors[i][0], gamate_colors[i][1], gamate_colors[i][2]);
} }
#if 0
for (int i = 0; i < 8; i++)
palette.set_indirect_color(i, arcadia_colors[i]);
for (int i = 0; i < 128+8; i++)
palette.set_pen_indirect(i, arcadia_palette[i]);
#endif
} }
#ifndef USE_GFX
static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2) static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2)
{ {
line[3]=(plane1&1)|((plane2<<1)&2); line[3]=(plane1&1)|((plane2<<1)&2);
@ -271,25 +300,34 @@ static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2)
line[1]=((plane1>>2)&1)|((plane2>>1)&2); line[1]=((plane1>>2)&1)|((plane2>>1)&2);
line[0]=((plane1>>3)&1)|((plane2>>2)&2); line[0]=((plane1>>3)&1)|((plane2>>2)&2);
} }
#endif
UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
int x, y, j; int x, y, j;
for (y=0;y<152;y++) { for (y=0;y<152;y++) {
for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) { for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) {
UINT8 d1=video.bitmap.data[0][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f]; UINT8 d1=video.bitmap.data[0][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f];
UINT8 d2=video.bitmap.data[1][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f]; UINT8 d2=video.bitmap.data[1][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f];
BlitPlane(&bitmap.pix16(y, x+4), d1, d2); #ifdef USE_GFX
BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4); m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, (d1&0xf)|((d2&0xf)<<4), 0,0,0,x+4,y);
} m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, (d1>>4)|(d2&0xf0),0,0,0,x,y);
} #else
return 0; BlitPlane(&bitmap.pix16(y, x+4), d1, d2);
BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4);
#endif
}
}
return 0;
} }
DRIVER_INIT_MEMBER(gamate_state,gamate) DRIVER_INIT_MEMBER(gamate_state,gamate)
{ {
memset(&video, 0, sizeof(video));/* memset(m_ram, 0, sizeof(m_ram));*/ memset(&video, 0, sizeof(video));/* memset(m_ram, 0, sizeof(m_ram));*/
UINT8 *gfx=memregion("gfx1")->base(); for (int i=0; i<256; i++) gfx[i]=i; #ifdef USE_GFX
UINT8 *gfx=memregion("gfx1")->base();
for (int i=0; i<256; i++) gfx[i]=i;
#endif
timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer),this)); timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer),this));
timer2 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer2),this)); timer2 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer2),this));
} }
@ -298,15 +336,13 @@ DRIVER_INIT_MEMBER(gamate_state,gamate)
void gamate_state::machine_start() void gamate_state::machine_start()
{ {
if (m_cart->exists()) { if (m_cart->exists()) {
// m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r));
membank("bankmulti")->set_base(m_cart->get_rom_base()); membank("bankmulti")->set_base(m_cart->get_rom_base()+1);
membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset
} }
m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // $47 protection readback // m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback
card_protection.address=0x6005-0x6001; card_protection.set=false;
card_protection.bit_shifter=0; bank_multi=0;
card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++];
card_protection.failed=false;
card_protection.unprotected=false; card_protection.unprotected=false;
timer2->enable(TRUE); timer2->enable(TRUE);
timer2->reset(m_maincpu->cycles_to_attotime(1000)); timer2->reset(m_maincpu->cycles_to_attotime(1000));
@ -355,9 +391,10 @@ static MACHINE_CONFIG_START( gamate, gamate_state )
MCFG_SCREEN_UPDATE_DRIVER(gamate_state, screen_update_gamate) MCFG_SCREEN_UPDATE_DRIVER(gamate_state, screen_update_gamate)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
// MCFG_GFXDECODE_ADD("gfxdecode", "palette", gamate ) #ifdef USE_GFX
MCFG_GFXDECODE_ADD("gfxdecode", "palette", gamate )
#endif
MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(gamate_colors)) MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(gamate_colors))
// MCFG_PALETTE_INDIRECT_ENTRIES(4)
MCFG_PALETTE_INIT_OWNER(gamate_state, gamate) MCFG_PALETTE_INIT_OWNER(gamate_state, gamate)
MCFG_DEFAULT_LAYOUT(layout_lcd) MCFG_DEFAULT_LAYOUT(layout_lcd)
@ -370,10 +407,17 @@ MACHINE_CONFIG_END
ROM_START(gamate) ROM_START(gamate)
ROM_REGION(0x10000,"maincpu", 0) ROM_REGION(0x10000,"maincpu", 0)
ROM_LOAD("gamate_bios_umc.bin", 0xf000, 0x1000, CRC(07090415) SHA1(ea449dc607601f9a68d855ad6ab53800d2e99297) ) ROM_SYSTEM_BIOS(0, "default", "DEFAULT")
ROMX_LOAD("gamate_bios_umc.bin", 0xf000, 0x1000, CRC(07090415) SHA1(ea449dc607601f9a68d855ad6ab53800d2e99297), ROM_BIOS(1) )
ROM_SYSTEM_BIOS(1, "newer", "NEWER")
ROMX_LOAD("gamate_bios_9130__unknown__bit_icasc00001_9130-bs_r32261.bin", 0xf000, 0x1000, CRC(03a5f3a7) SHA1(4e9dfbfe916ca485530ef4221593ab68738e2217), ROM_BIOS(2) )
#ifdef USE_GFX
ROM_REGION(0x100,"gfx1", ROMREGION_ERASEFF) ROM_REGION(0x100,"gfx1", ROMREGION_ERASEFF)
#endif
ROM_END ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
CONS( 19??, gamate, 0, 0, gamate, gamate, gamate_state, gamate, "Bit Corp", "Gamate", GAME_NO_SOUND) CONS( 19??, gamate, 0, 0, gamate, gamate, gamate_state, gamate, "Bit Corp", "Gamate", GAME_NO_SOUND)