1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-22 16:32:32 +00:00

Linkeage to PLASMA symbol table

This commit is contained in:
David Schmenk 2023-12-28 12:58:35 -08:00
parent a7c7cf9e19
commit 677869ed4c
7 changed files with 138 additions and 65 deletions

View File

@ -2,7 +2,7 @@ import cmdsys
//
// Useful values for everyone
//
const _SYSVER_ = $0200 // Version built against
const _SYSVER_ = $0201 // Version built against
const FALSE = 0
const TRUE = not FALSE
const NULL = 0
@ -54,8 +54,9 @@ import cmdsys
byte syserr
byte jitcount
byte jitsize
byte refcons // Apple /// specific
byte devcons // Apple /// specific
byte refcons // Apple /// specific
byte devcons // Apple /// specific
word lookupsym
end
//
// CMD exported functions

View File

@ -51,6 +51,7 @@ cp ../sysfiles/FP6502.CODE#060000 prodos/sys/FP6502.CODE.BIN
cp ../sysfiles/ELEMS.CODE#060000 prodos/sys/ELEMS.CODE.BIN
cp rel/apple/SOS#FE1000 prodos/sys/SOS.REL
cp rel/apple/GRAFIX#FE1000 prodos/sys/GRAFIX.REL
cp rel/PLFORTH#FE1000 prodos/sys/PLFORTH.REL
rm -rf prodos/syspro
mkdir prodos/syspro
@ -94,6 +95,7 @@ cp rel/apple/JITUNE#FE1000 prodos/syspro/sys/JITUNE.REL
cp rel/apple/ZIPCHIP#FE1000 prodos/syspro/sys/ZIPCHIP.REL
cp rel/LZ4#FE1000 prodos/syspro/sys/LZ4.REL
cp rel/INT32#FE1000 prodos/syspro/sys/INT32.REL
cp rel/PLFORTH#FE1000 prodos/syspro/sys/PLFORTH.REL
rm -rf prodos/sysinet
mkdir prodos/sysinet
@ -176,7 +178,6 @@ rm -rf prodos/bld
mkdir prodos/bld
cp rel/PLASM#FE1000 prodos/bld/PLASM.REL
cp rel/CODEOPT#FE1000 prodos/bld/CODEOPT.REL
cp rel/PLFORTH#FE1000 prodos/bld/PLFORTH.REL
mkdir prodos/bld/samples
cp samplesrc/hello.pla prodos/bld/samples/HELLO.PLA.TXT

View File

