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:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user