| =lexer= | =Lexer=, =Token= | Source text → token stream |
| =parser= | =Parser= | Tokens → AST, recursive descent |
| =ast= | =Ast= (sealed =Stmt= / =Expr= records) | Typed syntax tree, every node carries its source line |
-| =interp= | =Interpreter= | Executes the AST (interim tree-walker) |
+| =interp= | =Interpreter=, =PrintFormat=, =Jumps=, =LabelSearch= | Executes the AST (tree-walker); PRINT/USING formatting, control-flow signals and nested-label search are factored out |
+| =io= | =IoSubsystem=, =Channel=, =FileHandle=, =DosPaths=, =QbBinaryCodec= | The OPEN channel table (text/BINARY/RANDOM/CON/COM), DOS path resolution, GET/PUT byte layout, NAME/KILL/SHELL DIR |
| =video= | =VgaDevice=, =Framebuffer=, =TextConsole=, =ScreenMode=, =VgaFont=, =DefaultPalettes=, =CapturedRegion= | The virtual VGA card |
| =input= | =KeyboardQueue= | Single input path for all frontends |
-| =audio= | =SoundQueue= | SOUND timing model (no audio yet) |
+| =machine= | =MachineMemory=, =QbextMouseTsr= | Emulated RAM (DEF SEG/PEEK/POKE) and the mouse TSR |
+| =audio= | =SoundQueue= | SOUND/BEEP: audible square wave in GUI mode, timing-only headless |
+| =capture= | =ScreenRecorder=, =CrtrecEncoder= | 30 Hz .crtrec capture and ffmpeg-based MP4 encoding |
| =frontend= | =SwingFrontend= | Interactive window: live screen + key capture |
Test sources additionally carry the JUnit suites, the