diff --git a/src/spider/runtime/instr/Instr_020-03F.cpp b/src/spider/runtime/instr/Instr_020-03F.cpp index 3fcb420..aabac35 100644 --- a/src/spider/runtime/instr/Instr_020-03F.cpp +++ b/src/spider/runtime/instr/Instr_020-03F.cpp @@ -154,10 +154,7 @@ namespace spider { // TODO: Implement JIF } - /** - * 0x03C — Jump Relative. - * Adds a signed offset (Dst) to the instruction register. - */ + // ── 0x03C — JMR: Dst + Instruction Register -> Instruction Register ── void CPU::JMR() { fetchOperDst(); i64 offset; @@ -170,10 +167,7 @@ namespace spider { RI = static_cast(static_cast(RI) + offset); } - /** - * 0x03D — Jump Relative if Equal. - * Adds a signed offset (Dst) to RI only if the Equal flag (bit 10) is set. - */ + // ── 0x03D — JER: Dst + Instruction Register -> Instruction Register IF Flags.EQ ── void CPU::JER() { fetchOperDst(); if (RF & CPU::FLAG_EQUAL) { @@ -188,10 +182,7 @@ namespace spider { } } - /** - * 0x03E — Jump Relative if Not Equal. - * Adds a signed offset (Dst) to RI only if the Equal flag (bit 10) is cleared. - */ + // ── 0x03E — JNR: Dst + Instruction Register -> Instruction Register IF NOT Flags.EQ ── void CPU::JNR() { fetchOperDst(); if (!(RF & CPU::FLAG_EQUAL)) { @@ -206,10 +197,7 @@ namespace spider { } } - /** - * 0x03F — Jump Relative if Src is true. - * Adds a signed offset (Dst) to RI only if Src is booleanly true (non-zero). - */ + // ── 0x03F — JIR: Dst + Instruction Register -> Instruction Register IF Src ── void CPU::JIR() { fetchOperSrc(); fetchOperDst(); diff --git a/src/spider/runtime/instr/Instr_040-05F.cpp b/src/spider/runtime/instr/Instr_040-05F.cpp index de96aa6..bfc53e8 100644 --- a/src/spider/runtime/instr/Instr_040-05F.cpp +++ b/src/spider/runtime/instr/Instr_040-05F.cpp @@ -8,9 +8,7 @@ namespace spider { -// ── 0x040 — SFB: Store (User) Flag Bit ───────────────────────────── - // bool(Src) -> User Flag at index (Dst & 0x3) - // Flags A-D are bits 20-23 of RF. + // ── 0x040 — SFB: Store (User) Flag Bit ────────────────────────────── void CPU::SFB() { fetchOperSrc(); fetchOperDst(); @@ -24,7 +22,6 @@ namespace spider { } // ── 0x041 — LFB: Load (User) Flag Bit ────────────────────────────── - // User Flag at index (Src & 0x3) -> Dst void CPU::LFB() { fetchOperSrc(); fetchOperDst(); @@ -34,8 +31,7 @@ namespace spider { (this->*_post)(); } - // ── 0x042 — JUF: Jump absolute if User Flag is true ──────────────── - // Dst -> RI IF User Flag at index (Src & 0x3) is set + // ── 0x042 — JUF: Jump to absolute position, if user flag is true ──── void CPU::JUF() { fetchOperSrc(); fetchOperDst(); @@ -46,8 +42,7 @@ namespace spider { } } - // ── 0x043 — JUR: Jump relative if User Flag is true ──────────────── - // Dst + RI -> RI IF User Flag at index (Src & 0x3) is set + // ── 0x043 — JUR: Jump to relative position, if user flag is true ──── void CPU::JUR() { fetchOperSrc(); fetchOperDst(); @@ -60,14 +55,13 @@ namespace spider { case 0b01: offset = static_cast(_dst->_i16); break; case 0b10: offset = static_cast(_dst->_i32); break; case 0b11: offset = _dst->_i64; break; + default: offset = 0; break; } RI = static_cast(static_cast(RI) + offset); } } - // ── 0x044 — PUSH: Push to stack ───────────────────────────────────── - // Dst -> RAM[RS], RS += (1 << _size) - // The stack grows upward from the bottom of memory. + // ── 0x044 — PUSH: Dst -> pushed into stack ────────────────────────── void CPU::PUSH() { fetchOperDst(); u8 bytes = 1 << _size; @@ -77,8 +71,7 @@ namespace spider { RS += bytes; } - // ── 0x045 — POP: Pop from stack ───────────────────────────────────── - // RS -= (1 << _size), RAM[RS] -> Dst + // ── 0x045 — POP: popped from stack -> Dst ─────────────────────────── void CPU::POP() { fetchOperDst(); u8 bytes = 1 << _size; @@ -87,8 +80,7 @@ namespace spider { (this->*_post)(); } - // ── 0x046 — ALLOC: Allocate to heap ───────────────────────────────── - // Stub: returns 0 (null) until proper heap management is implemented. + // ── 0x046 — ALLOC: Dst -> heap ptr of size Dst ────────────────────── void CPU::ALLOC() { fetchOperDst(); // TODO: Proper heap allocation with gap tracking. @@ -96,25 +88,17 @@ namespace spider { (this->*_post)(); } - // ── 0x047 — HFREE: Delete from heap ───────────────────────────────── - // Stub: no-op until proper heap management is implemented. + // ── 0x047 — HFREE: Frees heap ptr in Dst ──────────────────────────── void CPU::HFREE() { fetchOperDst(); // TODO: Proper heap deallocation. } - //──────────────────────────────────────────────────────── - - // ── 0x04A — CALL: Call function at instruction index ──────────────── - // Minimal version: saves RZ and RI to the stack, - // updates the stack base, then jumps to Dst. - // The calling convention (parameter passing, caller-saved - // registers) is the compiler's responsibility. + // ── 0x04A — CALL: Performs a function call, step XX ────────────────── void CPU::CALL() { fetchOperDst(); u64 target = _dst->_u64; - // Push old stack base (RZ) — always 8 bytes register_t rz_save; rz_save._u64 = RZ; for (u8 i = 0; i < 8; i++) { @@ -122,7 +106,6 @@ namespace spider { } RS += 8; - // Push return address (RI) — always 8 bytes register_t ri_save; ri_save._u64 = RI; for (u8 i = 0; i < 8; i++) { @@ -130,35 +113,26 @@ namespace spider { } RS += 8; - // New stack base is the current stack top RZ = RS; - - // Jump to target RI = target; } - // ── 0x04B — RET: Return from a function ───────────────────────────── - // Undoes what CALL did: restores RI and RZ from the stack. + // ── 0x04B — RET: Undoes a function call, step XX ──────────────────── void CPU::RET() { - // Wind the stack back to the current frame base RS = RZ; - // Pop return address RS -= 8; register_t ri_restore; _ram->loadRegister(RS, 0b11, &ri_restore); RI = ri_restore._u64; - // Pop previous stack base RS -= 8; register_t rz_restore; _ram->loadRegister(RS, 0b11, &rz_restore); RZ = rz_restore._u64; } - // ── 0x04C — EDI: Enable/Disable External Interrupts ──────────────── - // bool(Dst) == true -> enable (clear the disable bit) - // bool(Dst) == false -> disable (set the disable bit) + // ── 0x04C — EDI: bool( Dst ) -> Enable External Interrupts Bit ───── void CPU::EDI() { fetchOperDst(); if (_dst->_u64 != 0) { @@ -168,8 +142,7 @@ namespace spider { } } - // ── 0x04D — SHSS: Set Hotswap Signal Bit ──────────────────────────── - // bool(Dst) -> Hotswap Signal flag (bit 16 of RF) + // ── 0x04D — SHSS: bool( Dst ) -> Hot Swap Signal Bit ──────────────── void CPU::SHSS() { fetchOperDst(); if (_dst->_u64 != 0) { @@ -179,47 +152,43 @@ namespace spider { } } - //──────────────────────────────────────────────────────────────────────────────────── - // ── 0x050 — FLI: Float Load Immediate ─────────────────────────────── - // The addressing mode already loads the raw bytes into Dst. - // _size == 0b10 for f32, 0b11 for f64. void CPU::FLI() { fetchOperDst(); (this->*_post)(); } - // ── 0x051 — FNEG: Float negate ────────────────────────────────────── - // -Dst -> Dst + // ── 0x051 — FNEG: - Dst -> Dst ────────────────────────────────────── void CPU::FNEG() { fetchOperDst(); switch (_size) { case 0b10: _dst->_f32 = -_dst->_f32; break; case 0b11: _dst->_f64 = -_dst->_f64; break; + default: break; } (this->*_post)(); } - // ── 0x052 — FADD: Float add ───────────────────────────────────────── - // Dst + Src -> Dst + // ── 0x052 — FADD: Dst + Src -> Dst ────────────────────────────────── void CPU::FADD() { fetchOperSrc(); fetchOperDst(); switch (_size) { case 0b10: _dst->_f32 += _src->_f32; break; case 0b11: _dst->_f64 += _src->_f64; break; + default: break; } (this->*_post)(); } - // ── 0x053 — FSUB: Float subtract ──────────────────────────────────── - // Dst - Src -> Dst + // ── 0x053 — FSUB: Dst - Src -> Dst ────────────────────────────────── void CPU::FSUB() { fetchOperSrc(); fetchOperDst(); switch (_size) { case 0b10: _dst->_f32 -= _src->_f32; break; case 0b11: _dst->_f64 -= _src->_f64; break; + default: break; } (this->*_post)(); }