summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-05-03 15:51:57 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2020-05-03 15:51:57 -0400
commit1c622005c289ef1cd9feea277bd0ff46b19d15f0 (patch)
treeb5258bd461ac2070c39e0eb437da676a10e295c3 /io.c
parented88644ded82008577804c590bec7188ef0da011 (diff)
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.
Diffstat (limited to 'io.c')
-rw-r--r--io.c181
1 files changed, 181 insertions, 0 deletions
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;
+ }
+}