refactor: namespace restructure of entire codebase
continuous-integration/drone/push Build is passing

Reorganize all source files into a hierarchical namespace structure
with dot-separated unit names matching directory paths.

Major changes:
- src/prog/ -> src/app/ (app.*.pas)
- src/fault/ -> src/arch/x86/fault/ (arch.x86.fault.*.pas)
- src/isr/ -> src/arch/x86/isr/ (arch.x86.isr.*.pas)
- src/include/ -> src/core/ (core.*.pas) + src/arch/x86/
- src/driver/ subtree reorganized with driver.* namespace prefixes
- src/driver/storage/con/ -> src/driver/storage/ctl/ (Windows reserved name fix)
- src/driver/storage/ split into con(ctl)/fs/vol/ subdirectories
- src/driver/net/ flattened from l1-l5 layers to driver.net.*.pas
- kernel.pas -> asuro.pas, faults.pas -> arch.x86.faults.pas
- stdio.pas/syslog.pas -> io/io.stdio.pas, io/io.syslog.pas
- processmanager.pas -> proc/proc.mgr.pas
- lmemorymanager.pas -> memory/memory.heap.pas
- Build scripts moved to toolchain/
- Added compat/ shims for lmemorymanager and types
- Added doc/namespace.md tracking the refactor

197 files changed, 6292 insertions(+), 5526 deletions(-)
This commit is contained in:
2026-03-08 01:28:31 +00:00
parent e922f086c2
commit 6fa008ed79
197 changed files with 6291 additions and 5525 deletions
+2 -2
View File
@@ -22,8 +22,8 @@ steps:
commands: commands:
- git fetch --tags - git fetch --tags
- find . -type f -print0 | xargs -0 dos2unix - find . -type f -print0 | xargs -0 dos2unix
- chmod +x /drone/src/*.sh - chmod +x /drone/src/toolchain/*.sh
- /drone/src/compile.sh - /drone/src/toolchain/compile.sh
- name: upload-iso-artifact - name: upload-iso-artifact
image: alpine/git image: alpine/git
+1 -2
View File
@@ -14,10 +14,9 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \ pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
rm -rf fpc-$FPC_VERSION.i386-linux rm -rf fpc-$FPC_VERSION.i386-linux
COPY compile.sh /compile.sh
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
RUN chmod +x /usr/bin/semver RUN chmod +x /usr/bin/semver
WORKDIR /code WORKDIR /code
RUN find . -type f -print0 | xargs -0 dos2unix RUN find . -type f -print0 | xargs -0 dos2unix
ENTRYPOINT ["/bin/bash", "-c"] ENTRYPOINT ["/bin/bash", "-c"]
CMD ["/compile.sh"] CMD ["find toolchain -name '*.sh' -exec dos2unix {} + 2>/dev/null; find toolchain -name '*.sh' -exec chmod +x {} +; bash toolchain/compile.sh"]
+75
View File
@@ -0,0 +1,75 @@
{ Compatibility shim: wasuro references the old unit name 'lmemorymanager'.
Since wasuro/ cannot be modified, this unit re-exports the public API of
memory.heap so that 'uses lmemorymanager' continues to compile. }
unit lmemorymanager;
interface
uses
memory.heap;
const
ALLOC_UNIT = memory.heap.ALLOC_UNIT;
DATA_OFFSET = memory.heap.DATA_OFFSET;
PAGE_SIZE_LMM = memory.heap.PAGE_SIZE_LMM;
TOTAL_UNITS = memory.heap.TOTAL_UNITS;
BITMAP_DWORDS = memory.heap.BITMAP_DWORDS;
SIZE_PREFIX = memory.heap.SIZE_PREFIX;
LARGE_ALLOC_MAGIC = memory.heap.LARGE_ALLOC_MAGIC;
type
PHeapPageHeader = memory.heap.PHeapPageHeader;
THeapPageHeader = memory.heap.THeapPageHeader;
procedure init;
function kalloc(size : uint32) : void;
function klalloc(size : uint32) : void;
procedure klfree(address : uint32);
function kpalloc(address : uint32) : void;
procedure kfree(area : void);
function lmm_total_free : uint32;
function lmm_page_count : uint32;
implementation
procedure init;
begin
memory.heap.init;
end;
function kalloc(size : uint32) : void; inline;
begin
kalloc := memory.heap.kalloc(size);
end;
function klalloc(size : uint32) : void; inline;
begin
klalloc := memory.heap.klalloc(size);
end;
procedure klfree(address : uint32); inline;
begin
memory.heap.klfree(address);
end;
function kpalloc(address : uint32) : void; inline;
begin
kpalloc := memory.heap.kpalloc(address);
end;
procedure kfree(area : void); inline;
begin
memory.heap.kfree(area);
end;
function lmm_total_free : uint32; inline;
begin
lmm_total_free := memory.heap.lmm_total_free;
end;
function lmm_page_count : uint32; inline;
begin
lmm_page_count := memory.heap.lmm_page_count;
end;
end.
+7
View File
@@ -0,0 +1,7 @@
unit types;
interface
implementation
end.
-8
View File
@@ -1,8 +0,0 @@
#!/usr/bin/env bash
echo " "
echo "======================="
echo " "
echo "Compiling Stub..."
echo " "
nasm -f elf src/stub/stub.asm -o lib/stub.o
nasm -f elf src/stub/splash_tga.asm -o lib/splash_tga.o
+646
View File
File diff suppressed because it is too large Load Diff
@@ -17,12 +17,12 @@
@author(Angus C <angus@actm.uk>) @author(Angus C <angus@actm.uk>)
} }
unit base64_prog; unit app.base64;
interface interface
uses uses
stdio, util, strings, tracer, base64, lmemorymanager; io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.base64, memory.heap;
procedure init(); procedure init();
@@ -38,7 +38,7 @@ var
PSize : uInt32; PSize : uInt32;
begin begin
tracer.push_trace('base64_prog.run'); debug.tracer.push_trace('base64_prog.run');
if paramCount(Params) > 1 then begin if paramCount(Params) > 1 then begin
encdec := getParam(0, Params); encdec := getParam(0, Params);
if stringEquals(encdec, 'encode') then begin if stringEquals(encdec, 'encode') then begin
@@ -58,23 +58,23 @@ begin
dec(pinput); dec(pinput);
pinput^ := #0; pinput^ := #0;
result := b64_encode_str(input); result := b64_encode_str(input);
stdio.bufWriteStrLn(stdout_buf, result); io.stdio.bufWriteStrLn(stdout_buf, result);
kfree(void(result)); kfree(void(result));
end else if stringEquals(encdec, 'decode') then begin end else if stringEquals(encdec, 'decode') then begin
input := getParam(1, Params); input := getParam(1, Params);
result := b64_decode_str(input); result := b64_decode_str(input);
stdio.bufWriteStrLn(stdout_buf, result); io.stdio.bufWriteStrLn(stdout_buf, result);
kfree(void(result)); kfree(void(result));
end else stdio.bufWriteStrLn(stderr_buf, 'Usage: base64 <encode/decode> <text>'); end else io.stdio.bufWriteStrLn(stderr_buf, 'Usage: core.enc.base64 <encode/decode> <text>');
end else begin end else begin
stdio.bufWriteStrLn(stderr_buf, 'Usage: base64 <encode/decode> <text>'); io.stdio.bufWriteStrLn(stderr_buf, 'Usage: core.enc.base64 <encode/decode> <text>');
end; end;
end; end;
procedure init(); procedure init();
begin begin
tracer.push_trace('base64_prog.init'); debug.tracer.push_trace('base64_prog.init');
stdio.registerCommand('BASE64', @Run, 'Perform Base64 Encode/Decode.'); io.stdio.registerCommand('BASE64', @Run, 'Perform Base64 Encode/Decode.');
end; end;
end. end.
@@ -17,12 +17,12 @@
@author(Kieron Morris <kjm@kieronmorris.me>) @author(Kieron Morris <kjm@kieronmorris.me>)
} }
unit dhclient; unit app.dhclient;
interface interface
uses uses
stdio, util, strings, tracer, dhcp; io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, driver.net.dhcp;
procedure init(); procedure init();
@@ -30,14 +30,14 @@ implementation
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf); procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
begin begin
tracer.push_trace('dhclient.run'); debug.tracer.push_trace('dhclient.run');
DHCPDiscover(); DHCPDiscover();
end; end;
procedure init(); procedure init();
begin begin
tracer.push_trace('dhclient.init'); debug.tracer.push_trace('dhclient.init');
stdio.registerCommand('DHClient', @Run, 'Run the DHCP configuration utility.'); io.stdio.registerCommand('DHClient', @Run, 'Run the DHCP configuration utility.');
end; end;
end. end.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -17,12 +17,12 @@
@author(Kieron Morris <kjm@kieronmorris.me>) @author(Kieron Morris <kjm@kieronmorris.me>)
} }
unit md5sum; unit app.md5sum;
interface interface
uses uses
stdio, util, strings, tracer, md5; io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.md5;
procedure init(); procedure init();
@@ -40,15 +40,15 @@ begin
wordlen:= stringSize(md5word); wordlen:= stringSize(md5word);
MD5_Hash := MD5Buffer(puint8(md5word), wordlen); MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
for i:=0 to 15 do begin for i:=0 to 15 do begin
stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]); io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
end; end;
stdio.bufWriteStrLn(stdout_buf, ' '); io.stdio.bufWriteStrLn(stdout_buf, ' ');
end; end;
procedure init(); procedure init();
begin begin
tracer.push_trace('md5sum.init'); debug.tracer.push_trace('md5sum.init');
stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.'); io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
end; end;
end. end.
+83
View File
@@ -0,0 +1,83 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Prog->app.meminfo - Print memory statistics (PMM / LMM).
@author(Kieron Morris <[email protected]>)
}
unit app.meminfo;
interface
uses
io.stdio, arch.x86.multiboot, arch.x86.memory.physical, memory.heap, debug.tracer;
procedure init();
implementation
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
var
pmm_total, pmm_free, pmm_used : uint32;
lmm_pages, lmm_free : uint32;
begin
{ Multiboot memory info }
io.stdio.bufWriteStrLn(stdout_buf, '--- Multiboot ---');
io.stdio.bufWriteStr(stdout_buf, 'Lower Memory : ');
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_lower);
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
io.stdio.bufWriteStr(stdout_buf, 'Upper Memory : ');
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_upper);
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
io.stdio.bufWriteStr(stdout_buf, 'Total Memory : ');
io.stdio.bufWriteInt(stdout_buf, ((multibootinfo^.mem_upper + 1000) div 1024) + 1);
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
{ PMM stats }
io.stdio.bufWriteStrLn(stdout_buf, '--- PMM (4 MB blocks) ---');
pmm_total := arch.x86.memory.physical.pmm_total_blocks;
pmm_free := arch.x86.memory.physical.pmm_free_blocks;
pmm_used := pmm_total - pmm_free;
io.stdio.bufWriteStr(stdout_buf, 'Total Blocks : ');
io.stdio.bufWriteIntLn(stdout_buf, pmm_total);
io.stdio.bufWriteStr(stdout_buf, 'Free Blocks : ');
io.stdio.bufWriteIntLn(stdout_buf, pmm_free);
io.stdio.bufWriteStr(stdout_buf, 'Used Blocks : ');
io.stdio.bufWriteIntLn(stdout_buf, pmm_used);
io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
io.stdio.bufWriteInt(stdout_buf, pmm_free * 4);
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
{ LMM heap stats }
io.stdio.bufWriteStrLn(stdout_buf, '--- LMM (Heap) ---');
lmm_pages := memory.heap.lmm_page_count;
lmm_free := memory.heap.lmm_total_free;
io.stdio.bufWriteStr(stdout_buf, 'Heap Pages : ');
io.stdio.bufWriteIntLn(stdout_buf, lmm_pages);
io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
io.stdio.bufWriteInt(stdout_buf, lmm_pages * 4);
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
io.stdio.bufWriteInt(stdout_buf, lmm_free div 1024);
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
end;
procedure init();
begin
debug.tracer.push_trace('meminfo.init');
io.stdio.registerCommand('MEMINFO', @Run, 'Print memory statistics (PMM/LMM).');
end;
end.
+86
View File
@@ -0,0 +1,86 @@
// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
ProgManager - Central initialization for terminal registered, baked-in programs.
@author(Kieron Morris <[email protected]>)
@author(Aaron Hance <[email protected]>)
}
unit app.mgr;
interface
uses
debug.tracer, io.stdio, proc.mgr,
//progs
app.base64, app.md5sum, app.dhclient, app.vbeinfo, app.testcmd, app.ping, app.meminfo, app.setres,
//drivers
driver.storage.ctl.ram, driver.mgr,
//network
driver.net.ipv4, driver.net.arp, driver.net.tcp,
//dispatch
driver.storage.filedispatch,
//wasm
app.wasm.runner;
{ Initialize all baked-in programs }
procedure init();
implementation
uses
core.version,
//command provider units
arch.x86.cpu,
app.diskcmd, driver.bus.usb.core, app.diskutil, app.notepad, app.partcmd, app.volcmd;
procedure init();
begin
debug.tracer.push_trace('app.mgr.init');
{ Register commands from provider units }
io.stdio.registerCommand('CPU', @arch.x86.cpu.Terminal_Command_CPU, 'CPU Info.');
io.stdio.registerCommand('DEV', @driver.mgr.terminal_command_dev, 'Driver Management Interface.');
io.stdio.registerCommand('PS', @proc.mgr.terminal_command_ps, 'List running processes.');
io.stdio.registerCommand('KILL', @proc.mgr.terminal_command_kill, 'Force-kill a process by PID.');
io.stdio.registerCommand('TERMINATE', @proc.mgr.terminal_command_terminate, 'Gracefully terminate a process by PID.');
io.stdio.registerCommand('ARP', @driver.net.arp.terminal_command_arp, 'Get ARP Table.');
io.stdio.registerCommand('IFCONFIG', @driver.net.ipv4.terminal_command_ifconfig, 'Configure Network Settings.');
io.stdio.registerCommand('TCPCONNECT', @driver.net.tcp.terminal_command_tcpconnect, 'Connect to a TCP host and send Hello World.');
io.stdio.registerCommand('TCPLISTEN', @driver.net.tcp.terminal_command_tcplisten, 'Listen on a TCP port and log received data.');
io.stdio.registerCommand('TCPHTTP', @driver.net.tcp.terminal_command_tcphttp, 'Send HTTP GET to a host IP (port 80 default).');
io.stdio.registerCommand('USB', @driver.bus.usb.core.terminal_command_usb, 'driver.bus.usb subsystem information.');
{ Initialize baked-in programs }
app.diskcmd.init();
app.partcmd.init();
app.volcmd.init();
app.diskutil.init();
app.notepad.init();
app.md5sum.init();
app.base64.init();
app.dhclient.init();
app.vbeinfo.init();
app.testcmd.init();
app.ping.init();
app.meminfo.init();
{ File dispatch & WASM integration }
driver.storage.ctl.ram.init();
driver.storage.filedispatch.init();
app.wasm.runner.init();
app.setres.init();
end;
end.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+21 -21
View File
@@ -3,28 +3,28 @@
Sends 10 ICMP echo requests to a host, printing round-trip time Sends 10 ICMP echo requests to a host, printing round-trip time
for each reply. Sleeps 1 second between pings. Each invocation for each reply. Sleeps 1 second between pings. Each invocation
uses a heap-allocated state record so multiple terminals can ping uses a heap-allocated state record so multiple terminals can app.ping
concurrently without corrupting each other. concurrently without corrupting each other.
@author(Kieron Morris <kjm@kieronmorris.me>) @author(Kieron Morris <kjm@kieronmorris.me>)
} }
unit ping; unit app.ping;
interface interface
uses uses
stdio, tracer; io.stdio, debug.tracer;
procedure init(); procedure init();
implementation implementation
uses uses
bios_data_area, nettypes, icmp, netutils, strings, arch.x86.bda, driver.net.types, driver.net.icmp, driver.net.util, core.strings,
processmanager, util, lmemorymanager; proc.mgr, core.util, arch.x86.util, memory.heap;
const const
PING_TIMEOUT_MS = 5000; { 5-second timeout per ping } PING_TIMEOUT_MS = 5000; { 5-second timeout per app.ping }
type type
TPingResult = (prWaiting, prGotReply, prGotError); TPingResult = (prWaiting, prGotReply, prGotError);
@@ -74,14 +74,14 @@ var
timeoutTicks : uint32; timeoutTicks : uint32;
begin begin
if ParamCount(Params) < 1 then begin if ParamCount(Params) < 1 then begin
stdio.bufWriteStrLn(stderr_buf, 'Usage: PING <ip>'); io.stdio.bufWriteStrLn(stderr_buf, 'Usage: PING <ip>');
exit; exit;
end; end;
ip_str := getParam(0, Params); ip_str := getParam(0, Params);
ip := stringToIPv4(ip_str); ip := stringToIPv4(ip_str);
if ip = nil then begin if ip = nil then begin
stdio.bufWriteStrLn(stderr_buf, 'Invalid IP address.'); io.stdio.bufWriteStrLn(stderr_buf, 'Invalid IP address.');
exit; exit;
end; end;
@@ -93,12 +93,12 @@ begin
{ Send ICMP echo request } { Send ICMP echo request }
st^.Result := prWaiting; st^.Result := prWaiting;
st^.SendTime := Counters.c64; st^.SendTime := Counters.c64;
icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st)); driver.net.icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st));
{ Spin-yield until callback fires or timeout } { Spin-yield until callback fires or timeout }
tStart := Counters.c32; tStart := Counters.c32;
while st^.Result = prWaiting do begin while st^.Result = prWaiting do begin
processmanager.proc_yield; proc.mgr.proc_yield;
tNow := Counters.c32; tNow := Counters.c32;
if tNow >= tStart then if tNow >= tStart then
elapsed := tNow - tStart elapsed := tNow - tStart
@@ -113,22 +113,22 @@ begin
{ Display result } { Display result }
if st^.Result = prGotReply then begin if st^.Result = prGotReply then begin
stdio.bufWriteStr(stdout_buf, 'Ping Reply: '); io.stdio.bufWriteStr(stdout_buf, 'Ping Reply: ');
stdio.bufWriteInt(stdout_buf, st^.ReplyTimeMS); io.stdio.bufWriteInt(stdout_buf, st^.ReplyTimeMS);
stdio.bufWriteStrLn(stdout_buf, 'ms.'); io.stdio.bufWriteStrLn(stdout_buf, 'ms.');
end else begin end else begin
stdio.bufWriteStr(stderr_buf, 'Ping Error: '); io.stdio.bufWriteStr(stderr_buf, 'Ping Error: ');
case st^.ErrorReason of case st^.ErrorReason of
aecFailedToResolveHost: stdio.bufWriteStrLn(stderr_buf, 'Failed to resolve host.'); aecFailedToResolveHost: io.stdio.bufWriteStrLn(stderr_buf, 'Failed to resolve host.');
aecNoRouteToHost: stdio.bufWriteStrLn(stderr_buf, 'No route to host.'); aecNoRouteToHost: io.stdio.bufWriteStrLn(stderr_buf, 'No route to host.');
aecTimeout: stdio.bufWriteStrLn(stderr_buf, 'Timeout expired.'); aecTimeout: io.stdio.bufWriteStrLn(stderr_buf, 'Timeout expired.');
aecTTLExpired: stdio.bufWriteStrLn(stderr_buf, 'TTL Expired.'); aecTTLExpired: io.stdio.bufWriteStrLn(stderr_buf, 'TTL Expired.');
end; end;
end; end;
{ Sleep 1 second between pings (except after last) } { Sleep 1 second between pings (except after last) }
if i < 9 then if i < 9 then
processmanager.proc_sleep_ms(1000); proc.mgr.proc_sleep_ms(1000);
end; end;
{ Clean up } { Clean up }
@@ -138,8 +138,8 @@ end;
procedure init(); procedure init();
begin begin
tracer.push_trace('ping.init'); debug.tracer.push_trace('ping.init');
stdio.registerCommand('PING', @run, 'Ping a host.'); io.stdio.registerCommand('PING', @run, 'Ping a host.');
end; end;
end. end.
+83
View File
@@ -0,0 +1,83 @@
{
Prog->app.setres - Set display resolution via GPU driver framework.
Usage: SETRES <width> <height>
Example: SETRES 1024 768
Uses the GPU driver framework to switch display modes. Tries BGA first,
then falls back to VBE/VESA.
@author(Kieron Morris <[email protected]>)
}
unit app.setres;
interface
uses
io.stdio, driver.video.gpu, core.util, arch.x86.util, core.strings, debug.tracer, io.syslog;
procedure init();
implementation
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
var
w, h : uint32;
wStr, hStr : pchar;
info : TGPUModeInfo;
begin
debug.tracer.push_trace('setres.run');
if paramCount(params) < 2 then begin
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: SETRES <width> <height>');
io.stdio.bufWriteStrLn(stderr_buf, 'Example: SETRES 1024 768');
debug.tracer.pop_trace;
exit;
end;
wStr := getParam(0, params);
hStr := getParam(1, params);
w := stringToInt(wStr);
h := stringToInt(hStr);
if (w = 0) or (h = 0) then begin
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Invalid resolution values.');
debug.tracer.pop_trace;
exit;
end;
io.stdio.bufWriteStr(stdout_buf, 'Setting resolution to ');
io.stdio.bufWriteInt(stdout_buf, w);
io.stdio.bufWriteStr(stdout_buf, 'x');
io.stdio.bufWriteInt(stdout_buf, h);
io.stdio.bufWriteStrLn(stdout_buf, 'x32...');
{ Step 1: Set display mode via GPU framework (tries BGA first, then VBE) }
if not driver.video.gpu.setMode(w, h, 32, info) then begin
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.');
debug.tracer.pop_trace;
exit;
end;
io.stdio.bufWriteStr(stdout_buf, 'Mode set via ');
io.stdio.bufWriteStrLn(stdout_buf, driver.video.gpu.activeDriverName());
io.stdio.bufWriteStr(stdout_buf, 'Resolution set to ');
io.stdio.bufWriteInt(stdout_buf, w);
io.stdio.bufWriteStr(stdout_buf, 'x');
io.stdio.bufWriteInt(stdout_buf, h);
io.stdio.bufWriteStrLn(stdout_buf, 'x32 successfully.');
debug.tracer.pop_trace;
end;
procedure init();
begin
debug.tracer.push_trace('setres.init');
io.stdio.registerCommand('SETRES', @Run, 'Set display resolution. Usage: SETRES <width> <height>');
debug.tracer.pop_trace;
end;
end.

Some files were not shown because too many files have changed in this diff Show More