diff options
Diffstat (limited to 'sux.c')
-rw-r--r-- | sux.c | 351 |
1 files changed, 199 insertions, 152 deletions
@@ -18,6 +18,7 @@ #define CTRL_ADDR 0xC000 #define TX_ADDR 0xC001 #define RX_ADDR 0xC002 +#define STEP_ADDR 0xC010 #define CURSES_BACKSPACE 0x7F #define setflag(flag, bit) (flag) ? (cpu->ps |= (bit << (thread << 3))) : (cpu->ps &= ~(bit << (thread << 3))) @@ -30,6 +31,7 @@ uint8_t threads_done = 0; uint8_t kbd_rdy = 0; uint8_t kbd_ln = 0; uint8_t wai = 0; +uint8_t step = 0; uint8_t irq = 0; #if !bench WINDOW *scr; @@ -115,10 +117,14 @@ void *run(void *args) { #if keypoll pthread_mutex_lock(&mutex); #endif - mvwprintw(scr, lines, 0, "pc: $%08llx, a: $%016llx, b: $%016llx, x: $%016llx, y: $%016llx" + /*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: " , cpu->pc[thread], cpu->a[thread], cpu->b[thread], cpu->x[thread], cpu->y[thread] - , cpu->sp[thread], cpu->ps, prefix, opcode, thread); + , cpu->sp[thread], cpu->ps, prefix, opcode, thread);*/ + mvwprintw(scr, lines, 0, "pc: $%08llx, a: $%016llx, b: $%016llx, x: $%016llx, y: $%016llx" + ", sp: $%04lx, ps: $%016llx, prefix: $%02x, opcode: $%02x, inst: " + , cpu->pc[thread], cpu->a[thread], cpu->b[thread], cpu->x[thread], cpu->y[thread] + , cpu->sp[thread], cpu->ps, prefix, opcode); #if keypoll pthread_mutex_unlock(&mutex); #endif @@ -137,6 +143,8 @@ void *run(void *args) { case IMM: switch (opcode) { case TXS: + break; + case PHB: case PHP: case PHA: @@ -147,7 +155,6 @@ void *run(void *args) { case PLA: case PLY: case PLX: - break; case STT: case LSL: case LSR: @@ -317,15 +324,44 @@ void *run(void *args) { break; } - mvwprintw(scr, 29, 0, "address: $%016llx, scr_row: %02u, scr_col: %02u, scr_lnst: $%04x, scr_lncnt: $%04x\r", address, addr[0], addr[1], addr[2] | (addr[3] << 8), addr[4] | (addr[5] << 8)); - mvwprintw(scr, 32, 0, "%02x %02x %02x %02x %02x %02x %02x %02x " - "%02x %02x %02x %02x %02x %02x %02x %02x\r" - , addr[0x4000], addr[0x4001], addr[0x4002], addr[0x4003], addr[0x4004], addr[0x4005], addr[0x4006], addr[0x4007] - , addr[0x4008], addr[0x4009], addr[0x400A], addr[0x400B], addr[0x400C], addr[0x400D], addr[0x400E], addr[0x400F]); - mvwprintw(scr, 33, 0, "%02x %02x %02x %02x %02x %02x %02x %02x " + mvwprintw(scr, 29, 0, "address: $%016llx, scr_row: %02u, scr_col: %02u, scr_str: %02u, scr_end: %02u\r", address, addr[0], addr[1], addr[0x4B], addr[0x4C]); + mvwprintw(scr, 32, 0, "bitabl: %02x %02x %02x %02x %02x %02x %02x %02x " "%02x %02x %02x %02x %02x %02x %02x %02x\r" - , addr[0x4010], addr[0x4011], addr[0x4012], addr[0x4013], addr[0x4014], addr[0x4015], addr[0x4016], addr[0x4017] - , addr[0x4018], addr[0x4019], addr[0x401A], addr[0x401B], addr[0x401C], addr[0x401D], addr[0x401E], addr[0x401F]); + , addr[0x3B], addr[0x3C], addr[0x3D], addr[0x3E], addr[0x3F], addr[0x40], addr[0x41], addr[0x42] + , addr[0x43], addr[0x44], addr[0x45], addr[0x46], addr[0x47], addr[0x48], addr[0x49], addr[0x4A]); + mvwprintw(scr, 33, 0, "buffer:\r"); + uint8_t ln = 34; + uint16_t tmpad = 0x2000; + for (uint16_t i = 0; i < 20; i+=2) { + mvwprintw(scr, ln++, 0, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " + "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x, i: %02x\r" + , addr[tmpad+(0x00)+(i*0x10)], addr[tmpad+(0x01)+(i*0x10)], addr[tmpad+(0x02)+(i*0x10)], addr[tmpad+(0x03)+(i*0x10)] + , addr[tmpad+(0x04)+(i*0x10)], addr[tmpad+(0x05)+(i*0x10)], addr[tmpad+(0x06)+(i*0x10)], addr[tmpad+(0x07)+(i*0x10)] + , addr[tmpad+(0x08)+(i*0x10)], addr[tmpad+(0x09)+(i*0x10)], addr[tmpad+(0x0A)+(i*0x10)], addr[tmpad+(0x0B)+(i*0x10)] + , addr[tmpad+(0x0C)+(i*0x10)], addr[tmpad+(0x0D)+(i*0x10)], addr[tmpad+(0x0E)+(i*0x10)], addr[tmpad+(0x0F)+(i*0x10)] + , addr[tmpad+(0x10)+(i*0x10)], addr[tmpad+(0x11)+(i*0x10)], addr[tmpad+(0x12)+(i*0x10)], addr[tmpad+(0x13)+(i*0x10)] + , addr[tmpad+(0x14)+(i*0x10)], addr[tmpad+(0x15)+(i*0x10)], addr[tmpad+(0x16)+(i*0x10)], addr[tmpad+(0x17)+(i*0x10)] + , addr[tmpad+(0x18)+(i*0x10)], addr[tmpad+(0x19)+(i*0x10)], addr[tmpad+(0x1A)+(i*0x10)], addr[tmpad+(0x1B)+(i*0x10)] + , addr[tmpad+(0x1C)+(i*0x10)], addr[tmpad+(0x1D)+(i*0x10)], addr[tmpad+(0x1E)+(i*0x10)], addr[tmpad+(0x1F)+(i*0x10)] + , i); + + } + /*tmpad = 0x4000; + mvwprintw(scr, ln++, 0, "cmd_buf:\r"); + for (uint16_t i = 0; i < 20; i+=2) { + mvwprintw(scr, ln++, 0, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " + "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x, i: %02x\r" + , addr[tmpad+(0x00)+(i*0x10)], addr[tmpad+(0x01)+(i*0x10)], addr[tmpad+(0x02)+(i*0x10)], addr[tmpad+(0x03)+(i*0x10)] + , addr[tmpad+(0x04)+(i*0x10)], addr[tmpad+(0x05)+(i*0x10)], addr[tmpad+(0x06)+(i*0x10)], addr[tmpad+(0x07)+(i*0x10)] + , addr[tmpad+(0x08)+(i*0x10)], addr[tmpad+(0x09)+(i*0x10)], addr[tmpad+(0x0A)+(i*0x10)], addr[tmpad+(0x0B)+(i*0x10)] + , addr[tmpad+(0x0C)+(i*0x10)], addr[tmpad+(0x0D)+(i*0x10)], addr[tmpad+(0x0E)+(i*0x10)], addr[tmpad+(0x0F)+(i*0x10)] + , addr[tmpad+(0x10)+(i*0x10)], addr[tmpad+(0x11)+(i*0x10)], addr[tmpad+(0x12)+(i*0x10)], addr[tmpad+(0x13)+(i*0x10)] + , addr[tmpad+(0x14)+(i*0x10)], addr[tmpad+(0x15)+(i*0x10)], addr[tmpad+(0x16)+(i*0x10)], addr[tmpad+(0x17)+(i*0x10)] + , addr[tmpad+(0x18)+(i*0x10)], addr[tmpad+(0x19)+(i*0x10)], addr[tmpad+(0x1A)+(i*0x10)], addr[tmpad+(0x1B)+(i*0x10)] + , addr[tmpad+(0x1C)+(i*0x10)], addr[tmpad+(0x1D)+(i*0x10)], addr[tmpad+(0x1E)+(i*0x10)], addr[tmpad+(0x1F)+(i*0x10)] + , i); + + }*/ wrefresh(scr); #if keypoll pthread_mutex_unlock(&mutex); @@ -363,50 +399,30 @@ void *run(void *args) { setflag(cpu->i[thread], I); break; case PHB: /* PusH B register to stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (int8_t i = tmp<<3; i >= 0; i-=8) { - if (i) - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->b[thread] >> i; - else - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->b[thread] & 0xFF; - cpu->sp[thread]--; - } - break; case PHP: /* PusH Processor status to stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (int8_t i = tmp<<3; i >= 0; i-=8) { - if (i) - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->ps >> i; - else - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->ps & 0xFF; - cpu->sp[thread]--; - } - break; case PHA: /* PusH Accumulator to stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (int8_t i = tmp<<3; i >= 0; i-=8) { - if (i) - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->a[thread] >> i; - else - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->a[thread] & 0xFF; - cpu->sp[thread]--; - } - break; case PHY: /* PusH Y register to stack. */ - tmp = addr[cpu->pc[thread]++]; + case PHX: /* PusH X register to stack. */ + tmp = value; + if (opcode == PHB) { + reg = cpu->b[thread]; + } else if (opcode == PHP) { + reg = cpu->ps; + } else if (opcode == PHA) { + reg = cpu->a[thread]; + } else if (opcode == PHY) { + reg = cpu->y[thread]; + } else if (opcode == PHX) { + reg = cpu->x[thread]; + } + if (tmp > 7) tmp = 7; for (int8_t i = tmp<<3; i >= 0; i-=8) { if (i) - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->y[thread] >> i; + addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = reg >> i; else - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->y[thread] & 0xFF; + addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = reg & 0xFF; cpu->sp[thread]--; } break; @@ -422,28 +438,28 @@ void *run(void *args) { case TXS: /* Transfer X to Stack pointer. */ if (opcode == TAY) cpu->y[thread] = cpu->a[thread]; - if (opcode == TAX) + else if (opcode == TAX) cpu->x[thread] = cpu->a[thread]; - if (opcode == TYX) + else if (opcode == TYX) cpu->x[thread] = cpu->y[thread]; - if (opcode == TYA) + else if (opcode == TYA) cpu->a[thread] = cpu->y[thread]; - if (opcode == TXA) + else if (opcode == TXA) cpu->a[thread] = cpu->x[thread]; - if (opcode == TXY) + else if (opcode == TXY) cpu->y[thread] = cpu->x[thread]; - if (opcode == TAB) { + else if (opcode == TAB) { cpu->b[thread] = cpu->a[thread]; cpu->z[thread] = (cpu->b[thread] == 0); cpu->n[thread] = (cpu->b[thread] >> 63); } - if (opcode == TSX) { + else if (opcode == TSX) { cpu->x[thread] = cpu->sp[thread] & 0xFFFF; cpu->x[thread] = cpu->stk_st[thread] << 16; } - if (opcode == TBA) + else if (opcode == TBA) cpu->a[thread] = cpu->b[thread]; - if (opcode == TXS) { + else if (opcode == TXS) { cpu->sp[thread] = cpu->x[thread]; if (prefix == 0x17 && (value == thread+1 || value > 8)) { cpu->stk_st[thread] = value & 0xFF; @@ -455,29 +471,17 @@ void *run(void *args) { cpu->z[thread] = (cpu->a[thread] == 0); cpu->n[thread] = (cpu->a[thread] >> 63); } - if (opcode == TAY || opcode == TXY) { + else if (opcode == TAY || opcode == TXY) { cpu->z[thread] = (cpu->y[thread] == 0); cpu->n[thread] = (cpu->y[thread] >> 63); } - if (opcode == TAX || opcode == TYX) { + else if (opcode == TAX || opcode == TYX) { cpu->z[thread] = (cpu->x[thread] == 0); cpu->n[thread] = (cpu->x[thread] >> 63); } setflag(cpu->z[thread], Z); setflag(cpu->n[thread], N); break; - case PHX: /* PusH X register to stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (int8_t i = tmp<<3; i >= 0; i-=8) { - if (i) - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->x[thread] >> i; - else - addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] = (uint64_t)cpu->x[thread] & 0xFF; - cpu->sp[thread]--; - } - break; case JMP: /* JMP Absolute. */ cpu->pc[thread] = address; break; @@ -500,63 +504,41 @@ void *run(void *args) { cpu->a[thread] = sum; break; case PLB: /* PuLl B register from stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (uint8_t i = 0; i < (tmp+1)<<3; i+=8) { - cpu->sp[thread]++; - if (i) - cpu->b[thread] += (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; - else - cpu->b[thread] = (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; - } - break; case PLP: /* PuLl Processor status from stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (uint8_t i = 0; i < (tmp+1)<<3; i+=8) { - cpu->sp[thread]++; - if (i) - cpu->ps += (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; - else - cpu->ps = (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; - } - break; case PLA: /* PuLl Accumulator from stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (uint8_t i = 0; i < (tmp+1)<<3; i+=8) { - cpu->sp[thread]++; - if (i) - cpu->a[thread] += (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; - else - cpu->a[thread] = (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; - } - break; case PLY: /* PuLl Y register from stack. */ - tmp = addr[cpu->pc[thread]++]; - if (tmp > 7) - tmp = 7; - for (uint8_t i = 0; i < (tmp+1)<<3; i+=8) { - cpu->sp[thread]++; - if (i) - cpu->y[thread] += (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; - else - cpu->y[thread] = (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; - } - break; case PLX: /* PuLl X register from stack. */ - tmp = addr[cpu->pc[thread]++]; + tmp = value; + if (opcode == PLB) + reg = cpu->b[thread]; + else if (opcode == PLP) + reg = cpu->ps; + else if (opcode == PLA) + reg = cpu->a[thread]; + else if (opcode == PLY) + reg = cpu->y[thread]; + else if (opcode == PLX) + reg = cpu->x[thread]; + if (tmp > 7) tmp = 7; for (uint8_t i = 0; i < (tmp+1)<<3; i+=8) { cpu->sp[thread]++; if (i) - cpu->x[thread] += (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; + reg += addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] << i; else - cpu->x[thread] = (uint64_t)addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; + reg = addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]] & 0xFF; + } + if (opcode == PLB) { + cpu->b[thread] = reg; + } else if (opcode == PLP) { + cpu->ps = reg; + } else if (opcode == PLA) { + cpu->a[thread] = reg; + } else if (opcode == PLY) { + cpu->y[thread] = reg; + } else if (opcode == PLX) { + cpu->x[thread] = reg; } break; case 0x34: /* JSR Indirect. */ @@ -607,7 +589,7 @@ void *run(void *args) { break; case BPO: /* BPO Absolute. */ case 0x64: /* BPO Zero Matrix. */ - if (cpu->n[thread]) + if (!cpu->n[thread]) cpu->pc[thread] = address; break; case ORA: /* ORA Immediate. */ @@ -629,7 +611,7 @@ void *run(void *args) { break; case BNG: /* BNG Absolute. */ case 0x74: /* BNG Zero Matrix. */ - if (!cpu->n[thread]) + if (cpu->n[thread]) cpu->pc[thread] = address; break; case XOR: /* XOR Immediate. */ @@ -707,6 +689,9 @@ void *run(void *args) { if (opcode == STB || opcode == 0x4E || opcode == 0x6E || opcode == 0x8E || opcode == 0xAE || opcode == 0xCE || opcode == 0xEE) value = cpu->b[thread]; addr[address] = value & 0xFF; + if (address == STEP_ADDR) { + step = addr[address]; + } #if IO if (address == TX_ADDR) { #if keypoll @@ -755,6 +740,14 @@ void *run(void *args) { bcd[3] = 0; esc = 0; break; + case 'S': + wscrl(scr, -1); + esc = 0; + break; + case 'T': + wscrl(scr, 1); + esc = 0; + break; case '0': case '1': case '2': @@ -845,6 +838,10 @@ void *run(void *args) { bcd[3] = 0; esc = 0; break; + case 'S': + case 'T': + esc = 0; + break; case '0': case '1': case '2': @@ -963,6 +960,7 @@ void *run(void *args) { case 0xDE: /* LDB Indirect Indexed. */ case 0xD9: /* LDA Indirect Indexed. */ if (address == CTRL_ADDR) { + kbd_rdy = 1; pthread_mutex_lock(&main_mutex); pthread_cond_signal(&main_cond); pthread_mutex_unlock(&main_mutex); @@ -971,13 +969,14 @@ void *run(void *args) { pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex); #endif + kbd_rdy = 0; } - value = (uint64_t)addr[address]; + value = addr[address]; if (regsize >= 2) - value += (uint64_t)addr[address+1] << 8; + value += addr[address+1] << 8; if (regsize >= 4) { - value += (uint64_t)addr[address+2] << 16; - value += (uint64_t)addr[address+3] << 24; + value += addr[address+2] << 16; + value += addr[address+3] << 24; } if (regsize >= 8) { value += (uint64_t)addr[address+4] << 32; @@ -1151,10 +1150,10 @@ void *run(void *args) { if (opcode == CPX || opcode == 0xCB || opcode == 0xDB || opcode == 0xEB || opcode == 0xFB) reg = cpu->x[thread]; sum = reg-value; - cpu->n[thread] = (sum & 0x8000000000000000) ? 1 : 0; + cpu->n[thread] = (sum & 0x8000000000000000); cpu->v[thread] = ((reg^value) & 0x8000000000000000) && ((reg^sum) & 0x8000000000000000); - cpu->z[thread] = (sum == 0) ? 1 : 0; - cpu->c[thread] = (sum > value) ? 1 : 0; + cpu->z[thread] = (sum == 0); + cpu->c[thread] = (reg >= value); setflag(cpu->n[thread], N); setflag(cpu->v[thread], V); setflag(cpu->z[thread], Z); @@ -1249,6 +1248,10 @@ void *run(void *args) { case 0xC3: /* INC Absolute. */ case 0xC5: /* INC Zero Matrix. */ addr[address]++; + cpu->z[thread] = (addr[address] == 0); + cpu->n[thread] = (addr[address] >> 7); + setflag(cpu->z[thread], Z); + setflag(cpu->n[thread], N); break; case NOP: /* No OPeration. */ break; @@ -1268,6 +1271,10 @@ void *run(void *args) { case 0xD3: /* DEC Absolute. */ case 0xD5: /* DEC Zero Matrix. */ addr[address]--; + cpu->z[thread] = (addr[address] == 0); + cpu->n[thread] = (addr[address] >> 7); + setflag(cpu->z[thread], Z); + setflag(cpu->n[thread], N); break; case BRK: /* BReaK. */ for (int8_t i = stksize; i >= 0; i-=8) { @@ -1303,13 +1310,21 @@ void *run(void *args) { break; } ins++; - /*if (!addr[CTRL_ADDR]) + if (step) { + pthread_mutex_lock(&main_mutex); + pthread_cond_signal(&main_cond); + pthread_mutex_unlock(&main_mutex); + pthread_mutex_lock(&mutex); + pthread_cond_wait(&cond, &mutex); + pthread_mutex_unlock(&mutex); + } + if (!addr[CTRL_ADDR]) kbd_ln = 0; else kbd_ln = 1; - if (kbd_ln) + /*if (kbd_ln) usleep(16666); - /*usleep(500000);*/ + usleep(500000);*/ #if debug && !bench #if keypoll pthread_mutex_lock(&mutex); @@ -1419,47 +1434,79 @@ int main(int argc, char **argv) { assert(!result); } int c = 0; + uint8_t step_key = 0; #if !bench werase(scr); #endif while (threads_done < THREADS) { #if !bench int x, y, i = 0; - if ((c != EOF && c !=-1)) { - pthread_mutex_lock(&main_mutex); - curs_set(0); - pthread_cond_wait(&main_cond, &main_mutex); - pthread_mutex_unlock(&main_mutex); - curs_set(1); - c = 0; - addr[CTRL_ADDR] = 0; - kbd_ln = 0; + if ((step_key && step && !kbd_rdy) || !step || kbd_rdy) { + if ((c != EOF && c !=-1)) { + pthread_mutex_lock(&main_mutex); + curs_set(0); + pthread_cond_wait(&main_cond, &main_mutex); + pthread_mutex_unlock(&main_mutex); + curs_set(1); + c = 0; + step_key = 0; + addr[CTRL_ADDR] = 0; + kbd_ln = 0; + } } #if keypoll pthread_mutex_lock(&mutex); #endif getyx(scr, y, x); c = wgetch(scr); - switch (c) { - case ERR: - addr[CTRL_ADDR] = 0; - wmove(scr, getmaxy(scr)-1, 0); - wprintw(scr, "c: %i, x: %i, y: %i, i: %i.", c, x, y, i++); - wmove(scr, y, x); - wrefresh(scr); - break; - default: - addr[RX_ADDR] = (uint8_t)c; - addr[CTRL_ADDR] = 1; - if (c == '\n') - kbd_ln = 1; + if (c == 19) { + step = 1; + if (kbd_rdy) + c = wgetch(scr); + } + if (kbd_rdy) { + switch (c) { + case ERR: + addr[CTRL_ADDR] = 0; + wmove(scr, getmaxy(scr)-1, 0); + wprintw(scr, "c: %i, x: %i, y: %i, i: %i.", c, x, y, i++); + wmove(scr, y, x); + wrefresh(scr); + break; + default: + if (kbd_rdy && c < 0x100) { + addr[RX_ADDR] = (uint8_t)c; + addr[CTRL_ADDR] = 1; + #if debug && !bench + wmove(scr, getmaxy(scr)-1, 0); + wprintw(scr, "c: %i, x: %i, y: %i, i: %i.", c, x, y, i++); + wmove(scr, y, x); + wrefresh(scr); + #endif + } + if (c == '\n') + kbd_ln = 1; + #if !keypoll + pthread_mutex_lock(&mutex); + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mutex); + #endif + break; + } + } else { + if ((c == 19 || c == 18) && step) { + if (c == 18) + step = 0; + else if (c == 19) + step_key = 1; #if !keypoll pthread_mutex_lock(&mutex); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); #endif - break; + } } + addr[STEP_ADDR] = step; #if keypoll pthread_mutex_unlock(&mutex); #endif |