DVX_GUI/apps/dvxbasic/README.md
2026-04-02 21:44:06 -05:00

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 with sEditorFileIdx ownership, 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)