diff --git a/src/vmsrc/cmdsys.c b/src/vmsrc/cmdsys.c index 12e827a..5cd1817 100644 --- a/src/vmsrc/cmdsys.c +++ b/src/vmsrc/cmdsys.c @@ -55,14 +55,14 @@ byte keypressed(M6502 *mpu) { if (!(keyqueue & 0x80)) { - read(STDIN_FILENO, &keyqueue, 1); - keyqueue |= 0x80; + if (read(STDIN_FILENO, &keyqueue, 1) > 0) + keyqueue |= 0x80; } return keyqueue; } byte keyin(M6502 *mpu) { - byte cin = keyqueue & 0x7F; + byte cin = keyqueue; keyqueue = 0; while (!cin) { @@ -77,7 +77,7 @@ byte keyin(M6502 *mpu) else usleep(10000); } - return cin; + return cin & 0x7F; } void M6502_exec(M6502 *mpu) { @@ -117,7 +117,7 @@ void setRawInput(void) tcgetattr(STDIN_FILENO, &termio); // save current port settings memcpy(&org_tio, &termio, sizeof(struct termios)); termio.c_cflag = /*BAUDRATE | CRTSCTS |*/ CS8 | CLOCAL | CREAD; - termio.c_iflag = IGNPAR; + termio.c_iflag = BRKINT | IGNPAR; termio.c_oflag = 0; termio.c_lflag = 0; // set input mode (non-canonical, no echo,...) termio.c_cc[VTIME] = 0; // inter-character timer unused @@ -826,7 +826,7 @@ void export_cmdsys(void) cmdsys = alloc_heap(23); stodci("CMDSYS", dci); add_sym(dci, cmdsys); mem_6502[SYSPATH_STR] = strlen(strcat(getcwd((char *)mem_6502 + SYSPATH_BUF, 128), "/sys/")); - mem_6502[cmdsys + 0] = 0x11; // Version 2.11 + mem_6502[cmdsys + 0] = 0x20; // Version 2.20 mem_6502[cmdsys + 1] = 0x02; mem_6502[cmdsys + 2] = (byte)SYSPATH_STR; // syspath mem_6502[cmdsys + 3] = (byte)(SYSPATH_STR >> 8); diff --git a/src/vmsrc/sysio.c b/src/vmsrc/sysio.c index 95cad6d..960240d 100644 --- a/src/vmsrc/sysio.c +++ b/src/vmsrc/sysio.c @@ -94,52 +94,34 @@ void sysputh(M6502 *mpu) } void syskeypressed(M6502 *mpu) { - if (!(keyqueue & 0x80)) - keypressed(mpu); - PUSH_ESTK(keyqueue); + PUSH_ESTK(keypressed(mpu)); } void sysgetc(M6502 *mpu) { - char c; - // - // Push getchar() - // - if (keyqueue & 0x80) - { - c = keyqueue & 0x7F; - keyqueue = 0; - } - else - c = keyin(mpu); - PUSH_ESTK(c); + PUSH_ESTK(keyin(mpu)); } void sysgets(M6502 *mpu) { uword strptr; int len; char cext[2], instr[256]; - + byte cin; + // // Push gets(), limiting it to 128 chars // PULL_ESTK(cext[0]); putchar(cext[0] & 0x7F); len = 0; - if (keyqueue) - { - putchar(keyqueue & 0x7F); - instr[len++] = keyqueue & 0x7F; - keyqueue = 0; - } fflush(stdout); do { - switch (keyqueue = keyin(mpu)) + switch (cin = keyin(mpu)) { case 0x1B: if (read(STDIN_FILENO, cext, 2) == 2) if (cext[0] == '[' && cext[1] == 'D') // Left arrow - keyqueue = 0x08; + cin = 0x08; else break; else @@ -155,13 +137,12 @@ void sysgets(M6502 *mpu) } break; default: - if (keyqueue >= ' ') - putchar(instr[len++] = keyqueue); + if (cin >= ' ' || cin == 0x0D) + putchar(instr[len++] = cin); } fflush(stdout); - } while (keyqueue != 0x0D && len < 128); + } while (cin != 0x0D && len < 128); sysputln(mpu); - keyqueue = 0; mem_6502[CMDLINE_STR] = len; memcpy(mem_6502 + CMDLINE_BUF, instr, len); PUSH_ESTK(CMDLINE_STR);