Some checks failed
akbasic CI Build / cmake_build (push) Failing after 3m10s
akbasic CI Build / sanitizers (push) Failing after 4m5s
akbasic CI Build / coverage (push) Failing after 3m29s
akbasic CI Build / akgl_build (push) Failing after 21s
akbasic CI Build / mutation_test (push) Failing after 3m19s
Two complete games in `examples/breakout/`, both 100% BASIC: `characters/` draws its wall in the text grid with two `DATA` sprites for the ball and paddle, and `sprites/` loads CC0 artwork and captures its whole screen with `SSHAPE`/`SPRSAV`. They take opposite shapes for reasons that are entirely this interpreter's, which is what the chapters are for. `docs/17-tutorial-breakout.md` and `docs/18-tutorial-breakout-artwork.md` build each one a step at a time, and end in a checklist of the rules a real program runs into: create every name before the loop starts, write a text row whole, loop with `GOTO` rather than `DO`, put the float on the left. Every trap is a runnable block with its own output rather than a claim -- the value pool dying at four thousand names, the skipped `BEGIN` block that breaks its caller's `RETURN`, `SSHAPE` ignoring a subscript, `READ`'s single cursor. Five figures, generated from the listings beside them by `docs_screenshots`, and a `breakout_art` setup so the ones that load artwork load the example's own. The character game's wall cannot be photographed -- the screenshot host omits the text layer on purpose -- so it is shown as compared output instead. `docs/07-sound.md` never said `SOUND`'s frequency is a SID register value rather than hertz, which both games depend on. It says so now, with the conversion from `src/audio_tables.c:84`. `TODO.md` gains the thirteen defects the two games turned up -- §6 items 30 to 33 and all of §9 -- each with a reduction that fits on a screen, the file and line of the cause, and what a fix would touch. Verified: `docs_examples` passes in both build configurations, `docs_screenshots --check` re-renders all thirteen figures and byte-compares them, the full 109-test suite passes in both builds, every quoted fragment was checked to appear verbatim in the listing it came from, and every relative link and anchor resolves. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
72 lines
3.5 KiB
Markdown
72 lines
3.5 KiB
Markdown
# The akbasic guide
|
|
|
|
akbasic is a BASIC interpreter in the style of **Commodore BASIC 7.0** — the dialect
|
|
the C128 shipped with — and **Dartmouth BASIC**. It runs programs from a file or from
|
|
an interactive prompt, and it is also a C library you can link into a game so that
|
|
players can script it.
|
|
|
|
These chapters follow the shape of the
|
|
[C128 Programmer's Reference Guide](http://www.jbrain.com/pub/cbm/manuals/128/C128PRG.pdf):
|
|
the language first, then each hardware area, then the reference sections. If you know
|
|
BASIC 7.0 you can skip to **[Chapter 13](13-differences.md)**, which is the list of
|
|
everything that behaves differently here and why. **[Chapter 14](14-architecture.md)** is
|
|
the odd one out: it is about the interpreter rather than the language, for anyone
|
|
embedding it, debugging it or changing it.
|
|
|
|
**[Chapters 17](17-tutorial-breakout.md)** and **[18](18-tutorial-breakout-artwork.md)**
|
|
are tutorials rather than reference: they build one complete game twice, two different
|
|
ways, and are where the rules that a real program runs into are collected.
|
|
|
|
## Chapters
|
|
|
|
| | |
|
|
|---|---|
|
|
| **[1. Introduction](01-introduction.md)** | What akbasic is, what it is not, and how to build it |
|
|
| **[2. Getting started](02-getting-started.md)** | The prompt, your first program, saving and loading |
|
|
| **[3. The language](03-the-language.md)** | Variables, types, arrays, operators, expressions |
|
|
| **[4. Control flow](04-control-flow.md)** | `IF`, `FOR`, `DO`, `GOSUB`, labels, `ON`, error trapping |
|
|
| **[5. Strings and formatting](05-strings-and-formatting.md)** | String functions, `PRINT USING`, `PUDEF` |
|
|
| **[6. Graphics](06-graphics.md)** | `GRAPHIC`, `DRAW`, `BOX`, `CIRCLE`, `PAINT`, shapes |
|
|
| **[7. Sound](07-sound.md)** | `SOUND`, `PLAY`, `ENVELOPE`, `VOL`, `TEMPO` |
|
|
| **[8. Sprites](08-sprites.md)** | `SPRITE`, `SPRSAV`, `MOVSPR`, collision |
|
|
| **[9. Files and disk](09-files-and-disk.md)** | Channels, `DOPEN`, program storage |
|
|
| **[10. Embedding](10-embedding.md)** | Driving the interpreter from C |
|
|
| **[11. Verb reference](11-verb-reference.md)** | Every statement, alphabetically |
|
|
| **[12. Function reference](12-function-reference.md)** | Every function, alphabetically |
|
|
| **[13. Differences from BASIC 7.0](13-differences.md)** | What a C128 programmer needs to know |
|
|
| **[14. Architecture](14-architecture.md)** | How the interpreter is put together, how to debug it, how to change it |
|
|
| **[15. Error codes](15-error-codes.md)** | Appendix: every value `ER#` can hold and every error line the interpreter prints |
|
|
| **[16. Structures](16-structures.md)** | `TYPE`, records, strict pointers, and sharing a C struct with an embedding host |
|
|
| **[17. Tutorial: Breakout](17-tutorial-breakout.md)** | Build a whole game out of the text grid and two `DATA` sprites, a step at a time |
|
|
| **[18. Tutorial: Breakout with artwork](18-tutorial-breakout-artwork.md)** | Build it again out of loaded artwork, powerups and a drawn HUD |
|
|
|
|
## The shortest possible start
|
|
|
|
```sh norun
|
|
$ cmake -S . -B build && cmake --build build
|
|
$ ./build/basic
|
|
```
|
|
|
|
```basic repl
|
|
10 FOR I# = 1 TO 5
|
|
20 PRINT "HELLO " + I#
|
|
30 NEXT I#
|
|
RUN
|
|
```
|
|
|
|
```output
|
|
HELLO 1
|
|
HELLO 2
|
|
HELLO 3
|
|
HELLO 4
|
|
HELLO 5
|
|
READY
|
|
```
|
|
|
|
Two things in that program are not Commodore BASIC and will catch you out
|
|
immediately: **variables carry a type suffix** (`I#` is an integer) and **`+`
|
|
concatenates a string with a number**. Chapter 3 explains both.
|
|
|
|
Every example in these chapters is executed by the test suite and its output
|
|
compared byte for byte — see `MAINTENANCE.md` if you are editing them.
|