mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-20 17:29:11 +00:00
Compile simple colon definitions
This commit is contained in:
parent
27fc9a0fea
commit
ec16b9cc78
@ -17,73 +17,103 @@ include "inc/cmdsys.plh"
|
|||||||
//
|
//
|
||||||
const len_mask = $1F
|
const len_mask = $1F
|
||||||
const imm_flag = $20
|
const imm_flag = $20
|
||||||
const comp_flag = $40
|
|
||||||
const hidden_flag = $80
|
const hidden_flag = $80
|
||||||
//
|
//
|
||||||
// Predefine instrinsics
|
// Predefine instrinsics
|
||||||
//
|
//
|
||||||
predef _drop_(a)#0, _swap_(a,b)#2
|
predef _drop_(a)#0, _swap_(a,b)#2, _dup_(a)#2
|
||||||
predef _add_(a,b)#1, _sub_(a,b)#1, _mul_(a,b)#1, _div_(a,b)#1
|
predef _add_(a,b)#1, _sub_(a,b)#1, _mul_(a,b)#1, _div_(a,b)#1
|
||||||
predef _cset_(a,b)#0, _cget_(a)#1, _wset_(a,b)#0, _wget_(a)#1
|
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 _var_(a)#0, _forget_#0
|
predef _create_#0, _builds_#0, _does_#0, _pset_(a)#0, _colon_#0, _semi_#0
|
||||||
predef _vlist_#0, _bye_#0
|
predef _var_(a)#0, _lit_#1, _forget_#0
|
||||||
|
predef _vlist_#0, _show_#0, _bye_#0
|
||||||
// DROP
|
// DROP
|
||||||
char d_drop = "DROP"
|
char d_drop = "DROP"
|
||||||
word = 0, @_drop_, 0
|
word = 0, @_drop_, 0
|
||||||
// SWAP
|
// SWAP
|
||||||
char d_swap = "SWAP"
|
char d_swap = "SWAP"
|
||||||
word = @d_drop, @_swap_
|
word = @d_drop, @_swap_, 0
|
||||||
|
// DUP
|
||||||
|
char d_dup = "DUP"
|
||||||
|
word = @d_swap, @_dup_, 0
|
||||||
// ADD
|
// ADD
|
||||||
char d_add = "+"
|
char d_add = "+"
|
||||||
word = @d_swap, @_add_
|
word = @d_dup, @_add_, 0
|
||||||
// SUB
|
// SUB
|
||||||
char d_sub = "-"
|
char d_sub = "-"
|
||||||
word = @d_add, @_sub_
|
word = @d_add, @_sub_, 0
|
||||||
// MUL
|
// MUL
|
||||||
char d_mul = "*"
|
char d_mul = "*"
|
||||||
word = @d_sub, @_mul_
|
word = @d_sub, @_mul_, 0
|
||||||
// DIV
|
// DIV
|
||||||
char d_div = "/"
|
char d_div = "/"
|
||||||
word = @d_mul, @_div_
|
word = @d_mul, @_div_, 0
|
||||||
// CHAR SET
|
// CHAR SET
|
||||||
char d_cset = "C!"
|
char d_cset = "C!"
|
||||||
word = @d_div, @_cset_
|
word = @d_div, @_cset_, 0
|
||||||
// WORD SET
|
// WORD SET
|
||||||
char d_wset = "!"
|
char d_wset = "!"
|
||||||
word = @d_cset, @_wset_
|
word = @d_cset, @_wset_, 0
|
||||||
// CHAR GET
|
// CHAR GET
|
||||||
char d_cget = "C@"
|
char d_cget = "C@"
|
||||||
word = @d_wset, @_cget_
|
word = @d_wset, @_cget_, 0
|
||||||
// WORD SET
|
// WORD SET
|
||||||
char d_wget = "@"
|
char d_wget = "@"
|
||||||
word = @d_cget, @_wget_
|
word = @d_cget, @_wget_, 0
|
||||||
char d_var = "VARIABLE"
|
char d_var = "VARIABLE"
|
||||||
word = @d_wget, @_var_
|
word = @d_wget, @_var_, 0
|
||||||
// HERE
|
// HERE
|
||||||
char d_here = "HERE"
|
char d_here = "HERE"
|
||||||
word = @d_var, @heapmark
|
word = @d_var, @heapmark, 0
|
||||||
// ALLOT
|
// ALLOT
|
||||||
char d_allot = "ALLOT"
|
char d_allot = "ALLOT"
|
||||||
word = @d_here, @heapalloc
|
word = @d_here, @heapalloc, 0
|
||||||
// FORGET
|
// FORGET
|
||||||
char d_forget = "FORGET"
|
char d_forget = "FORGET"
|
||||||
word = @d_allot, @_forget_
|
word = @d_allot, @_forget_, 0
|
||||||
|
// BUILDS
|
||||||
|
char d_builds = "<BUILDS"
|
||||||
|
word = @d_forget, @_builds_, 0
|
||||||
|
// DOES
|
||||||
|
char d_does = "DOES>"
|
||||||
|
word = @d_builds, @_does_, 0
|
||||||
|
// COMMA
|
||||||
|
char d_comma = ","
|
||||||
|
word = @d_does, @_pset_, 0
|
||||||
|
// COLON
|
||||||
|
char d_colon = ":"
|
||||||
|
word = @d_comma, @_colon_, 0
|
||||||
|
// SEMI
|
||||||
|
char d_semi = ";"
|
||||||
|
word = @d_colon, @_semi_, 0
|
||||||
|
// LITERAL
|
||||||
|
char d_lit = "LIT"
|
||||||
|
word = @d_semi, @_lit_, 0
|
||||||
// PRINT TOS
|
// PRINT TOS
|
||||||
char d_prtos = "."
|
char d_prtos = "."
|
||||||
word = @d_forget, @puti
|
word = @d_lit, @puti, 0
|
||||||
// EXIT
|
// EXIT
|
||||||
char d_bye = "BYE"
|
char d_bye = "BYE"
|
||||||
word = @d_prtos, @_bye_
|
word = @d_prtos, @_bye_, 0
|
||||||
|
// SHOW DEFINITION
|
||||||
|
char d_show = "SHOW"
|
||||||
|
word = @d_bye, @_show_, 0
|
||||||
// LIST VOCAB
|
// LIST VOCAB
|
||||||
char d_vlist = "VLIST"
|
char d_vlist = "VLIST"
|
||||||
word = @d_bye, @_vlist_
|
word = @d_show, @_vlist_, 0
|
||||||
//
|
//
|
||||||
// Internal variables
|
// Internal variables
|
||||||
//
|
//
|
||||||
word vlist=@d_vlist
|
word vlist=@d_vlist
|
||||||
word inptr, ip, w
|
word inptr, IIP, W
|
||||||
char exit = 0
|
//
|
||||||
|
// State flags
|
||||||
|
//
|
||||||
|
const comp_flag = $01
|
||||||
|
const build_flag = $02
|
||||||
|
const exit_flag = $80
|
||||||
|
char state = 0
|
||||||
//
|
//
|
||||||
// Dictionary routines
|
// Dictionary routines
|
||||||
//
|
//
|
||||||
@ -117,9 +147,14 @@ end
|
|||||||
//
|
//
|
||||||
// Execute code in CFA
|
// Execute code in CFA
|
||||||
//
|
//
|
||||||
def exec(cfa)#0
|
def exec(dentry)#0
|
||||||
w = cfa
|
//char l
|
||||||
(*w)()#0
|
//l = ^dentry
|
||||||
|
//^dentry = l & len_mask
|
||||||
|
//puts("Exec "); puts(dentry); putln
|
||||||
|
//^dentry = l
|
||||||
|
W = _cfa_(dentry)
|
||||||
|
(*W)()#0
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
// Convert input into number
|
// Convert input into number
|
||||||
@ -154,6 +189,9 @@ end
|
|||||||
def _swap_(a,b)#2
|
def _swap_(a,b)#2
|
||||||
return b,a
|
return b,a
|
||||||
end
|
end
|
||||||
|
def _dup_(a)#2
|
||||||
|
return a,a
|
||||||
|
end
|
||||||
def _add_(a,b)#1
|
def _add_(a,b)#1
|
||||||
return a+b
|
return a+b
|
||||||
end
|
end
|
||||||
@ -179,15 +217,43 @@ def _wget_(a)#1
|
|||||||
return *a
|
return *a
|
||||||
end
|
end
|
||||||
def _lfa_(dentry)#1
|
def _lfa_(dentry)#1
|
||||||
return dentry + ^dentry + 1
|
char l
|
||||||
|
|
||||||
|
l = ^dentry & len_mask
|
||||||
|
return dentry + l + 1
|
||||||
end
|
end
|
||||||
def _cfa_(dentry)#1
|
def _cfa_(dentry)#1
|
||||||
return dentry + ^dentry + 3
|
char l
|
||||||
|
|
||||||
|
l = ^dentry & len_mask
|
||||||
|
return dentry + l + 3
|
||||||
|
end
|
||||||
|
def _pfa_(dentry)#1
|
||||||
|
char l
|
||||||
|
|
||||||
|
l = ^dentry & len_mask
|
||||||
|
return dentry + l + 5
|
||||||
end
|
end
|
||||||
def _dovar_#1
|
def _dovar_#1
|
||||||
return w + 2
|
return W + 2
|
||||||
end
|
end
|
||||||
def _var_(a)#0
|
def _docolon_#0
|
||||||
|
word prevIP
|
||||||
|
|
||||||
|
puts("DOCOLON:\n")
|
||||||
|
prevIP = IIP
|
||||||
|
IIP = W + 2
|
||||||
|
while *IIP
|
||||||
|
exec(*IIP)
|
||||||
|
IIP = IIP + 2
|
||||||
|
loop
|
||||||
|
IIP = prevIP
|
||||||
|
end
|
||||||
|
def _lit_#1
|
||||||
|
IIP = IIP + 2
|
||||||
|
return *IIP
|
||||||
|
end
|
||||||
|
def _create_#0
|
||||||
word bldptr, plist
|
word bldptr, plist
|
||||||
|
|
||||||
while ^inptr == ' '
|
while ^inptr == ' '
|
||||||
@ -205,11 +271,41 @@ def _var_(a)#0
|
|||||||
^vlist++
|
^vlist++
|
||||||
loop
|
loop
|
||||||
*bldptr = plist; bldptr = bldptr + 2
|
*bldptr = plist; bldptr = bldptr + 2
|
||||||
*bldptr = @_dovar_; bldptr = bldptr + 2
|
|
||||||
*bldptr = a
|
|
||||||
heapalloc(bldptr - vlist + 2)
|
heapalloc(bldptr - vlist + 2)
|
||||||
fin
|
fin
|
||||||
end
|
end
|
||||||
|
def _builds_#0
|
||||||
|
if state == comp_flag
|
||||||
|
state = build_flag
|
||||||
|
fin
|
||||||
|
end
|
||||||
|
def _does_#0
|
||||||
|
if state == build_flag
|
||||||
|
state = comp_flag
|
||||||
|
fin
|
||||||
|
end
|
||||||
|
def _pset_(a)#0
|
||||||
|
*(heapalloc(2)) = a
|
||||||
|
end
|
||||||
|
def _var_(a)#0
|
||||||
|
_create_
|
||||||
|
*(_cfa_(vlist)) = @_dovar_
|
||||||
|
*(heapalloc(2)) = a
|
||||||
|
end
|
||||||
|
def _colon_#0
|
||||||
|
state = comp_flag
|
||||||
|
_create_
|
||||||
|
*(_cfa_(vlist)) = @_docolon_
|
||||||
|
end
|
||||||
|
def _semi_#0
|
||||||
|
if state == comp_flag
|
||||||
|
*(heapalloc(2)) = 0
|
||||||
|
state = 0
|
||||||
|
fin
|
||||||
|
end
|
||||||
|
def _immediate_#0
|
||||||
|
^vlist = ^vlist | imm_flag
|
||||||
|
end
|
||||||
def _forget_#0
|
def _forget_#0
|
||||||
word dentry
|
word dentry
|
||||||
|
|
||||||
@ -219,35 +315,69 @@ def _forget_#0
|
|||||||
fin
|
fin
|
||||||
end
|
end
|
||||||
def _bye_#0
|
def _bye_#0
|
||||||
exit = 1
|
state = state | exit_flag
|
||||||
|
end
|
||||||
|
def _show_#0
|
||||||
|
word dentry, pfa, w
|
||||||
|
char l, f
|
||||||
|
|
||||||
|
while ^inptr == ' '
|
||||||
|
inptr++
|
||||||
|
loop
|
||||||
|
if ^inptr > ' '
|
||||||
|
dentry = find
|
||||||
|
if dentry
|
||||||
|
pfa = _pfa_(dentry)
|
||||||
|
w = *pfa
|
||||||
|
while w
|
||||||
|
f = ^w
|
||||||
|
l = f & len_mask
|
||||||
|
^w = l
|
||||||
|
puts(" "); puts(w); putln
|
||||||
|
^w = f
|
||||||
|
pfa = pfa + 2
|
||||||
|
w = *pfa
|
||||||
|
loop
|
||||||
|
fin
|
||||||
|
fin
|
||||||
end
|
end
|
||||||
def _vlist_#0
|
def _vlist_#0
|
||||||
word d
|
word d
|
||||||
|
char f, l
|
||||||
|
|
||||||
d = vlist
|
d = vlist
|
||||||
while d
|
while d
|
||||||
|
f = ^d
|
||||||
|
l = f & len_mask
|
||||||
|
^d = l
|
||||||
puts(d); puts(" ")
|
puts(d); puts(" ")
|
||||||
d = *(d + ^d + 1)
|
^d = f
|
||||||
|
d = *(d + l + 1)
|
||||||
loop
|
loop
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
// Quit and look for user input
|
// Quit and look for user input
|
||||||
//
|
//
|
||||||
def _quit_#0
|
def _quit_#0
|
||||||
word dentry, cfa, __drop, __isnum
|
word dentry, __drop, __isnum, __pset
|
||||||
|
|
||||||
__drop = @_drop_
|
__drop = @_drop_
|
||||||
__isnum = @isnum
|
__isnum = @isnum
|
||||||
|
__pset = @_pset_
|
||||||
|
//
|
||||||
|
// Set flags on words
|
||||||
|
//
|
||||||
|
d_semi = d_semi | imm_flag
|
||||||
repeat
|
repeat
|
||||||
puts("\nOK")
|
puts(" OK")
|
||||||
inptr = gets(':'|$80)
|
inptr = gets('\n'|$80)
|
||||||
if ^inptr
|
if ^inptr
|
||||||
^(inptr + ^inptr + 1) = 0
|
^(inptr + ^inptr + 1) = 0
|
||||||
//
|
//
|
||||||
// Clear high bit of input buffer
|
// Clear high bit of input buffer
|
||||||
//
|
//
|
||||||
for cfa = 1 to ^inptr
|
for dentry = 1 to ^inptr
|
||||||
^(inptr + cfa) = ^(inptr + cfa) & $7F
|
^(inptr + dentry) = ^(inptr + dentry) & $7F
|
||||||
next
|
next
|
||||||
inptr++
|
inptr++
|
||||||
repeat
|
repeat
|
||||||
@ -257,16 +387,29 @@ def _quit_#0
|
|||||||
if ^inptr > ' '
|
if ^inptr > ' '
|
||||||
dentry = find
|
dentry = find
|
||||||
if dentry
|
if dentry
|
||||||
exec(_cfa_(dentry))
|
if (not state & comp_flag) or (^dentry & imm_flag)
|
||||||
|
exec(dentry)
|
||||||
|
else
|
||||||
|
//puts("Compile "); puts(dentry); putln
|
||||||
|
_pset_(dentry)
|
||||||
|
fin
|
||||||
elsif not __isnum()#1
|
elsif not __isnum()#1
|
||||||
__drop()#0
|
__drop()#0
|
||||||
puts("? No match\n")
|
puts("? No match\n")
|
||||||
^inptr = 0
|
^inptr = 0
|
||||||
|
if state // Undo compilation state
|
||||||
|
heaprelease(vlist)
|
||||||
|
vlist = *_lfa_(vlist)
|
||||||
|
state = 0
|
||||||
|
fin
|
||||||
|
elsif state & comp_flag
|
||||||
|
_pset_(@d_lit)
|
||||||
|
__pset()#0 // Poke literal value into PFA
|
||||||
fin
|
fin
|
||||||
fin
|
fin
|
||||||
until ^inptr < ' '
|
until ^inptr < ' '
|
||||||
fin
|
fin
|
||||||
until exit
|
until state & exit_flag
|
||||||
end
|
end
|
||||||
_quit_
|
_quit_
|
||||||
done
|
done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user