From 6a4362c970531765199c9d523ff015907fd42083 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 3 Jan 2025 13:39:33 -0800 Subject: [PATCH 1/3] Fix input for portable VM --- src/vmsrc/cmdsys.c | 12 ++++++------ src/vmsrc/sysio.c | 37 +++++++++---------------------------- 2 files changed, 15 insertions(+), 34 deletions(-) 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); From 4769f3fb824021041b7c8f495644ae9f3c51a918 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 3 Jan 2025 15:55:29 -0800 Subject: [PATCH 2/3] Clean up stack handling for FORTH and PLVM --- src/toolsrc/plforth.pla | 96 +++++++++++++++++++++++------------------ src/vmsrc/plvm.h | 2 +- src/vmsrc/sysio.c | 5 ++- 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/src/toolsrc/plforth.pla b/src/toolsrc/plforth.pla index 884745e..13f65d9 100644 --- a/src/toolsrc/plforth.pla +++ b/src/toolsrc/plforth.pla @@ -57,25 +57,6 @@ word brkentry = 0 word brkcfa = 0 byte brk = 0 // -// Machine code helper routines -// -byte _get_estack = $8A // TXA -byte = $49, $FF // EOR #$FF -byte = $38 // SEC -byte = $69, $20 // ADC #$20 -byte = $C9, $21 // CMP #$21 -byte = $90, $02 // BCC +2 -byte = $A2, $20 // LDX #ESTKSZ/2 -byte = $CA // DEX -byte = $95 // STA -byte _estkl = $C0 // ESTKL,X -byte = $A9, $00 // LDA #$00 -byte = $95 // STA -byte _estkh = $A0 // ESTKH,X -byte = $60 // RTS -byte _reset_estack = $A2, $20 // LDX #ESTKSZ/2 -byte = $60 // RTS -// // FORTH dictionary layout // // bytes usage @@ -126,6 +107,7 @@ predef _space_#0, _spaces_(a)#0, _see_#0, _prstack_#0, _prrstack_#0 predef _cont_#0, _restart_#0, _bye_#0, _quit_#0 predef _abort_(a)#0, _doabortstr_(a,b)#0, _abortstr_#0 predef _compword_(dentry)#0, _compliteral_(a)#0, _execword_(dentry)#0, _isnum_(a,b)#2 +predef _interpret_#0 // // Forth Vocabulary // @@ -764,12 +746,43 @@ char d_words = "WORDS" byte = showcr_flag word = @d_pbc, 0, @_words_ // +// Machine code helper routines +// +asm _get_estackdepth#1 + !SOURCE "vmsrc/plvmzp.inc" + TXA + EOR #$FF + SEC + ADC #ESTKSZ/2 + CMP #ESTKSZ/2+1 + BCC + + LDX #ESTKSZ/2 ++ DEX + STA ESTKL,X + LDA #$00 + STA ESTKH,X + RTS +end +asm _get_estack(index)#1 + LDA #ESTKSZ/2 + CLC + SBC ESTKL,X + TAY + LDA ESTKL,Y + STA ESTKL,X + LDA ESTKH,Y + STA ESTKH,X + RTS +end +asm _reset_estack#0 + LDX #ESTKSZ/2 +end +asm _push(a)#0 // Stack hack - call as _push(a)to leave a on eval stack + RTS +end +// // Helper routines // -predef _interpret_#0 -def push(a)#1 // Stack hack - call as (@push)(a)#0 to leave a on eval stack - return a -end def _dictaddw_(a)#0 *(heapalloc(2)) = a end @@ -875,7 +888,7 @@ end // Warm start // def warmstart#0 - (@_reset_estack)()#0 + _reset_estack() brk = 0 brkcfa = 0 RSP = RSTK_SIZE @@ -909,7 +922,6 @@ def find(matchchars, matchlen)#1 matchchars-- while dentry if ^dentry == matchlen - for i = matchlen downto 1 if ^(matchchars + i) <> ^(dentry + i) break @@ -1022,7 +1034,7 @@ def _execword_(dentry)#0 fin W = _cfa_(dentry) (*W)()#0 - if (@_get_estack)()#1 > 32 + if _get_estackdepth() > 32 puts("Stack over/underflow\n") _quit_ fin @@ -1120,7 +1132,7 @@ def _interpret_#0 if state & comp_flag _compliteral_(value) else - (@push)(value)#0 + _push(value) fin else inchars-- @@ -1140,7 +1152,7 @@ def _swap_(a,b)#2 return b,a end def _ifdup_(a)#1 - if a; (@push)(a)#0; fin + if a; _push(a); fin return a end def _dup2_(a,b)#4 @@ -1312,7 +1324,7 @@ def _state_#1 return state & comp_flag end def _dodoes_#0 - (@push)(W + 11)#0 // Pointer to PFA storage + _push(W + 11) // Pointer to PFA storage execwords(*(W + 2)) // Exec PFA ptr end def _itcdoes_(a)#0 @@ -1433,7 +1445,7 @@ def _semi_#0 if ^latest addhash(latest) // COLON definition else - (@push)(latest)#0 // NONAME definition + _push(latest) // NONAME definition fin state = state & ~comp_flag end @@ -1653,7 +1665,7 @@ def _tick_#0 if state & comp_flag _compliteral_(dentry) else - (@push)(dentry)#0 + _push(dentry) fin end def _forget_#0 @@ -1731,7 +1743,7 @@ def _blank_#0 if state & comp_flag _compliteral_(32) else - (@push)(32)#0 + _push(32) fin end def _char_#0 @@ -1742,7 +1754,7 @@ def _char_#0 if state & comp_flag _compliteral_(^str) else - (@push)(^str)#0 + _push(^str) fin end def _str_#0 @@ -1757,7 +1769,7 @@ def _str_#0 _compword_(@d_slit) memcpy(heapalloc(len), str, len) // Add to dictionary else - (@push)(strbuf)#0 + _push(strbuf) memcpy(strbuf, str, len) // Copy to HERE fin end @@ -1942,13 +1954,13 @@ def _see_#0 fin end def _prstack_#0 - word val - byte depth - - for depth = 1 to (@_get_estack)()#1 - val = ^(_estkl + 32 - depth) | (^(_estkh + 32 - depth) << 8) - puti(val); putc(' ') - next + byte index, depth + depth = _get_estackdepth() + index = 0 + while index < depth + puti(_get_estack(index)); putc(' ') + index++ + loop end def _prrstack_#0 byte depth @@ -2126,8 +2138,6 @@ while latest fin latest = *_lfa_(latest) loop -_estkl = ^(@syscall + 1) // Hack to fill in parameter stack locations -_estkh = ^(@syscall + 3) fileio:iobufalloc(4) // Allocate a bunch of file buffers strbuf = heapalloc(256) inbuf = heapalloc(SRCREFS * INBUF_SIZE) diff --git a/src/vmsrc/plvm.h b/src/vmsrc/plvm.h index e6ef872..bf971d6 100644 --- a/src/vmsrc/plvm.h +++ b/src/vmsrc/plvm.h @@ -62,7 +62,7 @@ typedef uint16_t address; * 6502 memory map */ #define MEM6502_SIZE 0x00010000 -#define ESTK_SIZE 64 +#define ESTK_SIZE 32 #define CMDLINE_STR 0x01FF #define CMDLINE_BUF 0x0200 #define SYSPATH_STR 0x0280 diff --git a/src/vmsrc/sysio.c b/src/vmsrc/sysio.c index 960240d..dca896b 100644 --- a/src/vmsrc/sysio.c +++ b/src/vmsrc/sysio.c @@ -106,7 +106,7 @@ void sysgets(M6502 *mpu) int len; char cext[2], instr[256]; byte cin; - + // // Push gets(), limiting it to 128 chars // @@ -137,7 +137,8 @@ void sysgets(M6502 *mpu) } break; default: - if (cin >= ' ' || cin == 0x0D) + if (cin >= ' ') + //if (cin >= ' ' || cin == 0x0D) putchar(instr[len++] = cin); } fflush(stdout); From 1667161d1c0ec591439080813f4d7ea4b3406ce5 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 4 Jan 2025 08:33:24 -0800 Subject: [PATCH 3/3] Fix new name for cross-compiler --- src/dhgr.tk/makefile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dhgr.tk/makefile b/src/dhgr.tk/makefile index 1bf26c8..37f7d0c 100644 --- a/src/dhgr.tk/makefile +++ b/src/dhgr.tk/makefile @@ -57,41 +57,41 @@ $(IIGSCONV): dhgr.tk/utils/gsfonconv.c cc dhgr.tk/utils/gsfonconv.c -o dhgr.tk/utils/gsfonconv $(DHGRLIB): dhgr.tk/libs/dhgrlib.pla dhgr.tk/inc/dhgrlib.plh - ./plasm -AMOW dhgr.tk/libs/dhgrlib.pla + ./xplasm -AMOW dhgr.tk/libs/dhgrlib.pla acme --setpc 4094 -o $(DHGRLIB) dhgr.tk/libs/dhgrlib.a $(DHGRUTILS): dhgr.tk/libs/dhgrutils.pla $(DHGRLIB) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/libs/dhgrutils.pla + ./xplasm -AMOW dhgr.tk/libs/dhgrutils.pla acme --setpc 4094 -o $(DHGRUTILS) dhgr.tk/libs/dhgrutils.a $(DHGRTEST): dhgr.tk/test/dhgrtest.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/test/dhgrtest.pla + ./xplasm -AMOW dhgr.tk/test/dhgrtest.pla acme --setpc 4094 -o $(DHGRTEST) dhgr.tk/test/dhgrtest.a $(FONTTEST): dhgr.tk/test/fonttest.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/test/fonttest.pla + ./xplasm -AMOW dhgr.tk/test/fonttest.pla acme --setpc 4094 -o $(FONTTEST) dhgr.tk/test/fonttest.a $(DHGRSPRED): dhgr.tk/utils/dhgrspred.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/utils/dhgrspred.pla + ./xplasm -AMOW dhgr.tk/utils/dhgrspred.pla acme --setpc 4094 -o $(DHGRSPRED) dhgr.tk/utils/dhgrspred.a $(DHGREASY): dhgr.tk/utils/dhgreasy.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/utils/dhgreasy.pla + ./xplasm -AMOW dhgr.tk/utils/dhgreasy.pla acme --setpc 4094 -o $(DHGREASY) dhgr.tk/utils/dhgreasy.a $(DHGRSHOW): dhgr.tk/utils/dhgrshow.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/utils/dhgrshow.pla + ./xplasm -AMOW dhgr.tk/utils/dhgrshow.pla acme --setpc 4094 -o $(DHGRSHOW) dhgr.tk/utils/dhgrshow.a $(DLGRCONV): dhgr.tk/utils/dlgrconv.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/utils/dlgrconv.pla + ./xplasm -AMOW dhgr.tk/utils/dlgrconv.pla acme --setpc 4094 -o $(DLGRCONV) dhgr.tk/utils/dlgrconv.a $(DHGRRGB): dhgr.tk/utils/dhgrrgb.pla $(DHGRLIB) $(DHGRUTILS) dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/utils/dhgrrgb.pla + ./xplasm -AMOW dhgr.tk/utils/dhgrrgb.pla acme --setpc 4094 -o $(DHGRRGB) dhgr.tk/utils/dhgrrgb.a $(PENGUINS): dhgr.tk/demos/penguins/penguins.pla dhgr.tk/inc/dhgrlib.plh dhgr.tk/inc/dhgrutils.plh - ./plasm -AMOW dhgr.tk/demos/penguins/penguins.pla + ./xplasm -AMOW dhgr.tk/demos/penguins/penguins.pla acme --setpc 4094 -o $(PENGUINS) dhgr.tk/demos/penguins/penguins.a