feat: make SOUND/BEEP audible, add SPACE$ and LET, guard empty loops
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Wed, 26 Aug 2026 17:40:32 +0000 (20:40 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Wed, 26 Aug 2026 17:40:32 +0000 (20:40 +0300)
commitb7b8fcc61852d28df06825ca6cbdd533a2a79d29
treea4d01b64201231f756479489a2deb6bb0153c95e
parentfe86c0035df584b8c981c5155fb8cd46a75991da
feat: make SOUND/BEEP audible, add SPACE$ and LET, guard empty loops

- SoundQueue renders a phase-continuous square wave (44.1 kHz 16-bit)
  through a daemon-fed SourceDataLine in GUI mode; falls back to
  timing-only in headless/tests and when no audio device opens
- SPACE$ returns n spaces (previously misread as an array reference,
  surfacing as "Subscript out of range")
- LET keyword parses as plain scalar or array-element assignment
- empty-body DO/WHILE spins now enforce the --steps budget, so
  headless INKEY$ wait loops terminate instead of hanging
Documentation/language/index.org
src/main/java/eu/svjatoslav/crtbasic/Main.java
src/main/java/eu/svjatoslav/crtbasic/audio/SoundQueue.java
src/main/java/eu/svjatoslav/crtbasic/interp/Interpreter.java
src/main/java/eu/svjatoslav/crtbasic/parser/Parser.java
src/test/java/eu/svjatoslav/crtbasic/audio/SoundQueueTest.java [new file with mode: 0644]
src/test/java/eu/svjatoslav/crtbasic/interp/InterpreterFeaturesTest.java