Files
Sprinter-SDCC/release_docs/en/sprinter_cc.md
T
snark13 c71e249a4e Add full compiler toolchain, libc, examples and reference docs
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.

What's in here:
  bin/sprinter-cc        — driver script invoking SDCC + linker + mkexe
  libc/                  — Sprinter-specific libc layer over ESTEX/BIOS
                           (conio, gfx, io, mem, stdio + headers)
  runtime/               — crt0 variants (default/small/banked/minimal)
                           + heap + bank trampolines
  toolchain/             — mkexe (SprintEXE packer, C + tests)
  examples/              — 30 demo programs (gfx, file I/O, env, time, …)
  lib/Makefile           — builds the libc archive (sprinter.lib)
  docs/                  — converted Sprinter manuals + asm reference samples
  third_party/           — solid-c reference compiler dump + sdcc setup script
  release_docs/          — packaging / release notes

gitignore overhaul:
  • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
    and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
    on macOS APFS).  Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
  • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
    INPUT fixtures, not build outputs.
  • Collapse the duplicated SDCC/C/Sdcc sections into one section per
    concern (build outputs / vendored / OS-junk).
  • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-03 16:13:21 +03:00

83 lines
2.5 KiB
Markdown

# `sprinter-cc` — compiler driver
One-line entrypoint to the entire toolchain. Takes `.c` files plus options
and emits a SprintEXE.
## Synopsis
```
sprinter-cc -o OUT.exe SRC.c [more.c ...] [options]
```
## Options
### Memory layout
| Flag | Description |
|---|---|
| `--memory MODE` | `tiny` (default), `small`, `big`, `huge`, `manual`. See `memory_modes.md`. |
| `--memory-manual SPEC` | For `--memory manual`: comma-separated `KEY=VAL` list, e.g. `CODE=W2,DATA=W2,BANKED=W3`. |
| `--stack-size N` | Bytes reserved for the stack. Default ≈ 1278. Larger value reduces the heap. |
### Code organisation
| Flag | Description |
|---|---|
| `--bank N=FILE.c` | Compile FILE.c into bank N (1..15). Repeatable. Functions in banked files need the `__banked` qualifier. |
| `--crt0=TYPE` | Override startup file: `default` / `minimal` / `banked` / `small`. Normally chosen automatically by the memory mode. |
### Diagnostics
| Flag | Description |
|---|---|
| `--debug` | Prepends `DEBUG_RT = 1` to crt0 and passes `-DDEBUG_RT` to SDCC. Exposes runtime introspection symbols like `_w2_self_allocated`. |
| `-v` | Verbose — echo every sub-command. |
| `-h` / `--help` | Built-in help. |
### Passthrough
| Flag | Description |
|---|---|
| `-I PATH` | Extra include path. |
| `-Wl FLAG` | Pass FLAG to the linker. |
| `--mkexe FLAG` | Pass FLAG to mkexe (e.g. `--mkexe -p --mkexe 0` for zero-padded banks). |
| `-L 0xADDR` | Override load address. |
| `-E 0xADDR` | Override entry address. |
| `-S 0xADDR` | Override initial stack address. Default `0xBFFE`. |
## Examples
Smallest possible build:
```sh
sprinter-cc -o hello.exe hello.c
```
Larger program (doesn't fit in 14 KB):
```sh
sprinter-cc --memory small -o big.exe big.c
```
Multi-bank game:
```sh
sprinter-cc --memory huge -o game.exe \
main.c --bank 1=engine.c --bank 2=ai.c --bank 3=audio.c
```
Custom stack size:
```sh
sprinter-cc --stack-size 4096 -o app.exe app.c
```
## Under the hood
1. Picks crt0 based on `--memory` (and `--bank` presence).
2. Assembles crt0 (with optional `DEBUG_RT` / `BANK_W1` prepended).
3. Assembles `heap_top.s` (custom value if `--stack-size`).
4. Compiles every source `.c` to `.rel` via SDCC.
5. Compiles bank sources with `--codeseg/--constseg/--dataseg BANK_n`.
6. Compiles `runtime/bank.s` trampoline (if banks are used).
7. Links everything to `.ihx`, runs `check_banks.py` to enforce 16 KB bank limits.
8. Calls `toolchain/mkexe/mkexe` to wrap the `.ihx` as SprintEXE.
Per-build artefacts go in `.sprinter-cc-<basename>/` next to the output.