From 8c420dff752909b20669fc739c54f1cd00f25e67 Mon Sep 17 00:00:00 2001 From: slederer Date: Sat, 5 Jul 2025 00:05:44 +0200 Subject: [PATCH] changemem: program to change heap/stack size in program files --- pcomp/Makefile | 1 + pcomp/make.bat | 1 + progs/changemem.pas | 173 ++++++++++++++++++++++++++++++++++++++++++++ utils/tdrimg.py | 1 + 4 files changed, 176 insertions(+) create mode 100644 progs/changemem.pas diff --git a/pcomp/Makefile b/pcomp/Makefile index 4200997..6cace65 100644 --- a/pcomp/Makefile +++ b/pcomp/Makefile @@ -31,6 +31,7 @@ nativeprogs: nativecomp $(PCOMP) ../progs/partmgr.pas $(PCOMP) ../progs/xfer.pas $(PCOMP) ../progs/recover.pas + $(PCOMP) ../progs/changemem.pas $(SASM) ../lib/rommon.s $(SASM) -A ../lib/rommon.s ../lib/rom.mem diff --git a/pcomp/make.bat b/pcomp/make.bat index 0db1f59..564885d 100644 --- a/pcomp/make.bat +++ b/pcomp/make.bat @@ -28,6 +28,7 @@ py pcomp.py ..\progs\dumpdir.pas py pcomp.py ..\progs\partmgr.pas py pcomp.py ..\progs\xfer.pas py pcomp.py ..\progs\recover.pas +py pcomp.py ..\progs\changemem.pas sasm ..\lib\rommon.s sasm -A ..\lib\rommon.s ..\lib\rom.mem diff --git a/progs/changemem.pas b/progs/changemem.pas new file mode 100644 index 0000000..7c0bca8 --- /dev/null +++ b/progs/changemem.pas @@ -0,0 +1,173 @@ +program changemem; +const ProgramMagic = $00100AFE; +type ProgramHeader = record + magic:integer; + heapSize:integer; + stackSize:integer; + mainPtr:integer; + end; + +var filename:string; + h:ProgramHeader; + +procedure showHex(value:integer); +var i:integer; + digit:integer; + digits:array[1..8] of char; + ch:char; +begin + for i := 1 to 8 do + begin + digit := value and 15; + value := value shr 4; + + if digit < 10 then + ch := chr(digit + ord('0')) + else + ch := chr(digit - 10 + ord('A')); + digits[i] := ch; + end; + for i := 8 downto 1 do + write(digits[i]); +end; + +procedure showValue(labl:string; value:integer); +begin + write(labl:20, ' '); + write(value:8, ' ('); + showHex(value); + writeln(')'); +end; + +procedure showHeader(var h:ProgramHeader); +begin + showValue('heap size', h.heapSize); + showValue('stack size', h.stackSize); + showValue('main entry point', h.mainPtr); +end; + +procedure readHeader(var filename:string;var h:ProgramHeader); +var f:file; +begin + writeln('reading file ', filename); + open(f, filename, ModeReadOnly); + if IOResult(f) <> 0 then + begin + writeln('Error opening file: ', ErrorStr(IOResult(f))); + halt; + end + else + begin + read(f, h); + if IOResult(f) <> 0 then + begin + writeln('Error reading header: ', ErrorStr(IOResult(f))); + halt; + end; + close(f); + end; +end; + +procedure writeHeader(var filename:string;var h:ProgramHeader); +var f:file; +begin + writeln('writing file ', filename); + open(f, filename, ModeModify); + if IOResult(f) <> 0 then + begin + writeln('Error opening file: ', ErrorStr(IOResult(f))); + halt; + end + else + begin + write(f, h); + if IOResult(f) <> 0 then + begin + writeln('Error writing header: ', ErrorStr(IOResult(f))); + halt; + end; + close(f); + end; +end; + +procedure modifyHeader(var filename:string;var h:ProgramHeader); +var done:boolean; + ch:char; + changed:boolean; + + function getNewValue(descr:string):integer; + var buf:string; + v,e:integer; + begin + getNewValue := 0; + write('New ',descr, ' size (decimal)> '); + readln(buf); + val(buf, v, e); + if(e > 0 ) or (v <= 0) then + writeln('invalid size') + else + getNewValue := v; + end; + + procedure changeStackSize; + var v:integer; + begin + v := getNewValue('stack'); + if v > 0 then + begin + h.stackSize := v; + changed := true; + end; + end; + + procedure changeHeapSize; + var v:integer; + begin + v := getNewValue('heap'); + if v > 0 then + begin + h.heapSize := v; + changed := true; + end; + end; + +begin + changed := false; done := false; + + while not done do + begin + writeln(filename, ' header:'); + showHeader(h); + writeln('Change H)eap size Change S)tack size eX)it'); + write('> '); + read(ch); + writeln; + case upcase(ch) of + 'S': changeStackSize; + 'H': changeHeapSize; + 'X': done := true; + else + writeln('invalid command'); + end; + end; + + if changed then + writeHeader(filename, h); +end; + +begin + if ParamCount > 0 then + filename := ParamStr(1) + else + begin + write('File name> '); + readln(filename); + end; + + readHeader(filename, h); + + if h.magic <> ProgramMagic then + writeln('invalid magic value ', h.magic) + else + modifyHeader(filename, h); +end. diff --git a/utils/tdrimg.py b/utils/tdrimg.py index a120250..83f7e35 100644 --- a/utils/tdrimg.py +++ b/utils/tdrimg.py @@ -536,6 +536,7 @@ def create_image_with_stuff(imgfile): slotnr = putfile("../progs/editor.prog", None , f, part, partstart, slotnr) slotnr = putfile("../progs/xfer.prog", None , f, part, partstart, slotnr) slotnr = putfile("../progs/recover.prog", None , f, part, partstart, slotnr) + slotnr = putfile("../progs/changemem.prog", None , f, part, partstart, slotnr) listdir(f, part)