NES: add some vs system stuff. not done yet

This commit is contained in:
goyuken 2012-10-31 21:15:44 +00:00
parent a5d4cd155d
commit 5cbd11c850
10 changed files with 478 additions and 350 deletions

View File

@ -231,6 +231,7 @@
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper069.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper090.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper091.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper099.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper101.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper103.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Mapper107.cs" />
@ -338,7 +339,6 @@
<Compile Include="Consoles\Nintendo\NES\Boards\VRC6.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\VRC7.cs" />
<Compile Include="Consoles\Nintendo\NES\BisqAPU.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\VsUnisys.cs" />
<Compile Include="Consoles\Nintendo\NES\Core.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\FDS.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\FDSAudio.cs" />

View File

@ -429,6 +429,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
if (!dict.ContainsKey("board"))
throw new Exception("NES gamedb entries must have a board identifier!");
cart.board_type = dict["board"];
if (dict.ContainsKey("system"))
cart.system = dict["system"];
cart.prg_size = -1;
cart.vram_size = -1;
cart.wram_size = -1;

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Consoles.Nintendo
{
// one of the VS unisystem mappers
// a lot of dumps are labelled incorrectly
public class Mapper099 : NES.NESBoardBase
{
int chr;
public override bool Configure(NES.EDetectionOrigin origin)
{
switch (Cart.board_type)
{
case "MAPPER099":
AssertPrg(32); AssertChr(16); Cart.vram_size = 0; Cart.wram_size = 0;
break;
default:
return false;
}
return true;
}
public void Signal4016(int val)
{
chr = val & 1;
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
return VROM[addr | chr << 13];
else
return base.ReadPPU(addr);
}
}
}

View File

@ -1,73 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Consoles.Nintendo
{
public class VsUnisys : NES.NESBoardBase
{
// this is a copy of UNROM until i figure out what the hell is going on
int prg_mask;
int vram_byte_mask;
int prg;
public override bool Configure(NES.EDetectionOrigin origin)
{
switch (Cart.board_type)
{
case "MAPPER099":
break;
default:
return false;
}
vram_byte_mask = (Cart.vram_size * 1024) - 1;
prg_mask = (Cart.prg_size / 16) - 1;
SetMirrorType(Cart.pad_h, Cart.pad_v);
return true;
}
public override byte ReadPRG(int addr)
{
int block = addr >> 14;
int page = block == 1 ? prg_mask : prg;
int ofs = addr & 0x3FFF;
return ROM[(page << 14) | ofs];
}
public override void WritePRG(int addr, byte value)
{
prg = value & prg_mask;
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
{
return VRAM[addr & vram_byte_mask];
}
else return base.ReadPPU(addr);
}
public override void WritePPU(int addr, byte value)
{
if (addr < 0x2000)
{
VRAM[addr & vram_byte_mask] = value;
}
else base.WritePPU(addr, value);
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg", ref prg);
}
}
}

View File

@ -30,6 +30,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public bool SoundOn = true;
int sprdma_countdown;
bool _irq_apu; //various irq signals that get merged to the cpu irq pin
/// <summary>if true, use VS. system arrangement of $4016..$4020</summary>
bool vs_io = false;
bool vs_coin1;
bool vs_coin2;
//irq state management
public bool irq_apu { get { return _irq_apu; } set { _irq_apu = value; } }
@ -148,11 +152,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo
magicSoundProvider = new MagicSoundProvider(this, 1789773);
break;
// there's no official name for these in bootgod, not sure what we should use
case "PC10":
//case "PC10"://TODO
case "VS":
ppu.region = PPU.Region.RGB;
cpu_sequence = cpu_sequence_NTSC;
magicSoundProvider = new MagicSoundProvider(this, 1789773);
vs_io = true;
break;
// this is in bootgod, but not used at all
case "Dendy":
@ -208,6 +213,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo
if (Controller["FDS Insert " + i])
b.InsertSide(i);
}
if (vs_io)
{
if (Controller["VS Coin 1"])
vs_coin1 = true;
if (Controller["VS Coin 2"])
vs_coin2 = true;
}
ppu.FrameAdvance();
if (lagged)
@ -307,6 +319,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case 0x4016:
ports[0].Write(val & 1);
ports[1].Write(val & 1);
if (vs_io && board is Mapper099)
{
// happily, there aren't any other "VS exceptions" like this
var b = board as Mapper099;
b.Signal4016(val >> 2 & 1);
}
break;
case 0x4017: apu.WriteReg(addr, val); break;
default:
@ -322,9 +340,45 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//many todos here
lagged = false;
byte ret;
if(addr == 0x4016)
ret = ports[0].Read();
else ret = ports[1].Read();
if (addr == 0x4016)
ret = ports[vs_io ? 1 : 0].Read();
else
ret = ports[vs_io ? 0 : 1].Read();
if (vs_io)
{
if (addr == 0x4016)
{
// clear bits 2-6
ret &= 0x83;
if (false) // service switch
ret |= 0x04;
if (false) // DIP1
ret |= 0x08;
if (false) // DIP2
ret |= 0x10;
if (vs_coin1)
ret |= 0x20;
if (vs_coin2)
ret |= 0x40;
}
else
{
// clear bits 2-7
ret &= 0x03;
if (false) // DIP3
ret |= 0x04;
if (false) // DIP4
ret |= 0x08;
if (false) // DIP5
ret |= 0x10;
if (false) // DIP6
ret |= 0x20;
if (false) // DIP7
ret |= 0x40;
if (false) // DIP8
ret |= 0x80;
}
}
return ret;
}
@ -481,6 +535,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo
}
else if (addr < 0x6000)
{
Console.WriteLine("{0:x4}:{1:x2}", addr, value);
if (vs_io && addr == 0x4020 && (value & 1) != 0)
{
// acknowledge coin insertion
vs_coin1 = false;
vs_coin2 = false;
}
board.WriteEXP(addr - 0x4000, value);
}
else if (addr < 0x8000)

