diff --git a/ARM.cpp b/ARM.cpp index 47d5ec97..2e51d86c 100644 --- a/ARM.cpp +++ b/ARM.cpp @@ -1,19 +1,13 @@ -#include "ARM.h" +#include #include "NDS.h" +#include "ARM.h" +#include "ARMInterpreter.h" ARM::ARM(u32 num) { // well uh Num = num; - - for (int i = 0; i < 16; i++) - R[i] = 0; - - ExceptionBase = num ? 0x00000000 : 0xFFFF0000; - - // zorp - JumpTo(ExceptionBase); } ARM::~ARM() @@ -21,11 +15,23 @@ ARM::~ARM() // dorp } +void ARM::Reset() +{ + for (int i = 0; i < 16; i++) + R[i] = 0; + + ExceptionBase = Num ? 0x00000000 : 0xFFFF0000; + + // zorp + JumpTo(ExceptionBase); +} + void ARM::JumpTo(u32 addr) { // pipeline shit // TODO: THUMB!! + if (addr&1) printf("!!! THUMB JUMP\n"); NextInstr = Read32(addr); R[15] = addr+4; @@ -43,7 +49,9 @@ s32 ARM::Execute(s32 cycles) R[15] += 4; // actually execute - // er... + if ((CurInstr & 0xF0000000) != 0xE0000000) printf("well shit\n"); + u32 icode = ((CurInstr >> 4) & 0xF) | ((CurInstr >> 16) & 0xFF0); + cycles -= ARMInterpreter::ARMInstrTable[icode](this); } return cycles; diff --git a/ARM.h b/ARM.h index 024ecb95..b1ce0bf0 100644 --- a/ARM.h +++ b/ARM.h @@ -6,12 +6,18 @@ #include "types.h" #include "NDS.h" +// lame +#define C_S(x) x +#define C_N(x) x + class ARM { public: ARM(u32 num); ~ARM(); // destroy shit + void Reset(); + void JumpTo(u32 addr); s32 Execute(s32 cycles); diff --git a/ARMInterpreter.cpp b/ARMInterpreter.cpp new file mode 100644 index 00000000..2acef27e --- /dev/null +++ b/ARMInterpreter.cpp @@ -0,0 +1,31 @@ +#include +#include "NDS.h" +#include "ARMInterpreter.h" +#include "ARMInterpreter_Branch.h" + + +namespace ARMInterpreter +{ + + +s32 A_UNK(ARM* cpu) +{ + printf("undefined ARM instruction %08X @ %08X\n", cpu->CurInstr, cpu->R[15]-8); + NDS::Halt(); + return 0x7FFFFFFF; +} + +s32 T_UNK(ARM* cpu) +{ + printf("undefined THUMB instruction %04X @ %08X\n", cpu->CurInstr, cpu->R[15]-4); + NDS::Halt(); + return 0x7FFFFFFF; +} + + + +#define INSTRFUNC_PROTO(x) s32 (*x)(ARM* cpu) +#include "ARM_InstrTable.h" +#undef INSTRFUNC_PROTO + +} diff --git a/ARMInterpreter.h b/ARMInterpreter.h new file mode 100644 index 00000000..5318b81c --- /dev/null +++ b/ARMInterpreter.h @@ -0,0 +1,16 @@ + +#ifndef ARMINTERPRETER_H +#define ARMINTERPRETER_H + +#include "types.h" +#include "ARM.h" + +namespace ARMInterpreter +{ + +extern s32 (*ARMInstrTable[4096])(ARM* cpu); +extern s32 (*THUMBInstrTable[1024])(ARM* cpu); + +} + +#endif // ARMINTERPRETER_H diff --git a/ARMInterpreter_Branch.cpp b/ARMInterpreter_Branch.cpp new file mode 100644 index 00000000..4555235e --- /dev/null +++ b/ARMInterpreter_Branch.cpp @@ -0,0 +1,27 @@ +#include "ARM.h" + + +namespace ARMInterpreter +{ + + +s32 A_B(ARM* cpu) +{ + s32 offset = (s32)(cpu->CurInstr << 8) >> 6; + cpu->JumpTo(cpu->R[15] + offset); + + return C_S(2) + C_N(1); +} + +s32 A_BL(ARM* cpu) +{ + s32 offset = (s32)(cpu->CurInstr << 8) >> 6; + cpu->R[14] = cpu->R[15] - 4; + cpu->JumpTo(cpu->R[15] + offset); + + return C_S(2) + C_N(1); +} + + +} + diff --git a/ARMInterpreter_Branch.h b/ARMInterpreter_Branch.h new file mode 100644 index 00000000..cb7926f5 --- /dev/null +++ b/ARMInterpreter_Branch.h @@ -0,0 +1,13 @@ + +#ifndef ARMINTERPRETER_BRANCH_H +#define ARMINTERPRETER_BRANCH_H + +namespace ARMInterpreter +{ + +s32 A_B(ARM* cpu); +s32 A_BL(ARM* cpu); + +} + +#endif diff --git a/ARM_InstrTable.h b/ARM_InstrTable.h new file mode 100644 index 00000000..812d040e --- /dev/null +++ b/ARM_InstrTable.h @@ -0,0 +1,1962 @@ + +INSTRFUNC_PROTO(ARMInstrTable[4096]) = +{ + // 0000 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0000 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0001 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0001 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0010 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0010 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0011 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0011 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0100 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0100 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0101 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0101 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0110 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0110 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 0111 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 0111 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1000 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1000 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1001 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1001 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1010 0000 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0001 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0010 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0011 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0100 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0101 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0110 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 0111 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1000 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1001 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1010 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1011 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1100 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1101 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1110 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + // 1010 1111 0000 + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + A_B, A_B, A_B, A_B, + + + + // 1011 0000 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0001 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0010 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0011 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0100 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0101 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0110 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 0111 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1000 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1001 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1010 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1011 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1100 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1101 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1110 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + // 1011 1111 0000 + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + A_BL, A_BL, A_BL, A_BL, + + + + // 1100 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1100 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1101 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1101 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1110 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1110 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + + + // 1111 0000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 0111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1000 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1001 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1010 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1011 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1100 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1101 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1110 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + + // 1111 1111 0000 + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK, + A_UNK, A_UNK, A_UNK, A_UNK +}; + +INSTRFUNC_PROTO(THUMBInstrTable[1024]) = +{ + // 0000 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0000 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0000 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0000 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0001 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0001 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0001 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0001 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0010 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0010 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0010 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0010 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0011 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0011 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0011 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0011 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + + + // 0100 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0100 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0100 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0100 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0101 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0101 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0101 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0101 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0110 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0110 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0110 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0110 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0111 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0111 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0111 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 0111 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + + + // 1000 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1000 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1000 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1000 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1001 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1001 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1001 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1001 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1010 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1010 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1010 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1010 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1011 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1011 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1011 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1011 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + + + // 1100 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1100 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1100 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1100 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1101 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1101 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1101 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1101 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1110 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1110 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1110 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1110 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1111 0000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1111 0100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1111 1000 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + + // 1111 1100 00 + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK, + T_UNK, T_UNK, T_UNK, T_UNK +}; diff --git a/NDS.cpp b/NDS.cpp index 71de789c..038cf093 100644 --- a/NDS.cpp +++ b/NDS.cpp @@ -9,9 +9,13 @@ namespace NDS ARM* ARM9; ARM* ARM7; +s32 ARM9Cycles, ARM7Cycles; + u8 ARM9BIOS[0x1000]; u8 ARM7BIOS[0x4000]; +bool Running; + void Init() { @@ -48,6 +52,36 @@ void Reset() printf("ARM7 BIOS loaded: %08X\n", ARM7Read32(0x00000000)); fclose(f); } + + ARM9->Reset(); + ARM7->Reset(); + + ARM9Cycles = 0; + ARM7Cycles = 0; + + Running = true; // hax +} + + +void RunFrame() +{ + s32 framecycles = 560190<<1; + + // very gross and temp. loop + + while (Running && framecycles>0) + { + ARM9Cycles = ARM9->Execute(32 + ARM9Cycles); + ARM7Cycles = ARM7->Execute(16 + ARM7Cycles); + + framecycles -= 32; + } +} + + +void Halt() +{ + Running = false; } diff --git a/NDS.h b/NDS.h index dff26935..a1e72834 100644 --- a/NDS.h +++ b/NDS.h @@ -10,6 +10,10 @@ namespace NDS void Init(); void Reset(); +void RunFrame(); + +void Halt(); + u32 ARM9Read32(u32 addr); u32 ARM7Read32(u32 addr); diff --git a/main.cpp b/main.cpp index 7ac564b2..376dea1f 100644 --- a/main.cpp +++ b/main.cpp @@ -9,5 +9,10 @@ int main() NDS::Init(); + for (;;) + { + NDS::RunFrame(); + } + return 0; } diff --git a/melonDS.depend b/melonDS.depend index c60dba64..988dd07d 100644 --- a/melonDS.depend +++ b/melonDS.depend @@ -1,20 +1,40 @@ # depslib dependency file v1.0 -1478130209 source:c:\documents\sources\melonds\main.cpp +1480007651 source:c:\documents\sources\melonds\main.cpp "NDS.h" -1478129148 c:\documents\sources\melonds\nds.h +1480006838 c:\documents\sources\melonds\nds.h "types.h" 1463409689 c:\documents\sources\melonds\types.h -1463410049 source:c:\documents\sources\melonds\nds.cpp +1480007757 source:c:\documents\sources\melonds\nds.cpp "NDS.h" - -1478128612 source:c:\documents\sources\melonds\arm.cpp "ARM.h" -1478130006 c:\documents\sources\melonds\arm.h - "types.h" +1480007764 source:c:\documents\sources\melonds\arm.cpp + + "NDS.h" + "ARM.h" + "ARMInterpreter.h" + +1480008165 c:\documents\sources\melonds\arm.h + "types.h" + "NDS.h" + +1480008597 c:\documents\sources\melonds\arm_instrtable.h + +1480005496 c:\documents\sources\melonds\arminterpreter.h + "types.h" + "ARM.h" + +1480008388 source:c:\documents\sources\melonds\arminterpreter.cpp + + "NDS.h" + "ARMInterpreter.h" + "ARMInterpreter_Branch.h" + "ARM_InstrTable.h" + +1480008608 c:\documents\sources\melonds\arminterpreter_branch.h