From f74fb2dd27d739b22c44c4df793fb894fc5b5aef Mon Sep 17 00:00:00 2001 From: StapleButter Date: Thu, 24 Nov 2016 18:31:49 +0100 Subject: well, adding shit. laying out the base for the interpreter. really dirty code. --- ARM.cpp | 24 +- ARM.h | 6 + ARMInterpreter.cpp | 31 + ARMInterpreter.h | 16 + ARMInterpreter_Branch.cpp | 27 + ARMInterpreter_Branch.h | 13 + ARM_InstrTable.h | 1962 +++++++++++++++++++++++++++++++++++++++++++++ NDS.cpp | 34 + NDS.h | 4 + main.cpp | 5 + melonDS.depend | 30 +- 11 files changed, 2139 insertions(+), 13 deletions(-) create mode 100644 ARMInterpreter.cpp create mode 100644 ARMInterpreter.h create mode 100644 ARMInterpreter_Branch.cpp create mode 100644 ARMInterpreter_Branch.h create mode 100644 ARM_InstrTable.h diff --git a/ARM.cpp b/ARM.cpp index 47d5ec9..2e51d86 100644 --- a/ARM.cpp +++ b/ARM.cpp @@ -1,31 +1,37 @@ -#include "ARM.h" +#include #include "NDS.h" +#include "ARM.h" +#include "ARMInterpreter.h" ARM::ARM(u32 num) { // well uh Num = num; +} + +ARM::~ARM() +{ + // dorp +} +void ARM::Reset() +{ for (int i = 0; i < 16; i++) R[i] = 0; - ExceptionBase = num ? 0x00000000 : 0xFFFF0000; + ExceptionBase = Num ? 0x00000000 : 0xFFFF0000; // zorp JumpTo(ExceptionBase); } -ARM::~ARM() -{ - // dorp -} - 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 024ecb9..b1ce0bf 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 0000000..2acef27 --- /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 0000000..5318b81 --- /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 0000000..4555235 --- /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 0000000..cb7926f --- /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 0000000..812d040 --- /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 71de789..038cf09 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 dff2693..a1e7283 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 7ac564b..376dea1 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 c60dba6..988dd07 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" + "ARM.h" -1478128612 source:c:\documents\sources\melonds\arm.cpp +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" -1478130006 c:\documents\sources\melonds\arm.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 -- cgit v1.2.3