diff options
Diffstat (limited to 'sux.c')
-rw-r--r-- | sux.c | 128 |
1 files changed, 120 insertions, 8 deletions
@@ -1,11 +1,12 @@ #include "opcode.h" #include <assert.h> #include <curses.h> +#include <ctype.h> #include <string.h> #include <pthread.h> #define bench 0 -#define debug 1 -#define IO 0 +#define debug 0 +#define IO 1 #define keypoll 0 #if bench #include <sys/time.h> @@ -55,6 +56,8 @@ void *run(void *args) { uint64_t sign = 0; char *s = malloc(2048); uint8_t lines = (6*thread)+2; + uint8_t bcd[4]; + uint8_t idx = 3, iscol = 0; uint16_t tv = 0xFF50; /* Starting address of the Thread Vectors. */ int x = 0, y = 0; uint8_t esc = 0; @@ -97,9 +100,9 @@ void *run(void *args) { #if keypoll pthread_mutex_lock(&mutex); #endif - mvwprintw(scr, lines, 0, "pc: 0x%08llx, a: 0x%016llx, x: 0x%016llx, y: 0x%016llx" - ", sp: 0x%04lx, ps: 0x%016llx, prefix: 0x%02x, opcode: 0x%02x, thread: %u, inst: %s \r" - , cpu->pc[thread], cpu->a[thread], cpu->x[thread], cpu->y[thread] + mvwprintw(scr, lines, 0, "pc: $%08llx, a: $%016llx, b: $%016llx, x: $%016llx, y: $%016llx" + ", sp: $%04lx, ps: $%016llx, prefix: $%02x, opcode: $%02x, thread: %u, inst: %s \r" + , cpu->pc[thread], cpu->a[thread], cpu->b[thread], cpu->x[thread], cpu->y[thread] , cpu->sp[thread], cpu->ps, prefix, opcode, thread, opname[opcode]); wrefresh(scr); #if keypoll @@ -799,6 +802,38 @@ void *run(void *args) { wmove(scr, y, x); esc = 0; break; + case 'H': + if (!bcd[2] && !bcd[3]) + y = 0; + else + y = ((bcd[3]*10) + bcd[2]); + if (!bcd[0] && !bcd[1]) + x = 0; + else + x = ((bcd[1]*10) + bcd[0]); + idx = 3; + wmove(scr, y, x); + bcd[0] = 0; + bcd[1] = 0; + bcd[2] = 0; + bcd[3] = 0; + esc = 0; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + bcd[idx--] = (addr[address] - '0'); + break; + default: + iscol = (addr[address] == ';'); + break; } } else { if (addr[address] == CURSES_BACKSPACE || addr[address] == '\b') { @@ -826,6 +861,78 @@ void *run(void *args) { pthread_mutex_unlock(&mutex); #endif } + #else + if (address == TX_ADDR) { + if (esc) { + switch(addr[address]) { + case 'A': + if (y > 0) + y--; + esc = 0; + break; + case 'B': + if (y < getmaxy(scr)) + y++; + esc = 0; + break; + case 'C': + if (x < getmaxx(scr)) + x++; + esc = 0; + break; + case 'D': + if (x > 0) + x--; + esc = 0; + break; + case 'H': + if (!bcd[2] && !bcd[3]) + y = 0; + else + y = ((bcd[3]*10) + bcd[2]); + if (!bcd[0] && !bcd[1]) + x = 0; + else + x = ((bcd[1]*10) + bcd[0]); + idx = 3; + bcd[0] = 0; + bcd[1] = 0; + bcd[2] = 0; + bcd[3] = 0; + esc = 0; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + bcd[idx--] = (addr[address] - '0'); + break; + default: + iscol = (addr[address] == ';'); + break; + } else { + if (addr[address] == CURSES_BACKSPACE || addr[address] == '\b') { + if (x > 0) { + x--; + } + } else if (addr[address] == '\033') { + esc = 1; + } else { + if (addr[address] == '\n') { + x = 0; + y+=1; + } else { + x+=1; + } + } + } + } #endif if (regsize >= 2) addr[address+1] = value >> 8; @@ -1444,7 +1551,7 @@ void *run(void *args) { break; case 0xF1: /* DEC Absolute. */ case 0xF3: /* DEC Zero Matrix. */ - if (opcode == 0xE1) { + if (opcode == 0xF1) { address = (uint64_t)addr[cpu->pc[thread]] | (uint64_t)addr[cpu->pc[thread]+1] << 8 | (uint64_t)addr[cpu->pc[thread]+2] << 16 @@ -1456,7 +1563,7 @@ void *run(void *args) { cpu->pc[thread]+=8; iclk++; } - if (opcode == 0xE3) { + if (opcode == 0xF3) { address = addr[cpu->pc[thread]] | addr[cpu->pc[thread]+1] << 8 | addr[cpu->pc[thread]+2] << 16 @@ -1504,7 +1611,12 @@ void *run(void *args) { #if keypoll pthread_mutex_lock(&mutex); #endif - mvwprintw(scr, getmaxy(scr)-lines, 0, "Operand: $%llx", address); + mvwprintw(scr, getmaxy(scr)-lines, 0, "Operand: $%llx" + ", $%04llx: $%02x, $%04llx: $%02x" + ", $1000: $%02x, $1001: $%02x " + , value + , RX_ADDR, addr[RX_ADDR], TX_ADDR, addr[TX_ADDR] + , addr[0x1000], addr[0x1001]); mvwprintw(scr, (24*thread)+1, 0, "Instructions executed: %llu, Clock cycles: %llu\r", ins, iclk); wrefresh(scr); #if keypoll |