From 16fa0bf3eaea401a997b17deb9daa0034fc4fffc Mon Sep 17 00:00:00 2001 From: Kittycannon Date: Fri, 20 Mar 2026 11:04:37 -0600 Subject: [PATCH] executed pygen, we now have cpu instructions yay, made some changes to pygen --- autogen/InstructionMasks.hpp | 268 ++++++++++++++ docs/Spider Instructions.xlsx | Bin 0 -> 107321 bytes pygen.ipynb | 55 +-- src/spider/runtime/cpu/CPU.hpp | 630 +++++++++++++++++++++++++++++++++ 4 files changed, 930 insertions(+), 23 deletions(-) create mode 100644 autogen/InstructionMasks.hpp create mode 100644 docs/Spider Instructions.xlsx diff --git a/autogen/InstructionMasks.hpp b/autogen/InstructionMasks.hpp new file mode 100644 index 0000000..9be8113 --- /dev/null +++ b/autogen/InstructionMasks.hpp @@ -0,0 +1,268 @@ +#pragma once +// AUTO-GENERATED by pygen.ipynb — DO NOT EDIT MANUALLY +#include + +namespace spider { + +// Addressing mode masks — indexed by opcode. +// [opcode][0] = mask for param 1, [opcode][1] = mask for param 2 +constexpr u8 ADDR_MODE_MASKS[][2] = { + { 0x00, 0x00 }, // NOP + { 0x00, 0x00 }, // SPDR + { 0x05, 0x00 }, // MMODE + { 0x1F, 0x00 }, // INT + { 0x1F, 0x00 }, // LRV + { 0x1E, 0x00 }, // FSR + { 0x1E, 0x00 }, // FIR + { 0x1E, 0x00 }, // FZR + { 0x1E, 0x1F }, // LSR + { 0x00, 0x00 }, // FVR + { 0x00, 0x00 }, // MOV + { 0x00, 0x00 }, // MOR + { 0x00, 0x00 }, // AMOV + { 0x04, 0x04 }, // SWP + { 0x04, 0x00 }, // AHM + { 0x00, 0x00 }, // COM + { 0x00, 0x00 }, // NEG + { 0x00, 0x00 }, // EXS + { 0x00, 0x00 }, // INC + { 0x00, 0x00 }, // DEC + { 0x00, 0x00 }, // ADD + { 0x00, 0x00 }, // SUB + { 0x00, 0x00 }, // MUL + { 0x00, 0x00 }, // UMUL + { 0x00, 0x00 }, // DIV + { 0x00, 0x00 }, // UDIV + { 0x00, 0x00 }, // MOD + { 0x00, 0x00 }, // UMOD + { 0x00, 0x00 }, // DMOD + { 0x00, 0x00 }, // UDMD + { 0x00, 0x00 }, // FBT + { 0x00, 0x00 }, // STB + { 0x00, 0x00 }, // CRB + { 0x00, 0x00 }, // TSB + { 0x00, 0x00 }, // BOOL + { 0x00, 0x00 }, // NOT + { 0x00, 0x00 }, // AND + { 0x00, 0x00 }, // OR + { 0x00, 0x00 }, // XOR + { 0x00, 0x00 }, // SHL + { 0x00, 0x00 }, // SHR + { 0x00, 0x00 }, // SSR + { 0x00, 0x00 }, // ROL + { 0x00, 0x00 }, // ROR + { 0x00, 0x00 }, // CNT + { 0x00, 0x00 }, // EQ + { 0x00, 0x00 }, // NE + { 0x00, 0x00 }, // GT + { 0x00, 0x00 }, // GE + { 0x00, 0x00 }, // LT + { 0x00, 0x00 }, // LE + { 0x00, 0x00 }, // JMP + { 0x00, 0x00 }, // JEQ + { 0x00, 0x00 }, // JNE + { 0x00, 0x00 }, // JIF + { 0x00, 0x00 }, // JMR + { 0x00, 0x00 }, // JER + { 0x00, 0x00 }, // JNR + { 0x00, 0x00 }, // JIR + { 0x00, 0x00 }, // SFB + { 0x00, 0x00 }, // LFB + { 0x00, 0x00 }, // JUF + { 0x00, 0x00 }, // JUR + { 0x00, 0x00 }, // PUSH + { 0x00, 0x00 }, // POP + { 0x00, 0x00 }, // ALLOC + { 0x00, 0x00 }, // HFREE + { 0x00, 0x00 }, // CALL + { 0x00, 0x00 }, // RET + { 0x00, 0x00 }, // EDI + { 0x00, 0x00 }, // SHSS + { 0x00, 0x00 }, // FLI + { 0x00, 0x00 }, // FNEG + { 0x00, 0x00 }, // FADD + { 0x00, 0x00 }, // FSUB + { 0x00, 0x00 }, // FMUL + { 0x00, 0x00 }, // FDIV + { 0x00, 0x00 }, // FMOD + { 0x00, 0x00 }, // FDMOD + { 0x00, 0x00 }, // FEPS + { 0x00, 0x00 }, // FEEP + { 0x00, 0x00 }, // FEQ + { 0x00, 0x00 }, // FNE + { 0x00, 0x00 }, // FGT + { 0x00, 0x00 }, // FGE + { 0x00, 0x00 }, // FLT + { 0x00, 0x00 }, // FLE + { 0x00, 0x00 }, // F2D + { 0x00, 0x00 }, // D2F + { 0x00, 0x00 }, // I2F + { 0x00, 0x00 }, // I2D + { 0x00, 0x00 }, // L2F + { 0x00, 0x00 }, // L2D + { 0x00, 0x00 }, // F2I + { 0x00, 0x00 }, // F2L + { 0x00, 0x00 }, // D2I + { 0x00, 0x00 }, // D2L + { 0x00, 0x00 }, // SIN + { 0x00, 0x00 }, // COS + { 0x00, 0x00 }, // TAN + { 0x00, 0x00 }, // ASIN + { 0x00, 0x00 }, // ACOS + { 0x00, 0x00 }, // ATAN + { 0x00, 0x00 }, // ATAN2 + { 0x00, 0x00 }, // EXP + { 0x00, 0x00 }, // LOG + { 0x00, 0x00 }, // LOGAB + { 0x00, 0x00 }, // POW + { 0x00, 0x00 }, // SQRT + { 0x00, 0x00 }, // ROOT + { 0x00, 0x00 }, // ADC + { 0x00, 0x00 }, // SWC + { 0x00, 0x00 }, // MWO + { 0x00, 0x00 }, // UMO + { 0x00, 0x00 }, // MADD + { 0x00, 0x00 }, // MSUB + { 0x00, 0x00 }, // MMUL + { 0x00, 0x00 }, // MINV + { 0x00, 0x00 }, // MTRA + { 0x00, 0x00 }, // MDET + { 0x00, 0x00 }, // XADD + { 0x00, 0x00 }, // XSUB + { 0x00, 0x00 }, // XAMA + { 0x00, 0x00 }, // XMUL + { 0x00, 0x00 }, // XDIV + { 0x00, 0x00 }, // UPY +}; + +// Type size masks — indexed by opcode. +constexpr u8 TYPE_SIZE_MASKS[] = { + 0x00, // NOP + 0x00, // SPDR + 0x01, // MMODE + 0x0F, // INT + 0x0C, // LRV + 0x0F, // FSR + 0x0F, // FIR + 0x0F, // FZR + 0x0F, // LSR + 0x0F, // FVR + 0x00, // MOV + 0x00, // MOR + 0x00, // AMOV + 0x00, // SWP + 0x0F, // AHM + 0x0F, // COM + 0x0F, // NEG + 0x0F, // EXS + 0x0F, // INC + 0x0F, // DEC + 0x0F, // ADD + 0x0F, // SUB + 0x0F, // MUL + 0x0F, // UMUL + 0x0F, // DIV + 0x0F, // UDIV + 0x0F, // MOD + 0x0F, // UMOD + 0x0F, // DMOD + 0x0F, // UDMD + 0x0F, // FBT + 0x0F, // STB + 0x0F, // CRB + 0x0F, // TSB + 0x0F, // BOOL + 0x0F, // NOT + 0x0F, // AND + 0x0F, // OR + 0x0F, // XOR + 0x0F, // SHL + 0x0F, // SHR + 0x0F, // SSR + 0x0F, // ROL + 0x0F, // ROR + 0x0F, // CNT + 0x0F, // EQ + 0x0F, // NE + 0x0F, // GT + 0x0F, // GE + 0x0F, // LT + 0x0F, // LE + 0x0F, // JMP + 0x0F, // JEQ + 0x0F, // JNE + 0x0F, // JIF + 0x0F, // JMR + 0x0F, // JER + 0x0F, // JNR + 0x0F, // JIR + 0x0F, // SFB + 0x0F, // LFB + 0x0F, // JUF + 0x0F, // JUR + 0x0F, // PUSH + 0x0F, // POP + 0x0F, // ALLOC + 0x0F, // HFREE + 0x0F, // CALL + 0x0F, // RET + 0x0F, // EDI + 0x0F, // SHSS + 0x00, // FLI + 0x00, // FNEG + 0x00, // FADD + 0x00, // FSUB + 0x00, // FMUL + 0x00, // FDIV + 0x00, // FMOD + 0x00, // FDMOD + 0x00, // FEPS + 0x00, // FEEP + 0x00, // FEQ + 0x00, // FNE + 0x00, // FGT + 0x00, // FGE + 0x00, // FLT + 0x00, // FLE + 0x00, // F2D + 0x00, // D2F + 0x00, // I2F + 0x00, // I2D + 0x00, // L2F + 0x00, // L2D + 0x00, // F2I + 0x00, // F2L + 0x00, // D2I + 0x00, // D2L + 0x00, // SIN + 0x00, // COS + 0x00, // TAN + 0x00, // ASIN + 0x00, // ACOS + 0x00, // ATAN + 0x00, // ATAN2 + 0x00, // EXP + 0x00, // LOG + 0x00, // LOGAB + 0x00, // POW + 0x00, // SQRT + 0x00, // ROOT + 0x00, // ADC + 0x00, // SWC + 0x00, // MWO + 0x00, // UMO + 0x00, // MADD + 0x00, // MSUB + 0x00, // MMUL + 0x00, // MINV + 0x00, // MTRA + 0x00, // MDET + 0x00, // XADD + 0x00, // XSUB + 0x00, // XAMA + 0x00, // XMUL + 0x00, // XDIV + 0x00, // UPY +}; + +} // namespace spider \ No newline at end of file diff --git a/docs/Spider Instructions.xlsx b/docs/Spider Instructions.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ff5ebad4f5e4844d0b36ed044f49790e2096740 GIT binary patch literal 107321 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 literal 0 HcmV?d00001 diff --git a/pygen.ipynb b/pygen.ipynb index b75834b..4d88ae5 100644 --- a/pygen.ipynb +++ b/pygen.ipynb @@ -23,43 +23,52 @@ "name": "stdout", "output_type": "stream", "text": [ - "Repo root : /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime\n", - "CPU.hpp : /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime/src/spider/runtime/cpu/CPU.hpp\n", - "XLSX : /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime/Spider_Instructions.xlsx\n", - "Output dir: /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime/pygen_out\n" + "Repo root : ./ -> (True)\n", + "CPU.hpp : .//src//spider/runtime/cpu/CPU.hpp -> (True)\n", + "XLSX : .//docs//Spider Instructions.xlsx -> (True)\n", + "Output dir: .//autogen/ -> (True)\n" ] } ], "source": [ "# setup directories\n", - "\n", "import os\n", "\n", - "# Root of the Spider runtime repo — adjust this path to match your machine (folder where spider-runtime lives).\n", - "REPO_ROOT = os.path.abspath('/home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime')\n", + "# [CHANGE]\n", + "# Since we're running on a local environment (i hope)\n", + "# we can just signal a relative directory.\n", + "REPO_ROOT = './'\n", + "DOCS_ROOT = f'{REPO_ROOT}/docs/'\n", + "SRC_ROOT = f'{REPO_ROOT}/src/'\n", "\n", "# Where CPU.hpp lives — this is the file we will inject generated code into.\n", - "CPU_HPP_PATH = os.path.join(REPO_ROOT, 'src', 'spider', 'runtime', 'cpu', 'CPU.hpp')\n", + "CPU_HPP_PATH = f'{SRC_ROOT}/spider/runtime/cpu/CPU.hpp'\n", "\n", "# Where the Excel instruction sheet lives. Allocate the .xlsx file in the project's root folder.\n", - "XLSX_PATH = os.path.join(REPO_ROOT, 'Spider_Instructions.xlsx')\n", + "# NOTE: The file I uploaded has a space instead of underscore!\n", + "XLSX_PATH = f'{DOCS_ROOT}/Spider Instructions.xlsx'\n", "\n", "# Output folder for any standalone generated files.\n", - "OUT_DIR = os.path.join(REPO_ROOT, 'pygen_out')\n", + "OUT_DIR = f'{REPO_ROOT}/autogen/'\n", "\n", "# Create the output directory if it does not exist yet.\n", "# exist_ok=True means no error if it already exists.\n", "os.makedirs(OUT_DIR, exist_ok=True)\n", "\n", - "print(f'Repo root : {REPO_ROOT}')\n", - "print(f'CPU.hpp : {CPU_HPP_PATH}')\n", - "print(f'XLSX : {XLSX_PATH}')\n", - "print(f'Output dir: {OUT_DIR}')\n" + "def dir_exists(path:str):\n", + " return os.path.exists(path) and os.path.isdir(path)\n", + "def file_exists(path:str):\n", + " return os.path.exists(path) and os.path.isfile(path)\n", + "\n", + "print(f'Repo root : {REPO_ROOT } -> ({ dir_exists(REPO_ROOT )})')\n", + "print(f'CPU.hpp : {CPU_HPP_PATH} -> ({file_exists(CPU_HPP_PATH)})')\n", + "print(f'XLSX : {XLSX_PATH } -> ({file_exists(XLSX_PATH )})')\n", + "print(f'Output dir: {OUT_DIR } -> ({ dir_exists(OUT_DIR )})')\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "b33de8ac", "metadata": {}, "outputs": [ @@ -135,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "58645013", "metadata": {}, "outputs": [ @@ -154,8 +163,8 @@ "Bit Wise 14\n", "Boolean 12\n", "Branch 12\n", - "Floating Point 10\n", "Casts 10\n", + "Floating Point 10\n", "Memory 9\n", "Trigonometric 7\n", "Exponential 6\n", @@ -271,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "452bc76c", "metadata": {}, "outputs": [ @@ -279,7 +288,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Masks written to: /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime/pygen_out/InstructionMasks.hpp\n", + "Masks written to: .//autogen/InstructionMasks.hpp\n", "Lines generated : 268\n" ] } @@ -345,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "5aaebef0", "metadata": {}, "outputs": [ @@ -367,7 +376,7 @@ " void SPDR();\n", "\n", "\n", - "CPU.hpp updated successfully at: /home/arturobalam/Documents/7thQuarter/Estancia_2/internship-repo/ArturoBalam-Internship2-repo/spider-runtime-folder/spider-runtime/src/spider/runtime/cpu/CPU.hpp\n", + "CPU.hpp updated successfully at: .//src//spider/runtime/cpu/CPU.hpp\n", "Total lines in updated file: 674\n" ] } @@ -440,7 +449,7 @@ ], "metadata": { "kernelspec": { - "display_name": "spider-rntm-env", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -454,7 +463,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/src/spider/runtime/cpu/CPU.hpp b/src/spider/runtime/cpu/CPU.hpp index 1e342f8..2bcb302 100644 --- a/src/spider/runtime/cpu/CPU.hpp +++ b/src/spider/runtime/cpu/CPU.hpp @@ -37,6 +37,636 @@ namespace spider { public: // // + // [System] 0x000 — NOP: No Operation + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Nothing + void NOP(); + + // [System] 0x001 — SPDR: Will place the Spider version of the interpreter in RA + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (Spider Version) -> RA + void SPDR(); + + // [System] 0x002 — MMODE: Set Memory Mode + // Params: 1 | AddrMask1: 05 AddrMask2: 00 | TypeMask: 01 + // Operation: Dst -> Memory Mode Bits + void MMODE(); + + // [System] 0x003 — INT: Interrupt + // Params: 1 | AddrMask1: 1F AddrMask2: 00 | TypeMask: 0F + // Operation: Performs system interrupt no. (Dst) (See table) + void INT(); + + // [System] 0x004 — LRV: Load Interrupt Vector Register + // Params: 1 | AddrMask1: 1F AddrMask2: 00 | TypeMask: 0C + // Operation: Dst -> RV + void LRV(); + + // [System] 0x005 — FSR: Fetch System Register + // Params: 1 | AddrMask1: 1E AddrMask2: 00 | TypeMask: 0F + // Operation: System Register at Dst -> Dst + void FSR(); + + // [System] 0x006 — FIR: Fetch Instruction Register + // Params: 1 | AddrMask1: 1E AddrMask2: 00 | TypeMask: 0F + // Operation: Instruction Register -> Dst + void FIR(); + + // [System] 0x007 — FZR: Fetch Stack Base Register + // Params: 1 | AddrMask1: 1E AddrMask2: 00 | TypeMask: 0F + // Operation: Stack Base Register -> Dst + void FZR(); + + // [System] 0x008 — LSR: Load System Register + // Params: 2 | AddrMask1: 1E AddrMask2: 1F | TypeMask: 0F + // Operation: Src -> System Register at Dst + void LSR(); + + // [System] 0x009 — FVR: Fetch Interrupt Vector Register + // Params: 1 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Interrupt Vector Register -> Dst + void FVR(); + + // [Memory] 0x00A — MOV: Moves values + // Params: 2 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Src -> Dst + void MOV(); + + // [Memory] 0x00B — MOR: Moves registers + // Params: 2 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: R Scr -> R Dst + void MOR(); + + // [Memory] 0x00C — AMOV: Array Move, uses X and Y as ptrs, A as amount + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Array from X to Y, by A amount + void AMOV(); + + // [Memory] 0x00D — SWP: Swap registers + // Params: 2 | AddrMask1: 04 AddrMask2: 04 | TypeMask: 00 + // Operation: Src <-> Dst + void SWP(); + + // [Memory] 0x00E — AHM: Ask Host for Memory + // Params: 1 | AddrMask1: 04 AddrMask2: 00 | TypeMask: 0F + // Operation: Asks the host for a specific size of memory. Responds with 0 or 1 + void AHM(); + + // [Integer] 0x010 — COM: One's complement + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: ~ Dst -> Dst + void COM(); + + // [Integer] 0x011 — NEG: Two's complement + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: - Dst -> Dst + void NEG(); + + // [Integer] 0x012 — EXS: Extend Sign + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Last bit is copied and expanded for the next int size + void EXS(); + + // [Integer] 0x013 — INC: Increment + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + 1 -> Dst + void INC(); + + // [Integer] 0x014 — DEC: Decrement + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst - 1 -> Dst + void DEC(); + + // [Integer] 0x015 — ADD: Addition + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + Src -> Dst + void ADD(); + + // [Integer] 0x016 — SUB: Subtraction + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst - Src-> Dst + void SUB(); + + // [Integer] 0x017 — MUL: Multiplication + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Signed Dst * Src -> Dst + void MUL(); + + // [Integer] 0x018 — UMUL: Unsigned Multiplication + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Unsigned Dst * Src -> Dst + void UMUL(); + + // [Integer] 0x019 — DIV: Division + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Signed Dst / Src -> Dst + void DIV(); + + // [Integer] 0x01A — UDIV: Unsigned Division + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Unsigned Dst / Src -> Dst + void UDIV(); + + // [Integer] 0x01B — MOD: Modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Signed Dst % Src -> Dst + void MOD(); + + // [Integer] 0x01C — UMOD: Unsigned Modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Unsigned Dst % Src -> Dst + void UMOD(); + + // [Integer] 0x01D — DMOD: Division and Modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Signed Dst / Src -> X, Dst % Src -> Y + void DMOD(); + + // [Integer] 0x01E — UDMD: Unsigned Division and Modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Unsigned Dst / Src -> X, Dst % Src -> Y + void UDMD(); + + // [System] 0x01F — FBT: Test and update Flag Register (Integer) Bits + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Flags of Dst - + void FBT(); + + // [Bit Wise] 0x020 — STB: Set Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Src# bit is set on Dst + void STB(); + + // [Bit Wise] 0x021 — CRB: Clear Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Src# bit is cleared on Dst + void CRB(); + + // [Bit Wise] 0x022 — TSB: Test Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Src# bit is tested against Dst, updates Equal Flag + void TSB(); + + // [Bit Wise] 0x023 — BOOL: Sets the booleaness of a value + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Tests Dst != 0, updates Equal Flag + void BOOL(); + + // [Bit Wise] 0x024 — NOT: Sets the inverse booleaness of a value (! BOOL) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Tests Dst == 0, updates Equal Flag + void NOT(); + + // [Bit Wise] 0x025 — AND: Boolean AND operation + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst AND Src into Dst + void AND(); + + // [Bit Wise] 0x026 — OR: Boolean OR operation + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst OR Src into Dst + void OR(); + + // [Bit Wise] 0x027 — XOR: Boolean XOR operation + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst XOR Src into Dst + void XOR(); + + // [Bit Wise] 0x028 — SHL: Arithmetic Shift Left + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst << Src into Dst + void SHL(); + + // [Bit Wise] 0x029 — SHR: Arithmetic Shift Right + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst >> Src into Dst + void SHR(); + + // [Bit Wise] 0x02A — SSR: Signed Shift Right + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst >>> Src into Dst + void SSR(); + + // [Bit Wise] 0x02B — ROL: Rotate Left + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst ROL Src into Dst + void ROL(); + + // [Bit Wise] 0x02C — ROR: Rotate Right + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst ROR Src into Dst + void ROR(); + + // [Bit Wise] 0x02D — CNT: Counts bits + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: # of 1's into Dst + void CNT(); + + // [Boolean] 0x030 — EQ: Equal + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst == Src into Dst + void EQ(); + + // [Boolean] 0x031 — NE: Not Equal + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst != Src into Dst + void NE(); + + // [Boolean] 0x032 — GT: Greater Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst > Src into Dst + void GT(); + + // [Boolean] 0x033 — GE: Greater or Equal Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst >= Src into Dst + void GE(); + + // [Boolean] 0x034 — LT: Lower Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst < Src into Dst + void LT(); + + // [Boolean] 0x035 — LE: Lower or Equal Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst <= Src into Dst + void LE(); + + // [Branch] 0x038 — JMP: Jump to absolute position + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> Instruction Register + void JMP(); + + // [Branch] 0x039 — JEQ: Jumps to position if EQ flag is set + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> Instruction Register IF Flags.EQ + void JEQ(); + + // [Branch] 0x03A — JNE: Jumps to position if EQ flag is cleared + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> Instruction Register IF NOT Flags.EQ + void JNE(); + + // [Branch] 0x03B — JIF: Jumps if value provided is booleanly true + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> Instruction Register IF Src + void JIF(); + + // [Branch] 0x03C — JMR: Jump Relative + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + Instruction Register -> Instruction Register + void JMR(); + + // [Branch] 0x03D — JER: Jumps to relative position if EQ flag is set + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + Instruction Register -> Instruction Register IF Flags.EQ + void JER(); + + // [Branch] 0x03E — JNR: Jumps to relative position if EQ flag is cleared + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + Instruction Register -> Instruction Register IF NOT Flags.EQ + void JNR(); + + // [Branch] 0x03F — JIR: Jumps to relative position if value provided is booleanly true + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst + Instruction Register -> Instruction Register IF Src + void JIR(); + + // [System] 0x040 — SFB: Store (User) Flag Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: + void SFB(); + + // [System] 0x041 — LFB: Load (User) Flag Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: + void LFB(); + + // [Branch] 0x042 — JUF: Jump to absolute position, if user flag is true + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: + void JUF(); + + // [Branch] 0x043 — JUR: Jump to relative position, if user flag is true + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: + void JUR(); + + // [Memory] 0x044 — PUSH: Push to stack + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> pushed into stack + void PUSH(); + + // [Memory] 0x045 — POP: Pop from stack + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: popped from stack -> Dst + void POP(); + + // [Memory] 0x046 — ALLOC: Allocate to heap + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Dst -> heap ptr of size Dst + void ALLOC(); + + // [Memory] 0x047 — HFREE: Delete from heap + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Frees heap ptr in Dst + void HFREE(); + + // [Branch] 0x04A — CALL: Call function at instruction index + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Performs a function call, step XX + void CALL(); + + // [Branch] 0x04B — RET: Return from a function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: Undoes a function call, step XX + void RET(); + + // [System] 0x04C — EDI: Enable/Disable External Interrupts + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: bool( Dst ) -> Enable External Interrupts Bit + void EDI(); + + // [System] 0x04D — SHSS: Set Hotswap Signal Bit + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 0F + // Operation: bool( Dst ) -> Hot Swap Signal Bit + void SHSS(); + + // [Floating Point] 0x050 — FLI: Float Load Immediate + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void FLI(); + + // [Floating Point] 0x051 — FNEG: Float negate + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: - Dst -> Dst + void FNEG(); + + // [Floating Point] 0x052 — FADD: Float add + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst + Src -> Dst + void FADD(); + + // [Floating Point] 0x053 — FSUB: Float subtract + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst - Src-> Dst + void FSUB(); + + // [Floating Point] 0x054 — FMUL: Float multiplication + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst * Src -> Dst + void FMUL(); + + // [Floating Point] 0x055 — FDIV: Float division + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst / Src -> Dst + void FDIV(); + + // [Floating Point] 0x056 — FMOD: Float modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst % Src -> Dst + void FMOD(); + + // [Floating Point] 0x057 — FDMOD: Float division and modulus + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst / Src -> X, Dst % Src -> Y + void FDMOD(); + + // [Floating Point] 0x058 — FEPS: Sets the float epsilon value, for comparison + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst -> Epsilon Register + void FEPS(); + + // [Floating Point] 0x059 — FEEP: Float Enable/Disable Epsilon + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: bool( Dst ) -> Epsilon Enable Bit + void FEEP(); + + // [Boolean] 0x05A — FEQ: Float Equal + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst == Src into Dst + void FEQ(); + + // [Boolean] 0x05B — FNE: Float Not Equal + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst != Src into Dst + void FNE(); + + // [Boolean] 0x05C — FGT: Float Greater Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst > Src into Dst + void FGT(); + + // [Boolean] 0x05D — FGE: Float Greater or Equal Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst >= Src into Dst + void FGE(); + + // [Boolean] 0x05E — FLT: Float Lower Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst < Src into Dst + void FLT(); + + // [Boolean] 0x05F — FLE: Float Lower or Equal Than + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst <= Src into Dst + void FLE(); + + // [Casts] 0x060 — F2D: F32 (Float) to F64 (Double) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void F2D(); + + // [Casts] 0x061 — D2F: F64 (Double) to F32 (Float) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void D2F(); + + // [Casts] 0x062 — I2F: I32 (Integer) to F32 (Float) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void I2F(); + + // [Casts] 0x063 — I2D: I32 (Integer) to F64 (Double) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void I2D(); + + // [Casts] 0x064 — L2F: I64 (Long) to F32 (Float) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void L2F(); + + // [Casts] 0x065 — L2D: I64 (Long) to F64 (Double) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void L2D(); + + // [Casts] 0x066 — F2I: F32 (Float) to I32 (Integer) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void F2I(); + + // [Casts] 0x067 — F2L: F32 (Float) to I64 (Long) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void F2L(); + + // [Casts] 0x068 — D2I: F64 (Double) to I32 (Integer) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void D2I(); + + // [Casts] 0x069 — D2L: F64 (Double) to I64 (Long) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: (cast) Dst -> Dst + void D2L(); + + // [Trigonometric] 0x06C — SIN: Sine Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: sin( Dst ) -> Dst + void SIN(); + + // [Trigonometric] 0x06D — COS: Cosine Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: cos( Dst ) -> Dst + void COS(); + + // [Trigonometric] 0x06E — TAN: Tangent Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: tan( Dst ) -> Dst + void TAN(); + + // [Trigonometric] 0x06F — ASIN: Arc Sine Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: asin( Dst ) -> Dst + void ASIN(); + + // [Trigonometric] 0x070 — ACOS: Arc Cosine Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: acos( Dst ) -> Dst + void ACOS(); + + // [Trigonometric] 0x071 — ATAN: Arc Tangent Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: atan( Dst ) -> Dst + void ATAN(); + + // [Trigonometric] 0x072 — ATAN2: Arc Tangent Function with 2 Arguments + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: atan( Dst, Src ) -> Dst + void ATAN2(); + + // [Exponential] 0x074 — EXP: Exponential Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: exp( Dst ) -> Dst + void EXP(); + + // [Exponential] 0x075 — LOG: Natural Logarithm + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: ln( Dst ) -> Dst + void LOG(); + + // [Exponential] 0x076 — LOGAB: Logarithm A of B + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: log( Dst, Src ) -> Dst + void LOGAB(); + + // [Exponential] 0x077 — POW: Power Function + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: pow( Dst, Src ) -> Dst + void POW(); + + // [Exponential] 0x078 — SQRT: Square Root + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: sqrt( Dst ) -> Dst + void SQRT(); + + // [Exponential] 0x079 — ROOT: General Root + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: pow( Dst, 1 / Src ) -> Dst + void ROOT(); + + // [Integer] 0x07C — ADC: Add with Carry + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst + Src + Flags.Carry -> Dst, Flags.Carry + void ADC(); + + // [Integer] 0x07D — SWC: Subtract with Carry (Borrow) + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Dst - Src - Flags.Carry -> Dst, Flags.Carry + void SWC(); + + // [Integer] 0x07E — MWO: Multiply with Overflow + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Signed Dst * Src -> Dst, Flags.Carry + void MWO(); + + // [Integer] 0x07F — UMO: Unsigned Multiply with Overflow + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: Unsigned Dst * Src -> Dst, Flags.Carry + void UMO(); + + // [Matrix] 0x080 — MADD: Matrix Addition + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MADD(); + + // [Matrix] 0x081 — MSUB: Matrix Subtraction + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MSUB(); + + // [Matrix] 0x082 — MMUL: Matrix Multiply + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MMUL(); + + // [Matrix] 0x083 — MINV: Matrix Inverse + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MINV(); + + // [Matrix] 0x084 — MTRA: Matrix Transpose + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MTRA(); + + // [Matrix] 0x085 — MDET: Matrix Determinant + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void MDET(); + + // [SIMD] 0x08A — XADD: SIMD Addition + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void XADD(); + + // [SIMD] 0x08B — XSUB: SIMD Subtract + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void XSUB(); + + // [SIMD] 0x08C — XAMA: SIMD Alternate Multiply-Add + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void XAMA(); + + // [SIMD] 0x08D — XMUL: SIMD Multiply + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void XMUL(); + + // [SIMD] 0x08E — XDIV: SIMD Divide + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void XDIV(); + + // [Easter Eggs] 0x0F0 — UPY: Will place "YUPI" in memory + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void UPY(); + // // };