# `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-<basename>/` рядом с выходным.
