Improve API - make headers cleaner, split them off
authorbylex <mbilek06@gmail.com>
Wed, 26 Mar 2025 07:25:01 +0000 (08:25 +0100)
committerbylex <mbilek06@gmail.com>
Wed, 26 Mar 2025 07:25:01 +0000 (08:25 +0100)
Makefile
assembler.c
assembler.h [deleted file]
common.h
interpreter.c
opcodes.c
opcodes.h

index f723fbfd0f3bd62d73e0433778f40977b36f4e29..4bf7838179aa6197c1d5c4fb1c2743e0894651d3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
-CFLAGS = -g -w -O0
+CFLAGS = -O3 -g -w
 
 all: int ass
 int:
-       $(CC) -I$(HOME)/software/tigr $(HOME)/software/tigr/tigr.c interpreter.c -o interpreter -lGLU -lGL -lX11 $(CFLAGS)
+       $(CC) -I$(HOME)/software/tigr $(HOME)/software/tigr/tigr.c common.c opcodes.c interpreter.c -o interpreter -lGLU -lGL -lX11 $(CFLAGS)
 ass:
-       $(CC) $(CFLAGS) assembler.c -o assembler
+       $(CC) $(CFLAGS) common.c assembler.c -o assembler
 clean:
        rm -f interpreter assembler
index fb5f67b7bfa3ec5b45a36d31100fad5945a41673..573ba93f4320ec1ffd94a427efdb48ea8a1ed2e5 100644 (file)
@@ -5,7 +5,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-#include "assembler.h"
+#include "common.h"
 
 uint16_t mem[65536];
 
diff --git a/assembler.h b/assembler.h
deleted file mode 100644 (file)
index 569aa9e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "common.h"
-
-char opcodes_strings[N_INSTRUCTIONS][4] = {"nop", "inc", "dec", "lod", "ldl", "sav", "swp", "jmp", "jez", "hlt", "pts", "pfs", "dpx", "lor"};
index 6e8d295b3534bce3666e14daab7d1c5477bf5b95..00e87ee833d4f06c39b379e5d04260420226320c 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1 +1,14 @@
-#define N_INSTRUCTIONS 14
+#pragma once
+#include <stdint.h>
+#define N_INSTRUCTIONS 15
+
+#define OPCODE_NOARGS 0
+#define OPCODE_8_16 1
+#define OPCODE_8_0_8 2
+#define OPCODE_8_8_8 3
+#define OPCODE_0_16 4
+#define OPCODE_8_0_0 5
+
+extern char opcodes_strings[N_INSTRUCTIONS][4];
+
+extern uint8_t opcode_kind[N_INSTRUCTIONS];
index 17c8333346e23ffd2f2c788996503fe1b8c22c93..531d0b2cde5413d716e25e358b0b9b1f2bbd52c0 100644 (file)
@@ -6,7 +6,8 @@
 
 #include "tigr.h"
 
-#include "opcodes.c"
+#include "common.h"
+#include "opcodes.h"
 
 uint16_t regs[256];
 uint16_t mem[65536];
@@ -14,15 +15,100 @@ uint16_t mem[65536];
 uint16_t stack[256];
 uint8_t stack_pointer;
 
-Tigr* screen;
-
 uint16_t current_instruction = 0; // entry location
 bool halted = false;
 uint8_t halted_reason = 0;
 
+Tigr* screen;
+bool force_draw = false;
+
 uint64_t instruction_counter = 0;
 
+int* breakpoints = NULL;
+int breakpoints_size = 0;
 
+int max(int a, int b)
+{
+    return a > b ? a : b;
+}
+
+int min(int a, int b)
+{
+    return a < b ? a : b;
+}
+
+bool get_breakpoint(int addr)
+{
+    int i = 0;
+    while(i < breakpoints_size)
+    {
+        if(addr == breakpoints[i])
+        {
+            return true;
+        }
+        i++;
+    }
+    return false;
+}
+
+void set_breakpoint(int addr)
+{
+    breakpoints = realloc(breakpoints, (++breakpoints_size) * sizeof(int));
+    breakpoints[breakpoints_size - 1] = addr;
+}
+
+void del_breakpoint(int addr)
+{
+    if(get_breakpoint(addr))
+    {
+        int* breakpoints_new = malloc((--breakpoints_size) * sizeof(int));
+        int ni = 0; // new index
+        int i = 0; // old index
+        while(i < breakpoints_size + 1)
+        {
+            if(breakpoints[i] != addr)
+            {
+                ni++;
+                breakpoints_new[ni] = breakpoints[i];
+            }
+            i++;
+        }
+        free(breakpoints);
+        breakpoints = breakpoints_new;
+    }
+}
+
+void print_instruction(int addr, uint8_t instruction, uint8_t arg1, uint8_t arg2, uint8_t arg3)
+{
+    if(instruction > N_INSTRUCTIONS - 1)
+    {
+        printf("0x%04x: %d %d %d %d (Unknown instruction)\n", addr, instruction, arg1, arg2, arg3);
+    }
+    else
+    {
+        switch (opcode_kind[instruction])
+        {
+            case OPCODE_NOARGS:
+                printf("0x%04x : %s\n", addr, opcodes_strings[instruction]);
+                break;
+            case OPCODE_8_16:
+                printf("0x%04x : %s %d %d\n", addr, opcodes_strings[instruction], arg1, (arg2 << 8) + arg3);
+                break;
+            case OPCODE_8_0_8:
+                printf("0x%04x : %s %d %d\n", addr, opcodes_strings[instruction], arg1, arg3);
+                break;
+            case OPCODE_8_8_8:
+                printf("0x%04x : %s %d %d %d\n", addr, opcodes_strings[instruction], arg1, arg2, arg3);
+                break;
+            case OPCODE_0_16:
+                printf("0x%04x : %s %d\n", addr, opcodes_strings[instruction], (arg2 << 8) + arg3);
+                break;
+            case OPCODE_8_0_0:
+                printf("0x%04x : %s %d\n", addr, opcodes_strings[instruction], arg1);
+                break;
+        }
+    }
+}
 
 void load_mem(char* file_name)
 {
index a46b74a2270c423642b01117026591047ad30424..e957bb5662a9a947f5e3ab6f72ec3ff847bc128e 100644 (file)
--- a/opcodes.c
+++ b/opcodes.c
@@ -1,7 +1,3 @@
-
-#include <stdint.h>
-#include <stdbool.h>
-
 #include "common.h"
 #include "opcodes.h"
 
index 025b3f3d19fac1d4ccc5568ab7e6a2996bf4f686..4f636aef331cb3b865e4bc9fbe862160a3283996 100644 (file)
--- a/opcodes.h
+++ b/opcodes.h
  *
  * all instructions are padded to 4 bytes
  */
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
 #include "common.h"
 
 #include "tigr.h"
@@ -48,28 +53,29 @@ extern uint8_t halted_reason;
 
 extern Tigr* screen;
 
-void nop(uint8_t unused_1, uint8_t unused_2, uint8_t unused_3);
+extern void nop(uint8_t unused_1, uint8_t unused_2, uint8_t unused_3);
 
-void inc(uint8_t dest_reg, uint8_t unused_1, uint8_t source_reg);
-void dec(uint8_t dest_reg, uint8_t unused_1, uint8_t source_reg);
+extern void inc(uint8_t dest_reg, uint8_t unused_1, uint8_t source_reg);
+extern void dec(uint8_t dest_reg, uint8_t unused_1, uint8_t source_reg);
 
 // loads addressed byte and the next byte into register
-void lod(uint8_t dest_reg, uint8_t source_addr_1, uint8_t source_addr_2);
-void ldl(uint8_t dest_reg, uint8_t num_literal_1, uint8_t num_literal_2);
-void sav(uint8_t source_reg, uint8_t dest_addr_1, uint8_t dest_addr_2);
+extern void lod(uint8_t dest_reg, uint8_t source_addr_1, uint8_t source_addr_2);
+extern void ldl(uint8_t dest_reg, uint8_t num_literal_1, uint8_t num_literal_2);
+extern void sav(uint8_t source_reg, uint8_t dest_addr_1, uint8_t dest_addr_2);
 
-void swp(uint8_t reg, uint8_t addr_1, uint8_t addr_2);
+extern void swp(uint8_t reg, uint8_t addr_1, uint8_t addr_2);
 
-void jmp(uint8_t unused_1, uint8_t addr_1, uint8_t addr_2);
-void jez(uint8_t reg, uint8_t addr_1, uint8_t addr_2);
+extern void jmp(uint8_t unused_1, uint8_t addr_1, uint8_t addr_2);
+extern void jez(uint8_t reg, uint8_t addr_1, uint8_t addr_2);
 
-void hlt(uint8_t unused_1, uint8_t unused_2, uint8_t unused_3);
+extern void hlt(uint8_t unused_1, uint8_t unused_2, uint8_t unused_3);
 
-void pts(uint8_t source_reg, uint8_t unused_1, uint8_t unused_2);
-void pfs(uint8_t dest_reg, uint8_t unused_1, uint8_t unused_2);
+extern void pts(uint8_t source_reg, uint8_t unused_1, uint8_t unused_2);
+extern void pfs(uint8_t dest_reg, uint8_t unused_1, uint8_t unused_2);
 
-void dpx(uint8_t pixel_num_reg, uint8_t red_green_reg, uint8_t blue_alpha_reg);
+extern void dpx(uint8_t pixel_num_reg, uint8_t red_green_reg, uint8_t blue_alpha_reg);
 
-void lor(uint8_t dest_reg, uint8_t unused_1, uint8_t mem_addr_reg);
+extern void lor(uint8_t dest_reg, uint8_t unused_1, uint8_t mem_addr_reg);
+extern void fdr(uint8_t unused_1, uint8_t unused_2, uint8_t unused_3);
 
-void (*opcodes[N_INSTRUCTIONS]) (uint8_t, uint8_t, uint8_t) = {nop, inc, dec, lod, ldl, sav, swp, jmp, jez, hlt, pts, pfs, dpx, lor};
+extern void (*opcodes[N_INSTRUCTIONS]) (uint8_t, uint8_t, uint8_t);