nes-fix mapper027 based on new understandings from fceumm; fix world hero
This commit is contained in:
parent
91a71febe5
commit
efbdd58839
|
@ -256,7 +256,6 @@
|
|||
<Compile Include="Consoles\Nintendo\NES\Boards\JALECO_JF_19.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\JALECO_SS8806.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper015.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper027.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper036.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper038.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper040.cs" />
|
||||
|
|
|
@ -3,6 +3,10 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
//27
|
||||
|
||||
//TODO - could merge functionality with 192 somehow
|
||||
|
||||
namespace BizHawk.Emulation.Consoles.Nintendo
|
||||
{
|
||||
class Mapper074 : MMC3Board_Base
|
||||
|
|
|
@ -1,154 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace BizHawk.Emulation.Consoles.Nintendo
|
||||
{
|
||||
// World Hero (Unl)
|
||||
// 8k banked prgrom, 1k banked chrrom, scanline counter
|
||||
// tried to copy behavior from fceux, but it doesn't work
|
||||
public class Mapper027 : NES.NESBoardBase
|
||||
{
|
||||
// state
|
||||
int[] chr = new int[8];
|
||||
int[] prg = new int[4];
|
||||
int prglatch;
|
||||
int irqlatch;
|
||||
int irqstat;
|
||||
int irqcount;
|
||||
|
||||
// config
|
||||
int chr_mask;
|
||||
int prg_mask;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER027":
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
AssertPrg(128);
|
||||
AssertChr(512);
|
||||
AssertVram(0);
|
||||
AssertWram(0);
|
||||
prg_mask = Cart.prg_size / 8 - 1;
|
||||
chr_mask = Cart.chr_size / 1 - 1;
|
||||
prg[3] = prg_mask;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override byte ReadPRG(int addr)
|
||||
{
|
||||
return ROM[addr & 0x1fff | prg[addr >> 13] << 13];
|
||||
}
|
||||
|
||||
public override byte ReadPPU(int addr)
|
||||
{
|
||||
if (addr < 0x2000)
|
||||
return VROM[addr & 0x3ff | chr[addr >> 10] << 10];
|
||||
else
|
||||
return base.ReadPPU(addr);
|
||||
}
|
||||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
addr &= 0xf00f;
|
||||
//if (true)
|
||||
// Console.WriteLine("{0:x4}:{1:x2}", addr + 0x8000, value);
|
||||
if (addr >= 0x3000 && addr <= 0x6003)
|
||||
{
|
||||
int regnum = (addr >> 12) + 1 & 3;
|
||||
regnum = regnum << 1 | (addr & 2) >> 1;
|
||||
if ((addr & 1) != 0)
|
||||
{
|
||||
chr[regnum] &= 0x00f;
|
||||
chr[regnum] |= value << 4 & chr_mask;
|
||||
}
|
||||
else
|
||||
{
|
||||
chr[regnum] &= 0x1f0;
|
||||
chr[regnum] |= value & 0xf & chr_mask;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
case 0x0000:
|
||||
prg[prglatch] = value & prg_mask;
|
||||
break;
|
||||
case 0x1000:
|
||||
switch (value & 3)
|
||||
{
|
||||
case 0: SetMirrorType(EMirrorType.Vertical); break;
|
||||
case 1: SetMirrorType(EMirrorType.Horizontal); break;
|
||||
case 2: SetMirrorType(EMirrorType.OneScreenA); break;
|
||||
case 3: SetMirrorType(EMirrorType.OneScreenB); break;
|
||||
}
|
||||
prglatch = value & 2; // in fceux, this runs because of a lack of case break. bug?
|
||||
break;
|
||||
case 0x1002:
|
||||
prglatch = value & 2;
|
||||
break;
|
||||
case 0x2000:
|
||||
prg[1] = value & prg_mask;
|
||||
break;
|
||||
case 0x7000:
|
||||
irqlatch &= 0xf0;
|
||||
irqlatch |= value & 0x0f;
|
||||
break;
|
||||
case 0x7001:
|
||||
irqlatch &= 0x0f;
|
||||
irqlatch |= value << 4 & 0xf0;
|
||||
break;
|
||||
case 0x7002:
|
||||
irqstat = value & 3;
|
||||
if ((irqstat & 2) != 0)
|
||||
irqcount = irqlatch - 1;
|
||||
break;
|
||||
case 0x7003:
|
||||
irqstat = irqstat << 1 & 2 | irqstat & 1;
|
||||
IRQSignal = false;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// irq timing is entirely a guess; this bit improvised from ExROM
|
||||
public override void ClockPPU()
|
||||
{
|
||||
if (NES.ppu.ppur.status.cycle != 336)
|
||||
return;
|
||||
if (!NES.ppu.reg_2001.PPUON)
|
||||
return;
|
||||
|
||||
int sl = NES.ppu.ppur.status.sl + 1;
|
||||
|
||||
if (sl >= 241)
|
||||
return;
|
||||
hblanktrigger();
|
||||
}
|
||||
|
||||
void hblanktrigger()
|
||||
{
|
||||
if ((irqstat & 2) != 0)
|
||||
{
|
||||
if (irqcount == 255)
|
||||
{
|
||||
IRQSignal = true;
|
||||
irqcount = irqlatch + 1;
|
||||
Console.WriteLine("Raise");
|
||||
}
|
||||
else
|
||||
irqcount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -17,13 +17,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
Func<int, int> fix_chr;
|
||||
int type;
|
||||
bool latch6k_exists = false;
|
||||
bool extrabig_chr = false;
|
||||
|
||||
//state
|
||||
public int[] prg_bank_reg_8k = new int[2];
|
||||
public int[] chr_bank_reg_1k = new int[16];
|
||||
bool prg_mode;
|
||||
ByteBuffer prg_banks_8k = new ByteBuffer(4);
|
||||
public ByteBuffer chr_banks_1k = new ByteBuffer(8);
|
||||
public IntBuffer chr_banks_1k = new IntBuffer(8);
|
||||
bool irq_mode;
|
||||
bool irq_enabled, irq_pending, irq_autoen;
|
||||
byte irq_reload;
|
||||
|
@ -88,7 +89,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
temp = fix_chr(temp);
|
||||
//Console.Write("{0},", temp);
|
||||
temp &= chr_bank_mask_1k;
|
||||
chr_banks_1k[i] = (byte)temp;
|
||||
chr_banks_1k[i] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,6 +109,15 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
case "MAPPER025":
|
||||
throw new InvalidOperationException("someone will need to bug me to set these up for failsafe mapping");
|
||||
|
||||
case "MAPPER027":
|
||||
//not exactly the same implementation as FCEUX, but we're taking functionality from it step by step as we discover and document it
|
||||
//world hero (unl) is m027 and depends on the extrabig_chr functionality to have correct graphics.
|
||||
//otherwise, cah4e3 says its the same as VRC4
|
||||
extrabig_chr = true;
|
||||
remap = (addr) => addr;
|
||||
type = 4;
|
||||
break;
|
||||
|
||||
case "MAPPER116_HACKY":
|
||||
remap = (addr) => addr;
|
||||
type = 2;
|
||||
|
@ -190,8 +200,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
//Console.WriteLine("mapping {0:X4} = {1:X2}", addr, value);
|
||||
//Console.WriteLine("mapping {0:X4} = {1:X2}", addr + 0x8000, value);
|
||||
addr = remap(addr);
|
||||
|
||||
int chr_value = value & 0xF;
|
||||
if ((addr & 1) == 1 && extrabig_chr)
|
||||
chr_value = value & 0x1F;
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
default:
|
||||
|
@ -236,7 +251,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
case 0x3001: //$B001
|
||||
case 0x3002: //$B002
|
||||
case 0x3003: //$B003
|
||||
chr_bank_reg_1k[addr-0x3000] = value & 0xF;
|
||||
chr_bank_reg_1k[addr - 0x3000] = chr_value;
|
||||
SyncCHR();
|
||||
break;
|
||||
|
||||
|
@ -244,7 +259,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
case 0x4001: //$C001
|
||||
case 0x4002: //$C002
|
||||
case 0x4003: //$C003
|
||||
chr_bank_reg_1k[addr - 0x4000 + 4] = value & 0xF;
|
||||
chr_bank_reg_1k[addr - 0x4000 + 4] = chr_value;
|
||||
SyncCHR();
|
||||
break;
|
||||
|
||||
|
@ -252,7 +267,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
case 0x5001: //$D001
|
||||
case 0x5002: //$D002
|
||||
case 0x5003: //$D003
|
||||
chr_bank_reg_1k[addr - 0x5000 + 8] = value & 0xF;
|
||||
chr_bank_reg_1k[addr - 0x5000 + 8] = chr_value;
|
||||
SyncCHR();
|
||||
break;
|
||||
|
||||
|
@ -260,7 +275,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
|
|||
case 0x6001: //$E001
|
||||
case 0x6002: //$E002
|
||||
case 0x6003: //$E003
|
||||
chr_bank_reg_1k[addr - 0x6000 + 12] = value & 0xF;
|
||||
chr_bank_reg_1k[addr - 0x6000 + 12] = chr_value;
|
||||
SyncCHR();
|
||||
break;
|
||||
|
||||
|
|
|
@ -73,6 +73,13 @@ sha1:7BD102770FE7766BF8430ACDB3C17EE51E30478C H Mike Tyson's Punch-Out!! (Hacked
|
|||
sha1:536D623BA02A622BDE8E2D7D514AE9785B5E0357 H Punch Out!! Kirby (Hack) (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
|
||||
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
|
||||
;heres another idea. let's list rom sets from goodNES, good and bad variants together
|
||||
sha1:98B71119294DA59D1B22723D2D2955D80EADABF4 World Hero (Unl) [!] NES board=MAPPER027
|
||||
sha1:17AC56723F99A646BD44F8C999B23B8A972A3EF2 B World Hero (Unl) [b1] NES board=MAPPER027
|
||||
sha1:5227195D5DB2030758BF67704150E8C5FAF056B1 B World Hero (Unl) [b2] NES board=MAPPER027
|
||||
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
|
||||
;obscure and unlicensed roms which are not likely to be in bootgod's DB anytime soon but which are nonetheless "good" as far as things go
|
||||
;people like these games (especially vast quantities of chinese oddities) so its important to add them here as good
|
||||
|
|
Loading…
Reference in New Issue