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:
parent
a7c7cf9e19
commit
677869ed4c
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user