1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 07:24:16 +00:00

Add words to find existing words and improved versions of SRC

This commit is contained in:
David Schmenk 2023-12-31 11:32:14 -08:00
parent 6bb7a9dca9
commit 1dd792e87c
3 changed files with 82 additions and 27 deletions

View File

@ -1,16 +1,11 @@
SRC" PLASMA.4TH"
: ?PLASMA
" IFACE" FIND
0= IF
" PLASMA.4TH" SRC
THEN
;
( LOADMOD" CONIO" CONIO is already available in plforth )
LOOKUP CONIO CONSTANT CONIOAPI
CONIOAPI 3 IFACE PLASMA HOME
CONIOAPI 4 IFACE PLASMA GOTOXY
CONIOAPI 7 IFACE PLASMA TEXTMODE
CONIOAPI 8 IFACE PLASMA GRMODE
CONIOAPI 9 IFACE PLASMA GRCOLOR
CONIOAPI 10 IFACE PLASMA GRPLOT
CONIOAPI 11 IFACE PLASMA TONE
CONIOAPI 12 IFACE PLASMA RAND
?PLASMA ( Load PLASMA if not already )
5 VARIABLE BALLCLR
10 VARIABLE BALLX

View File

@ -24,3 +24,22 @@ LOOKUP STRCAT PLASMA STRCAT
CPYCMD
" ED" EXECMOD 0< IF ." Failed to run ED" CR ABORT THEN
;
( LOADMOD" FILEIO" FILEIO is already available in plforth )
LOOKUP FILEIO CONSTANT FILEIOAPI
FILEIOAPI 0 IFACE PLASMA GETPFX
FILEIOAPI 1 IFACE PLASMA SETPFX
( LOADMOD" CONIO" CONIO is already available in plforth )
LOOKUP CONIO CONSTANT CONIOAPI
CONIOAPI 3 IFACE PLASMA HOME
CONIOAPI 4 IFACE PLASMA GOTOXY
CONIOAPI 7 IFACE PLASMA TEXTMODE
CONIOAPI 8 IFACE PLASMA GRMODE
CONIOAPI 9 IFACE PLASMA GRCOLOR
CONIOAPI 10 IFACE PLASMA GRPLOT
CONIOAPI 11 IFACE PLASMA TONE
CONIOAPI 12 IFACE PLASMA RAND

View File

@ -45,10 +45,11 @@ predef _create_#0, _itcdoes_(a)#0, _does_#0
predef pfillw(a)#0, pfillb(a)#0, _colon_#0, _semi_#0
predef _tors_(a)#0, _fromrs_#1, _toprs_#1, _execute_(a)#0, _lookup_#1
predef _cmove_(a,b,c)#0, _move_(a,b,c)#0, _fill_(a,b,c)#0, _plasma_(a)#0
predef _var_(a)#0, _const_(a)#0, _lit_#1, _slit_#1, _tick_#1, _forget_#0
predef _terminal_#1, _prat_(a)#0, _str_#0, _prstr_#0, _src_#0
predef _var_(a)#0, _const_(a)#0, _lit_#1, _slit_#1, _find_(a)#2, _tick_#1
predef _forget_#0, _terminal_#1, _prat_(a)#0, _str_#0, _prstr_#0
predef _src_(a)#0, _srcstr_#0
predef _vlist_#0, _tron_#0, _troff_#0, _itc_#0, _pbc_#0, _comment_#0
predef _brkout_#0, _brkon_#0, _brkoff_#0, _word_(a)#1
predef _brkout_#0, _brkon_#0, _brkoff_#0, _word_(a)#1, _count_(a)#2
predef _space_#0, _spaces_(a)#0, _show_#0, _showstack_#0, _showrstack_#0
predef _cont_#0, _restart_#0, _bye_#0, _quit_#0, _abort_#0
// DROP
@ -363,10 +364,18 @@ word = @d_commab, @_colon_
char d_semi = ";"
byte = imm_flag
word = @d_colon, @_semi_
// COUNT
char d_count = "COUNT"
byte = 0
word = @d_semi, @_count_
// FIND
char d_find = "FIND"
byte = 0
word = @d_count, @_find_
// TICK
char d_tick = "'"
byte = 0
word = @d_semi, @_tick_
byte = imm_flag
word = @d_find, @_tick_
// INLINE LITERAL NUMBER
char d_lit = "LIT"
byte = param_flag
@ -435,14 +444,18 @@ word = @d_slit, @puts
char d_prstr = ".\""
byte = imm_flag
word = @d_doprstr, @_prstr_
// SOURCE FILE
char d_prsrc = "SRC\""
// READ SOURCE FILE FROM STACK
char d_src = "SRC"
byte = 0
word = @d_prstr, @_src_
// READ SOURCE FILE FROM INPUT
char d_srcstr = "SRC\""
byte = 0
word = @d_src, @_srcstr_
// CONT
char d_cont = "CONT"
byte = 0
word = @d_prsrc, @_cont_
word = @d_srcstr, @_cont_
// QUIT
char d_quit = "QUIT"
byte = 0
@ -1423,6 +1436,18 @@ def _repeat_#0
*backref = heapmark - backref // Backref to BEGIN
fin
end
def _count_(a)#2
return a + 1, ^a
end
def _find_(a)#2
word dentry
dentry = find(_count_(a))
if dentry
return dentry, ^_ffa_(dentry) & imm_flag ?? 1 :: -1
fin
return a, 0
end
def _tick_#1
return find(nextword(' '))
end
@ -1502,18 +1527,15 @@ def _prstr_#0
puts(str)
fin
end
def _src_#0
def _src_(a)#0
word filename
byte len
filename, len = nextword('"')
filename--
^filename = len
if srclevel >= SRCREFS
puts("Too many nested SRC\"")
puts("Too many nested SRC")
_abort_
fin
inref[srclevel] = fileio:open(filename)
inref[srclevel] = fileio:open(a)
if inref[srclevel]
fileio:newline(inref[srclevel], $7F, $0D)
infunc = @filein
@ -1526,6 +1548,25 @@ def _src_#0
puts("Failed to open "); puts(filename); putln
fin
end
def _srcstr_#0
word filename
byte len
if state & comp_flag
_str_
if state & comp_itc_flag
pfillw(@d_src)
else // comp_pbc_flag
pfillb($54) // CALL
pfillw(@_src_)
fin
else
filename, len = nextword('"')
filename--
^filename = len
_src_(filename)
fin
end
def _show_#0
word dentry, pfa, w
@ -1677,7 +1718,7 @@ inptr = argNext(argFirst)
exit = heapalloc(t_except)
startheap = heapmark
if not except(exit)
if ^inptr; inptr++; _src_; fin
if ^inptr; inptr++; _srcstr_; fin
interpret
fin
done