libc: Solid-C совместимость (П3) + rename/isatty (П4); scanf-семейство

- <dos.h>: getdate/gettime/setdate/settime (структуры Turbo-C, обёртки
  над getdatetime), getdisk/setdisk (ESTEX $02/$01), absread/abswrite
  (BIOS $55/$56, rst 8 — номера найдены в solid-c DOS.ASM; сектор 0 =
  boot логического диска)
- scanf/fscanf/sscanf: своё C-ядро _scanf_core (%d %u %x %o %c %s,
  модификатор l, ширина, подавление '*', %%); в SDCC z80 scanf нет,
  asm solid-c не портируем из-за чужого ABI; 22 хост-теста ядра
- хвост П2: fdopen/freopen/fclosall/fgetpos/fsetpos поверх таблицы
  FILE; парсер режима и выдача слота вынесены в _file_mode/_file_slot
- rename() — ESTEX RENAME $10; isatty(fd) = fd <= 0 (tty только
  псевдо-fd 0/-1/-2: из CLI DSS манипуляторы идут с 1 — verified,
  fd 1 не резерв, под Flex Navigator его держит навигатор)
- errno.h: Solid-C имена ошибок (EZERO/EINVFNC/ENOFILE/...) как алиасы
- <sprinter_solid.h> — зонтичный заголовок для портирования;
  ltell/_setargv в sprinter_compat.h; div/ldiv — из SDCC (проверено)
- tests/solidt — smoke всех П3/П4 API, зелёный в MAME (вкл. absread
  boot-сектора с сигнатурой 55AA)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 16:35:58 +03:00
parent 057dd615ba
commit 60373930fb
35 changed files with 1017 additions and 88 deletions
+11 -18
View File
@@ -53,27 +53,20 @@ internal-модули, комментарии на русском, без `= 0`.
- [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 совместимость — остатки (docs/solid_c_compatibility.md)
## П3. Solid-C совместимость — ЗАКРЫТ 2026-07-06
Phase 1 (алиасы) фактически закрыт — home/inp/outp/enable/disable, ms_*,
getc/putc, min/max, dec*/hex*, strlwr/strupr, cgets есть. Осталось:
Всё сделано (детали в 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-прогона.
- [ ] getdisk()/setdisk() — ESTEX $02 CURDISK / $01 CHDISK
- [ ] getdate/gettime/setdate/settime — обёртки над getdatetime/setdatetime
- [ ] seek/tell/ltell, setmem/movmem, isascii, abort(), div(), remove→unlink, _ffirst
- [ ] errno-константы Solid-C (EZERO/EINVFNC/…) как алиасы в errno.h
- [ ] `<sprinter_solid.h>` — зонтичный compat-заголовок
- [ ] обновить статусы/history в solid_c_compatibility.md (Phase 1 done)
## П4. Недостающие POSIX-мелочи — ЗАКРЫТ 2026-07-06
Research (Phase 3): absread/abswrite (найти ESTEX READ_SECT/WRITE_SECT),
scanf-семейство (**в SDCC 4.5 z80 его НЕТ** — писать самим или задокументировать
отказ), brk/sbrk vs SDCC heap, isatty, ioctl (скорее скип).
## П4. Недостающие POSIX-мелочи вне Solid-C списка
- [ ] **rename()** — в gap-анализе отсутствует, ESTEX почти наверняка имеет
RENAME (~$0F, рядом с DELETE $0E) — проверить по докам ESTEX и добавить
- [ ] isatty(fd) — тривиально (fd<0/флаги)
- [x] rename() — ESTEX RENAME $10 (HL=старое, DE=новое), libc/io/rename.c
- [x] isatty(fd) — fd < 2 (манипуляторы DSS с 2; консольные псевдо-fd 0/-1/-2)
## П5. Заголовки и гигиена сборки
+25
View File
@@ -130,6 +130,31 @@ These will be in `docs/solid_c_diff.md`:
To make porting easier, add a single `<sprinter_solid.h>` that includes all the standard headers (`stdio.h`, `string.h`, `conio.h`, etc.) — Solid-C programs can `#include <sprinter_solid.h>` and have most functions available.
## Status 2026-07-06 — Phase 1/2/3 ЗАКРЫТЫ
Всё из категорий A/B/C реализовано или закрыто решением:
- **A (алиасы)**: все на месте в sprinter_compat.h (+ ltell, _setargv
добавлены 2026-07-06); div/ldiv — из SDCC z80.lib (проверено).
- **B**: getdisk/setdisk (ESTEX $02/$01, libc/io), getdate/gettime/
setdate/settime (обёртки над getdatetime, структуры Turbo-C в
<dos.h>), остальное было готово ранее.
- **C**: fdopen/freopen/fclosall/fgetpos/fsetpos — реализованы поверх
таблицы FILE v2 (libc/file); ungetc — есть (FILE v2);
**absread/abswrite — BIOS $55/$56** (rst 8, A=диск, HL:IX=сектор,
DE=буфер, B=счётчик; найдено в solid-c DOS.ASM) — реализованы в
libc/io; **scanf/fscanf/sscanf — реализованы** (своё C-ядро
_scanf_core с семантикой Solid-C: %d %u %x %o %c %s, l, ширина, %*;
в SDCC z80 scanf нет); isatty — fd < 2 (см. memory/dss_fd_limit).
bdos/bdosh/intdos — НЕ экспонируем (решение: типизированные
обёртки); brk/sbrk — НЕ нужны (heap SDCC); ioctl — скип.
- **errno**: Solid-C имена (EZERO/EINVFNC/ENOFILE/…) — алиасы в errno.h.
- **Зонтичный заголовок**: <sprinter_solid.h>.
- Тест: tests/solidt (MAME).
## History
- 2026-07-06 — Phase 1/2/3 закрыты: dos.h (даты/диски/сектора),
scanf-семейство, fdopen/freopen/fclosall/fgetpos/fsetpos,
rename/isatty (П4), errno-алиасы, sprinter_solid.h, тест solidt
- 2026-06-01 — initial gap analysis vs Solid-C v2004