1314 lines
25 KiB
C#
1314 lines
25 KiB
C#
namespace BizHawk.Emulation.Cores.Components.CP1610
|
|
{
|
|
public sealed partial class CP1610
|
|
{
|
|
public const string UNKNOWN = "???";
|
|
|
|
public string Disassemble(ushort pc, out int addrToAdvance)
|
|
{
|
|
addrToAdvance = 1;
|
|
byte dest, src, mem;
|
|
ushort addr, offset;
|
|
int decle2, decle3, cond, ext;
|
|
string result = "";
|
|
int opcode = ReadMemory(pc) & 0x3FF;
|
|
switch (opcode)
|
|
{
|
|
case 0x000:
|
|
return "HLT";
|
|
case 0x001:
|
|
return "SDBD";
|
|
case 0x002:
|
|
return "EIS";
|
|
case 0x003:
|
|
return "DIS";
|
|
case 0x004:
|
|
// 0000:0000:0000:0100 0000:00rr:aaaa:aaff 0000:00aa:aaaa:aaaa
|
|
decle2 = ReadMemory((ushort)(pc + 1));
|
|
decle3 = ReadMemory((ushort)(pc + 2));
|
|
// rr indicates the register into which to store the return address
|
|
dest = (byte)(((decle2 >> 8) & 0x3) + 4);
|
|
// aaaaaaaaaaaaaaaa indicates the address to where the CP1610 should Jump
|
|
addr = (ushort)(((decle2 << 8) & 0xFC00) | (decle3 & 0x3FF));
|
|
result = "J";
|
|
if (dest != 0x7)
|
|
{
|
|
result += "SR";
|
|
}
|
|
// ff indicates how to affect the Interrupt (I) flag in the CP1610
|
|
switch (decle2 & 0x3)
|
|
{
|
|
case 0x1:
|
|
result += "E";
|
|
break;
|
|
case 0x2:
|
|
result += "D";
|
|
break;
|
|
case 0x3:
|
|
// Unknown opcode.
|
|
return UNKNOWN;
|
|
}
|
|
if (dest != 0x3)
|
|
{
|
|
result += " R" + dest + ",";
|
|
}
|
|
result += string.Format(" ${0:X4}", addr);
|
|
addrToAdvance = 3;
|
|
return result;
|
|
case 0x005:
|
|
return "TCI";
|
|
case 0x006:
|
|
return "CLRC";
|
|
case 0x007:
|
|
return "SETC";
|
|
case 0x008:
|
|
case 0x009:
|
|
case 0x00A:
|
|
case 0x00B:
|
|
case 0x00C:
|
|
case 0x00D:
|
|
case 0x00E:
|
|
case 0x00F:
|
|
dest = (byte)(opcode & 0x7);
|
|
return "INCR R" + dest;
|
|
case 0x010:
|
|
case 0x011:
|
|
case 0x012:
|
|
case 0x013:
|
|
case 0x014:
|
|
case 0x015:
|
|
case 0x016:
|
|
case 0x017:
|
|
dest = (byte)(opcode & 0x7);
|
|
return "DECR R" + dest;
|
|
case 0x018:
|
|
case 0x019:
|
|
case 0x01A:
|
|
case 0x01B:
|
|
case 0x01C:
|
|
case 0x01D:
|
|
case 0x01E:
|
|
case 0x01F:
|
|
dest = (byte)(opcode & 0x7);
|
|
return "COMR R" + dest;
|
|
case 0x020:
|
|
case 0x021:
|
|
case 0x022:
|
|
case 0x023:
|
|
case 0x024:
|
|
case 0x025:
|
|
case 0x026:
|
|
case 0x027:
|
|
dest = (byte)(opcode & 0x7);
|
|
return "NEGR R" + dest;
|
|
case 0x028:
|
|
case 0x029:
|
|
case 0x02A:
|
|
case 0x02B:
|
|
case 0x02C:
|
|
case 0x02D:
|
|
case 0x02E:
|
|
case 0x02F:
|
|
dest = (byte)(opcode & 0x7);
|
|
return "ADCR R" + dest;
|
|
case 0x030:
|
|
case 0x031:
|
|
case 0x032:
|
|
case 0x033:
|
|
dest = (byte)(opcode & 0x3);
|
|
return "GSWD R" + dest;
|
|
case 0x034:
|
|
case 0x035:
|
|
result = "NOP";
|
|
if ((opcode & 0x1) != 0)
|
|
{
|
|
result += " 1";
|
|
}
|
|
return result;
|
|
case 0x036:
|
|
case 0x037:
|
|
result = "SIN";
|
|
if ((opcode & 0x1) != 0)
|
|
{
|
|
result += " 1";
|
|
}
|
|
return result;
|
|
case 0x038:
|
|
case 0x039:
|
|
case 0x03A:
|
|
case 0x03B:
|
|
case 0x03C:
|
|
case 0x03D:
|
|
case 0x03E:
|
|
case 0x03F:
|
|
src = (byte)(opcode & 0x7);
|
|
return "RSWD R" + src;
|
|
case 0x040:
|
|
case 0x041:
|
|
case 0x042:
|
|
case 0x043:
|
|
case 0x044:
|
|
case 0x045:
|
|
case 0x046:
|
|
case 0x047:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SWAP R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x048:
|
|
case 0x049:
|
|
case 0x04A:
|
|
case 0x04B:
|
|
case 0x04C:
|
|
case 0x04D:
|
|
case 0x04E:
|
|
case 0x04F:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SLL R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x050:
|
|
case 0x051:
|
|
case 0x052:
|
|
case 0x053:
|
|
case 0x054:
|
|
case 0x055:
|
|
case 0x056:
|
|
case 0x057:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "RLC R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x058:
|
|
case 0x059:
|
|
case 0x05A:
|
|
case 0x05B:
|
|
case 0x05C:
|
|
case 0x05D:
|
|
case 0x05E:
|
|
case 0x05F:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SLLC R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x060:
|
|
case 0x061:
|
|
case 0x062:
|
|
case 0x063:
|
|
case 0x064:
|
|
case 0x065:
|
|
case 0x066:
|
|
case 0x067:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SLR R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x068:
|
|
case 0x069:
|
|
case 0x06A:
|
|
case 0x06B:
|
|
case 0x06C:
|
|
case 0x06D:
|
|
case 0x06E:
|
|
case 0x06F:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SAR R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x070:
|
|
case 0x071:
|
|
case 0x072:
|
|
case 0x073:
|
|
case 0x074:
|
|
case 0x075:
|
|
case 0x076:
|
|
case 0x077:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "RRC R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x078:
|
|
case 0x079:
|
|
case 0x07A:
|
|
case 0x07B:
|
|
case 0x07C:
|
|
case 0x07D:
|
|
case 0x07E:
|
|
case 0x07F:
|
|
dest = (byte)(opcode & 0x3);
|
|
result = "SARC R" + dest;
|
|
if (((opcode >> 2) & 0x1) != 0)
|
|
{
|
|
result += ", 1";
|
|
}
|
|
return result;
|
|
case 0x080:
|
|
case 0x081:
|
|
case 0x082:
|
|
case 0x083:
|
|
case 0x084:
|
|
case 0x085:
|
|
case 0x086:
|
|
case 0x087:
|
|
case 0x088:
|
|
case 0x089:
|
|
case 0x08A:
|
|
case 0x08B:
|
|
case 0x08C:
|
|
case 0x08D:
|
|
case 0x08E:
|
|
case 0x08F:
|
|
case 0x090:
|
|
case 0x091:
|
|
case 0x092:
|
|
case 0x093:
|
|
case 0x094:
|
|
case 0x095:
|
|
case 0x096:
|
|
case 0x097:
|
|
case 0x098:
|
|
case 0x099:
|
|
case 0x09A:
|
|
case 0x09B:
|
|
case 0x09C:
|
|
case 0x09D:
|
|
case 0x09E:
|
|
case 0x09F:
|
|
case 0x0A0:
|
|
case 0x0A1:
|
|
case 0x0A2:
|
|
case 0x0A3:
|
|
case 0x0A4:
|
|
case 0x0A5:
|
|
case 0x0A6:
|
|
case 0x0A7:
|
|
case 0x0A8:
|
|
case 0x0A9:
|
|
case 0x0AA:
|
|
case 0x0AB:
|
|
case 0x0AC:
|
|
case 0x0AD:
|
|
case 0x0AE:
|
|
case 0x0AF:
|
|
case 0x0B0:
|
|
case 0x0B1:
|
|
case 0x0B2:
|
|
case 0x0B3:
|
|
case 0x0B4:
|
|
case 0x0B5:
|
|
case 0x0B6:
|
|
case 0x0B7:
|
|
case 0x0B8:
|
|
case 0x0B9:
|
|
case 0x0BA:
|
|
case 0x0BB:
|
|
case 0x0BC:
|
|
case 0x0BD:
|
|
case 0x0BE:
|
|
case 0x0BF:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "MOVR R" + src + ", R" + dest;
|
|
case 0x0C0:
|
|
case 0x0C1:
|
|
case 0x0C2:
|
|
case 0x0C3:
|
|
case 0x0C4:
|
|
case 0x0C5:
|
|
case 0x0C6:
|
|
case 0x0C7:
|
|
case 0x0C8:
|
|
case 0x0C9:
|
|
case 0x0CA:
|
|
case 0x0CB:
|
|
case 0x0CC:
|
|
case 0x0CD:
|
|
case 0x0CE:
|
|
case 0x0CF:
|
|
case 0x0D0:
|
|
case 0x0D1:
|
|
case 0x0D2:
|
|
case 0x0D3:
|
|
case 0x0D4:
|
|
case 0x0D5:
|
|
case 0x0D6:
|
|
case 0x0D7:
|
|
case 0x0D8:
|
|
case 0x0D9:
|
|
case 0x0DA:
|
|
case 0x0DB:
|
|
case 0x0DC:
|
|
case 0x0DD:
|
|
case 0x0DE:
|
|
case 0x0DF:
|
|
case 0x0E0:
|
|
case 0x0E1:
|
|
case 0x0E2:
|
|
case 0x0E3:
|
|
case 0x0E4:
|
|
case 0x0E5:
|
|
case 0x0E6:
|
|
case 0x0E7:
|
|
case 0x0E8:
|
|
case 0x0E9:
|
|
case 0x0EA:
|
|
case 0x0EB:
|
|
case 0x0EC:
|
|
case 0x0ED:
|
|
case 0x0EE:
|
|
case 0x0EF:
|
|
case 0x0F0:
|
|
case 0x0F1:
|
|
case 0x0F2:
|
|
case 0x0F3:
|
|
case 0x0F4:
|
|
case 0x0F5:
|
|
case 0x0F6:
|
|
case 0x0F7:
|
|
case 0x0F8:
|
|
case 0x0F9:
|
|
case 0x0FA:
|
|
case 0x0FB:
|
|
case 0x0FC:
|
|
case 0x0FD:
|
|
case 0x0FE:
|
|
case 0x0FF:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "ADDR R" + src + ", R" + dest;
|
|
case 0x100:
|
|
case 0x101:
|
|
case 0x102:
|
|
case 0x103:
|
|
case 0x104:
|
|
case 0x105:
|
|
case 0x106:
|
|
case 0x107:
|
|
case 0x108:
|
|
case 0x109:
|
|
case 0x10A:
|
|
case 0x10B:
|
|
case 0x10C:
|
|
case 0x10D:
|
|
case 0x10E:
|
|
case 0x10F:
|
|
case 0x110:
|
|
case 0x111:
|
|
case 0x112:
|
|
case 0x113:
|
|
case 0x114:
|
|
case 0x115:
|
|
case 0x116:
|
|
case 0x117:
|
|
case 0x118:
|
|
case 0x119:
|
|
case 0x11A:
|
|
case 0x11B:
|
|
case 0x11C:
|
|
case 0x11D:
|
|
case 0x11E:
|
|
case 0x11F:
|
|
case 0x120:
|
|
case 0x121:
|
|
case 0x122:
|
|
case 0x123:
|
|
case 0x124:
|
|
case 0x125:
|
|
case 0x126:
|
|
case 0x127:
|
|
case 0x128:
|
|
case 0x129:
|
|
case 0x12A:
|
|
case 0x12B:
|
|
case 0x12C:
|
|
case 0x12D:
|
|
case 0x12E:
|
|
case 0x12F:
|
|
case 0x130:
|
|
case 0x131:
|
|
case 0x132:
|
|
case 0x133:
|
|
case 0x134:
|
|
case 0x135:
|
|
case 0x136:
|
|
case 0x137:
|
|
case 0x138:
|
|
case 0x139:
|
|
case 0x13A:
|
|
case 0x13B:
|
|
case 0x13C:
|
|
case 0x13D:
|
|
case 0x13E:
|
|
case 0x13F:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "SUBR R" + src + ", R" + dest;
|
|
case 0x140:
|
|
case 0x141:
|
|
case 0x142:
|
|
case 0x143:
|
|
case 0x144:
|
|
case 0x145:
|
|
case 0x146:
|
|
case 0x147:
|
|
case 0x148:
|
|
case 0x149:
|
|
case 0x14A:
|
|
case 0x14B:
|
|
case 0x14C:
|
|
case 0x14D:
|
|
case 0x14E:
|
|
case 0x14F:
|
|
case 0x150:
|
|
case 0x151:
|
|
case 0x152:
|
|
case 0x153:
|
|
case 0x154:
|
|
case 0x155:
|
|
case 0x156:
|
|
case 0x157:
|
|
case 0x158:
|
|
case 0x159:
|
|
case 0x15A:
|
|
case 0x15B:
|
|
case 0x15C:
|
|
case 0x15D:
|
|
case 0x15E:
|
|
case 0x15F:
|
|
case 0x160:
|
|
case 0x161:
|
|
case 0x162:
|
|
case 0x163:
|
|
case 0x164:
|
|
case 0x165:
|
|
case 0x166:
|
|
case 0x167:
|
|
case 0x168:
|
|
case 0x169:
|
|
case 0x16A:
|
|
case 0x16B:
|
|
case 0x16C:
|
|
case 0x16D:
|
|
case 0x16E:
|
|
case 0x16F:
|
|
case 0x170:
|
|
case 0x171:
|
|
case 0x172:
|
|
case 0x173:
|
|
case 0x174:
|
|
case 0x175:
|
|
case 0x176:
|
|
case 0x177:
|
|
case 0x178:
|
|
case 0x179:
|
|
case 0x17A:
|
|
case 0x17B:
|
|
case 0x17C:
|
|
case 0x17D:
|
|
case 0x17E:
|
|
case 0x17F:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "CMPR R" + src + ", R" + dest;
|
|
case 0x180:
|
|
case 0x181:
|
|
case 0x182:
|
|
case 0x183:
|
|
case 0x184:
|
|
case 0x185:
|
|
case 0x186:
|
|
case 0x187:
|
|
case 0x188:
|
|
case 0x189:
|
|
case 0x18A:
|
|
case 0x18B:
|
|
case 0x18C:
|
|
case 0x18D:
|
|
case 0x18E:
|
|
case 0x18F:
|
|
case 0x190:
|
|
case 0x191:
|
|
case 0x192:
|
|
case 0x193:
|
|
case 0x194:
|
|
case 0x195:
|
|
case 0x196:
|
|
case 0x197:
|
|
case 0x198:
|
|
case 0x199:
|
|
case 0x19A:
|
|
case 0x19B:
|
|
case 0x19C:
|
|
case 0x19D:
|
|
case 0x19E:
|
|
case 0x19F:
|
|
case 0x1A0:
|
|
case 0x1A1:
|
|
case 0x1A2:
|
|
case 0x1A3:
|
|
case 0x1A4:
|
|
case 0x1A5:
|
|
case 0x1A6:
|
|
case 0x1A7:
|
|
case 0x1A8:
|
|
case 0x1A9:
|
|
case 0x1AA:
|
|
case 0x1AB:
|
|
case 0x1AC:
|
|
case 0x1AD:
|
|
case 0x1AE:
|
|
case 0x1AF:
|
|
case 0x1B0:
|
|
case 0x1B1:
|
|
case 0x1B2:
|
|
case 0x1B3:
|
|
case 0x1B4:
|
|
case 0x1B5:
|
|
case 0x1B6:
|
|
case 0x1B7:
|
|
case 0x1B8:
|
|
case 0x1B9:
|
|
case 0x1BA:
|
|
case 0x1BB:
|
|
case 0x1BC:
|
|
case 0x1BD:
|
|
case 0x1BE:
|
|
case 0x1BF:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "ANDR R" + src + ", R" + dest;
|
|
case 0x1C0:
|
|
case 0x1C1:
|
|
case 0x1C2:
|
|
case 0x1C3:
|
|
case 0x1C4:
|
|
case 0x1C5:
|
|
case 0x1C6:
|
|
case 0x1C7:
|
|
case 0x1C8:
|
|
case 0x1C9:
|
|
case 0x1CA:
|
|
case 0x1CB:
|
|
case 0x1CC:
|
|
case 0x1CD:
|
|
case 0x1CE:
|
|
case 0x1CF:
|
|
case 0x1D0:
|
|
case 0x1D1:
|
|
case 0x1D2:
|
|
case 0x1D3:
|
|
case 0x1D4:
|
|
case 0x1D5:
|
|
case 0x1D6:
|
|
case 0x1D7:
|
|
case 0x1D8:
|
|
case 0x1D9:
|
|
case 0x1DA:
|
|
case 0x1DB:
|
|
case 0x1DC:
|
|
case 0x1DD:
|
|
case 0x1DE:
|
|
case 0x1DF:
|
|
case 0x1E0:
|
|
case 0x1E1:
|
|
case 0x1E2:
|
|
case 0x1E3:
|
|
case 0x1E4:
|
|
case 0x1E5:
|
|
case 0x1E6:
|
|
case 0x1E7:
|
|
case 0x1E8:
|
|
case 0x1E9:
|
|
case 0x1EA:
|
|
case 0x1EB:
|
|
case 0x1EC:
|
|
case 0x1ED:
|
|
case 0x1EE:
|
|
case 0x1EF:
|
|
case 0x1F0:
|
|
case 0x1F1:
|
|
case 0x1F2:
|
|
case 0x1F3:
|
|
case 0x1F4:
|
|
case 0x1F5:
|
|
case 0x1F6:
|
|
case 0x1F7:
|
|
case 0x1F8:
|
|
case 0x1F9:
|
|
case 0x1FA:
|
|
case 0x1FB:
|
|
case 0x1FC:
|
|
case 0x1FD:
|
|
case 0x1FE:
|
|
case 0x1FF:
|
|
src = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "XORR R" + src + ", R" + dest;
|
|
// Branch Forward, no External Condition
|
|
case 0x200: // B
|
|
case 0x201: // BC
|
|
case 0x202: // BOV
|
|
case 0x203: // BPL
|
|
case 0x204: // BEQ
|
|
case 0x205: // BLT
|
|
case 0x206: // BLE
|
|
case 0x207: // BUSC
|
|
case 0x208: // NOPP
|
|
case 0x209: // BNC
|
|
case 0x20A: // BNOV
|
|
case 0x20B: // BMI
|
|
case 0x20C: // BNEQ
|
|
case 0x20D: // BGE
|
|
case 0x20E: // BGT
|
|
case 0x20F: // BESC
|
|
// Branch Forward, Exteranl Condition (BEXT)
|
|
case 0x210:
|
|
case 0x211:
|
|
case 0x212:
|
|
case 0x213:
|
|
case 0x214:
|
|
case 0x215:
|
|
case 0x216:
|
|
case 0x217:
|
|
case 0x218:
|
|
case 0x219:
|
|
case 0x21A:
|
|
case 0x21B:
|
|
case 0x21C:
|
|
case 0x21D:
|
|
case 0x21E:
|
|
case 0x21F:
|
|
// Branch Reverse, no External Condition
|
|
case 0x220: // B
|
|
case 0x221: // BC
|
|
case 0x222: // BOV
|
|
case 0x223: // BPL
|
|
case 0x224: // BEQ
|
|
case 0x225: // BLT
|
|
case 0x226: // BLE
|
|
case 0x227: // BUSC
|
|
case 0x228: // NOPP
|
|
case 0x229: // BNC
|
|
case 0x22A: // BNOV
|
|
case 0x22B: // BMI
|
|
case 0x22C: // BNEQ
|
|
case 0x22D: // BGE
|
|
case 0x22E: // BGT
|
|
case 0x22F: // BESC
|
|
// Branch Reverse, Exteranl Condition (BEXT)
|
|
case 0x230:
|
|
case 0x231:
|
|
case 0x232:
|
|
case 0x233:
|
|
case 0x234:
|
|
case 0x235:
|
|
case 0x236:
|
|
case 0x237:
|
|
case 0x238:
|
|
case 0x239:
|
|
case 0x23A:
|
|
case 0x23B:
|
|
case 0x23C:
|
|
case 0x23D:
|
|
case 0x23E:
|
|
case 0x23F:
|
|
offset = ReadMemory((ushort)(pc + 1));
|
|
cond = opcode & 0xF;
|
|
ext = opcode & 0x10;
|
|
if (ext != 0)
|
|
{
|
|
result = "BEXT";
|
|
}
|
|
else
|
|
{
|
|
switch (cond)
|
|
{
|
|
case 0x0:
|
|
result = "B";
|
|
break;
|
|
case 0x1:
|
|
result = "BC";
|
|
break;
|
|
case 0x2:
|
|
result = "BOV";
|
|
break;
|
|
case 0x3:
|
|
result = "BPL";
|
|
break;
|
|
case 0x4:
|
|
result = "BEQ";
|
|
break;
|
|
case 0x5:
|
|
result = "BLT";
|
|
break;
|
|
case 0x6:
|
|
result = "BLE";
|
|
break;
|
|
case 0x7:
|
|
result = "BUSC";
|
|
break;
|
|
case 0x8:
|
|
result = "NOPP";
|
|
break;
|
|
case 0x9:
|
|
result = "BNC";
|
|
break;
|
|
case 0xA:
|
|
result = "BNOV";
|
|
break;
|
|
case 0xB:
|
|
result = "BMI";
|
|
break;
|
|
case 0xC:
|
|
result = "BNEQ";
|
|
break;
|
|
case 0xD:
|
|
result = "BGE";
|
|
break;
|
|
case 0xE:
|
|
result = "BGT";
|
|
break;
|
|
case 0xF:
|
|
result = "BESC";
|
|
break;
|
|
}
|
|
}
|
|
if (cond != 0x8)
|
|
{
|
|
// Branch in the reverse direction by negating the offset and subtracting 1.
|
|
if (((opcode >> 5) & 0x1) != 0)
|
|
{
|
|
offset = (ushort)(-offset - 1);
|
|
}
|
|
result += string.Format(" ${0:X4}", offset);
|
|
if (ext != 0)
|
|
{
|
|
result += string.Format(", ${0:X1}", opcode & 0x8);
|
|
}
|
|
}
|
|
addrToAdvance = 2;
|
|
return result;
|
|
case 0x240:
|
|
case 0x241:
|
|
case 0x242:
|
|
case 0x243:
|
|
case 0x244:
|
|
case 0x245:
|
|
case 0x246:
|
|
case 0x247:
|
|
src = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("MVO R{0:d}, ${1:X4}", src, addr);
|
|
case 0x248:
|
|
case 0x249:
|
|
case 0x24A:
|
|
case 0x24B:
|
|
case 0x24C:
|
|
case 0x24D:
|
|
case 0x24E:
|
|
case 0x24F:
|
|
case 0x250:
|
|
case 0x251:
|
|
case 0x252:
|
|
case 0x253:
|
|
case 0x254:
|
|
case 0x255:
|
|
case 0x256:
|
|
case 0x257:
|
|
case 0x258:
|
|
case 0x259:
|
|
case 0x25A:
|
|
case 0x25B:
|
|
case 0x25C:
|
|
case 0x25D:
|
|
case 0x25E:
|
|
case 0x25F:
|
|
case 0x260:
|
|
case 0x261:
|
|
case 0x262:
|
|
case 0x263:
|
|
case 0x264:
|
|
case 0x265:
|
|
case 0x266:
|
|
case 0x267:
|
|
case 0x268:
|
|
case 0x269:
|
|
case 0x26A:
|
|
case 0x26B:
|
|
case 0x26C:
|
|
case 0x26D:
|
|
case 0x26E:
|
|
case 0x26F:
|
|
case 0x270:
|
|
case 0x271:
|
|
case 0x272:
|
|
case 0x273:
|
|
case 0x274:
|
|
case 0x275:
|
|
case 0x276:
|
|
case 0x277:
|
|
case 0x278:
|
|
case 0x279:
|
|
case 0x27A:
|
|
case 0x27B:
|
|
case 0x27C:
|
|
case 0x27D:
|
|
case 0x27E:
|
|
case 0x27F:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
src = (byte)(opcode & 0x7);
|
|
return "MVO@ R" + src + ", R" + mem;
|
|
case 0x280:
|
|
case 0x281:
|
|
case 0x282:
|
|
case 0x283:
|
|
case 0x284:
|
|
case 0x285:
|
|
case 0x286:
|
|
case 0x287:
|
|
dest = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("MVI R{0:d}, ${1:X4}", dest, addr);
|
|
case 0x288:
|
|
case 0x289:
|
|
case 0x28A:
|
|
case 0x28B:
|
|
case 0x28C:
|
|
case 0x28D:
|
|
case 0x28E:
|
|
case 0x28F:
|
|
case 0x290:
|
|
case 0x291:
|
|
case 0x292:
|
|
case 0x293:
|
|
case 0x294:
|
|
case 0x295:
|
|
case 0x296:
|
|
case 0x297:
|
|
case 0x298:
|
|
case 0x299:
|
|
case 0x29A:
|
|
case 0x29B:
|
|
case 0x29C:
|
|
case 0x29D:
|
|
case 0x29E:
|
|
case 0x29F:
|
|
case 0x2A0:
|
|
case 0x2A1:
|
|
case 0x2A2:
|
|
case 0x2A3:
|
|
case 0x2A4:
|
|
case 0x2A5:
|
|
case 0x2A6:
|
|
case 0x2A7:
|
|
case 0x2A8:
|
|
case 0x2A9:
|
|
case 0x2AA:
|
|
case 0x2AB:
|
|
case 0x2AC:
|
|
case 0x2AD:
|
|
case 0x2AE:
|
|
case 0x2AF:
|
|
case 0x2B0:
|
|
case 0x2B1:
|
|
case 0x2B2:
|
|
case 0x2B3:
|
|
case 0x2B4:
|
|
case 0x2B5:
|
|
case 0x2B6:
|
|
case 0x2B7:
|
|
case 0x2B8:
|
|
case 0x2B9:
|
|
case 0x2BA:
|
|
case 0x2BB:
|
|
case 0x2BC:
|
|
case 0x2BD:
|
|
case 0x2BE:
|
|
case 0x2BF:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "MVI@ R" + mem + ", R" + dest;
|
|
case 0x2C0:
|
|
case 0x2C1:
|
|
case 0x2C2:
|
|
case 0x2C3:
|
|
case 0x2C4:
|
|
case 0x2C5:
|
|
case 0x2C6:
|
|
case 0x2C7:
|
|
dest = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("ADD R{0:d}, ${1:X4}", dest, addr);
|
|
case 0x2C8:
|
|
case 0x2C9:
|
|
case 0x2CA:
|
|
case 0x2CB:
|
|
case 0x2CC:
|
|
case 0x2CD:
|
|
case 0x2CE:
|
|
case 0x2CF:
|
|
case 0x2D0:
|
|
case 0x2D1:
|
|
case 0x2D2:
|
|
case 0x2D3:
|
|
case 0x2D4:
|
|
case 0x2D5:
|
|
case 0x2D6:
|
|
case 0x2D7:
|
|
case 0x2D8:
|
|
case 0x2D9:
|
|
case 0x2DA:
|
|
case 0x2DB:
|
|
case 0x2DC:
|
|
case 0x2DD:
|
|
case 0x2DE:
|
|
case 0x2DF:
|
|
case 0x2E0:
|
|
case 0x2E1:
|
|
case 0x2E2:
|
|
case 0x2E3:
|
|
case 0x2E4:
|
|
case 0x2E5:
|
|
case 0x2E6:
|
|
case 0x2E7:
|
|
case 0x2E8:
|
|
case 0x2E9:
|
|
case 0x2EA:
|
|
case 0x2EB:
|
|
case 0x2EC:
|
|
case 0x2ED:
|
|
case 0x2EE:
|
|
case 0x2EF:
|
|
case 0x2F0:
|
|
case 0x2F1:
|
|
case 0x2F2:
|
|
case 0x2F3:
|
|
case 0x2F4:
|
|
case 0x2F5:
|
|
case 0x2F6:
|
|
case 0x2F7:
|
|
case 0x2F8:
|
|
case 0x2F9:
|
|
case 0x2FA:
|
|
case 0x2FB:
|
|
case 0x2FC:
|
|
case 0x2FD:
|
|
case 0x2FE:
|
|
case 0x2FF:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "ADD@ R" + mem + ", R" + dest;
|
|
case 0x300:
|
|
case 0x301:
|
|
case 0x302:
|
|
case 0x303:
|
|
case 0x304:
|
|
case 0x305:
|
|
case 0x306:
|
|
case 0x307:
|
|
mem = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("SUB R{0:d}, ${1:X4}", mem, addr);
|
|
case 0x308:
|
|
case 0x309:
|
|
case 0x30A:
|
|
case 0x30B:
|
|
case 0x30C:
|
|
case 0x30D:
|
|
case 0x30E:
|
|
case 0x30F:
|
|
case 0x310:
|
|
case 0x311:
|
|
case 0x312:
|
|
case 0x313:
|
|
case 0x314:
|
|
case 0x315:
|
|
case 0x316:
|
|
case 0x317:
|
|
case 0x318:
|
|
case 0x319:
|
|
case 0x31A:
|
|
case 0x31B:
|
|
case 0x31C:
|
|
case 0x31D:
|
|
case 0x31E:
|
|
case 0x31F:
|
|
case 0x320:
|
|
case 0x321:
|
|
case 0x322:
|
|
case 0x323:
|
|
case 0x324:
|
|
case 0x325:
|
|
case 0x326:
|
|
case 0x327:
|
|
case 0x328:
|
|
case 0x329:
|
|
case 0x32A:
|
|
case 0x32B:
|
|
case 0x32C:
|
|
case 0x32D:
|
|
case 0x32E:
|
|
case 0x32F:
|
|
case 0x330:
|
|
case 0x331:
|
|
case 0x332:
|
|
case 0x333:
|
|
case 0x334:
|
|
case 0x335:
|
|
case 0x336:
|
|
case 0x337:
|
|
case 0x338:
|
|
case 0x339:
|
|
case 0x33A:
|
|
case 0x33B:
|
|
case 0x33C:
|
|
case 0x33D:
|
|
case 0x33E:
|
|
case 0x33F:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "SUB@ R" + mem + ", R" + dest;
|
|
case 0x340:
|
|
case 0x341:
|
|
case 0x342:
|
|
case 0x343:
|
|
case 0x344:
|
|
case 0x345:
|
|
case 0x346:
|
|
case 0x347:
|
|
mem = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("CMP R{0:d}, ${1:X4}", mem, addr);
|
|
case 0x348:
|
|
case 0x349:
|
|
case 0x34A:
|
|
case 0x34B:
|
|
case 0x34C:
|
|
case 0x34D:
|
|
case 0x34E:
|
|
case 0x34F:
|
|
case 0x350:
|
|
case 0x351:
|
|
case 0x352:
|
|
case 0x353:
|
|
case 0x354:
|
|
case 0x355:
|
|
case 0x356:
|
|
case 0x357:
|
|
case 0x358:
|
|
case 0x359:
|
|
case 0x35A:
|
|
case 0x35B:
|
|
case 0x35C:
|
|
case 0x35D:
|
|
case 0x35E:
|
|
case 0x35F:
|
|
case 0x360:
|
|
case 0x361:
|
|
case 0x362:
|
|
case 0x363:
|
|
case 0x364:
|
|
case 0x365:
|
|
case 0x366:
|
|
case 0x367:
|
|
case 0x368:
|
|
case 0x369:
|
|
case 0x36A:
|
|
case 0x36B:
|
|
case 0x36C:
|
|
case 0x36D:
|
|
case 0x36E:
|
|
case 0x36F:
|
|
case 0x370:
|
|
case 0x371:
|
|
case 0x372:
|
|
case 0x373:
|
|
case 0x374:
|
|
case 0x375:
|
|
case 0x376:
|
|
case 0x377:
|
|
case 0x378:
|
|
case 0x379:
|
|
case 0x37A:
|
|
case 0x37B:
|
|
case 0x37C:
|
|
case 0x37D:
|
|
case 0x37E:
|
|
case 0x37F:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "CMP@ R" + mem + ", R" + dest;
|
|
case 0x380:
|
|
case 0x381:
|
|
case 0x382:
|
|
case 0x383:
|
|
case 0x384:
|
|
case 0x385:
|
|
case 0x386:
|
|
case 0x387:
|
|
mem = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("AND R{0:d}, ${1:X4}", mem, addr);
|
|
case 0x388:
|
|
case 0x389:
|
|
case 0x38A:
|
|
case 0x38B:
|
|
case 0x38C:
|
|
case 0x38D:
|
|
case 0x38E:
|
|
case 0x38F:
|
|
case 0x390:
|
|
case 0x391:
|
|
case 0x392:
|
|
case 0x393:
|
|
case 0x394:
|
|
case 0x395:
|
|
case 0x396:
|
|
case 0x397:
|
|
case 0x398:
|
|
case 0x399:
|
|
case 0x39A:
|
|
case 0x39B:
|
|
case 0x39C:
|
|
case 0x39D:
|
|
case 0x39E:
|
|
case 0x39F:
|
|
case 0x3A0:
|
|
case 0x3A1:
|
|
case 0x3A2:
|
|
case 0x3A3:
|
|
case 0x3A4:
|
|
case 0x3A5:
|
|
case 0x3A6:
|
|
case 0x3A7:
|
|
case 0x3A8:
|
|
case 0x3A9:
|
|
case 0x3AA:
|
|
case 0x3AB:
|
|
case 0x3AC:
|
|
case 0x3AD:
|
|
case 0x3AE:
|
|
case 0x3AF:
|
|
case 0x3B0:
|
|
case 0x3B1:
|
|
case 0x3B2:
|
|
case 0x3B3:
|
|
case 0x3B4:
|
|
case 0x3B5:
|
|
case 0x3B6:
|
|
case 0x3B7:
|
|
case 0x3B8:
|
|
case 0x3B9:
|
|
case 0x3BA:
|
|
case 0x3BB:
|
|
case 0x3BC:
|
|
case 0x3BD:
|
|
case 0x3BE:
|
|
case 0x3BF:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "AND@ R" + mem + ", R" + dest;
|
|
case 0x3C0:
|
|
case 0x3C1:
|
|
case 0x3C2:
|
|
case 0x3C3:
|
|
case 0x3C4:
|
|
case 0x3C5:
|
|
case 0x3C6:
|
|
case 0x3C7:
|
|
mem = (byte)(opcode & 0x7);
|
|
addr = ReadMemory((ushort)(pc + 1));
|
|
addrToAdvance = 2;
|
|
return string.Format("XOR R{0:d}, ${1:X4}", mem, addr);
|
|
case 0x3C8:
|
|
case 0x3C9:
|
|
case 0x3CA:
|
|
case 0x3CB:
|
|
case 0x3CC:
|
|
case 0x3CD:
|
|
case 0x3CE:
|
|
case 0x3CF:
|
|
case 0x3D0:
|
|
case 0x3D1:
|
|
case 0x3D2:
|
|
case 0x3D3:
|
|
case 0x3D4:
|
|
case 0x3D5:
|
|
case 0x3D6:
|
|
case 0x3D7:
|
|
case 0x3D8:
|
|
case 0x3D9:
|
|
case 0x3DA:
|
|
case 0x3DB:
|
|
case 0x3DC:
|
|
case 0x3DD:
|
|
case 0x3DE:
|
|
case 0x3DF:
|
|
case 0x3E0:
|
|
case 0x3E1:
|
|
case 0x3E2:
|
|
case 0x3E3:
|
|
case 0x3E4:
|
|
case 0x3E5:
|
|
case 0x3E6:
|
|
case 0x3E7:
|
|
case 0x3E8:
|
|
case 0x3E9:
|
|
case 0x3EA:
|
|
case 0x3EB:
|
|
case 0x3EC:
|
|
case 0x3ED:
|
|
case 0x3EE:
|
|
case 0x3EF:
|
|
case 0x3F0:
|
|
case 0x3F1:
|
|
case 0x3F2:
|
|
case 0x3F3:
|
|
case 0x3F4:
|
|
case 0x3F5:
|
|
case 0x3F6:
|
|
case 0x3F7:
|
|
case 0x3F8:
|
|
case 0x3F9:
|
|
case 0x3FA:
|
|
case 0x3FB:
|
|
case 0x3FC:
|
|
case 0x3FD:
|
|
case 0x3FE:
|
|
case 0x3FF:
|
|
mem = (byte)((opcode >> 3) & 0x7);
|
|
dest = (byte)(opcode & 0x7);
|
|
return "XOR@ R" + mem + ", R" + dest;
|
|
}
|
|
return UNKNOWN;
|
|
}
|
|
}
|
|
}
|