4.2 KiB
DVX BASIC
A Visual Basic 3 clone for the DVX GUI system. Provides a visual form designer, per-procedure code editor, project management, and a stack-based bytecode compiler/VM for running event-driven BASIC programs.
Architecture
DVX BASIC is built as a DXE3 app (dvxbasic.app) loaded by the DVX shell. It consists of four major subsystems:
Compiler (compiler/)
Single-pass compiler that translates BASIC source to stack-based p-code.
- lexer.c -- Tokenizer with keyword lookup, type suffixes, hex literals,
line continuation (
_), and?as PRINT shortcut. - parser.c -- Recursive descent parser. Handles all VB3 statements,
expressions, operator precedence (VB-correct:
^binds tighter than unary-), Sub/Function with forward references, bare sub calls, OPTION EXPLICIT, STATIC, CONST, DEF FN, SELECT CASE, ON ERROR GOTO, UDTs (nested), arrays of UDTs, DECLARE LIBRARY. - codegen.c -- Bytecode emitter. Dynamic arrays (stb_ds) for code, constants, and proc table. Module building, forward reference patching, unresolved reference detection.
- symtab.c -- Symbol table with local/global scoping, type tracking.
- opcodes.h -- ~90 bytecode instructions. OP_END (explicit END statement) vs OP_HALT (implicit end of module).
Runtime (runtime/)
- vm.c -- Stack-based virtual machine. Step-limited execution for cooperative multitasking. Event handler dispatch via basVmCallSub (runs to completion, no step limit). basVmCallSubWithArgsOut for events that return values (QueryUnload Cancel parameter).
- values.c -- Tagged value system: Integer, Long, Single, Double, String (ref-counted), Boolean, Array (ref-counted, multi-dim), UDT (ref-counted, nested), Object (opaque host pointer), Ref (ByRef).
Form Runtime (formrt/)
- formrt.c -- Bridge between BASIC VM and DVX widgets. Loads .frm files at runtime, creates windows and controls, dispatches events to BASIC code. Supports property get/set, method calls, and control creation via the widget interface system.
Events: Click, DblClick, Change, GotFocus, LostFocus, KeyPress, KeyDown, KeyUp, MouseDown, MouseUp, MouseMove, Scroll, Load, QueryUnload, Unload, Resize, Activate, Deactivate, Timer.
IDE (ide/)
- ideMain.c -- Main IDE orchestration. File switching via
activateFile(), per-procedure editing, Object/Event dropdowns with hash-based syntax highlighting, dirty tracking withsEditorFileIdxownership, compile-and-run with IDE window hiding, VB-style event loop. - ideDesigner.c -- Visual form designer. Live widget creation, drag/resize handles, widget interface property persistence (including WGT_IFACE_ENUM with named values), code-in-FRM files.
- ideProject.c -- Project system (.dbp files, INI format). Project window with tree view, project properties dialog with startup form dropdown and icon browser. All files loaded into memory at project open.
- ideProperties.c -- Property editor. ListView with type-aware editing (bool toggle, int spinner, enum cycling, string input). Interface property display via widget descriptors.
- ideToolbox.c -- Widget palette loaded from registered widget interfaces.
Project Files
project.dbp INI-format project file
module.bas BASIC module (code only)
form.frm Form file (layout + code section after "End")
.bas modules are compiled before .frm code sections so CONST declarations are available to form event handlers.
Build
make -C apps/dvxbasic # cross-compile for DJGPP
make -C apps/dvxbasic tests # build native test programs
Test programs: test_compiler, test_vm, test_lex, test_quick. 162 test sections covering the compiler, VM, and language features.
File Structure
apps/dvxbasic/
compiler/ Lexer, parser, codegen, symbol table, opcodes
runtime/ VM and tagged value system
formrt/ Form runtime (BASIC <-> DVX widget bridge)
ide/ IDE (main, designer, project, properties, toolbox)
samples/ Sample .bas, .frm, .dbp files
dvxbasic.res App resources (icons, toolbar buttons)
Makefile Builds basrt.lib (runtime) + dvxbasic.app (IDE)