Merge branch 'master' of http://git.axibug.com/sin365/AxibugEmuOnline
This commit is contained in:
commit
57cb91262b
@ -1,10 +1,7 @@
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
public class AppEmu
|
||||
public class AppEmu
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
public void Login()
|
||||
{
|
||||
AppAxibugEmuOnline.log.Debug("-->Login");
|
||||
if(string.IsNullOrEmpty(LastLoginGuid))
|
||||
if (string.IsNullOrEmpty(LastLoginGuid))
|
||||
LastLoginGuid = Guid.NewGuid().ToString();
|
||||
|
||||
AppAxibugEmuOnline.user.userdata.Account = LastLoginGuid;
|
||||
@ -35,7 +35,7 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
if (msg.Status == LoginResultStatus.Ok)
|
||||
{
|
||||
AppAxibugEmuOnline.log.Info("登录成功");
|
||||
AppAxibugEmuOnline.user.InitMainUserData(AppAxibugEmuOnline.user.userdata.Account,msg.UID);
|
||||
AppAxibugEmuOnline.user.InitMainUserData(AppAxibugEmuOnline.user.userdata.Account, msg.UID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
public class LogManager
|
||||
{
|
||||
public enum E_LogType:byte
|
||||
public enum E_LogType : byte
|
||||
{
|
||||
Info = 0,
|
||||
Debug = 1,
|
||||
@ -13,7 +13,7 @@
|
||||
/// 日志
|
||||
/// </summary>
|
||||
/// <param name="sk"></param>
|
||||
public delegate void OnLogHandler(int debuglv,string msg);
|
||||
public delegate void OnLogHandler(int debuglv, string msg);
|
||||
|
||||
/// <summary>
|
||||
/// 内部输出
|
||||
@ -40,7 +40,7 @@
|
||||
Log(E_LogType.Error, str);
|
||||
}
|
||||
|
||||
public void Log(E_LogType logtype,string str)
|
||||
public void Log(E_LogType logtype, string str)
|
||||
{
|
||||
OnLog?.Invoke((int)logtype, str);
|
||||
}
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public enum EnumPlatform
|
||||
{
|
||||
|
@ -3,7 +3,6 @@ using ICSharpCode.SharpZipLib.Zip;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
|
@ -11,7 +11,8 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
public RomFile GetNesRomFile(string romFileName)
|
||||
{
|
||||
nesRomFileNameMapper.TryGetValue(romFileName, out RomFile romFile);
|
||||
RomFile romFile;
|
||||
nesRomFileNameMapper.TryGetValue(romFileName, out romFile);
|
||||
return romFile;
|
||||
}
|
||||
|
||||
@ -29,8 +30,8 @@ namespace AxibugEmuOnline.Client
|
||||
for (int i = 0; i < romList.gameList.Count; i++)
|
||||
{
|
||||
var webData = romList.gameList[i];
|
||||
|
||||
nesRomFileIdMapper.TryGetValue(webData.id, out var targetRomFile);
|
||||
RomFile targetRomFile;
|
||||
nesRomFileIdMapper.TryGetValue(webData.id, out targetRomFile);
|
||||
if (targetRomFile == null)
|
||||
{
|
||||
targetRomFile = new RomFile(EnumPlatform.NES);
|
||||
|
@ -1,5 +1,4 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugProtobuf;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
@ -21,10 +20,10 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
//注册重连成功事件,以便后续自动登录
|
||||
AppAxibugEmuOnline.networkHelper.OnReConnected += OnReConnected;
|
||||
}
|
||||
public MainUserDataBase userdata { get;private set; } = new MainUserDataBase();
|
||||
public MainUserDataBase userdata { get; private set; } = new MainUserDataBase();
|
||||
public bool IsLoggedIn => userdata.IsLoggedIn;
|
||||
|
||||
public void InitMainUserData(string UName,long UID)
|
||||
public void InitMainUserData(string UName, long UID)
|
||||
{
|
||||
userdata.Account = UName;
|
||||
userdata.IsLoggedIn = true;
|
||||
|
@ -33,7 +33,8 @@ namespace AxibugEmuOnline.Client
|
||||
for (int i = 0; i < data.Length; i += step)
|
||||
{
|
||||
float rawFloat = 0;
|
||||
if (_buffer.TryRead(out byte rawData))
|
||||
byte rawData;
|
||||
if (_buffer.TryRead(out rawData))
|
||||
rawFloat = rawData / 255f;
|
||||
|
||||
data[i] = rawFloat;
|
||||
|
@ -1,5 +1,3 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core.Debug;
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
|
@ -1,11 +1,4 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
@ -31,8 +31,8 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
crc_Info_mapper[info.CRC] = info;
|
||||
}
|
||||
}
|
||||
|
||||
if (crc_Info_mapper.TryGetValue(crc, out var romInfo))
|
||||
RomInfo romInfo;
|
||||
if (crc_Info_mapper.TryGetValue(crc, out romInfo))
|
||||
{
|
||||
mapperNo = romInfo.Mapper;
|
||||
return true;
|
||||
|
@ -1,9 +1,5 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Principal;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
using VirtualNes.Core.Debug;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
@ -80,7 +76,7 @@ namespace VirtualNes.Core
|
||||
int nBits = Supporter.Config.sound.nBits;
|
||||
uint dwLength = (uint)(dwSize / (nBits / 8));
|
||||
int output;
|
||||
QUEUEDATA q = default;
|
||||
QUEUEDATA q = new QUEUEDATA();
|
||||
uint writetime;
|
||||
|
||||
var pSoundBuf = m_SoundBuffer;
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using static VirtualNes.Core.APU_INTERNAL;
|
||||
using System.Net;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -22,7 +22,7 @@
|
||||
public virtual int GetStateSize() { return 0; }
|
||||
public virtual void SaveState(byte[] p) { }
|
||||
public virtual void LoadState(byte[] p) { }
|
||||
|
||||
|
||||
public static int INT2FIX(int x)
|
||||
{
|
||||
return x << 16;
|
||||
|
@ -1,7 +1,5 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
@ -387,7 +387,7 @@ namespace VirtualNes.Core
|
||||
Array.Clear(dummy, 0, dummy.Length);
|
||||
vbl_length = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class RECTANGLE
|
||||
{
|
||||
|
@ -263,16 +263,16 @@ namespace VirtualNes.Core
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
enable = default;
|
||||
gate = default;
|
||||
volume = default;
|
||||
enable = 0;
|
||||
gate = 0;
|
||||
volume = 0;
|
||||
|
||||
phaseacc = default;
|
||||
freq = default;
|
||||
output_vol = default;
|
||||
phaseacc = 0;
|
||||
freq = 0;
|
||||
output_vol = 0;
|
||||
|
||||
adder = default;
|
||||
duty_pos = default;
|
||||
adder = 0;
|
||||
duty_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -294,16 +294,16 @@ namespace VirtualNes.Core
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
enable = default;
|
||||
volume = default;
|
||||
enable = 0;
|
||||
volume = 0;
|
||||
|
||||
phaseacc = default;
|
||||
freq = default;
|
||||
output_vol = default;
|
||||
phaseacc = 0;
|
||||
freq = 0;
|
||||
output_vol = 0;
|
||||
|
||||
adder = default;
|
||||
accum = default;
|
||||
phaseaccum = default;
|
||||
adder = 0;
|
||||
accum = 0;
|
||||
phaseaccum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
#undef DPCM_SYNCCLOCK
|
||||
|
||||
using System;
|
||||
using VirtualNes.Core.Debug;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.Remoting.Lifetime;
|
||||
namespace VirtualNes.Core.Emu2413
|
||||
{
|
||||
public static class Emu2413API
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public interface ISoundDataBuffer
|
||||
{
|
||||
|
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace VirtualNes.Core.Debug
|
||||
namespace VirtualNes.Core.Debug
|
||||
{
|
||||
public static class Debuger
|
||||
{
|
||||
|
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using VirtualNes.Core;
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace VirtualNes
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
||||
|
||||
|
@ -81,23 +81,23 @@ namespace VirtualNes.Core
|
||||
{
|
||||
//todo : 实现加载mapper
|
||||
switch (no)
|
||||
{
|
||||
case 0: return new Mapper000(parent);
|
||||
case 1: return new Mapper001(parent);
|
||||
case 2: return new Mapper002(parent);
|
||||
case 3: return new Mapper003(parent);
|
||||
case 4: return new Mapper004(parent);
|
||||
case 5: return new Mapper005(parent);
|
||||
case 6: return new Mapper006(parent);
|
||||
case 7: return new Mapper007(parent);
|
||||
case 8: return new Mapper008(parent);
|
||||
case 9: return new Mapper009(parent);
|
||||
case 10: return new Mapper010(parent);
|
||||
case 11: return new Mapper011(parent);
|
||||
case 12: return new Mapper012(parent);
|
||||
case 13: return new Mapper013(parent);
|
||||
case 15: return new Mapper015(parent);
|
||||
case 16: return new Mapper016(parent);
|
||||
{
|
||||
case 0: return new Mapper000(parent);
|
||||
case 1: return new Mapper001(parent);
|
||||
case 2: return new Mapper002(parent);
|
||||
case 3: return new Mapper003(parent);
|
||||
case 4: return new Mapper004(parent);
|
||||
case 5: return new Mapper005(parent);
|
||||
case 6: return new Mapper006(parent);
|
||||
case 7: return new Mapper007(parent);
|
||||
case 8: return new Mapper008(parent);
|
||||
case 9: return new Mapper009(parent);
|
||||
case 10: return new Mapper010(parent);
|
||||
case 11: return new Mapper011(parent);
|
||||
case 12: return new Mapper012(parent);
|
||||
case 13: return new Mapper013(parent);
|
||||
case 15: return new Mapper015(parent);
|
||||
case 16: return new Mapper016(parent);
|
||||
case 17: return new Mapper017(parent);
|
||||
case 18: return new Mapper018(parent);
|
||||
case 19: return new Mapper019(parent);
|
||||
|
@ -2,46 +2,43 @@
|
||||
// Mapper000 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper000 : Mapper
|
||||
{
|
||||
public class Mapper000 : Mapper
|
||||
{
|
||||
|
||||
public Mapper000(NES parent) : base(parent) { }
|
||||
public Mapper000(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
switch (PROM_16K_SIZE)
|
||||
{
|
||||
default:
|
||||
case 1: // 16K only
|
||||
SetPROM_16K_Bank(4, 0);
|
||||
SetPROM_16K_Bank(6, 0);
|
||||
break;
|
||||
case 2: // 32K
|
||||
SetPROM_32K_Bank(0);
|
||||
break;
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
switch (PROM_16K_SIZE)
|
||||
{
|
||||
default:
|
||||
case 1: // 16K only
|
||||
SetPROM_16K_Bank(4, 0);
|
||||
SetPROM_16K_Bank(6, 0);
|
||||
break;
|
||||
case 2: // 32K
|
||||
SetPROM_32K_Bank(0);
|
||||
break;
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x4e7db5af)
|
||||
{ // Circus Charlie(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0x57970078)
|
||||
{ // F-1 Race(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0xaf2bbcbc // Mach Rider(JU)
|
||||
|| crc == 0x3acd4bf1)
|
||||
{ // Mach Rider(Alt)(JU)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x4e7db5af)
|
||||
{ // Circus Charlie(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0x57970078)
|
||||
{ // F-1 Race(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0xaf2bbcbc // Mach Rider(JU)
|
||||
|| crc == 0x3acd4bf1)
|
||||
{ // Mach Rider(Alt)(JU)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,9 @@
|
||||
// Mapper001 Nintendo MMC1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -2,71 +2,69 @@
|
||||
// Mapper002 UNROM //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper002 : Mapper
|
||||
{
|
||||
public class Mapper002 : Mapper
|
||||
{
|
||||
|
||||
BYTE patch;
|
||||
public Mapper002(NES parent) : base(parent) { }
|
||||
BYTE patch;
|
||||
public Mapper002(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
patch = 0;
|
||||
patch = 0;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// if( crc == 0x322c9b09 ) { // Metal Gear (Alt)(J)
|
||||
//// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
// if( crc == 0xe7a3867b ) { // Dragon Quest 2(Alt)(J)
|
||||
// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
//// if( crc == 0x9622fbd9 ) { // Ballblazer(J)
|
||||
//// patch = 0;
|
||||
//// }
|
||||
if (crc == 0x8c3d54e8 // Ikari(J)
|
||||
|| crc == 0x655efeed // Ikari Warriors(U)
|
||||
|| crc == 0x538218b2)
|
||||
{ // Ikari Warriors(E)
|
||||
patch = 1;
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// if( crc == 0x322c9b09 ) { // Metal Gear (Alt)(J)
|
||||
//// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
// if( crc == 0xe7a3867b ) { // Dragon Quest 2(Alt)(J)
|
||||
// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
//// if( crc == 0x9622fbd9 ) { // Ballblazer(J)
|
||||
//// patch = 0;
|
||||
//// }
|
||||
if (crc == 0x8c3d54e8 // Ikari(J)
|
||||
|| crc == 0x655efeed // Ikari Warriors(U)
|
||||
|| crc == 0x538218b2)
|
||||
{ // Ikari Warriors(E)
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
if (crc == 0xb20c1030)
|
||||
{ // Shanghai(J)(original)
|
||||
patch = 2;
|
||||
}
|
||||
}
|
||||
if (crc == 0xb20c1030)
|
||||
{ // Shanghai(J)(original)
|
||||
patch = 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//void Mapper002::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (!nes.rom.IsSAVERAM())
|
||||
{
|
||||
if (addr >= 0x5000 && patch == 1)
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
//void Mapper002::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (!nes.rom.IsSAVERAM())
|
||||
{
|
||||
if (addr >= 0x5000 && patch == 1)
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper002::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (patch != 2)
|
||||
SetPROM_16K_Bank(4, data);
|
||||
else
|
||||
SetPROM_16K_Bank(4, data >> 4);
|
||||
}
|
||||
//void Mapper002::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (patch != 2)
|
||||
SetPROM_16K_Bank(4, data);
|
||||
else
|
||||
SetPROM_16K_Bank(4, data >> 4);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,7 @@
|
||||
// Mapper003 CNROM //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,7 +1,4 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper004 : Mapper
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper005 Nintendo MMC5 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using System;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using static VirtualNes.Core.PPU;
|
||||
using static VirtualNes.MMU;
|
||||
|
@ -1,112 +1,112 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper006 FFE F4xxx //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper006 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper006(NES parent) : base(parent) { }
|
||||
public class Mapper006 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper006(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 14, 15);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 14, 15);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
|
||||
//void Mapper006::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x42FE:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0x42FF:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
//void Mapper006::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x42FE:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0x42FF:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
|
||||
case 0x4501:
|
||||
irq_enable = 0;
|
||||
case 0x4501:
|
||||
irq_enable = 0;
|
||||
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x4502:
|
||||
irq_counter = (irq_counter & 0xFF00) | data;
|
||||
break;
|
||||
case 0x4503:
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
irq_enable = 0xFF;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x4502:
|
||||
irq_counter = (irq_counter & 0xFF00) | data;
|
||||
break;
|
||||
case 0x4503:
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
irq_enable = 0xFF;
|
||||
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper006::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x3C) >> 2);
|
||||
SetCRAM_8K_Bank(data & 0x03);
|
||||
}
|
||||
//void Mapper006::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x3C) >> 2);
|
||||
SetCRAM_8K_Bank(data & 0x03);
|
||||
}
|
||||
|
||||
//void Mapper006::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter += 133;
|
||||
if (irq_counter >= 0xFFFF)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
irq_counter = 0;
|
||||
//void Mapper006::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter += 133;
|
||||
if (irq_counter >= 0xFFFF)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
irq_counter = 0;
|
||||
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper006::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
//void Mapper006::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper006::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
//void Mapper006::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,58 +2,54 @@
|
||||
// Mapper007 AOROM/AMROM //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper007 : Mapper
|
||||
{
|
||||
|
||||
BYTE patch;
|
||||
public Mapper007(NES parent) : base(parent) { }
|
||||
BYTE patch;
|
||||
public Mapper007(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x3c9fe649)
|
||||
{ // WWF Wrestlemania Challenge(U)
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
patch = 1;
|
||||
}
|
||||
if (crc == 0x09874777)
|
||||
{ // Marble Madness(U)
|
||||
nes.SetRenderMethod( EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x3c9fe649)
|
||||
{ // WWF Wrestlemania Challenge(U)
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
patch = 1;
|
||||
}
|
||||
if (crc == 0x09874777)
|
||||
{ // Marble Madness(U)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
|
||||
if (crc == 0x279710DC // Battletoads (U)
|
||||
|| crc == 0xCEB65B06)
|
||||
{ // Battletoads Double Dragon (U)
|
||||
nes.SetRenderMethod( EnumRenderMethod.PRE_ALL_RENDER);
|
||||
//::memset(WRAM, 0, sizeof(WRAM));
|
||||
MemoryUtility.ZEROMEMORY(WRAM, WRAM.Length);
|
||||
}
|
||||
}
|
||||
if (crc == 0x279710DC // Battletoads (U)
|
||||
|| crc == 0xCEB65B06)
|
||||
{ // Battletoads Double Dragon (U)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
//::memset(WRAM, 0, sizeof(WRAM));
|
||||
MemoryUtility.ZEROMEMORY(WRAM, WRAM.Length);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper007::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data & 0x07);
|
||||
//void Mapper007::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data & 0x07);
|
||||
|
||||
if (patch!=0)
|
||||
{
|
||||
if ((data & 0x10)!=0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,31 +2,28 @@
|
||||
// Mapper008 FFE F3xxx //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper008 : Mapper
|
||||
{
|
||||
public class Mapper008 : Mapper
|
||||
{
|
||||
|
||||
public Mapper008(NES parent) : base(parent) { }
|
||||
public Mapper008(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper008::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0xF8) >> 3);
|
||||
SetVROM_8K_Bank(data & 0x07);
|
||||
}
|
||||
//void Mapper008::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0xF8) >> 3);
|
||||
SetVROM_8K_Bank(data & 0x07);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,128 +2,126 @@
|
||||
// Mapper009 Nintendo MMC2 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper009 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE latch_a, latch_b;
|
||||
public class Mapper009 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE latch_a, latch_b;
|
||||
|
||||
public Mapper009(NES parent) : base(parent) { }
|
||||
public Mapper009(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, PROM_8K_SIZE - 3, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, PROM_8K_SIZE - 3, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
reg[0] = 0; reg[1] = 4;
|
||||
reg[2] = 0; reg[3] = 0;
|
||||
reg[0] = 0; reg[1] = 4;
|
||||
reg[2] = 0; reg[3] = 0;
|
||||
|
||||
latch_a = 0xFE;
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(0, 4);
|
||||
SetVROM_4K_Bank(4, 0);
|
||||
latch_a = 0xFE;
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(0, 4);
|
||||
SetVROM_4K_Bank(4, 0);
|
||||
|
||||
nes.ppu.SetChrLatchMode(true);
|
||||
}
|
||||
nes.ppu.SetChrLatchMode(true);
|
||||
}
|
||||
|
||||
//void Mapper009::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = data;
|
||||
if (latch_a == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[1] = data;
|
||||
if (latch_a == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[2] = data;
|
||||
if (latch_b == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[3] = data;
|
||||
if (latch_b == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
break;
|
||||
case 0xF000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper009::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = data;
|
||||
if (latch_a == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[1] = data;
|
||||
if (latch_a == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[2] = data;
|
||||
if (latch_b == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[3] = data;
|
||||
if (latch_b == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
break;
|
||||
case 0xF000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper009::PPU_ChrLatch(WORD addr)
|
||||
public override void PPU_ChrLatch(ushort addr)
|
||||
{
|
||||
if ((addr & 0x1FF0) == 0x0FD0 && latch_a != 0xFD)
|
||||
{
|
||||
latch_a = 0xFD;
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x0FE0 && latch_a != 0xFE)
|
||||
{
|
||||
latch_a = 0xFE;
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FD0 && latch_b != 0xFD)
|
||||
{
|
||||
latch_b = 0xFD;
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FE0 && latch_b != 0xFE)
|
||||
{
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
}
|
||||
//void Mapper009::PPU_ChrLatch(WORD addr)
|
||||
public override void PPU_ChrLatch(ushort addr)
|
||||
{
|
||||
if ((addr & 0x1FF0) == 0x0FD0 && latch_a != 0xFD)
|
||||
{
|
||||
latch_a = 0xFD;
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x0FE0 && latch_a != 0xFE)
|
||||
{
|
||||
latch_a = 0xFE;
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FD0 && latch_b != 0xFD)
|
||||
{
|
||||
latch_b = 0xFD;
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FE0 && latch_b != 0xFE)
|
||||
{
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper009::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
p[4] = latch_a;
|
||||
p[5] = latch_b;
|
||||
}
|
||||
//void Mapper009::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
p[4] = latch_a;
|
||||
p[5] = latch_b;
|
||||
}
|
||||
|
||||
//void Mapper009::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
latch_a = p[4];
|
||||
latch_b = p[5];
|
||||
}
|
||||
//void Mapper009::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
latch_a = p[4];
|
||||
latch_b = p[5];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,128 +2,126 @@
|
||||
// Mapper010 Nintendo MMC4 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper010 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE latch_a, latch_b;
|
||||
public class Mapper010 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE latch_a, latch_b;
|
||||
|
||||
public Mapper010(NES parent) : base(parent) { }
|
||||
public Mapper010(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
reg[0] = 0; reg[1] = 4;
|
||||
reg[2] = 0; reg[3] = 0;
|
||||
reg[0] = 0; reg[1] = 4;
|
||||
reg[2] = 0; reg[3] = 0;
|
||||
|
||||
latch_a = 0xFE;
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(0, 4);
|
||||
SetVROM_4K_Bank(4, 0);
|
||||
latch_a = 0xFE;
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(0, 4);
|
||||
SetVROM_4K_Bank(4, 0);
|
||||
|
||||
nes.ppu.SetChrLatchMode(true);
|
||||
}
|
||||
nes.ppu.SetChrLatchMode(true);
|
||||
}
|
||||
|
||||
//void Mapper010::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0xA000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = data;
|
||||
if (latch_a == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[1] = data;
|
||||
if (latch_a == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[2] = data;
|
||||
if (latch_b == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[3] = data;
|
||||
if (latch_b == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
break;
|
||||
case 0xF000:
|
||||
if ((data & 0x01) != 0)
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper010::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0xA000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = data;
|
||||
if (latch_a == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[1] = data;
|
||||
if (latch_a == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[2] = data;
|
||||
if (latch_b == 0xFD)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[3] = data;
|
||||
if (latch_b == 0xFE)
|
||||
{
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
break;
|
||||
case 0xF000:
|
||||
if ((data & 0x01) != 0)
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper010::PPU_ChrLatch(WORD addr)
|
||||
public override void PPU_ChrLatch(ushort addr)
|
||||
{
|
||||
if ((addr & 0x1FF0) == 0x0FD0 && latch_a != 0xFD)
|
||||
{
|
||||
latch_a = 0xFD;
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x0FE0 && latch_a != 0xFE)
|
||||
{
|
||||
latch_a = 0xFE;
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FD0 && latch_b != 0xFD)
|
||||
{
|
||||
latch_b = 0xFD;
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FE0 && latch_b != 0xFE)
|
||||
{
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
}
|
||||
//void Mapper010::PPU_ChrLatch(WORD addr)
|
||||
public override void PPU_ChrLatch(ushort addr)
|
||||
{
|
||||
if ((addr & 0x1FF0) == 0x0FD0 && latch_a != 0xFD)
|
||||
{
|
||||
latch_a = 0xFD;
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x0FE0 && latch_a != 0xFE)
|
||||
{
|
||||
latch_a = 0xFE;
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FD0 && latch_b != 0xFD)
|
||||
{
|
||||
latch_b = 0xFD;
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else if ((addr & 0x1FF0) == 0x1FE0 && latch_b != 0xFE)
|
||||
{
|
||||
latch_b = 0xFE;
|
||||
SetVROM_4K_Bank(4, reg[3]);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper010::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
p[4] = latch_a;
|
||||
p[5] = latch_b;
|
||||
}
|
||||
//void Mapper010::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
p[4] = latch_a;
|
||||
p[5] = latch_b;
|
||||
}
|
||||
|
||||
//void Mapper010::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
latch_a = p[4];
|
||||
latch_b = p[5];
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//void Mapper010::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
latch_a = p[4];
|
||||
latch_b = p[5];
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,41 +2,38 @@
|
||||
// Mapper011 Color Dreams //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper011 : Mapper
|
||||
{
|
||||
public class Mapper011 : Mapper
|
||||
{
|
||||
|
||||
public Mapper011(NES parent) : base(parent) { }
|
||||
public Mapper011(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
// SetVROM_8K_Bank( 1 );
|
||||
}
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
// SetVROM_8K_Bank( 1 );
|
||||
}
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
|
||||
//void Mapper011::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT("WR A:%04X D:%02X\n", addr, data);
|
||||
SetPROM_32K_Bank(data);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(data >> 4);
|
||||
}
|
||||
}
|
||||
//void Mapper011::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT("WR A:%04X D:%02X\n", addr, data);
|
||||
SetPROM_32K_Bank(data);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(data >> 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,331 +1,331 @@
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper012 : Mapper
|
||||
{
|
||||
uint vb0, vb1;
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE we_sram;
|
||||
public class Mapper012 : Mapper
|
||||
{
|
||||
uint vb0, vb1;
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE we_sram;
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_request;
|
||||
BYTE irq_preset;
|
||||
BYTE irq_preset_vbl;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_request;
|
||||
BYTE irq_preset;
|
||||
BYTE irq_preset_vbl;
|
||||
|
||||
public Mapper012(NES parent) : base(parent) { }
|
||||
public Mapper012(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
SetBank_CPU();
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
SetBank_CPU();
|
||||
|
||||
vb0 = 0;
|
||||
vb1 = 0;
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
SetBank_PPU();
|
||||
vb0 = 0;
|
||||
vb1 = 0;
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
SetBank_PPU();
|
||||
|
||||
we_sram = 0; // Disable
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
irq_latch = 0xFF;
|
||||
irq_request = 0;
|
||||
irq_preset = 0;
|
||||
irq_preset_vbl = 0;
|
||||
}
|
||||
we_sram = 0; // Disable
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
irq_latch = 0xFF;
|
||||
irq_request = 0;
|
||||
irq_preset = 0;
|
||||
irq_preset_vbl = 0;
|
||||
}
|
||||
|
||||
//void Mapper012::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr > 0x4100 && addr < 0x6000)
|
||||
{
|
||||
vb0 = (byte)((data & 0x01) << 8);
|
||||
vb1 = (byte)((data & 0x10) << 4);
|
||||
SetBank_PPU();
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
//void Mapper012::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr > 0x4100 && addr < 0x6000)
|
||||
{
|
||||
vb0 = (byte)((data & 0x01) << 8);
|
||||
vb1 = (byte)((data & 0x10) << 4);
|
||||
SetBank_PPU();
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
//BYTE Mapper012::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
return 0x01;
|
||||
}
|
||||
//BYTE Mapper012::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
return 0x01;
|
||||
}
|
||||
|
||||
//void Mapper012::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
//void Mapper012::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
if (nes.GetScanline() < 240)
|
||||
{
|
||||
irq_counter |= 0x80;
|
||||
irq_preset = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter |= 0x80;
|
||||
irq_preset_vbl = 0xFF;
|
||||
irq_preset = 0;
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
irq_request = 0;
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
if (nes.GetScanline() < 240)
|
||||
{
|
||||
irq_counter |= 0x80;
|
||||
irq_preset = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter |= 0x80;
|
||||
irq_preset_vbl = 0xFF;
|
||||
irq_preset = 0;
|
||||
}
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
irq_request = 0;
|
||||
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
irq_request = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
irq_request = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper012::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_preset_vbl != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_preset_vbl = 0;
|
||||
}
|
||||
if (irq_preset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_preset = 0;
|
||||
}
|
||||
else if (irq_counter > 0)
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
//void Mapper012::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_preset_vbl != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_preset_vbl = 0;
|
||||
}
|
||||
if (irq_preset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_preset = 0;
|
||||
}
|
||||
else if (irq_counter > 0)
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
// Some game set irq_latch to zero to disable irq. So check it here.
|
||||
if (irq_enable != 0 && irq_latch != 0)
|
||||
{
|
||||
irq_request = 0xFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
irq_preset = 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
// Some game set irq_latch to zero to disable irq. So check it here.
|
||||
if (irq_enable != 0 && irq_latch != 0)
|
||||
{
|
||||
irq_request = 0xFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
irq_preset = 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, prg1, prg0, PROM_8K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(prg0, prg1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
}
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, prg1, prg0, PROM_8K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(prg0, prg1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(
|
||||
(int)(vb0 + chr4),
|
||||
(int)(vb0 + chr5),
|
||||
(int)(vb0 + chr6),
|
||||
(int)(vb0 + chr7),
|
||||
(int)(vb1 + chr01),
|
||||
(int)(vb1 + chr01 + 1),
|
||||
(int)(vb1 + chr23),
|
||||
(int)(vb1 + chr23 + 1)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_8K_Bank(
|
||||
(int)(vb0 + chr01),
|
||||
(int)(vb0 + chr01 + 1),
|
||||
(int)(vb0 + chr23),
|
||||
(int)(vb0 + chr23 + 1),
|
||||
(int)(vb1 + chr4),
|
||||
(int)(vb1 + chr5),
|
||||
(int)(vb1 + chr6),
|
||||
(int)(vb1 + chr7))
|
||||
;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetCRAM_1K_Bank(4, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(5, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(6, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(7, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(0, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(1, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(2, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(3, chr7 & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(1, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(2, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(3, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(4, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(5, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(6, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(7, chr7 & 0x07);
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(
|
||||
(int)(vb0 + chr4),
|
||||
(int)(vb0 + chr5),
|
||||
(int)(vb0 + chr6),
|
||||
(int)(vb0 + chr7),
|
||||
(int)(vb1 + chr01),
|
||||
(int)(vb1 + chr01 + 1),
|
||||
(int)(vb1 + chr23),
|
||||
(int)(vb1 + chr23 + 1)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_8K_Bank(
|
||||
(int)(vb0 + chr01),
|
||||
(int)(vb0 + chr01 + 1),
|
||||
(int)(vb0 + chr23),
|
||||
(int)(vb0 + chr23 + 1),
|
||||
(int)(vb1 + chr4),
|
||||
(int)(vb1 + chr5),
|
||||
(int)(vb1 + chr6),
|
||||
(int)(vb1 + chr7))
|
||||
;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetCRAM_1K_Bank(4, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(5, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(6, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(7, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(0, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(1, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(2, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(3, chr7 & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(1, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(2, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(3, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(4, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(5, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(6, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(7, chr7 & 0x07);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper012::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 8; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[8] = prg0;
|
||||
//p[9] = prg1;
|
||||
//p[10] = chr01;
|
||||
//p[11] = chr23;
|
||||
//p[12] = chr4;
|
||||
//p[13] = chr5;
|
||||
//p[14] = chr6;
|
||||
//p[15] = chr7;
|
||||
//p[16] = irq_enable;
|
||||
//p[17] = (BYTE)irq_counter;
|
||||
//p[18] = irq_latch;
|
||||
//p[19] = irq_request;
|
||||
//p[20] = irq_preset;
|
||||
//p[21] = irq_preset_vbl;
|
||||
//*((DWORD*)&p[22]) = vb0;
|
||||
//*((DWORD*)&p[26]) = vb1;
|
||||
}
|
||||
//void Mapper012::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 8; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[8] = prg0;
|
||||
//p[9] = prg1;
|
||||
//p[10] = chr01;
|
||||
//p[11] = chr23;
|
||||
//p[12] = chr4;
|
||||
//p[13] = chr5;
|
||||
//p[14] = chr6;
|
||||
//p[15] = chr7;
|
||||
//p[16] = irq_enable;
|
||||
//p[17] = (BYTE)irq_counter;
|
||||
//p[18] = irq_latch;
|
||||
//p[19] = irq_request;
|
||||
//p[20] = irq_preset;
|
||||
//p[21] = irq_preset_vbl;
|
||||
//*((DWORD*)&p[22]) = vb0;
|
||||
//*((DWORD*)&p[26]) = vb1;
|
||||
}
|
||||
|
||||
//void Mapper012::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 8; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//prg0 = p[8];
|
||||
//prg1 = p[9];
|
||||
//chr01 = p[10];
|
||||
//chr23 = p[11];
|
||||
//chr4 = p[12];
|
||||
//chr5 = p[13];
|
||||
//chr6 = p[14];
|
||||
//chr7 = p[15];
|
||||
//irq_enable = p[16];
|
||||
//irq_counter = (INT)p[17];
|
||||
//irq_latch = p[18];
|
||||
//irq_request = p[19];
|
||||
//irq_preset = p[20];
|
||||
//irq_preset_vbl = p[21];
|
||||
//vb0 = *((DWORD*)&p[22]);
|
||||
//vb1 = *((DWORD*)&p[26]);
|
||||
}
|
||||
//void Mapper012::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 8; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//prg0 = p[8];
|
||||
//prg1 = p[9];
|
||||
//chr01 = p[10];
|
||||
//chr23 = p[11];
|
||||
//chr4 = p[12];
|
||||
//chr5 = p[13];
|
||||
//chr6 = p[14];
|
||||
//chr7 = p[15];
|
||||
//irq_enable = p[16];
|
||||
//irq_counter = (INT)p[17];
|
||||
//irq_latch = p[18];
|
||||
//irq_request = p[19];
|
||||
//irq_preset = p[20];
|
||||
//irq_preset_vbl = p[21];
|
||||
//vb0 = *((DWORD*)&p[22]);
|
||||
//vb1 = *((DWORD*)&p[26]);
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,32 +2,29 @@
|
||||
// Mapper013 CPROM //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper013 : Mapper
|
||||
{
|
||||
public class Mapper013 : Mapper
|
||||
{
|
||||
|
||||
public Mapper013(NES parent) : base(parent) { }
|
||||
public Mapper013(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetCRAM_4K_Bank(0, 0);
|
||||
SetCRAM_4K_Bank(4, 0);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetCRAM_4K_Bank(0, 0);
|
||||
SetCRAM_4K_Bank(4, 0);
|
||||
}
|
||||
|
||||
//void Mapper013::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0x30) >> 4);
|
||||
SetCRAM_4K_Bank(4, data & 0x03);
|
||||
}
|
||||
//void Mapper013::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0x30) >> 4);
|
||||
SetCRAM_4K_Bank(4, data & 0x03);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,92 +2,89 @@
|
||||
// Mapper015 100-in-1 chip //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper015 : Mapper
|
||||
{
|
||||
public class Mapper015 : Mapper
|
||||
{
|
||||
|
||||
public Mapper015(NES parent) : base(parent) { }
|
||||
public Mapper015(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
}
|
||||
|
||||
//void Mapper015::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 3);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 2);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 3);
|
||||
}
|
||||
if ((data & 0x40) != 0)
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0x8001:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
break;
|
||||
case 0x8002:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
break;
|
||||
case 0x8003:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper015::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 3);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 2);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 3);
|
||||
}
|
||||
if ((data & 0x40) != 0)
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0x8001:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
break;
|
||||
case 0x8002:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
break;
|
||||
case 0x8003:
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 1);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x3F) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, (data & 0x3F) * 2 + 1);
|
||||
}
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,127 +1,127 @@
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper017 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
INT irq_latch;
|
||||
public Mapper017(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper017 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
INT irq_latch;
|
||||
public Mapper017(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
|
||||
//void Mapper017::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x42FE:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0x42FF:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
//void Mapper017::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x42FE:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0x42FF:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
|
||||
case 0x4501:
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x4502:
|
||||
irq_latch = (irq_latch & 0xFF00) | data;
|
||||
break;
|
||||
case 0x4503:
|
||||
irq_latch = (irq_latch & 0x00FF) | ((INT)data << 8);
|
||||
irq_counter = irq_latch;
|
||||
irq_enable = 0xFF;
|
||||
break;
|
||||
case 0x4501:
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x4502:
|
||||
irq_latch = (irq_latch & 0xFF00) | data;
|
||||
break;
|
||||
case 0x4503:
|
||||
irq_latch = (irq_latch & 0x00FF) | ((INT)data << 8);
|
||||
irq_counter = irq_latch;
|
||||
irq_enable = 0xFF;
|
||||
break;
|
||||
|
||||
case 0x4504:
|
||||
case 0x4505:
|
||||
case 0x4506:
|
||||
case 0x4507:
|
||||
SetPROM_8K_Bank((byte)(addr & 0x07), data);
|
||||
break;
|
||||
case 0x4504:
|
||||
case 0x4505:
|
||||
case 0x4506:
|
||||
case 0x4507:
|
||||
SetPROM_8K_Bank((byte)(addr & 0x07), data);
|
||||
break;
|
||||
|
||||
case 0x4510:
|
||||
case 0x4511:
|
||||
case 0x4512:
|
||||
case 0x4513:
|
||||
case 0x4514:
|
||||
case 0x4515:
|
||||
case 0x4516:
|
||||
case 0x4517:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x07), data);
|
||||
break;
|
||||
case 0x4510:
|
||||
case 0x4511:
|
||||
case 0x4512:
|
||||
case 0x4513:
|
||||
case 0x4514:
|
||||
case 0x4515:
|
||||
case 0x4516:
|
||||
case 0x4517:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x07), data);
|
||||
break;
|
||||
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper017::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter >= 0xFFFF - 113)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
// nes.cpu.IRQ();
|
||||
// irq_counter = 0;
|
||||
// irq_enable = 0;
|
||||
irq_counter &= 0xFFFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter += 113;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper017::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter >= 0xFFFF - 113)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
// nes.cpu.IRQ();
|
||||
// irq_counter = 0;
|
||||
// irq_enable = 0;
|
||||
irq_counter &= 0xFFFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter += 113;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper017::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
//*(INT*)&p[5] = irq_latch;
|
||||
}
|
||||
//void Mapper017::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
//*(INT*)&p[5] = irq_latch;
|
||||
}
|
||||
|
||||
//void Mapper017::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
//irq_latch = *(INT*)&p[5];
|
||||
}
|
||||
//void Mapper017::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
//irq_latch = *(INT*)&p[5];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,278 +1,278 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper018 Jaleco SS8806 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper018 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[11];
|
||||
public class Mapper018 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[11];
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_mode;
|
||||
INT irq_latch;
|
||||
INT irq_counter;
|
||||
public Mapper018(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
BYTE irq_mode;
|
||||
INT irq_latch;
|
||||
INT irq_counter;
|
||||
public Mapper018(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 11; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
reg[2] = (byte)(PROM_8K_SIZE - 2);
|
||||
reg[3] = (byte)(PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 11; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
reg[2] = (byte)(PROM_8K_SIZE - 2);
|
||||
reg[3] = (byte)(PROM_8K_SIZE - 1);
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
irq_enable = 0;
|
||||
irq_mode = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
irq_latch = 0xFFFF;
|
||||
irq_enable = 0;
|
||||
irq_mode = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
irq_latch = 0xFFFF;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0xefb1df9e)
|
||||
{ // The Lord of King(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x3746f951)
|
||||
{ // Pizza Pop!(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0xefb1df9e)
|
||||
{ // The Lord of King(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x3746f951)
|
||||
{ // Pizza Pop!(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
|
||||
// nes.SetRenderMethod( NES::PRE_ALL_RENDER );
|
||||
// nes.SetRenderMethod( NES::POST_ALL_RENDER );
|
||||
}
|
||||
// nes.SetRenderMethod( NES::PRE_ALL_RENDER );
|
||||
// nes.SetRenderMethod( NES::POST_ALL_RENDER );
|
||||
}
|
||||
|
||||
//void Mapper018::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(4, reg[0]);
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(4, reg[0]);
|
||||
break;
|
||||
case 0x8002:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(5, reg[1]);
|
||||
break;
|
||||
case 0x8003:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(5, reg[1]);
|
||||
break;
|
||||
case 0x9000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(6, reg[2]);
|
||||
break;
|
||||
case 0x9001:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(6, reg[2]);
|
||||
break;
|
||||
//void Mapper018::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(4, reg[0]);
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(4, reg[0]);
|
||||
break;
|
||||
case 0x8002:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(5, reg[1]);
|
||||
break;
|
||||
case 0x8003:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(5, reg[1]);
|
||||
break;
|
||||
case 0x9000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetPROM_8K_Bank(6, reg[2]);
|
||||
break;
|
||||
case 0x9001:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetPROM_8K_Bank(6, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[3]);
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[3]);
|
||||
break;
|
||||
case 0xA002:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[4]);
|
||||
break;
|
||||
case 0xA003:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[4]);
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[3]);
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[3]);
|
||||
break;
|
||||
case 0xA002:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[4]);
|
||||
break;
|
||||
case 0xA003:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[5]);
|
||||
break;
|
||||
case 0xB001:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[5]);
|
||||
break;
|
||||
case 0xB002:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[6]);
|
||||
break;
|
||||
case 0xB003:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[6]);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[5]);
|
||||
break;
|
||||
case 0xB001:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[5]);
|
||||
break;
|
||||
case 0xB002:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[6]);
|
||||
break;
|
||||
case 0xB003:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[7]);
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[7]);
|
||||
break;
|
||||
case 0xC002:
|
||||
reg[8] = (byte)((reg[8] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[8]);
|
||||
break;
|
||||
case 0xC003:
|
||||
reg[8] = (byte)((reg[8] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[8]);
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[7]);
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[7]);
|
||||
break;
|
||||
case 0xC002:
|
||||
reg[8] = (byte)((reg[8] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[8]);
|
||||
break;
|
||||
case 0xC003:
|
||||
reg[8] = (byte)((reg[8] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[8]);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
reg[9] = (byte)((reg[9] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[9]);
|
||||
break;
|
||||
case 0xD001:
|
||||
reg[9] = (byte)((reg[9] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[9]);
|
||||
break;
|
||||
case 0xD002:
|
||||
reg[10] = (byte)((reg[10] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[10]);
|
||||
break;
|
||||
case 0xD003:
|
||||
reg[10] = (byte)((reg[10] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[10]);
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[9] = (byte)((reg[9] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[9]);
|
||||
break;
|
||||
case 0xD001:
|
||||
reg[9] = (byte)((reg[9] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[9]);
|
||||
break;
|
||||
case 0xD002:
|
||||
reg[10] = (byte)((reg[10] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[10]);
|
||||
break;
|
||||
case 0xD003:
|
||||
reg[10] = (byte)((reg[10] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[10]);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
irq_latch = (irq_latch & 0xFFF0) | (data & 0x0F);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_latch = (irq_latch & 0xFF0F) | ((data & 0x0F) << 4);
|
||||
break;
|
||||
case 0xE002:
|
||||
irq_latch = (irq_latch & 0xF0FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
case 0xE003:
|
||||
irq_latch = (irq_latch & 0x0FFF) | ((data & 0x0F) << 12);
|
||||
break;
|
||||
case 0xE000:
|
||||
irq_latch = (irq_latch & 0xFFF0) | (data & 0x0F);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_latch = (irq_latch & 0xFF0F) | ((data & 0x0F) << 4);
|
||||
break;
|
||||
case 0xE002:
|
||||
irq_latch = (irq_latch & 0xF0FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
case 0xE003:
|
||||
irq_latch = (irq_latch & 0x0FFF) | ((data & 0x0F) << 12);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
// if( data & 0x01 ) {
|
||||
irq_counter = irq_latch;
|
||||
// } else {
|
||||
// irq_counter = 0;
|
||||
// }
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_mode = (byte)((data >> 1) & 0x07);
|
||||
irq_enable = ((byte)(data & 0x01));
|
||||
// if( !irq_enable ) {
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
// }
|
||||
break;
|
||||
case 0xF000:
|
||||
// if( data & 0x01 ) {
|
||||
irq_counter = irq_latch;
|
||||
// } else {
|
||||
// irq_counter = 0;
|
||||
// }
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_mode = (byte)((data >> 1) & 0x07);
|
||||
irq_enable = ((byte)(data & 0x01));
|
||||
// if( !irq_enable ) {
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
// }
|
||||
break;
|
||||
|
||||
case 0xF002:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF002:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper018::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
bool bIRQ = false;
|
||||
INT irq_counter_old = irq_counter;
|
||||
//void Mapper018::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
bool bIRQ = false;
|
||||
INT irq_counter_old = irq_counter;
|
||||
|
||||
if (irq_enable != 0 && irq_counter != 0)
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
if (irq_enable != 0 && irq_counter != 0)
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
|
||||
switch (irq_mode)
|
||||
{
|
||||
case 0:
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if ((irq_counter & 0xF000) != (irq_counter_old & 0xF000))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
if ((irq_counter & 0xFF00) != (irq_counter_old & 0xFF00))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
if ((irq_counter & 0xFFF0) != (irq_counter_old & 0xFFF0))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
switch (irq_mode)
|
||||
{
|
||||
case 0:
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if ((irq_counter & 0xF000) != (irq_counter_old & 0xF000))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
if ((irq_counter & 0xFF00) != (irq_counter_old & 0xFF00))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
if ((irq_counter & 0xFFF0) != (irq_counter_old & 0xFFF0))
|
||||
{
|
||||
bIRQ = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (bIRQ)
|
||||
{
|
||||
//// irq_enable = 0;
|
||||
// irq_counter = irq_latch;
|
||||
irq_counter = 0;
|
||||
irq_enable = 0;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bIRQ)
|
||||
{
|
||||
//// irq_enable = 0;
|
||||
// irq_counter = irq_latch;
|
||||
irq_counter = 0;
|
||||
irq_enable = 0;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper018::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[11] = irq_enable;
|
||||
//p[12] = irq_mode;
|
||||
//*(INT*)&p[13] = irq_counter;
|
||||
//*(INT*)&p[17] = irq_latch;
|
||||
}
|
||||
//void Mapper018::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[11] = irq_enable;
|
||||
//p[12] = irq_mode;
|
||||
//*(INT*)&p[13] = irq_counter;
|
||||
//*(INT*)&p[17] = irq_latch;
|
||||
}
|
||||
|
||||
//void Mapper018::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//irq_enable = p[11];
|
||||
//irq_mode = p[12];
|
||||
//irq_counter = *(INT*)&p[13];
|
||||
//irq_latch = *(INT*)&p[17];
|
||||
}
|
||||
//void Mapper018::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//irq_enable = p[11];
|
||||
//irq_mode = p[12];
|
||||
//irq_counter = *(INT*)&p[13];
|
||||
//irq_latch = *(INT*)&p[17];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,10 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper019 Namcot 106 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,255 +1,255 @@
|
||||
//////////////////
|
||||
// Mapper021 Konami VRC4 (Address mask $F006 or $F0C0) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper021 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[9];
|
||||
public class Mapper021 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[9];
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper021(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper021(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
//void Mapper021::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF0CF)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[8] & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
//void Mapper021::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF0CF)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[8] & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0x9002:
|
||||
case 0x9080:
|
||||
reg[8] = data;
|
||||
break;
|
||||
case 0x9002:
|
||||
case 0x9080:
|
||||
reg[8] = data;
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB002:
|
||||
case 0xB040:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB002:
|
||||
case 0xB040:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
case 0xB080:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
case 0xB006:
|
||||
case 0xB0C0:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
case 0xB080:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
case 0xB006:
|
||||
case 0xB0C0:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC002:
|
||||
case 0xC040:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC002:
|
||||
case 0xC040:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
case 0xC080:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
case 0xC006:
|
||||
case 0xC0C0:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
case 0xC080:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
case 0xC006:
|
||||
case 0xC0C0:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD002:
|
||||
case 0xD040:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD002:
|
||||
case 0xD040:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
case 0xD080:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
case 0xD006:
|
||||
case 0xD0C0:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
case 0xD080:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
case 0xD006:
|
||||
case 0xD0C0:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE002:
|
||||
case 0xE040:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE002:
|
||||
case 0xE040:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
case 0xE080:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
case 0xE006:
|
||||
case 0xE0C0:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
case 0xE080:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
case 0xE006:
|
||||
case 0xE0C0:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
break;
|
||||
case 0xF002:
|
||||
case 0xF040:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
break;
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
break;
|
||||
case 0xF002:
|
||||
case 0xF040:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
break;
|
||||
|
||||
case 0xF003:
|
||||
case 0xF0C0:
|
||||
case 0xF006:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
irq_clock = 0;
|
||||
case 0xF003:
|
||||
case 0xF0C0:
|
||||
case 0xF006:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
irq_clock = 0;
|
||||
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF004:
|
||||
case 0xF080:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
case 0xF004:
|
||||
case 0xF080:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
// case 0xF006:
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
// break;
|
||||
}
|
||||
}
|
||||
// case 0xF006:
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
// break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper021::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock -= cycles) < 0)
|
||||
{
|
||||
irq_clock += 0x72;
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// irq_enable = (irq_enable & 0x01) * 3;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper021::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock -= cycles) < 0)
|
||||
{
|
||||
irq_clock += 0x72;
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// irq_enable = (irq_enable & 0x01) * 3;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper021::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
//void Mapper021::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper021::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
//void Mapper021::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,80 +2,77 @@
|
||||
// Mapper022 Konami VRC2 type A //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper022 : Mapper
|
||||
{
|
||||
public Mapper022(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper022 : Mapper
|
||||
{
|
||||
public Mapper022(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
//void Mapper022::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper022::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
SetVROM_1K_Bank(0, data >> 1);
|
||||
break;
|
||||
case 0xB000:
|
||||
SetVROM_1K_Bank(0, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xB001:
|
||||
SetVROM_1K_Bank(1, data >> 1);
|
||||
break;
|
||||
case 0xB001:
|
||||
SetVROM_1K_Bank(1, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
SetVROM_1K_Bank(2, data >> 1);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetVROM_1K_Bank(2, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xC001:
|
||||
SetVROM_1K_Bank(3, data >> 1);
|
||||
break;
|
||||
case 0xC001:
|
||||
SetVROM_1K_Bank(3, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(4, data >> 1);
|
||||
break;
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(4, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(5, data >> 1);
|
||||
break;
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(5, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(6, data >> 1);
|
||||
break;
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(6, data >> 1);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(7, data >> 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(7, data >> 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,271 +1,271 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper023 Konami VRC2 type B //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper023 : Mapper
|
||||
{
|
||||
public class Mapper023 : Mapper
|
||||
{
|
||||
|
||||
ushort addrmask;
|
||||
ushort addrmask;
|
||||
|
||||
BYTE[] reg = new byte[9];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper023(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE[] reg = new byte[9];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper023(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
addrmask = 0xFFFF;
|
||||
public override void Reset()
|
||||
{
|
||||
addrmask = 0xFFFF;
|
||||
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
reg[9] = 1;
|
||||
reg[9] = 1;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0x93794634 // Akumajou Special Boku Dracula Kun(J)
|
||||
|| crc == 0xc7829dae // Akumajou Special Boku Dracula Kun(T-Eng)
|
||||
|| crc == 0xf82dc02f)
|
||||
{ // Akumajou Special Boku Dracula Kun(T-Eng v1.02)
|
||||
addrmask = 0xF00C;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0xdd53c4ae)
|
||||
{ // Tiny Toon Adventures(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
if (crc == 0x93794634 // Akumajou Special Boku Dracula Kun(J)
|
||||
|| crc == 0xc7829dae // Akumajou Special Boku Dracula Kun(T-Eng)
|
||||
|| crc == 0xf82dc02f)
|
||||
{ // Akumajou Special Boku Dracula Kun(T-Eng v1.02)
|
||||
addrmask = 0xF00C;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0xdd53c4ae)
|
||||
{ // Tiny Toon Adventures(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper023::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr & addrmask)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0x8004:
|
||||
case 0x8008:
|
||||
case 0x800C:
|
||||
if (reg[8] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
//void Mapper023::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr & addrmask)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0x8004:
|
||||
case 0x8008:
|
||||
case 0x800C:
|
||||
if (reg[8] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
if (data != 0xFF)
|
||||
{
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
}
|
||||
break;
|
||||
case 0x9000:
|
||||
if (data != 0xFF)
|
||||
{
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9008:
|
||||
reg[8] = (byte)(data & 0x02);
|
||||
break;
|
||||
case 0x9008:
|
||||
reg[8] = (byte)(data & 0x02);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
case 0xA004:
|
||||
case 0xA008:
|
||||
case 0xA00C:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
case 0xA004:
|
||||
case 0xA008:
|
||||
case 0xA00C:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
reg[0] = ((byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4)));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
reg[0] = ((byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4)));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
|
||||
case 0xB002:
|
||||
case 0xB008:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB002:
|
||||
case 0xB008:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xB003:
|
||||
case 0xB00C:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
case 0xB00C:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xC002:
|
||||
case 0xC008:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC002:
|
||||
case 0xC008:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
|
||||
case 0xC003:
|
||||
case 0xC00C:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
case 0xC00C:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xD002:
|
||||
case 0xD008:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD002:
|
||||
case 0xD008:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
|
||||
case 0xD003:
|
||||
case 0xD00C:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
case 0xD00C:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xE002:
|
||||
case 0xE008:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE002:
|
||||
case 0xE008:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
|
||||
case 0xE003:
|
||||
case 0xE00C:
|
||||
reg[7] = ((byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4)));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
case 0xE00C:
|
||||
reg[7] = ((byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4)));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF004:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF004:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF008:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF008:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF00C:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF00C:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper023::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 3;
|
||||
while (irq_clock >= 341)
|
||||
{
|
||||
irq_clock -= 341;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper023::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 3;
|
||||
while (irq_clock >= 341)
|
||||
{
|
||||
irq_clock -= 341;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper023::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
//void Mapper023::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper023::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
//void Mapper023::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,174 +1,174 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper024 Konami VRC6 (Normal) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper024 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper024(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper024 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper024(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
// nes.SetRenderMethod( NES::PRE_RENDER );
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
// nes.SetRenderMethod( NES::PRE_RENDER );
|
||||
|
||||
nes.apu.SelectExSound(1);
|
||||
}
|
||||
nes.apu.SelectExSound(1);
|
||||
}
|
||||
|
||||
//void Mapper024::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper024::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0xA000:
|
||||
case 0xA001:
|
||||
case 0xA002:
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0xA000:
|
||||
case 0xA001:
|
||||
case 0xA002:
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
|
||||
case 0xB003:
|
||||
data = (byte)(data & 0x0C);
|
||||
if (data == 0x00) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 0x04) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 0x08) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else if (data == 0x0C) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0xB003:
|
||||
data = (byte)(data & 0x0C);
|
||||
if (data == 0x00) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 0x04) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 0x08) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else if (data == 0x0C) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(0, data);
|
||||
break;
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(0, data);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
|
||||
case 0xD002:
|
||||
SetVROM_1K_Bank(2, data);
|
||||
break;
|
||||
case 0xD002:
|
||||
SetVROM_1K_Bank(2, data);
|
||||
break;
|
||||
|
||||
case 0xD003:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
case 0xD003:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0xE002:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0xE002:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xE003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
case 0xE003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF002:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF000:
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF002:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper024::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock += cycles) >= 0x72)
|
||||
{
|
||||
irq_clock -= 0x72;
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper024::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock += cycles) >= 0x72)
|
||||
{
|
||||
irq_clock -= 0x72;
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper024::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*(INT*)&p[3] = irq_clock;
|
||||
}
|
||||
//void Mapper024::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*(INT*)&p[3] = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper024::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *(INT*)&p[3];
|
||||
}
|
||||
//void Mapper024::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *(INT*)&p[3];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,278 +1,278 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper025 Konami VRC4 (Normal) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper025 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[11];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_occur;
|
||||
BYTE irq_counter;
|
||||
INT irq_clock;
|
||||
public Mapper025(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper025 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[11];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_occur;
|
||||
BYTE irq_counter;
|
||||
INT irq_clock;
|
||||
public Mapper025(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 11; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
reg[9] = (byte)(PROM_8K_SIZE - 2);
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 11; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
reg[9] = (byte)(PROM_8K_SIZE - 2);
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_occur = 0;
|
||||
irq_clock = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_occur = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xc71d4ce7)
|
||||
{ // Gradius II(J)
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
}
|
||||
if (crc == 0xa2e68da8)
|
||||
{ // For Racer Mini Yonku - Japan Cup(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0xea74c587)
|
||||
{ // For Teenage Mutant Ninja Turtles(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0x5f82cb7d)
|
||||
{ // For Teenage Mutant Ninja Turtles 2(J)
|
||||
}
|
||||
if (crc == 0x0bbd85ff)
|
||||
{ // For Bio Miracle Bokutte Upa(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xc71d4ce7)
|
||||
{ // Gradius II(J)
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
}
|
||||
if (crc == 0xa2e68da8)
|
||||
{ // For Racer Mini Yonku - Japan Cup(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0xea74c587)
|
||||
{ // For Teenage Mutant Ninja Turtles(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0x5f82cb7d)
|
||||
{ // For Teenage Mutant Ninja Turtles 2(J)
|
||||
}
|
||||
if (crc == 0x0bbd85ff)
|
||||
{ // For Bio Miracle Bokutte Upa(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper025::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//if( addr >= 0xF000 )
|
||||
//DEBUGOUT( "M25 WR $%04X=$%02X L=%3d\n", addr, data, nes.GetScanline() );
|
||||
//void Mapper025::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//if( addr >= 0xF000 )
|
||||
//DEBUGOUT( "M25 WR $%04X=$%02X L=%3d\n", addr, data, nes.GetScanline() );
|
||||
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[10] & 0x02) != 0)
|
||||
{
|
||||
reg[9] = data;
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
reg[8] = data;
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[10] & 0x02) != 0)
|
||||
{
|
||||
reg[9] = data;
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
reg[8] = data;
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (addr & 0xF00F)
|
||||
{
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
switch (addr & 0xF00F)
|
||||
{
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0x9001:
|
||||
case 0x9004:
|
||||
if ((reg[10] & 0x02) != (data & 0x02))
|
||||
{
|
||||
BYTE swap = reg[8];
|
||||
reg[8] = reg[9];
|
||||
reg[9] = swap;
|
||||
case 0x9001:
|
||||
case 0x9004:
|
||||
if ((reg[10] & 0x02) != (data & 0x02))
|
||||
{
|
||||
BYTE swap = reg[8];
|
||||
reg[8] = reg[9];
|
||||
reg[9] = swap;
|
||||
|
||||
SetPROM_8K_Bank(4, reg[8]);
|
||||
SetPROM_8K_Bank(6, reg[9]);
|
||||
}
|
||||
reg[10] = data;
|
||||
break;
|
||||
SetPROM_8K_Bank(4, reg[8]);
|
||||
SetPROM_8K_Bank(6, reg[9]);
|
||||
}
|
||||
reg[10] = data;
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB002:
|
||||
case 0xB008:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB002:
|
||||
case 0xB008:
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
case 0xB00C:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB001:
|
||||
case 0xB004:
|
||||
reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
case 0xB00C:
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC002:
|
||||
case 0xC008:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC002:
|
||||
case 0xC008:
|
||||
reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
case 0xC00C:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC001:
|
||||
case 0xC004:
|
||||
reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
case 0xC00C:
|
||||
reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD002:
|
||||
case 0xD008:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD002:
|
||||
case 0xD008:
|
||||
reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
case 0xD00C:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD001:
|
||||
case 0xD004:
|
||||
reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
case 0xD00C:
|
||||
reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE002:
|
||||
case 0xE008:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE002:
|
||||
case 0xE008:
|
||||
reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
case 0xE00C:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE001:
|
||||
case 0xE004:
|
||||
reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
case 0xE00C:
|
||||
reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF002:
|
||||
case 0xF008:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF002:
|
||||
case 0xF008:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF001:
|
||||
case 0xF004:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
// irq_counter = 0x100 - irq_latch;
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF001:
|
||||
case 0xF004:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
// irq_counter = 0x100 - irq_latch;
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF003:
|
||||
case 0xF00C:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF003:
|
||||
case 0xF00C:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper025::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 3;
|
||||
while (irq_clock >= 341)
|
||||
{
|
||||
irq_clock -= 341;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper025::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 3;
|
||||
while (irq_clock >= 341)
|
||||
{
|
||||
irq_clock -= 341;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper025::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[11] = irq_enable;
|
||||
//p[12] = irq_occur;
|
||||
//p[13] = irq_latch;
|
||||
//p[14] = irq_counter;
|
||||
//*((INT*)&p[15]) = irq_clock;
|
||||
}
|
||||
//void Mapper025::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[11] = irq_enable;
|
||||
//p[12] = irq_occur;
|
||||
//p[13] = irq_latch;
|
||||
//p[14] = irq_counter;
|
||||
//*((INT*)&p[15]) = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper025::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[11];
|
||||
//irq_occur = p[12];
|
||||
//irq_latch = p[13];
|
||||
//irq_counter = p[14];
|
||||
//irq_clock = *((INT*)&p[15]);
|
||||
}
|
||||
//void Mapper025::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 11; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[11];
|
||||
//irq_occur = p[12];
|
||||
//irq_latch = p[13];
|
||||
//irq_counter = p[14];
|
||||
//irq_clock = *((INT*)&p[15]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,185 +1,185 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper026 Konami VRC6 (PA0,PA1 reverse) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper026 : Mapper
|
||||
{
|
||||
public class Mapper026 : Mapper
|
||||
{
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper026(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper026(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x30e64d03)
|
||||
{ // Esper Dream 2 - Aratanaru Tatakai(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x836cc1ab)
|
||||
{ // Mouryou Senki Madara(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
nes.apu.SelectExSound(1);
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x30e64d03)
|
||||
{ // Esper Dream 2 - Aratanaru Tatakai(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x836cc1ab)
|
||||
{ // Mouryou Senki Madara(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
nes.apu.SelectExSound(1);
|
||||
}
|
||||
|
||||
//void Mapper026::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper026::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0xA000:
|
||||
case 0xA001:
|
||||
case 0xA002:
|
||||
case 0xA003:
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
addr = (ushort)((addr & 0xfffc) | ((addr & 1) << 1) | ((addr & 2) >> 1));
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0xA000:
|
||||
case 0xA001:
|
||||
case 0xA002:
|
||||
case 0xA003:
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
addr = (ushort)((addr & 0xfffc) | ((addr & 1) << 1) | ((addr & 2) >> 1));
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
|
||||
case 0xB003:
|
||||
data = (byte)(data & 0x7F);
|
||||
if (data == 0x08 || data == 0x2C) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else if (data == 0x20) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 0x24) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 0x28) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 0xB003:
|
||||
data = (byte)(data & 0x7F);
|
||||
if (data == 0x08 || data == 0x2C) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else if (data == 0x20) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 0x24) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 0x28) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(0, data);
|
||||
break;
|
||||
case 0xD000:
|
||||
SetVROM_1K_Bank(0, data);
|
||||
break;
|
||||
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(2, data);
|
||||
break;
|
||||
case 0xD001:
|
||||
SetVROM_1K_Bank(2, data);
|
||||
break;
|
||||
|
||||
case 0xD002:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
case 0xD002:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
|
||||
case 0xD003:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
case 0xD003:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0xE000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0xE001:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xE002:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0xE002:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0xE003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
case 0xE003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF002:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF000:
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF002:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper026::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock += cycles) >= 0x72)
|
||||
{
|
||||
irq_clock -= 0x72;
|
||||
if (irq_counter >= 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
//// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper026::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if ((irq_clock += cycles) >= 0x72)
|
||||
{
|
||||
irq_clock -= 0x72;
|
||||
if (irq_counter >= 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
//// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper026::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*(INT*)&p[3] = irq_clock;
|
||||
}
|
||||
//void Mapper026::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*(INT*)&p[3] = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper026::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *(INT*)&p[3];
|
||||
}
|
||||
//void Mapper026::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *(INT*)&p[3];
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,228 +1,228 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper027 Konami VRC4 (World Hero) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper027 : Mapper
|
||||
{
|
||||
ushort[] reg = new ushort[9];
|
||||
public class Mapper027 : Mapper
|
||||
{
|
||||
ushort[] reg = new ushort[9];
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper027(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper027(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = (byte)i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = (byte)i;
|
||||
}
|
||||
reg[8] = 0;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x47DCBCC4)
|
||||
{ // Gradius II(sample)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0x468F21FC)
|
||||
{ // Racer Mini 4 ku(sample)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x47DCBCC4)
|
||||
{ // Gradius II(sample)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0x468F21FC)
|
||||
{ // Racer Mini 4 ku(sample)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper027::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF0CF)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[8] & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
//void Mapper027::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF0CF)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg[8] & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0x9000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0x9002:
|
||||
case 0x9080:
|
||||
reg[8] = data;
|
||||
break;
|
||||
case 0x9002:
|
||||
case 0x9080:
|
||||
reg[8] = data;
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
reg[0] = (ushort)((reg[0] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB001:
|
||||
reg[0] = (ushort)((reg[0] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB000:
|
||||
reg[0] = (ushort)((reg[0] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xB001:
|
||||
reg[0] = (ushort)((reg[0] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(0, reg[0]);
|
||||
break;
|
||||
|
||||
case 0xB002:
|
||||
reg[1] = (ushort)((reg[1] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
reg[1] = (ushort)((reg[1] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB002:
|
||||
reg[1] = (ushort)((reg[1] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
case 0xB003:
|
||||
reg[1] = (ushort)((reg[1] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(1, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[2] = (ushort)((reg[2] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[2] = (ushort)((reg[2] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[2] = (ushort)((reg[2] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[2] = (ushort)((reg[2] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(2, reg[2]);
|
||||
break;
|
||||
|
||||
case 0xC002:
|
||||
reg[3] = (ushort)((reg[3] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
reg[3] = (ushort)((reg[3] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC002:
|
||||
reg[3] = (ushort)((reg[3] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
case 0xC003:
|
||||
reg[3] = (ushort)((reg[3] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(3, reg[3]);
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
reg[4] = (ushort)((reg[4] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD001:
|
||||
reg[4] = (ushort)((reg[4] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[4] = (ushort)((reg[4] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
case 0xD001:
|
||||
reg[4] = (ushort)((reg[4] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(4, reg[4]);
|
||||
break;
|
||||
|
||||
case 0xD002:
|
||||
reg[5] = (ushort)((reg[5] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
reg[5] = (ushort)((reg[5] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD002:
|
||||
reg[5] = (ushort)((reg[5] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
case 0xD003:
|
||||
reg[5] = (ushort)((reg[5] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(5, reg[5]);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
reg[6] = (ushort)((reg[6] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[6] = (ushort)((reg[6] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = (ushort)((reg[6] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[6] = (ushort)((reg[6] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(6, reg[6]);
|
||||
break;
|
||||
|
||||
case 0xE002:
|
||||
reg[7] = (ushort)((reg[7] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
reg[7] = (ushort)((reg[7] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE002:
|
||||
reg[7] = (ushort)((reg[7] & 0xFF0) | (data & 0x0F));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
case 0xE003:
|
||||
reg[7] = (ushort)((reg[7] & 0x0F) | (data << 4));
|
||||
SetVROM_1K_Bank(7, reg[7]);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF000:
|
||||
irq_latch = (byte)((irq_latch & 0xF0) | (data & 0x0F));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF001:
|
||||
irq_latch = (byte)((irq_latch & 0x0F) | ((data & 0x0F) << 4));
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF003:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF003:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF002:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF002:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper027::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper027::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper027::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
//void Mapper027::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// p[i] = reg[i];
|
||||
//}
|
||||
//p[9] = irq_enable;
|
||||
//p[10] = irq_counter;
|
||||
//p[11] = irq_latch;
|
||||
//*(INT*)&p[12] = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper027::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
//void Mapper027::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//for (INT i = 0; i < 9; i++)
|
||||
//{
|
||||
// reg[i] = p[i];
|
||||
//}
|
||||
//irq_enable = p[9];
|
||||
//irq_counter = p[10];
|
||||
//irq_latch = p[11];
|
||||
//irq_clock = *(INT*)&p[12];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,122 +2,120 @@
|
||||
// Mapper032 Irem G101 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper032 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
public class Mapper032 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
|
||||
BYTE reg;
|
||||
public Mapper032(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE reg;
|
||||
public Mapper032(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
reg = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
reg = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
// For Major League(J)
|
||||
if (crc == 0xc0fed437)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
// For Ai Sensei no Oshiete - Watashi no Hoshi(J)
|
||||
if (crc == 0xfd3fc292)
|
||||
{
|
||||
SetPROM_32K_Bank(30, 31, 30, 31);
|
||||
}
|
||||
}
|
||||
// For Major League(J)
|
||||
if (crc == 0xc0fed437)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
// For Ai Sensei no Oshiete - Watashi no Hoshi(J)
|
||||
if (crc == 0xfd3fc292)
|
||||
{
|
||||
SetPROM_32K_Bank(30, 31, 30, 31);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper032::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
//void Mapper032::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((reg & 0x02) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
reg = data;
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0x9000:
|
||||
reg = data;
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (addr & 0xF007)
|
||||
{
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
case 0xB003:
|
||||
case 0xB004:
|
||||
case 0xB005:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x0007), data);
|
||||
break;
|
||||
case 0xB006:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
switch (addr & 0xF007)
|
||||
{
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
case 0xB003:
|
||||
case 0xB004:
|
||||
case 0xB005:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x0007), data);
|
||||
break;
|
||||
case 0xB006:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
|
||||
if (patch != 0 && ((data & 0x40) != 0))
|
||||
{
|
||||
SetVRAM_Mirror(0, 0, 0, 1);
|
||||
}
|
||||
break;
|
||||
case 0xB007:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
if (patch != 0 && ((data & 0x40) != 0))
|
||||
{
|
||||
SetVRAM_Mirror(0, 0, 0, 1);
|
||||
}
|
||||
break;
|
||||
case 0xB007:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
|
||||
if (patch != 0 && ((data & 0x40) != 0))
|
||||
{
|
||||
SetVRAM_Mirror(0, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (patch != 0 && ((data & 0x40) != 0))
|
||||
{
|
||||
SetVRAM_Mirror(0, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper032::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
//void Mapper032::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
|
||||
//void Mapper032::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
//void Mapper032::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,131 +1,131 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper033 Taito TC0190 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper033 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[7];
|
||||
public class Mapper033 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[7];
|
||||
|
||||
BYTE patch;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper033(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE patch;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper033(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
|
||||
reg[0] = 0;
|
||||
reg[1] = 2;
|
||||
reg[2] = 4;
|
||||
reg[3] = 5;
|
||||
reg[4] = 6;
|
||||
reg[5] = 7;
|
||||
reg[6] = 1;
|
||||
reg[0] = 0;
|
||||
reg[1] = 2;
|
||||
reg[2] = 4;
|
||||
reg[3] = 5;
|
||||
reg[4] = 6;
|
||||
reg[5] = 7;
|
||||
reg[6] = 1;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetBank();
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetBank();
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// Check For Old #33 games.... (CRC code by NesToy)
|
||||
if (crc == 0x5e9bc161 // Akira(J)
|
||||
|| crc == 0xecdbafa4 // Bakushou!! Jinsei Gekijou(J)
|
||||
|| crc == 0x59cd0c31 // Don Doko Don(J)
|
||||
|| crc == 0x837c1342 // Golf Ko Open(J)
|
||||
|| crc == 0x42d893e4 // Operation Wolf(J)
|
||||
|| crc == 0x1388aeb9 // Operation Wolf(U)
|
||||
|| crc == 0x07ee6d8f // Power Blazer(J)
|
||||
|| crc == 0x5193fb54 // Takeshi no Sengoku Fuuunji(J)
|
||||
|| crc == 0xa71c3452)
|
||||
{ // Insector X(J)
|
||||
patch = 1;
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// Check For Old #33 games.... (CRC code by NesToy)
|
||||
if (crc == 0x5e9bc161 // Akira(J)
|
||||
|| crc == 0xecdbafa4 // Bakushou!! Jinsei Gekijou(J)
|
||||
|| crc == 0x59cd0c31 // Don Doko Don(J)
|
||||
|| crc == 0x837c1342 // Golf Ko Open(J)
|
||||
|| crc == 0x42d893e4 // Operation Wolf(J)
|
||||
|| crc == 0x1388aeb9 // Operation Wolf(U)
|
||||
|| crc == 0x07ee6d8f // Power Blazer(J)
|
||||
|| crc == 0x5193fb54 // Takeshi no Sengoku Fuuunji(J)
|
||||
|| crc == 0xa71c3452)
|
||||
{ // Insector X(J)
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_RENDER);
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_RENDER);
|
||||
|
||||
if (crc == 0x202df297)
|
||||
{ // Captain Saver(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0x63bb86b5)
|
||||
{ // The Jetsons(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
}
|
||||
if (crc == 0x202df297)
|
||||
{ // Captain Saver(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0x63bb86b5)
|
||||
{ // The Jetsons(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper033::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
// LOG( "Mapper033 addr=%04X data=%02X", addr&0xFFFF, data&0xFF );
|
||||
//void Mapper033::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
// LOG( "Mapper033 addr=%04X data=%02X", addr&0xFFFF, data&0xFF );
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(4, data & 0x1F);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x8001:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(5, data & 0x1F);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(4, data & 0x1F);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x8001:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(5, data & 0x1F);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x8002:
|
||||
reg[0] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0x8003:
|
||||
reg[1] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA002:
|
||||
reg[4] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA003:
|
||||
reg[5] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0x8002:
|
||||
reg[0] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0x8003:
|
||||
reg[1] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA002:
|
||||
reg[4] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xA003:
|
||||
reg[5] = data;
|
||||
SetBank();
|
||||
break;
|
||||
|
||||
#if FLASE//0
|
||||
case 0xC003:
|
||||
@ -147,36 +147,36 @@ namespace VirtualNes.Core
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
#else
|
||||
case 0xC000:
|
||||
irq_latch = data;
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xC001:
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xC002:
|
||||
irq_enable = 1;
|
||||
break;
|
||||
case 0xC003:
|
||||
irq_enable = 0;
|
||||
break;
|
||||
case 0xC000:
|
||||
irq_latch = data;
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xC001:
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xC002:
|
||||
irq_enable = 1;
|
||||
break;
|
||||
case 0xC003:
|
||||
irq_enable = 0;
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
case 0xE002:
|
||||
case 0xE003:
|
||||
break;
|
||||
case 0xE001:
|
||||
case 0xE002:
|
||||
case 0xE003:
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 0xE000:
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xE000:
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper033::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
//void Mapper033::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
#if FALSE//0
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
if( scanline >= 0 && scanline <= 239 ) {
|
||||
@ -194,67 +194,67 @@ namespace VirtualNes.Core
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (scanline >= 0 && scanline <= 239 && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (++irq_counter == 0)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scanline >= 0 && scanline <= 239 && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (++irq_counter == 0)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank()
|
||||
{
|
||||
SetVROM_2K_Bank(0, reg[0]);
|
||||
SetVROM_2K_Bank(2, reg[1]);
|
||||
void SetBank()
|
||||
{
|
||||
SetVROM_2K_Bank(0, reg[0]);
|
||||
SetVROM_2K_Bank(2, reg[1]);
|
||||
|
||||
// if( reg[6] & 0x01 ) {
|
||||
SetVROM_1K_Bank(4, reg[2]);
|
||||
SetVROM_1K_Bank(5, reg[3]);
|
||||
SetVROM_1K_Bank(6, reg[4]);
|
||||
SetVROM_1K_Bank(7, reg[5]);
|
||||
// } else {
|
||||
// SetVROM_2K_Bank( 4, reg[0] );
|
||||
// SetVROM_2K_Bank( 6, reg[1] );
|
||||
// }
|
||||
}
|
||||
// if( reg[6] & 0x01 ) {
|
||||
SetVROM_1K_Bank(4, reg[2]);
|
||||
SetVROM_1K_Bank(5, reg[3]);
|
||||
SetVROM_1K_Bank(6, reg[4]);
|
||||
SetVROM_1K_Bank(7, reg[5]);
|
||||
// } else {
|
||||
// SetVROM_2K_Bank( 4, reg[0] );
|
||||
// SetVROM_2K_Bank( 6, reg[1] );
|
||||
// }
|
||||
}
|
||||
|
||||
//void Mapper033::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 7; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
//void Mapper033::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 7; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
|
||||
p[7] = irq_enable;
|
||||
p[8] = irq_counter;
|
||||
p[9] = irq_latch;
|
||||
}
|
||||
p[7] = irq_enable;
|
||||
p[8] = irq_counter;
|
||||
p[9] = irq_latch;
|
||||
}
|
||||
|
||||
//void Mapper033::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 7; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
//void Mapper033::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 7; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
|
||||
irq_enable = p[7];
|
||||
irq_counter = p[8];
|
||||
irq_latch = p[9];
|
||||
}
|
||||
irq_enable = p[7];
|
||||
irq_counter = p[8];
|
||||
irq_latch = p[9];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,53 +2,50 @@
|
||||
// Mapper034 Nina-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper034 : Mapper
|
||||
{
|
||||
public Mapper034(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper034 : Mapper
|
||||
{
|
||||
public Mapper034(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper034::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7FFD:
|
||||
SetPROM_32K_Bank(data);
|
||||
break;
|
||||
case 0x7FFE:
|
||||
SetVROM_4K_Bank(0, data);
|
||||
break;
|
||||
case 0x7FFF:
|
||||
SetVROM_4K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper034::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7FFD:
|
||||
SetPROM_32K_Bank(data);
|
||||
break;
|
||||
case 0x7FFE:
|
||||
SetVROM_4K_Bank(0, data);
|
||||
break;
|
||||
case 0x7FFF:
|
||||
SetVROM_4K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper034::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data);
|
||||
}
|
||||
//void Mapper034::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,25 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper035 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper035 : Mapper
|
||||
{
|
||||
public class Mapper035 : Mapper
|
||||
{
|
||||
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE[] chr = new byte[8];
|
||||
ushort IRQCount, IRQa;
|
||||
public Mapper035(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
reg[i] = chr[i] = 0;
|
||||
@ -103,7 +102,7 @@ namespace VirtualNes.Core
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (IRQa!=0)
|
||||
if (IRQa != 0)
|
||||
{
|
||||
IRQCount--;
|
||||
if (IRQCount == 0)
|
||||
@ -118,7 +117,7 @@ namespace VirtualNes.Core
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,90 +1,90 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper040 SMB2J //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper040 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_line;
|
||||
public Mapper040(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper040 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_line;
|
||||
public Mapper040(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_line = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_line = 0;
|
||||
|
||||
SetPROM_8K_Bank(3, 6);
|
||||
SetPROM_32K_Bank(4, 5, 0, 7);
|
||||
SetPROM_8K_Bank(3, 6);
|
||||
SetPROM_32K_Bank(4, 5, 0, 7);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper040::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE000)
|
||||
{
|
||||
case 0x8000:
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xA000:
|
||||
irq_enable = 0xFF;
|
||||
irq_line = 37;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xC000:
|
||||
break;
|
||||
case 0xE000:
|
||||
SetPROM_8K_Bank(6, data & 0x07);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper040::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE000)
|
||||
{
|
||||
case 0x8000:
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xA000:
|
||||
irq_enable = 0xFF;
|
||||
irq_line = 37;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xC000:
|
||||
break;
|
||||
case 0xE000:
|
||||
SetPROM_8K_Bank(6, data & 0x07);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper040::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (--irq_line <= 0)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper040::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (--irq_line <= 0)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper040::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_line;
|
||||
}
|
||||
//void Mapper040::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_line;
|
||||
}
|
||||
|
||||
//void Mapper040::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_line = *(INT*)&p[1];
|
||||
}
|
||||
//void Mapper040::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_line = *(INT*)&p[1];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,77 +2,75 @@
|
||||
// Mapper041 Caltron 6-in-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper041 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[2];
|
||||
public Mapper041(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper041 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[2];
|
||||
public Mapper041(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = reg[1] = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = reg[1] = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper041::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000 && addr < 0x6800)
|
||||
{
|
||||
SetPROM_32K_Bank(addr & 0x07);
|
||||
reg[0] = (byte)(addr & 0x04);
|
||||
reg[1] &= 0x03;
|
||||
reg[1] |= (byte)((addr >> 1) & 0x0C);
|
||||
SetVROM_8K_Bank(reg[1]);
|
||||
if ((addr & 0x20) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
}
|
||||
//void Mapper041::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000 && addr < 0x6800)
|
||||
{
|
||||
SetPROM_32K_Bank(addr & 0x07);
|
||||
reg[0] = (byte)(addr & 0x04);
|
||||
reg[1] &= 0x03;
|
||||
reg[1] |= (byte)((addr >> 1) & 0x0C);
|
||||
SetVROM_8K_Bank(reg[1]);
|
||||
if ((addr & 0x20) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper041::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (reg[0] != 0)
|
||||
{
|
||||
reg[1] &= 0x0C;
|
||||
reg[1] |= (byte)(addr & 0x03);
|
||||
SetVROM_8K_Bank(reg[1]);
|
||||
}
|
||||
}
|
||||
//void Mapper041::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (reg[0] != 0)
|
||||
{
|
||||
reg[1] &= 0x0C;
|
||||
reg[1] |= (byte)(addr & 0x03);
|
||||
SetVROM_8K_Bank(reg[1]);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper041::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
}
|
||||
//void Mapper041::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
}
|
||||
|
||||
//void Mapper041::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
}
|
||||
//void Mapper041::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,103 +1,102 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper042 Mario Baby //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper042 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper042(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper042 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper042(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
|
||||
SetPROM_8K_Bank(3, 0);
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 4, PROM_8K_SIZE - 3, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_8K_Bank(3, 0);
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 4, PROM_8K_SIZE - 3, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper042::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE003)
|
||||
{
|
||||
case 0xE000:
|
||||
SetPROM_8K_Bank(3, data & 0x0F);
|
||||
break;
|
||||
//void Mapper042::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE003)
|
||||
{
|
||||
case 0xE000:
|
||||
SetPROM_8K_Bank(3, data & 0x0F);
|
||||
break;
|
||||
|
||||
case 0xE001:
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xE001:
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
|
||||
case 0xE002:
|
||||
if ((data & 0x02) != 0)
|
||||
{
|
||||
irq_enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xE002:
|
||||
if ((data & 0x02) != 0)
|
||||
{
|
||||
irq_enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper042::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter < 215)
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
if (irq_counter == 215)
|
||||
{
|
||||
irq_enable = 0;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper042::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter < 215)
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
if (irq_counter == 215)
|
||||
{
|
||||
irq_enable = 0;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper042::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
p[1] = irq_counter;
|
||||
}
|
||||
//void Mapper042::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
p[1] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper042::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
irq_counter = p[1];
|
||||
}
|
||||
//void Mapper042::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
irq_counter = p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,138 +1,138 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper043 SMB2J //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper043 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper043(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper043 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper043(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0xFF;
|
||||
irq_counter = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0xFF;
|
||||
irq_counter = 0;
|
||||
|
||||
SetPROM_8K_Bank(3, 2);
|
||||
SetPROM_32K_Bank(1, 0, 4, 9);
|
||||
SetPROM_8K_Bank(3, 2);
|
||||
SetPROM_32K_Bank(1, 0, 4, 9);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//BYTE Mapper043::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
if (0x5000 <= addr && addr < 0x6000)
|
||||
{
|
||||
byte[] pPtr = nes.rom.GetPROM();
|
||||
return pPtr[0x2000 * 8 + 0x1000 + (addr - 0x5000)];
|
||||
}
|
||||
return (BYTE)(addr >> 8);
|
||||
}
|
||||
//BYTE Mapper043::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
if (0x5000 <= addr && addr < 0x6000)
|
||||
{
|
||||
byte[] pPtr = nes.rom.GetPROM();
|
||||
return pPtr[0x2000 * 8 + 0x1000 + (addr - 0x5000)];
|
||||
}
|
||||
return (BYTE)(addr >> 8);
|
||||
}
|
||||
|
||||
//void Mapper043::ExWrite(WORD addr, BYTE data)
|
||||
public override void ExWrite(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xF0FF) == 0x4022)
|
||||
{
|
||||
switch (data & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
SetPROM_8K_Bank(6, 4);
|
||||
break;
|
||||
case 0x01:
|
||||
SetPROM_8K_Bank(6, 3);
|
||||
break;
|
||||
case 0x05:
|
||||
SetPROM_8K_Bank(6, 7);
|
||||
break;
|
||||
case 0x06:
|
||||
SetPROM_8K_Bank(6, 5);
|
||||
break;
|
||||
case 0x07:
|
||||
SetPROM_8K_Bank(6, 6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper043::ExWrite(WORD addr, BYTE data)
|
||||
public override void ExWrite(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xF0FF) == 0x4022)
|
||||
{
|
||||
switch (data & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
SetPROM_8K_Bank(6, 4);
|
||||
break;
|
||||
case 0x01:
|
||||
SetPROM_8K_Bank(6, 3);
|
||||
break;
|
||||
case 0x05:
|
||||
SetPROM_8K_Bank(6, 7);
|
||||
break;
|
||||
case 0x06:
|
||||
SetPROM_8K_Bank(6, 5);
|
||||
break;
|
||||
case 0x07:
|
||||
SetPROM_8K_Bank(6, 6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper043::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xF0FF) == 0x4022)
|
||||
{
|
||||
ExWrite(addr, data);
|
||||
}
|
||||
}
|
||||
//void Mapper043::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xF0FF) == 0x4022)
|
||||
{
|
||||
ExWrite(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper043::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x8122)
|
||||
{
|
||||
if ((data & 0x03) != 0)
|
||||
{
|
||||
irq_enable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter = 0;
|
||||
irq_enable = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
//void Mapper043::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x8122)
|
||||
{
|
||||
if ((data & 0x03) != 0)
|
||||
{
|
||||
irq_enable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter = 0;
|
||||
irq_enable = 0;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper043::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter += 341;
|
||||
if (irq_counter >= 12288)
|
||||
{
|
||||
irq_counter = 0;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper043::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter += 341;
|
||||
if (irq_counter >= 12288)
|
||||
{
|
||||
irq_counter = 0;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper043::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
//void Mapper043::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper043::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
//void Mapper043::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,289 +1,289 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper044 Super HiK 7-in-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper044 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE bank;
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper044(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper044 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE bank;
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper044(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
if (nes.rom.GetPROM_CRC() == 0x7eef434c)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
if (nes.rom.GetPROM_CRC() == 0x7eef434c)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
|
||||
bank = 0;
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
bank = 0;
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
|
||||
// set VROM banks
|
||||
if (VROM_1K_SIZE!=0)
|
||||
{
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
chr01 = chr23 = chr4 = chr5 = chr6 = chr7 = 0;
|
||||
}
|
||||
// set VROM banks
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
chr01 = chr23 = chr4 = chr5 = chr6 = chr7 = 0;
|
||||
}
|
||||
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
|
||||
//void Mapper044::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
if (patch!=0)
|
||||
{
|
||||
bank = (byte)((data & 0x06) >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = (byte)((data & 0x01) << 1);
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
//void Mapper044::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
bank = (byte)((data & 0x06) >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = (byte)((data & 0x01) << 1);
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper044::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01)!=0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
bank = (byte)(data & 0x07);
|
||||
if (bank == 7)
|
||||
{
|
||||
bank = 6;
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper044::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
bank = (byte)(data & 0x07);
|
||||
if (bank == 7)
|
||||
{
|
||||
bank = 6;
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper044::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable!=0)
|
||||
{
|
||||
if ((--irq_counter)==0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper044::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((--irq_counter) == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40)!=0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((bank == 6) ? 0x1e : 0x0e) | (bank << 4));
|
||||
SetPROM_8K_Bank(5, ((bank == 6) ? 0x1f & prg1 : 0x0f & prg1) | (bank << 4));
|
||||
SetPROM_8K_Bank(6, ((bank == 6) ? 0x1f & prg0 : 0x0f & prg0) | (bank << 4));
|
||||
SetPROM_8K_Bank(7, ((bank == 6) ? 0x1f : 0x0f) | (bank << 4));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((bank == 6) ? 0x1f & prg0 : 0x0f & prg0) | (bank << 4));
|
||||
SetPROM_8K_Bank(5, ((bank == 6) ? 0x1f & prg1 : 0x0f & prg1) | (bank << 4));
|
||||
SetPROM_8K_Bank(6, ((bank == 6) ? 0x1e : 0x0e) | (bank << 4));
|
||||
SetPROM_8K_Bank(7, ((bank == 6) ? 0x1f : 0x0f) | (bank << 4));
|
||||
}
|
||||
}
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((bank == 6) ? 0x1e : 0x0e) | (bank << 4));
|
||||
SetPROM_8K_Bank(5, ((bank == 6) ? 0x1f & prg1 : 0x0f & prg1) | (bank << 4));
|
||||
SetPROM_8K_Bank(6, ((bank == 6) ? 0x1f & prg0 : 0x0f & prg0) | (bank << 4));
|
||||
SetPROM_8K_Bank(7, ((bank == 6) ? 0x1f : 0x0f) | (bank << 4));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((bank == 6) ? 0x1f & prg0 : 0x0f & prg0) | (bank << 4));
|
||||
SetPROM_8K_Bank(5, ((bank == 6) ? 0x1f & prg1 : 0x0f & prg1) | (bank << 4));
|
||||
SetPROM_8K_Bank(6, ((bank == 6) ? 0x1e : 0x0e) | (bank << 4));
|
||||
SetPROM_8K_Bank(7, ((bank == 6) ? 0x1f : 0x0f) | (bank << 4));
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE!=0)
|
||||
{
|
||||
if ((reg[0] & 0x80)!=0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, ((bank == 6) ? 0xff & chr4 : 0x7f & chr4) | (bank << 7));
|
||||
SetVROM_1K_Bank(1, ((bank == 6) ? 0xff & chr5 : 0x7f & chr5) | (bank << 7));
|
||||
SetVROM_1K_Bank(2, ((bank == 6) ? 0xff & chr6 : 0x7f & chr6) | (bank << 7));
|
||||
SetVROM_1K_Bank(3, ((bank == 6) ? 0xff & chr7 : 0x7f & chr7) | (bank << 7));
|
||||
SetVROM_1K_Bank(4, ((bank == 6) ? 0xff & chr01 : 0x7f & chr01) | (bank << 7));
|
||||
SetVROM_1K_Bank(5, ((bank == 6) ? 0xff & (chr01 + 1) : 0x7f & (chr01 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(6, ((bank == 6) ? 0xff & chr23 : 0x7f & chr23) | (bank << 7));
|
||||
SetVROM_1K_Bank(7, ((bank == 6) ? 0xff & (chr23 + 1) : 0x7f & (chr23 + 1)) | (bank << 7));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, ((bank == 6) ? 0xff & chr01 : 0x7f & chr01) | (bank << 7));
|
||||
SetVROM_1K_Bank(1, ((bank == 6) ? 0xff & (chr01 + 1) : 0x7f & (chr01 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(2, ((bank == 6) ? 0xff & chr23 : 0x7f & chr23) | (bank << 7));
|
||||
SetVROM_1K_Bank(3, ((bank == 6) ? 0xff & (chr23 + 1) : 0x7f & (chr23 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(4, ((bank == 6) ? 0xff & chr4 : 0x7f & chr4) | (bank << 7));
|
||||
SetVROM_1K_Bank(5, ((bank == 6) ? 0xff & chr5 : 0x7f & chr5) | (bank << 7));
|
||||
SetVROM_1K_Bank(6, ((bank == 6) ? 0xff & chr6 : 0x7f & chr6) | (bank << 7));
|
||||
SetVROM_1K_Bank(7, ((bank == 6) ? 0xff & chr7 : 0x7f & chr7) | (bank << 7));
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, ((bank == 6) ? 0xff & chr4 : 0x7f & chr4) | (bank << 7));
|
||||
SetVROM_1K_Bank(1, ((bank == 6) ? 0xff & chr5 : 0x7f & chr5) | (bank << 7));
|
||||
SetVROM_1K_Bank(2, ((bank == 6) ? 0xff & chr6 : 0x7f & chr6) | (bank << 7));
|
||||
SetVROM_1K_Bank(3, ((bank == 6) ? 0xff & chr7 : 0x7f & chr7) | (bank << 7));
|
||||
SetVROM_1K_Bank(4, ((bank == 6) ? 0xff & chr01 : 0x7f & chr01) | (bank << 7));
|
||||
SetVROM_1K_Bank(5, ((bank == 6) ? 0xff & (chr01 + 1) : 0x7f & (chr01 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(6, ((bank == 6) ? 0xff & chr23 : 0x7f & chr23) | (bank << 7));
|
||||
SetVROM_1K_Bank(7, ((bank == 6) ? 0xff & (chr23 + 1) : 0x7f & (chr23 + 1)) | (bank << 7));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, ((bank == 6) ? 0xff & chr01 : 0x7f & chr01) | (bank << 7));
|
||||
SetVROM_1K_Bank(1, ((bank == 6) ? 0xff & (chr01 + 1) : 0x7f & (chr01 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(2, ((bank == 6) ? 0xff & chr23 : 0x7f & chr23) | (bank << 7));
|
||||
SetVROM_1K_Bank(3, ((bank == 6) ? 0xff & (chr23 + 1) : 0x7f & (chr23 + 1)) | (bank << 7));
|
||||
SetVROM_1K_Bank(4, ((bank == 6) ? 0xff & chr4 : 0x7f & chr4) | (bank << 7));
|
||||
SetVROM_1K_Bank(5, ((bank == 6) ? 0xff & chr5 : 0x7f & chr5) | (bank << 7));
|
||||
SetVROM_1K_Bank(6, ((bank == 6) ? 0xff & chr6 : 0x7f & chr6) | (bank << 7));
|
||||
SetVROM_1K_Bank(7, ((bank == 6) ? 0xff & chr7 : 0x7f & chr7) | (bank << 7));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper044::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = bank;
|
||||
}
|
||||
//void Mapper044::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = bank;
|
||||
}
|
||||
|
||||
//void Mapper044::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
bank = p[19];
|
||||
}
|
||||
//void Mapper044::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
bank = p[19];
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,387 +1,387 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper045 1000000-in-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper045 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE prg0, prg1, prg2, prg3;
|
||||
BYTE chr0, chr1, chr2, chr3, chr4, chr5, chr6, chr7;
|
||||
BYTE[] p = new byte[4];
|
||||
INT[] c = new int[8];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_latched;
|
||||
BYTE irq_reset;
|
||||
public Mapper045(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper045 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE prg0, prg1, prg2, prg3;
|
||||
BYTE chr0, chr1, chr2, chr3, chr4, chr5, chr6, chr7;
|
||||
BYTE[] p = new byte[4];
|
||||
INT[] c = new int[8];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_latched;
|
||||
BYTE irq_reset;
|
||||
public Mapper045(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
prg2 = (byte)(PROM_8K_SIZE - 2);
|
||||
prg3 = (byte)(PROM_8K_SIZE - 1);
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
prg2 = (byte)(PROM_8K_SIZE - 2);
|
||||
prg3 = (byte)(PROM_8K_SIZE - 1);
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x58bcacf6 // Kunio 8-in-1 (Pirate Cart)
|
||||
|| crc == 0x9103cfd6 // HIK 7-in-1 (Pirate Cart)
|
||||
|| crc == 0xc082e6d3)
|
||||
{ // Super 8-in-1 (Pirate Cart)
|
||||
patch = 1;
|
||||
prg2 = 62;
|
||||
prg3 = 63;
|
||||
}
|
||||
if (crc == 0xe0dd259d)
|
||||
{ // Super 3-in-1 (Pirate Cart)
|
||||
patch = 2;
|
||||
}
|
||||
SetPROM_32K_Bank(prg0, prg1, prg2, prg3);
|
||||
p[0] = prg0;
|
||||
p[1] = prg1;
|
||||
p[2] = prg2;
|
||||
p[3] = prg3;
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x58bcacf6 // Kunio 8-in-1 (Pirate Cart)
|
||||
|| crc == 0x9103cfd6 // HIK 7-in-1 (Pirate Cart)
|
||||
|| crc == 0xc082e6d3)
|
||||
{ // Super 8-in-1 (Pirate Cart)
|
||||
patch = 1;
|
||||
prg2 = 62;
|
||||
prg3 = 63;
|
||||
}
|
||||
if (crc == 0xe0dd259d)
|
||||
{ // Super 3-in-1 (Pirate Cart)
|
||||
patch = 2;
|
||||
}
|
||||
SetPROM_32K_Bank(prg0, prg1, prg2, prg3);
|
||||
p[0] = prg0;
|
||||
p[1] = prg1;
|
||||
p[2] = prg2;
|
||||
p[3] = prg3;
|
||||
|
||||
SetVROM_8K_Bank(0);
|
||||
SetVROM_8K_Bank(0);
|
||||
|
||||
// chr0 = c[0] = 0;
|
||||
// chr1 = c[1] = 0
|
||||
// chr2 = c[2] = 0;
|
||||
// chr3 = c[3] = 0;
|
||||
// chr4 = c[4] = 0;
|
||||
// chr5 = c[5] = 0;
|
||||
// chr6 = c[6] = 0;
|
||||
// chr7 = c[7] = 0;
|
||||
// chr0 = c[0] = 0;
|
||||
// chr1 = c[1] = 0
|
||||
// chr2 = c[2] = 0;
|
||||
// chr3 = c[3] = 0;
|
||||
// chr4 = c[4] = 0;
|
||||
// chr5 = c[5] = 0;
|
||||
// chr6 = c[6] = 0;
|
||||
// chr7 = c[7] = 0;
|
||||
|
||||
c[0] = chr0 = 0;
|
||||
c[1] = chr1 = 1;
|
||||
c[2] = chr2 = 2;
|
||||
c[3] = chr3 = 3;
|
||||
c[4] = chr4 = 4;
|
||||
c[5] = chr5 = 5;
|
||||
c[6] = chr6 = 6;
|
||||
c[7] = chr7 = 7;
|
||||
c[0] = chr0 = 0;
|
||||
c[1] = chr1 = 1;
|
||||
c[2] = chr2 = 2;
|
||||
c[3] = chr3 = 3;
|
||||
c[4] = chr4 = 4;
|
||||
c[5] = chr5 = 5;
|
||||
c[6] = chr6 = 6;
|
||||
c[7] = chr7 = 7;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_latched = 0;
|
||||
irq_reset = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_latched = 0;
|
||||
irq_reset = 0;
|
||||
}
|
||||
|
||||
//void Mapper045::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
// if( addr == 0x6000 ) {
|
||||
// if( addr == 0x6000 && !(reg[3]&0x40) ) {
|
||||
if ((reg[3] & 0x40) == 0)
|
||||
{
|
||||
reg[reg[5]] = data;
|
||||
reg[5] = (byte)((reg[5] + 1) & 0x03);
|
||||
//void Mapper045::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
// if( addr == 0x6000 ) {
|
||||
// if( addr == 0x6000 && !(reg[3]&0x40) ) {
|
||||
if ((reg[3] & 0x40) == 0)
|
||||
{
|
||||
reg[reg[5]] = data;
|
||||
reg[5] = (byte)((reg[5] + 1) & 0x03);
|
||||
|
||||
SetBank_CPU_4(prg0);
|
||||
SetBank_CPU_5(prg1);
|
||||
SetBank_CPU_6(prg2);
|
||||
SetBank_CPU_7(prg3);
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
SetBank_CPU_4(prg0);
|
||||
SetBank_CPU_5(prg1);
|
||||
SetBank_CPU_6(prg2);
|
||||
SetBank_CPU_7(prg3);
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper045::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((data & 0x40) != (reg[6] & 0x40))
|
||||
{
|
||||
BYTE swp;
|
||||
swp = prg0; prg0 = prg2; prg2 = swp;
|
||||
swp = p[0]; p[0] = p[2]; p[2] = swp;
|
||||
SetBank_CPU_4(p[0]);
|
||||
SetBank_CPU_5(p[1]);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((data & 0x80) != (reg[6] & 0x80))
|
||||
{
|
||||
INT swp;
|
||||
swp = chr4; chr4 = chr0; chr0 = (byte)swp;
|
||||
swp = chr5; chr5 = chr1; chr1 = (byte)swp;
|
||||
swp = chr6; chr6 = chr2; chr2 = (byte)swp;
|
||||
swp = chr7; chr7 = chr3; chr3 = (byte)swp;
|
||||
swp = c[4]; c[4] = c[0]; c[0] = swp;
|
||||
swp = c[5]; c[5] = c[1]; c[1] = swp;
|
||||
swp = c[6]; c[6] = c[2]; c[2] = swp;
|
||||
swp = c[7]; c[7] = c[3]; c[3] = swp;
|
||||
SetVROM_8K_Bank(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
|
||||
}
|
||||
}
|
||||
reg[6] = data;
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg[6] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr0 = (byte)((data & 0xFE) + 0);
|
||||
chr1 = (byte)((data & 0xFE) + 1);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr2 = (byte)((data & 0xFE) + 0);
|
||||
chr3 = (byte)((data & 0xFE) + 1);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
if ((reg[6] & 0x40) != 0)
|
||||
{
|
||||
prg2 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_6(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
prg0 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_4(data);
|
||||
}
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_5(data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xC000:
|
||||
if (patch == 2)
|
||||
{
|
||||
if (data == 0x29 || data == 0x70)
|
||||
data = 0x07;
|
||||
}
|
||||
irq_latch = data;
|
||||
irq_latched = 1;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = data;
|
||||
irq_latched = 0;
|
||||
}
|
||||
// irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
// irq_latch = data;
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xE000:
|
||||
irq_enable = 0;
|
||||
irq_reset = 1;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_enable = 1;
|
||||
if (irq_latched != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper045::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
if ((data & 0x40) != (reg[6] & 0x40))
|
||||
{
|
||||
BYTE swp;
|
||||
swp = prg0; prg0 = prg2; prg2 = swp;
|
||||
swp = p[0]; p[0] = p[2]; p[2] = swp;
|
||||
SetBank_CPU_4(p[0]);
|
||||
SetBank_CPU_5(p[1]);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((data & 0x80) != (reg[6] & 0x80))
|
||||
{
|
||||
INT swp;
|
||||
swp = chr4; chr4 = chr0; chr0 = (byte)swp;
|
||||
swp = chr5; chr5 = chr1; chr1 = (byte)swp;
|
||||
swp = chr6; chr6 = chr2; chr2 = (byte)swp;
|
||||
swp = chr7; chr7 = chr3; chr3 = (byte)swp;
|
||||
swp = c[4]; c[4] = c[0]; c[0] = swp;
|
||||
swp = c[5]; c[5] = c[1]; c[1] = swp;
|
||||
swp = c[6]; c[6] = c[2]; c[2] = swp;
|
||||
swp = c[7]; c[7] = c[3]; c[3] = swp;
|
||||
SetVROM_8K_Bank(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
|
||||
}
|
||||
}
|
||||
reg[6] = data;
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg[6] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr0 = (byte)((data & 0xFE) + 0);
|
||||
chr1 = (byte)((data & 0xFE) + 1);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr2 = (byte)((data & 0xFE) + 0);
|
||||
chr3 = (byte)((data & 0xFE) + 1);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
if ((reg[6] & 0x40) != 0)
|
||||
{
|
||||
prg2 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_6(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
prg0 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_4(data);
|
||||
}
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = (byte)(data & 0x3F);
|
||||
SetBank_CPU_5(data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xC000:
|
||||
if (patch == 2)
|
||||
{
|
||||
if (data == 0x29 || data == 0x70)
|
||||
data = 0x07;
|
||||
}
|
||||
irq_latch = data;
|
||||
irq_latched = 1;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = data;
|
||||
irq_latched = 0;
|
||||
}
|
||||
// irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
// irq_latch = data;
|
||||
irq_counter = irq_latch;
|
||||
break;
|
||||
case 0xE000:
|
||||
irq_enable = 0;
|
||||
irq_reset = 1;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_enable = 1;
|
||||
if (irq_latched != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper045::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
irq_reset = 0;
|
||||
if ((scanline >= 0 && scanline <= 239) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_counter != 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper045::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
irq_reset = 0;
|
||||
if ((scanline >= 0 && scanline <= 239) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_counter != 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_CPU_4(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(4, data);
|
||||
p[0] = (byte)data;
|
||||
}
|
||||
void SetBank_CPU_4(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(4, data);
|
||||
p[0] = (byte)data;
|
||||
}
|
||||
|
||||
void SetBank_CPU_5(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(5, data);
|
||||
p[1] = (byte)data;
|
||||
}
|
||||
void SetBank_CPU_5(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(5, data);
|
||||
p[1] = (byte)data;
|
||||
}
|
||||
|
||||
void SetBank_CPU_6(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(6, data);
|
||||
p[2] = (byte)data;
|
||||
}
|
||||
void SetBank_CPU_6(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(6, data);
|
||||
p[2] = (byte)data;
|
||||
}
|
||||
|
||||
void SetBank_CPU_7(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(7, data);
|
||||
p[3] = (byte)data;
|
||||
}
|
||||
void SetBank_CPU_7(INT data)
|
||||
{
|
||||
data &= (reg[3] & 0x3F) ^ 0xFF;
|
||||
data &= 0x3F;
|
||||
data |= reg[1];
|
||||
SetPROM_8K_Bank(7, data);
|
||||
p[3] = (byte)data;
|
||||
}
|
||||
|
||||
void SetBank_PPU()
|
||||
{
|
||||
BYTE[] table = new byte[] {
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF
|
||||
};
|
||||
void SetBank_PPU()
|
||||
{
|
||||
BYTE[] table = new byte[] {
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF
|
||||
};
|
||||
|
||||
c[0] = chr0;
|
||||
c[1] = chr1;
|
||||
c[2] = chr2;
|
||||
c[3] = chr3;
|
||||
c[4] = chr4;
|
||||
c[5] = chr5;
|
||||
c[6] = chr6;
|
||||
c[7] = chr7;
|
||||
c[0] = chr0;
|
||||
c[1] = chr1;
|
||||
c[2] = chr2;
|
||||
c[3] = chr3;
|
||||
c[4] = chr4;
|
||||
c[5] = chr5;
|
||||
c[6] = chr6;
|
||||
c[7] = chr7;
|
||||
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
c[i] &= table[reg[2] & 0x0F];
|
||||
c[i] |= reg[0] & ((patch != 1) ? 0xFF : 0xC0);
|
||||
c[i] += (reg[2] & ((patch != 1) ? 0x10 : 0x30)) << 4;
|
||||
}
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
c[i] &= table[reg[2] & 0x0F];
|
||||
c[i] |= reg[0] & ((patch != 1) ? 0xFF : 0xC0);
|
||||
c[i] += (reg[2] & ((patch != 1) ? 0x10 : 0x30)) << 4;
|
||||
}
|
||||
|
||||
if ((reg[6] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(c[4], c[5], c[6], c[7], c[0], c[1], c[2], c[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_8K_Bank(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
|
||||
}
|
||||
}
|
||||
if ((reg[6] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(c[4], c[5], c[6], c[7], c[0], c[1], c[2], c[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_8K_Bank(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper045::SaveState(LPBYTE ps)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//INT i;
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// ps[i] = reg[i];
|
||||
//}
|
||||
//for (i = 0; i < 4; i++)
|
||||
//{
|
||||
// ps[i + 8] = p[i];
|
||||
//}
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// *(INT*)&ps[i * 4 + 64] = c[i];
|
||||
//}
|
||||
//ps[20] = prg0;
|
||||
//ps[21] = prg1;
|
||||
//ps[22] = prg2;
|
||||
//ps[23] = prg3;
|
||||
//ps[24] = chr0;
|
||||
//ps[25] = chr1;
|
||||
//ps[26] = chr2;
|
||||
//ps[27] = chr3;
|
||||
//ps[28] = chr4;
|
||||
//ps[29] = chr5;
|
||||
//ps[30] = chr6;
|
||||
//ps[31] = chr7;
|
||||
//ps[32] = irq_enable;
|
||||
//ps[33] = irq_counter;
|
||||
//ps[34] = irq_latch;
|
||||
}
|
||||
//void Mapper045::SaveState(LPBYTE ps)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//INT i;
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// ps[i] = reg[i];
|
||||
//}
|
||||
//for (i = 0; i < 4; i++)
|
||||
//{
|
||||
// ps[i + 8] = p[i];
|
||||
//}
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// *(INT*)&ps[i * 4 + 64] = c[i];
|
||||
//}
|
||||
//ps[20] = prg0;
|
||||
//ps[21] = prg1;
|
||||
//ps[22] = prg2;
|
||||
//ps[23] = prg3;
|
||||
//ps[24] = chr0;
|
||||
//ps[25] = chr1;
|
||||
//ps[26] = chr2;
|
||||
//ps[27] = chr3;
|
||||
//ps[28] = chr4;
|
||||
//ps[29] = chr5;
|
||||
//ps[30] = chr6;
|
||||
//ps[31] = chr7;
|
||||
//ps[32] = irq_enable;
|
||||
//ps[33] = irq_counter;
|
||||
//ps[34] = irq_latch;
|
||||
}
|
||||
|
||||
//void Mapper045::LoadState(LPBYTE ps)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//INT i;
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// reg[i] = ps[i];
|
||||
//}
|
||||
//for (i = 0; i < 4; i++)
|
||||
//{
|
||||
// p[i] = ps[i + 8];
|
||||
//}
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// c[i] = *(INT*)&ps[i * 4 + 64];
|
||||
//}
|
||||
//prg0 = ps[20];
|
||||
//prg1 = ps[21];
|
||||
//prg2 = ps[22];
|
||||
//prg3 = ps[23];
|
||||
//chr0 = ps[24];
|
||||
//chr1 = ps[25];
|
||||
//chr2 = ps[26];
|
||||
//chr3 = ps[27];
|
||||
//chr4 = ps[28];
|
||||
//chr5 = ps[29];
|
||||
//chr6 = ps[30];
|
||||
//chr7 = ps[31];
|
||||
//irq_enable = ps[32];
|
||||
//irq_counter = ps[33];
|
||||
//irq_latch = ps[34];
|
||||
}
|
||||
//void Mapper045::LoadState(LPBYTE ps)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//INT i;
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// reg[i] = ps[i];
|
||||
//}
|
||||
//for (i = 0; i < 4; i++)
|
||||
//{
|
||||
// p[i] = ps[i + 8];
|
||||
//}
|
||||
//for (i = 0; i < 8; i++)
|
||||
//{
|
||||
// c[i] = *(INT*)&ps[i * 4 + 64];
|
||||
//}
|
||||
//prg0 = ps[20];
|
||||
//prg1 = ps[21];
|
||||
//prg2 = ps[22];
|
||||
//prg3 = ps[23];
|
||||
//chr0 = ps[24];
|
||||
//chr1 = ps[25];
|
||||
//chr2 = ps[26];
|
||||
//chr3 = ps[27];
|
||||
//chr4 = ps[28];
|
||||
//chr5 = ps[29];
|
||||
//chr6 = ps[30];
|
||||
//chr7 = ps[31];
|
||||
//irq_enable = ps[32];
|
||||
//irq_counter = ps[33];
|
||||
//irq_latch = ps[34];
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,87 +2,84 @@
|
||||
// Mapper046 Rumble Station //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper046 : Mapper
|
||||
{
|
||||
int[] reg = new int[4];
|
||||
public Mapper046(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper046 : Mapper
|
||||
{
|
||||
int[] reg = new int[4];
|
||||
public Mapper046(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = 0;
|
||||
reg[1] = 0;
|
||||
reg[2] = 0;
|
||||
reg[3] = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = 0;
|
||||
reg[1] = 0;
|
||||
reg[2] = 0;
|
||||
reg[3] = 0;
|
||||
|
||||
SetBank();
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
SetBank();
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
|
||||
//void Mapper046::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
reg[0] = data & 0x0F;
|
||||
reg[1] = (data & 0xF0) >> 4;
|
||||
SetBank();
|
||||
}
|
||||
//void Mapper046::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
reg[0] = data & 0x0F;
|
||||
reg[1] = (data & 0xF0) >> 4;
|
||||
SetBank();
|
||||
}
|
||||
|
||||
//void Mapper046::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
reg[2] = data & 0x01;
|
||||
reg[3] = (data & 0x70) >> 4;
|
||||
SetBank();
|
||||
}
|
||||
//void Mapper046::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
reg[2] = data & 0x01;
|
||||
reg[3] = (data & 0x70) >> 4;
|
||||
SetBank();
|
||||
}
|
||||
|
||||
void SetBank()
|
||||
{
|
||||
SetPROM_8K_Bank(4, reg[0] * 8 + reg[2] * 4 + 0);
|
||||
SetPROM_8K_Bank(5, reg[0] * 8 + reg[2] * 4 + 1);
|
||||
SetPROM_8K_Bank(6, reg[0] * 8 + reg[2] * 4 + 2);
|
||||
SetPROM_8K_Bank(7, reg[0] * 8 + reg[2] * 4 + 3);
|
||||
void SetBank()
|
||||
{
|
||||
SetPROM_8K_Bank(4, reg[0] * 8 + reg[2] * 4 + 0);
|
||||
SetPROM_8K_Bank(5, reg[0] * 8 + reg[2] * 4 + 1);
|
||||
SetPROM_8K_Bank(6, reg[0] * 8 + reg[2] * 4 + 2);
|
||||
SetPROM_8K_Bank(7, reg[0] * 8 + reg[2] * 4 + 3);
|
||||
|
||||
SetVROM_1K_Bank(0, reg[1] * 64 + reg[3] * 8 + 0);
|
||||
SetVROM_1K_Bank(1, reg[1] * 64 + reg[3] * 8 + 1);
|
||||
SetVROM_1K_Bank(2, reg[1] * 64 + reg[3] * 8 + 2);
|
||||
SetVROM_1K_Bank(3, reg[1] * 64 + reg[3] * 8 + 3);
|
||||
SetVROM_1K_Bank(4, reg[1] * 64 + reg[3] * 8 + 4);
|
||||
SetVROM_1K_Bank(5, reg[1] * 64 + reg[3] * 8 + 5);
|
||||
SetVROM_1K_Bank(6, reg[1] * 64 + reg[3] * 8 + 6);
|
||||
SetVROM_1K_Bank(7, reg[1] * 64 + reg[3] * 8 + 7);
|
||||
}
|
||||
SetVROM_1K_Bank(0, reg[1] * 64 + reg[3] * 8 + 0);
|
||||
SetVROM_1K_Bank(1, reg[1] * 64 + reg[3] * 8 + 1);
|
||||
SetVROM_1K_Bank(2, reg[1] * 64 + reg[3] * 8 + 2);
|
||||
SetVROM_1K_Bank(3, reg[1] * 64 + reg[3] * 8 + 3);
|
||||
SetVROM_1K_Bank(4, reg[1] * 64 + reg[3] * 8 + 4);
|
||||
SetVROM_1K_Bank(5, reg[1] * 64 + reg[3] * 8 + 5);
|
||||
SetVROM_1K_Bank(6, reg[1] * 64 + reg[3] * 8 + 6);
|
||||
SetVROM_1K_Bank(7, reg[1] * 64 + reg[3] * 8 + 7);
|
||||
}
|
||||
|
||||
//void Mapper046::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = (byte)reg[0];
|
||||
p[1] = (byte)reg[1];
|
||||
p[2] = (byte)reg[2];
|
||||
p[3] = (byte)reg[3];
|
||||
}
|
||||
//void Mapper046::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = (byte)reg[0];
|
||||
p[1] = (byte)reg[1];
|
||||
p[2] = (byte)reg[2];
|
||||
p[3] = (byte)reg[3];
|
||||
}
|
||||
|
||||
//void Mapper046::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
}
|
||||
//void Mapper046::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,275 +1,274 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper047 NES-QJ //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper047 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE bank;
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper047(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper047 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE patch;
|
||||
BYTE bank;
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
public Mapper047(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
if (nes.rom.GetPROM_CRC() == 0x7eef434c)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
if (nes.rom.GetPROM_CRC() == 0x7eef434c)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0;
|
||||
}
|
||||
|
||||
bank = 0;
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
bank = 0;
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
|
||||
// set VROM banks
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
chr01 = chr23 = chr4 = chr5 = chr6 = chr7 = 0;
|
||||
}
|
||||
// set VROM banks
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
chr01 = chr23 = chr4 = chr5 = chr6 = chr7 = 0;
|
||||
}
|
||||
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
}
|
||||
|
||||
//void Mapper047::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
bank = (byte)((data & 0x06) >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = (byte)((data & 0x01) << 1);
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
//void Mapper047::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
bank = (byte)((data & 0x06) >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = (byte)((data & 0x01) << 1);
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper047::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper047::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper047::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((--irq_counter) == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper047::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((--irq_counter) == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank * 8 + ((patch != 0 && bank != 2) ? 6 : 14));
|
||||
SetPROM_8K_Bank(5, bank * 8 + prg1);
|
||||
SetPROM_8K_Bank(6, bank * 8 + prg0);
|
||||
SetPROM_8K_Bank(7, bank * 8 + ((patch != 0 && bank != 2) ? 7 : 15));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank * 8 + prg0);
|
||||
SetPROM_8K_Bank(5, bank * 8 + prg1);
|
||||
SetPROM_8K_Bank(6, bank * 8 + ((patch != 0 && bank != 2) ? 6 : 14));
|
||||
SetPROM_8K_Bank(7, bank * 8 + ((patch != 0 && bank != 2) ? 7 : 15));
|
||||
}
|
||||
}
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank * 8 + ((patch != 0 && bank != 2) ? 6 : 14));
|
||||
SetPROM_8K_Bank(5, bank * 8 + prg1);
|
||||
SetPROM_8K_Bank(6, bank * 8 + prg0);
|
||||
SetPROM_8K_Bank(7, bank * 8 + ((patch != 0 && bank != 2) ? 7 : 15));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank * 8 + prg0);
|
||||
SetPROM_8K_Bank(5, bank * 8 + prg1);
|
||||
SetPROM_8K_Bank(6, bank * 8 + ((patch != 0 && bank != 2) ? 6 : 14));
|
||||
SetPROM_8K_Bank(7, bank * 8 + ((patch != 0 && bank != 2) ? 7 : 15));
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, (bank & 0x02) * 64 + chr4);
|
||||
SetVROM_1K_Bank(1, (bank & 0x02) * 64 + chr5);
|
||||
SetVROM_1K_Bank(2, (bank & 0x02) * 64 + chr6);
|
||||
SetVROM_1K_Bank(3, (bank & 0x02) * 64 + chr7);
|
||||
SetVROM_1K_Bank(4, (bank & 0x02) * 64 + chr01 + 0);
|
||||
SetVROM_1K_Bank(5, (bank & 0x02) * 64 + chr01 + 1);
|
||||
SetVROM_1K_Bank(6, (bank & 0x02) * 64 + chr23 + 0);
|
||||
SetVROM_1K_Bank(7, (bank & 0x02) * 64 + chr23 + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, (bank & 0x02) * 64 + chr01 + 0);
|
||||
SetVROM_1K_Bank(1, (bank & 0x02) * 64 + chr01 + 1);
|
||||
SetVROM_1K_Bank(2, (bank & 0x02) * 64 + chr23 + 0);
|
||||
SetVROM_1K_Bank(3, (bank & 0x02) * 64 + chr23 + 1);
|
||||
SetVROM_1K_Bank(4, (bank & 0x02) * 64 + chr4);
|
||||
SetVROM_1K_Bank(5, (bank & 0x02) * 64 + chr5);
|
||||
SetVROM_1K_Bank(6, (bank & 0x02) * 64 + chr6);
|
||||
SetVROM_1K_Bank(7, (bank & 0x02) * 64 + chr7);
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, (bank & 0x02) * 64 + chr4);
|
||||
SetVROM_1K_Bank(1, (bank & 0x02) * 64 + chr5);
|
||||
SetVROM_1K_Bank(2, (bank & 0x02) * 64 + chr6);
|
||||
SetVROM_1K_Bank(3, (bank & 0x02) * 64 + chr7);
|
||||
SetVROM_1K_Bank(4, (bank & 0x02) * 64 + chr01 + 0);
|
||||
SetVROM_1K_Bank(5, (bank & 0x02) * 64 + chr01 + 1);
|
||||
SetVROM_1K_Bank(6, (bank & 0x02) * 64 + chr23 + 0);
|
||||
SetVROM_1K_Bank(7, (bank & 0x02) * 64 + chr23 + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, (bank & 0x02) * 64 + chr01 + 0);
|
||||
SetVROM_1K_Bank(1, (bank & 0x02) * 64 + chr01 + 1);
|
||||
SetVROM_1K_Bank(2, (bank & 0x02) * 64 + chr23 + 0);
|
||||
SetVROM_1K_Bank(3, (bank & 0x02) * 64 + chr23 + 1);
|
||||
SetVROM_1K_Bank(4, (bank & 0x02) * 64 + chr4);
|
||||
SetVROM_1K_Bank(5, (bank & 0x02) * 64 + chr5);
|
||||
SetVROM_1K_Bank(6, (bank & 0x02) * 64 + chr6);
|
||||
SetVROM_1K_Bank(7, (bank & 0x02) * 64 + chr7);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper047::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = bank;
|
||||
}
|
||||
//void Mapper047::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = bank;
|
||||
}
|
||||
|
||||
//void Mapper047::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
bank = p[19];
|
||||
}
|
||||
//void Mapper047::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
bank = p[19];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,143 +1,141 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper048 Taito TC190V //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper048 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper048(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper048 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper048(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
reg = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
reg = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// if( crc == 0x547e6cc1 ) { // Flintstones - The Rescue of Dino & Hoppy(J)
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
// }
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
// if( crc == 0x547e6cc1 ) { // Flintstones - The Rescue of Dino & Hoppy(J)
|
||||
// nes.SetRenderMethod( NES::POST_RENDER );
|
||||
// }
|
||||
}
|
||||
|
||||
//void Mapper048::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if (reg == 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8001:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
//void Mapper048::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
if (reg == 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8001:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0x8002:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x8003:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0xA001:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0xA002:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0xA003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
case 0x8002:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x8003:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0xA001:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0xA002:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0xA003:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
irq_counter = data;
|
||||
irq_enable = 0;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
case 0xC000:
|
||||
irq_counter = data;
|
||||
irq_enable = 0;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
|
||||
case 0xC001:
|
||||
irq_counter = data;
|
||||
irq_enable = 1;
|
||||
// irq_enable = data & 0x01;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
case 0xC001:
|
||||
irq_counter = data;
|
||||
irq_enable = 1;
|
||||
// irq_enable = data & 0x01;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
|
||||
case 0xC002:
|
||||
break;
|
||||
case 0xC003:
|
||||
break;
|
||||
case 0xC002:
|
||||
break;
|
||||
case 0xC003:
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
reg = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xE000:
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
reg = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper048::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
// nes.cpu.SetIRQ( IRQ_MAPPER );
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER2);
|
||||
}
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper048::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter == 0xFF)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
// nes.cpu.SetIRQ( IRQ_MAPPER );
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER2);
|
||||
}
|
||||
irq_counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper048::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
p[1] = irq_enable;
|
||||
p[2] = irq_counter;
|
||||
}
|
||||
//void Mapper048::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
p[1] = irq_enable;
|
||||
p[2] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper048::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
irq_enable = p[1];
|
||||
irq_counter = p[2];
|
||||
}
|
||||
//void Mapper048::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
irq_enable = p[1];
|
||||
irq_counter = p[2];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,100 +1,98 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper050 SMB2J //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper050 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
public Mapper050(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper050 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
public Mapper050(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
SetPROM_8K_Bank(3, 15);
|
||||
SetPROM_8K_Bank(4, 8);
|
||||
SetPROM_8K_Bank(5, 9);
|
||||
SetPROM_8K_Bank(6, 0);
|
||||
SetPROM_8K_Bank(7, 11);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
SetPROM_8K_Bank(3, 15);
|
||||
SetPROM_8K_Bank(4, 8);
|
||||
SetPROM_8K_Bank(5, 9);
|
||||
SetPROM_8K_Bank(6, 0);
|
||||
SetPROM_8K_Bank(7, 11);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper050::ExWrite(WORD addr, BYTE data)
|
||||
public override void ExWrite(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE060) == 0x4020)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x01);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x08) | ((data & 0x01) << 2) | ((data & 0x06) >> 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper050::ExWrite(WORD addr, BYTE data)
|
||||
public override void ExWrite(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE060) == 0x4020)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x01);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x08) | ((data & 0x01) << 2) | ((data & 0x06) >> 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper050::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE060) == 0x4020)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x01);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x08) | ((data & 0x01) << 2) | ((data & 0x06) >> 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper050::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE060) == 0x4020)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x01);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, (data & 0x08) | ((data & 0x01) << 2) | ((data & 0x06) >> 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper050::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (scanline == 21)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper050::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (scanline == 21)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper050::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
}
|
||||
//void Mapper050::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
}
|
||||
|
||||
//void Mapper050::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
}
|
||||
//void Mapper050::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,108 +2,104 @@
|
||||
// Mapper051 11-in-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper051 : Mapper
|
||||
{
|
||||
int mode, bank;
|
||||
public Mapper051(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper051 : Mapper
|
||||
{
|
||||
int mode, bank;
|
||||
public Mapper051(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
bank = 0;
|
||||
mode = 1;
|
||||
public override void Reset()
|
||||
{
|
||||
bank = 0;
|
||||
mode = 1;
|
||||
|
||||
SetBank_CPU();
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
SetBank_CPU();
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper051::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
|
||||
SetBank_CPU();
|
||||
}
|
||||
}
|
||||
//void Mapper051::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
|
||||
SetBank_CPU();
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper051::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
bank = (data & 0x0f) << 2;
|
||||
if (0xC000 <= addr && addr <= 0xDFFF)
|
||||
{
|
||||
mode = (mode & 0x01) | ((data & 0x10) >> 3);
|
||||
}
|
||||
SetBank_CPU();
|
||||
}
|
||||
//void Mapper051::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
bank = (data & 0x0f) << 2;
|
||||
if (0xC000 <= addr && addr <= 0xDFFF)
|
||||
{
|
||||
mode = (mode & 0x01) | ((data & 0x10) >> 3);
|
||||
}
|
||||
SetBank_CPU();
|
||||
}
|
||||
|
||||
void SetBank_CPU()
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x2c | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x0c | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x0c | 3));
|
||||
break;
|
||||
case 1:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
||||
break;
|
||||
case 2:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x2e | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x02 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x02 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x0e | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x0e | 3));
|
||||
break;
|
||||
case 3:
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
||||
break;
|
||||
}
|
||||
}
|
||||
void SetBank_CPU()
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x2c | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x0c | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x0c | 3));
|
||||
break;
|
||||
case 1:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
||||
break;
|
||||
case 2:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x2e | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x02 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x02 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x0e | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x0e | 3));
|
||||
break;
|
||||
case 3:
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
||||
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
||||
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
||||
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
||||
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper051::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = (byte)mode;
|
||||
p[1] = (byte)bank;
|
||||
}
|
||||
//void Mapper051::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = (byte)mode;
|
||||
p[1] = (byte)bank;
|
||||
}
|
||||
|
||||
//void Mapper051::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
mode = p[0];
|
||||
bank = p[1];
|
||||
}
|
||||
//void Mapper051::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
mode = p[0];
|
||||
bank = p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,86 +2,83 @@
|
||||
// Mapper057 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper057 : Mapper
|
||||
{
|
||||
public class Mapper057 : Mapper
|
||||
{
|
||||
|
||||
BYTE reg;
|
||||
public Mapper057(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE reg;
|
||||
public Mapper057(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 0, 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
reg = 0;
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 0, 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
reg = 0;
|
||||
}
|
||||
|
||||
//void Mapper057::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0x8001:
|
||||
case 0x8002:
|
||||
case 0x8003:
|
||||
if ((data & 0x40) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank((data & 0x03) + ((reg & 0x10) >> 1) + (reg & 0x07));
|
||||
}
|
||||
break;
|
||||
case 0x8800:
|
||||
reg = data;
|
||||
//void Mapper057::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0x8001:
|
||||
case 0x8002:
|
||||
case 0x8003:
|
||||
if ((data & 0x40) != 0)
|
||||
{
|
||||
SetVROM_8K_Bank((data & 0x03) + ((reg & 0x10) >> 1) + (reg & 0x07));
|
||||
}
|
||||
break;
|
||||
case 0x8800:
|
||||
reg = data;
|
||||
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((data & 0x40) >> 6) * 4 + 8 + 0);
|
||||
SetPROM_8K_Bank(5, ((data & 0x40) >> 6) * 4 + 8 + 1);
|
||||
SetPROM_8K_Bank(6, ((data & 0x40) >> 6) * 4 + 8 + 2);
|
||||
SetPROM_8K_Bank(7, ((data & 0x40) >> 6) * 4 + 8 + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((data & 0x60) >> 5) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, ((data & 0x60) >> 5) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, ((data & 0x60) >> 5) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, ((data & 0x60) >> 5) * 2 + 1);
|
||||
}
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((data & 0x40) >> 6) * 4 + 8 + 0);
|
||||
SetPROM_8K_Bank(5, ((data & 0x40) >> 6) * 4 + 8 + 1);
|
||||
SetPROM_8K_Bank(6, ((data & 0x40) >> 6) * 4 + 8 + 2);
|
||||
SetPROM_8K_Bank(7, ((data & 0x40) >> 6) * 4 + 8 + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, ((data & 0x60) >> 5) * 2 + 0);
|
||||
SetPROM_8K_Bank(5, ((data & 0x60) >> 5) * 2 + 1);
|
||||
SetPROM_8K_Bank(6, ((data & 0x60) >> 5) * 2 + 0);
|
||||
SetPROM_8K_Bank(7, ((data & 0x60) >> 5) * 2 + 1);
|
||||
}
|
||||
|
||||
SetVROM_8K_Bank((data & 0x07) + ((data & 0x10) >> 1));
|
||||
SetVROM_8K_Bank((data & 0x07) + ((data & 0x10) >> 1));
|
||||
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper057::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
//void Mapper057::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
|
||||
//void Mapper057::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
//void Mapper057::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,52 +2,48 @@
|
||||
// Mapper058 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper058 : Mapper
|
||||
{
|
||||
public Mapper058(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper058 : Mapper
|
||||
{
|
||||
public Mapper058(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 0, 1);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 0, 1);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper058::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0x40) != 0)
|
||||
{
|
||||
SetPROM_16K_Bank(4, addr & 0x07);
|
||||
SetPROM_16K_Bank(6, addr & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank((addr & 0x06) >> 1);
|
||||
}
|
||||
//void Mapper058::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0x40) != 0)
|
||||
{
|
||||
SetPROM_16K_Bank(4, addr & 0x07);
|
||||
SetPROM_16K_Bank(6, addr & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank((addr & 0x06) >> 1);
|
||||
}
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank((addr & 0x38) >> 3);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank((addr & 0x38) >> 3);
|
||||
}
|
||||
|
||||
if ((data & 0x02) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
if ((data & 0x02) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,65 +2,62 @@
|
||||
// Mapper060 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper060 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
BYTE game_sel;
|
||||
public Mapper060(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper060 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
BYTE game_sel;
|
||||
public Mapper060(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xf9c484a0)
|
||||
{ // Reset Based 4-in-1(Unl)
|
||||
SetPROM_16K_Bank(4, game_sel);
|
||||
SetPROM_16K_Bank(6, game_sel);
|
||||
SetVROM_8K_Bank(game_sel);
|
||||
game_sel++;
|
||||
game_sel &= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
patch = 1;
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xf9c484a0)
|
||||
{ // Reset Based 4-in-1(Unl)
|
||||
SetPROM_16K_Bank(4, game_sel);
|
||||
SetPROM_16K_Bank(6, game_sel);
|
||||
SetVROM_8K_Bank(game_sel);
|
||||
game_sel++;
|
||||
game_sel &= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
patch = 1;
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper060::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((addr & 0x80) != 0)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (addr & 0x70) >> 4);
|
||||
SetPROM_16K_Bank(6, (addr & 0x70) >> 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank((addr & 0x70) >> 5);
|
||||
}
|
||||
//void Mapper060::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((addr & 0x80) != 0)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (addr & 0x70) >> 4);
|
||||
SetPROM_16K_Bank(6, (addr & 0x70) >> 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank((addr & 0x70) >> 5);
|
||||
}
|
||||
|
||||
SetVROM_8K_Bank(addr & 0x07);
|
||||
SetVROM_8K_Bank(addr & 0x07);
|
||||
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
}
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,46 +2,42 @@
|
||||
// Mapper061 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper061 : Mapper
|
||||
{
|
||||
public Mapper061(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper061 : Mapper
|
||||
{
|
||||
public Mapper061(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
//void Mapper061::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0x30)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x30:
|
||||
SetPROM_32K_Bank(addr & 0x0F);
|
||||
break;
|
||||
case 0x10:
|
||||
case 0x20:
|
||||
SetPROM_16K_Bank(4, ((addr & 0x0F) << 1) | ((addr & 0x20) >> 4));
|
||||
SetPROM_16K_Bank(6, ((addr & 0x0F) << 1) | ((addr & 0x20) >> 4));
|
||||
break;
|
||||
}
|
||||
//void Mapper061::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0x30)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x30:
|
||||
SetPROM_32K_Bank(addr & 0x0F);
|
||||
break;
|
||||
case 0x10:
|
||||
case 0x20:
|
||||
SetPROM_16K_Bank(4, ((addr & 0x0F) << 1) | ((addr & 0x20) >> 4));
|
||||
SetPROM_16K_Bank(6, ((addr & 0x0F) << 1) | ((addr & 0x20) >> 4));
|
||||
break;
|
||||
}
|
||||
|
||||
if ((addr & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
if ((addr & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,52 +2,48 @@
|
||||
// Mapper062 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper062 : Mapper
|
||||
{
|
||||
public Mapper062(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper062 : Mapper
|
||||
{
|
||||
public Mapper062(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper062::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xFF00)
|
||||
{
|
||||
case 0x8100:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
SetPROM_8K_Bank(5, data + 1);
|
||||
break;
|
||||
case 0x8500:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8700:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
SetVROM_1K_Bank(0, data + 0);
|
||||
SetVROM_1K_Bank(1, data + 1);
|
||||
SetVROM_1K_Bank(2, data + 2);
|
||||
SetVROM_1K_Bank(3, data + 3);
|
||||
SetVROM_1K_Bank(4, data + 4);
|
||||
SetVROM_1K_Bank(5, data + 5);
|
||||
SetVROM_1K_Bank(6, data + 6);
|
||||
SetVROM_1K_Bank(7, data + 7);
|
||||
}
|
||||
}
|
||||
//void Mapper062::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xFF00)
|
||||
{
|
||||
case 0x8100:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
SetPROM_8K_Bank(5, data + 1);
|
||||
break;
|
||||
case 0x8500:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8700:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
SetVROM_1K_Bank(0, data + 0);
|
||||
SetVROM_1K_Bank(1, data + 1);
|
||||
SetVROM_1K_Bank(2, data + 2);
|
||||
SetVROM_1K_Bank(3, data + 3);
|
||||
SetVROM_1K_Bank(4, data + 4);
|
||||
SetVROM_1K_Bank(5, data + 5);
|
||||
SetVROM_1K_Bank(6, data + 6);
|
||||
SetVROM_1K_Bank(7, data + 7);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,283 +1,282 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper064 Tengen Rambo-1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper064 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[3];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_mode;
|
||||
INT irq_counter;
|
||||
INT irq_counter2;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_reset;
|
||||
public Mapper064(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper064 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[3];
|
||||
BYTE irq_enable;
|
||||
BYTE irq_mode;
|
||||
INT irq_counter;
|
||||
INT irq_counter2;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_reset;
|
||||
public Mapper064(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 1, PROM_8K_SIZE - 1, PROM_8K_SIZE - 1, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 1, PROM_8K_SIZE - 1, PROM_8K_SIZE - 1, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
reg[0] = reg[1] = reg[2] = 0;
|
||||
reg[0] = reg[1] = reg[2] = 0;
|
||||
|
||||
irq_enable = 0;
|
||||
irq_mode = 0;
|
||||
irq_counter = 0;
|
||||
irq_counter2 = 0;
|
||||
irq_latch = 0;
|
||||
irq_reset = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_mode = 0;
|
||||
irq_counter = 0;
|
||||
irq_counter2 = 0;
|
||||
irq_latch = 0;
|
||||
irq_reset = 0;
|
||||
}
|
||||
|
||||
//void Mapper064::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "$%04X:$%02X\n", addr, data );
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = (byte)(data & 0x0F);
|
||||
reg[1] = (byte)(data & 0x40);
|
||||
reg[2] = (byte)(data & 0x80);
|
||||
break;
|
||||
//void Mapper064::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "$%04X:$%02X\n", addr, data );
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = (byte)(data & 0x0F);
|
||||
reg[1] = (byte)(data & 0x40);
|
||||
reg[2] = (byte)(data & 0x80);
|
||||
break;
|
||||
|
||||
case 0x8001:
|
||||
switch (reg[0])
|
||||
{
|
||||
case 0x00:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(4, data + 0);
|
||||
SetVROM_1K_Bank(5, data + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, data + 0);
|
||||
SetVROM_1K_Bank(1, data + 1);
|
||||
}
|
||||
break;
|
||||
case 0x01:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(6, data + 0);
|
||||
SetVROM_1K_Bank(7, data + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(2, data + 0);
|
||||
SetVROM_1K_Bank(3, data + 1);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x03:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(1, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
case 0x04:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(2, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
case 0x05:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(3, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(7, data);
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x07:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
case 0x08:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
case 0x09:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
case 0x0F:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg[0])
|
||||
{
|
||||
case 0x00:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(4, data + 0);
|
||||
SetVROM_1K_Bank(5, data + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, data + 0);
|
||||
SetVROM_1K_Bank(1, data + 1);
|
||||
}
|
||||
break;
|
||||
case 0x01:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(6, data + 0);
|
||||
SetVROM_1K_Bank(7, data + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(2, data + 0);
|
||||
SetVROM_1K_Bank(3, data + 1);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x03:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(1, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
case 0x04:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(2, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
case 0x05:
|
||||
if (reg[2] != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(3, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(7, data);
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0x07:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
case 0x08:
|
||||
SetVROM_1K_Bank(1, data);
|
||||
break;
|
||||
case 0x09:
|
||||
SetVROM_1K_Bank(3, data);
|
||||
break;
|
||||
case 0x0F:
|
||||
if (reg[1] != 0)
|
||||
{
|
||||
SetPROM_8K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_8K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 0xA000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
irq_latch = data;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
case 0xC001:
|
||||
irq_reset = 0xFF;
|
||||
irq_counter = irq_latch;
|
||||
irq_mode = (byte)(data & 0x01);
|
||||
break;
|
||||
case 0xE000:
|
||||
irq_enable = 0;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_enable = 0xFF;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xC000:
|
||||
irq_latch = data;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
case 0xC001:
|
||||
irq_reset = 0xFF;
|
||||
irq_counter = irq_latch;
|
||||
irq_mode = (byte)(data & 0x01);
|
||||
break;
|
||||
case 0xE000:
|
||||
irq_enable = 0;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
irq_enable = 0xFF;
|
||||
if (irq_reset != 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper064::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_mode == 0)
|
||||
return;
|
||||
//void Mapper064::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_mode == 0)
|
||||
return;
|
||||
|
||||
irq_counter2 += cycles;
|
||||
while (irq_counter2 >= 4)
|
||||
{
|
||||
irq_counter2 -= 4;
|
||||
if (irq_counter >= 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter < 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
irq_counter2 += cycles;
|
||||
while (irq_counter2 >= 4)
|
||||
{
|
||||
irq_counter2 -= 4;
|
||||
if (irq_counter >= 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter < 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper064::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_mode != 0)
|
||||
return;
|
||||
//void Mapper064::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_mode != 0)
|
||||
return;
|
||||
|
||||
irq_reset = 0;
|
||||
irq_reset = 0;
|
||||
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_counter >= 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter < 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_reset = 1;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_counter >= 0)
|
||||
{
|
||||
irq_counter--;
|
||||
if (irq_counter < 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_reset = 1;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper064::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg[0];
|
||||
//p[1] = reg[1];
|
||||
//p[2] = reg[2];
|
||||
//p[3] = irq_enable;
|
||||
//p[4] = irq_mode;
|
||||
//p[5] = irq_latch;
|
||||
//p[6] = irq_reset;
|
||||
//*((INT*)&p[8]) = irq_counter;
|
||||
//*((INT*)&p[12]) = irq_counter2;
|
||||
}
|
||||
//void Mapper064::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg[0];
|
||||
//p[1] = reg[1];
|
||||
//p[2] = reg[2];
|
||||
//p[3] = irq_enable;
|
||||
//p[4] = irq_mode;
|
||||
//p[5] = irq_latch;
|
||||
//p[6] = irq_reset;
|
||||
//*((INT*)&p[8]) = irq_counter;
|
||||
//*((INT*)&p[12]) = irq_counter2;
|
||||
}
|
||||
|
||||
//void Mapper064::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg[0] = p[0];
|
||||
//reg[1] = p[1];
|
||||
//reg[2] = p[2];
|
||||
//irq_enable = p[3];
|
||||
//irq_mode = p[4];
|
||||
//irq_latch = p[5];
|
||||
//irq_reset = p[6];
|
||||
//irq_counter = *((INT*)&p[8]);
|
||||
//irq_counter2 = *((INT*)&p[12]);
|
||||
}
|
||||
//void Mapper064::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg[0] = p[0];
|
||||
//reg[1] = p[1];
|
||||
//reg[2] = p[2];
|
||||
//irq_enable = p[3];
|
||||
//irq_mode = p[4];
|
||||
//irq_latch = p[5];
|
||||
//irq_reset = p[6];
|
||||
//irq_counter = *((INT*)&p[8]);
|
||||
//irq_counter2 = *((INT*)&p[12]);
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,189 +1,188 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper065 Irem H3001 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper065 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
public class Mapper065 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
INT irq_latch;
|
||||
public Mapper065(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
INT irq_latch;
|
||||
public Mapper065(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
// Kaiketsu Yanchamaru 3(J)
|
||||
if (nes.rom.GetPROM_CRC() == 0xe30b7f64)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
// Kaiketsu Yanchamaru 3(J)
|
||||
if (nes.rom.GetPROM_CRC() == 0xe30b7f64)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
}
|
||||
|
||||
//void Mapper065::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper065::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
if (patch == 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0x9000:
|
||||
if (patch == 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9001:
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0x9001:
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9003:
|
||||
if (patch == 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x8);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
break;
|
||||
case 0x9004:
|
||||
if (patch == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
case 0x9005:
|
||||
if (patch != 0)
|
||||
{
|
||||
irq_counter = (BYTE)(data << 1);
|
||||
irq_enable = data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_latch = (irq_latch & 0x00FF) | ((INT)data << 8);
|
||||
}
|
||||
break;
|
||||
case 0x9003:
|
||||
if (patch == 0)
|
||||
{
|
||||
irq_enable = (byte)(data & 0x8);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
break;
|
||||
case 0x9004:
|
||||
if (patch == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
}
|
||||
break;
|
||||
case 0x9005:
|
||||
if (patch != 0)
|
||||
{
|
||||
irq_counter = (BYTE)(data << 1);
|
||||
irq_enable = data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_latch = (irq_latch & 0x00FF) | ((INT)data << 8);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x9006:
|
||||
if (patch != 0)
|
||||
{
|
||||
irq_enable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_latch = (irq_latch & 0xFF00) | data;
|
||||
}
|
||||
break;
|
||||
case 0x9006:
|
||||
if (patch != 0)
|
||||
{
|
||||
irq_enable = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_latch = (irq_latch & 0xFF00) | data;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
case 0xB003:
|
||||
case 0xB004:
|
||||
case 0xB005:
|
||||
case 0xB006:
|
||||
case 0xB007:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x0007), data);
|
||||
break;
|
||||
case 0xB000:
|
||||
case 0xB001:
|
||||
case 0xB002:
|
||||
case 0xB003:
|
||||
case 0xB004:
|
||||
case 0xB005:
|
||||
case 0xB006:
|
||||
case 0xB007:
|
||||
SetVROM_1K_Bank((byte)(addr & 0x0007), data);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper065::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper065::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (patch != 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper065::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (patch == 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper065::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (patch == 0)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper065::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
//*(INT*)&p[5] = irq_latch;
|
||||
}
|
||||
//void Mapper065::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
//*(INT*)&p[5] = irq_latch;
|
||||
}
|
||||
|
||||
//void Mapper065::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
//irq_latch = *(INT*)&p[5];
|
||||
}
|
||||
//void Mapper065::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
//irq_latch = *(INT*)&p[5];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,47 +2,43 @@
|
||||
// Mapper066 Bandai 74161 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper066 : Mapper
|
||||
{
|
||||
public Mapper066(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper066 : Mapper
|
||||
{
|
||||
public Mapper066(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
|
||||
// if( nes->rom->GetPROM_CRC() == 0xe30552db ) { // Paris-Dakar Rally Special
|
||||
// nes->SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
}
|
||||
// if( nes->rom->GetPROM_CRC() == 0xe30552db ) { // Paris-Dakar Rally Special
|
||||
// nes->SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
}
|
||||
|
||||
//void Mapper066::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0xF0) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
}
|
||||
}
|
||||
//void Mapper066::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0xF0) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper066::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0xF0) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
}
|
||||
//void Mapper066::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank((data & 0xF0) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,140 +1,139 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper067 SunSoft Mapper 3 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper067 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_occur;
|
||||
BYTE irq_toggle;
|
||||
INT irq_counter;
|
||||
public Mapper067(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper067 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_occur;
|
||||
BYTE irq_toggle;
|
||||
INT irq_counter;
|
||||
public Mapper067(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_toggle = 0;
|
||||
irq_counter = 0;
|
||||
irq_occur = 0;
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_toggle = 0;
|
||||
irq_counter = 0;
|
||||
irq_occur = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
SetVROM_4K_Bank(0, 0);
|
||||
SetVROM_4K_Bank(4, VROM_4K_SIZE - 1);
|
||||
SetVROM_4K_Bank(0, 0);
|
||||
SetVROM_4K_Bank(4, VROM_4K_SIZE - 1);
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0x7f2a04bf)
|
||||
{ // For Fantasy Zone 2(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
if (crc == 0x7f2a04bf)
|
||||
{ // For Fantasy Zone 2(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper067::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF800)
|
||||
{
|
||||
case 0x8800:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x9800:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA800:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 0xB800:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
//void Mapper067::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF800)
|
||||
{
|
||||
case 0x8800:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x9800:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA800:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 0xB800:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xC800:
|
||||
if (irq_toggle == 0)
|
||||
{
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter = (irq_counter & 0xFF00) | ((INT)data & 0xFF);
|
||||
}
|
||||
irq_toggle ^= 1;
|
||||
irq_occur = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xD800:
|
||||
irq_enable = (byte)(data & 0x10);
|
||||
irq_toggle = 0;
|
||||
irq_occur = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xC800:
|
||||
if (irq_toggle == 0)
|
||||
{
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter = (irq_counter & 0xFF00) | ((INT)data & 0xFF);
|
||||
}
|
||||
irq_toggle ^= 1;
|
||||
irq_occur = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xD800:
|
||||
irq_enable = (byte)(data & 0x10);
|
||||
irq_toggle = 0;
|
||||
irq_occur = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xE800:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0xE800:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0xF800:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF800:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper067::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((irq_counter -= cycles) <= 0)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_occur = 0xFF;
|
||||
irq_counter = 0xFFFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
//void Mapper067::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((irq_counter -= cycles) <= 0)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_occur = 0xFF;
|
||||
irq_counter = 0xFFFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
|
||||
// if( irq_occur ) {
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
// }
|
||||
}
|
||||
// if( irq_occur ) {
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
// }
|
||||
}
|
||||
|
||||
//void Mapper067::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_occur;
|
||||
//p[2] = irq_toggle;
|
||||
//*((INT*)&p[3]) = irq_counter;
|
||||
}
|
||||
//void Mapper067::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_occur;
|
||||
//p[2] = irq_toggle;
|
||||
//*((INT*)&p[3]) = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper067::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_occur = p[1];
|
||||
//irq_toggle = p[2];
|
||||
//irq_counter = *((INT*)&p[3]);
|
||||
}
|
||||
//void Mapper067::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_occur = p[1];
|
||||
//irq_toggle = p[2];
|
||||
//irq_counter = *((INT*)&p[3]);
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,29 +2,27 @@
|
||||
// Mapper068 SunSoft Mapper 4 (After Burner II) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper068 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE coin;
|
||||
public Mapper068(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper068 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE coin;
|
||||
public Mapper068(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = reg[1] = reg[2] = reg[3] = 0;
|
||||
coin = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = reg[1] = reg[2] = reg[3] = 0;
|
||||
coin = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
|
||||
#if FALSE //0
|
||||
@ -47,118 +45,118 @@ DEBUGOUT( "WR $4020:%02X\n", data );
|
||||
}
|
||||
#endif
|
||||
|
||||
//void Mapper068::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
//void Mapper068::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 0xB000:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
reg[2] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[3] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[0] = (byte)((data & 0x10) >> 4);
|
||||
reg[1] = (byte)(data & 0x03);
|
||||
SetBank();
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[2] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xD000:
|
||||
reg[3] = data;
|
||||
SetBank();
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[0] = (byte)((data & 0x10) >> 4);
|
||||
reg[1] = (byte)(data & 0x03);
|
||||
SetBank();
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank()
|
||||
{
|
||||
if (reg[0] != 0)
|
||||
{
|
||||
switch (reg[1])
|
||||
{
|
||||
case 0:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
case 1:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
case 2:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[2] + 0x80);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_1K_Bank(8, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (reg[1])
|
||||
{
|
||||
case 0:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 1:
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
case 2:
|
||||
SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 3:
|
||||
SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetBank()
|
||||
{
|
||||
if (reg[0] != 0)
|
||||
{
|
||||
switch (reg[1])
|
||||
{
|
||||
case 0:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
case 1:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
case 2:
|
||||
SetVROM_1K_Bank(8, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[2] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[2] + 0x80);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_1K_Bank(8, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(9, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(10, (INT)reg[3] + 0x80);
|
||||
SetVROM_1K_Bank(11, (INT)reg[3] + 0x80);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (reg[1])
|
||||
{
|
||||
case 0:
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
break;
|
||||
case 1:
|
||||
SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
case 2:
|
||||
SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
case 3:
|
||||
SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper068::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
}
|
||||
//void Mapper068::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
}
|
||||
|
||||
//void Mapper068::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
}
|
||||
//void Mapper068::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,177 +1,176 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper069 SunSoft FME-7 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper069 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
public class Mapper069 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
|
||||
BYTE reg;
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper069(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE reg;
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper069(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
reg = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
{
|
||||
reg = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
nes.apu.SelectExSound(32);
|
||||
nes.SetIrqType(NES.IRQMETHOD.IRQ_CLOCK);
|
||||
patch = 0;
|
||||
nes.apu.SelectExSound(32);
|
||||
nes.SetIrqType(NES.IRQMETHOD.IRQ_CLOCK);
|
||||
patch = 0;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0xfeac6916)
|
||||
{ // Honoo no Toukyuuji - Dodge Danpei 2(J)
|
||||
// nes.SetIrqType( NES::IRQ_HSYNC );
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0xfeac6916)
|
||||
{ // Honoo no Toukyuuji - Dodge Danpei 2(J)
|
||||
// nes.SetIrqType( NES::IRQ_HSYNC );
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
|
||||
if (crc == 0xad28aef6)
|
||||
{ // Dynamite Batman(J) / Dynamite Batman - Return of the Joker(U)
|
||||
patch = 1;
|
||||
}
|
||||
}
|
||||
if (crc == 0xad28aef6)
|
||||
{ // Dynamite Batman(J) / Dynamite Batman - Return of the Joker(U)
|
||||
patch = 1;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper069::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE000)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
break;
|
||||
//void Mapper069::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xE000)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
switch (reg & 0x0F)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
case 0x05:
|
||||
case 0x06:
|
||||
case 0x07:
|
||||
SetVROM_1K_Bank((byte)(reg & 0x07), data);
|
||||
break;
|
||||
case 0x08:
|
||||
if (patch == 0 && (data & 0x40) == 0)
|
||||
{
|
||||
SetPROM_8K_Bank(3, data);
|
||||
}
|
||||
break;
|
||||
case 0x09:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x0A:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x0B:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
switch (reg & 0x0F)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
case 0x05:
|
||||
case 0x06:
|
||||
case 0x07:
|
||||
SetVROM_1K_Bank((byte)(reg & 0x07), data);
|
||||
break;
|
||||
case 0x08:
|
||||
if (patch == 0 && (data & 0x40) == 0)
|
||||
{
|
||||
SetPROM_8K_Bank(3, data);
|
||||
}
|
||||
break;
|
||||
case 0x09:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x0A:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x0B:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0x0C:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0x0C:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
irq_enable = data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x0D:
|
||||
irq_enable = data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0x0E:
|
||||
irq_counter = (irq_counter & 0xFF00) | data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x0E:
|
||||
irq_counter = (irq_counter & 0xFF00) | data;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0x0F:
|
||||
irq_counter = (irq_counter & 0x00FF) | (data << 8);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x0F:
|
||||
irq_counter = (irq_counter & 0x00FF) | (data << 8);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
case 0xE000:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xC000:
|
||||
case 0xE000:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper069::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
//if (irq_enable && (nes.GetIrqType() == NES::IRQ_CLOCK))
|
||||
if (irq_enable != 0 && (nes.GetIrqType() == (int)NES.IRQMETHOD.IRQ_HSYNC))
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
irq_enable = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper069::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
//if (irq_enable && (nes.GetIrqType() == NES::IRQ_CLOCK))
|
||||
if (irq_enable != 0 && (nes.GetIrqType() == (int)NES.IRQMETHOD.IRQ_HSYNC))
|
||||
{
|
||||
irq_counter -= cycles;
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
irq_enable = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper069::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0 && (nes.GetIrqType() == (int)NES.IRQMETHOD.IRQ_HSYNC))
|
||||
{
|
||||
irq_counter -= 114;
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
irq_enable = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper069::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0 && (nes.GetIrqType() == (int)NES.IRQMETHOD.IRQ_HSYNC))
|
||||
{
|
||||
irq_counter -= 114;
|
||||
if (irq_counter <= 0)
|
||||
{
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
irq_enable = 0;
|
||||
irq_counter = 0xFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper069::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg;
|
||||
//p[1] = irq_enable;
|
||||
//*(INT*)&p[2] = irq_counter;
|
||||
}
|
||||
//void Mapper069::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg;
|
||||
//p[1] = irq_enable;
|
||||
//*(INT*)&p[2] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper069::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg = p[0];
|
||||
//irq_enable = p[1];
|
||||
//irq_counter = *(INT*)&p[2];
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//void Mapper069::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg = p[0];
|
||||
//irq_enable = p[1];
|
||||
//irq_counter = *(INT*)&p[2];
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,63 +2,60 @@
|
||||
// Mapper070 Bandai 74161 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper070 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
public Mapper070(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper070 : Mapper
|
||||
{
|
||||
BYTE patch;
|
||||
public Mapper070(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
patch = 0;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0xa59ca2ef)
|
||||
{ // Kamen Rider Club(J)
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x10bb8f9a)
|
||||
{ // Family Trainer - Manhattan Police(J)
|
||||
patch = 1;
|
||||
}
|
||||
if (crc == 0x0cd00488)
|
||||
{ // Space Shadow(J)
|
||||
patch = 1;
|
||||
}
|
||||
if (crc == 0xa59ca2ef)
|
||||
{ // Kamen Rider Club(J)
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
if (crc == 0x10bb8f9a)
|
||||
{ // Family Trainer - Manhattan Police(J)
|
||||
patch = 1;
|
||||
}
|
||||
if (crc == 0x0cd00488)
|
||||
{ // Space Shadow(J)
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper070::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x70) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
//void Mapper070::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x70) >> 4);
|
||||
SetVROM_8K_Bank(data & 0x0F);
|
||||
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((data & 0x80) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,53 +2,49 @@
|
||||
// Mapper071 Camerica //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper071 : Mapper
|
||||
{
|
||||
public Mapper071(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper071 : Mapper
|
||||
{
|
||||
public Mapper071(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
//void Mapper071::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE000) == 0x6000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
}
|
||||
//void Mapper071::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xE000) == 0x6000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper071::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x9000:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
//void Mapper071::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x9000:
|
||||
if ((data & 0x10) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
case 0xD000:
|
||||
case 0xE000:
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xC000:
|
||||
case 0xD000:
|
||||
case 0xE000:
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,8 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper072 Jaleco/Type1 lower bank switch //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using VirtualNes.Core.Debug;
|
||||
using static VirtualNes.MMU;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,94 +1,93 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper073 Konami VRC3 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper073 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper073(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper073 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public Mapper073(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
public override void Reset()
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
//void Mapper073::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper073::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0xF000:
|
||||
SetPROM_16K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x8000:
|
||||
irq_counter = (irq_counter & 0xFFF0) | (data & 0x0F);
|
||||
break;
|
||||
case 0x9000:
|
||||
irq_counter = (irq_counter & 0xFF0F) | ((data & 0x0F) << 4);
|
||||
break;
|
||||
case 0xA000:
|
||||
irq_counter = (irq_counter & 0xF0FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
case 0xB000:
|
||||
irq_counter = (irq_counter & 0x0FFF) | ((data & 0x0F) << 12);
|
||||
break;
|
||||
case 0xC000:
|
||||
irq_enable = (byte)(data & 0x02);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xD000:
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0x8000:
|
||||
irq_counter = (irq_counter & 0xFFF0) | (data & 0x0F);
|
||||
break;
|
||||
case 0x9000:
|
||||
irq_counter = (irq_counter & 0xFF0F) | ((data & 0x0F) << 4);
|
||||
break;
|
||||
case 0xA000:
|
||||
irq_counter = (irq_counter & 0xF0FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
case 0xB000:
|
||||
irq_counter = (irq_counter & 0x0FFF) | ((data & 0x0F) << 12);
|
||||
break;
|
||||
case 0xC000:
|
||||
irq_enable = (byte)(data & 0x02);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xD000:
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper073::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((irq_counter += cycles) >= 0xFFFF)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter &= 0xFFFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper073::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if ((irq_counter += cycles) >= 0xFFFF)
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter &= 0xFFFF;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper073::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
//void Mapper073::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//*(INT*)&p[1] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper073::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
//void Mapper073::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = *(INT*)&p[1];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,312 +1,311 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper074 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper074 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE we_sram;
|
||||
public class Mapper074 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[8];
|
||||
BYTE prg0, prg1;
|
||||
BYTE chr01, chr23, chr4, chr5, chr6, chr7;
|
||||
BYTE we_sram;
|
||||
|
||||
BYTE irq_type;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_request;
|
||||
BYTE irq_type;
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
BYTE irq_request;
|
||||
|
||||
BYTE patch;
|
||||
public Mapper074(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE patch;
|
||||
public Mapper074(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
SetBank_CPU();
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
prg0 = 0;
|
||||
prg1 = 1;
|
||||
SetBank_CPU();
|
||||
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
SetBank_PPU();
|
||||
chr01 = 0;
|
||||
chr23 = 2;
|
||||
chr4 = 4;
|
||||
chr5 = 5;
|
||||
chr6 = 6;
|
||||
chr7 = 7;
|
||||
SetBank_PPU();
|
||||
|
||||
we_sram = 0; // Disable
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_request = 0;
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
we_sram = 0; // Disable
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_request = 0;
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
patch = 0;
|
||||
if (crc == 0x37ae04a8)
|
||||
{
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
}
|
||||
patch = 0;
|
||||
if (crc == 0x37ae04a8)
|
||||
{
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper074::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
//void Mapper074::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
switch (addr & 0xE001)
|
||||
{
|
||||
case 0x8000:
|
||||
reg[0] = data;
|
||||
SetBank_CPU();
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x8001:
|
||||
reg[1] = data;
|
||||
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
irq_request = 0;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
irq_request = 0;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
irq_request = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
irq_request = 0;
|
||||
break;
|
||||
}
|
||||
switch (reg[0] & 0x07)
|
||||
{
|
||||
case 0x00:
|
||||
chr01 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x01:
|
||||
chr23 = (byte)(data & 0xFE);
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x02:
|
||||
chr4 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x03:
|
||||
chr5 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x04:
|
||||
chr6 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x05:
|
||||
chr7 = data;
|
||||
SetBank_PPU();
|
||||
break;
|
||||
case 0x06:
|
||||
prg0 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
case 0x07:
|
||||
prg1 = data;
|
||||
SetBank_CPU();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
reg[2] = data;
|
||||
if (!nes.rom.Is4SCREEN())
|
||||
{
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
break;
|
||||
case 0xA001:
|
||||
reg[3] = data;
|
||||
break;
|
||||
case 0xC000:
|
||||
reg[4] = data;
|
||||
irq_counter = data;
|
||||
irq_request = 0;
|
||||
break;
|
||||
case 0xC001:
|
||||
reg[5] = data;
|
||||
irq_latch = data;
|
||||
irq_request = 0;
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[6] = data;
|
||||
irq_enable = 0;
|
||||
irq_request = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xE001:
|
||||
reg[7] = data;
|
||||
irq_enable = 1;
|
||||
irq_request = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper074::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0 && irq_request == 0)
|
||||
{
|
||||
if (scanline == 0)
|
||||
{
|
||||
if (irq_counter != 0)
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
}
|
||||
if ((irq_counter--) == 0)
|
||||
{
|
||||
irq_request = 0xFF;
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper074::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline <= 239))
|
||||
{
|
||||
if (nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0 && irq_request == 0)
|
||||
{
|
||||
if (scanline == 0)
|
||||
{
|
||||
if (irq_counter != 0)
|
||||
{
|
||||
irq_counter--;
|
||||
}
|
||||
}
|
||||
if ((irq_counter--) == 0)
|
||||
{
|
||||
irq_request = 0xFF;
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, prg1, prg0, PROM_8K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(prg0, prg1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
}
|
||||
void SetBank_CPU()
|
||||
{
|
||||
if ((reg[0] & 0x40) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, prg1, prg0, PROM_8K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(prg0, prg1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
// SetVROM_8K_Bank( chr4, chr5, chr6, chr7,
|
||||
// chr01, chr01+1, chr23, chr23+1 );
|
||||
SetBank_PPUSUB(4, chr01 + 0);
|
||||
SetBank_PPUSUB(5, chr01 + 1);
|
||||
SetBank_PPUSUB(6, chr23 + 0);
|
||||
SetBank_PPUSUB(7, chr23 + 1);
|
||||
SetBank_PPUSUB(0, chr4);
|
||||
SetBank_PPUSUB(1, chr5);
|
||||
SetBank_PPUSUB(2, chr6);
|
||||
SetBank_PPUSUB(3, chr7);
|
||||
}
|
||||
else
|
||||
{
|
||||
// SetVROM_8K_Bank( chr01, chr01+1, chr23, chr23+1,
|
||||
// chr4, chr5, chr6, chr7 );
|
||||
SetBank_PPUSUB(0, chr01 + 0);
|
||||
SetBank_PPUSUB(1, chr01 + 1);
|
||||
SetBank_PPUSUB(2, chr23 + 0);
|
||||
SetBank_PPUSUB(3, chr23 + 1);
|
||||
SetBank_PPUSUB(4, chr4);
|
||||
SetBank_PPUSUB(5, chr5);
|
||||
SetBank_PPUSUB(6, chr6);
|
||||
SetBank_PPUSUB(7, chr7);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetCRAM_1K_Bank(4, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(5, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(6, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(7, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(0, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(1, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(2, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(3, chr7 & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(1, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(2, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(3, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(4, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(5, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(6, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(7, chr7 & 0x07);
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetBank_PPU()
|
||||
{
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
// SetVROM_8K_Bank( chr4, chr5, chr6, chr7,
|
||||
// chr01, chr01+1, chr23, chr23+1 );
|
||||
SetBank_PPUSUB(4, chr01 + 0);
|
||||
SetBank_PPUSUB(5, chr01 + 1);
|
||||
SetBank_PPUSUB(6, chr23 + 0);
|
||||
SetBank_PPUSUB(7, chr23 + 1);
|
||||
SetBank_PPUSUB(0, chr4);
|
||||
SetBank_PPUSUB(1, chr5);
|
||||
SetBank_PPUSUB(2, chr6);
|
||||
SetBank_PPUSUB(3, chr7);
|
||||
}
|
||||
else
|
||||
{
|
||||
// SetVROM_8K_Bank( chr01, chr01+1, chr23, chr23+1,
|
||||
// chr4, chr5, chr6, chr7 );
|
||||
SetBank_PPUSUB(0, chr01 + 0);
|
||||
SetBank_PPUSUB(1, chr01 + 1);
|
||||
SetBank_PPUSUB(2, chr23 + 0);
|
||||
SetBank_PPUSUB(3, chr23 + 1);
|
||||
SetBank_PPUSUB(4, chr4);
|
||||
SetBank_PPUSUB(5, chr5);
|
||||
SetBank_PPUSUB(6, chr6);
|
||||
SetBank_PPUSUB(7, chr7);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x80) != 0)
|
||||
{
|
||||
SetCRAM_1K_Bank(4, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(5, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(6, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(7, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(0, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(1, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(2, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(3, chr7 & 0x07);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, (chr01 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(1, (chr01 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(2, (chr23 + 0) & 0x07);
|
||||
SetCRAM_1K_Bank(3, (chr23 + 1) & 0x07);
|
||||
SetCRAM_1K_Bank(4, chr4 & 0x07);
|
||||
SetCRAM_1K_Bank(5, chr5 & 0x07);
|
||||
SetCRAM_1K_Bank(6, chr6 & 0x07);
|
||||
SetCRAM_1K_Bank(7, chr7 & 0x07);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetBank_PPUSUB(int bank, int page)
|
||||
{
|
||||
if (patch == 0 && (page == 8 || page == 9))
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)bank, page & 7);
|
||||
}
|
||||
else if (patch == 1 && page >= 128)
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)bank, page & 7);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank((byte)bank, page);
|
||||
}
|
||||
}
|
||||
void SetBank_PPUSUB(int bank, int page)
|
||||
{
|
||||
if (patch == 0 && (page == 8 || page == 9))
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)bank, page & 7);
|
||||
}
|
||||
else if (patch == 1 && page >= 128)
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)bank, page & 7);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank((byte)bank, page);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper074::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = irq_request;
|
||||
}
|
||||
//void Mapper074::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
p[i] = reg[i];
|
||||
}
|
||||
p[8] = prg0;
|
||||
p[9] = prg1;
|
||||
p[10] = chr01;
|
||||
p[11] = chr23;
|
||||
p[12] = chr4;
|
||||
p[13] = chr5;
|
||||
p[14] = chr6;
|
||||
p[15] = chr7;
|
||||
p[16] = irq_enable;
|
||||
p[17] = irq_counter;
|
||||
p[18] = irq_latch;
|
||||
p[19] = irq_request;
|
||||
}
|
||||
|
||||
//void Mapper074::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
irq_request = p[19];
|
||||
}
|
||||
//void Mapper074::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
for (INT i = 0; i < 8; i++)
|
||||
{
|
||||
reg[i] = p[i];
|
||||
}
|
||||
prg0 = p[8];
|
||||
prg1 = p[9];
|
||||
chr01 = p[10];
|
||||
chr23 = p[11];
|
||||
chr4 = p[12];
|
||||
chr5 = p[13];
|
||||
chr6 = p[14];
|
||||
chr7 = p[15];
|
||||
irq_enable = p[16];
|
||||
irq_counter = p[17];
|
||||
irq_latch = p[18];
|
||||
irq_request = p[19];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,89 +2,86 @@
|
||||
// Mapper075 Konami VRC1/Jaleco D65005 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper075 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[2];
|
||||
public Mapper075(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper075 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[2];
|
||||
public Mapper075(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
reg[0] = 0;
|
||||
reg[1] = 1;
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
reg[0] = 0;
|
||||
reg[1] = 1;
|
||||
}
|
||||
|
||||
//void Mapper075::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
//void Mapper075::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF000)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
|
||||
case 0x9000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
case 0x9000:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x02) << 3));
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x04) << 2));
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
SetVROM_4K_Bank(4, reg[1]);
|
||||
break;
|
||||
reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x02) << 3));
|
||||
reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x04) << 2));
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
SetVROM_4K_Bank(4, reg[1]);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
case 0xA000:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0xC000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
reg[0] = (byte)((reg[0] & 0x10) | (data & 0x0F));
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
break;
|
||||
case 0xE000:
|
||||
reg[0] = (byte)((reg[0] & 0x10) | (data & 0x0F));
|
||||
SetVROM_4K_Bank(0, reg[0]);
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
reg[1] = (byte)((reg[1] & 0x10) | (data & 0x0F));
|
||||
SetVROM_4K_Bank(4, reg[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF000:
|
||||
reg[1] = (byte)((reg[1] & 0x10) | (data & 0x0F));
|
||||
SetVROM_4K_Bank(4, reg[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper075::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
}
|
||||
//void Mapper075::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
}
|
||||
|
||||
//void Mapper075::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
}
|
||||
//void Mapper075::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,81 +2,78 @@
|
||||
// Mapper076 Namcot 109 (女神転生) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper076 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
public Mapper076(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper076 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
public Mapper076(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE >= 8)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE >= 8)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper076::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg & 0x07)
|
||||
{
|
||||
case 2:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 4:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 5:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
case 6:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 7:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper076::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg & 0x07)
|
||||
{
|
||||
case 2:
|
||||
SetVROM_2K_Bank(0, data);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_2K_Bank(2, data);
|
||||
break;
|
||||
case 4:
|
||||
SetVROM_2K_Bank(4, data);
|
||||
break;
|
||||
case 5:
|
||||
SetVROM_2K_Bank(6, data);
|
||||
break;
|
||||
case 6:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 7:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper076::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
//void Mapper076::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
|
||||
//void Mapper076::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
//void Mapper076::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,38 +2,34 @@
|
||||
// Mapper077 Irem Early Mapper #0 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper077 : Mapper
|
||||
{
|
||||
public Mapper077(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper077 : Mapper
|
||||
{
|
||||
public Mapper077(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
|
||||
SetVROM_2K_Bank(0, 0);
|
||||
SetCRAM_2K_Bank(2, 1);
|
||||
SetCRAM_2K_Bank(4, 2);
|
||||
SetCRAM_2K_Bank(6, 3);
|
||||
}
|
||||
SetVROM_2K_Bank(0, 0);
|
||||
SetCRAM_2K_Bank(2, 1);
|
||||
SetCRAM_2K_Bank(4, 2);
|
||||
SetCRAM_2K_Bank(6, 3);
|
||||
}
|
||||
|
||||
//void Mapper077::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data & 0x07);
|
||||
//void Mapper077::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
SetPROM_32K_Bank(data & 0x07);
|
||||
|
||||
SetVROM_2K_Bank(0, (data & 0xF0) >> 4);
|
||||
}
|
||||
SetVROM_2K_Bank(0, (data & 0xF0) >> 4);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,44 +2,40 @@
|
||||
// Mapper078 Jaleco(Cosmo Carrier) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper078 : Mapper
|
||||
{
|
||||
public Mapper078(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper078 : Mapper
|
||||
{
|
||||
public Mapper078(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper078::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MAP78 WR $%04X=$%02X L=%d\n", addr, data, nes->GetScanline() );
|
||||
SetPROM_16K_Bank(4, data & 0x0F);
|
||||
SetVROM_8K_Bank((data & 0xF0) >> 4);
|
||||
//void Mapper078::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MAP78 WR $%04X=$%02X L=%d\n", addr, data, nes->GetScanline() );
|
||||
SetPROM_16K_Bank(4, data & 0x0F);
|
||||
SetVROM_8K_Bank((data & 0xF0) >> 4);
|
||||
|
||||
if ((addr & 0xFE00) != 0xFE00)
|
||||
{
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
if ((addr & 0xFE00) != 0xFE00)
|
||||
{
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,40 +2,36 @@
|
||||
// Mapper079 Nina-3 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper079 : Mapper
|
||||
{
|
||||
public Mapper079(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper079 : Mapper
|
||||
{
|
||||
public Mapper079(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0);
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper079::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank((data >> 3) & 0x01);
|
||||
SetVROM_8K_Bank(data & 0x07);
|
||||
}
|
||||
}
|
||||
//void Mapper079::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0x0100) != 0)
|
||||
{
|
||||
SetPROM_32K_Bank((data >> 3) & 0x01);
|
||||
SetVROM_8K_Bank(data & 0x07);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,105 +2,101 @@
|
||||
// Mapper080 Taito X1-005 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper080 : Mapper
|
||||
{
|
||||
public Mapper080(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper080 : Mapper
|
||||
{
|
||||
public Mapper080(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper080::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7EF0:
|
||||
SetVROM_2K_Bank(0, (data >> 1) & 0x3F);
|
||||
if (PROM_8K_SIZE == 32)
|
||||
{
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetVRAM_1K_Bank(8, 1);
|
||||
SetVRAM_1K_Bank(9, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVRAM_1K_Bank(8, 0);
|
||||
SetVRAM_1K_Bank(9, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
//void Mapper080::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7EF0:
|
||||
SetVROM_2K_Bank(0, (data >> 1) & 0x3F);
|
||||
if (PROM_8K_SIZE == 32)
|
||||
{
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetVRAM_1K_Bank(8, 1);
|
||||
SetVRAM_1K_Bank(9, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVRAM_1K_Bank(8, 0);
|
||||
SetVRAM_1K_Bank(9, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x7EF1:
|
||||
SetVROM_2K_Bank(2, (data >> 1) & 0x3F);
|
||||
if (PROM_8K_SIZE == 32)
|
||||
{
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetVRAM_1K_Bank(10, 1);
|
||||
SetVRAM_1K_Bank(11, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVRAM_1K_Bank(10, 0);
|
||||
SetVRAM_1K_Bank(11, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x7EF1:
|
||||
SetVROM_2K_Bank(2, (data >> 1) & 0x3F);
|
||||
if (PROM_8K_SIZE == 32)
|
||||
{
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
SetVRAM_1K_Bank(10, 1);
|
||||
SetVRAM_1K_Bank(11, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVRAM_1K_Bank(10, 0);
|
||||
SetVRAM_1K_Bank(11, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x7EF2:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EF3:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EF4:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0x7EF5:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
case 0x7EF2:
|
||||
SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EF3:
|
||||
SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EF4:
|
||||
SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0x7EF5:
|
||||
SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
|
||||
case 0x7EF6:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
case 0x7EF6:
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
|
||||
case 0x7EFA:
|
||||
case 0x7EFB:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EFC:
|
||||
case 0x7EFD:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EFE:
|
||||
case 0x7EFF:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0x7EFA:
|
||||
case 0x7EFB:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EFC:
|
||||
case 0x7EFD:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EFE:
|
||||
case 0x7EFF:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,118 +2,115 @@
|
||||
// Mapper082 Taito C075 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper082 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
{
|
||||
BYTE reg;
|
||||
|
||||
public Mapper082(NES parent) : base(parent)
|
||||
public Mapper082(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
reg = 0;
|
||||
{
|
||||
reg = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE!=0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
|
||||
//void Mapper082::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7EF0:
|
||||
if (reg!=0)
|
||||
{
|
||||
SetVROM_2K_Bank(4, data >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_2K_Bank(0, data >> 1);
|
||||
}
|
||||
break;
|
||||
//void Mapper082::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x7EF0:
|
||||
if (reg != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(4, data >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_2K_Bank(0, data >> 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x7EF1:
|
||||
if (reg!=0)
|
||||
{
|
||||
SetVROM_2K_Bank(6, data >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_2K_Bank(2, data >> 1);
|
||||
}
|
||||
break;
|
||||
case 0x7EF1:
|
||||
if (reg != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(6, data >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_2K_Bank(2, data >> 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x7EF2:
|
||||
if (reg!=0) SetVROM_1K_Bank(0, data);
|
||||
else SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EF3:
|
||||
if (reg!=0) SetVROM_1K_Bank(1, data);
|
||||
else SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EF4:
|
||||
if (reg!=0) SetVROM_1K_Bank(2, data);
|
||||
else SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0x7EF5:
|
||||
if (reg!=0) SetVROM_1K_Bank(3, data);
|
||||
else SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
case 0x7EF2:
|
||||
if (reg != 0) SetVROM_1K_Bank(0, data);
|
||||
else SetVROM_1K_Bank(4, data);
|
||||
break;
|
||||
case 0x7EF3:
|
||||
if (reg != 0) SetVROM_1K_Bank(1, data);
|
||||
else SetVROM_1K_Bank(5, data);
|
||||
break;
|
||||
case 0x7EF4:
|
||||
if (reg != 0) SetVROM_1K_Bank(2, data);
|
||||
else SetVROM_1K_Bank(6, data);
|
||||
break;
|
||||
case 0x7EF5:
|
||||
if (reg != 0) SetVROM_1K_Bank(3, data);
|
||||
else SetVROM_1K_Bank(7, data);
|
||||
break;
|
||||
|
||||
case 0x7EF6:
|
||||
reg = (byte)(data & 0x02);
|
||||
if ((data & 0x01)!=0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
case 0x7EF6:
|
||||
reg = (byte)(data & 0x02);
|
||||
if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
break;
|
||||
|
||||
case 0x7EFA:
|
||||
SetPROM_8K_Bank(4, data >> 2);
|
||||
break;
|
||||
case 0x7EFB:
|
||||
SetPROM_8K_Bank(5, data >> 2);
|
||||
break;
|
||||
case 0x7EFC:
|
||||
SetPROM_8K_Bank(6, data >> 2);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0x7EFA:
|
||||
SetPROM_8K_Bank(4, data >> 2);
|
||||
break;
|
||||
case 0x7EFB:
|
||||
SetPROM_8K_Bank(5, data >> 2);
|
||||
break;
|
||||
case 0x7EFC:
|
||||
SetPROM_8K_Bank(6, data >> 2);
|
||||
break;
|
||||
default:
|
||||
base.WriteLow(addr, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper082::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
//void Mapper082::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
|
||||
//void Mapper082::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
//void Mapper082::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,243 +1,242 @@
|
||||
/////////////////////////////
|
||||
// Mapper083 Cony //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper083 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[3];
|
||||
INT chr_bank;
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
public class Mapper083 : Mapper
|
||||
{
|
||||
BYTE[] reg = new byte[3];
|
||||
INT chr_bank;
|
||||
BYTE irq_enable;
|
||||
INT irq_counter;
|
||||
|
||||
BYTE patch;
|
||||
public Mapper083(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE patch;
|
||||
public Mapper083(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
for (INT i = 0; i < 3; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
{
|
||||
for (INT i = 0; i < 3; i++)
|
||||
{
|
||||
reg[i] = 0x00;
|
||||
}
|
||||
|
||||
if (PROM_8K_SIZE >= 32)
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 30, 31);
|
||||
reg[1] = 0x30;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
if (PROM_8K_SIZE >= 32)
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 30, 31);
|
||||
reg[1] = 0x30;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
chr_bank = 0;
|
||||
chr_bank = 0;
|
||||
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
irq_enable = 0; // Disable
|
||||
irq_counter = 0;
|
||||
|
||||
patch = 0;
|
||||
if (nes.rom.GetPROM_CRC() == 0x1461D1F8)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
}
|
||||
patch = 0;
|
||||
if (nes.rom.GetPROM_CRC() == 0x1461D1F8)
|
||||
{
|
||||
patch = 1;
|
||||
}
|
||||
}
|
||||
|
||||
//BYTE Mapper083::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
if ((addr & 0x5100) == 0x5100)
|
||||
{
|
||||
return reg[2];
|
||||
}
|
||||
else if (addr >= 0x6000)
|
||||
{
|
||||
return base.ReadLow(addr);
|
||||
}
|
||||
return (BYTE)(addr >> 8);
|
||||
}
|
||||
//BYTE Mapper083::ReadLow(WORD addr)
|
||||
public override byte ReadLow(ushort addr)
|
||||
{
|
||||
if ((addr & 0x5100) == 0x5100)
|
||||
{
|
||||
return reg[2];
|
||||
}
|
||||
else if (addr >= 0x6000)
|
||||
{
|
||||
return base.ReadLow(addr);
|
||||
}
|
||||
return (BYTE)(addr >> 8);
|
||||
}
|
||||
|
||||
//void Mapper083::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr)
|
||||
{
|
||||
case 0x5101:
|
||||
case 0x5102:
|
||||
case 0x5103:
|
||||
reg[2] = data;
|
||||
break;
|
||||
}
|
||||
//void Mapper083::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr)
|
||||
{
|
||||
case 0x5101:
|
||||
case 0x5102:
|
||||
case 0x5103:
|
||||
reg[2] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
if (addr >= 0x6000)
|
||||
{
|
||||
base.WriteLow(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper083::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0xB000:
|
||||
case 0xB0FF:
|
||||
case 0xB1FF:
|
||||
reg[0] = data;
|
||||
chr_bank = (data & 0x30) << 4;
|
||||
SetPROM_16K_Bank(4, data);
|
||||
SetPROM_16K_Bank(6, (data & 0x30) | 0x0F);
|
||||
break;
|
||||
//void Mapper083::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes.GetScanline(), nes.cpu.GetTotalCycles() );
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
case 0xB000:
|
||||
case 0xB0FF:
|
||||
case 0xB1FF:
|
||||
reg[0] = data;
|
||||
chr_bank = (data & 0x30) << 4;
|
||||
SetPROM_16K_Bank(4, data);
|
||||
SetPROM_16K_Bank(6, (data & 0x30) | 0x0F);
|
||||
break;
|
||||
|
||||
case 0x8100:
|
||||
reg[1] = (byte)(data & 0x80);
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0x8100:
|
||||
reg[1] = (byte)(data & 0x80);
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0x8200:
|
||||
irq_counter = (irq_counter & 0xFF00) | (INT)data;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
case 0x8201:
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
irq_enable = reg[1];
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
case 0x8200:
|
||||
irq_counter = (irq_counter & 0xFF00) | (INT)data;
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
case 0x8201:
|
||||
irq_counter = (irq_counter & 0x00FF) | ((INT)data << 8);
|
||||
irq_enable = reg[1];
|
||||
// nes.cpu.ClrIRQ( IRQ_MAPPER );
|
||||
break;
|
||||
|
||||
case 0x8300:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8301:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x8302:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
case 0x8300:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8301:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x8302:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0x8310:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(0, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8311:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(2, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(1, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8312:
|
||||
SetVROM_1K_Bank(2, chr_bank | data);
|
||||
break;
|
||||
case 0x8313:
|
||||
SetVROM_1K_Bank(3, chr_bank | data);
|
||||
break;
|
||||
case 0x8314:
|
||||
SetVROM_1K_Bank(4, chr_bank | data);
|
||||
break;
|
||||
case 0x8315:
|
||||
SetVROM_1K_Bank(5, chr_bank | data);
|
||||
break;
|
||||
case 0x8316:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(4, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(6, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8317:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(6, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(7, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8310:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(0, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(0, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8311:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(2, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(1, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8312:
|
||||
SetVROM_1K_Bank(2, chr_bank | data);
|
||||
break;
|
||||
case 0x8313:
|
||||
SetVROM_1K_Bank(3, chr_bank | data);
|
||||
break;
|
||||
case 0x8314:
|
||||
SetVROM_1K_Bank(4, chr_bank | data);
|
||||
break;
|
||||
case 0x8315:
|
||||
SetVROM_1K_Bank(5, chr_bank | data);
|
||||
break;
|
||||
case 0x8316:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(4, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(6, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
case 0x8317:
|
||||
if (patch != 0)
|
||||
{
|
||||
SetVROM_2K_Bank(6, chr_bank | data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVROM_1K_Bank(7, chr_bank | data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x8318:
|
||||
SetPROM_16K_Bank(4, (reg[0] & 0x30) | data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0x8318:
|
||||
SetPROM_16K_Bank(4, (reg[0] & 0x30) | data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper083::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter <= 113)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
irq_enable = 0;
|
||||
// nes.cpu.SetIRQ( IRQ_MAPPER );
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter -= 113;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper083::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
if (irq_counter <= 113)
|
||||
{
|
||||
// nes.cpu.IRQ();
|
||||
irq_enable = 0;
|
||||
// nes.cpu.SetIRQ( IRQ_MAPPER );
|
||||
nes.cpu.SetIRQ(IRQ_TRIGGER);
|
||||
}
|
||||
else
|
||||
{
|
||||
irq_counter -= 113;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper083::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg[0];
|
||||
//p[1] = reg[1];
|
||||
//p[2] = reg[2];
|
||||
//*(INT*)&p[3] = chr_bank;
|
||||
//p[7] = irq_enable;
|
||||
//*(INT*)&p[8] = irq_counter;
|
||||
}
|
||||
//void Mapper083::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = reg[0];
|
||||
//p[1] = reg[1];
|
||||
//p[2] = reg[2];
|
||||
//*(INT*)&p[3] = chr_bank;
|
||||
//p[7] = irq_enable;
|
||||
//*(INT*)&p[8] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper083::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg[0] = p[0];
|
||||
//reg[1] = p[1];
|
||||
//reg[2] = p[2];
|
||||
//chr_bank = *(INT*)&p[3];
|
||||
//irq_enable = p[7];
|
||||
//irq_counter = *(INT*)&p[8];
|
||||
}
|
||||
//void Mapper083::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//reg[0] = p[0];
|
||||
//reg[1] = p[1];
|
||||
//reg[2] = p[2];
|
||||
//chr_bank = *(INT*)&p[3];
|
||||
//irq_enable = p[7];
|
||||
//irq_counter = *(INT*)&p[8];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,43 +1,42 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper085 Konami VRC7 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using INT = System.Int32;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper085 : Mapper
|
||||
{
|
||||
public class Mapper085 : Mapper
|
||||
{
|
||||
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper085(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
BYTE irq_latch;
|
||||
INT irq_clock;
|
||||
public Mapper085(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
{
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_latch = 0;
|
||||
irq_clock = 0;
|
||||
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_8K_Bank(0);
|
||||
}
|
||||
|
||||
#if FALSE//0
|
||||
// DWORD crc = nes.rom.GetPROM_CRC();
|
||||
@ -48,191 +47,191 @@ namespace VirtualNes.Core
|
||||
// nes.SetRenderMethod( NES::TILE_RENDER );
|
||||
// }
|
||||
#endif
|
||||
nes.apu.SelectExSound(2);
|
||||
}
|
||||
nes.apu.SelectExSound(2);
|
||||
}
|
||||
|
||||
//void Mapper085::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF038)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8008:
|
||||
case 0x8010:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
//void Mapper085::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr & 0xF038)
|
||||
{
|
||||
case 0x8000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x8008:
|
||||
case 0x8010:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x9000:
|
||||
SetPROM_8K_Bank(6, data);
|
||||
break;
|
||||
|
||||
case 0x9010:
|
||||
case 0x9030:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
case 0x9010:
|
||||
case 0x9030:
|
||||
nes.apu.ExWrite(addr, data);
|
||||
break;
|
||||
|
||||
case 0xA000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, data);
|
||||
}
|
||||
break;
|
||||
case 0xA000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(0, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(0, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xA008:
|
||||
case 0xA010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(1, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(1, data);
|
||||
}
|
||||
break;
|
||||
case 0xA008:
|
||||
case 0xA010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(1, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(1, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xB000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(2, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(2, data);
|
||||
}
|
||||
break;
|
||||
case 0xB000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(2, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(2, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xB008:
|
||||
case 0xB010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(3, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(3, data);
|
||||
}
|
||||
break;
|
||||
case 0xB008:
|
||||
case 0xB010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(3, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(3, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xC000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(4, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(4, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xC008:
|
||||
case 0xC010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(5, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
case 0xC008:
|
||||
case 0xC010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(5, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(5, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xD000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
case 0xD000:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(6, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(6, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xD008:
|
||||
case 0xD010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(7, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(7, data);
|
||||
}
|
||||
break;
|
||||
case 0xD008:
|
||||
case 0xD010:
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
SetVROM_1K_Bank(7, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCRAM_1K_Bank(7, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
case 0xE000:
|
||||
data &= 0x03;
|
||||
if (data == 0) SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
else if (data == 1) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else if (data == 2) SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
break;
|
||||
|
||||
case 0xE008:
|
||||
case 0xE010:
|
||||
irq_latch = data;
|
||||
break;
|
||||
case 0xE008:
|
||||
case 0xE010:
|
||||
irq_latch = data;
|
||||
break;
|
||||
|
||||
case 0xF000:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0xF000:
|
||||
irq_enable = (byte)(data & 0x03);
|
||||
irq_counter = irq_latch;
|
||||
irq_clock = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
|
||||
case 0xF008:
|
||||
case 0xF010:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0xF008:
|
||||
case 0xF010:
|
||||
irq_enable = (byte)((irq_enable & 0x01) * 3);
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper085::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 4;
|
||||
while (irq_clock >= 455)
|
||||
{
|
||||
irq_clock -= 455;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper085::Clock(INT cycles)
|
||||
public override void Clock(int cycles)
|
||||
{
|
||||
if ((irq_enable & 0x02) != 0)
|
||||
{
|
||||
irq_clock += cycles * 4;
|
||||
while (irq_clock >= 455)
|
||||
{
|
||||
irq_clock -= 455;
|
||||
irq_counter++;
|
||||
if (irq_counter == 0)
|
||||
{
|
||||
irq_counter = irq_latch;
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper085::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*((INT*)&p[4]) = irq_clock;
|
||||
}
|
||||
//void Mapper085::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
//p[0] = irq_enable;
|
||||
//p[1] = irq_counter;
|
||||
//p[2] = irq_latch;
|
||||
//*((INT*)&p[4]) = irq_clock;
|
||||
}
|
||||
|
||||
//void Mapper085::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *((INT*)&p[4]);
|
||||
}
|
||||
//void Mapper085::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
//irq_enable = p[0];
|
||||
//irq_counter = p[1];
|
||||
//irq_latch = p[2];
|
||||
//irq_clock = *((INT*)&p[4]);
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,11 +2,8 @@
|
||||
// Mapper086 Jaleco Early Mapper #2 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -2,35 +2,31 @@
|
||||
// Mapper087 Konami 74161/32 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper087 : Mapper
|
||||
{
|
||||
public Mapper087(NES parent) : base(parent)
|
||||
public Mapper087(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, 2, 3);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper087::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
SetVROM_8K_Bank((data & 0x02) >> 1);
|
||||
}
|
||||
}
|
||||
//void Mapper087::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
SetVROM_8K_Bank((data & 0x02) >> 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,107 +1,104 @@
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper088 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
BYTE patch;
|
||||
public Mapper088(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper088 : Mapper
|
||||
{
|
||||
BYTE reg;
|
||||
BYTE patch;
|
||||
public Mapper088(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
public override void Reset()
|
||||
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_1K_SIZE >= 8)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
patch = 0;
|
||||
if (VROM_1K_SIZE >= 8)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
patch = 0;
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xc1b6b2a6)
|
||||
{ // Devil Man(J)
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0xd9803a35)
|
||||
{ // Quinty(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0xc1b6b2a6)
|
||||
{ // Devil Man(J)
|
||||
patch = 1;
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0xd9803a35)
|
||||
{ // Quinty(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper088::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg & 0x07)
|
||||
{
|
||||
case 0:
|
||||
SetVROM_2K_Bank(0, data >> 1);
|
||||
break;
|
||||
case 1:
|
||||
SetVROM_2K_Bank(2, data >> 1);
|
||||
break;
|
||||
case 2:
|
||||
SetVROM_1K_Bank(4, data + 0x40);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_1K_Bank(5, data + 0x40);
|
||||
break;
|
||||
case 4:
|
||||
SetVROM_1K_Bank(6, data + 0x40);
|
||||
break;
|
||||
case 5:
|
||||
SetVROM_1K_Bank(7, data + 0x40);
|
||||
break;
|
||||
case 6:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 7:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
if (data != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//void Mapper088::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8000:
|
||||
reg = data;
|
||||
if (patch != 0)
|
||||
{
|
||||
if ((data & 0x40) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
break;
|
||||
case 0x8001:
|
||||
switch (reg & 0x07)
|
||||
{
|
||||
case 0:
|
||||
SetVROM_2K_Bank(0, data >> 1);
|
||||
break;
|
||||
case 1:
|
||||
SetVROM_2K_Bank(2, data >> 1);
|
||||
break;
|
||||
case 2:
|
||||
SetVROM_1K_Bank(4, data + 0x40);
|
||||
break;
|
||||
case 3:
|
||||
SetVROM_1K_Bank(5, data + 0x40);
|
||||
break;
|
||||
case 4:
|
||||
SetVROM_1K_Bank(6, data + 0x40);
|
||||
break;
|
||||
case 5:
|
||||
SetVROM_1K_Bank(7, data + 0x40);
|
||||
break;
|
||||
case 6:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 7:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xC000:
|
||||
if (data != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper088::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
//void Mapper088::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg;
|
||||
}
|
||||
|
||||
//void Mapper088::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
//void Mapper088::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg = p[0];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,40 +2,36 @@
|
||||
// Mapper089 SunSoft (水戸黄門) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper089 : Mapper
|
||||
{
|
||||
public Mapper089(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper089 : Mapper
|
||||
{
|
||||
public Mapper089(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
|
||||
//void Mapper089::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xFF00) == 0xC000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x70) >> 4);
|
||||
//void Mapper089::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if ((addr & 0xFF00) == 0xC000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, (data & 0x70) >> 4);
|
||||
|
||||
SetVROM_8K_Bank(((data & 0x80) >> 4) | (data & 0x07));
|
||||
SetVROM_8K_Bank(((data & 0x80) >> 4) | (data & 0x07));
|
||||
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
if ((data & 0x08) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,11 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper090 PC-JY-?? //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using VirtualNes.Core.Debug;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using INT = System.Int32;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -1,104 +1,102 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper091 PC-HK-SF3 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using static VirtualNes.MMU;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper091 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper091(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper091 : Mapper
|
||||
{
|
||||
BYTE irq_enable;
|
||||
BYTE irq_counter;
|
||||
public Mapper091(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, PROM_8K_SIZE - 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(PROM_8K_SIZE - 2, PROM_8K_SIZE - 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
|
||||
//void Mapper091::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "$%04X:$%02X(%3d) L=%3d\n", addr, data, data, nes.GetScanline() );
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x6000:
|
||||
case 0x6001:
|
||||
case 0x6002:
|
||||
case 0x6003:
|
||||
SetVROM_2K_Bank((byte)((addr & 0x03) * 2), data);
|
||||
break;
|
||||
//void Mapper091::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
//DEBUGOUT( "$%04X:$%02X(%3d) L=%3d\n", addr, data, data, nes.GetScanline() );
|
||||
switch (addr & 0xF003)
|
||||
{
|
||||
case 0x6000:
|
||||
case 0x6001:
|
||||
case 0x6002:
|
||||
case 0x6003:
|
||||
SetVROM_2K_Bank((byte)((addr & 0x03) * 2), data);
|
||||
break;
|
||||
|
||||
case 0x7000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x7001:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
case 0x7000:
|
||||
SetPROM_8K_Bank(4, data);
|
||||
break;
|
||||
case 0x7001:
|
||||
SetPROM_8K_Bank(5, data);
|
||||
break;
|
||||
|
||||
case 0x7002:
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x7003:
|
||||
irq_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0x7002:
|
||||
irq_enable = 0;
|
||||
irq_counter = 0;
|
||||
nes.cpu.ClrIRQ(IRQ_MAPPER);
|
||||
break;
|
||||
case 0x7003:
|
||||
irq_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper091::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline < 240) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
if (irq_counter >= 8)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void Mapper091::HSync(INT scanline)
|
||||
public override void HSync(int scanline)
|
||||
{
|
||||
if ((scanline >= 0 && scanline < 240) && nes.ppu.IsDispON())
|
||||
{
|
||||
if (irq_enable != 0)
|
||||
{
|
||||
irq_counter++;
|
||||
}
|
||||
if (irq_counter >= 8)
|
||||
{
|
||||
// nes.cpu.IRQ_NotPending();
|
||||
nes.cpu.SetIRQ(IRQ_MAPPER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper091::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
p[1] = irq_counter;
|
||||
}
|
||||
//void Mapper091::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = irq_enable;
|
||||
p[1] = irq_counter;
|
||||
}
|
||||
|
||||
//void Mapper091::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
irq_counter = p[1];
|
||||
}
|
||||
//void Mapper091::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
irq_enable = p[0];
|
||||
irq_counter = p[1];
|
||||
}
|
||||
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,9 @@
|
||||
/////////////////////////////////
|
||||
// Mapper092 Jaleco/Type1 Higher bank switch //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
using VirtualNes.Core.Debug;
|
||||
using static VirtualNes.MMU;
|
||||
using INT = System.Int32;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
@ -2,37 +2,33 @@
|
||||
// Mapper093 SunSoft (Fantasy Zone) //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
using System;
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper093 : Mapper
|
||||
{
|
||||
public Mapper093(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
public class Mapper093 : Mapper
|
||||
{
|
||||
public Mapper093(NES parent) : base(parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
public override void Reset()
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
SetVROM_8K_Bank(0);
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper093::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
}
|
||||
//void Mapper093::WriteLow(WORD addr, BYTE data)
|
||||
public override void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr == 0x6000)
|
||||
{
|
||||
SetPROM_16K_Bank(4, data);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user