1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-25 21:30:44 +00:00

Move flags into seperate field

This commit is contained in:
David Schmenk 2023-12-23 09:49:10 -08:00
parent 5de565ebb1
commit 59dbef75f1

@ -5,8 +5,9 @@ include "inc/cmdsys.plh"
//
// bytes usage
// ----- -----
// [1] name lenght and flags
// [1] name length and flags
// [1..31] name string
// [1] FFA (flag field address)
// [2] LFA (link field address)
// [2] CFA (code field address)
// [2] PFA (param field address)
@ -15,9 +16,9 @@ include "inc/cmdsys.plh"
//
// Mask and flags for dictionary entries
//
const len_mask = $1F
const imm_flag = $20
const hidden_flag = $80
const imm_flag = $20
const componly_flag = $40
const hidden_flag = $80
//
// Predefine instrinsics
//
@ -32,129 +33,171 @@ predef _var_(a)#0, _const_(a)#0,_lit_#1, _tick_#1, _forget_#0
predef _vlist_#0, _tron_#0, _troff_#0, _show_#0, _bye_#0, _abort_#0
// DROP
char d_drop = "DROP"
byte = 0
word = 0, @_drop_, 0
// SWAP
char d_swap = "SWAP"
byte = 0
word = @d_drop, @_swap_, 0
// DUP
char d_dup = "DUP"
byte = 0
word = @d_swap, @_dup_, 0
// OVER
word d_over = "OVER"
byte = 0
word = @d_dup, @_over_, 0
// ROT
word d_rot = "ROT"
byte = 0
word = @d_over, @_rot_, 0
// ADD
char d_add = "+"
byte = 0
word = @d_rot, @_add_, 0
// SUB
char d_sub = "-"
byte = 0
word = @d_add, @_sub_, 0
// MUL
char d_mul = "*"
byte = 0
word = @d_sub, @_mul_, 0
// DIV
char d_div = "/"
byte = 0
word = @d_mul, @_div_, 0
// CHAR SET
char d_cset = "C!"
byte = 0
word = @d_div, @_cset_, 0
// WORD SET
char d_wset = "!"
byte = 0
word = @d_cset, @_wset_, 0
// CHAR GET
char d_cget = "C@"
byte = 0
word = @d_wset, @_cget_, 0
// WORD SET
char d_wget = "@"
byte = 0
word = @d_cget, @_wget_, 0
// TO RSTACK
char d_torstk = ">R"
byte = 0
word = @d_wget, @_tors_, 0
// FROM RSTACK
char d_fromrstk = "R>"
byte = 0
word = @d_torstk, @_fromrs_, 0
// TOP OF RSTACK
char d_toprstk = "R@"
byte = 0
word = @d_fromrstk, @_toprs_, 0
// VARIABLE
char d_var = "VARIABLE"
byte = 0
word = @d_toprstk, @_var_, 0
// CONSTANT
char d_const = "CONSTANT"
byte = 0
word = @d_var, @_const_, 0
// HERE
char d_here = "HERE"
byte = 0
word = @d_const, @heapmark, 0
// ALLOT
char d_allot = "ALLOT"
byte = 0
word = @d_here, @heapalloc, 0
// BRANCH
char d_branch = "(BRANCH)"
byte = 0
word = @d_allot, @_branch_, 0
// BRANCH IF 0
char d_branch0 = "(BRANCH0)"
byte = 0
word = @d_branch, @_branch0_, 0
// IF
char d_if = "IF"
byte = imm_flag
word = @d_branch0, @_if_, 0
// ELSE
char d_else = "ELSE"
byte = imm_flag
word = @d_if, @_else_, 0
// THEN
char d_then = "THEN"
byte = imm_flag
word = @d_else, @_then_, 0
// FORGET
char d_forget = "FORGET"
byte = 0
word = @d_then, @_forget_, 0
// BUILDS
char d_builds = "<BUILDS"
byte = imm_flag
word = @d_forget, @_create_, 0
// FILL DOES COMPILE TIME
char d_filldoes = "FILLDOES"
byte = 0
word = @d_builds, @_filldoes_, 0
// DO DOES RUN TIME
char d_dodoes = "DODOES>"
byte = 0
word = @d_filldoes, @_dodoes_, 0
// DOES
char d_does = "DOES>"
byte = imm_flag
word = @d_dodoes, @_does_, 0
// COMMA
char d_comma = ","
byte = 0
word = @d_does, @_pset_, 0
// COLON
char d_colon = ":"
byte = 0
word = @d_comma, @_colon_, 0
// SEMI
char d_semi = ";"
byte = imm_flag
word = @d_colon, @_semi_, 0
// TICK
char d_tick = "'"
byte = 0
word = @d_semi, @_tick_, 0
// LITERAL
char d_lit = "LIT"
byte = 0
word = @d_tick, @_lit_, 0
// PRINT TOS
char d_prtos = "."
byte = 0
word = @d_lit, @puti, 0
// PRINT TOS HEX
char d_prtoshex = ".$"
byte = 0
word = @d_prtos, @puth, 0
// EXIT
// BYE
char d_bye = "BYE"
byte = 0
word = @d_prtoshex, @_bye_, 0
// SHOW DEFINITION
char d_show = "SHOW"
byte = 0
word = @d_bye, @_show_, 0
// TRACE ON
char d_tron = "TRON"
byte = 0
word = @d_show, @_tron_, 0
// TRACE OFF
char d_troff = "TROFF"
byte = 0
word = @d_tron, @_troff_, 0
// LIST VOCAB
char d_vlist = "VLIST"
byte = 0
word = @d_troff, @_vlist_, 0
//
// Internal variables
@ -170,9 +213,8 @@ word RSTACK[RSTK_SIZE]
//
// State flags
//
const comp_flag = $01
const build_flag = $02
const exit_flag = $80
const exit_flag = $01
const comp_flag = $02
char state = 0
char trace = 0
byte _reset_stacks = $A2, $FE // LDX #$FE
@ -232,24 +274,23 @@ end
//
def find(matchchars, matchlen)#1
word dentry
byte len, i
byte i
matchchars--
dentry = vlist
while dentry
len = ^dentry & len_mask
if len == matchlen
for i = 1 to len
if ^dentry == matchlen
for i = 1 to ^dentry
if ^(matchchars+i) <> ^(dentry+i)
break
fin
next
if i > len
if i > ^dentry
//puts("[Found name = "); puts(dentry); puts("]\n")
return dentry
fin
fin
dentry = *(dentry + len + 1)
dentry = *(dentry + ^dentry + 2)
loop
// Not found
return 0
@ -307,16 +348,12 @@ end
// Execute code in CFA
//
def execword(dentry)#0
char l
if ^$C000 == $83 // CTRL-C
^$C010 // Clear KB strobe
_abort_
fin
if trace
l = ^dentry
^dentry = l & len_mask
puts(": "); puts(dentry); putln
^dentry = l
fin
W = _cfa_(dentry)
(*W)()#0
@ -343,14 +380,12 @@ def _doconst_#1
return *(W + 2)
end
def _docolon_#0
//puts("DOCOLON:\n")
execwords(W + 2)
end
def _pushPFA_#1
return W + 2
end
def _dodoes_(words)#0
//puts("DODOES:\n")
(@_pushPFA_)()#0 // Stack hacks
execwords(words)
end
@ -396,23 +431,17 @@ end
def _wget_(a)#1
return *a
end
def _ffa_(dentry)#1
return dentry + ^dentry + 1
end
def _lfa_(dentry)#1
char l
l = ^dentry & len_mask
return dentry + l + 1
return dentry + ^dentry + 2
end
def _cfa_(dentry)#1
char l
l = ^dentry & len_mask
return dentry + l + 3
return dentry + ^dentry + 4
end
def _pfa_(dentry)#1
char l
l = ^dentry & len_mask
return dentry + l + 5
return dentry + ^dentry + 6
end
def _tors_(a)#0
RSP--
@ -449,7 +478,9 @@ def _create_#0
namechars++
namelen--
loop
*bldptr = plist;
^bldptr = 0 // Flags
bldptr++
*bldptr = plist; // Link ptr
bldptr = bldptr + 2
heapalloc(bldptr - vlist + 2)
end
@ -459,11 +490,11 @@ def _does_#0
// Build PLASMA bytecode routine
^(heapalloc(1)) = (@divmod)->0 // JSR INTERP
*(heapalloc(2)) = (@divmod)=>1
^(heapalloc(1)) = $2C // CONSTANT WORD
^(heapalloc(1)) = $2C // CONSTANT WORD
*(heapalloc(2)) = heapmark + 6
^(heapalloc(1)) = $54 // CALL _dodoes_
^(heapalloc(1)) = $54 // CALL _dodoes_
*(heapalloc(2)) = @_dodoes_
^(heapalloc(1)) = $5C // RET
^(heapalloc(1)) = $5C // RET
end
def _pset_(a)#0
*(heapalloc(2)) = a
@ -511,13 +542,11 @@ def _then_#0
*_fromrs_ = heapmark
end
def _semi_#0
if state == comp_flag
*(heapalloc(2)) = 0
state = 0
fin
*(heapalloc(2)) = 0
state = 0
end
def _immediate_#0
^vlist = ^vlist | imm_flag
^_ffa_(vlist) = ^_ffa_(vlist) | imm_flag
end
def _tick_#1
return find(toknext)
@ -535,7 +564,6 @@ def _bye_#0
end
def _show_#0
word dentry, pfa, w
char l, f
dentry = find(toknext)
if dentry
@ -546,11 +574,7 @@ def _show_#0
fin
w = *pfa
while w
f = ^w
l = f & len_mask
^w = l
puts(" "); puts(w); putln
^w = f
pfa = pfa + 2
w = *pfa
loop
@ -564,16 +588,11 @@ def _troff_#0
end
def _vlist_#0
word d
char f, l
d = vlist
while d
f = ^d
l = f & len_mask
^d = l
puts(d); puts(" ")
^d = f
d = *(d + l + 1)
d = *(d + ^d + 2)
loop
end
//
@ -609,16 +628,11 @@ def _quit_#0
//
// Set flags on words
//
d_semi = d_semi | imm_flag
d_does = d_does | imm_flag
d_if = d_if | imm_flag
d_else = d_else | imm_flag
d_then = d_then | imm_flag
repeat
inchars, inlen = toknext
dentry = find(inchars, inlen)
if dentry
if (not state & comp_flag) or (^dentry & imm_flag)
if (not state & comp_flag) or (^_ffa_(dentry) & imm_flag)
execword(dentry)
else
_pset_(dentry)