@ -39,8 +39,8 @@ predef _begin_#0, _again_#0, _until_#0, _while_#0, _repeat_#0
predef _do_#0, _doloop_#0, _doplusloop_(a)#0, _plusloop_#0, _loop_#0, _leave_#0, _j_#1
predef _create_#0, _builds_#0, _dodoes_#0, _filldoes_#0, _does_#0
predef pfillw(a)#0, pfillb(a)#0, _colon_#0, _semi_#0
predef _tors_(a)#0, _fromrs_#1, _toprs_#1
predef _cmove_(a,b,c)#0, _move_(a,b,c)#0, _fill_(a,b,c)#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_#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 _vlist_#0, _tron_#0, _troff_#0, _itc_#0, _pbc_#0
@ -167,10 +167,14 @@ word = @d_wplusset, @_cget_, $60
char d_wget = "@"
byte = inline_flag
word = @d_cget, @_wget_, $62
// EXECUTE
char d_execute = "EXECUTE"
byte = inline_flag
word = @d_wget, @_execute_, $56 // ICAL
// TO RSTACK
char d_torstk = ">R"
byte = 0
word = @d_wget, @_tors_, 0
word = @d_execute, @_tors_, 0
// FROM RSTACK
char d_fromrstk = "R>"
byte = 0
@ -179,10 +183,18 @@ word = @d_torstk, @_fromrs_, 0
char d_toprstk = "R@"
byte = 0
word = @d_fromrstk, @_toprs_, 0
// PLASMA SYMBOL LOOKUP
char d_lookup = "LOOKUP"
byte = 0
word = @d_toprstk, @_lookup_, 0
// PLASMA LINKEAGE
char d_plasma = "PLASMA"
byte = 0
word = @d_lookup, @_plasma_, 0
// VARIABLE
char d_var = "VARIABLE"
byte = 0
word = @d_toprstk, @_var_, 0
word = @d_plasma, @_var_, 0
// CONSTANT
char d_const = "CONSTANT"
byte = 0
@ -190,7 +202,7 @@ word = @d_var, @_const_, 0
// CMOVE
char d_cmove = "CMOVE"
byte = 0
word = @d_var, @_cmove_, 0
word = @d_const, @_cmove_, 0
// MOVE
char d_move = "MOVE"
byte = 0
@ -908,6 +920,9 @@ end
def _wget_(a)#1
return *a
end
def _execute_(a)#0
a()#0
end
def _ffa_(dentry)#1
return dentry + ^dentry + 1
end
@ -970,7 +985,7 @@ def _create_#0
_abort_
fin
namechars, namelen = toknext
plist = vlist
plist = vlist
vlist = heapmark
^vlist = namelen
bldptr = vlist + 1
@ -988,10 +1003,48 @@ def _create_#0
*bldptr = bldptr + 2; // Code ptr linked to PFA
heapalloc(bldptr - vlist + 2)
end
def _var_(a)#0
byte ss
def stodci(str, dci)
byte len, c
ss = state
len = ^str
if len == 0
^dci = 0
return dci
fin
c = toupper(^(str + len)) & $7F
len--
^(dci + len) = c
while len
c = toupper(^(str + len)) | $80
len--
^(dci + len) = c
loop
return dci
end
def _lookup_#1
word symname
char symlen, dci[31]
symname, symlen = toknext
symname--
^symname = symlen
return cmdsys:lookupsym(stodci(symname, @dci))
end
def _plasma_#0
word addr
char dci[31]
_create_
addr = cmdsys:lookupsym(stodci(vlist, @dci))
if not addr
puts("PLASMA symbol "); puts(vlist); puts(" not found\n")
_abort_
fin
^(_ffa_(vlist)) = 0 // Always compiled
*(_cfa_(vlist)) = addr // Symbol address
state = state & ~comp_flag
end
def _var_(a)#0
_create_
^(_ffa_(vlist)) = 0 // Always compiled
pfillb(^(@divmod)) // Hack - get VM entry vector from divmod
@ -1000,12 +1053,9 @@ def _var_(a)#0
pfillw(heapmark + 3)
pfillb($5C) // RET
pfillw(a) // Variable storage
state = ss
state = state & ~comp_flag
end
def _const_(a)#0
byte ss
ss = state
_create_
^(_ffa_(vlist)) = 0 // Always compiled
pfillb(^(@divmod)) // Hack - get VM entry vector from divmod
@ -1013,7 +1063,7 @@ def _const_(a)#0
pfillb($2C) // CONSTANT WORD
pfillw(a)
pfillb($5C) // RET
state = ss
state = state & ~comp_flag
end
def _docolon_#0
execwords(W + 2) // Exec PFA
@ -1475,6 +1525,10 @@ def _bye_#0
end
puts("PLFORTH WIP\n")
if cmdsys:sysver < $0201
puts("PLASMA >= 2.01 required\n")
return
fin
startheap = heapmark
_estkl = ^(@syscall + 1) // Hack to fill in parameter stack locations
_estkh = ^(@syscall + 3)

View File

@ -34,16 +34,19 @@ predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr)#1,
predef memset(addr,value,size)#0, memcpy(dst,src,size)#0, strcpy(dst,src)#1, strcat(dst,src)#1
predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2
predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buff, len)#1, write(refnum, buff, len)#1
predef lookuptbl(str)#1
//
// Exported CMDSYS table
//
word version = $0200 // 02.00 Dev
word version = $0201 // 02.01 Dev
word syspath
word syscmdln
word = @execmod, @open, @close, @read, @write
byte perr
byte jitcount = 0
byte jitsize = 0
word = symtbl // Different between Apple II and ///
word = @lookuptbl //
//
// Working input buffer overlayed with strings table
//
@ -576,29 +579,29 @@ end
//
// Lookup routines.
//
//def lookuptbl(dci, tbl)
// word match
// while ^tbl
//def lookuptbl(dci)
// word match, tbl
// sym = symtbl
// while ^sym
// match = dci
// while ^tbl == ^match
// if !(^tbl & $80)
// while ^sym == ^match
// if !(^sym & $80)
// return (tbl):1
// fin
// tbl = tbl + 1
// match = match + 1
// tbl++
// match++
// loop
// while (^tbl & $80)
// tbl = tbl + 1
// while (^sym & $80)
// sym = sym + 1
// loop
// tbl = tbl + 3
// sym = sym + 3
// loop
// return 0
asm lookuptbl(dci, tbl)#1
LDA ESTKL,X
asm lookuptbl(dci)#1
LDA #$00 ; SYMBOL TABLE
STA DSTL
LDA ESTKH,X
LDA #$0C
STA DSTH
INX
LDA ESTKL,X
STA SRCL
LDA ESTKH,X
@ -948,7 +951,7 @@ def lookupextern(esd, index)#1
byte str[33]
sym = lookupidx(esd, index)
if sym
addr = lookuptbl(sym, symtbl)
addr = lookuptbl(sym)
if !addr
perr = $81
dcitos(sym, @str)
@ -1012,7 +1015,7 @@ def loadmod(mod)#1
// Load module dependencies.
//
while ^moddep
if !lookuptbl(moddep, symtbl)
if !lookuptbl(moddep)
close(refnum)
refnum = 0
if loadmod(moddep) < 0
@ -1345,8 +1348,8 @@ def docmds#0
break
is '+'
//
// Exec module
//
// Exec module
//
execmod(striptrail(getlnbuf))
//
// Clean up
@ -1359,7 +1362,7 @@ def docmds#0
if perr
prstr("ERR:$")
prbyte(perr)
crout()
crout()
fin
fin
prstr(pfxop(prefix, GET_PFX))

