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",
+ " skip_0 | \n",
+ " skip_1 | \n",
+ " byte_code | \n",
+ " mnemonic | \n",
+ " name | \n",
+ " group | \n",
+ " params | \n",
+ " imp | \n",
+ " imm | \n",
+ " abs | \n",
+ " ... | \n",
+ " B | \n",
+ " S | \n",
+ " I | \n",
+ " L | \n",
+ " F | \n",
+ " D | \n",
+ " type_mask | \n",
+ " expensive | \n",
+ " operation | \n",
+ " skip_2 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 140 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 08C | \n",
+ " XAMA | \n",
+ " SIMD Alternate Multiply-Add | \n",
+ " SIMD | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 141 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 08D | \n",
+ " XMUL | \n",
+ " SIMD Multiply | \n",
+ " SIMD | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 142 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 08E | \n",
+ " XDIV | \n",
+ " SIMD Divide | \n",
+ " SIMD | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 240 | \n",
+ " NaN | \n",
+ " Easter Eggs | \n",
+ " 0F0 | \n",
+ " UPY | \n",
+ " Will place \"YUPI\" in memory | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 241 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F1 | \n",
+ " INT_1_SLOT | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 242 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F2 | \n",
+ " INT_2_SLOT | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 243 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F3 | \n",
+ " INT_3_SLOT | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 244 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F4 | \n",
+ " INT_4_SLOT | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 245 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F5 | \n",
+ " BRAD | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 246 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0F6 | \n",
+ " DGANT | \n",
+ " | \n",
+ " Easter Eggs | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " X | \n",
+ " X | \n",
+ " ... | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " X | \n",
+ " 00 | \n",
+ " NaN | \n",
+ " | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\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.
*/