Commit da585c7803339cc84b0bb6f381e179b40cfdaf89
1 parent
db7e2683
Debugger fully functional and non-quirky :)
Showing
7 changed files
with
79 additions
and
7 deletions
.idea/synacorvm.iml
@@ -6,12 +6,14 @@ | @@ -6,12 +6,14 @@ | ||
6 | <sourceFolder url="file://$MODULE_DIR$/stack.c" isTestSource="false" /> | 6 | <sourceFolder url="file://$MODULE_DIR$/stack.c" isTestSource="false" /> |
7 | <sourceFolder url="file://$MODULE_DIR$/cpu.c" isTestSource="false" /> | 7 | <sourceFolder url="file://$MODULE_DIR$/cpu.c" isTestSource="false" /> |
8 | <sourceFolder url="file://$MODULE_DIR$/disasm.c" isTestSource="false" /> | 8 | <sourceFolder url="file://$MODULE_DIR$/disasm.c" isTestSource="false" /> |
9 | + <sourceFolder url="file://$MODULE_DIR$/instructions.h" isTestSource="false" /> | ||
9 | <sourceFolder url="file://$MODULE_DIR$/mem.h" isTestSource="false" /> | 10 | <sourceFolder url="file://$MODULE_DIR$/mem.h" isTestSource="false" /> |
10 | <sourceFolder url="file://$MODULE_DIR$/main.c" isTestSource="false" /> | 11 | <sourceFolder url="file://$MODULE_DIR$/main.c" isTestSource="false" /> |
11 | <sourceFolder url="file://$MODULE_DIR$/mem.c" isTestSource="false" /> | 12 | <sourceFolder url="file://$MODULE_DIR$/mem.c" isTestSource="false" /> |
12 | <sourceFolder url="file://$MODULE_DIR$/registers.h" isTestSource="false" /> | 13 | <sourceFolder url="file://$MODULE_DIR$/registers.h" isTestSource="false" /> |
13 | - <sourceFolder url="file://$MODULE_DIR$/instructions.h" isTestSource="false" /> | 14 | + <sourceFolder url="file://$MODULE_DIR$/input.h" isTestSource="false" /> |
14 | <sourceFolder url="file://$MODULE_DIR$/CMakeLists.txt" isTestSource="false" /> | 15 | <sourceFolder url="file://$MODULE_DIR$/CMakeLists.txt" isTestSource="false" /> |
16 | + <sourceFolder url="file://$MODULE_DIR$/input.c" isTestSource="false" /> | ||
15 | <sourceFolder url="file://$MODULE_DIR$/registers.c" isTestSource="false" /> | 17 | <sourceFolder url="file://$MODULE_DIR$/registers.c" isTestSource="false" /> |
16 | <sourceFolder url="file://$MODULE_DIR$/debug.h" isTestSource="false" /> | 18 | <sourceFolder url="file://$MODULE_DIR$/debug.h" isTestSource="false" /> |
17 | <sourceFolder url="file://$MODULE_DIR$/stack.h" isTestSource="false" /> | 19 | <sourceFolder url="file://$MODULE_DIR$/stack.h" isTestSource="false" /> |
CMakeLists.txt
@@ -3,5 +3,5 @@ project(synacorvm) | @@ -3,5 +3,5 @@ project(synacorvm) | ||
3 | 3 | ||
4 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") | 4 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") |
5 | 5 | ||
6 | -set(SOURCE_FILES main.c cpu.c cpu.h registers.h mem.h disasm.h disasm.c stack.c stack.h registers.c mem.c instructions.h debug.c debug.h) | 6 | +set(SOURCE_FILES main.c cpu.c cpu.h registers.h mem.h disasm.h disasm.c stack.c stack.h registers.c mem.c instructions.h debug.c debug.h input.c input.h) |
7 | add_executable(synacorvm ${SOURCE_FILES}) | 7 | add_executable(synacorvm ${SOURCE_FILES}) |
cpu.c
@@ -224,7 +224,11 @@ void out(uint16_t src) | @@ -224,7 +224,11 @@ void out(uint16_t src) | ||
224 | 224 | ||
225 | void in(uint16_t dst) | 225 | void in(uint16_t dst) |
226 | { | 226 | { |
227 | - int c = getchar(); | 227 | + if(!input_buffer_size()) |
228 | + { | ||
229 | + read_input(); | ||
230 | + } | ||
231 | + char c = get_input(); | ||
228 | regs[dst % (MAX_INT + 1)] = (uint16_t)c; | 232 | regs[dst % (MAX_INT + 1)] = (uint16_t)c; |
229 | } | 233 | } |
230 | 234 |
cpu.h
debug.c
@@ -71,7 +71,6 @@ void save_state(char *filename) | @@ -71,7 +71,6 @@ void save_state(char *filename) | ||
71 | 71 | ||
72 | void query() | 72 | void query() |
73 | { | 73 | { |
74 | - //TODO discard stdin | ||
75 | uint8_t end = 0; | 74 | uint8_t end = 0; |
76 | uint16_t bpoint; | 75 | uint16_t bpoint; |
77 | uint16_t mempos; | 76 | uint16_t mempos; |
@@ -97,8 +96,8 @@ void query() | @@ -97,8 +96,8 @@ void query() | ||
97 | switch (command) | 96 | switch (command) |
98 | { | 97 | { |
99 | case 'b': | 98 | case 'b': |
100 | - sscanf(input,"b %hu\n",&bpoint); | ||
101 | - fprintf(stderr,"Set breakpoint %hu to %hu",nbpoints,bpoint); | 99 | + sscanf(input,"b %hx\n",&bpoint); |
100 | + fprintf(stderr,"Set breakpoint %hu to %hx",nbpoints,bpoint); | ||
102 | breakpoints[nbpoints] = bpoint; | 101 | breakpoints[nbpoints] = bpoint; |
103 | nbpoints = (uint16_t)(nbpoints + 1 % 0xFF); | 102 | nbpoints = (uint16_t)(nbpoints + 1 % 0xFF); |
104 | break; | 103 | break; |
@@ -301,12 +300,16 @@ void debug_program() | @@ -301,12 +300,16 @@ void debug_program() | ||
301 | if(in_breakpoint(pc)) | 300 | if(in_breakpoint(pc)) |
302 | { | 301 | { |
303 | breakpoint = 1; | 302 | breakpoint = 1; |
304 | - fprintf(stderr,"Breakpoint hit @ pc=%02X",pc); | 303 | + fprintf(stderr,"Breakpoint hit @ pc=%X",pc); |
305 | } | 304 | } |
306 | if(breakpoint) | 305 | if(breakpoint) |
307 | { | 306 | { |
308 | fprintf(stderr, "%02X: ", pc); | 307 | fprintf(stderr, "%02X: ", pc); |
309 | print_instruction(mem[pc], mem[pc+1], mem[pc+2], mem[pc+3]); | 308 | print_instruction(mem[pc], mem[pc+1], mem[pc+2], mem[pc+3]); |
309 | + if(stdin_length()) | ||
310 | + { | ||
311 | + read_input(); | ||
312 | + } | ||
310 | query(); | 313 | query(); |
311 | if(terminate) | 314 | if(terminate) |
312 | { | 315 | { |
input.c
0 → 100644
1 | +// | ||
2 | +// Created by imanol on 12/27/16. | ||
3 | +// | ||
4 | + | ||
5 | +#include "input.h" | ||
6 | + | ||
7 | +unsigned int input_buffer_length = 0; | ||
8 | +unsigned int input_buffer_pos = 0; | ||
9 | +char input_buffer[MAX_INT]; | ||
10 | + | ||
11 | +unsigned int stdin_length() | ||
12 | +{ | ||
13 | + unsigned int length = 0; | ||
14 | + ioctl(0, I_NREAD, &length); | ||
15 | + return length; | ||
16 | +} | ||
17 | + | ||
18 | +void read_input() | ||
19 | +{ | ||
20 | + strncpy(input_buffer,input_buffer+input_buffer_pos,input_buffer_size()); | ||
21 | + input_buffer_pos = input_buffer_size(); | ||
22 | + unsigned int old_buffer_length = input_buffer_length; | ||
23 | + input_buffer_length = stdin_length(); | ||
24 | + if(!input_buffer_length) | ||
25 | + { | ||
26 | + input_buffer_length = 64; //arbitrary | ||
27 | + } | ||
28 | + fgets(input_buffer+input_buffer_pos,input_buffer_length,stdin); | ||
29 | + //TODO: Improve this... Get a way to know how many bytes read | ||
30 | + input_buffer_length = (unsigned int)strlen(input_buffer); | ||
31 | + //input_buffer_length += old_buffer_length; | ||
32 | +} | ||
33 | + | ||
34 | +char get_input() | ||
35 | +{ | ||
36 | + char c = input_buffer[input_buffer_pos++]; | ||
37 | + return c; | ||
38 | +} | ||
39 | + | ||
40 | +unsigned int input_buffer_size() | ||
41 | +{ | ||
42 | + return input_buffer_length - (input_buffer_pos); | ||
43 | +} | ||
0 | \ No newline at end of file | 44 | \ No newline at end of file |
input.h
0 → 100644
1 | +// | ||
2 | +// Created by imanol on 12/27/16. | ||
3 | +// | ||
4 | + | ||
5 | +#ifndef SYNACORVM_INPUT_H | ||
6 | +#define SYNACORVM_INPUT_H | ||
7 | + | ||
8 | +#include <stdint.h> | ||
9 | +#include <unistd.h> | ||
10 | +#include "cpu.h" | ||
11 | +#include <string.h> | ||
12 | +#include <stropts.h> | ||
13 | + | ||
14 | +unsigned int stdin_length(); | ||
15 | +void read_input(); | ||
16 | +char get_input(); | ||
17 | +unsigned int input_buffer_size(); | ||
18 | + | ||
19 | +#endif //SYNACORVM_INPUT_H |