diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 670299057f..33a762a693 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -414,6 +414,7 @@ + @@ -452,6 +453,8 @@ + + diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs new file mode 100644 index 0000000000..fb6d77dc39 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDL.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Cores.Components.H6280 +{ + public partial class HuC6280 + { + public struct MemMapping + { + public string Name; + public int Offs; + } + public MemMapping[] Mappings; // = new MemMapping[256]; + + public Dictionary CodeDataLog = new Dictionary(); + + /// + /// create a new empty CodeDataLog to match the Mappings + /// + public void InitCDL() + { + Dictionary sizes = new Dictionary(); + foreach (var m in Mappings) + { + if (!sizes.ContainsKey(m.Name) || m.Offs >= sizes[m.Name]) + sizes[m.Name] = m.Offs; + } + + CodeDataLog.Clear(); + foreach (var kvp in sizes) + { + // becase we were looking at offsets, and each bank is 8192 big, we need to add that size + CodeDataLog[kvp.Key] = new byte[kvp.Value + 8192]; + } + } + + + + [Flags] + enum CDLUsage : byte + { + // was fetched as an opcode + Code = 0x01, + // was read or written as data + Data = 0x02, + // was read and used as a pointer to data via indirect addressing + DataPtr = 0x04, + // was read or written as stack + Stack = 0x08, + // was read or written as data via indirect addressing + IndirectData = 0x10, + // was read and used as function pointer + // NB: there is no "IndirectCode"; all code is marked simply as code regardless of how it is reached + FcnPtr = 0x20, + // was used as a source (either initial or during the loop) of a block xfer + BlockFrom = 0x40, + // was used as a destination (either initial or during the loop) of a block xfer + BlockTo = 0x80 + } + + void Mark(ushort addr, CDLUsage flag) + { + var m = Mappings[MPR[addr >> 13]]; + CodeDataLog[m.Name][addr & 0x1fff | m.Offs] |= (byte)flag; + } + + // mark addr as having been fetched for execute + void MarkCode(int addr_) + { + ushort addr = (ushort)addr_; + Mark(addr, CDLUsage.Code); + } + + // mark addr as having been seen as data + void MarkAddr(int addr_) + { + ushort addr = (ushort)addr_; + Mark(addr, CDLUsage.Data); + } + + // convert address to zero-page, then mark as data + void MarkZP(int addr_) + { + ushort addr = (ushort)(addr_ & 0xff | 0x2000); + Mark(addr, CDLUsage.Data); + } + + // convert address to zero-page, then return the pointer stored there + ushort GetIndirect(int addr_) + { + ushort addr = (ushort)(addr_ & 0xff | 0x2000); + return ReadWordPageWrap(addr); + } + + // convert address to zero-page, then mark as pointer (two bytes) + void MarkZPPtr(int addr_) + { + ushort addr = (ushort)(addr_ & 0xff | 0x2000); + ushort addr2 = (ushort)(addr & 0xff00 | (addr + 1) & 0x00ff); + Mark(addr, CDLUsage.DataPtr); + Mark(addr2, CDLUsage.DataPtr); + } + + // mark address as destination data of an indirect pointer + void MarkIndirect(int addr_) + { + ushort addr = (ushort)addr_; + Mark(addr, CDLUsage.IndirectData); + } + + // mark stack space + void MarkPush(int n) + { + for (int i = 0; i < n; i++) + { + ushort addr = (ushort)(S - i); + Mark(addr, CDLUsage.Stack); + } + } + + void MarkPop(int n) + { + for (int i = 0; i < n; i++) + { + ushort addr = (ushort)(S + i + 1); + Mark(addr, CDLUsage.Stack); + } + } + + // mark addr as function pointer (2 bytes) + void MarkFptr(int addr_) + { + ushort addr = (ushort)addr_; + ushort addr2 = (ushort)(addr & 0xff00 | (addr + 1) & 0x00ff); + Mark(addr, CDLUsage.FcnPtr); + Mark(addr2, CDLUsage.FcnPtr); + } + + // block transfer "from" + void MarkBTFrom(int addr_) + { + ushort addr = (ushort)addr_; + Mark(addr, CDLUsage.BlockFrom); + } + + // block transfer "to" + void MarkBTTo(int addr_) + { + ushort addr = (ushort)addr_; + Mark(addr, CDLUsage.BlockTo); + } + } +} diff --git a/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs new file mode 100644 index 0000000000..24c51007f8 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs @@ -0,0 +1,1287 @@ +using System; + +// Do not modify this file directly! This is GENERATED code. +// Please open the CpuCoreGenerator solution and make your modifications there. + +namespace BizHawk.Emulation.Cores.Components.H6280 +{ + public partial class HuC6280 + { + void CDLOpcode() + { + byte tmp8; + byte opcode = ReadMemory(PC); + switch (opcode) + { + case 0x00: // BRK + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x01: // ORA (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x02: // SXY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x03: // ST0 #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x04: // TSB zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x05: // ORA zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x06: // ASL zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x07: // RMB0 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x08: // PHP + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPush(1); + break; + case 0x09: // ORA #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x0A: // ASL A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x0B: // ?? + MarkCode(PC); + break; + case 0x0C: // TSB addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x0D: // ORA addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x0E: // ASL addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x0F: // BBR0 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x10: // BPL +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x11: // ORA (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0x12: // ORA (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x13: // ST1 #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x14: // TRB zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x15: // ORA zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x16: // ASL zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x17: // RMB1 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x18: // CLC + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x19: // ORA addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0x1A: // INC A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x1B: // ?? + MarkCode(PC); + break; + case 0x1C: // TRB addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x1D: // ORA addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x1E: // ASL addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x1F: // BBR1 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x20: // JSR addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x21: // AND (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x22: // SAX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x23: // ST2 #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x24: // BIT zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x25: // AND zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x26: // ROL zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x27: // RMB2 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x28: // PLP + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(1); + break; + case 0x29: // AND #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x2A: // ROL A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x2B: // ?? + MarkCode(PC); + break; + case 0x2C: // BIT addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x2D: // AND addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x2E: // ROL addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x2F: // BBR2 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x30: // BMI +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x31: // AND (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0x32: // AND (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x33: // ?? + MarkCode(PC); + break; + case 0x34: // BIT zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x35: // AND zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x36: // ROL zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x37: // RMB3 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x38: // SEC + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x39: // AND addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0x3A: // DEC A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x3B: // ?? + MarkCode(PC); + break; + case 0x3C: // BIT addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x3D: // AND addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x3E: // ROL addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x3F: // BBR3 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x40: // RTI + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(3); + break; + case 0x41: // EOR (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x42: // SAY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x43: // TMA #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x44: // BSR +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x45: // EOR zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x46: // LSR zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x47: // RMB4 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x48: // PHA + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPush(1); + break; + case 0x49: // EOR #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x4A: // LSR A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x4B: // ?? + MarkCode(PC); + break; + case 0x4C: // JMP addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x4D: // EOR addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x4E: // LSR addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x4F: // BBR4 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x50: // BVC +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x51: // EOR (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0x52: // EOR (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x53: // TAM #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x54: // CSL + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x55: // EOR zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x56: // LSR zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x57: // RMB5 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x58: // CLI + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x59: // EOR addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0x5A: // PHY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPush(1); + break; + case 0x5B: // ?? + MarkCode(PC); + break; + case 0x5C: // ?? + MarkCode(PC); + break; + case 0x5D: // EOR addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x5E: // LSR addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x5F: // BBR5 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x60: // RTS + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(2); + break; + case 0x61: // ADC (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x62: // CLA + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x63: // ?? + MarkCode(PC); + break; + case 0x64: // STZ zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x65: // ADC zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x66: // ROR zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x67: // RMB6 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x68: // PLA + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(1); + break; + case 0x69: // ADC #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x6A: // ROR A + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x6B: // ?? + MarkCode(PC); + break; + case 0x6C: // JMP + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkFptr(ReadWord((ushort)(PC + 1))); + break; + case 0x6D: // ADC addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x6E: // ROR addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x6F: // BBR6 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x70: // BVS +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x71: // ADC (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0x72: // ADC (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x73: // TII src, dest, len + for (int i = 0; i < 7; i++) + MarkCode(PC + i); + if (!InBlockTransfer) + { + MarkBTFrom(ReadWord((ushort)(PC + 1))); + MarkBTTo(ReadWord((ushort)(PC + 3))); + } + else + { + MarkBTFrom(btFrom); + MarkBTTo(btTo); + } + break; + case 0x74: // STZ zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x75: // ADC zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x76: // ROR zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x77: // RMB7 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x78: // SEI + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x79: // ADC addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0x7A: // PLY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(1); + break; + case 0x7B: // ?? + MarkCode(PC); + break; + case 0x7C: // JMP + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkFptr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x7D: // ADC addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x7E: // ROR addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x7F: // BBR7 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x80: // BRA +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x81: // STA (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x82: // CLX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x83: // TST + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 2))); + break; + case 0x84: // STY zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x85: // STA zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x86: // STX zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x87: // SMB0 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x88: // DEY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x89: // BIT #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x8A: // TXA + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x8B: // ?? + MarkCode(PC); + break; + case 0x8C: // STY addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x8D: // STA addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x8E: // STX addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x8F: // BBS0 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x90: // BCC +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0x91: // STA (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0x92: // STA (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0x93: // TST + for (int i = 0; i < 4; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 2))); + break; + case 0x94: // STY zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x95: // STA zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0x96: // STX zp,Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + Y); + break; + case 0x97: // SMB1 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0x98: // TYA + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x99: // STA addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0x9A: // TXS + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0x9B: // ?? + MarkCode(PC); + break; + case 0x9C: // STZ addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0x9D: // STA addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x9E: // STZ addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0x9F: // BBS1 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xA0: // LDY #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xA1: // LDA (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xA2: // LDX #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xA3: // TST + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 2)) + X); + break; + case 0xA4: // LDY zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xA5: // LDA zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xA6: // LDX zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xA7: // SMB2 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xA8: // TAY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xA9: // LDA #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xAA: // TAX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xAB: // ?? + MarkCode(PC); + break; + case 0xAC: // LDY addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xAD: // LDA addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xAE: // LDX addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xAF: // BBS2 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xB0: // BCS +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xB1: // LDA (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0xB2: // LDA (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xB3: // TST + for (int i = 0; i < 4; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 2)) + X); + break; + case 0xB4: // LDY zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xB5: // LDA zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xB6: // LDX zp,Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + Y); + break; + case 0xB7: // SMB3 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xB8: // CLV + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xB9: // LDA addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0xBA: // TSX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xBB: // ?? + MarkCode(PC); + break; + case 0xBC: // LDY addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xBD: // LDA addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xBE: // LDX addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0xBF: // BBS3 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xC0: // CPY #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xC1: // CMP (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xC2: // CLY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xC3: // TDD src, dest, len + for (int i = 0; i < 7; i++) + MarkCode(PC + i); + if (!InBlockTransfer) + { + MarkBTFrom(ReadWord((ushort)(PC + 1))); + MarkBTTo(ReadWord((ushort)(PC + 3))); + } + else + { + MarkBTFrom(btFrom); + MarkBTTo(btTo); + } + break; + case 0xC4: // CPY zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xC5: // CMP zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xC6: // DEC zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xC7: // SMB4 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xC8: // INY + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xC9: // CMP #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xCA: // DEX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xCB: // ?? + MarkCode(PC); + break; + case 0xCC: // CPY addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xCD: // CMP addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xCE: // DEC addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xCF: // BBS4 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xD0: // BNE +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xD1: // CMP (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0xD2: // CMP (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xD3: // TIN src, dest, len + for (int i = 0; i < 7; i++) + MarkCode(PC + i); + if (!InBlockTransfer) + { + MarkBTFrom(ReadWord((ushort)(PC + 1))); + MarkBTTo(ReadWord((ushort)(PC + 3))); + } + else + { + MarkBTFrom(btFrom); + MarkBTTo(btTo); + } + break; + case 0xD4: // CSH + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xD5: // CMP zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xD6: // DEC zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xD7: // SMB5 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xD8: // CLD + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xD9: // CMP addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0xDA: // PHX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPush(1); + break; + case 0xDB: // ?? + MarkCode(PC); + break; + case 0xDC: // ?? + MarkCode(PC); + break; + case 0xDD: // CMP addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xDE: // DEC addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xDF: // BBS5 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xE0: // CPX #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xE1: // SBC (addr,X) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xE2: // ?? + MarkCode(PC); + break; + case 0xE3: // TIA src, dest, len + for (int i = 0; i < 7; i++) + MarkCode(PC + i); + if (!InBlockTransfer) + { + MarkBTFrom(ReadWord((ushort)(PC + 1))); + MarkBTTo(ReadWord((ushort)(PC + 3))); + } + else + { + MarkBTFrom(btFrom); + MarkBTTo(btTo+btAlternator); + } + break; + case 0xE4: // CPX zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xE5: // SBC zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xE6: // INC zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xE7: // SMB6 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xE8: // INX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xE9: // SBC #nn + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xEA: // NOP + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xEB: // ?? + MarkCode(PC); + break; + case 0xEC: // CPX addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xED: // SBC addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xEE: // INC addr + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1))); + break; + case 0xEF: // BBS6 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xF0: // BEQ +/-rel + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + break; + case 0xF1: // SBC (addr),Y + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8) + Y); + break; + case 0xF2: // SBC (addr) + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + tmp8 = ReadMemory((ushort)(PC + 1)); + MarkZPPtr(tmp8); + MarkIndirect(GetIndirect(tmp8)); + break; + case 0xF3: // TAI src, dest, len + for (int i = 0; i < 7; i++) + MarkCode(PC + i); + if (!InBlockTransfer) + { + MarkBTFrom(ReadWord((ushort)(PC + 1))); + MarkBTTo(ReadWord((ushort)(PC + 3))); + } + else + { + MarkBTFrom(btFrom+btAlternator); + MarkBTTo(btTo); + } + break; + case 0xF4: // SET + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xF5: // SBC zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xF6: // INC zp,X + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1)) + X); + break; + case 0xF7: // SMB7 zp + for (int i = 0; i < 2; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + case 0xF8: // SED + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + break; + case 0xF9: // SBC addr,Y + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + Y); + break; + case 0xFA: // PLX + for (int i = 0; i < 1; i++) + MarkCode(PC + i); + MarkPop(1); + break; + case 0xFB: // ?? + MarkCode(PC); + break; + case 0xFC: // ?? + MarkCode(PC); + break; + case 0xFD: // SBC addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xFE: // INC addr,X + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkAddr(ReadWord((ushort)(PC + 1)) + X); + break; + case 0xFF: // BBS7 + for (int i = 0; i < 3; i++) + MarkCode(PC + i); + MarkZP(ReadMemory((ushort)(PC + 1))); + break; + } + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs new file mode 100644 index 0000000000..889553e0ce --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/CDLMapping.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using BizHawk.Emulation.Cores.Components.H6280; + +namespace BizHawk.Emulation.Cores.PCEngine +{ + partial class PCEngine + { + static void CDLMappingApplyRange(HuC6280.MemMapping[] mm, string name, int block, int len) + { + for (int i = block, offs = 0; i < 256 && len > offs; i++, offs += 8192) + { + mm[i].Name = name; + mm[i].Offs = offs; + } + } + + /// + /// informs the CPU of the general memory layout, so it can do CDL + /// + void InitCDLMappings() + { + // todo: arcade card + + var mm = new HuC6280.MemMapping[256]; + + CDLMappingApplyRange(mm, "ROM", 0x00, RomLength); + if (PopulousRAM != null) + CDLMappingApplyRange(mm, "Populous RAM", 0x40, PopulousRAM.Length); + + if (SuperRam != null) + CDLMappingApplyRange(mm, "Super RAM", 0x68, SuperRam.Length); + + if (CDRam != null) + CDLMappingApplyRange(mm, "CD RAM", 0x80, CDRam.Length); + + if (BRAM != null) + CDLMappingApplyRange(mm, "BRAM", 0xf7, BRAM.Length); + + { + var rammirrors = new HuC6280.MemMapping { Name = "RAM", Offs = 0 }; + mm[0xf9] = mm[0xfa] = mm[0xfb] = rammirrors; + } + CDLMappingApplyRange(mm, "RAM", 0xf8, Ram.Length); + + mm[0xff] = new HuC6280.MemMapping { Name = "MMIO", Offs = 0 }; + + for (int i = 0; i < 256; i++) + { + if (mm[i].Name == null) + mm[i].Name = "UNKNOWN"; + } + + Cpu.Mappings = mm; + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs index 70b6fd0c4c..2e671a2235 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.Populous.cs @@ -61,4 +61,4 @@ namespace BizHawk.Emulation.Cores.PCEngine Log.Error("MEM", "UNHANDLED WRITE: {0:X6}:{1:X2}", addr, value); } } -} \ No newline at end of file +} diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs index 1174f6bd98..757dc7dcd2 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/MemoryMap.SF2.cs @@ -66,4 +66,4 @@ namespace BizHawk.Emulation.Cores.PCEngine Log.Error("MEM", "UNHANDLED WRITE: {0:X6}:{1:X2}", addr, value); } } -} \ No newline at end of file +} diff --git a/CpuCoreGenerator/CpuCoreGenerator.csproj b/CpuCoreGenerator/CpuCoreGenerator.csproj index 4bcd4b222d..6c5159d7c8 100644 --- a/CpuCoreGenerator/CpuCoreGenerator.csproj +++ b/CpuCoreGenerator/CpuCoreGenerator.csproj @@ -61,6 +61,7 @@ + diff --git a/CpuCoreGenerator/HuC6280/CDL.cs b/CpuCoreGenerator/HuC6280/CDL.cs new file mode 100644 index 0000000000..26dea836aa --- /dev/null +++ b/CpuCoreGenerator/HuC6280/CDL.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace HuC6280 +{ + public partial class CoreGenerator + { + public void GenerateCDL(string file) + { + using (TextWriter w = new StreamWriter(file)) + { + w.WriteLine("using System;"); + w.WriteLine(); + w.WriteLine("// Do not modify this file directly! This is GENERATED code."); + w.WriteLine("// Please open the CpuCoreGenerator solution and make your modifications there."); + + w.WriteLine(); + w.WriteLine("namespace BizHawk.Emulation.Cores.Components.H6280"); + w.WriteLine("{"); + w.WriteLine("\tpublic partial class HuC6280"); + w.WriteLine("\t{"); + + w.WriteLine("\t\tvoid CDLOpcode()"); + w.WriteLine("\t\t{"); + w.WriteLine("\t\t\tbyte tmp8;"); + w.WriteLine("\t\t\tbyte opcode = ReadMemory(PC);"); + w.WriteLine("\t\t\tswitch (opcode)"); + w.WriteLine("\t\t\t{"); + for (int i = 0; i < 256; i++) + CDLOpcode(w, i); + w.WriteLine("\t\t\t}"); + w.WriteLine("\t\t}"); + + w.WriteLine("\t}"); + w.WriteLine("}"); + } + } + + void CDLOpcode(TextWriter w, int opcode) + { + // todo: T Flag + + var op = Opcodes[opcode]; + + if (op == null) + { + // nop + w.WriteLine("\t\t\t\tcase 0x{0:X2}: // {1}", opcode, "??"); + w.WriteLine("\t\t\t\t\tMarkCode(PC);"); + w.WriteLine("\t\t\t\t\tbreak;"); + return; + } + + w.WriteLine("\t\t\t\tcase 0x{0:X2}: // {1}", opcode, op); + + w.WriteLine("\t\t\t\t\tfor (int i = 0; i < {0}; i++)", op.Size); + w.WriteLine("\t\t\t\t\t\tMarkCode(PC + i);"); + + switch (op.AddressMode) + { + case AddrMode.Implicit: + switch (op.Instruction) + { + case "PHA": // push + case "PHP": + case "PHX": + case "PHY": + w.WriteLine("\t\t\t\t\tMarkPush(1);"); + break; + case "PLA": // pop + case "PLP": + case "PLX": + case "PLY": + w.WriteLine("\t\t\t\t\tMarkPop(1);"); + break; + case "RTI": + w.WriteLine("\t\t\t\t\tMarkPop(3);"); + break; + case "RTS": + w.WriteLine("\t\t\t\t\tMarkPop(2);"); + break; + } + break; + case AddrMode.Accumulator: + break; + case AddrMode.Immediate: + break; + case AddrMode.ZeroPage: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)));"); + break; + case AddrMode.ZeroPageX: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)) + X);"); + break; + case AddrMode.ZeroPageY: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)) + Y);"); + break; + case AddrMode.ZeroPageR: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 1)));"); + break; + case AddrMode.Absolute: + w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)));"); + break; + case AddrMode.AbsoluteX: + w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)) + X);"); + break; + case AddrMode.AbsoluteY: + w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 1)) + Y);"); + break; + case AddrMode.Indirect: + w.WriteLine("\t\t\t\t\ttmp8 = ReadMemory((ushort)(PC + 1));"); + w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);"); + w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8));"); + break; + case AddrMode.IndirectX: + w.WriteLine("\t\t\t\t\ttmp8 = (byte)(ReadMemory((ushort)(PC + 1)) + X);"); + w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);"); + w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8));"); + break; + case AddrMode.IndirectY: + w.WriteLine("\t\t\t\t\ttmp8 = ReadMemory((ushort)(PC + 1));"); + w.WriteLine("\t\t\t\t\tMarkZPPtr(tmp8);"); + w.WriteLine("\t\t\t\t\tMarkIndirect(GetIndirect(tmp8) + Y);"); + break; + case AddrMode.Relative: + break; + case AddrMode.BlockMove: + w.WriteLine("\t\t\t\t\tif (!InBlockTransfer)"); + w.WriteLine("\t\t\t\t\t{"); + w.WriteLine("\t\t\t\t\t\tMarkBTFrom(ReadWord((ushort)(PC + 1)));"); + w.WriteLine("\t\t\t\t\t\tMarkBTTo(ReadWord((ushort)(PC + 3)));"); + w.WriteLine("\t\t\t\t\t}"); + w.WriteLine("\t\t\t\t\telse"); + w.WriteLine("\t\t\t\t\t{"); + switch (op.Instruction) + { + case "TII": + case "TDD": + case "TIN": + w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom);"); + w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo);"); + break; + case "TIA": + w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom);"); + w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo+btAlternator);"); + break; + case "TAI": + w.WriteLine("\t\t\t\t\t\tMarkBTFrom(btFrom+btAlternator);"); + w.WriteLine("\t\t\t\t\t\tMarkBTTo(btTo);"); + break; + } + w.WriteLine("\t\t\t\t\t\t}"); + break; + case AddrMode.ImmZeroPage: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 2)));"); + break; + case AddrMode.ImmZeroPageX: + w.WriteLine("\t\t\t\t\tMarkZP(ReadMemory((ushort)(PC + 2)) + X);"); + break; + case AddrMode.ImmAbsolute: + w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 2)));"); + break; + case AddrMode.ImmAbsoluteX: + w.WriteLine("\t\t\t\t\tMarkAddr(ReadWord((ushort)(PC + 2)) + X);"); + break; + case AddrMode.AbsoluteIndirect: + w.WriteLine("\t\t\t\t\tMarkFptr(ReadWord((ushort)(PC + 1)));"); + break; + case AddrMode.AbsoluteIndirectX: + w.WriteLine("\t\t\t\t\tMarkFptr(ReadWord((ushort)(PC + 1)) + X);"); + break; + } + w.WriteLine("\t\t\t\t\tbreak;"); + } + } +} diff --git a/CpuCoreGenerator/Program.cs b/CpuCoreGenerator/Program.cs index 5f064b2400..b4bd57ee93 100644 --- a/CpuCoreGenerator/Program.cs +++ b/CpuCoreGenerator/Program.cs @@ -12,5 +12,6 @@ y.InitOpcodeTable(); y.GenerateDisassembler("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/Disassembler.cs"); y.GenerateExecutor("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/Execute.cs"); + y.GenerateCDL("../../../BizHawk.Emulation.Cores/CPUs/HuC6280/CDLOpcodes.cs"); } }