Files
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

52 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Режимы памяти
Адресное пространство CPU Sprinter — четыре окна по 16 КБ. ESTEX DSS
выделяет страницы RAM по размеру программы — программам ≤16 КБ
выделяется **одна** страница. Из-за этого "очевидная" Spectrum-style
раскладка "код в W1, данные в W2" для маленьких программ молча ломается.
Именно поэтому `sprinter-cc` имеет явные memory modes.
## Пять режимов
| Mode | Код в | Данные в | Банки в | Когда использовать |
|---|---|---|---|---|
| `tiny` (default) | W2 (0x8100+) | сразу после кода | — | код + данные ≤ 14 КБ |
| `small` | W1 (0x4100+) | сразу после кода | — | код + данные ≤ 30 КБ |
| `big` | W2 (0x8100+) | сразу после кода | **W1** (0x4000) | tiny + дополнительные banked-модули |
| `huge` | W1 (0x4100+) | W2 (0x8000+) | **W3** (0xC000) | small + дополнительные banked-модули |
| `manual` | задаётся вручную | вручную | вручную | специальные случаи |
## Как выбирать
Начните с **`tiny`**. Если `sprinter-cc` ругается "_CODE too big" или
программа таинственно не запускается — сразу переходите на `small`.
Если кодовая база большая (>32 КБ) и нужно держать большую часть кода
вне always-resident окна — используйте `huge` и разбивайте модули на
банки через `--bank N=mod.c`. `big` — та же идея, но банки в W1 вместо
W3 — полезно когда W3 нужен для железа (графика, mapped-memory).
## Стек и heap
Стек начинается с `0xBFFE` (верх W2) и растёт вниз. Heap начинается
сразу после BSS и растёт вверх. По умолчанию они делят W2, с ~1.2 КБ
зарезервированными под стек и остальным под heap.
`--stack-size N` резервирует больше (или меньше) под стек ценой heap.
## Что внутри
Каждый режим выбирает свой `runtime/crt0_*.s`:
* `tiny`: `crt0.s` — SP = 0xBFFE, парсит argv, вызывает main.
* `small`: `crt0_small.s` — читает порт 0xC2 чтобы проверить дала ли
DSS уже W2. Если нет — выделяет страницу через ESTEX `$3D` и маппит
через `$3A SETWIN2` **до** переключения стека (BIOS-вызовы требуют
стек в W2, ESTEX — нет).
* `big`: `crt0_banked.s` с `BANK_W1=1` — банки живут по `0x{N}4000` и
trampoline'ы используют порт `0xA2`.
* `huge`: `crt0_banked.s` (default `BANK_W1=0`) — банки по `0x{N}C000`
через порт `0xE2`. Также включает small-mode W2 auto-allocation.
Для `manual` см. синтаксис `sprinter-cc --memory-manual SPEC` в `sprinter_cc.md`.