Expand roadmap with detailed implementation plans for the next three features: MBF binary file compatibility (token-stream conversion at load/save boundary), hardware I/O simulator (portio.c with PIT/speaker/ CGA/joystick port emulation), and DRAW command fixes (M parsing bug, scale semantics, A rotation, TA/variable substitution). Remove hardware I/O from known limitations (moving to planned). Fix stale test counts (64 -> 66) and version string (0.11.0 -> 0.13.0) across docs.
4.6 KiB
Roadmap
The Big One
- GW-BASIC 2026 Compiler — ahead-of-time compilation of BASIC programs to native executables. Because nothing says "premature optimization" like compiling a language designed for an interpreter running on a 4.77 MHz 8088. But we've come this far, so why not? Likely approach: translate the token stream to C and lean on GCC/Clang for the heavy lifting.
Next Up (v0.14.0)
MBF Binary File Compatibility
Make the binary tokenized file format fully compatible with original GWBASIC.EXE files. Currently, float constants in the token stream are stored as IEEE 754; the original uses Microsoft Binary Format (MBF).
Approach: always store MBF on disk, always IEEE in memory. Convert at the
load_binary()/save_binary() boundary in program_io.c. A token-walking
function scans each line for TOK_CONST_SNG (0x1C, 4 bytes) and
TOK_CONST_DBL (0x1F, 8 bytes) and converts in-place using the existing
gw_mbf_to_ieee_* / gw_ieee_to_mbf_* routines. The walker must skip string
literals, REM/DATA regions, and multi-byte tokens to avoid false positives.
This makes round-tripping lossless (MBF single has the same 24-bit mantissa as
IEEE single; MBF double's 56 bits cleanly contain IEEE double's 53 bits) and
enables loading authentic .BAS files from the 1980s.
Hardware I/O Simulator
An optional emulation layer for OUT, INP, WAIT, MOTOR, and friends,
following the established virmem.c dispatch-by-address pattern.
New module: portio.c / portio.h with portio_inp(port) /
portio_out(port, value) dispatch.
Priority ports:
| Port | Device | Emulation |
|---|---|---|
| 0x42–0x43 | 8253 PIT channel 2 | Speaker frequency divisor (1193180 / divisor Hz) |
| 0x61 | PPI Port B | Speaker on/off (bits 0–1), routes to snd_start_continuous() / snd_stop_continuous() |
| 0x3D8 | CGA mode control | Mode register storage, feeds gfx_init() |
| 0x3D9 | CGA color select | Palette/background bits, feeds gfx_palette_set() |
| 0x201 | Game port | Joystick stub (returns 0xF0 = no buttons) |
| 0x3F8–0x3FE | COM1 serial | Minimal stub (LSR reports transmitter ready to prevent spin loops) |
| Default | — | Reads return 0xFF (floating bus), writes silently discarded |
Statement/function changes:
OUT port, value→portio_out(port, value)WAIT port, mask [, xor_mask]→ busy loop withportio_inp(), break check, timeoutMOTOR→ accept and silently ignoreINP(port)→portio_inp(port)(currently returns 0)STICK(n)/STRIG(n)→ joystick state from port 0x201
DRAW Command Fixes
The DRAW mini-language parser has three bugs and four missing features.
Bugs to fix:
- M command parsing — the generic argument parser consumes digits that
belong to M's x-coordinate, so
DRAW "M100,50"moves to (0, 50). Fix: skip the generic parser when the command is M. - S (scale) semantics — scale is used as a default distance instead of a
multiplier.
DRAW "U"moves 4 pixels instead of 1. Correct formula:dist = (has_arg ? arg : 1) * scale / 4. - A (90° rotation) — recognized but no-op. Needs a rotation state variable and direction vector transform for U/D/L/R/E/F/G/H.
Features to add:
TA n— arbitrary rotation angle (degrees, −360 to 360); requires multi-character command parsing and trigonometric direction vector rotation=variable;— numeric variable substitution in DRAW strings; requires passing variable lookup capability intogfx_draw()X subexpr;— execute sub-string from a string variable (recursive parse)- Scale applied to relative M coordinates
IDE and Notebook Integration
- Jupyter kernel for GW-BASIC — a Jupyter Notebook kernel that runs
GW-BASIC programs cell-by-cell, with rich output for
PRINT, inline graphics rendering for drawing commands, and interactiveINPUTvia notebook widgets. Similar in spirit to foxkernel. - JetBrains plugin (IntelliJ/CLion) — full-featured language plugin with
syntax highlighting, code completion, line number navigation, run
configurations, debugger integration (breakpoints via
STOP, variable inspection), structure view (line number outline), and error annotations. - VS Code extension — language extension providing syntax highlighting (TextMate grammar), snippets, run/debug tasks, integrated terminal runner, and Language Server Protocol support for diagnostics and hover info.
Known Limitations
- String garbage collection not implemented (uses
malloc/freeinstead) - Maximum 256 variables, 64 arrays, 16 FOR nesting, 24 GOSUB nesting, 16 WHILE nesting