#include "tigr.h"
-#include "opcodes.c"
+#include "common.h"
+#include "opcodes.h"
uint16_t regs[256];
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)
{
*
* all instructions are padded to 4 bytes
*/
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
#include "common.h"
#include "tigr.h"
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);