97 lines
4.2 KiB
Markdown
97 lines
4.2 KiB
Markdown
# 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)
|