diff options
Diffstat (limited to 'src/mess/drivers/gamate.c')
-rw-r--r-- | src/mess/drivers/gamate.c | 214 |
1 files changed, 110 insertions, 104 deletions
diff --git a/src/mess/drivers/gamate.c b/src/mess/drivers/gamate.c index 57101df8b0b..f4e3b7ab84a 100644 --- a/src/mess/drivers/gamate.c +++ b/src/mess/drivers/gamate.c @@ -3,7 +3,11 @@ Peter Wilhelmsen peter.wilhelmsen@gmail.com Morten Shearman Kirkegaard morten+gamate@afdelingp.dk Juan F??lix Mateos vectrex@hackermesh.org -******************************************************************************/ + + nmi unknown + cube up audio sometimes missing + bomb blast top status line missing + ******************************************************************************/ #include "emu.h" #include "cpu/m6502/m6502.h" @@ -36,6 +40,7 @@ public: DECLARE_WRITE8_MEMBER(cart_bankswitch_w); DECLARE_READ8_MEMBER(gamate_video_r); DECLARE_READ8_MEMBER(gamate_pad_r); + DECLARE_READ8_MEMBER(gamate_nmi_r); DECLARE_WRITE8_MEMBER(gamate_video_w); DECLARE_READ8_MEMBER(gamate_audio_r); DECLARE_WRITE8_MEMBER(gamate_audio_w); @@ -51,25 +56,24 @@ private: struct { - UINT8 reg[8]; - struct { - bool write; - bool page2; // else page1 + UINT8 reg[8]; + struct { + 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; + 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<cpu_device> m_maincpu; @@ -80,13 +84,13 @@ private: required_shared_ptr<UINT8> m_bios; emu_timer *timer1; emu_timer *timer2; - UINT8 bank_multi; + 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); - + 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); @@ -100,10 +104,11 @@ WRITE8_MEMBER( gamate_state::gamate_cart_protection_w ) } READ8_MEMBER( gamate_state::gamate_cart_protection_r ) { - UINT8 ret=1; - if (card_protection.bit_shifter==7 && card_protection.unprotected) { - ret=m_cart->get_rom_base()[bank_multi*0x4000]; - } else { + + 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; @@ -112,66 +117,59 @@ READ8_MEMBER( gamate_state::gamate_cart_protection_r ) } 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 +// 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; + } + 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; + // 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; + card_protection.set=true; + return 0; } WRITE8_MEMBER( gamate_state::gamate_video_w ) { - video.reg[offset]=data; - switch (offset) { - case 1: - if (data&0xf) printf("lcd mode %x\n", data); - video.bitmap.write=data&0xc0; // more addressing mode - video.y_increment=data&0x40; - break; - case 2: video.bitmap.xpos=data;break; - case 3: - if (data>=200) printf("lcd ypos: %x\n", data); - video.bitmap.ypos=data; - break; - case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break; - case 5: video.y=data;break; - case 7: - if (video.y>=200) - machine().ui().popup_time(2, "bitmap write to x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data); - if (video.bitmap.write) { - video.bitmap.data[video.bitmap.page2][video.y][video.x]=data; - } 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++; - } + video.reg[offset]=data; + switch (offset) { + case 1: + if (data&0xf) printf("lcd mode %x\n", data); + video.y_increment=data&0x40; + break; + case 2: video.bitmap.xpos=data;break; + case 3: + if (data>=200) printf("lcd ypos: %x\n", data); + video.bitmap.ypos=data; + break; + case 4: video.bitmap.page2=data&0x80;video.x=data&0x1f;break; + case 5: video.y=data;break; + case 7: + video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; + if (video.y_increment) video.y++; + else video.x++; // overruns + } } WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w ) { - bank_multi=data; - membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1); + bank_multi=data; + membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1); } WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) @@ -181,55 +179,61 @@ 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) { - data=video.bitmap.data[video.bitmap.page2][video.y][video.x]; - } else { - data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; - } + if (offset!=6) return 0; + UINT8 data=0; + data=video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; // if (m_maincpu->pc()<0xf000) // machine().ui().popup_time(2, "lcd read x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data); - return data; + if (video.y_increment) video.y++; + else video.x++; // overruns? + + return data; } WRITE8_MEMBER( gamate_state::gamate_audio_w ) { // printf("audio write %x:%x\n", offset, data);//logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data); - m_sound->device_w(space, offset, data); + m_sound->device_w(space, offset, data); } READ8_MEMBER( gamate_state::gamate_audio_r ) { -// legend of dragon knight -// machine().ui().popup_time(2, "%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset); - return 0; + UINT8 data=m_sound->device_r(space, offset); + return data; } 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(0x5800, 0x5800) AM_READ(newer_protection_set) - AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset) - AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) +READ8_MEMBER( gamate_state::gamate_nmi_r ) +{ + UINT8 data=0; + machine().ui().popup_time(2, "nmi/4800 read\n"); + return data; +} - AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti") - AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank") +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(0x4800, 0x4800) AM_READ(gamate_nmi_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(0x6001, 0x9fff) AM_READ_BANK("bankmulti") + AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank") 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 @@ -245,7 +249,7 @@ static INPUT_PORTS_START( gamate ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") INPUT_PORTS_END -ATTR_UNUSED static const unsigned short gamate_palette[4] = +static const unsigned short gamate_palette[4] = { 0,1,2,3 }; @@ -254,10 +258,10 @@ ATTR_UNUSED static const unsigned short gamate_palette[4] = /* 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) @@ -280,27 +284,27 @@ static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2) 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, d2; - if (video.bitmap.ypos<200) { + 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, d2; + if (video.bitmap.ypos<200) { d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; - } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines + } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines; most likely problematic 200 warp around hardware! no real usage int yi=(y+(video.bitmap.ypos&0xf)-8); if (yi<0) yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane? d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f]; - } else { + } else { d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f]; - d2=video.bitmap.data[1][y][(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; + d2=video.bitmap.data[1][y][(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; } DRIVER_INIT_MEMBER(gamate_state,gamate) @@ -314,11 +318,11 @@ 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)); +// 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; // default bios: $47 protection readback +// m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback card_protection.set=false; bank_multi=0; card_protection.unprotected=false; @@ -378,7 +382,7 @@ static MACHINE_CONFIG_START( gamate, gamate_state ) MCFG_SOUND_ADD("custom", GAMATE_SND, 0) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) - + MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gamate_cart") MCFG_GENERIC_MANDATORY @@ -396,4 +400,6 @@ 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_IMPERFECT_SOUND) +CONS( 19??, gamate, 0, 0, gamate, gamate, gamate_state, gamate, "Bit Corp", "Gamate", 0) + + |