MAME:MC68000 改回用委托数组

This commit is contained in:
sin365 2025-11-12 01:41:00 +08:00
parent ec292251e0
commit dc4e9f3c84
5 changed files with 1069 additions and 149 deletions

View File

@ -163,8 +163,8 @@ namespace cpu.m68000
public MC68000()
{
//倒是已经废弃
//BuildOpcodeTable();
//还是使用Action[]吧
BuildOpcodeTable();
}
@ -205,7 +205,7 @@ namespace cpu.m68000
PC = ReadOpLong(4);
}
//public Action[] Opcodes = new Action[0x10000];
public Action[] Opcodes = new Action[0x10000];
public ushort op;
public void Step()
@ -213,10 +213,41 @@ namespace cpu.m68000
//EmuLogger.Log(Disassemble(PC));
op = (ushort)ReadOpWord(PC); PC += 2;
//Opcodes[op]();
DoOpCode(op);
Opcodes[op]();
//DoOpCode(op);
}
//public override int ExecuteCycles(int cycles)
//{
// if (!stopped)
// {
// pendingCycles = cycles;
// int ran;
// pendingCycles -= int_cycles;
// int_cycles = 0;
// do
// {
// int prevCycles = pendingCycles;
// PPC = PC;
// op = (ushort)ReadOpWord(PC); PC += 2;
// //Opcodes[op]();
// DoOpCode(op);
// m68ki_check_interrupts();
// int delta = prevCycles - pendingCycles;
// totalExecutedCycles += (ulong)delta;
// }
// while (pendingCycles > 0);
// pendingCycles -= int_cycles;
// int_cycles = 0;
// ran = cycles - pendingCycles;
// return ran;
// }
// pendingCycles = 0;
// int_cycles = 0;
// return cycles;
//}
//手动内联
public override int ExecuteCycles(int cycles)
{
if (!stopped)
@ -230,9 +261,26 @@ namespace cpu.m68000
int prevCycles = pendingCycles;
PPC = PC;
op = (ushort)ReadOpWord(PC); PC += 2;
//Opcodes[op]();
DoOpCode(op);
m68ki_check_interrupts();
Opcodes[op]();
//DoOpCode(op);
//m68ki_check_interrupts();
if (Interrupt > 0 && (Interrupt > InterruptMaskLevel || Interrupt > 7))
{
stopped = false;
//int vector = Cpuint.cpu_irq_callback(cpunum, Interrupt);
short sr = (short)SR; // capture current SR.
S = true; // switch to supervisor mode, if not already in it.
A[7].s32 -= 4; // Push PC on stack
WriteLong(A[7].s32, PC);
A[7].s32 -= 2; // Push SR on stack
WriteWord(A[7].s32, sr);
PC = ReadLong((24 + Interrupt) * 4); // Jump to interrupt vector
InterruptMaskLevel = Interrupt; // Set interrupt mask to level currently being entered
Interrupt = 0; // "ack" interrupt. Note: this is wrong.
int_cycles += 0x2c;
}
int delta = prevCycles - pendingCycles;
totalExecutedCycles += (ulong)delta;
}

View File

