From 37ec26c450224c07f76321e1a50675e7bf5a3284 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Thu, 4 Jan 2018 20:25:00 -0800 Subject: [PATCH] External fixups workingm internal still broken --- src/samplesrc/sieve.pla | 12 +++---- src/toolsrc/codegen.pla | 72 ++++++++++++++++++++++------------------- src/toolsrc/codeseq.plh | 2 +- src/toolsrc/parse.pla | 2 +- src/toolsrc/plasm.pla | 3 +- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/src/samplesrc/sieve.pla b/src/samplesrc/sieve.pla index ad86c9b..eed1c77 100644 --- a/src/samplesrc/sieve.pla +++ b/src/samplesrc/sieve.pla @@ -3,10 +3,9 @@ include "inc/cmdsys.plh" const size = 8190 const sizepl = size+1 -byte flag[sizepl] +word flag byte iter word prime, i, k, count -byte strPrimes[] = " primes.\n" def beep#0 putc(7) @@ -14,14 +13,15 @@ end beep //for iter = 1 to 10 - memset(@flag, TRUE, sizepl) + flag = heapalloc(sizepl) + memset(flag, TRUE, sizepl) count = 0 for i = 0 to size - if flag[i] + if flag->[i] prime = i + i + 3 k = i + prime while k <= size - flag[k] = FALSE + flag->[k] = FALSE k = k + prime loop count = count + 1 @@ -32,5 +32,5 @@ beep //next beep puti(count) -puts(@strPrimes) +puts(" primes.\n") done diff --git a/src/toolsrc/codegen.pla b/src/toolsrc/codegen.pla index 0a3b9df..d56dc02 100644 --- a/src/toolsrc/codegen.pla +++ b/src/toolsrc/codegen.pla @@ -453,7 +453,6 @@ def add_idconst(namestr, len, value)#0 end def add_idfunc(namestr, len, type, tag, cfnparms, cfnvals)#0 add_idglobal(namestr, len, type|FUNC_TYPE, tag, cfnparms, cfnvals) - def_cnt++ end def set_idfunc(namestr, len, tag, cparms, cvals)#0 word idptr @@ -785,65 +784,65 @@ def writeheader(refnum) moddep = moddep + stodci(@moddep_tbl[moddep_cnt*16], moddep) loop ^moddep = 0 // Terminate dependency list - len = moddep + 1 - @header + len = moddep - 2 - @header modfix = len + MODADDR - codebuff header:0 = len + codeptr - codebuff // sizeof header+data+bytecode header:2 = $DA7F // Magic # header:4 = modsysflags // Module SYSFLAGS - header:6 = len + datasize // Byte code offset + header:6 = len + MODADDR + datasize // Byte code offset header:8 = def_cnt // DEFinition count header:10 = entrypoint + modfix // Init entrypoint - fileio:write(refnum, @header, len) + fileio:write(refnum, @header, len + 2) return modfix end // // Write DeFinition Directory // -def writeDFD(refnum, modfix)#0 - word dirptr, idptr, idcnt +def writeDFD(refnum, modofst)#0 + word dfd, idptr, idcnt byte defdir[128] - dirptr, idptr, idcnt = @defdir, idglobal_tbl, globals + dfd, idptr, idcnt = @defdir, idglobal_tbl, globals while idcnt if idptr=>idtype & FUNC_TYPE and not idptr=>idtype & EXTERN_TYPE - dirptr->0 = $02 - dirptr=>1 = tag_addr=>[idptr=>idval] + modfix - dirptr = dirptr + 4 + dfd->0 = $02 + dfd=>1 = tag_addr=>[idptr=>idval] + modofst + dfd = dfd + 4 fin idptr = idptr + idptr->idname + t_id idcnt-- loop - fileio:write(refnum, @defdir, dirptr - @defdir) + fileio:write(refnum, @defdir, dfd - @defdir) end // // Build External Symbol Directory on heap // def buildESD(modfix)#2 byte symnum - word dirptr, idptr, idcnt, dirlen + word modofst, esd, idptr, idcnt, len - symnum, dirptr, idptr, idcnt = 0, heapmark, idglobal_tbl, globals + symnum, esd, idptr, idcnt = 0, heapmark, idglobal_tbl, globals while idcnt if idptr=>idtype & EXPORT_TYPE - dirptr = dirptr + stodci(idptr=>idname, dirptr) - dirptr->0 = $08 - dirptr=>1 = tag_addr=>[idptr=>idval] + modfix - dirptr = dirptr + 3 + esd = esd + stodci(@idptr->idname, esd) + esd->0 = $08 + esd=>1 = tag_addr=>[idptr=>idval] + modfix + esd = esd + 3 elsif idptr=>idtype & EXTACCESS_TYPE - dirptr = dirptr + stodci(idptr=>idname, dirptr) - dirptr->0 = $10 - dirptr->1 = symnum - dirptr = dirptr + 3 + esd = esd + stodci(@idptr->idname, esd) + esd->0 = $10 + esd->1 = symnum + esd = esd + 3 idptr->extnum = symnum symnum++ fin idptr = idptr + idptr->idname + t_id idcnt-- loop - ^dirptr = 0 - dirlen = dirptr - heapmark + 1 - dirptr = heapalloc(dirlen) - return dirptr, dirlen + ^esd = 0 + len = esd - heapmark + 1 + esd = heapalloc(len) + return esd, len end // // Write ReLocation Directory @@ -862,16 +861,13 @@ def writeRLD(refnum, modfix)#0 if tag_type->[tag] & EXTERN_FIXUP idptr = idglobal_tbl for idcnt = globals-1 downto 0 - if idptr=>idtype & EXPORT_TYPE and idptr=>idval == tag + if idptr=>idtype & EXTERN_TYPE and idptr=>idval == tag rld->3 = idptr->extnum break fin next - else - updtptr = fixup_addr=>[fixups] - *updtptr = *updtptr + modfix fin - rld->0 = $01 | (tag & MASK_FIXUP) + rld->0 = $01 | (tag_type->[tag] & MASK_FIXUP) rld=>1 = fixup_addr=>[fixups] + modfix rld = rld + 4 next @@ -882,11 +878,21 @@ end // Write Extended REL file // def writemodule(refnum)#0 - word esd, esdlen, modfix + word esd, esdlen, modfix, modofst, fixups, updtptr // // Write module header // - modfix = writeheader(refnum) + modfix = writeheader(refnum) + modofst = modfix - MODADDR + // + // Adjust internal fixups for header size + // + for fixups = fixup_cnt-1 downto 0 + if not tag_type->[fixup_tag->[fixups]] & EXTERN_FIXUP + updtptr = fixup_addr=>[fixups] + *updtptr = *updtptr + modofst + fin + next // // Write data/code buffer // @@ -898,7 +904,7 @@ def writemodule(refnum)#0 // // Build EXERN/ENTRY directory // - esd, esdlen = buildESD(modfix) + esd, esdlen = buildESD(modofst) // // Write relocation directory // diff --git a/src/toolsrc/codeseq.plh b/src/toolsrc/codeseq.plh index c0e4a61..6cc4cf3 100644 --- a/src/toolsrc/codeseq.plh +++ b/src/toolsrc/codeseq.plh @@ -60,13 +60,13 @@ const SLW_CODE = $76 // const GLOBAL_GROUP = $04 const GADDR_CODE = $26 +const CALL_CODE = $54 const LAB_CODE = $68 const LAW_CODE = $6A const SAB_CODE = $78 const SAW_CODE = $7A const DAB_CODE = $7C const DAW_CODE = $7E -const CALL_CODE = $54 // // Relative address code group // diff --git a/src/toolsrc/parse.pla b/src/toolsrc/parse.pla index 5819b83..e7f86e6 100644 --- a/src/toolsrc/parse.pla +++ b/src/toolsrc/parse.pla @@ -1129,6 +1129,7 @@ def parse_defs fin if token == DEF_TKN if scan <> ID_TKN; exit_err(ERR_INVAL|ERR_ID); fin + def_cnt++ lambda_cnt = 0 cfnparms = 0 infuncvals = 1 @@ -1176,7 +1177,6 @@ def parse_defs next emit_leave fin - return TRUE while lambda_cnt lambda_cnt-- emit_lambdafunc(lambda_tag[lambda_cnt], lambda_cparms[lambda_cnt], lambda_seq[lambda_cnt]) diff --git a/src/toolsrc/plasm.pla b/src/toolsrc/plasm.pla index b2e5512..cc34422 100644 --- a/src/toolsrc/plasm.pla +++ b/src/toolsrc/plasm.pla @@ -136,7 +136,6 @@ const RELATIVE_FIXUP = $02 const MASK_FIXUP = $90 const WORD_FIXUP = $80 const BYTE_FIXUP = $00 -const SIZE_FIXUP = $80 const EXTERN_FIXUP = $10 // // Keywords @@ -248,7 +247,7 @@ byte locals, savelocals word codebuff, codeptr, entrypoint word modsysflags byte[16] moddep_tbl[8] -byte moddep_cnt, def_cnt +byte moddep_cnt, def_cnt = 1 predef emit_pending_seq#0 // // Module relocation base address