From 1c622005c289ef1cd9feea277bd0ff46b19d15f0 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Sun, 3 May 2020 15:51:57 -0400 Subject: Put the instruction, and I/O routines into separate functions. I did this to make it more readable, while still making it fast, due to inlining it. --- io.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 io.c (limited to 'io.c') diff --git a/io.c b/io.c new file mode 100644 index 0000000..fcef5d9 --- /dev/null +++ b/io.c @@ -0,0 +1,181 @@ +#include "sux.h" + +uint8_t iscol; +uint8_t idx = 3; +uint8_t bcd[4]; + +void io(uint64_t address, uint8_t *esc) { + int x, y; + uint16_t scr_col = 0; + switch (address) { + case CTRL_ADDR: + kbd_rdy = 1; + pthread_mutex_lock(&main_mutex); + pthread_cond_signal(&main_cond); + pthread_mutex_unlock(&main_mutex); + #if !keypoll + pthread_mutex_lock(&mutex); + pthread_cond_wait(&cond, &mutex); + pthread_mutex_unlock(&mutex); + #endif + kbd_rdy = 0; + break; + case TX_ADDR: + #if debug + if (!subdbg) { + scr_col = (addr[TX_ADDR] != 0x0C && addr[TX_ADDR] != '\n' && scr_col < 160) ? (addr[1] << 1)-2 : 0; + wmove(scr, 28, scr_col); + } + #endif + if (*esc) { + #if debug + if (!subdbg && addr[RX_ADDR] == '\n') { + wclrtoeol(scr); + } + #endif + switch (addr[TX_ADDR]) { + case 'A': + if (y > 0) + y--; + #if !debug + wmove(scr, y, x); + #endif + *esc = 0; + break; + case 'B': + if (y < getmaxy(scr)) + y++; + #if !debug + wmove(scr, y, x); + #endif + *esc = 0; + break; + case 'C': + if (x < getmaxx(scr)) + x++; + #if !debug + wmove(scr, y, x); + #endif + *esc = 0; + break; + case 'D': + if (x > 0) + x--; + #if !debug + wmove(scr, y, x); + #endif + *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]); + } + #if !debug + wmove(scr, y, x); + #else + mvwprintw(scr, 30, 0, "x: %i, y: %i ", x, y); + /*mvwprintw(scr, 31, 0, "bcd[3-2]: {%u, %u}, bcd[1-0]: {%u, %u}", bcd[3], bcd[2], bcd[1], bcd[0]);*/ + #endif + idx = 3; + bcd[0] = 0; + bcd[1] = 0; + bcd[2] = 0; + bcd[3] = 0; + *esc = 0; + break; + case 'S': + #if !debug + wscrl(scr, -1); + #else + #endif + *esc = 0; + break; + case 'T': + #if !debug + wscrl(scr, 1); + #else + #endif + *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 { + switch (addr[TX_ADDR]) { + case 0xC: + x=0,y=0; + #if !debug + wclear(scr); + wmove(scr, y, x); + #endif + break; + case CURSES_BACKSPACE: + case '\b': + if (x > 0) { + x--; + #if !debug + wmove(scr, y, x); + #endif + } + #if !debug + wdelch(scr); + #else + if (!subdbg) { + scr_col++; + wmove(scr, 28, scr_col--); + wdelch(scr); + wmove(scr, 28, scr_col); + wdelch(scr); + } + #endif + break; + case '\033': + *esc = 1; + break; + case '\n': + x = 0; + y+=1; + #if !debug + wmove(scr, y, x); + #endif + break; + default: + #if !debug + /*wmove(scr, y, x);*/ + waddch(scr, addr[address]); + #else + if (!subdbg && scr_col < 160) { + if (addr[address] != ' ') { + wprintw(scr, "%02X", addr[address]); + } else { + wprintw(scr, " "); + } + } + #endif + x+=1; + break; + } + } + break; + } +} -- cgit v1.2.3-13-gbd6f