upgrade to cah4e3's latest mapper 163&164 code to fix a crash in a game

This commit is contained in:
zeromus 2008-08-11 17:20:56 +00:00
parent de9ab09061
commit 032ac9597b
2 changed files with 52 additions and 12 deletions

View File

@ -2,6 +2,7 @@
10-aug-2008 - punkrockguy318 - SDL: cleaned up the SConsruct 10-aug-2008 - punkrockguy318 - SDL: cleaned up the SConsruct
10-aug-2008 - punkrockguy318 - SDL: fixed issue where fceu would lock up when file dialogs were opened during fullscreen 10-aug-2008 - punkrockguy318 - SDL: fixed issue where fceu would lock up when file dialogs were opened during fullscreen
10-aug-2008 - zeromus - upgrade to cah4e3's latest mapper 163&164 code to fix a crash in a game
10-aug-2008 - zeromus - remove cnrom chr rom size limit for homebrew roms 10-aug-2008 - zeromus - remove cnrom chr rom size limit for homebrew roms
10-aug-2008 - punkrockguy318 - SDL: fixed bug where fceux would close when file dialogs were closed 10-aug-2008 - punkrockguy318 - SDL: fixed bug where fceux would close when file dialogs were closed
10-aug-2008 - punkrockguy318 - SDL: File open dialog is now used to movie playback 10-aug-2008 - punkrockguy318 - SDL: File open dialog is now used to movie playback

View File

@ -1,7 +1,7 @@
/* FCE Ultra - NES/Famicom Emulator /* FCE Ultra - NES/Famicom Emulator
* *
* Copyright notice for this file: * Copyright notice for this file:
* Copyright (C) 2002 Xodnizel * Copyright (C) 2002 Xodnizel 2006 CaH4e3
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -19,13 +19,14 @@
*/ */
#include "mapinc.h" #include "mapinc.h"
#include <stdio.h>
#include <string.h> static uint8 cmd, laststrobe, trigger;
static uint8 cmd;
static uint8 DRegs[8]; static uint8 DRegs[8];
static SFORMAT StateRegs[]= static SFORMAT StateRegs[]=
{ {
{&cmd, 1, "CMD"}, {&cmd, 1, "CMD"},
{&laststrobe, 1, "STB"},
{&trigger, 1, "TRG"},
{DRegs, 8, "DREG"}, {DRegs, 8, "DREG"},
{0} {0}
}; };
@ -33,7 +34,6 @@ static SFORMAT StateRegs[]=
static void Sync(void) static void Sync(void)
{ {
setprg32(0x8000,(DRegs[0]<<4)|(DRegs[1]&0xF)); setprg32(0x8000,(DRegs[0]<<4)|(DRegs[1]&0xF));
setchr8(0);
} }
static void StateRestore(int version) static void StateRestore(int version)
@ -41,22 +41,46 @@ static void StateRestore(int version)
Sync(); Sync();
} }
static DECLFR(ReadLow)
{
switch (A&0x7700)
{
case 0x5100: return DRegs[2]; break;
case 0x5500: if(trigger)
return DRegs[2];
else
return 0;
}
return 4;
}
static DECLFW(Write) static DECLFW(Write)
{ {
switch (A&0x7300) switch (A&0x7300)
{ {
case 0x5100: DRegs[0]=V; Sync(); break; case 0x5100: DRegs[0]=V; Sync(); break;
case 0x5000: DRegs[1]=V; Sync(); break; case 0x5000: DRegs[1]=V; Sync(); break;
case 0x5300: DRegs[2]=V; break;
} }
} }
static DECLFW(Write2) static DECLFW(Write2)
{ {
// FCEU_printf("bs %04x %02x\n",A,V); if(A==0x5101)
{
if(laststrobe&&!V)
{
trigger^=1;
}
laststrobe=V;
}else if(A==0x5100&&V==6) //damn thoose protected games
setprg32(0x8000,3);
else
switch (A&0x7300) switch (A&0x7300)
{ {
case 0x5200: DRegs[0]=V; Sync(); break; case 0x5200: DRegs[0]=V; Sync(); break;
case 0x5000: DRegs[1]=V; Sync(); break; case 0x5000: DRegs[1]=V; Sync(); if(!(DRegs[1]&0x80)&&(scanline<128)) setchr8(0); break;
case 0x5300: DRegs[2]=V; break;
} }
} }
@ -77,28 +101,42 @@ static void Power(void)
DRegs[1]=0xFF; DRegs[1]=0xFF;
cmd=0; cmd=0;
SetReadHandler(0x8000,0xFFFF,CartBR); SetReadHandler(0x8000,0xFFFF,CartBR);
SetWriteHandler(0x4020,0xFFFF,Write); SetWriteHandler(0x4020,0x5FFF,Write);
SetReadHandler(0x6000,0x7FFF,AWRAM); SetReadHandler(0x6000,0x7FFF,AWRAM);
SetWriteHandler(0x6000,0x7FFF,BWRAM); SetWriteHandler(0x6000,0x7FFF,BWRAM);
setchr8(0);
Sync(); Sync();
} }
static void M163HB(void) static void M163HB(void)
{ {
if(scanline==127&&DRegs[1]&0x80) if(DRegs[1]&0x80)
setchr4(0x0000,1); {
if(scanline==239)
{
setchr4(0x0000,0);
setchr4(0x1000,0);
}
else if(scanline==127)
{
setchr4(0x0000,1);
setchr4(0x1000,1);
}
}
} }
static void Power2(void) static void Power2(void)
{ {
memset(DRegs,0,8); memset(DRegs,0,8);
DRegs[1]=0xFF; DRegs[1]=0xFF;
laststrobe=1;
cmd=0; cmd=0;
SetReadHandler(0x8000,0xFFFF,CartBR); SetReadHandler(0x8000,0xFFFF,CartBR);
SetWriteHandler(0x4020,0xFFFF,Write2); SetWriteHandler(0x4020,0x5FFF,Write2);
SetReadHandler(0x6000,0x7FFF,AWRAM); SetReadHandler(0x6000,0x7FFF,AWRAM);
SetWriteHandler(0x6000,0x7FFF,BWRAM); SetWriteHandler(0x6000,0x7FFF,BWRAM);
SetReadHandler(0x5000,0x5FFF,ReadLow);
setchr8(0);
Sync(); Sync();
} }
@ -115,4 +153,5 @@ void Mapper163_Init(CartInfo *info)
GameHBIRQHook=M163HB; GameHBIRQHook=M163HB;
GameStateRestore=StateRestore; GameStateRestore=StateRestore;
AddExState(&StateRegs, ~0, 0, 0); AddExState(&StateRegs, ~0, 0, 0);
AddExState(WRAM, 8192, 0, "WRAM");
} }