Files
Sprinter-SDCC/docs/libc-roadmap.md
T

123 lines
9.3 KiB
Markdown
Raw 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.
# libc — план работ (на рассмотрение, 2026-07-06)
Анализ после сплита четвёрки лидеров (time/stat/file/conio, итог 19.6 КБ
суммарно по _CODE приложений). Ниже — что ещё стоит сделать, по приоритетам.
---
## П1. Досплит остальной libc — СДЕЛАНО 2026-07-06
Всё из таблицы ниже посплитано (кроме dec_print — осознанно оставлен).
gfx: 40 модулей (внутренний заголовок `libc/gfx/_gfx.h`, скретчи в
data-модулях `_gfx_state/_gfx_w3_state/_gfx_acc256/_gfx_g16_state/
_gfx_font_state`, helpers `_gfx_hfill256/_gfx_hfill16/_gfx_rmw16/
_gfx_text16`); video/palette → 7 модулей + `_palette.h`;
conio/text_palette → 5 модулей. Эффект (_CODE, Б):
gfx_demo 3769→3227, gfx_d16 3869→3327, gfx_text 6986→2568,
gfx_mous 7287→5542. Не-gfx тесты не изменились.
Правило было: 1 публичная функция = 1 модуль, state/helpers — в отдельные
internal-модули, комментарии на русском, без `= 0`.
| Файл | Ф-ий | _CODE | Замечания |
|---|---|---|---|
| gfx/gfx_256.c + gfx_16.c | 13+13 | 1277+1159 Б | самый жирный кусок; резать по примитивам (putpixel/line/hline/vline/rect/fill/clear/text). Учесть SMC-паттерны акселератора и кэш Port_Y — state в data-модули |
| gfx/gfx_raw_16 / raw_256 / raw_common / core / palette / font / text_* | ~40 | ~2.7 КБ | вместе с предыдущим — весь gfx |
| mouse/mouse.c | 16 | 308 Б | state mb_*/mc_* → data-модули |
| bios/text.c | 14 | 264 Б | все `__naked`, сплит чистый |
| io/open.c | 3+3 | 216 Б | open/creat/close; asm-хелперы `_estex_*_raw` у единственных потребителей |
| errno/errno.c | 2 | 680 Б | strerror + таблица строк неразделимы (один модуль); perror — отдельно, зовёт strerror |
| video/palette.c | 6 | 348 Б | |
| conio/text_palette.c | 5 | 140 Б | |
| io/read.c | 2 | 60 Б | read + write — обязательно врозь (write-only приложения) |
| io/fsdir.c | 4 | 80 Б | mkdir/rmdir/chdir/getcwd |
| env/env.c | 3 | 78 Б | getenv/putenv/sysenv + общий env_buf → data-модуль |
| mem/mem_bios, mem_estex, bank_io_w1/w3 | 34 каждый | ~430 Б | |
| sys/atexit.c | 3 | 106 Б | atexit/exit/_exit; общий стек хендлеров → data-модуль (exit тянется всегда из crt0, выигрыш небольшой но правильный) |
| io/dir.c | 2 | 53 Б | ffirst/fnext |
| stdlib/minmax.c | 2 | 27 Б | min/max врозь |
| stdio/hex_print.c | 3 | 38 Б | сплит чистый (call/jp по именам) — см. docs/libc-split-asm-cases.md |
| stdio/dec_print.c | 3 | 176 Б | НЕ резать (общее тело); открытое решение: вариант «3 независимых цикла» — п. отложен |
Ожидаемый эффект: графические приложения −1–2 КБ, mouse/BIOS-text — сотни байт.
## П2. FILE* — отложенные баги и недостающее
Из шапки бывшего file.c («PROVISIONAL», stdio-review issues 3/4/5):
- [x] fwrite: короткая запись ставит _F_ERROR (issue 3) — сделано 2026-07-06
- [x] fgets(n=1): возвращает пустую строку по стандарту (issue 4) — сделано 2026-07-06
- [x] mode_to_flags: проверено — парсер сканирует весь хвост режима, «rb+» работает (issue 5, уже был исправлен)
- [x] **fprintf/vfprintf** — сделаны 2026-07-06 (vsprintf в статический 256-байтовый буфер + fwrite)
- [x] ungetc — 1-байтный putback через поле hold; работает и на stdin — сделано 2026-07-06
- [x] Буферизация FILE v2 — **реализован вариант B+** (2026-07-06): единый ленивый буфер BUFSIZ=512 на чтение и запись с автопереключением направления, статическая таблица OPEN_MAX=8 слотов, _fclosall через atexit, fflush(NULL) = все потоки. Дизайн: docs/file-buffering-design.md. Цена: filetest (использует всё) 7411→9929 Б _CODE; не-FILE программы не платят ничего. **Ждёт MAME-прогона: filetest, fdmax (лимит DSS), fbench (замер скорости)**
- [ ] fdopen/freopen/fclosall/fgetpos/fsetpos — по мере надобности (Solid-C категория C)
## П3. Solid-C совместимость — ЗАКРЫТ 2026-07-06
Всё сделано (детали в docs/solid_c_compatibility.md): getdisk/setdisk,
getdate/gettime/setdate/settime + <dos.h>, ltell/_setargv, errno-алиасы,
<sprinter_solid.h>, div из SDCC (проверено), absread/abswrite (BIOS
$55/$56 — номера найдены в solid-c DOS.ASM), **scanf/fscanf/sscanf**
(своё C-ядро _scanf_core, 22 хост-теста), fdopen/freopen/fclosall/
fgetpos/fsetpos (хвост П2). bdos/brk/ioctl — отказ решением.
Тест tests/solidt ждёт MAME-прогона.
## П4. Недостающие POSIX-мелочи — ЗАКРЫТ 2026-07-06
- [x] rename() — ESTEX RENAME $10 (HL=старое, DE=новое), libc/io/rename.c
- [x] isatty(fd) — fd < 2 (манипуляторы DSS с 2; консольные псевдо-fd 0/-1/-2)
## П5. Заголовки и гигиена сборки — ЗАКРЫТ 2026-07-06
- [x] Контракт затенения — **docs/libc-headers.md**: include_next
(stdlib.h + новый string.h со strlwr/strupr) vs полная замена
(stdio.h, time.h — обязаны дублировать сигнатуры z80.lib);
из sprinter_compat.h убраны макросы min/max (конфликтовали с
функциями из stdlib.h; в Solid-C это тоже функции)
- [x] lib/Makefile: stale .rel чистятся сверкой списка перед упаковкой;
штамп .modules триггерит перелинковку при смене состава (и сносит
архив — mtime на exFAT грубый)
- [x] Все extra-тесты в top-level TESTS (43 программы: + hello2, simple,
banktest (переименован из banked.exe), conio2, dec_test, gets,
stest2, winrest, bios_text, text_palette, gfx_dbuf) и mdview2 в APPS
- [x] Размерный регресс: toolchain/size_check.py + docs/size_baseline.tsv;
`make size-check` (выход 1 при росте) / `make size-baseline`
## П6. Верификация после сплита — ЗАКРЫТ 2026-07-06 (MAME; железо — отдельно)
- [ ] `make floppy` + прогон в MAME ключевых тестов (conio, filetest, ptime,
stattest, mouse, gfx_demo) — линковка прошла, но поведение надо
подтвердить на эмуляторе
- [ ] Потом на железе (mdview2 и так ждёт проверки на железе — совместить)
## П7. Документация — ЗАКРЫТ 2026-07-06
- [x] **docs/libc-reference.md** — справочник API по всем заголовкам
- [x] docs/TODO.md переписан: открытое наверху, закрытые этапы (5-10)
в «Истории»; протухшие пункты (FILE rewrite «для v2») сняты
- [x] **CLAUDE.md** создан: сборка/проверка, правила libc (1 ф-я =
1 модуль, `_`-модули, русские комментарии, без `= 0`,
asm-правила), ABI-шпаргалка, квирки, структура
## П8. Смежное (не libc, из TODO.md — чтобы не потерялось)
- auto-banking Phase 1 (toolchain/auto_bank.py) — когда проект перерастёт ~30 КБ
- IM2 ISR v2 (docs/im2_isr_design.md) — отложено решением 2026-06-01
- font-quad для 640×256 (per-cell палитра)
- factoring parse_argv из crt0/crt0_banked в общий argv.s
- check_banks.py: разбивка code/const/bss per bank (косметика)
---
## Предлагаемый порядок
1. **П1-лайт**: io/env/errno/atexit/minmax/mem/dir/fsdir (мелкие, час работы,
выигрыш для всех CLI-приложений) + mouse + bios/text.
2. **П6**: MAME-смоук — подтвердить, что сплит ничего не сломал в рантайме,
до того как менять что-то ещё.
3. **П1-gfx**: разбор графики (самый большой кусок, отдельный заход).
4. **П2**: баги FILE* (3 шт.) + fprintf + ungetc.
5. **П3/П4**: solid-c остатки + rename/isatty.
6. **П5/П7**: гигиена сборки и документация — фоном, по кусочку.