mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-08-09 01:25:00 +00:00
Interpret file, including command line argument
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
include "inc/cmdsys.plh"
|
include "inc/cmdsys.plh"
|
||||||
include "inc/fileio.plh"
|
include "inc/fileio.plh"
|
||||||
|
include "inc/args.plh"
|
||||||
//
|
//
|
||||||
// FORTH dictionary layout
|
// FORTH dictionary layout
|
||||||
//
|
//
|
||||||
@@ -30,10 +31,11 @@ predef _cset_(a,b)#0, _cget_(a)#1, _wset_(a,b)#0, _wget_(a)#1
|
|||||||
predef _cfa_(a)#1, _lfa_(a)#1
|
predef _cfa_(a)#1, _lfa_(a)#1
|
||||||
predef _eq_(a,b)#1, _gt_(a,b)#1, _lt_(a,b)#1
|
predef _eq_(a,b)#1, _gt_(a,b)#1, _lt_(a,b)#1
|
||||||
predef _branch_#0, _branch0_(a)#0, _if_#0, _else_#0, _then_#0
|
predef _branch_#0, _branch0_(a)#0, _if_#0, _else_#0, _then_#0
|
||||||
predef _do_#0, _doloop_#0, _loop_#0, _i_#1, _j_#1
|
predef _do_#0, _doloop_#0, _leave_#0, _loop_#0, _j_#1
|
||||||
predef _create_#0, _dodoes_(words)#0, _filldoes_#0, _does_#0, _pset_(a)#0, _colon_#0, _semi_#0
|
predef _create_#0, _dodoes_(words)#0, _filldoes_#0, _does_#0, _pset_(a)#0, _colon_#0, _semi_#0
|
||||||
predef _tors_(a)#0, _fromrs_#1, _toprs_#1
|
predef _tors_(a)#0, _fromrs_#1, _toprs_#1
|
||||||
predef _var_(a)#0, _const_(a)#0, _lit_#1, _tick_#1, _forget_#0
|
predef _var_(a)#0, _const_(a)#0, _lit_#1, _tick_#1, _forget_#0
|
||||||
|
predef _prstr_#0, _src_#0
|
||||||
predef _vlist_#0, _tron_#0, _troff_#0, _show_#0, _bye_#0, _abort_#0
|
predef _vlist_#0, _tron_#0, _troff_#0, _show_#0, _bye_#0, _abort_#0
|
||||||
// DROP
|
// DROP
|
||||||
char d_drop = "DROP"
|
char d_drop = "DROP"
|
||||||
@@ -167,10 +169,14 @@ word = @d_else, @_then_, 0
|
|||||||
char d_do = "DO"
|
char d_do = "DO"
|
||||||
byte = componly_flag | imm_flag
|
byte = componly_flag | imm_flag
|
||||||
word = @d_then, @_do_, 0
|
word = @d_then, @_do_, 0
|
||||||
|
// LEAVE
|
||||||
|
char d_leave = "LEAVE"
|
||||||
|
byte = componly_flag
|
||||||
|
word = @d_do, @_leave_, 0
|
||||||
// LOOP
|
// LOOP
|
||||||
char d_doloop = "(DOLOOP)"
|
char d_doloop = "(DOLOOP)"
|
||||||
byte = componly_flag | inline_flag
|
byte = componly_flag | inline_flag
|
||||||
word = @d_do, @_doloop_, 0
|
word = @d_leave, @_doloop_, 0
|
||||||
// LOOP
|
// LOOP
|
||||||
char d_loop = "LOOP"
|
char d_loop = "LOOP"
|
||||||
byte = componly_flag | imm_flag
|
byte = componly_flag | imm_flag
|
||||||
@@ -235,10 +241,22 @@ word = @d_prtos, @puth, 0
|
|||||||
char d_emit = "EMIT"
|
char d_emit = "EMIT"
|
||||||
byte = 0
|
byte = 0
|
||||||
word = @d_prtoshex, @putc, 0
|
word = @d_prtoshex, @putc, 0
|
||||||
|
// CR
|
||||||
|
char d_cr = "CR"
|
||||||
|
byte = 0
|
||||||
|
word = @d_emit, @putln, 0
|
||||||
|
// PRINT STRING
|
||||||
|
char d_prstr = ".\""
|
||||||
|
byte = 0
|
||||||
|
word = @d_cr, @_prstr_, 0
|
||||||
|
// SOURCE FILE
|
||||||
|
char d_prsrc = "SRC\""
|
||||||
|
byte = 0
|
||||||
|
word = @d_prstr, @_src_, 0
|
||||||
// BYE
|
// BYE
|
||||||
char d_bye = "BYE"
|
char d_bye = "BYE"
|
||||||
byte = 0
|
byte = 0
|
||||||
word = @d_emit, @_bye_, 0
|
word = @d_prsrc, @_bye_, 0
|
||||||
// SHOW DEFINITION
|
// SHOW DEFINITION
|
||||||
char d_show = "SHOW"
|
char d_show = "SHOW"
|
||||||
byte = 0
|
byte = 0
|
||||||
@@ -259,7 +277,10 @@ word = @d_troff, @_vlist_, 0
|
|||||||
// Internal variables
|
// Internal variables
|
||||||
//
|
//
|
||||||
word vlist = @d_vlist
|
word vlist = @d_vlist
|
||||||
word startheap, infunc, inptr, IIP, W
|
word startheap, arg, infunc, inref, IIP, W
|
||||||
|
const INBUF_SIZE = 80
|
||||||
|
char inbuf[INBUF_SIZE + 2]
|
||||||
|
word inptr = @inbuf
|
||||||
//
|
//
|
||||||
// RSTACK
|
// RSTACK
|
||||||
//
|
//
|
||||||
@@ -274,10 +295,15 @@ const comp_flag = $02
|
|||||||
byte state = 0
|
byte state = 0
|
||||||
byte trace = 0
|
byte trace = 0
|
||||||
byte aborted = 0
|
byte aborted = 0
|
||||||
byte _reset_stacks = $A2, $FE // LDX #$FE
|
byte _get_hwstack = $EA // TXA
|
||||||
byte = $9A // TXS
|
byte = $EA // TSX
|
||||||
byte _reset_estack = $A2, $10 // LDX ESTKSZ/2
|
byte = $EA, $EA, $EA // STX *+2
|
||||||
byte = $60 // RTS
|
byte = $EA // TAX
|
||||||
|
byte = $60 // RTS
|
||||||
|
byte _reset_stacks = $A2, $FE // LDX #$FE
|
||||||
|
byte = $9A // TXS
|
||||||
|
byte _reset_estack = $A2, $10 // LDX ESTKSZ/2
|
||||||
|
byte = $60 // RTS
|
||||||
//
|
//
|
||||||
// Helper routines
|
// Helper routines
|
||||||
//
|
//
|
||||||
@@ -296,6 +322,16 @@ def keyin#0
|
|||||||
inptr++
|
inptr++
|
||||||
end
|
end
|
||||||
def filein#0
|
def filein#0
|
||||||
|
inbuf = fileio:read(inref, @inbuf + 1, INBUF_SIZE)
|
||||||
|
if inbuf
|
||||||
|
inbuf[inbuf + 1] = 0 // NULL terminate
|
||||||
|
inptr = @inbuf + 1
|
||||||
|
else
|
||||||
|
fileio:close(inref)
|
||||||
|
inref = 0
|
||||||
|
infunc = @keyin
|
||||||
|
keyin
|
||||||
|
fin
|
||||||
end
|
end
|
||||||
def toknext#2
|
def toknext#2
|
||||||
word tokptr
|
word tokptr
|
||||||
@@ -330,6 +366,23 @@ def toknext#2
|
|||||||
inptr = inptr + len
|
inptr = inptr + len
|
||||||
return tokptr, len
|
return tokptr, len
|
||||||
end
|
end
|
||||||
|
def delimit(a)#2
|
||||||
|
word delim
|
||||||
|
byte len
|
||||||
|
|
||||||
|
if ^inptr == ' '
|
||||||
|
inptr++
|
||||||
|
fin
|
||||||
|
delim = inptr
|
||||||
|
while ^inptr and ^inptr <> a // Find delimiter
|
||||||
|
inptr++
|
||||||
|
loop
|
||||||
|
len = inptr - delim
|
||||||
|
if ^inptr == a
|
||||||
|
inptr++
|
||||||
|
fin
|
||||||
|
return delim, len
|
||||||
|
end
|
||||||
//
|
//
|
||||||
// Find match in dictionary
|
// Find match in dictionary
|
||||||
//
|
//
|
||||||
@@ -631,6 +684,9 @@ def _do_#0
|
|||||||
*(heapalloc(2)) = @d_torstk
|
*(heapalloc(2)) = @d_torstk
|
||||||
_tors_(heapmark)
|
_tors_(heapmark)
|
||||||
end
|
end
|
||||||
|
def _leave_#0
|
||||||
|
RSTACK[RSP] = RSTACK[RSP + 1] - 1
|
||||||
|
end
|
||||||
def _doloop_#0
|
def _doloop_#0
|
||||||
word count
|
word count
|
||||||
|
|
||||||
@@ -648,9 +704,6 @@ def _loop_#0
|
|||||||
*(heapalloc(2)) = @d_doloop
|
*(heapalloc(2)) = @d_doloop
|
||||||
*(heapalloc(2)) = _fromrs_
|
*(heapalloc(2)) = _fromrs_
|
||||||
end
|
end
|
||||||
def _i_#1
|
|
||||||
return RSTACK[RSP]
|
|
||||||
end
|
|
||||||
def _j_#1
|
def _j_#1
|
||||||
return RSTACK[RSP + 2]
|
return RSTACK[RSP + 2]
|
||||||
end
|
end
|
||||||
@@ -675,7 +728,7 @@ end
|
|||||||
def _bye_#0
|
def _bye_#0
|
||||||
byte params[7]
|
byte params[7]
|
||||||
|
|
||||||
if aborted // If aborted then must exit with 'BYE' processing
|
if aborted // then must exit with 'BYE' processing
|
||||||
params.0 = 4
|
params.0 = 4
|
||||||
params.1 = 0
|
params.1 = 0
|
||||||
params:2 = 0
|
params:2 = 0
|
||||||
@@ -685,6 +738,33 @@ def _bye_#0
|
|||||||
fin
|
fin
|
||||||
state = state | exit_flag
|
state = state | exit_flag
|
||||||
end
|
end
|
||||||
|
def _prstr_#0
|
||||||
|
word str
|
||||||
|
byte len
|
||||||
|
|
||||||
|
str, len = delimit('"')
|
||||||
|
str--
|
||||||
|
^str = len
|
||||||
|
puts(str)
|
||||||
|
end
|
||||||
|
def _src_#0
|
||||||
|
word filename
|
||||||
|
byte len
|
||||||
|
|
||||||
|
filename, len = delimit('"')
|
||||||
|
filename--
|
||||||
|
^filename = len
|
||||||
|
inref = fileio:open(filename)
|
||||||
|
if inref
|
||||||
|
fileio:newline(inref, $7F, $0D)
|
||||||
|
infunc = @filein
|
||||||
|
inptr = @inbuf
|
||||||
|
inbuf = 0
|
||||||
|
else
|
||||||
|
puts("Failed to open "); puts(filename); putln
|
||||||
|
_abort_
|
||||||
|
fin
|
||||||
|
end
|
||||||
def _show_#0
|
def _show_#0
|
||||||
word dentry, pfa, w
|
word dentry, pfa, w
|
||||||
|
|
||||||
@@ -726,14 +806,19 @@ end
|
|||||||
//
|
//
|
||||||
def _warmstart_#0
|
def _warmstart_#0
|
||||||
(@_reset_estack)()#0
|
(@_reset_estack)()#0
|
||||||
RSP = RSTK_SIZE
|
RSP = RSTK_SIZE
|
||||||
^inptr = 0
|
inbuf = 0
|
||||||
|
inptr = @inbuf
|
||||||
infunc = @keyin
|
infunc = @keyin
|
||||||
if state // Undo compilation state
|
if state // Undo compilation state
|
||||||
heaprelease(vlist)
|
heaprelease(vlist)
|
||||||
vlist = *_lfa_(vlist)
|
vlist = *_lfa_(vlist)
|
||||||
state = 0
|
state = 0
|
||||||
fin
|
fin
|
||||||
|
if inref
|
||||||
|
fileio:close(inref)
|
||||||
|
inref = 0
|
||||||
|
fin
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
// Cold start
|
// Cold start
|
||||||
@@ -776,6 +861,7 @@ end
|
|||||||
// Abort
|
// Abort
|
||||||
//
|
//
|
||||||
def _abort_#0
|
def _abort_#0
|
||||||
|
(@_reset_stacks)()#0
|
||||||
_warmstart_
|
_warmstart_
|
||||||
puts("Abort\n")
|
puts("Abort\n")
|
||||||
aborted = 1
|
aborted = 1
|
||||||
@@ -785,5 +871,7 @@ end
|
|||||||
puts("PLFORTH WIP\n")
|
puts("PLFORTH WIP\n")
|
||||||
startheap = heapmark
|
startheap = heapmark
|
||||||
_warmstart_
|
_warmstart_
|
||||||
|
inptr = argNext(argFirst)
|
||||||
|
if ^inptr; inptr++; _src_; fin
|
||||||
_quit_
|
_quit_
|
||||||
done
|
done
|
||||||
|
Reference in New Issue
Block a user