@ -1,126 +1,126 @@
namespace cpu.m68000
{
partial class MC68000
{
//namespace cpu.m68000
//{
// partial class MC68000
// {
/// <summary>
/// 重写的68000指令调度
/// </summary>
/// <param name="op"></param>
void DoOpCode(ushort op)
{
MC68000Code opType = MC68000CodeArr[op];
switch (opType)
{
case MC68000Code.ORI: ORI(); return;
case MC68000Code.ILL: ILL(); return;
case MC68000Code.ORI_CCR: ORI_CCR(); return;
case MC68000Code.ORI_SR: ORI_SR(); return;
case MC68000Code.BTSTr: BTSTr(); return;
case MC68000Code.MOVEP: MOVEP(); return;
case MC68000Code.BCHGr: BCHGr(); return;
case MC68000Code.BCLRr: BCLRr(); return;
case MC68000Code.BSETr: BSETr(); return;
case MC68000Code.ANDI: ANDI(); return;
case MC68000Code.ANDI_CCR: ANDI_CCR(); return;
case MC68000Code.ANDI_SR: ANDI_SR(); return;
case MC68000Code.SUBI: SUBI(); return;
case MC68000Code.ADDI: ADDI(); return;
case MC68000Code.BTSTi: BTSTi(); return;
case MC68000Code.BCHGi: BCHGi(); return;
case MC68000Code.BCLRi: BCLRi(); return;
case MC68000Code.BSETi: BSETi(); return;
case MC68000Code.EORI: EORI(); return;
case MC68000Code.EORI_CCR: EORI_CCR(); return;
case MC68000Code.EORI_SR: EORI_SR(); return;
case MC68000Code.CMPI: CMPI(); return;
case MC68000Code.MOVE: MOVE(); return;
case MC68000Code.MOVEA: MOVEA(); return;
case MC68000Code.NEGX: NEGX(); return;
case MC68000Code.MOVEfSR: MOVEfSR(); return;
case MC68000Code.CHK: CHK(); return;
case MC68000Code.LEA: LEA(); return;
case MC68000Code.CLR: CLR(); return;
case MC68000Code.NEG: NEG(); return;
case MC68000Code.MOVECCR: MOVECCR(); return;
case MC68000Code.NOT: NOT(); return;
case MC68000Code.MOVEtSR: MOVEtSR(); return;
case MC68000Code.NBCD: NBCD(); return;
case MC68000Code.SWAP: SWAP(); return;
case MC68000Code.PEA: PEA(); return;
case MC68000Code.EXT: EXT(); return;
case MC68000Code.MOVEM0: MOVEM0(); return;
case MC68000Code.TST: TST(); return;
case MC68000Code.TAS: TAS(); return;
case MC68000Code.ILLEGAL: ILLEGAL(); return;
case MC68000Code.MOVEM1: MOVEM1(); return;
case MC68000Code.TRAP: TRAP(); return;
case MC68000Code.LINK: LINK(); return;
case MC68000Code.UNLK: UNLK(); return;
case MC68000Code.MOVEUSP: MOVEUSP(); return;
case MC68000Code.RESET: RESET(); return;
case MC68000Code.NOP: NOP(); return;
case MC68000Code.STOP: STOP(); return;
case MC68000Code.RTE: RTE(); return;
case MC68000Code.RTS: RTS(); return;
case MC68000Code.TRAPV: TRAPV(); return;
case MC68000Code.RTR: RTR(); return;
case MC68000Code.JSR: JSR(); return;
case MC68000Code.JMP: JMP(); return;
case MC68000Code.ADDQ: ADDQ(); return;
case MC68000Code.Scc: Scc(); return;
case MC68000Code.DBcc: DBcc(); return;
case MC68000Code.SUBQ: SUBQ(); return;
case MC68000Code.BRA: BRA(); return;
case MC68000Code.BSR: BSR(); return;
case MC68000Code.Bcc: Bcc(); return;
case MC68000Code.MOVEQ: MOVEQ(); return;
case MC68000Code.OR0: OR0(); return;
case MC68000Code.DIVU: DIVU(); return;
case MC68000Code.SBCD0: SBCD0(); return;
case MC68000Code.SBCD1: SBCD1(); return;
case MC68000Code.OR1: OR1(); return;
case MC68000Code.DIVS: DIVS(); return;
case MC68000Code.SUB0: SUB0(); return;
case MC68000Code.SUBA: SUBA(); return;
case MC68000Code.SUBX0: SUBX0(); return;
case MC68000Code.SUBX1: SUBX1(); return;
case MC68000Code.SUB1: SUB1(); return;
case MC68000Code.CMP: CMP(); return;
case MC68000Code.CMPA: CMPA(); return;
case MC68000Code.EOR: EOR(); return;
case MC68000Code.CMPM: CMPM(); return;
case MC68000Code.AND0: AND0(); return;
case MC68000Code.MULU: MULU(); return;
case MC68000Code.ABCD0: ABCD0(); return;
case MC68000Code.ABCD1: ABCD1(); return;
case MC68000Code.AND1: AND1(); return;
case MC68000Code.EXGdd: EXGdd(); return;
case MC68000Code.EXGaa: EXGaa(); return;
case MC68000Code.EXGda: EXGda(); return;
case MC68000Code.MULS: MULS(); return;
case MC68000Code.ADD0: ADD0(); return;
case MC68000Code.ADDA: ADDA(); return;
case MC68000Code.ADDX0: ADDX0(); return;
case MC68000Code.ADDX1: ADDX1(); return;
case MC68000Code.ADD1: ADD1(); return;
case MC68000Code.ASRd: ASRd(); return;
case MC68000Code.LSRd: LSRd(); return;
case MC68000Code.ROXRd: ROXRd(); return;
case MC68000Code.RORd: RORd(); return;
case MC68000Code.ASRd0: ASRd0(); return;
case MC68000Code.ASLd: ASLd(); return;
case MC68000Code.LSLd: LSLd(); return;
case MC68000Code.ROXLd: ROXLd(); return;
case MC68000Code.ROLd: ROLd(); return;
case MC68000Code.ASLd0: ASLd0(); return;
case MC68000Code.LSRd0: LSRd0(); return;
case MC68000Code.LSLd0: LSLd0(); return;
case MC68000Code.ROXRd0: ROXRd0(); return;
case MC68000Code.ROXLd0: ROXLd0(); return;
case MC68000Code.RORd0: RORd0(); return;
case MC68000Code.ROLd0: ROLd0(); return;
}
}
}
}
// /// <summary>
// /// 重写的68000指令调度
// /// </summary>
// /// <param name="op"></param>
// void DoOpCode(ushort op)
// {
// MC68000Code opType = MC68000CodeArr[op];
// switch (opType)
// {
// case MC68000Code.ORI: ORI(); return;
// case MC68000Code.ILL: ILL(); return;
// case MC68000Code.ORI_CCR: ORI_CCR(); return;
// case MC68000Code.ORI_SR: ORI_SR(); return;
// case MC68000Code.BTSTr: BTSTr(); return;
// case MC68000Code.MOVEP: MOVEP(); return;
// case MC68000Code.BCHGr: BCHGr(); return;
// case MC68000Code.BCLRr: BCLRr(); return;
// case MC68000Code.BSETr: BSETr(); return;
// case MC68000Code.ANDI: ANDI(); return;
// case MC68000Code.ANDI_CCR: ANDI_CCR(); return;
// case MC68000Code.ANDI_SR: ANDI_SR(); return;
// case MC68000Code.SUBI: SUBI(); return;
// case MC68000Code.ADDI: ADDI(); return;
// case MC68000Code.BTSTi: BTSTi(); return;
// case MC68000Code.BCHGi: BCHGi(); return;
// case MC68000Code.BCLRi: BCLRi(); return;
// case MC68000Code.BSETi: BSETi(); return;
// case MC68000Code.EORI: EORI(); return;
// case MC68000Code.EORI_CCR: EORI_CCR(); return;
// case MC68000Code.EORI_SR: EORI_SR(); return;
// case MC68000Code.CMPI: CMPI(); return;
// case MC68000Code.MOVE: MOVE(); return;
// case MC68000Code.MOVEA: MOVEA(); return;
// case MC68000Code.NEGX: NEGX(); return;
// case MC68000Code.MOVEfSR: MOVEfSR(); return;
// case MC68000Code.CHK: CHK(); return;
// case MC68000Code.LEA: LEA(); return;
// case MC68000Code.CLR: CLR(); return;
// case MC68000Code.NEG: NEG(); return;
// case MC68000Code.MOVECCR: MOVECCR(); return;
// case MC68000Code.NOT: NOT(); return;
// case MC68000Code.MOVEtSR: MOVEtSR(); return;
// case MC68000Code.NBCD: NBCD(); return;
// case MC68000Code.SWAP: SWAP(); return;
// case MC68000Code.PEA: PEA(); return;
// case MC68000Code.EXT: EXT(); return;
// case MC68000Code.MOVEM0: MOVEM0(); return;
// case MC68000Code.TST: TST(); return;
// case MC68000Code.TAS: TAS(); return;
// case MC68000Code.ILLEGAL: ILLEGAL(); return;
// case MC68000Code.MOVEM1: MOVEM1(); return;
// case MC68000Code.TRAP: TRAP(); return;
// case MC68000Code.LINK: LINK(); return;
// case MC68000Code.UNLK: UNLK(); return;
// case MC68000Code.MOVEUSP: MOVEUSP(); return;
// case MC68000Code.RESET: RESET(); return;
// case MC68000Code.NOP: NOP(); return;
// case MC68000Code.STOP: STOP(); return;
// case MC68000Code.RTE: RTE(); return;
// case MC68000Code.RTS: RTS(); return;
// case MC68000Code.TRAPV: TRAPV(); return;
// case MC68000Code.RTR: RTR(); return;
// case MC68000Code.JSR: JSR(); return;
// case MC68000Code.JMP: JMP(); return;
// case MC68000Code.ADDQ: ADDQ(); return;
// case MC68000Code.Scc: Scc(); return;
// case MC68000Code.DBcc: DBcc(); return;
// case MC68000Code.SUBQ: SUBQ(); return;
// case MC68000Code.BRA: BRA(); return;
// case MC68000Code.BSR: BSR(); return;
// case MC68000Code.Bcc: Bcc(); return;
// case MC68000Code.MOVEQ: MOVEQ(); return;
// case MC68000Code.OR0: OR0(); return;
// case MC68000Code.DIVU: DIVU(); return;
// case MC68000Code.SBCD0: SBCD0(); return;
// case MC68000Code.SBCD1: SBCD1(); return;
// case MC68000Code.OR1: OR1(); return;
// case MC68000Code.DIVS: DIVS(); return;
// case MC68000Code.SUB0: SUB0(); return;
// case MC68000Code.SUBA: SUBA(); return;
// case MC68000Code.SUBX0: SUBX0(); return;
// case MC68000Code.SUBX1: SUBX1(); return;
// case MC68000Code.SUB1: SUB1(); return;
// case MC68000Code.CMP: CMP(); return;
// case MC68000Code.CMPA: CMPA(); return;
// case MC68000Code.EOR: EOR(); return;
// case MC68000Code.CMPM: CMPM(); return;
// case MC68000Code.AND0: AND0(); return;
// case MC68000Code.MULU: MULU(); return;
// case MC68000Code.ABCD0: ABCD0(); return;
// case MC68000Code.ABCD1: ABCD1(); return;
// case MC68000Code.AND1: AND1(); return;
// case MC68000Code.EXGdd: EXGdd(); return;
// case MC68000Code.EXGaa: EXGaa(); return;
// case MC68000Code.EXGda: EXGda(); return;
// case MC68000Code.MULS: MULS(); return;
// case MC68000Code.ADD0: ADD0(); return;
// case MC68000Code.ADDA: ADDA(); return;
// case MC68000Code.ADDX0: ADDX0(); return;
// case MC68000Code.ADDX1: ADDX1(); return;
// case MC68000Code.ADD1: ADD1(); return;
// case MC68000Code.ASRd: ASRd(); return;
// case MC68000Code.LSRd: LSRd(); return;
// case MC68000Code.ROXRd: ROXRd(); return;
// case MC68000Code.RORd: RORd(); return;
// case MC68000Code.ASRd0: ASRd0(); return;
// case MC68000Code.ASLd: ASLd(); return;
// case MC68000Code.LSLd: LSLd(); return;
// case MC68000Code.ROXLd: ROXLd(); return;
// case MC68000Code.ROLd: ROLd(); return;
// case MC68000Code.ASLd0: ASLd0(); return;
// case MC68000Code.LSRd0: LSRd0(); return;
// case MC68000Code.LSLd0: LSLd0(); return;
// case MC68000Code.ROXRd0: ROXRd0(); return;
// case MC68000Code.ROXLd0: ROXLd0(); return;
// case MC68000Code.RORd0: RORd0(); return;
// case MC68000Code.ROLd0: ROLd0(); return;
// }
// }
// }
//}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,870 @@
using System;
using System.Collections.Generic;
namespace cpu.m68000
{
partial class MC68000
{
void BuildOpcodeTable()
{
Assign("ill", ILL, "", "Data8", "Data8");//
Assign("ori2ccr", ORI_CCR, "0000000000111100");//
Assign("ori2sr", ORI_SR, "0000000001111100");
Assign("ori", ORI, "00000000", "Size2_1", "OAmXn");
Assign("andi2ccr", ANDI_CCR, "0000001000111100");//
Assign("andi2sr", ANDI_SR, "0000001001111100");
Assign("andi", ANDI, "00000010", "Size2_1", "OAmXn");
Assign("subi", SUBI, "00000100", "Size2_1", "OAmXn");
Assign("addi", ADDI, "00000110", "Size2_1", "OAmXn");
Assign("eori2ccr", EORI_CCR, "0000101000111100");//
Assign("eori2sr", EORI_SR, "0000101001111100");
Assign("eori", EORI, "00001010", "Size2_1", "OAmXn");
Assign("cmpi", CMPI, "00001100", "Size2_1", "OAmXn");
Assign("btst", BTSTi, "0000100000", "BAmXn");
Assign("bchg", BCHGi, "0000100001", "OAmXn");
Assign("bclr", BCLRi, "0000100010", "OAmXn");
Assign("bset", BSETi, "0000100011", "OAmXn");
Assign("btst", BTSTr, "0000", "Xn", "100", "AmXn");
Assign("bchg", BCHGr, "0000", "Xn", "101", "OAmXn");
Assign("bclr", BCLRr, "0000", "Xn", "110", "OAmXn");
Assign("bset", BSETr, "0000", "Xn", "111", "OAmXn");
Assign("movep", MOVEP, "0000", "Xn", "1", "Data1", "Size1", "001", "Xn");//
Assign("movea", MOVEA, "00", "Size2_2", "Xn", "001", "AmXn");
Assign("move", MOVE, "00", "01", "OXnAm", "MAmXn");
Assign("move", MOVE, "00", "Size2_2", "OXnAm", "AmXn");
Assign("movefsr", MOVEfSR, "0100000011", "OAmXn");
Assign("moveccr", MOVECCR, "0100010011", "MAmXn");
Assign("move2sr", MOVEtSR, "0100011011", "MAmXn");
Assign("negx", NEGX, "01000000", "Size2_1", "OAmXn");//
Assign("clr", CLR, "01000010", "Size2_1", "OAmXn");
Assign("neg", NEG, "01000100", "Size2_1", "OAmXn");
Assign("not", NOT, "01000110", "Size2_1", "OAmXn");
Assign("ext", EXT, "010010001", "Size1", "000", "Xn");
Assign("nbcd", NBCD, "0100100000", "OAmXn");//
Assign("swap", SWAP, "0100100001000", "Xn");
Assign("pea", PEA, "0100100001", "LAmXn");
Assign("illegal", ILLEGAL, "0100101011111100");//
Assign("tas", TAS, "0100101011", "OAmXn");//
Assign("tst", TST, "01001010", "Size2_1", "OAmXn");
Assign("trap", TRAP, "010011100100", "Data4");
Assign("link", LINK, "0100111001010", "Xn");
Assign("unlk", UNLK, "0100111001011", "Xn");
Assign("moveusp", MOVEUSP, "010011100110", "Data1", "Xn");
Assign("reset", RESET, "0100111001110000");//
Assign("nop", NOP, "0100111001110001");
Assign("stop", STOP, "0100111001110010");//
Assign("rte", RTE, "0100111001110011");
Assign("rts", RTS, "0100111001110101");
Assign("trapv", TRAPV, "0100111001110110");//
Assign("rtr", RTR, "0100111001110111");
Assign("jsr", JSR, "0100111010", "LAmXn");
Assign("jmp", JMP, "0100111011", "LAmXn");
Assign("movem", MOVEM0, "010010001", "Size1", "M2AmXn");
Assign("movem", MOVEM1, "010011001", "Size1", "M3AmXn");
Assign("lea", LEA, "0100", "Xn", "111", "LAmXn");
Assign("chk", CHK, "0100", "Xn", "110", "MAmXn");//
Assign("addq", ADDQ, "0101", "Data3", "0", "00", "OAmXn");
Assign("addq", ADDQ, "0101", "Data3", "0", "Size2_3", "A2AmXn");
Assign("subq", SUBQ, "0101", "Data3", "1", "00", "OAmXn");
Assign("subq", SUBQ, "0101", "Data3", "1", "Size2_3", "A2AmXn");
Assign("scc", Scc, "0101", "CondAll", "11", "OAmXn");
Assign("dbcc", DBcc, "0101", "CondAll", "11001", "Xn");
Assign("bra", BRA, "01100000", "Data8");
Assign("bsr", BSR, "01100001", "Data8");
Assign("bcc", Bcc, "0110", "CondMain", "Data8");
Assign("moveq", MOVEQ, "0111", "Xn", "0", "Data8");
Assign("divu", DIVU, "1000", "Xn", "011", "MAmXn");
Assign("divs", DIVS, "1000", "Xn", "111", "MAmXn");
Assign("sbcd", SBCD0, "1000", "Xn", "100000", "Xn");//
Assign("sbcd", SBCD1, "1000", "Xn", "100001", "Xn");//
Assign("or", OR0, "1000", "Xn", "0", "Size2_1", "MAmXn");
Assign("or", OR1, "1000", "Xn", "1", "Size2_1", "O2AmXn");
Assign("sub", SUB0, "1001", "Xn", "0", "00", "MAmXn");
Assign("sub", SUB0, "1001", "Xn", "0", "Size2_3", "AmXn");
Assign("sub", SUB1, "1001", "Xn", "1", "00", "O2AmXn");
Assign("sub", SUB1, "1001", "Xn", "1", "Size2_3", "A2AmXn");
Assign("subx", SUBX0, "1001", "Xn", "1", "Size2_1", "000", "Xn");//
Assign("subx", SUBX1, "1001", "Xn", "1", "Size2_1", "001", "Xn");//
Assign("suba", SUBA, "1001", "Xn", "Size1", "11", "AmXn");
Assign("eor", EOR, "1011", "Xn", "1", "Size2_1", "OAmXn");
Assign("cmpm", CMPM, "1011", "Xn", "1", "Size2_1", "001", "Xn");
Assign("cmp", CMP, "1011", "Xn", "0", "00", "MAmXn");
Assign("cmp", CMP, "1011", "Xn", "0", "Size2_3", "AmXn");
Assign("cmpa", CMPA, "1011", "Xn", "Size1", "11", "AmXn");
Assign("mulu", MULU, "1100", "Xn", "011", "MAmXn");
Assign("muls", MULS, "1100", "Xn", "111", "MAmXn");
Assign("abcd", ABCD0, "1100", "Xn", "100000", "Xn");//
Assign("abcd", ABCD1, "1100", "Xn", "100001", "Xn");//
Assign("exg", EXGdd, "1100", "Xn", "101000", "Xn");//
Assign("exg", EXGaa, "1100", "Xn", "101001", "Xn");//
Assign("exg", EXGda, "1100", "Xn", "110001", "Xn");//
Assign("and", AND0, "1100", "Xn", "0", "Size2_1", "MAmXn");
Assign("and", AND1, "1100", "Xn", "1", "Size2_1", "O2AmXn");
Assign("add", ADD0, "1101", "Xn", "0", "00", "MAmXn");
Assign("add", ADD0, "1101", "Xn", "0", "Size2_3", "AmXn");
Assign("add", ADD1, "1101", "Xn", "1", "Size2_1", "O2AmXn");
Assign("addx", ADDX0, "1101", "Xn", "1", "Size2_1", "000", "Xn");//
Assign("addx", ADDX1, "1101", "Xn", "1", "Size2_1", "001", "Xn");//
Assign("adda", ADDA, "1101", "Xn", "Size1", "11", "AmXn");
Assign("asl", ASLd0, "1110000111", "O2AmXn");//
Assign("asr", ASRd0, "1110000011", "O2AmXn");//
Assign("lsl", LSLd0, "1110001111", "O2AmXn");//
Assign("lsr", LSRd0, "1110001011", "O2AmXn");//
Assign("roxl", ROXLd0, "1110010111", "O2AmXn");//
Assign("roxr", ROXRd0, "1110010011", "O2AmXn");//
Assign("rol", ROLd0, "1110011111", "O2AmXn");//
Assign("ror", RORd0, "1110011011", "O2AmXn");//
Assign("asl", ASLd, "1110", "Data3", "1", "Size2_1", "Data1", "00", "Xn");
Assign("asr", ASRd, "1110", "Data3", "0", "Size2_1", "Data1", "00", "Xn");
Assign("lsl", LSLd, "1110", "Data3", "1", "Size2_1", "Data1", "01", "Xn");
Assign("lsr", LSRd, "1110", "Data3", "0", "Size2_1", "Data1", "01", "Xn");
Assign("roxl", ROXLd, "1110", "Data3", "1", "Size2_1", "Data1", "10", "Xn");
Assign("roxr", ROXRd, "1110", "Data3", "0", "Size2_1", "Data1", "10", "Xn");
Assign("rol", ROLd, "1110", "Data3", "1", "Size2_1", "Data1", "11", "Xn");
Assign("ror", RORd, "1110", "Data3", "0", "Size2_1", "Data1", "11", "Xn");
}
void Assign(string instr, Action exec, string root, params string[] bitfield)
{
List<string> opList = new List<string>();
opList.Add(root);
foreach (var component in bitfield)
{
if (IsBinary(component)) AppendConstant(opList, component);
else if (component == "Size1") opList = AppendPermutations(opList, Size1);
else if (component == "Size2_0") opList = AppendPermutations(opList, Size2_0);
else if (component == "Size2_1") opList = AppendPermutations(opList, Size2_1);
else if (component == "Size2_2") opList = AppendPermutations(opList, Size2_2);
else if (component == "Size2_3") opList = AppendPermutations(opList, Size2_3);
else if (component == "OXnAm") opList = AppendPermutations(opList, OXn3Am3);//0,2-6,7_0-7_1
else if (component == "AmXn") opList = AppendPermutations(opList, Am3Xn3);//0-6,7_0-7_4
else if (component == "OAmXn") opList = AppendPermutations(opList, OAm3Xn3);//0,2-6,7_0-7_1
else if (component == "BAmXn") opList = AppendPermutations(opList, BAm3Xn3);//0,2-6,7_0-7_3
else if (component == "MAmXn") opList = AppendPermutations(opList, MAm3Xn3);//0,2-6,7_0-7_4
else if (component == "AAmXn") opList = AppendPermutations(opList, AAm3Xn3);//1-6,7_0-7_4
else if (component == "LAmXn") opList = AppendPermutations(opList, LAm3Xn3);//2,5-6,7_0-7_3
else if (component == "M2AmXn") opList = AppendPermutations(opList, M2Am3Xn3);//2,4-6,7_0-7_1
else if (component == "M3AmXn") opList = AppendPermutations(opList, M3Am3Xn3);//2-3,5-6,7_0-7_3
else if (component == "A2AmXn") opList = AppendPermutations(opList, A2Am3Xn3);//0-6,7_0-7_1
else if (component == "O2AmXn") opList = AppendPermutations(opList, O2Am3Xn3);//2-6,7_0-7_1
else if (component == "Xn") opList = AppendPermutations(opList, Xn3);
else if (component == "CondMain") opList = AppendPermutations(opList, ConditionMain);
else if (component == "CondAll") opList = AppendPermutations(opList, ConditionAll);
else if (component == "Data1") opList = AppendData(opList, 1);
else if (component == "Data3") opList = AppendData(opList, 3);
else if (component == "Data4") opList = AppendData(opList, 4);
else if (component == "Data8") opList = AppendData(opList, 8);
}
foreach (var opcode in opList)
{
int opc = Convert.ToInt32(opcode, 2);
Opcodes[opc] = exec;
}
}
void AppendConstant(List<string> ops, string constant)
{
for (int i = 0; i < ops.Count; i++)
ops[i] = ops[i] + constant;
}
List<string> AppendPermutations(List<string> ops, string[] permutations)
{
List<string> output = new List<string>();
foreach (var input in ops)
foreach (var perm in permutations)
output.Add(input + perm);
return output;
}
List<string> AppendData(List<string> ops, int bits)
{
List<string> output = new List<string>();
foreach (var input in ops)
for (int i = 0; i < BinaryExp(bits); i++)
output.Add(input + Convert.ToString(i, 2).PadLeft(bits, '0'));
return output;
}
int BinaryExp(int bits)
{
int res = 1;
for (int i = 0; i < bits; i++)
res *= 2;
return res;
}
bool IsBinary(string str)
{
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
if (c == '0' || c == '1')
continue;
return false;
}
return true;
}
#region Tables
static readonly string[] Size2_0 = { "01", "11", "10" };
static readonly string[] Size2_1 = { "00", "01", "10" };
static readonly string[] Size2_2 = { "11", "10" };
static readonly string[] Size2_3 = { "01", "10" };
static readonly string[] Size1 = { "0", "1" };
static readonly string[] Xn3 = { "000", "001", "010", "011", "100", "101", "110", "111" };
static readonly string[] OXn3Am3 = {
"000000", // Dn Data register
"001000",
"010000",
"011000",
"100000",
"101000",
"110000",
"111000",
"000010", // (An) Address
"001010",
"010010",
"011010",
"100010",
"101010",
"110010",
"111010",
"000011", // (An)+ Address with Postincrement
"001011",
"010011",
"011011",
"100011",
"101011",
"110011",
"111011",
"000100", // -(An) Address with Predecrement
"001100",
"010100",
"011100",
"100100",
"101100",
"110100",
"111100",
"000101", // (d16, An) Address with Displacement
"001101",
"010101",
"011101",
"100101",
"101101",
"110101",
"111101",
"000110", // (d8, An, Xn) Address with Index
"001110",
"010110",
"011110",
"100110",
"101110",
"110110",
"111110",
"000111", // (xxx).W Absolute Short
"001111", // (xxx).L Absolute Long
};
static readonly string[] Am3Xn3 = {
"000000", // Dn Data register
"000001",
"000010",
"000011",
"000100",
"000101",
"000110",
"000111",
"001000", // An Address register
"001001",
"001010",
"001011",
"001100",
"001101",
"001110",
"001111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
"111100", // #imm Immediate
};
static readonly string[] OAm3Xn3 = {
"000000", // Dn Data register
"000001",
"000010",
"000011",
"000100",
"000101",
"000110",
"000111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] BAm3Xn3 = {
"000000", // Dn Data register
"000001",
"000010",
"000011",
"000100",
"000101",
"000110",
"000111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] MAm3Xn3 = {
"000000", // Dn Data register
"000001",
"000010",
"000011",
"000100",
"000101",
"000110",
"000111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
"111100", // #imm Immediate
};
static readonly string[] AAm3Xn3 = {
"001000", // An Address register
"001001",
"001010",
"001011",
"001100",
"001101",
"001110",
"001111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
"111100", // #imm Immediate
};
static readonly string[] LAm3Xn3 = {
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] M2Am3Xn3 = {
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] M3Am3Xn3 = {
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111010", // (d16, PC) PC with Displacement
"111011", // (d8, PC, Xn) PC with Index
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] A2Am3Xn3 = {
"000000", // Dn Data register
"000001",
"000010",
"000011",
"000100",
"000101",
"000110",
"000111",
"001000", // An Address register
"001001",
"001010",
"001011",
"001100",
"001101",
"001110",
"001111",
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] O2Am3Xn3 = {
"010000", // (An) Address
"010001",
"010010",
"010011",
"010100",
"010101",
"010110",
"010111",
"011000", // (An)+ Address with Postincrement
"011001",
"011010",
"011011",
"011100",
"011101",
"011110",
"011111",
"100000", // -(An) Address with Predecrement
"100001",
"100010",
"100011",
"100100",
"100101",
"100110",
"100111",
"101000", // (d16, An) Address with Displacement
"101001",
"101010",
"101011",
"101100",
"101101",
"101110",
"101111",
"110000", // (d8, An, Xn) Address with Index
"110001",
"110010",
"110011",
"110100",
"110101",
"110110",
"110111",
"111000", // (xxx).W Absolute Short
"111001", // (xxx).L Absolute Long
};
static readonly string[] ConditionMain = {
"0010", // HI Higher (unsigned)
"0011", // LS Lower or Same (unsigned)
"0100", // CC Carry Clear (aka Higher or Same, unsigned)
"0101", // CS Carry Set (aka Lower, unsigned)
"0110", // NE Not Equal
"0111", // EQ Equal
"1000", // VC Overflow Clear
"1001", // VS Overflow Set
"1010", // PL Plus
"1011", // MI Minus
"1100", // GE Greater or Equal (signed)
"1101", // LT Less Than (signed)
"1110", // GT Greater Than (signed)
"1111" // LE Less or Equal (signed)
};
static readonly string[] ConditionAll = {
"0000", // T True
"0001", // F False
"0010", // HI Higher (unsigned)
"0011", // LS Lower or Same (unsigned)
"0100", // CC Carry Clear (aka Higher or Same, unsigned)
"0101", // CS Carry Set (aka Lower, unsigned)
"0110", // NE Not Equal
"0111", // EQ Equal
"1000", // VC Overflow Clear
"1001", // VS Overflow Set
"1010", // PL Plus
"1011", // MI Minus
"1100", // GE Greater or Equal (signed)
"1101", // LT Less Than (signed)
"1110", // GT Greater Than (signed)
"1111" // LE Less or Equal (signed)
};
#endregion
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ed9317b66de00d444a41e424670f3899