View File

@ -52,16 +52,20 @@ predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr)#1,
predef memset(addr,value,size)#0, memcpy(dst,src,size)#0, strcpy(dst,src)#1, strcat(dst,src)#1
predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2
predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buf, len)#1
predef lookuptbl(dci)#1
//
// Exported CMDSYS table
//
word version = $0200 // 02.00 Dev
word version = $0201 // 02.01 Dev
word syspath
word syscmdln
word = @execmod, @open, @close, @read, 0 // Mark write() as NULL
byte perr
byte jitcount = 0
byte jitsize = 0
word = symtbl // Different between Apple II and ///
word = @lookuptbl //
//
// Working input buffer overlayed with strings table
//
@ -596,29 +600,29 @@ end
//
// Lookup routines.
//
//def lookuptbl(dci, tbl)
// word match
// while ^tbl
//def lookuptbl(dci)
// word match, tbl
// sym = symtbl
// while ^sym
// match = dci
// while ^tbl == ^match
// if !(^tbl & $80)
// while ^sym == ^match
// if !(^sym & $80)
// return (tbl):1
// fin
// tbl = tbl + 1
// match = match + 1
// tbl++
// match++
// loop
// while (^tbl & $80)
// tbl = tbl + 1
// while (^sym & $80)
// sym = sym + 1
// loop
// tbl = tbl + 3
// sym = sym + 3
// loop
// return 0
asm lookuptbl(dci, tbl)#1
LDA ESTKL,X
asm lookuptbl(dci)#1
LDA #$00 ; SYMBOL TABLE
STA DSTL
LDA ESTKH,X
LDA #$0C
STA DSTH
INX
LDA ESTKL,X
STA SRCL
LDA ESTKH,X
@ -990,7 +994,7 @@ def lookupextern(esd, index)#1
byte str[33]
sym = lookupidx(esd, index)
if sym
addr = lookuptbl(sym, symtbl)
addr = lookuptbl(sym)
if !addr
perr = $81
dcitos(sym, @str)
@ -1068,7 +1072,7 @@ def loadmod(mod)#1
// Load module dependencies.
//
while ^moddep
if !lookuptbl(moddep, symtbl)
if !lookuptbl(moddep)
close(refnum)
refnum = 0
if loadmod(moddep) < 0
@ -1414,13 +1418,13 @@ def docmds#0
execsys(getlnbuf)
break
is '+'
//
// Set JIT code pointer
//
*jitcodeptr = jitcbuf
//
// Exec module
//
//
// Set JIT code pointer
//
*jitcodeptr = jitcbuf
//
// Exec module
//
execmod(striptrail(getlnbuf))
//
// Clean up
@ -1433,7 +1437,7 @@ def docmds#0
if perr
prstr("ERR:$")
prbyte(perr)
crout()
crout()
fin
fin
prstr(pfxop(prefix, GET_PFX))

View File

@ -41,10 +41,11 @@ predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), re
predef memset(addr,value,size)#0, memcpy(dst,src,size)#0
predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2
predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buff, len)#1, write(refnum, buff, len)#1
predef syslookuptbl(dci)#1
//
// Exported CMDSYS table
//
word version = $0200 // 02.00
word version = $0201 // 02.01 Dev
word syspath
word cmdlnptr
word = @execmod, @open, @close, @read, @write
@ -53,6 +54,7 @@ byte jitcount = 0 // Keep these here for compatibility
byte jitsize = 0
byte refcons = 0
byte devcons = 0
word = @syslookuptbl
//
// String pool.
//
@ -784,6 +786,9 @@ RLDEX INX
STA ESTKH+2,X
RTS
end
def syslookuptbl(dci)#1
return lookuptbl(dci, symtbl)
end
//
// SOS routines
// FILE I/O

View File

@ -52,10 +52,11 @@ predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), re
predef memset(addr,value,size)#0, memcpy(dst,src,size)#0
predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2
predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buff, len)#1, write(refnum, buff, len)#1
predef syslookuptbl(dci)#1
//
// Exported CMDSYS table
//
word version = $0200 // 02.00
word version = $0201 // 02.01 Dev
word syspath
word cmdlnptr
word = @execmod, @open, @close, @read, @write
@ -64,6 +65,7 @@ byte jitcount = 0
byte jitsize = 0
byte refcons = 0
byte devcons = 0
word = @syslookuptbl
//
// String pool.
//
@ -795,6 +797,9 @@ RLDEX INX
STA ESTKH+2,X
RTS
end
def syslookuptbl(dci)#1
return lookuptbl(dci, symtbl)
end
//
// SOS routines
// FILE I/O