Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using GBHL;
- namespace GameBoy_Assembler_Plus
- {
- public class Disassemble
- {
- public static List<int> CallStack = new List<int>();
- public static List<int> BeenCalledStack = new List<int>();
- public static List<int> BeenReferencedLabels = new List<int>();
- public static List<int> LabelCalls = new List<int>();
- public static byte A = 0;
- public static byte Bank = 0;
- public static bool EmulateBanks { get; set; }
- public static void FindLabelCalls(GBFile gb, int start, bool breakOnNops, bool outsideRAM)
- {
- BeenCalledStack.Add(start);
- gb.BufferLocation = start;
- while (true)
- {
- string s = DisassembleNextInstruction(gb, outsideRAM);
- if (s == "ret" || s.StartsWith(";unknown opcode") || (breakOnNops && s == "nop"))
- break;
- }
- for (int i = 0; i < CallStack.Count; i++)
- {
- if (BeenCalledStack.Contains(CallStack[i]))
- continue;
- FindLabelCalls(gb, CallStack[i], breakOnNops, outsideRAM);
- }
- }
- public static void CreateLabelCalls()
- {
- for (int i = 0; i < CallStack.Count; i++)
- {
- if (LabelCalls.Contains(CallStack[i]))
- continue;
- LabelCalls.Add(CallStack[i]);
- }
- }
- public static string DisassembleChain(GBFile gb, int start, bool breakOnNops, bool outsideRAM)
- {
- BeenCalledStack.Add(start);
- gb.BufferLocation = start;
- string output = "#org " + start.ToString("X");
- while (true)
- {
- if (LabelCalls.Contains(gb.BufferLocation) && !BeenReferencedLabels.Contains(gb.BufferLocation))
- {
- output = output + "\r\nLabel" + gb.BufferLocation.ToString("X") + ":";
- BeenReferencedLabels.Add(gb.BufferLocation);
- BeenCalledStack.Add(gb.BufferLocation);
- }
- string s = DisassembleNextInstruction(gb, outsideRAM);
- output = output + "\r\n" + s;
- if (s == "ret" || s.StartsWith(";unknown opcode") || (breakOnNops && s == "nop"))
- break;
- }
- for (int i = 0; i < CallStack.Count; i++)
- {
- if (BeenCalledStack.Contains(CallStack[i]))
- continue;
- output += "\r\n\r\n" + DisassembleChain(gb, CallStack[i], breakOnNops, outsideRAM);
- }
- return output;
- }
- public static string DisassembleRange(GBFile gb, int start, int end, bool breakOnNops, bool outsideRAM)
- {
- gb.BufferLocation = start;
- string output = "#org " + start.ToString("X");
- while (gb.BufferLocation <= end)
- {
- if (LabelCalls.Contains(gb.BufferLocation) && !BeenReferencedLabels.Contains(gb.BufferLocation))
- {
- output = output + "\r\nLabel" + gb.BufferLocation.ToString("X") + ":";
- BeenReferencedLabels.Add(gb.BufferLocation);
- BeenCalledStack.Add(gb.BufferLocation);
- }
- string s = DisassembleNextInstruction(gb, outsideRAM);
- int lbl = s.IndexOf("Label");
- if (lbl != -1)
- {
- int jump = int.Parse(s.Substring(lbl + 5), System.Globalization.NumberStyles.HexNumber);
- if (jump > end || jump <= start)
- s = s.Replace(s.Substring(lbl), Hex((ushort)jump));
- }
- output = output + "\r\n" + s;
- if (s.StartsWith(";unknown opcode") || (breakOnNops && s == "nop"))
- break;
- }
- return output;
- }
- public static string DisassembleNextInstruction(GBFile gb, bool outsideRAM)
- {
- ushort addr;
- byte bddr;
- byte opcode = gb.ReadByte();
- switch (opcode)
- {
- case 0x00:
- return "nop";
- case 0x01:
- return "ld bc," + Hex(ReadLWord(gb));
- case 0x02:
- return "ld (bc),a";
- case 0x03:
- return "inc bc";
- case 0x04:
- return "inc b";
- case 0x05:
- return "dec b";
- case 0x06:
- return "ld b," + Hex(gb.ReadByte());
- case 0x07:
- return "rlca";
- case 0x08:
- return "ld (" + Hex(ReadLWord(gb)) + "),sp";
- case 0x09:
- return "add hl,bc";
- case 0x0A:
- return "ld a,(bc)";
- case 0x0B:
- return "dec bc";
- case 0x0C:
- return "inc c";
- case 0x0D:
- return "dec c";
- case 0x0E:
- return "ld c," + Hex(gb.ReadByte());
- case 0x0F:
- return "rrca";
- case 0x10:
- if (gb.ReadByte() != 0)
- break;
- return "stop";
- case 0x11:
- return "ld de," + Hex(ReadLWord(gb));
- case 0x12:
- return "ld (de),a";
- case 0x13:
- return "inc de";
- case 0x14:
- return "inc d";
- case 0x15:
- return "dec d";
- case 0x16:
- return "ld d," + Hex(gb.ReadByte());
- case 0x17:
- return "rla";
- case 0x18:
- bddr = gb.ReadByte();
- CallStack.Add(GetAbsoluteAddress(bddr, gb));
- return "jr Label" + GetAbsoluteAddress(bddr, gb).ToString("X");
- case 0x19:
- return "add hl,de";
- case 0x1A:
- return "ld a,(de)";
- case 0x1B:
- return "dec de";
- case 0x1C:
- return "inc e";
- case 0x1D:
- return "dec e";
- case 0x1E:
- return "ld e," + Hex(gb.ReadByte());
- case 0x1F:
- return "rra";
- case 0x20:
- bddr = gb.ReadByte();
- CallStack.Add(GetAbsoluteAddress(bddr, gb));
- return "jr nz,Label" + GetAbsoluteAddress(bddr, gb).ToString("X");
- case 0x21:
- return "ld hl," + Hex(ReadLWord(gb));
- case 0x22:
- return "ldi (hl),a";
- case 0x23:
- return "inc hl";
- case 0x24:
- return "inc h";
- case 0x25:
- return "dec h";
- case 0x26:
- return "ld h," + Hex(gb.ReadByte());
- case 0x27:
- return "daa";
- case 0x28:
- bddr = gb.ReadByte();
- CallStack.Add(GetAbsoluteAddress(bddr, gb));
- return "jr z,Label" + GetAbsoluteAddress(bddr, gb).ToString("X");
- case 0x29:
- return "add hl,hl";
- case 0x2A:
- return "ldi a,(hl)";
- case 0x2B:
- return "dec hl";
- case 0x2C:
- return "inc l";
- case 0x2D:
- return "dec l";
- case 0x2E:
- return "ld l," + Hex(gb.ReadByte());
- case 0x2F:
- return "cpl";
- case 0x30:
- bddr = gb.ReadByte();
- CallStack.Add(GetAbsoluteAddress(bddr, gb));
- return "jr nc,Label" + GetAbsoluteAddress(bddr, gb).ToString("X");
- case 0x31:
- return "ld sp," + Hex(ReadLWord(gb));
- case 0x32:
- return "ldd (hl),a";
- case 0x33:
- return "inc sp";
- case 0x34:
- return "inc (hl)";
- case 0x35:
- return "dec (hl)";
- case 0x36:
- return "ld (hl)," + Hex(gb.ReadByte());
- case 0x37:
- return "scf";
- case 0x38:
- bddr = gb.ReadByte();
- CallStack.Add(GetAbsoluteAddress(bddr, gb));
- return "jr c,Label" + GetAbsoluteAddress(bddr, gb).ToString("X");
- case 0x39:
- return "add hl,sp";
- case 0x3A:
- return "ldd a,(hl)";
- case 0x3B:
- return "dec sp";
- case 0x3C:
- return "inc a";
- case 0x3D:
- return "dec a";
- case 0x3E:
- A = gb.ReadByte();
- return "ld a," + Hex(A);
- case 0x3F:
- return "ccf";
- case 0x40:
- return "ld b,b";
- case 0x41:
- return "ld b,c";
- case 0x42:
- return "ld b,d";
- case 0x43:
- return "ld b,e";
- case 0x44:
- return "ld b,h";
- case 0x45:
- return "ld b,l";
- case 0x46:
- return "ld b,(hl)";
- case 0x47:
- return "ld b,a";
- case 0x48:
- return "ld c,b";
- case 0x49:
- return "ld c,c";
- case 0x4A:
- return "ld c,d";
- case 0x4B:
- return "ld c,e";
- case 0x4C:
- return "ld c,h";
- case 0x4D:
- return "ld c,l";
- case 0x4E:
- return "ld c,(hl)";
- case 0x4F:
- return "ld c,a";
- case 0x50:
- return "ld d,b";
- case 0x51:
- return "ld d,c";
- case 0x52:
- return "ld d,d";
- case 0x53:
- return "ld d,e";
- case 0x54:
- return "ld d,h";
- case 0x55:
- return "ld d,l";
- case 0x56:
- return "ld d,(hl)";
- case 0x57:
- return "ld d,a";
- case 0x58:
- return "ld e,b";
- case 0x59:
- return "ld e,c";
- case 0x5A:
- return "ld e,d";
- case 0x5B:
- return "ld e,e";
- case 0x5C:
- return "ld e,h";
- case 0x5D:
- return "ld e,l";
- case 0x5E:
- return "ld e,(hl)";
- case 0x5F:
- return "ld e,a";
- case 0x60:
- return "ld h,b";
- case 0x61:
- return "ld h,c";
- case 0x62:
- return "ld h,d";
- case 0x63:
- return "ld h,e";
- case 0x64:
- return "ld h,h";
- case 0x65:
- return "ld h,l";
- case 0x66:
- return "ld h,(hl)";
- case 0x67:
- return "ld h,a";
- case 0x68:
- return "ld l,b";
- case 0x69:
- return "ld l,c";
- case 0x6A:
- return "ld l,d";
- case 0x6B:
- return "ld l,e";
- case 0x6C:
- return "ld l,h";
- case 0x6D:
- return "ld l,l";
- case 0x6E:
- return "ld l,(hl)";
- case 0x6F:
- return "ld l,a";
- case 0x70:
- return "ld (hl),b";
- case 0x71:
- return "ld (hl),c";
- case 0x72:
- return "ld (hl),d";
- case 0x73:
- return "ld (hl),e";
- case 0x74:
- return "ld (hl),h";
- case 0x75:
- return "ld (hl),l";
- case 0x76:
- return "halt";
- case 0x77:
- return "ld (hl),a";
- case 0x78:
- return "ld a,b";
- case 0x79:
- return "ld a,c";
- case 0x7A:
- return "ld a,d";
- case 0x7B:
- return "ld a,e";
- case 0x7C:
- return "ld a,h";
- case 0x7D:
- return "ld a,l";
- case 0x7E:
- return "ld a,(hl)";
- case 0x7F:
- return "ld a,a";
- case 0x87:
- return "add a,a";
- case 0x80:
- return "add a,b";
- case 0x81:
- return "add a,c";
- case 0x82:
- return "add a,d";
- case 0x83:
- return "add a,e";
- case 0x84:
- return "add a,h";
- case 0x85:
- return "add a,l";
- case 0x86:
- return "add a,(hl)";
- case 0x88:
- return "adc a,b";
- case 0x89:
- return "adc a,c";
- case 0x8A:
- return "adc a,d";
- case 0x8B:
- return "adc a,e";
- case 0x8C:
- return "adc a,h";
- case 0x8D:
- return "adc a,l";
- case 0x8E:
- return "adc a,(hl)";
- case 0x8F:
- return "adc a,a";
- case 0x90:
- return "sub a,b";
- case 0x91:
- return "sub a,c";
- case 0x92:
- return "sub a,d";
- case 0x93:
- return "sub a,e";
- case 0x94:
- return "sub a,h";
- case 0x95:
- return "sub a,l";
- case 0x96:
- return "sub a,(hl)";
- case 0x97:
- return "sub a,a";
- case 0x98:
- return "sbc a,b";
- case 0x99:
- return "sbc a,c";
- case 0x9A:
- return "sbc a,d";
- case 0x9B:
- return "sbc a,e";
- case 0x9C:
- return "sbc a,h";
- case 0x9D:
- return "sbc a,l";
- case 0x9E:
- return "sbc a,(hl)";
- case 0x9F:
- return "sbc a,a";
- case 0xA0:
- return "and a,b";
- case 0xA1:
- return "and a,c";
- case 0xA2:
- return "and a,d";
- case 0xA3:
- return "and a,e";
- case 0xA4:
- return "and a,h";
- case 0xA5:
- return "and a,l";
- case 0xA6:
- return "and a,(hl)";
- case 0xA7:
- return "and a,a";
- case 0xA8:
- return "xor a,b";
- case 0xA9:
- return "xor a,c";
- case 0xAA:
- return "xor a,d";
- case 0xAB:
- return "xor a,e";
- case 0xAC:
- return "xor a,h";
- case 0xAD:
- return "xor a,l";
- case 0xAE:
- return "xor a,(hl)";
- case 0xAF:
- return "xor a,a";
- case 0xB0:
- return "or a,b";
- case 0xB1:
- return "or a,c";
- case 0xB2:
- return "or a,d";
- case 0xB3:
- return "or a,e";
- case 0xB4:
- return "or a,h";
- case 0xB5:
- return "or a,l";
- case 0xB6:
- return "or a,(hl)";
- case 0xB7:
- return "or a,a";
- case 0xB8:
- return "cp a,b";
- case 0xB9:
- return "cp a,c";
- case 0xBA:
- return "cp a,d";
- case 0xBB:
- return "cp a,e";
- case 0xBC:
- return "cp a,h";
- case 0xBD:
- return "cp a,l";
- case 0xBE:
- return "cp a,(hl)";
- case 0xC0:
- return "ret nz";
- case 0xC1:
- return "pop bc";
- case 0xC2:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "jp nz,Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xC3:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "jp Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xC4:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "call nz, Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xC5:
- return "push bc";
- case 0xC6:
- return "add a," + Hex(gb.ReadByte());
- case 0xC7:
- CallStack.Add(0x00);
- return "rst 00";
- case 0xC8:
- return "ret z";
- case 0xC9:
- return "ret";
- case 0xCA:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "jp z,Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xCB:
- byte newOpcode = gb.ReadByte();
- switch (newOpcode)
- {
- case 0x00:
- return "rlc b";
- case 0x01:
- return "rlc c";
- case 0x02:
- return "rlc d";
- case 0x03:
- return "rlc e";
- case 0x04:
- return "rlc h";
- case 0x05:
- return "rlc l";
- case 0x06:
- return "rlc (hl)";
- case 0x07:
- return "rlc a";
- case 0x08:
- return "rrc b";
- case 0x09:
- return "rrc c";
- case 0x0A:
- return "rrc d";
- case 0x0B:
- return "rrc e";
- case 0x0C:
- return "rrc h";
- case 0x0D:
- return "rrc l";
- case 0x0E:
- return "rrc (hl)";
- case 0x0F:
- return "rrc a";
- case 0x10:
- return "rl b";
- case 0x11:
- return "rl c";
- case 0x12:
- return "rl d";
- case 0x13:
- return "rl e";
- case 0x14:
- return "rl h";
- case 0x15:
- return "rl l";
- case 0x16:
- return "rl (hl)";
- case 0x17:
- return "rl a";
- case 0x18:
- return "rr b";
- case 0x19:
- return "rr c";
- case 0x1A:
- return "rr d";
- case 0x1B:
- return "rr e";
- case 0x1C:
- return "rr h";
- case 0x1D:
- return "rr l";
- case 0x1E:
- return "rr (hl)";
- case 0x1F:
- return "rr a";
- case 0x20:
- return "sla b";
- case 0x21:
- return "sla c";
- case 0x22:
- return "sla d";
- case 0x23:
- return "sla e";
- case 0x24:
- return "sla h";
- case 0x25:
- return "sla l";
- case 0x26:
- return "sla (hl)";
- case 0x27:
- return "sla a";
- case 0x28:
- return "sra b";
- case 0x29:
- return "sra c";
- case 0x2A:
- return "sra d";
- case 0x2B:
- return "sra e";
- case 0x2C:
- return "sra h";
- case 0x2D:
- return "sra l";
- case 0x2E:
- return "sra (hl)";
- case 0x2F:
- return "sra a";
- case 0x30:
- return "swap b";
- case 0x31:
- return "swap c";
- case 0x32:
- return "swap d";
- case 0x33:
- return "swap e";
- case 0x34:
- return "swap h";
- case 0x35:
- return "swap l";
- case 0x36:
- return "swap (hl)";
- case 0x37:
- return "swap a";
- case 0x38:
- return "slr b";
- case 0x39:
- return "slr c";
- case 0x3A:
- return "slr d";
- case 0x3B:
- return "slr e";
- case 0x3C:
- return "slr h";
- case 0x3D:
- return "slr l";
- case 0x3E:
- return "slr (hl)";
- case 0x3F:
- return "slr a";
- case 0x40:
- return "bit 0,b";
- case 0x41:
- return "bit 0,c";
- case 0x42:
- return "bit 0,d";
- case 0x43:
- return "bit 0,e";
- case 0x44:
- return "bit 0,h";
- case 0x45:
- return "bit 0,l";
- case 0x46:
- return "bit 0,(hl)";
- case 0x47:
- return "bit 0,a";
- case 0x48:
- return "bit 1,b";
- case 0x49:
- return "bit 1,c";
- case 0x4A:
- return "bit 1,d";
- case 0x4B:
- return "bit 1,e";
- case 0x4C:
- return "bit 1,h";
- case 0x4D:
- return "bit 1,l";
- case 0x4E:
- return "bit 1,(hl)";
- case 0x4F:
- return "bit 1,a";
- case 0x50:
- return "bit 2,b";
- case 0x51:
- return "bit 2,c";
- case 0x52:
- return "bit 2,d";
- case 0x53:
- return "bit 2,e";
- case 0x54:
- return "bit 2,h";
- case 0x55:
- return "bit 2,l";
- case 0x56:
- return "bit 2,(hl)";
- case 0x57:
- return "bit 2,a";
- case 0x58:
- return "bit 3,b";
- case 0x59:
- return "bit 3,c";
- case 0x5A:
- return "bit 3,d";
- case 0x5B:
- return "bit 3,e";
- case 0x5C:
- return "bit 3,h";
- case 0x5D:
- return "bit 3,l";
- case 0x5E:
- return "bit 3,(hl)";
- case 0x5F:
- return "bit 3,a";
- case 0x60:
- return "bit 4,b";
- case 0x61:
- return "bit 4,c";
- case 0x62:
- return "bit 4,d";
- case 0x63:
- return "bit 4,e";
- case 0x64:
- return "bit 4,h";
- case 0x65:
- return "bit 4,l";
- case 0x66:
- return "bit 4,(hl)";
- case 0x67:
- return "bit 4,a";
- case 0x68:
- return "bit 5,b";
- case 0x69:
- return "bit 5,c";
- case 0x6A:
- return "bit 5,d";
- case 0x6B:
- return "bit 5,e";
- case 0x6C:
- return "bit 5,h";
- case 0x6D:
- return "bit 5,l";
- case 0x6E:
- return "bit 5,(hl)";
- case 0x6F:
- return "bit 5,a";
- case 0x70:
- return "bit 6,b";
- case 0x71:
- return "bit 6,c";
- case 0x72:
- return "bit 6,d";
- case 0x73:
- return "bit 6,e";
- case 0x74:
- return "bit 6,h";
- case 0x75:
- return "bit 6,l";
- case 0x76:
- return "bit 6,(hl)";
- case 0x77:
- return "bit 6,a";
- case 0x78:
- return "bit 7,b";
- case 0x79:
- return "bit 7,c";
- case 0x7A:
- return "bit 7,d";
- case 0x7B:
- return "bit 7,e";
- case 0x7C:
- return "bit 7,h";
- case 0x7D:
- return "bit 7,l";
- case 0x7E:
- return "bit 7,(hl)";
- case 0x7F:
- return "bit 7,a";
- case 0x80:
- return "res 0,b";
- case 0x81:
- return "res 0,c";
- case 0x82:
- return "res 0,d";
- case 0x83:
- return "res 0,e";
- case 0x84:
- return "res 0,h";
- case 0x85:
- return "res 0,l";
- case 0x86:
- return "res 0,(hl)";
- case 0x87:
- return "res 0,a";
- case 0x88:
- return "res 1,b";
- case 0x89:
- return "res 1,c";
- case 0x8A:
- return "res 1,d";
- case 0x8B:
- return "res 1,e";
- case 0x8C:
- return "res 1,h";
- case 0x8D:
- return "res 1,l";
- case 0x8E:
- return "res 1,(hl)";
- case 0x8F:
- return "res 1,a";
- case 0x90:
- return "res 2,b";
- case 0x91:
- return "res 2,c";
- case 0x92:
- return "res 2,d";
- case 0x93:
- return "res 2,e";
- case 0x94:
- return "res 2,h";
- case 0x95:
- return "res 2,l";
- case 0x96:
- return "res 2,(hl)";
- case 0x97:
- return "res 2,a";
- case 0x98:
- return "res 3,b";
- case 0x99:
- return "res 3,c";
- case 0x9A:
- return "res 3,d";
- case 0x9B:
- return "res 3,e";
- case 0x9C:
- return "res 3,h";
- case 0x9D:
- return "res 3,l";
- case 0x9E:
- return "res 3,(hl)";
- case 0x9F:
- return "res 3,a";
- case 0xA0:
- return "res 4,b";
- case 0xA1:
- return "res 4,c";
- case 0xA2:
- return "res 4,d";
- case 0xA3:
- return "res 4,e";
- case 0xA4:
- return "res 4,h";
- case 0xA5:
- return "res 4,l";
- case 0xA6:
- return "res 4,(hl)";
- case 0xA7:
- return "res 4,a";
- case 0xA8:
- return "res 5,b";
- case 0xA9:
- return "res 5,c";
- case 0xAA:
- return "res 5,d";
- case 0xAB:
- return "res 5,e";
- case 0xAC:
- return "res 5,h";
- case 0xAD:
- return "res 5,l";
- case 0xAE:
- return "res 5,(hl)";
- case 0xAF:
- return "res 5,a";
- case 0xB0:
- return "res 6,b";
- case 0xB1:
- return "res 6,c";
- case 0xB2:
- return "res 6,d";
- case 0xB3:
- return "res 6,e";
- case 0xB4:
- return "res 6,h";
- case 0xB5:
- return "res 6,l";
- case 0xB6:
- return "res 6,(hl)";
- case 0xB7:
- return "res 6,a";
- case 0xB8:
- return "res 7,b";
- case 0xB9:
- return "res 7,c";
- case 0xBA:
- return "res 7,d";
- case 0xBB:
- return "res 7,e";
- case 0xBC:
- return "res 7,h";
- case 0xBD:
- return "res 7,l";
- case 0xBE:
- return "res 7,(hl)";
- case 0xBF:
- return "res 7,a";
- case 0xC0:
- return "set 0,b";
- case 0xC1:
- return "set 0,c";
- case 0xC2:
- return "set 0,d";
- case 0xC3:
- return "set 0,e";
- case 0xC4:
- return "set 0,h";
- case 0xC5:
- return "set 0,l";
- case 0xC6:
- return "set 0,(hl)";
- case 0xC7:
- return "set 0,a";
- case 0xC8:
- return "set 1,b";
- case 0xC9:
- return "set 1,c";
- case 0xCA:
- return "set 1,d";
- case 0xCB:
- return "set 1,e";
- case 0xCC:
- return "set 1,h";
- case 0xCD:
- return "set 1,l";
- case 0xCE:
- return "set 1,(hl)";
- case 0xCF:
- return "set 1,a";
- case 0xD0:
- return "set 2,b";
- case 0xD1:
- return "set 2,c";
- case 0xD2:
- return "set 2,d";
- case 0xD3:
- return "set 2,e";
- case 0xD4:
- return "set 2,h";
- case 0xD5:
- return "set 2,l";
- case 0xD6:
- return "set 2,(hl)";
- case 0xD7:
- return "set 2,a";
- case 0xD8:
- return "set 3,b";
- case 0xD9:
- return "set 3,c";
- case 0xDA:
- return "set 3,d";
- case 0xDB:
- return "set 3,e";
- case 0xDC:
- return "set 3,h";
- case 0xDD:
- return "set 3,l";
- case 0xDE:
- return "set 3,(hl)";
- case 0xDF:
- return "set 3,a";
- case 0xE0:
- return "set 4,b";
- case 0xE1:
- return "set 4,c";
- case 0xE2:
- return "set 4,d";
- case 0xE3:
- return "set 4,e";
- case 0xE4:
- return "set 4,h";
- case 0xE5:
- return "set 4,l";
- case 0xE6:
- return "set 4,(hl)";
- case 0xE7:
- return "set 4,a";
- case 0xE8:
- return "set 5,b";
- case 0xE9:
- return "set 5,c";
- case 0xEA:
- return "set 5,d";
- case 0xEB:
- return "set 5,e";
- case 0xEC:
- return "set 5,h";
- case 0xED:
- return "set 5,l";
- case 0xEE:
- return "set 5,(hl)";
- case 0xEF:
- return "set 5,a";
- case 0xF0:
- return "set 6,b";
- case 0xF1:
- return "set 6,c";
- case 0xF2:
- return "set 6,d";
- case 0xF3:
- return "set 6,e";
- case 0xF4:
- return "set 6,h";
- case 0xF5:
- return "set 6,l";
- case 0xF6:
- return "set 6,(hl)";
- case 0xF7:
- return "set 6,a";
- case 0xF8:
- return "set 7,b";
- case 0xF9:
- return "set 7,c";
- case 0xFA:
- return "set 7,d";
- case 0xFB:
- return "set 7,e";
- case 0xFC:
- return "set 7,h";
- case 0xFD:
- return "set 7,l";
- case 0xFE:
- return "set 7,(hl)";
- case 0xFF:
- return "set 7,a";
- }
- return ";unknown BC opcode " + Hex(newOpcode);
- case 0xCC:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "call z, Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xCD:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "call Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xCE:
- return "adc a," + Hex(gb.ReadByte());
- case 0xCF:
- CallStack.Add(0x08);
- return "rst 08";
- case 0xD0:
- return "ret nc";
- case 0xD1:
- return "pop de";
- case 0xD2:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "jp nc,Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xD4:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "call nc, Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xD5:
- return "push de";
- case 0xD6:
- return "sub a," + Hex(gb.ReadByte());
- case 0xD7:
- CallStack.Add(0x10);
- return "rst 10";
- case 0xD8:
- return "ret c";
- case 0xD9:
- return "reti";
- case 0xDA:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "jp c,Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xDC:
- addr = ReadLWord(gb);
- CallStack.Add(GetAbsoluteAddress(addr, gb));
- return "call c, Label" + GetAbsoluteAddress(addr, gb).ToString("X") + (addr > 0x7FFF ? " ;Warning - RAM-only procedure" : "");
- case 0xDF:
- CallStack.Add(0x18);
- return "rst 18";
- case 0xE0:
- return "ld (FF00+" + Hex(gb.ReadByte()) + "),a";
- case 0xE1:
- return "pop hl";
- case 0xE2:
- return "ld (FF00+c),a";
- case 0xE5:
- return "push hl";
- case 0xE6:
- return "and a," + Hex(gb.ReadByte());
- case 0xE7:
- CallStack.Add(0x20);
- return "rst 20";
- case 0xE8:
- return "add sp," + Hex(gb.ReadByte());
- case 0xE9:
- return "jp (hl)";
- case 0xEA:
- addr = ReadLWord(gb);
- if (addr >= 0x2000 && addr <= 0x2FFF)
- Bank = A;
- return "ld (" + Hex(addr) + "),a";
- case 0xEE:
- return "xor a," + Hex(gb.ReadByte());
- case 0xEF:
- CallStack.Add(0x28);
- return "rst 28";
- case 0xF0:
- return "ld a,(FF00+" + Hex(gb.ReadByte()) + ")";
- case 0xF1:
- return "pop af";
- case 0xF2:
- return "ld a,(FF00+c)";
- case 0xF3:
- return "di";
- case 0xF5:
- return "push af";
- case 0xF6:
- return "or a," + Hex(gb.ReadByte());
- case 0xF7:
- CallStack.Add(0x30);
- return "rst 30";
- case 0xF8:
- return "ld hl,sp+" + Hex(gb.ReadByte());
- case 0xF9:
- return "ld sp,hl";
- case 0xFA:
- return "ld a,(" + Hex(ReadLWord(gb)) + ")";
- case 0xFB:
- return "ei";
- case 0xFE:
- return "cp a," + Hex(gb.ReadByte());
- case 0xFF:
- CallStack.Add(0x38);
- return "rst 38";
- }
- return ";unknown opcode " + Hex(opcode);
- }
- public static string Hex(byte b)
- {
- string s = b.ToString("X");
- if (s.Length == 1)
- s = "0" + s;
- return s;
- }
- public static string Hex(ushort b)
- {
- string s = b.ToString("X");
- while (s.Length < 4)
- s = "0" + s;
- return s;
- }
- public static ushort ReadLWord(GBFile gb)
- {
- return (ushort)(gb.ReadByte() + gb.ReadByte() * 0x100);
- }
- public static int GetAbsoluteAddress(ushort u, GBFile gb)
- {
- if (u < 0x4000)
- return u;
- if (u < 0x8000 && u >= 0x4000)
- {
- if (gb.BufferLocation / 0x4000 != u / 0x4000)
- return (u - 0x4000) + (Bank * 0x4000);
- return (gb.BufferLocation / 0x4000 * 0x4000) + (u - 0x4000);
- }
- return u; //Shouldn't really happen
- }
- public static int GetAbsoluteAddress(byte b, GBFile gb)
- {
- if (b < 0x80)
- return gb.BufferLocation + b;
- return gb.BufferLocation - (0x100 - b);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement