From 879bb56f013db00f2f932e1689da9b0c8beb955a Mon Sep 17 00:00:00 2001 From: bylex Date: Wed, 26 Mar 2025 08:25:01 +0100 Subject: [PATCH] Improve API - make headers cleaner, split them off --- Makefile | 6 ++-- assembler.c | 2 +- assembler.h | 3 -- common.h | 15 ++++++++- interpreter.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++-- opcodes.c | 4 --- opcodes.h | 36 +++++++++++--------- 7 files changed, 128 insertions(+), 30 deletions(-) delete mode 100644 assembler.h diff --git a/Makefile b/Makefile index f723fbf..4bf7838 100644 --- 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 diff --git a/assembler.c b/assembler.c index fb5f67b..573ba93 100644 --- a/assembler.c +++ b/assembler.c @@ -5,7 +5,7 @@ #include #include -#include "assembler.h" +#include "common.h" uint16_t mem[65536]; diff --git a/assembler.h b/assembler.h deleted file mode 100644 index 569aa9e..0000000 --- a/assembler.h +++ /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"}; diff --git a/common.h b/common.h index 6e8d295..00e87ee 100644 --- a/common.h +++ b/common.h @@ -1 +1,14 @@ -#define N_INSTRUCTIONS 14 +#pragma once +#include +#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]; diff --git a/interpreter.c b/interpreter.c index 17c8333..531d0b2 100644 --- a/interpreter.c +++ b/interpreter.c @@ -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) { diff --git a/opcodes.c b/opcodes.c index a46b74a..e957bb5 100644 --- a/opcodes.c +++ b/opcodes.c @@ -1,7 +1,3 @@ - -#include -#include - #include "common.h" #include "opcodes.h" diff --git a/opcodes.h b/opcodes.h index 025b3f3..4f636ae 100644 --- a/opcodes.h +++ b/opcodes.h @@ -32,6 +32,11 @@ * * all instructions are padded to 4 bytes */ +#pragma once + +#include +#include + #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); -- 2.25.1