From d4dee597dc988fa5d5ae93f6c810a1078d8f93dd Mon Sep 17 00:00:00 2001
From: David Schmenk <dschmenk@gmail.com>
Date: Mon, 8 Jan 2024 05:33:03 -0800
Subject: [PATCH] ENDSRC word to stop SRC input early

---
 images/apple/PLFORTH.PO  | Bin 143360 -> 143360 bytes
 src/{mkrel => runrel}    |   5 ++
 src/scripts/bounce.4th   |  32 +-------
 src/scripts/conio.4th    |   2 +
 src/scripts/fileio.4th   |   2 +
 src/scripts/fpu.4th      |   2 +
 src/scripts/grlib.4th    |   2 +
 src/scripts/hgrlib.4th   |   2 +
 src/scripts/hrbounce.4th |  32 +-------
 src/scripts/int32.4th    |   2 +
 src/scripts/plasma.4th   |   3 +-
 src/scripts/rod.4th      |  21 +-----
 src/toolsrc/plforth.pla  | 158 +++++++++++++++++----------------------
 13 files changed, 96 insertions(+), 167 deletions(-)
 rename src/{mkrel => runrel} (99%)

diff --git a/images/apple/PLFORTH.PO b/images/apple/PLFORTH.PO
index da9a0eecb3c537ac52057c714360729c6dfab1c4..5f2f6cc8c33149aa5eec69daad285d3fc951a887 100755
GIT binary patch
delta 9486
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
T-gV6g>3V(^G*Y_1ShoK+xj19{

delta 10323
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
Qd6VSPUtizrie&4519+nn&;S4c

diff --git a/src/mkrel b/src/runrel
similarity index 99%
rename from src/mkrel
rename to src/runrel
index 5419115..78c4cce 100755
--- a/src/mkrel
+++ b/src/runrel
@@ -1,3 +1,5 @@
+make apple
+
 cp rel/apple/CMD#061000           prodos/CMD.BIN
 cp rel/apple/CMD128#061000        prodos/CMD128.BIN
 cp rel/apple/PLASMA.SYSTEM#FF2000 prodos/PLASMA.SYSTEM.SYS
@@ -286,3 +288,6 @@ cp inc/testlib.plh        prodos/bld/inc/TESTLIB.PLH.TXT
 cp inc/grafix.plh         prodos/bld/inc/GRAFIX.PLH.TXT
 cp inc/lz4.plh            prodos/bld/inc/LZ4.PLH.TXT
 cp vmsrc/apple/plvmzp.inc prodos/bld/inc/PLVMZP.INC.TXT
+
+open /Applications/Virtual\ \]\[/Virtual\ \]\[.app/
+
diff --git a/src/scripts/bounce.4th b/src/scripts/bounce.4th
index 2d36b93..004a8b7 100644
--- a/src/scripts/bounce.4th
+++ b/src/scripts/bounce.4th
@@ -1,32 +1,6 @@
-: ?PLASMA
-  " IFACE" FIND
-  SWAP DROP
-  0= IF
-    " PLASMA.4TH" SRC
-  THEN
-;
-
-?PLASMA ( Load PLASMA if not already )
-
-: ?CONIO
-  " CONIOAPI" FIND
-  SWAP DROP
-  0= IF
-    " CONIO.4TH" SRC
-  THEN
-;
-
-?CONIO ( Load CONIO if not already )
-
-: ?GRLIB
-  " GRLIB" FIND
-  SWAP DROP
-  0= IF
-    " GRLIB.4TH" SRC
-  THEN
-;
-
-?GRLIB ( Load GRLIB if not already )
+SRC" PLASMA.4TH"
+SRC" CONIO.4TH"
+SRC" GRLIB.4TH"
 
  5 VARIABLE BALLCLR
 10 VARIABLE BALLX
diff --git a/src/scripts/conio.4th b/src/scripts/conio.4th
index ac88382..9bcc917 100644
--- a/src/scripts/conio.4th
+++ b/src/scripts/conio.4th
@@ -1,3 +1,5 @@
+' CONIOAPI ENDSRC ( Avoid multiple loads )
+
 ( LOADMOD" CONIO"  CONIO is already available in plforth )
 
 LOOKUP CONIO CONSTANT CONIOAPI
diff --git a/src/scripts/fileio.4th b/src/scripts/fileio.4th
index ee64a97..8dc89c4 100644
--- a/src/scripts/fileio.4th
+++ b/src/scripts/fileio.4th
@@ -1,3 +1,5 @@
+' FILEIOAPI ENDSRC ( Avoid multiple loads )
+
 ( LOADMOD" FILEIO"  FILEIO is already available in plforth )
 
 LOOKUP FILEIO CONSTANT FILEIOAPI
diff --git a/src/scripts/fpu.4th b/src/scripts/fpu.4th
index fdf939b..c25e307 100644
--- a/src/scripts/fpu.4th
+++ b/src/scripts/fpu.4th
@@ -1,3 +1,5 @@
+' FPULIB ENDSRC ( Avoid multipe loads )
+
 " SANE"   LOADMOD"  "
 " FPSTR"  LOADMOD"  "
 " FPU"    LOADMOD"  "
diff --git a/src/scripts/grlib.4th b/src/scripts/grlib.4th
index ce85fbd..af2326d 100644
--- a/src/scripts/grlib.4th
+++ b/src/scripts/grlib.4th
@@ -1,3 +1,5 @@
+' GRMODE ENDSRC ( Avoid multiple loads )
+
 " GRLIB" LOADMOD"  "
 
 LOOKUP GRPLOT    PLASMA GRPLOT
diff --git a/src/scripts/hgrlib.4th b/src/scripts/hgrlib.4th
index 3fe2bd1..f55d274 100644
--- a/src/scripts/hgrlib.4th
+++ b/src/scripts/hgrlib.4th
@@ -1,3 +1,5 @@
+' HGRMODE ENDSRC ( Avoid multiple loads )
+
 " HGRLIB" LOADMOD"  "
 
 LOOKUP HGRPLOT    PLASMA HGRPLOT
diff --git a/src/scripts/hrbounce.4th b/src/scripts/hrbounce.4th
index 37758ca..4edd9f8 100644
--- a/src/scripts/hrbounce.4th
+++ b/src/scripts/hrbounce.4th
@@ -2,35 +2,9 @@ LOOKUP HRFORTH  ( HGR page 1 reserved )
 LOOKUP HR2FORTH ( HGR page 1 and 2 reserved )
 OR NOT ABORT" Must run with HRFORTH."
 
-: ?PLASMA
-  " IFACE" FIND
-  SWAP DROP
-  0= IF
-    " PLASMA.4TH" SRC
-  THEN
-;
-
-?PLASMA ( Load PLASMA if not already )
-
-: ?CONIO
-  " CONIOAPI" FIND
-  SWAP DROP
-  0= IF
-    " CONIO.4TH" SRC
-  THEN
-;
-
-?CONIO ( Load CONIO if not already )
-
-: ?HGRLIB
-  " HGRLIB" FIND
-  SWAP DROP
-  0= IF
-    " HGRLIB.4TH" SRC
-  THEN
-;
-
-?HGRLIB ( Load GRLIB if not already )
+SRC" PLASMA.4TH"
+SRC" CONIO.4TH"
+SRC" HGRLIB.4TH"
 
  5 VARIABLE BALLCLR
 10 VARIABLE BALLX
diff --git a/src/scripts/int32.4th b/src/scripts/int32.4th
index bfdc6c9..663701a 100644
--- a/src/scripts/int32.4th
+++ b/src/scripts/int32.4th
@@ -1,3 +1,5 @@
+' DVAR ENDSRC ( Avoid multiple loads )
+
 " INT32"   LOADMOD"  "
 
 LOOKUP ZERO32       PLASMA ZERO32   ( -- )
diff --git a/src/scripts/plasma.4th b/src/scripts/plasma.4th
index efd1b58..3731ea2 100644
--- a/src/scripts/plasma.4th
+++ b/src/scripts/plasma.4th
@@ -1,3 +1,5 @@
+' IFACE ENDSRC ( Avoid multiple loads )
+
 : IFACE 2 * + @ ;
 
 LOOKUP CMDSYS 0  IFACE  CONSTANT PLASMAVER
@@ -69,4 +71,3 @@ LOOKUP FILEIO 1  IFACE PLASMA SETPFX
 : PFX"
     34 WORD SETPFX DROP
 ;
-HERE FENCE
\ No newline at end of file
diff --git a/src/scripts/rod.4th b/src/scripts/rod.4th
index cae9595..3d5c845 100644
--- a/src/scripts/rod.4th
+++ b/src/scripts/rod.4th
@@ -1,22 +1,5 @@
-: ?PLASMA
-  " IFACE" FIND
-  SWAP DROP
-  0= IF
-    " PLASMA.4TH" SRC
-  THEN
-;
-
-?PLASMA ( Load PLASMA if not already )
-
-: ?CONIO
-  " CONIOAPI" FIND
-  SWAP DROP
-  0= IF
-    " CONIO.4TH" SRC
-  THEN
-;
-
-?CONIO ( Load CONIO if not already )
+SRC" PLASMA.4TH"
+SRC" CONIO.4TH"
 
 0 VARIABLE K
 0 VARIABLE W
diff --git a/src/toolsrc/plforth.pla b/src/toolsrc/plforth.pla
index a69fc9c..252a462 100644
--- a/src/toolsrc/plforth.pla
+++ b/src/toolsrc/plforth.pla
@@ -19,7 +19,7 @@ word  previnptr[SRCREFS]
 // Internal buffers
 //
 res[SRCREFS * INBUF_SIZE] inbuf
-res[t_except]             exit
+res[t_except]             exitforth
 //
 // RSTACK
 //
@@ -111,15 +111,15 @@ predef _immediate_#0, _exit_#0, _pad_#1, _trailing_(a,b)#2
 predef _tors_(a)#0, _fromrs_#1, _toprs_#1, _lookup_#1
 predef _move_(a,b,c)#0, _fill_(a,b,c)#0, _plasma_(a)#0
 predef _var_(a)#0, _const_(a)#0, _lit_#1, _slit_#1, _find_(a)#2, _tick_#1
-predef _fence_(a)#0, _forget_#0, _terminal_#1, _prat_(a)#0, _prhexat_(a)#0
+predef _forget_#0, _terminal_#1, _prat_(a)#0
 predef _char_#0, _str_#0, _prstr_#0, _prpstr_#0
-predef _prval_(a)#0, _prbyte_(a)#0, _prshex_(a)#0, _prsbyte_(a)#0, _prhex_(a)#0
-predef _accept_(a,b)#1, _src_(a)#0, _srcstr_#0, _query_#0, _expect_(a,b)#0, _type_(a,b)#0
+predef _prval_(a)#0, _prbyte_(a)#0, _prhex_(a)#0
+predef _accept_(a,b)#1, _query_#0, _expect_(a,b)#0, _type_(a,b)#0
 predef _vlist_#0, _tron_#0, _troff_#0, _stepon_#0, _stepoff_#0
-predef _itc_#0, _pbc_#0, _comment_#0
+predef _itc_#0, _pbc_#0, _comment_#0, _src_(a)#0, _srcstr_#0, _endsrc_(a)#0
 predef _brk_#0, _brkon_#0, _brkoff_#0, _word_(a)#1, _count_(a)#2
 predef _space_#0, _spaces_(a)#0, _show_#0, _showstack_#0, _showrstack_#0
-predef _showhash_#0, _cont_#0, _restart_#0, _bye_#0, _quit_#0
+predef _showhash_#0, _cont_#0, _exitforth_#0, _bye_#0, _quit_#0
 predef _abort_(a)#0, _doabortstr_(a,b)#0, _abortstr_#0
 predef compword(dentry)#0, execword(dentry)#0
 // DROP
@@ -422,22 +422,14 @@ word = @d_until, 0, @_while_
 char d_repeat = "REPEAT"
 byte = imm_flag
 word = @d_while, 0, @_repeat_
-// FENCE
-char d_fence = "FENCE"
-byte = 0
-word = @d_repeat, 0, @_fence_
 // FORGET
 char d_forget = "FORGET"
 byte = 0
-word = @d_fence, 0, @_forget_
+word = @d_repeat, 0, @_forget_
 // CREATE
 char d_create = "CREATE"
 byte = 0
 word = @d_forget, 0, @_create_
-// BUILDS ( same as CREATE )
-char d_builds = "<BUILDS"
-byte = 0
-word = @d_create, 0, @_create_
 // RECREATE/DOES COMPILE TIME ( not in vocabulary )
 char d_createdoes = "(CREATEDOES)"
 byte = componly_flag
@@ -445,7 +437,7 @@ word = 0, 0, @_itcdoes_
 // DOES
 char d_does = "DOES>"
 byte = imm_flag
-word = @d_builds, 0, @_does_
+word = @d_create, 0, @_does_
 // COMMA
 char d_comma = ","
 byte = 0
@@ -542,14 +534,10 @@ word = @d_word, 0, @_trailing_
 char d_prat = "?"
 byte = 0
 word = @d_trailing, 0, @_prat_
-// PRINT HEX @TOS
-char d_prhexat = "$?"
-byte = 0
-word = @d_prat, 0, @_prhexat_
 // PRINT TOS
 char d_prtos = "."
 byte = 0
-word = @d_prhexat, 0, @_prval_
+word = @d_prat, 0, @_prval_
 // PRINT TOS HEX
 char d_prtoshex = "$."
 byte = 0
@@ -558,18 +546,10 @@ word = @d_prtos, 0, @_prhex_
 char d_prtosbyte = "C$."
 byte = 0
 word = @d_prtoshex, 0, @_prbyte_
-// PRINT TOS $HEX
-char d_prtosshex = "$$."
-byte = 0
-word = @d_prtosbyte, 0, @_prshex_
-// PRINT TOS SHEX BYTE
-char d_prtossbyte = "CS$."
-byte = 0
-word = @d_prtosshex, 0, @_prsbyte_
 // EMIT
 char d_emit = "EMIT"
 byte = 0
-word = @d_prtossbyte, 0, @putc
+word = @d_prtosbyte, 0, @putc
 // CR
 char d_cr = "CR"
 byte = 0
@@ -618,10 +598,14 @@ word = @d_prpstr, 0, @_src_
 char d_srcstr = "SRC\""
 byte = 0
 word = @d_src, 0, @_srcstr_
+// END SOURCE FILE
+char d_endsrc = "ENDSRC"
+byte = 0
+word = @d_srcstr, 0, @_endsrc_
 // CONTINUE AFTER BRK
 char d_cont = "CONT"
 byte = 0
-word = @d_srcstr, 0, @_cont_
+word = @d_endsrc, 0, @_cont_
 // QUIT
 char d_quit = "QUIT"
 byte = 0
@@ -638,14 +622,14 @@ word = @d_abort, 0, @_doabortstr_
 char d_abortstr = "ABORT\""
 byte = imm_flag
 word = @d_doabortstr, 0, @_abortstr_
-// COLD RESTART
-char d_restart = "COLD"
+// COLD exitforth
+char d_exitforth = "COLD"
 byte = 0
-word = @d_abortstr, 0, @_restart_
+word = @d_abortstr, 0, @_exitforth_
 // COMMENT
 char d_comment = "("
 byte = imm_flag
-word = @d_restart, 0, @_comment_
+word = @d_exitforth, 0, @_comment_
 
 //
 // PLFORTH custom words
@@ -731,6 +715,20 @@ def keyin#0
   ^(inptr + ^inptr + 1) = 0 // NULL terminate
   inptr++
 end
+def endsrc#1
+  if srclevel > 0
+    srclevel--
+    fileio:close(inref[srclevel]) // EOF
+    inref[srclevel] = 0
+    inbufptr        = inbufptr - INBUF_SIZE
+    inptr           = previnptr[srclevel]
+    if srclevel == 0              // - switch back to keyboard input
+        infunc = @keyin
+        keyin
+    fin
+  fin
+  return srclevel == 0
+end
 def filein#0
   byte len
   repeat
@@ -742,15 +740,8 @@ def filein#0
         ^(inbufptr + len) = 0 // NULL terminate
         inptr             = inbufptr
       else
-        srclevel--
-        fileio:close(inref[srclevel]) // EOF
-        inref[srclevel] = 0
-        inbufptr        = inbufptr - INBUF_SIZE
-        inptr           = previnptr[srclevel]
-        if srclevel == 0              // - switch back to keyboard input
-            infunc = @keyin
-            keyin
-            return
+        if endsrc
+          return
         fin
       fin
     until len
@@ -961,20 +952,15 @@ def warmstart#0
   brk    = 0
   brkcfa = 0
   RSP    = RSTK_SIZE
-  infunc = @keyin
-  inptr  = keyinbuf
-  ^inptr = 0
   if state & comp_flag // Undo compilation state
     heaprelease(vlist)
     vlist = *_lfa_(vlist)
-    buildhashtbl
   fin
   state = 0
-  while srclevel
-    srclevel--
-    fileio:close(inref[srclevel])
-    inref[srclevel] = 0
-  loop
+  while !endsrc; loop
+  infunc = @keyin
+  inptr  = keyinbuf
+  ^inptr = 0
 end
 //
 // Cold start
@@ -1019,10 +1005,20 @@ def compliteral(value)#0
     pfillw(@d_lit)
     pfillw(value) // Poke literal value into dictionary
   else // comp_pbc_flag
-    if value >= 0 and value <= 15
-      pfillb(value << 1) // CONSTANT NIBBLE
-    elsif value == -1
-      pfillb($20) // CONSTANT MINUS_ONE
+    if value >= 0 and value <= 255
+      if value <= 15
+        pfillb(value << 1) // CONSTANT NIBBLE
+      else
+        pfillb($2A) // CONSTANT BYTE
+        pfillb(value) // Poke literal value into dictionary
+      fin
+    elsif value < 0 and value >= -256
+      if value == -1
+        pfillb($20) // CONSTANT MINUS_ONE
+      else
+        pfillb($5E) // CONSTANT NEGATIVE BYTE
+        pfillb(value) // Poke literal value into dictionary
+      fin
     else
       pfillb($2C) // CONSTANT WORD
       pfillw(value) // Poke literal value into dictionary
@@ -1596,26 +1592,14 @@ end
 def _tick_#1
   return find(nextword(' '))
 end
-def _fence_(a)#0
-  if isult(a, startheap)
-    a = startheap
-  fin
-  fence = a
-end
 def _forget_#0
   word dentry
 
   dentry = find(nextword(' '))
   if dentry
-    if isult(dentry, fence)
-      if isuge(vlist, fence)
-        repeat
-          dentry = vlist
-          vlist  = *_lfa_(dentry)
-        until isult(vlist, fence)
-      else
-        return // Do nothing
-      fin
+    if isult(dentry, startheap)
+      vlist = @d_vlist
+      dentry = startheap
     else
       vlist = *_lfa_(dentry)
     fin
@@ -1684,23 +1668,14 @@ def _prval_(a)#0
   puti(a); putc(' ')
 end
 def _prbyte_(a)#0
-  putb(a); putc(' ')
-end
-def _prhex_(a)#0
-  puth(a); putc(' ')
-end
-def _prsbyte_(a)#0
   putc('$'); putb(a); putc(' ')
 end
-def _prshex_(a)#0
+def _prhex_(a)#0
   putc('$'); puth(a); putc(' ')
 end
 def _prat_(a)#0
   puti(*a); putc(' ')
 end
-def _prhexat_(a)#0
-  putc('$'); puth(*a); putc(' ')
-end
 def _char_#0
   word str
   byte len
@@ -1830,6 +1805,11 @@ def _srcstr_#0
     _src_(filename)
   fin
 end
+def _endsrc_(a)#0
+  if a
+    endsrc
+  fin
+end
 def _show_#0
   word dentry, pfa, w
 
@@ -1971,7 +1951,7 @@ end
 //
 def _quit_#0
   warmstart
-  throw(@exit, FALSE)
+  throw(@exitforth, FALSE)
 end
 //
 // Abort
@@ -2000,20 +1980,20 @@ def _abortstr_#0
   fin
 end
 //
-// Restart
+// exitforth
 //
-def _restart_#0
+def _exitforth_#0
   coldstart
-  throw(@exit, FALSE)
+  throw(@exitforth, FALSE)
 end
 //
 // Leave FORTH
 //
 def _bye_#0
-  throw(@exit, TRUE)
+  throw(@exitforth, TRUE)
 end
 
-puts("FORTH for PLASMA 2.1 WIP\n")
+puts("FORTH WIP for PLASMA 2.1\n")
 if cmdsys:sysver < $0201
   puts("PLASMA >= 2.01 required\n")
   return
@@ -2024,7 +2004,7 @@ fileio:iobufalloc(4) // Allocate a bunch of file buffers
 startheap = heapmark
 coldstart
 inptr = argNext(argFirst)
-if not except(@exit)
+if not except(@exitforth)
   if ^inptr; inptr++; _srcstr_; fin
   interpret
 fin