1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-08 09:25:19 +00:00

Fix input for portable VM

This commit is contained in:
David Schmenk
2025-01-03 13:39:33 -08:00
parent c3e24be56c
commit 6a4362c970
2 changed files with 15 additions and 34 deletions

View File

@@ -55,14 +55,14 @@ byte keypressed(M6502 *mpu)
{ {
if (!(keyqueue & 0x80)) if (!(keyqueue & 0x80))
{ {
read(STDIN_FILENO, &keyqueue, 1); if (read(STDIN_FILENO, &keyqueue, 1) > 0)
keyqueue |= 0x80; keyqueue |= 0x80;
} }
return keyqueue; return keyqueue;
} }
byte keyin(M6502 *mpu) byte keyin(M6502 *mpu)
{ {
byte cin = keyqueue & 0x7F; byte cin = keyqueue;
keyqueue = 0; keyqueue = 0;
while (!cin) while (!cin)
{ {
@@ -77,7 +77,7 @@ byte keyin(M6502 *mpu)
else else
usleep(10000); usleep(10000);
} }
return cin; return cin & 0x7F;
} }
void M6502_exec(M6502 *mpu) void M6502_exec(M6502 *mpu)
{ {
@@ -117,7 +117,7 @@ void setRawInput(void)
tcgetattr(STDIN_FILENO, &termio); // save current port settings tcgetattr(STDIN_FILENO, &termio); // save current port settings
memcpy(&org_tio, &termio, sizeof(struct termios)); memcpy(&org_tio, &termio, sizeof(struct termios));
termio.c_cflag = /*BAUDRATE | CRTSCTS |*/ CS8 | CLOCAL | CREAD; termio.c_cflag = /*BAUDRATE | CRTSCTS |*/ CS8 | CLOCAL | CREAD;
termio.c_iflag = IGNPAR; termio.c_iflag = BRKINT | IGNPAR;
termio.c_oflag = 0; termio.c_oflag = 0;
termio.c_lflag = 0; // set input mode (non-canonical, no echo,...) termio.c_lflag = 0; // set input mode (non-canonical, no echo,...)
termio.c_cc[VTIME] = 0; // inter-character timer unused termio.c_cc[VTIME] = 0; // inter-character timer unused
@@ -826,7 +826,7 @@ void export_cmdsys(void)
cmdsys = alloc_heap(23); cmdsys = alloc_heap(23);
stodci("CMDSYS", dci); add_sym(dci, cmdsys); stodci("CMDSYS", dci); add_sym(dci, cmdsys);
mem_6502[SYSPATH_STR] = strlen(strcat(getcwd((char *)mem_6502 + SYSPATH_BUF, 128), "/sys/")); 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 + 1] = 0x02;
mem_6502[cmdsys + 2] = (byte)SYSPATH_STR; // syspath mem_6502[cmdsys + 2] = (byte)SYSPATH_STR; // syspath
mem_6502[cmdsys + 3] = (byte)(SYSPATH_STR >> 8); mem_6502[cmdsys + 3] = (byte)(SYSPATH_STR >> 8);

View File

@@ -94,52 +94,34 @@ void sysputh(M6502 *mpu)
} }
void syskeypressed(M6502 *mpu) void syskeypressed(M6502 *mpu)
{ {
if (!(keyqueue & 0x80)) PUSH_ESTK(keypressed(mpu));
keypressed(mpu);
PUSH_ESTK(keyqueue);
} }
void sysgetc(M6502 *mpu) void sysgetc(M6502 *mpu)
{ {
char c; PUSH_ESTK(keyin(mpu));
//
// Push getchar()
//
if (keyqueue & 0x80)
{
c = keyqueue & 0x7F;
keyqueue = 0;
}
else
c = keyin(mpu);
PUSH_ESTK(c);
} }
void sysgets(M6502 *mpu) void sysgets(M6502 *mpu)
{ {
uword strptr; uword strptr;
int len; int len;
char cext[2], instr[256]; char cext[2], instr[256];
byte cin;
// //
// Push gets(), limiting it to 128 chars // Push gets(), limiting it to 128 chars
// //
PULL_ESTK(cext[0]); PULL_ESTK(cext[0]);
putchar(cext[0] & 0x7F); putchar(cext[0] & 0x7F);
len = 0; len = 0;
if (keyqueue)
{
putchar(keyqueue & 0x7F);
instr[len++] = keyqueue & 0x7F;
keyqueue = 0;
}
fflush(stdout); fflush(stdout);
do do
{ {
switch (keyqueue = keyin(mpu)) switch (cin = keyin(mpu))
{ {
case 0x1B: case 0x1B:
if (read(STDIN_FILENO, cext, 2) == 2) if (read(STDIN_FILENO, cext, 2) == 2)
if (cext[0] == '[' && cext[1] == 'D') // Left arrow if (cext[0] == '[' && cext[1] == 'D') // Left arrow
keyqueue = 0x08; cin = 0x08;
else else
break; break;
else else
@@ -155,13 +137,12 @@ void sysgets(M6502 *mpu)
} }
break; break;
default: default:
if (keyqueue >= ' ') if (cin >= ' ' || cin == 0x0D)
putchar(instr[len++] = keyqueue); putchar(instr[len++] = cin);
} }
fflush(stdout); fflush(stdout);
} while (keyqueue != 0x0D && len < 128); } while (cin != 0x0D && len < 128);
sysputln(mpu); sysputln(mpu);
keyqueue = 0;
mem_6502[CMDLINE_STR] = len; mem_6502[CMDLINE_STR] = len;
memcpy(mem_6502 + CMDLINE_BUF, instr, len); memcpy(mem_6502 + CMDLINE_BUF, instr, len);
PUSH_ESTK(CMDLINE_STR); PUSH_ESTK(CMDLINE_STR);