diff --git a/autogen/InstructionMasks.hpp b/autogen/InstructionMasks.hpp index 54ad74a..231bbfe 100644 --- a/autogen/InstructionMasks.hpp +++ b/autogen/InstructionMasks.hpp @@ -21,7 +21,6 @@ constexpr u8 ADDR_MODE_MASKS[][2] = { { 0x04, 0x04 }, // MOR { 0x00, 0x00 }, // AMOV { 0x04, 0x04 }, // SWP - { 0x04, 0x00 }, // AHM { 0xFF, 0x00 }, // COM { 0xFF, 0x00 }, // NEG { 0xFF, 0x00 }, // EXS @@ -37,7 +36,6 @@ constexpr u8 ADDR_MODE_MASKS[][2] = { { 0x1E, 0xFF }, // UMOD { 0x1E, 0xFF }, // DMOD { 0x1E, 0xFF }, // UDMD - { 0xFF, 0x00 }, // FBT { 0x1E, 0xFF }, // STB { 0x1E, 0xFF }, // CRB { 0x1E, 0xFF }, // TSB @@ -139,6 +137,12 @@ constexpr u8 ADDR_MODE_MASKS[][2] = { { 0x00, 0x00 }, // XMUL { 0x00, 0x00 }, // XDIV { 0x00, 0x00 }, // UPY + { 0x00, 0x00 }, // INT_1_SLOT + { 0x00, 0x00 }, // INT_2_SLOT + { 0x00, 0x00 }, // INT_3_SLOT + { 0x00, 0x00 }, // INT_4_SLOT + { 0x00, 0x00 }, // BRAD + { 0x00, 0x00 }, // DGANT }; // Type size masks — indexed by opcode. @@ -157,7 +161,6 @@ constexpr u8 TYPE_SIZE_MASKS[] = { 0x08, // MOR 0x08, // AMOV 0x08, // SWP - 0x08, // AHM 0x0F, // COM 0x0F, // NEG 0x0F, // EXS @@ -173,7 +176,6 @@ constexpr u8 TYPE_SIZE_MASKS[] = { 0x0F, // UMOD 0x0F, // DMOD 0x0F, // UDMD - 0x0F, // FBT 0x0F, // STB 0x0F, // CRB 0x0F, // TSB @@ -275,6 +277,12 @@ constexpr u8 TYPE_SIZE_MASKS[] = { 0x00, // XMUL 0x00, // XDIV 0x00, // UPY + 0x00, // INT_1_SLOT + 0x00, // INT_2_SLOT + 0x00, // INT_3_SLOT + 0x00, // INT_4_SLOT + 0x00, // BRAD + 0x00, // DGANT }; } // namespace spider \ No newline at end of file diff --git a/docs/Spider Instructions.xlsx b/docs/Spider Instructions.xlsx index d9da606..44285f7 100644 Binary files a/docs/Spider Instructions.xlsx and b/docs/Spider Instructions.xlsx differ diff --git a/makefile b/makefile index 590408f..69067c2 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,10 @@ -#Compiler and Linker +#Compiler, Archiver and Linker CC := g++ +AR := ar +ARFLAGS := rcs -#The Target Binary Program -TARGET := out.exe +# The Target Static Library +TARGET := libspider-runtimelib.a #The Directories, Source, Includes, Objects, Binary and Resources SRCDIR := src @@ -15,49 +17,43 @@ OBJEXT := o #Flags, Libraries and Includes ROOT := ./ CFLAGS := -std=c++20 -O2 \ - -Wall -Werror -Wextra \ - -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align \ - -Wunused -Woverloaded-virtual -Wconversion \ - -Wsign-conversion -Wnull-dereference -Wdouble-promotion \ - -Wformat=2 -Wimplicit-fallthrough -Wsuggest-override \ - -Wextra-semi -Wduplicated-cond -Wduplicated-branches \ - -Wlogical-op -Wuseless-cast -LFLAGS := -std=c++20 -static-libstdc++ -static-libgcc \ - -Wl,--fatal-warnings -Wl,--warn-common -LIB := + -Wall -Werror -Wextra \ + -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align \ + -Wunused -Woverloaded-virtual -Wconversion \ + -Wsign-conversion -Wnull-dereference -Wdouble-promotion \ + -Wformat=2 -Wimplicit-fallthrough -Wsuggest-override \ + -Wextra-semi -Wduplicated-cond -Wduplicated-branches \ + -Wlogical-op -Wuseless-cast INC := -I./src/ #--------------------------------------------------------------------------------- #DO NOT EDIT BELOW THIS LINE #--------------------------------------------------------------------------------- + SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.$(OBJEXT))) -#Defauilt Make +#Default Make all: directories $(TARGET) #Remake -remake: cleaner all +remake: clean all #Make the Directories directories: @mkdir -p $(TARGETDIR) @mkdir -p $(BUILDDIR) -#Clean only Objecst +#Clean only Objects clean: @$(RM) -rf $(BUILDDIR) -#Full Clean, Objects and Binaries -cleaner: clean - @$(RM) -rf $(TARGETDIR) - #Pull in dependency info for *existing* .o files -include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT)) -#Link +#Create Static Library (Archive) $(TARGET): $(OBJECTS) - $(CC) $(LFLAGS) -o $(TARGETDIR)/$(TARGET) $^ $(LIB) + $(AR) $(ARFLAGS) $(TARGETDIR)/$(TARGET) $^ #Compile $(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT) @@ -70,4 +66,4 @@ $(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT) @rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp #Non-File Targets -.PHONY: all remake clean cleaner resources \ No newline at end of file +.PHONY: all remake clean diff --git a/pygen.ipynb b/pygen.ipynb index 79251c1..5d58507 100644 --- a/pygen.ipynb +++ b/pygen.ipynb @@ -144,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "58645013", "metadata": {}, "outputs": [ @@ -152,26 +152,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "Real instructions : 132\n", - "Reserved slots : 10\n", + "Real instructions : 136\n", + "Reserved slots : 12\n", "Duplicate check : PASSED\n", "\n", "Groups found:\n", "group\n", "Integer 19\n", "Boolean 16\n", - "System 15\n", "Bit Wise 14\n", + "System 14\n", "Branch 12\n", "Floating Point 10\n", "Casts 10\n", - "Memory 9\n", + "Memory 8\n", "Trigonometric 7\n", + "Easter Eggs 7\n", "Exponential 6\n", "Matrix 6\n", "SIMD 5\n", "Quaternion 2\n", - "Easter Eggs 1\n", "\n", "First 5 instructions:\n", " byte_code mnemonic group params addr_mask_1 type_mask\n", @@ -283,7 +283,352 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, + "id": "ac8bb791", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
skip_0skip_1byte_codemnemonicnamegroupparamsimpimmabs...BSILFDtype_maskexpensiveoperationskip_2
140NaNNaN08CXAMASIMD Alternate Multiply-AddSIMD01.0XX...XXXXXX00NaNNaN
141NaNNaN08DXMULSIMD MultiplySIMD01.0XX...XXXXXX00NaNNaN
142NaNNaN08EXDIVSIMD DivideSIMD01.0XX...XXXXXX00NaNNaN
240NaNEaster Eggs0F0UPYWill place \"YUPI\" in memoryEaster Eggs01.0XX...XXXXXX00NaNNaN
241NaNNaN0F1INT_1_SLOTEaster Eggs01.0XX...XXXXXX00NaNNaN
242NaNNaN0F2INT_2_SLOTEaster Eggs01.0XX...XXXXXX00NaNNaN
243NaNNaN0F3INT_3_SLOTEaster Eggs01.0XX...XXXXXX00NaNNaN
244NaNNaN0F4INT_4_SLOTEaster Eggs01.0XX...XXXXXX00NaNNaN
245NaNNaN0F5BRADEaster Eggs01.0XX...XXXXXX00NaNNaN
246NaNNaN0F6DGANTEaster Eggs01.0XX...XXXXXX00NaNNaN
\n", + "

10 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " skip_0 skip_1 byte_code mnemonic name \\\n", + "140 NaN NaN 08C XAMA SIMD Alternate Multiply-Add \n", + "141 NaN NaN 08D XMUL SIMD Multiply \n", + "142 NaN NaN 08E XDIV SIMD Divide \n", + "240 NaN Easter Eggs 0F0 UPY Will place \"YUPI\" in memory \n", + "241 NaN NaN 0F1 INT_1_SLOT \n", + "242 NaN NaN 0F2 INT_2_SLOT \n", + "243 NaN NaN 0F3 INT_3_SLOT \n", + "244 NaN NaN 0F4 INT_4_SLOT \n", + "245 NaN NaN 0F5 BRAD \n", + "246 NaN NaN 0F6 DGANT \n", + "\n", + " group params imp imm abs ... B S I L F D type_mask \\\n", + "140 SIMD 0 1.0 X X ... X X X X X X 00 \n", + "141 SIMD 0 1.0 X X ... X X X X X X 00 \n", + "142 SIMD 0 1.0 X X ... X X X X X X 00 \n", + "240 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "241 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "242 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "243 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "244 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "245 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "246 Easter Eggs 0 1.0 X X ... X X X X X X 00 \n", + "\n", + " expensive operation skip_2 \n", + "140 NaN NaN \n", + "141 NaN NaN \n", + "142 NaN NaN \n", + "240 NaN NaN \n", + "241 NaN NaN \n", + "242 NaN NaN \n", + "243 NaN NaN \n", + "244 NaN NaN \n", + "245 NaN NaN \n", + "246 NaN NaN \n", + "\n", + "[10 rows x 29 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "instrs_df.tail(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "id": "452bc76c", "metadata": {}, "outputs": [ @@ -292,7 +637,7 @@ "output_type": "stream", "text": [ "Masks written to: .//autogen/InstructionMasks.hpp\n", - "Lines generated : 280\n" + "Lines generated : 288\n" ] } ], @@ -357,7 +702,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "5aaebef0", "metadata": {}, "outputs": [ @@ -365,7 +710,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Instructions formatted: 132\n", + "Instructions formatted: 136\n", "\n", "--- Preview (first 2 instructions) ---\n", " // [System] 0x000 — NOP: No Operation\n", @@ -380,7 +725,7 @@ "\n", "\n", "CPU.hpp updated successfully at: .//src//spider/runtime/cpu/CPU.hpp\n", - "Total lines in updated file: 911\n" + "Total lines in updated file: 942\n" ] } ], @@ -460,9 +805,9 @@ "output_type": "stream", "text": [ "InstrMap.cpp written to: .//src//spider/runtime/instr/InstrMap.cpp\n", - " Size : 33,581 bytes\n", - " Array entries : 512 (132 populated, 380 nullptr)\n", - " Switch cases : 132\n", + " Size : 33,582 bytes\n", + " Array entries : 512 (136 populated, 376 nullptr)\n", + " Switch cases : 136\n", " Line endings : LF-only verified\n" ] } @@ -618,7 +963,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "9f190f4c", "metadata": {}, "outputs": [], diff --git a/src/spider/runtime/cpu/CPU.hpp b/src/spider/runtime/cpu/CPU.hpp index 73f9c66..0c3f2b5 100644 --- a/src/spider/runtime/cpu/CPU.hpp +++ b/src/spider/runtime/cpu/CPU.hpp @@ -325,11 +325,6 @@ namespace spider { // Operation: Src <-> Dst void SWP(); - // [Memory] 0x00E — AHM: Ask Host for Memory - // Params: 1 | AddrMask1: 04 AddrMask2: 00 | TypeMask: 08 - // Operation: Asks the host for a specific size of memory. Responds with 0 or 1 - void AHM(); - // [Integer] 0x010 — COM: One's complement // Params: 1 | AddrMask1: FF AddrMask2: 00 | TypeMask: 0F // Operation: ~ Dst -> Dst @@ -405,11 +400,6 @@ namespace spider { // Operation: Unsigned Dst / Src -> X, Dst % Src -> Y void UDMD(); - // [System] 0x01F — FBT: Test and update Flag Register (Integer) Bits - // Params: 1 | AddrMask1: FF AddrMask2: 00 | TypeMask: 0F - // Operation: Flags of Dst - - void FBT(); - // [Bit Wise] 0x020 — STB: Set Bit // Params: 2 | AddrMask1: 1E AddrMask2: FF | TypeMask: 0F // Operation: Src# bit is set on Dst @@ -915,6 +905,36 @@ namespace spider { // Operation: void UPY(); + // [Easter Eggs] 0x0F1 — INT_1_SLOT: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void INT_1_SLOT(); + + // [Easter Eggs] 0x0F2 — INT_2_SLOT: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void INT_2_SLOT(); + + // [Easter Eggs] 0x0F3 — INT_3_SLOT: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void INT_3_SLOT(); + + // [Easter Eggs] 0x0F4 — INT_4_SLOT: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void INT_4_SLOT(); + + // [Easter Eggs] 0x0F5 — BRAD: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void BRAD(); + + // [Easter Eggs] 0x0F6 — DGANT: + // Params: 0 | AddrMask1: 00 AddrMask2: 00 | TypeMask: 00 + // Operation: + void DGANT(); + // // }; diff --git a/src/spider/runtime/instr/InstrMap.cpp b/src/spider/runtime/instr/InstrMap.cpp index c6a29c0..5fb2314 100644 --- a/src/spider/runtime/instr/InstrMap.cpp +++ b/src/spider/runtime/instr/InstrMap.cpp @@ -49,7 +49,7 @@ CPU::Fn CPU::instrMap[] = { &CPU::MOR, // 0x00B — Moves registers &CPU::AMOV, // 0x00C — Array Move, uses X and Y as ptrs, A as amount &CPU::SWP, // 0x00D — Swap registers - &CPU::AHM, // 0x00E — Ask Host for Memory + nullptr, // 0x00E (reserved) nullptr, // 0x00F (reserved) &CPU::COM, // 0x010 — One's complement &CPU::NEG, // 0x011 — Two's complement @@ -66,7 +66,7 @@ CPU::Fn CPU::instrMap[] = { &CPU::UMOD, // 0x01C — Unsigned Modulus &CPU::DMOD, // 0x01D — Division and Modulus &CPU::UDMD, // 0x01E — Unsigned Division and Modulus - &CPU::FBT, // 0x01F — Test and update Flag Register (Integer) Bits + nullptr, // 0x01F (reserved) &CPU::STB, // 0x020 — Set Bit &CPU::CRB, // 0x021 — Clear Bit &CPU::TSB, // 0x022 — Test Bit @@ -276,12 +276,12 @@ CPU::Fn CPU::instrMap[] = { nullptr, // 0x0EE nullptr, // 0x0EF &CPU::UPY, // 0x0F0 — Will place "YUPI" in memory - nullptr, // 0x0F1 - nullptr, // 0x0F2 - nullptr, // 0x0F3 - nullptr, // 0x0F4 - nullptr, // 0x0F5 - nullptr, // 0x0F6 + &CPU::INT_1_SLOT, // 0x0F1 — + &CPU::INT_2_SLOT, // 0x0F2 — + &CPU::INT_3_SLOT, // 0x0F3 — + &CPU::INT_4_SLOT, // 0x0F4 — + &CPU::BRAD, // 0x0F5 — + &CPU::DGANT, // 0x0F6 — nullptr, // 0x0F7 nullptr, // 0x0F8 nullptr, // 0x0F9 @@ -583,7 +583,6 @@ void CPU::executeSwLk() { case 0x00B: MOR(); break; case 0x00C: AMOV(); break; case 0x00D: SWP(); break; - case 0x00E: AHM(); break; // ── Integer ───────────────────────────────────── case 0x010: COM(); break; @@ -602,9 +601,6 @@ void CPU::executeSwLk() { case 0x01D: DMOD(); break; case 0x01E: UDMD(); break; - // ── System ────────────────────────────────────── - case 0x01F: FBT(); break; - // ── Bit Wise ──────────────────────────────────── case 0x020: STB(); break; case 0x021: CRB(); break; @@ -741,6 +737,12 @@ void CPU::executeSwLk() { // ── Easter Eggs ───────────────────────────────── case 0x0F0: UPY(); break; + case 0x0F1: INT_1_SLOT(); break; + case 0x0F2: INT_2_SLOT(); break; + case 0x0F3: INT_3_SLOT(); break; + case 0x0F4: INT_4_SLOT(); break; + case 0x0F5: BRAD(); break; + case 0x0F6: DGANT(); break; default: break; diff --git a/src/spider/runtime/instr/Instr_000-01F.cpp b/src/spider/runtime/instr/Instr_000-01F.cpp index 3b39bab..6dd96a8 100644 --- a/src/spider/runtime/instr/Instr_000-01F.cpp +++ b/src/spider/runtime/instr/Instr_000-01F.cpp @@ -402,21 +402,8 @@ namespace spider { } void CPU::FBT() { - fetchOperDst(); - switch (_size) { - case 0b00: //byte - RF = u8((RF & ~(0x3 << 9))) | ((_dst->_u8 >> 9) & 0x3) << 9; - break; - case 0b01: //short - RF = u16((RF & ~(0x3 << 9))) | ((_dst->_u16 >> 9) & 0x3) << 9; - break; - case 0b10: //int - RF = u32((RF & ~(0x3 << 9))) | ((_dst->_u32 >> 9) & 0x3) << 9; - break; - case 0b11: //long - RF = u64((RF & ~(0x3 << 9))) | ((_dst->_u64 >> 9) & 0x3) << 9; - break; - } + fetchOperReg(); + RF = _dst->_u64; // TODO: Mask accepted flags } } diff --git a/src/spider/runtime/instr/Instr_020-03F.cpp b/src/spider/runtime/instr/Instr_020-03F.cpp index 285ff91..2bf7c98 100644 --- a/src/spider/runtime/instr/Instr_020-03F.cpp +++ b/src/spider/runtime/instr/Instr_020-03F.cpp @@ -8,7 +8,6 @@ namespace spider { void CPU::STB() { - // TODO: Implement STB fetchOperSrc(); fetchOperDst(); switch(_size){ @@ -28,92 +27,66 @@ namespace spider { } void CPU::CRB() { - // TODO: Implement CRB fetchOperSrc(); fetchOperDst(); switch(_size){ case 0b00: //byte - _dst->_u8 &= ~(1 << _src->_u8); + _dst->_u8 &= u8(~(u8(1) << _src->_u8)); break; case 0b01: //short - _dst->_u16 &= ~(1 << _src->_u16); + _dst->_u16 &= u16(~(u16(1) << _src->_u16)); break; case 0b10: //int - _dst->_u32 &= ~(1 << _src->_u32); + _dst->_u32 &= ~(u32(1) << _src->_u32); break; case 0b11: //long - _dst->_u64 &= ~(1 << _src->_u64); + _dst->_u64 &= ~(u64(1) << _src->_u64); break; } } void CPU::TSB() { - // TODO: Implement TSB fetchOperSrc(); fetchOperDst(); - switch(_size){ - case 0b00: //byte - switch (((RF >> _src->_u8) & 1) != ((_dst->_u8 >> _src->_u8) & 1)){ - case 1: - RF |= (1 << _src->_u8); - break; - - case 0: - RF &= ~(1 << _src->_u8); - break; - } + + u64 s, d; + switch(_size) { + case 0b00: // byte + s = _src->_u8; + d = _dst->_u8; break; - case 0b01: //short - switch (((RF >> _src->_u16) & 1) != ((_dst->_u16 >> _src->_u16) & 1)){ - case 1: - RF |= (1 << _src->_u16); - break; - - case 0: - RF &= ~(1 << _src->_u16); - break; - } + case 0b01: // short + s = _src->_u16; + d = _dst->_u16; break; - case 0b10: //int - switch (((RF >> _src->_u32) & 1) != ((_dst->_u32 >> _src->_u32) & 1)){ - case 1: - RF |= (1 << _src->_u32); - break; - - case 0: - RF &= ~(1 << _src->_u32); - break; - } + case 0b10: // int + s = _src->_u32; + d = _dst->_u32; break; - case 0b11: //long - switch (((RF >> _src->_u64) & 1) != ((_dst->_u64 >> _src->_u64) & 1)){ - case 1: - RF |= (1 << _src->_u64); - break; - - case 0: - RF &= ~(1 << _src->_u64); - break; - } + case 0b11: // long + s = _src->_u64; + d = _dst->_u64; break; } + + d >>= s; + d &= 1; } void CPU::BOOL() { - // TODO: Implement BOOL fetchOperDst(); switch(_size){ - case 0b00: //byte - _dst->_u8 = _dst != 0; + case 0b00: // byte + _dst->_u8 = _dst->_u8 != 0; break; - case 0b01: //short - _dst->_u16 = _dst != 0; + case 0b01: // short + _dst->_u16 = _dst->_u16 != 0; break; - case 0b10: //int - _dst->_u32 = _dst != 0; + case 0b10: // int + _dst->_u32 = _dst->_u32 != 0; break; - case 0b11: //long - _dst->_u64 = _dst != 0; + case 0b11: // long + _dst->_u64 = _dst->_u64 != 0; break; } } @@ -238,11 +211,11 @@ namespace spider { // ── 0x02D — CNT: Counts bits (# of 1's into Dst) ── void CPU::CNT() { fetchOperDst(); - switch(_size) { - case 0b00: _dst->_u8 = __builtin_popcount(_dst->_u8); break; - case 0b01: _dst->_u16 = __builtin_popcount(_dst->_u16); break; - case 0b10: _dst->_u32 = __builtin_popcount(_dst->_u32); break; - case 0b11: _dst->_u64 = __builtin_popcountll(_dst->_u64); break; + switch(_size) { // C++20 cross compatible version!! + case 0b00: _dst->_u8 = u8( std::popcount(_dst->_u8) ); break; + case 0b01: _dst->_u16 = u16(std::popcount(_dst->_u16)); break; + case 0b10: _dst->_u32 = u32(std::popcount(_dst->_u32)); break; + case 0b11: _dst->_u64 = u64(std::popcount(_dst->_u64)); break; } } diff --git a/src/spider/runtime/instr/Instr_0E0-0FF.cpp b/src/spider/runtime/instr/Instr_0E0-0FF.cpp index a0cc10c..ce71a44 100644 --- a/src/spider/runtime/instr/Instr_0E0-0FF.cpp +++ b/src/spider/runtime/instr/Instr_0E0-0FF.cpp @@ -53,7 +53,7 @@ namespace spider { } /** - * @brief BRAD (0xF7) - Memory Integrity Checksum + * @brief BRAD (0xF5) - Memory Integrity Checksum * Escanea los primeros 256 bytes de memoria y valida contra una firma de seguridad. * Implementado por Bradley Vergara Lara - Estancia 2026. */