View File

@ -33,6 +33,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo
for (int i = 0; i < b.NumSides; i++)
ControllerDefinition.BoolButtons.Add("FDS Insert " + i);
}
if (vs_io)
{
ControllerDefinition.BoolButtons.Add("VS Coin 1");
ControllerDefinition.BoolButtons.Add("VS Coin 2");
}
}
private NES()
@ -759,6 +764,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo
ser.Sync("cpu_step", ref cpu_step);
ser.Sync("cpu_stepcounter", ref cpu_stepcounter);
ser.Sync("cpu_deadcounter", ref cpu_deadcounter);
if (vs_io)
{
ser.Sync("vs_coin1", ref vs_coin1);
ser.Sync("vs_coin2", ref vs_coin2);
}
board.SyncState(ser);
if (board is NESBoardBase && !((NESBoardBase)board).SyncStateFlag)
throw new InvalidOperationException("the current NES mapper didnt call base.SyncState");

File diff suppressed because it is too large Load Diff

View File

@ -1192,7 +1192,7 @@ namespace BizHawk.MultiClient
break;
case "NES":
NESToolStripMenuItem.Visible = true;
NESFDSMenuControls();
NESSpeicalMenuControls();
break;
case "PCE":
case "PCECD":
@ -1231,10 +1231,10 @@ namespace BizHawk.MultiClient
}
}
void NESFDSMenuAdd(string name, string button, string msg)
void NESSpeicalMenuAdd(string name, string button, string msg)
{
fDSToolStripMenuItem.Visible = true;
fDSToolStripMenuItem.DropDownItems.Add(name, null, delegate(object sender, EventArgs e)
nESSpeicalToolStripMenuItem.Visible = true;
nESSpeicalToolStripMenuItem.DropDownItems.Add(name, null, delegate(object sender, EventArgs e)
{
if (Global.Emulator.ControllerDefinition.BoolButtons.Contains(button))
{
@ -1249,22 +1249,25 @@ namespace BizHawk.MultiClient
);
}
void NESFDSMenuControls()
void NESSpeicalMenuControls()
{
// ugly and hacky
fDSToolStripMenuItem.Visible = false;
fDSToolStripMenuItem.DropDownItems.Clear();
nESSpeicalToolStripMenuItem.Visible = false;
nESSpeicalToolStripMenuItem.DropDownItems.Clear();
var ss = Global.Emulator.ControllerDefinition.BoolButtons;
if (ss.Contains("FDS Eject"))
NESFDSMenuAdd("Eject Disk", "FDS Eject", "FDS Disk Ejected.");
NESSpeicalMenuAdd("Eject Disk", "FDS Eject", "FDS Disk Ejected.");
for (int i = 0; i < 16; i++)
{
string s = "FDS Insert " + i;
if (ss.Contains(s))
NESFDSMenuAdd("Insert Disk " + i, s, "FDS Disk " + i + " inserted.");
NESSpeicalMenuAdd("Insert Disk " + i, s, "FDS Disk " + i + " inserted.");
}
if (ss.Contains("VS Coin 1"))
NESSpeicalMenuAdd("Insert Coin 1", "VS Coin 1", "Coin 1 inserted.");
if (ss.Contains("VS Coin 2"))
NESSpeicalMenuAdd("Insert Coin 2", "VS Coin 2", "Coin 2 inserted.");
}
void SyncControls()

View File

@ -121,4 +121,5 @@ sha1:2F29F3DC724027FAD926BC9D4470A481884E42A5 Blargg's 6-MMC6.nes (newer) NES
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
#include gamedb_neshomebrew.txt
#include gamedb_vs.txt
#include gamedb_user.txt

View File

@ -0,0 +1,85 @@
;; NES vs unisys
sha1:085ACDCB5E1FB136F74DC5265C85F0C45CFE98AA U Balloon Fight (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:87F156BC568959E7648973DE3AB401A85DC5502A G Balloon Fight (VS) [!] NES board=MAPPER099;system=VS;
sha1:E1BB6A1858E57D83AC84784075D89D7EDFE066ED U Baseball (VS) (Player 1 Mode) [a1] NES board=MAPPER000;system=VS;
sha1:6287B45DD16BD8366E9D58A6F135ECD81502A1B4 U Baseball (VS) (Player 1 Mode) [a2] NES board=MAPPER000;system=VS;
sha1:7AF6CBA6BF62A7D1B5A5EB310738645064FF9945 U Baseball (VS) (Player 1 Mode) NES board=MAPPER000;system=VS;
sha1:48F46D306CD2EFDCEF1B4066D7A5067AD5C57B34 U Baseball (VS) (Player 2 Mode) [a1] NES board=MAPPER000;system=VS;
sha1:C57B1F474D78357141918BF777C10C8E68D47546 U Baseball (VS) (Player 2 Mode) [a2] NES board=MAPPER000;system=VS;
sha1:E9C2F93FF3E7E9ACDCFFCCD0C1A1BDD0AE415B0C U Baseball (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:0548BD2ECD8740D716DACA27A037B59791168281 B Baseball (VS) [b1] NES board=MAPPER099;system=VS;
sha1:6A01FB7F185A45BAA21CC1EEDEB945CACA1C4D92 B Battle City (VS) [p1][!] NES board=MAPPER000;system=VS;
sha1:75480C5F2C0B370F6D0A0EB4E25ADCB45B672417 O Battle City (VS) [p1][o1] NES board=MAPPER000;system=VS;
sha1:B7FD645A523E57864024369BA7201D851842CC5A B Battle City (VS) [p2] NES board=MAPPER099;system=VS;
sha1:E0572DA111D05BF622EC137DF8A658F7B0687DDF U Battle City (VS) NES board=MAPPER099;system=VS;
sha1:EF5FC47CE468457846B64309312CFE7A68ED6280 B VS. Castlevania (VS) [b1] NES board=NES-UNROM;system=VS;
sha1:279A5A31BA7AB61EF39AE6ED04B5FF7946CBFC62 O VS. Castlevania (VS) [o1] NES board=NES-UNROM;system=VS;
sha1:9EB3B75E7B45DF51B8BCD29DF84689A7E8557F4F U VS. Castlevania (VS) NES board=NES-UNROM;system=VS;
sha1:7FD66E0A4CC0E404F404D8164FA221EE2ACB7A38 U Clu Clu Land (VS) NES board=MAPPER099;system=VS;
sha1:2191BC8619EF2EC4E242FFC42402E6764FB4A740 U Dr. Mario (VS) NES board=MAPPER001;system=VS;
sha1:DE3D2828D34EC8ADF070825A296073D9CA4004FB B Duck Hunt (VS) [b1] NES board=MAPPER099;system=VS;
sha1:41DFF720139CED20A7D1F240D687D7F84FF4FD2E U Duck Hunt (VS) NES board=MAPPER099;system=VS;
sha1:56FB1AAABA3B8C05452B2D5B8F232FAFB64AC70D U Excitebike (VS) [a1] NES board=MAPPER099;system=VS;
sha1:1CF6AA8625AD1558E1F1AAF2E1710D5A09A2CED0 U Excitebike (VS) NES board=MAPPER099;system=VS;
sha1:1B516CF7688792F5DBD669850C047A7AFE9EB59F U Freedom Force (VS) NES board=MAPPER004;system=VS;
sha1:B73D62711B55F5B1065AC6F352A4F6AECD91A731 B Goonies, The (VS) [b1] NES board=MAPPER151;system=VS;
sha1:C5534A442BE65436B3FCB8A2ED0129354ED42DF1 B Goonies, The (VS) [b2] NES board=MAPPER151;system=VS;
sha1:726E10E484FCEFA32EDD531AFE4EEBB9F9F8C536 O Goonies, The (VS) [o1] NES board=MAPPER151;system=VS;
sha1:730AFCD33209469D4F2B2B0ABBF86A22AA052609 U Goonies, The (VS) NES board=MAPPER151;system=VS;
sha1:0C0E33BE229E36229EFA12912285A3ED2858D9F9 B Gradius (VS) [b1] NES board=MAPPER151;system=VS;
sha1:B0D1852782B4E9A9CCC2BA24CD40B170C38B940F U Gradius (VS) NES board=MAPPER151;system=VS;
sha1:CCEBFBABC6CC3F0671E5C61CAF6E211B05FFDE27 B Gumshoe (VS) [b1] NES board=MAPPER099;system=VS;
sha1:D4B28408591853F84B9749CFD837A529B4E094AF B Gumshoe (VS) [b2] NES board=MAPPER099;system=VS;
sha1:21674A6571F0D4C812B9C30092C0C5ABED0C92E1 U Gumshoe (VS) NES board=MAPPER099;system=VS;
sha1:52A06B9D7367845395EEB544AC5C73FD68A25B7D U Hogan's Alley (VS) NES board=MAPPER099;system=VS;
sha1:77959F436F2A0D18249A44133FC4068B61029283 U Ice Climber (VS) (Player 1 Mode) NES board=MAPPER000;system=VS;
sha1:200E5B57CE68676E5B5159A551EBBE8EBFBA063F U Ice Climber (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:15BECCD6CA1D165B23531CF5CFAC35C327328335 O Ice Climber (VS) [o1] NES board=MAPPER099;system=VS;
sha1:9F1943AADE4233285589CEA5BDC96B5380D49337 U Ice Climber (VS) NES board=MAPPER099;system=VS;
sha1:CDE1ECAF212A9F5A5A49F904F87951EDA15D54DD U Ladies Golf (VS) NES board=MAPPER099;system=VS;
sha1:F8ED6FAFA057DBEEB0398EECCC9DE91747D479AD B Mach Rider (VS) [b1] NES board=MAPPER099;system=VS;
sha1:F8A0F2C5A4B7212CB35F53EA7193B3DD85D6E1CD U Mach Rider (VS) NES board=MAPPER099;system=VS;
sha1:A8548AE518289D276B93589A8BD0759134FEAEA4 U Mahjong (VS) (Player 1 Mode) NES board=MAPPER000;system=VS;
sha1:EE89B382CF21A2E4E1806059EA0FBB192435C1CA U Mahjong (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:5B3B4B34063EDED81470CC78FC55ECDA8CE366F2 G Mahjong (VS) [!] NES board=MAPPER099;system=VS;
sha1:C4ABEFDDA0321ACC8498BBC24FD3E91156837C8A U Mahjong (VS) [a1] NES board=MAPPER099;system=VS;
sha1:CAE9CB4C0452C56BED58AEACCEACE8A3107F843A U Mighty Bomb Jack (J) (VS) NES board=MAPPER099;system=VS;
sha1:D232F7BE509E3B745D9E9803DA945C3FABA37A70 U Ninja Jajamaru-kun (VS) NES board=MAPPER099;system=VS;
sha1:5CD3A16DEFAAEDC714CCC39F821E3034E5465D5F U Pinball (VS) [a1] NES board=MAPPER099;system=VS;
sha1:1A4EC64E576BAD64DAF320AEED0BE1B8B50D21DF U Pinball (VS) NES board=MAPPER099;system=VS;
sha1:4D88CB1C97C25C50F113BB9A76101E3DCADEE818 B Platoon (VS) [b1] NES board=MAPPER068;system=VS;
sha1:4ADAB0DD9AD0702451DAC94E3E827483E81A3F01 B Platoon (VS) [b2] NES board=MAPPER001;system=VS;
sha1:4E38B4C231C44BB1408AC6C6F941A136DD33D0EB U Platoon (VS) NES board=MAPPER068;system=VS;
sha1:4543F0D7EB387793F6C92FC6A075AA776C07085A B Atari RBI Baseball (VS) [b1] NES board=MAPPER004;system=VS;
sha1:B35C68AC81CC2D2B13237B6FF3927F3DFC852226 U Atari RBI Baseball (VS) NES board=MAPPER004;system=VS;
sha1:3F9CB2322FBAD6671DF328A77D5B89FB8299F213 G VS. TKO Boxing (VS) [!] NES board=MAPPER151;system=VS;
sha1:8EC5D4DEED22E230020596993BB1C42AEB2215DA U VS. TKO Boxing (VS) [a1] NES board=MAPPER151;system=VS;
sha1:76DE1A5FA7094E3CBB805C56908E5F452EBE0547 B VS. TKO Boxing (VS) [hM04] NES board=MAPPER004;system=VS;
sha1:40A801FF63DB5E719A8A53537C1C78F398483FC8 U Super Sky Kid (VS) NES board=MAPPER004;system=VS;
sha1:68DE623B2AD92BA19D18F17EAA0B97EE4523F6DF U VS. Slalom (VS) NES board=MAPPER000;system=VS;
sha1:BBB0AF27B313D7C838A38FB772A6FE8AFBAFBB95 U Soccer (VS) NES board=MAPPER099;system=VS;
sha1:C145803B5FEE71172A890606A44C6D5DF6D2FA8F U Star Luster (VS) NES board=MAPPER099;system=VS;
sha1:F08357458FF1DBFEBE152CAE100ACEF62F84774B G Stroke & Match Golf (VS) [!] NES board=MAPPER099;system=VS;
sha1:E0F7BDBD2C96B14D4B8D2146A900AAAD17F9E3B1 U Stroke & Match Golf (VS) [a1] NES board=MAPPER099;system=VS;
sha1:136DB00766AF39AF9E4FAB7306A3346C2F062446 B Stroke & Match Golf (VS) [a1][b1] NES board=MAPPER099;system=VS;
sha1:FBA72452977AE8602B628B39AC4A5A7A6FD0F92F B Stroke & Match Golf (VS) [a1][b2] NES board=MAPPER099;system=VS;
sha1:91FA719B4B05ADBAC0B9D507D2051ED361D1DED4 U VS. Super Mario Bros. (VS) [a1] NES board=MAPPER099;system=VS;
sha1:C81B9D98851E9BBC6172A10FFB218823D3C3B223 B VS. Super Mario Bros. (VS) [b1] NES board=MAPPER003;system=VS;
sha1:DD09C4FD6B440FBA948A5DC5269F5302A4DE75A2 B VS. Super Mario Bros. (VS) [b1][o1] NES board=MAPPER003;system=VS;
sha1:3E73109098A478F6AC3EA3CCCCA19BA3A31010C6 B VS. Super Mario Bros. (VS) [b2] NES board=MAPPER099;system=VS;
sha1:0C538B47CBB6CE03988B80ACF8A9AFEB68A6A179 B VS. Super Mario Bros. (VS) [b3] NES board=MAPPER099;system=VS;
sha1:EB9E0F838B4688C241B30516BE132E723EA21044 O VS. Super Mario Bros. (VS) [o1] NES board=MAPPER099;system=VS;
sha1:B21AA940728ED80C72EE23C251C96E42CC84B2D6 U VS. Super Mario Bros. (VS) NES board=MAPPER099;system=VS;
sha1:D7AB201265390588AB3CF3C2BB6B72BEA3F97137 B Super Xevious - Gump no Nazo (VS) [b1] NES board=MAPPER001;system=VS;
sha1:E291969D53D245E2E4F932D16E61B7DDE2E2570F B Super Xevious - Gump no Nazo (VS) [b2] NES board=MAPPER001;system=VS;
sha1:881B6413FBCBFB9A0308583F0510C09283A72D2A U Super Xevious - Gump no Nazo (VS) NES board=MAPPER002;system=VS;
sha1:01B0635D2A8BCFB6AD5B65C460967EE6BAEE89F5 U Tennis (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:7D29F60C718E03C54954D84D2773C6824790ACE8 G Tennis (VS) [!] NES board=MAPPER099;system=VS;
sha1:1FF8696E82EA1ECE787A17D26B26A04A76708657 O Tennis (VS) [o1] NES board=MAPPER099;system=VS;
sha1:B1AF292CEDE58BDD1A7AEE177C5F90801F98F73E U Tetris (VS) [a1] NES board=MAPPER099;system=VS;
sha1:1A17DF593C658F56D71B7026D2771396BFF95B36 U Tetris (VS) NES board=MAPPER099;system=VS;
sha1:D9B1B87204E025A637821A0168475E1209CE0C8A U Top Gun (VS) NES board=MAPPER002;system=VS;
sha1:C517A9ED1F163232D459C600596865125AA3E461 U Wrecking Crew (VS) (Player 1 Mode) NES board=MAPPER000;system=VS;
sha1:325157B00D1EF2BEA53BA76929E1F65F866497B9 U Wrecking Crew (VS) (Player 2 Mode) NES board=MAPPER000;system=VS;
sha1:6715FAEA7CCF322082ECB5C7DECE31796DA47995 G Wrecking Crew (VS) [!] NES board=MAPPER099;system=VS;