diff --git a/.gitignore b/.gitignore index 100c169..8c4319b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ lib/stdlib.s tests/*.s examples/*.s !runtime.s -!stdlibwrap.s *.o *.exe *.bin diff --git a/lib/float32.s b/lib/float32.s index 880eaff..4b0ad9c 100644 --- a/lib/float32.s +++ b/lib/float32.s @@ -1051,16 +1051,3 @@ FLOAT32_ERR_TRUNC: .BYTE "integer overflow",0 FLOAT32_ERR_DIVZ: .BYTE "float division by zero",0 - -%export _ADDFLOAT32 -%export _CMPFLOAT32 -%export _CMPINTFLOAT32 -%export _DIVFLOAT32 -%export _FRACTFLOAT32 -%export _GETFLOAT32EXP -%export _INTFLOAT32 -%export _INTTOFLOAT32 -%export _MULFLOAT32 -%export _NEGFLOAT32 -%export _SUBFLOAT32 -%export _TRUNCFLOAT32 diff --git a/lib/runtime.s b/lib/runtime.s index f4ad875..e7c43ce 100644 --- a/lib/runtime.s +++ b/lib/runtime.s @@ -387,7 +387,7 @@ READCHANW_XT: ; --- check if a string is already initialized ; parameters: addr -; returns: 1 if it is initialized, 0 otherwise +; returns: 1 if it is initialied, 0 otherwise _STRINGISINITED: LOADI.S1.X2Y ; load length field, keep addr CBRANCH.NZ STRIN_XT1 ; if not zero, it is already inited @@ -1616,7 +1616,7 @@ MEM_FREE_XT: ; Since the return stack is no longer valid afterwards, directly ; jumps to _MAIN instead of using RET. -; parameters: [ _MAIN entry point, start of heap address ] +; parameters: [ start of heap address ] _MEM_INIT: ; initialize anchor chunk with start of heap address ; and heap size - header size @@ -1663,9 +1663,7 @@ _MEM_INIT: LOADCP _MEM_FREE ; add chunk to free list CALL - ; get address of _MAIN from program header - LOADCP _MAIN_PTR - LOADI + LOADCP _MAIN JUMP ; allocate a string with MEM_ALLOC. @@ -1939,35 +1937,3 @@ NEWLINESTR: .BYTE 13,10 .CPOOL - -%export _APPENDSTRING -%export _ARRAYTOSET -%export _BOUNDSCHECK -%export _CHARTOSTRING -%export _CHECK_ALLOC -%export _CLEARBIT -%export _CLEARMEM -%export _CMPSTRING -%export _CMPSTRINGL -%export _CMPWORDS -%export _COPYSTRING -%export _COPYWORDS -%export _ENUMCHECK -%export _INDEXSTRING -%export _INITSTRING -%export _INITSTRINGF -%export _INITSTRINGFROM -%export _ISCHARINSTRING -%export _ISINTINARRAY -%export _MEM_ALLOC -%export _MEM_INIT -%export _MEM_FREE -%export _RANGECHECK -%export _RUNTIME_ERR -%export _SETBIT -%export _SETSTRINGCHAR -%export _SETSTRINGLENGTH -%export _STRINGTOCHAR -%export _STRING_ALLOC -%export _TESTBIT -%export MEM_DUMP diff --git a/lib/stdlibwrap.s b/lib/stdlibwrap.s deleted file mode 100644 index 4a4269c..0000000 --- a/lib/stdlibwrap.s +++ /dev/null @@ -1,11 +0,0 @@ - - .ORG 24576 + 32 - .EQU _HEAP_SZ_PTR 24576 + 4 - .EQU _STACK_SZ_PTR 24576 + 8 - .EQU _MAIN_PTR 24576 + 12 - - %include "coreloader.lsym" - %include "runtime.s" - %include "float32.s" - %include "stdlib.s" -_MAIN: diff --git a/pcomp/emit.pas b/pcomp/emit.pas index 2ede4f0..ed9fa33 100644 --- a/pcomp/emit.pas +++ b/pcomp/emit.pas @@ -86,12 +86,6 @@ begin countIns(1); end; -procedure emitInclude(s:string); -begin - writeln(outfile, '%include "',s,'"'); - emitIns('.CPOOL'); -end; - procedure emitPrologue; begin writeln(outfile, #9, '.ORG ', startAddress); @@ -101,21 +95,12 @@ begin emitIns2Int('.WORD', defaultHeapSize); emitLabelRaw('_STACK_SZ_PTR'); emitIns2Int('.WORD', defaultStackSize); - emitLabelRaw('_MAIN_PTR'); - emitIns2('.WORD', '_MAIN'); + emitIns2Int('.WORD', 0); emitIns2('LOADCP','_END'); (* end of program is start of heap *) emitIns2('LOADCP', '_MEM_INIT'); (* MEM_INIT initializes heap and sets FP/RP *) (* since RP is not initialized yet, we cannot use CALL and MEM_INIT jumps to _MAIN after it is done *) emitIns('JUMP'); - emitIns2('BRANCH','@+2'); (* NOP, to make alignment explicit *) - emitIns('.CPOOL'); (* header/prologue + 2 constants is 32 bytes *) - - if useStdlib then - begin - writeln(outfile, '%include "stdlib.lsym"'); - writeln(outfile, '%incbin "stdlib.lib"'); - end; end; function bytes2words(size:integer):integer; @@ -289,6 +274,12 @@ begin end; end; +procedure emitInclude(s:string); +begin + writeln(outfile, '%include "',s,'"'); + emitIns('.CPOOL'); +end; + procedure emitUnitEpilogue; begin emitIns('.CPOOL'); @@ -316,6 +307,10 @@ begin else emitInclude('coreloader.lsym'); + emitInclude('float32.lib'); + emitInclude('runtime.lib'); + emitInclude('stdlib.lib'); + rewindStringList(usedUnits); while nextStringListItem(usedUnits, unitName) do emitInclude(unitName + UnitSuffix2); diff --git a/pcomp/shortgen.pas b/pcomp/libgen.pas similarity index 100% rename from pcomp/shortgen.pas rename to pcomp/libgen.pas diff --git a/pcomp/lsymgen.pas b/pcomp/lsymgen.pas index e120ca6..619129e 100644 --- a/pcomp/lsymgen.pas +++ b/pcomp/lsymgen.pas @@ -9,8 +9,7 @@ var outfile:TextFile; infile:TextFile; lineno:integer; - infilePath,outfilePath:string; - + procedure errorExit2(reason:string;arg:string); forward; {$I 'platfile+.pas'} @@ -79,17 +78,6 @@ begin clean := (not strcontains( name, '_')) and (name[1] <> '='); end; -procedure removeLeadingZeroes(var s:string); -begin - while length(s) > 1 do - begin - if s[1] = '0' then - delete(s,1,1) - else - break; - end; -end; - procedure processFile(inpath,outpath:string); var line:string; addr,name:string; @@ -106,8 +94,6 @@ begin begin readln(infile, line); splitLine(line, addr, name, clean); - removeLeadingZeroes(addr); - if clean then writeln(outfile, #9, '.EQU ', name, ' $', addr); end; @@ -118,13 +104,7 @@ end; begin if ParamCount > 0 then begin - infilePath := ParamStr(1); - outfilePath := getOutfileName(infilePath); - - if ParamCount > 1 then - outfilePath := ParamStr(2); - - processFile(infilePath, outfilePath); + processFile(ParamStr(1), getOutfileName(ParamStr(1))); end else writeln('No file name given.'); diff --git a/pcomp/make.bat b/pcomp/make.bat index 5cf30e9..40e8eee 100644 --- a/pcomp/make.bat +++ b/pcomp/make.bat @@ -9,10 +9,9 @@ fpc -gl lsymgen.pas sasm ..\lib\coreloader.s lsymgen ..\lib\coreloader.sym py pcomp.py -n ..\lib\stdlib.pas -sasm ..\lib\stdlibwrap.s ..\lib\stdlib.lib -lsymgen ..\lib\stdlibwrap.sym ..\lib\stdlib.lsym - -rem exit /b +libgen ..\lib\stdlib.s +libgen ..\lib\runtime.s +libgen ..\lib\float32.s py pcomp.py sasm.pas py pcomp.py pcomp.pas diff --git a/pcomp/sasm.pas b/pcomp/sasm.pas index ab5230b..077eebc 100644 --- a/pcomp/sasm.pas +++ b/pcomp/sasm.pas @@ -372,17 +372,12 @@ procedure printPassNo; begin write('P', pass, ' '); end; -procedure printFilename(var f:string); -begin - write(#13); - printPassNo; - write(f); -end; procedure printCurrentLineno; begin - printFilename(filename); - write(' ', lineno); + write(#13); + printPassNo; + write(filename, ' ', lineno); ClrEol; end; @@ -2046,23 +2041,17 @@ begin errorExit2('Unrecognized directive', lastToken.tokenText); end; -procedure readImage(filename:string); +procedure readImage(filename:string;size:integer); var f:InputFileType; c:char; i:integer; - size:integer; begin - printFilename(filename); - ClrEol; - - openFileWithDefault(f, filename); - size := filesize(f); - pc := pc + size; bytesCount := bytesCount + size; if pass = 2 then begin + openFileWithDefault(f, filename); for i := 1 to size do begin @@ -2070,16 +2059,14 @@ begin write(outfile,c); end; + close(f); end; - - close(f); - - printCurrentLineno; end; procedure parseMetaDirective; var filename:string; sym:TreeDataRef; + size:integer; begin readNextToken; if lastToken.tokenText = '%INCLUDE' then @@ -2112,7 +2099,8 @@ begin begin filename := curToken.tokenText; readNextToken; - readImage(filename); + size := parseExpression; + readImage(filename, size); end else errorExit2('Invalid meta directive', lastToken.tokenText); diff --git a/utils/tdrimg.py b/utils/tdrimg.py index 38308ff..bb380ca 100644 --- a/utils/tdrimg.py +++ b/utils/tdrimg.py @@ -457,13 +457,15 @@ def create_image_with_stuff(): slotnr = putfile("../lib/coreloader.lsym", "coreloader.lsym", f, part, partstart, slotnr) slotnr = putfile("../lib/coreloader.prog", "coreloader.prog", f, part, partstart, slotnr) + slotnr = putfile("../lib/float32.lib", "float32.lib", f, part, partstart, slotnr) + slotnr = putfile("../lib/runtime.lib", "runtime.lib", f, part, partstart, slotnr) slotnr = putfile("../lib/stdlib.lib", None, f, part, partstart, slotnr) slotnr = putfile("../lib/stdlib.inc", None, f, part, partstart, slotnr) - slotnr = putfile("../lib/stdlib.lsym", None, f, part, partstart, slotnr) slotnr = putfile("../pcomp/sasm.prog", None , f, part, partstart, slotnr) slotnr = putfile("../pcomp/pcomp.prog", None , f, part, partstart, slotnr) slotnr = putfile("../pcomp/lsymgen.prog", None , f, part, partstart, slotnr) + slotnr = putfile("../pcomp/libgen.prog", None , f, part, partstart, slotnr) slotnr = putfile("../progs/reclaim.prog", None , f, part, partstart, slotnr) slotnr = putfile("../progs/dumpdir.prog", None , f, part, partstart, slotnr)