# `sprinter-cc` — драйвер компилятора Однострочный вход во всю цепочку инструментов. Принимает `.c` файлы и опции, выдаёт SprintEXE. ## Синопсис ``` sprinter-cc -o OUT.exe SRC.c [more.c ...] [options] ``` ## Опции ### Раскладка памяти | Флаг | Описание | |---|---| | `--memory MODE` | `tiny` (по умолчанию), `small`, `big`, `huge`, `manual`. См. `memory_modes.md`. | | `--memory-manual SPEC` | Для `--memory manual`: список `KEY=VAL` через запятую, например `CODE=W2,DATA=W2,BANKED=W3`. | | `--stack-size N` | Сколько байт зарезервировать под стек. По умолчанию ≈1278. Большее значение уменьшает heap. | ### Организация кода | Флаг | Описание | |---|---| | `--bank N=FILE.c` | Компилировать FILE.c в банк N (1..15). Повторяемый. Функции в banked-файлах нужны с квалификатором `__banked`. | | `--crt0=TYPE` | Переопределение startup-файла: `default` / `minimal` / `banked` / `small`. Обычно выбирается автоматически по memory mode. | ### Диагностика | Флаг | Описание | |---|---| | `--debug` | Подмешивает `DEBUG_RT = 1` в crt0 + передаёт `-DDEBUG_RT` в SDCC. Открывает runtime-symbols типа `_w2_self_allocated`. | | `-v` | Verbose — печать каждой подкоманды. | | `-h` / `--help` | Встроенная справка. | ### Pass-through | Флаг | Описание | |---|---| | `-I PATH` | Дополнительный include-путь. | | `-Wl FLAG` | Передать FLAG линкеру. | | `--mkexe FLAG` | Передать FLAG в mkexe (например `--mkexe -p --mkexe 0` для zero-padded банков). | | `-L 0xADDR` | Переопределить load-адрес. | | `-E 0xADDR` | Переопределить entry-адрес. | | `-S 0xADDR` | Переопределить стартовый стек. По умолчанию `0xBFFE`. | ## Примеры Минимальная сборка: ```sh sprinter-cc -o hello.exe hello.c ``` Программа побольше (не помещается в 14 КБ): ```sh sprinter-cc --memory small -o big.exe big.c ``` Многобанковая игра: ```sh sprinter-cc --memory huge -o game.exe \ main.c --bank 1=engine.c --bank 2=ai.c --bank 3=audio.c ``` Свой размер стека: ```sh sprinter-cc --stack-size 4096 -o app.exe app.c ``` ## Что происходит внутри 1. Выбирает crt0 на основе `--memory` (и наличия `--bank`). 2. Ассемблирует crt0 (с опциональным `DEBUG_RT` / `BANK_W1`). 3. Ассемблирует `heap_top.s` (custom значение если `--stack-size`). 4. Каждый `.c` → `.rel` через SDCC. 5. Bank-исходники компилируются с `--codeseg/--constseg/--dataseg BANK_n`. 6. Компилирует trampoline `runtime/bank.s` (если есть банки). 7. Линкует всё в `.ihx`, запускает `check_banks.py` для проверки 16 КБ лимита. 8. Вызывает `toolchain/mkexe/mkexe` для упаковки `.ihx` в SprintEXE. Промежуточные файлы лежат в `.sprinter-cc-/` рядом с выходным.