DVX_GUI/loader
2026-03-25 22:42:07 -05:00
..
loaderMain.c First pass of major debugging. At a glance, everything is working again. 2026-03-25 21:43:41 -05:00
Makefile MAJOR refactoring. Everything is dynamically loaded now. All new bugs to squash! 2026-03-24 23:03:05 -05:00
README.md Docs. 2026-03-25 22:42:07 -05:00

DVX Loader

Bootstrap loader for the DVX desktop environment. Builds as dvx.exe -- the only native executable in the system. Everything else is a dynamically loaded DXE3 module.

What It Does

  1. Changes working directory to the directory containing dvx.exe
  2. Truncates dvx.log and initializes logging
  3. Calls platformInit() to suppress Ctrl+C and install signal handlers
  4. Calls platformRegisterDxeExports() to register platform and C runtime symbols (libc, libm, libgcc) for DXE module resolution
  5. Scans and loads all modules in two phases (see below)
  6. Finds shellMain() via dlsym across loaded modules
  7. Calls shellMain() -- the shell takes over from here
  8. On return, closes all module handles in reverse load order

Two-Phase Module Loading

Phase 1: Libraries (libs/*.lib)

Scans the LIBS/ directory for .lib files. Each module may have a .dep file (same base name, .dep extension) listing base names of modules that must load first. The loader resolves the dependency graph and loads in topological order.

Load order (via dep files):

libtasks.lib  (no deps)
libdvx.lib    (deps: libtasks)
texthelp.lib  (deps: libtasks, libdvx)
listhelp.lib  (deps: libtasks, libdvx)
dvxshell.lib  (deps: libtasks, libdvx, texthelp, listhelp)

Phase 2: Widgets (widgets/*.wgt)

Scans the WIDGETS/ directory for .wgt files. Widget modules may also have .dep files (e.g., textinpt.dep lists texthelp). Loaded in topological order, same as libs.

After loading each module, the loader checks for a wgtRegister export. If present, it is called immediately so the widget registers its class(es) and API with the core.

Dependency File Format

Plain text, one dependency base name per line. Empty lines and lines starting with # are ignored. Names are case-insensitive.

Example (combobox.dep):

texthelp
listhelp

Hosted Components

dvxLog()

The global logging function is defined in loaderMain.c and exported to all DXE modules. It appends a line to dvx.log, opening and closing the file per write so it is never held open.

void dvxLog(const char *fmt, ...);

stb_ds

The STB_DS_IMPLEMENTATION is compiled into the loader. stb_ds functions are exported to all DXE modules via the platform export table.

Platform Layer

dvxPlatformDos.c is compiled into the loader (not into libdvx.lib). All platform functions are exported to DXE modules. This includes:

  • Video: VESA VBE init, LFB mapping, mode enumeration
  • Input: INT 33h mouse, INT 16h keyboard, CuteMouse wheel API
  • Spans: rep stosl/rep movsd asm inner loops (8/16/32 bpp)
  • DXE: symbol registration, symbol overrides
  • Crash: signal handler installation, register dump logging
  • System: memory info, directory creation, path utilities

Files

File Description
loaderMain.c Entry point, module scanner, dependency resolver, logger
Makefile Builds bin/dvx.exe

Build

make            # builds bin/dvx.exe
make clean      # removes objects and binary

The loader links loaderMain.c + dvxPlatformDos.c into a native DJGPP executable. The CWSDPMI stub is prepended via exe2coff + CWSDSTUB.EXE for standalone execution.