From 50109a0cd7cdabbce8e9611f9870474cc081a587 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 12 Jan 2015 19:58:20 +0100 Subject: [PATCH] (MESS)gamate : added newer bios and emulated protection [PeT] --- src/mess/drivers/gamate.c | 276 ++++++++++++++++++++++---------------- 1 file changed, 160 insertions(+), 116 deletions(-) diff --git a/src/mess/drivers/gamate.c b/src/mess/drivers/gamate.c index 1065bc03f02..656e7408eb3 100644 --- a/src/mess/drivers/gamate.c +++ b/src/mess/drivers/gamate.c @@ -11,6 +11,8 @@ #include "bus/generic/carts.h" #include "rendlay.h" +//#define USE_GFX + class gamate_state : public driver_device { public: @@ -18,7 +20,9 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_cart(*this, "cartslot") -// , m_gfxdecode(*this, "gfxdecode") +#ifdef USE_GFX + , m_gfxdecode(*this, "gfxdecode") +#endif , m_io_joy(*this, "JOY") , m_palette(*this, "palette") , m_bios(*this, "bios") @@ -26,6 +30,8 @@ public: DECLARE_PALETTE_INIT(gamate); DECLARE_READ8_MEMBER(protection_r); + DECLARE_READ8_MEMBER(newer_protection_set); + DECLARE_WRITE8_MEMBER(protection_reset); DECLARE_READ8_MEMBER(gamate_cart_protection_r); DECLARE_WRITE8_MEMBER(gamate_cart_protection_w); DECLARE_WRITE8_MEMBER(cart_bankswitchmulti_w); @@ -47,37 +53,44 @@ private: struct { - UINT8 reg[8]; - struct { - bool write; - bool page2; // else page1 + UINT8 reg[8]; + struct { + bool write; + bool page2; // else page1 UINT8 ypos, xpos/*tennis*/; - UINT8 data[2][0x100][0x20]; - } bitmap; - UINT8 x, y; + UINT8 data[2][0x100][0x20]; + } bitmap; + UINT8 x, y; bool y_increment; } video; struct { + bool set; int bit_shifter; UINT8 cartridge_byte; UINT16 address; // in reality something more like short local cartridge address offset bool unprotected; bool failed; + } card_protection; required_device m_maincpu; required_device m_cart; -// required_device m_gfxdecode; +#ifdef USE_GFX + required_device m_gfxdecode; +#endif required_ioport m_io_joy; required_device m_palette; required_shared_ptr m_bios; emu_timer *timer1; emu_timer *timer2; + UINT8 bank_multi; }; 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) { case 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 ) { - UINT8 ret=1; - switch (offset) { - case 0: - ret=(card_protection.cartridge_byte&0x80)?2:0; - card_protection.cartridge_byte<<=1; - card_protection.bit_shifter++; - if (card_protection.bit_shifter>=8) { - card_protection.bit_shifter=0; - card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++]; - card_protection.unprotected=true; - if (!card_protection.failed) { - } // now protection chip on cartridge activates cartridge chip select on cpu accesses - } - break; + + UINT8 ret=1; + if (card_protection.bit_shifter==7 && card_protection.unprotected) { + ret=m_cart->get_rom_base()[bank_multi*0x4000]; + } else { + card_protection.bit_shifter++; + if (card_protection.bit_shifter==8) { + card_protection.bit_shifter=0; + card_protection.cartridge_byte='G'; + card_protection.unprotected=true; } - 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 ) { - video.reg[offset]=data; - switch (offset) { - case 1: video.bitmap.write=data&0xc0; // more addressing mode + video.reg[offset]=data; + switch (offset) { + case 1: video.bitmap.write=data&0xc0; // more addressing mode video.y_increment=data&0x40; break; case 2: video.bitmap.xpos=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 5: video.y=data;break; - case 7: - if (video.bitmap.write) { - if (video.xpc(), video.x); - } else { - video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; - } - if (video.y_increment) video.y++; + case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break; + case 5: video.y=data;break; + case 7: + if (video.bitmap.write) { + if (video.xpc(), video.x); + } else { + video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; + } + if (video.y_increment) video.y++; else video.x++; - } + } } 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 ) @@ -149,54 +183,55 @@ WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) READ8_MEMBER( gamate_state::gamate_video_r ) { if (offset!=6) return 0; - UINT8 data=0; - if (video.bitmap.write) { - if (video.xpc()<0xf000) - logerror("%.6f video read %04x %02x\n",machine().time().as_double(),offset, data); - return data; + UINT8 data=0; + if (video.bitmap.write) { + if (video.xpc()<0xf000) + logerror("%.6f video read %04x %02x\n",machine().time().as_double(),offset, data); + return data; } 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 ) { - 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; } READ8_MEMBER( gamate_state::gamate_pad_r ) { - UINT8 data=m_io_joy->read(); - return data; + UINT8 data=m_io_joy->read(); + return data; } static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state ) - AM_RANGE(0x0000, 0x03ff) AM_RAM - AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w) - AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r) - AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) - AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) + AM_RANGE(0x0000, 0x03ff) AM_RAM + AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w) + AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r) + AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) + 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(0xa000, 0xdfff) AM_READ_BANK("bank") + AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti") + 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, 0xdfff) AM_READWRITE(gamate_cart_r, gamate_cart_w) + AM_RANGE(0x6000, 0x6000) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w) AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_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 @@ -212,38 +247,39 @@ static INPUT_PORTS_START( gamate ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") INPUT_PORTS_END -#ifdef UNUSED_CODE +#ifdef USE_GFX static const struct gfx_layout gamate_charlayout = { - 4, /* width of object */ - 1, /* height of object */ - 256,/* 256 characters */ - 2, /* bits per pixel */ - { 0,1 }, /* no bitplanes */ - /* x offsets */ - { 0,2,4,6 }, - /* y offsets */ - { 0 }, - 8*1 /* size of 1 object in bits */ + 4, /* width of object */ + 1, /* height of object */ + 256,/* 256 characters */ + 2, /* bits per pixel */ + { 0,4 }, /* no bitplanes */ + /* x offsets */ + { 0,1,2,3 }, + /* y offsets */ + { 0 }, + 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] = { 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 */ static const unsigned char gamate_colors[4][3] = { - { 255,255,255 }, - { 0xa0, 0xa0, 0xa0 }, - { 0x60, 0x60, 0x60 }, - { 0, 0, 0 } + { 255,255,255 }, + { 0xa0, 0xa0, 0xa0 }, + { 0x60, 0x60, 0x60 }, + { 0, 0, 0 } }; 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]); } -#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) { 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[0]=((plane1>>3)&1)|((plane2>>2)&2); } +#endif UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, j; - for (y=0;y<152;y++) { - 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 d2=video.bitmap.data[1][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f]; - BlitPlane(&bitmap.pix16(y, x+4), d1, d2); - BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4); - } - } - return 0; + int x, y, j; + for (y=0;y<152;y++) { + 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 d2=video.bitmap.data[1][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f]; +#ifdef USE_GFX + 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 + 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) { 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)); 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() { if (m_cart->exists()) { -// 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()); +// 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()+1); 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 - 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; +// m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback + card_protection.set=false; + bank_multi=0; card_protection.unprotected=false; timer2->enable(TRUE); 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_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_INDIRECT_ENTRIES(4) MCFG_PALETTE_INIT_OWNER(gamate_state, gamate) MCFG_DEFAULT_LAYOUT(layout_lcd) @@ -370,10 +407,17 @@ MACHINE_CONFIG_END ROM_START(gamate) 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) +#endif ROM_END /* 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) + +