[NES] some refinements to TxROM

This commit is contained in:
zeromus 2011-05-22 18:15:47 +00:00
parent a2dede0bfa
commit dcea6adba0
2 changed files with 87 additions and 48 deletions

View File

@ -86,7 +86,7 @@
<Compile Include="Consoles\Nintendo\NES\Boards\SxROM.cs"> <Compile Include="Consoles\Nintendo\NES\Boards\SxROM.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Consoles\Nintendo\NES\Boards\TxROM.cs" /> <Compile Include="Consoles\Nintendo\NES\Boards\TxROM_DxROM.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\UxROM.cs"> <Compile Include="Consoles\Nintendo\NES\Boards\UxROM.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>

View File

@ -2,9 +2,12 @@
using System.IO; using System.IO;
using System.Diagnostics; using System.Diagnostics;
//TODO - mapper 118 and 119 need to be gracefully worked in here.
//but we might want to break them down into a new board type and reuse class mmc3. be sure to try that to see how it goes
namespace BizHawk.Emulation.Consoles.Nintendo namespace BizHawk.Emulation.Consoles.Nintendo
{ {
public class TxROM : NES.NESBoardBase public class TxROM_DxROM : NES.NESBoardBase
{ {
class MMC3 : IDisposable class MMC3 : IDisposable
{ {
@ -100,9 +103,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo
void ClockIRQ() void ClockIRQ()
{ {
if(irq_counter == 0) if (irq_counter == 0)
irq_counter = irq_reload; irq_counter = irq_reload;
else { else
{
irq_counter--; irq_counter--;
//Console.WriteLine(irq_counter); //Console.WriteLine(irq_counter);
if (irq_counter == 0) if (irq_counter == 0)
@ -118,13 +122,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public void Tick_PPU(int addr) public void Tick_PPU(int addr)
{ {
ppubus_statecounter++; ppubus_statecounter++;
int state = (addr >> 12)&1; int state = (addr >> 12) & 1;
if(ppubus_state == 0 && ppubus_statecounter > 1 && state == 1) if (ppubus_state == 0 && ppubus_statecounter > 1 && state == 1)
{ {
ppubus_statecounter = 0; ppubus_statecounter = 0;
ClockIRQ(); ClockIRQ();
} }
if(ppubus_state != state) if (ppubus_state != state)
{ {
ppubus_state = state; ppubus_state = state;
} }
@ -134,7 +138,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//configuration //configuration
int prg_mask, chr_mask; int prg_mask, chr_mask;
int wram_mask; int wram_mask, vram_mask;
int vram_bytes;
bool fourscreen;
//state //state
MMC3 mmc3; MMC3 mmc3;
@ -170,13 +176,33 @@ namespace BizHawk.Emulation.Consoles.Nintendo
return VROM[addr]; return VROM[addr];
else return VRAM[addr]; else return VRAM[addr];
} }
else if (fourscreen)
{
int myaddr = addr - 0x2000;
if (myaddr < vram_bytes)
return VRAM[myaddr];
else
return base.ReadPPU(addr);
}
else return base.ReadPPU(addr); else return base.ReadPPU(addr);
} }
public override void WritePPU(int addr, byte value) public override void WritePPU(int addr, byte value)
{ {
mmc3.Tick_PPU(addr); mmc3.Tick_PPU(addr);
base.WritePPU(addr, value); if (fourscreen)
{
if (addr >= 0x2000)
{
int myaddr = addr - 0x2000;
if (myaddr < vram_bytes)
VRAM[myaddr] = value;
else
base.WritePPU(addr, value);
}
else base.WritePPU(addr, value);
}
else base.WritePPU(addr, value);
} }
public override byte ReadWRAM(int addr) public override byte ReadWRAM(int addr)
@ -213,53 +239,64 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//analyze board type //analyze board type
switch (Cart.board_type) switch (Cart.board_type)
{ {
case "NES-TBROM": case "NES-TBROM": //tecmo world cup soccer (DE) [untested]
AssertPrg(64); AssertChr(64); AssertVram(0); AssertWram(0); AssertPrg(64); AssertChr(64); AssertVram(0); AssertWram(0);
AssertBattery(false); AssertBattery(false);
break; break;
case "NES-TEROM": //Adv of lolo 2 case "NES-TEROM": //Adv of lolo 2
AssertPrg(32); AssertChr(32); AssertVram(0); AssertWram(0); AssertPrg(32); AssertChr(32); AssertVram(0); AssertWram(0);
AssertBattery(false); AssertBattery(false);
break; break;
case "NES-TFROM": case "NES-TFROM": //legacy of the wizard
AssertPrg(128); AssertChr(32, 64); AssertVram(0); AssertWram(0); AssertPrg(128); AssertChr(32, 64); AssertVram(0); AssertWram(0);
AssertBattery(false); AssertBattery(false);
break; break;
case "NES-TGROM": //mega man 4 & 6 case "NES-TGROM": //mega man 4 & 6
AssertPrg(128, 256, 512); AssertChr(0); AssertVram(8); AssertWram(0); AssertPrg(128, 256, 512); AssertChr(0); AssertVram(8); AssertWram(0);
AssertBattery(false); AssertBattery(false);
break; break;
case "NES-TKROM": //kirby's adventure case "NES-TKROM": //kirby's adventure
AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(8); AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(8);
break; break;
case "NES-TLROM": //mega man 3 case "NES-TLROM": //mega man 3
AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(0); AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(0);
AssertBattery(false); AssertBattery(false);
break;
case "NES-TL1ROM": //Double dragon 2
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
case "NES-TL2ROM": //batman (U) ?
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
case "NES-TQROM": //{mapper 119} high speed - ALMOST POSITIVELTY NEEDS WORK
AssertPrg(128); AssertChr(64); AssertVram(8); AssertWram(0);
AssertBattery(false);
break;
case "NES-TR1ROM": //gauntlet (U) - someone please test this
AssertPrg(128); AssertChr(64); AssertVram(2); AssertWram(0);
fourscreen = true;
AssertBattery(false);
break;
case "NES-TSROM": //super mario bros. 3 (U)
AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(8);
AssertBattery(false);
break;
case "NES-TVROM": //rad racer II (U)
AssertPrg(64); AssertChr(64); AssertVram(8); AssertWram(0);
fourscreen = true;
AssertBattery(false);
break;
case "NES-B4": //batman (U)
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
case "NES-DRROM": //gauntlet (U) sometimes
AssertPrg(128); AssertChr(64); AssertVram(2); AssertWram(0);
fourscreen = true;
AssertBattery(false);
break; break;
case "NES-TL1ROM": //Double dragon 2
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
case "NES-TL2ROM":
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
case "NES-TQROM":
AssertPrg(128); AssertChr(64); AssertVram(8); AssertWram(0);
AssertBattery(false);
break;
case "NESTR1-ROM":
AssertPrg(128); AssertChr(64); AssertVram(2); AssertWram(0);
AssertBattery(false);
break;
case "NES-TSROM": //super mario bros. 3 USA
AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(8);
AssertBattery(false);
break;
case "NES-TVROM":
AssertPrg(64); AssertChr(64); AssertVram(4); AssertWram(0);
AssertBattery(false);
break;
default: default:
return false; return false;
} }
@ -272,6 +309,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
chr_mask = num_chr_banks - 1; chr_mask = num_chr_banks - 1;
wram_mask = (Cart.wram_size * 1024) - 1; wram_mask = (Cart.wram_size * 1024) - 1;
vram_mask = (Cart.vram_size * 1024) - 1;
vram_bytes = Cart.vram_size * 1024;
mmc3 = new MMC3(this, num_prg_banks); mmc3 = new MMC3(this, num_prg_banks);
SetMirrorType(EMirrorType.Vertical); SetMirrorType(EMirrorType.Vertical);