# Режимы памяти Адресное пространство 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`.