libc: сплит «1 функция = 1 модуль» — вся библиотека, wildcard-сборка

- bios/conio/env/errno/gfx/io/mem/mouse/stdio/stdlib/string/sys/time/
  video разложены по модулям: общие статики и helpers — в internal
  _-модулях (_conio.h/_mouse.h/_gfx.h/_palette.h/_atexit.h/_time.h)
- lib/Makefile: LIBC_C = wildcard libc/*/*.c — гранулярность файлов
  = гранулярность DCE линкера
- эффект _CODE: gfx_text 6986→2568 Б, gfx_mous −1745, gfx_demo/d16
  −542; ранее timedir −3270, ls −3098, stattest −2995
- комментарии оставшихся модулей переведены на русский; puts: убран
  мёртвый pchars; videomode_raw разложен на get/set
- docs/libc-split-asm-cases.md — правила asm-связок между модулями;
  docs/libc-roadmap.md — план этапа
- восстановлен examples/mdview/SAMPLE.MD (нужен make floppy)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 16:08:58 +03:00
parent 46553f4e07
commit 4a081501d8
237 changed files with 4830 additions and 3933 deletions
+9 -9
View File
@@ -1,12 +1,12 @@
/*
* sleep — block for N seconds using the 50 Hz frame interrupt.
* sleep — заблокироваться на N секунд по кадровому прерыванию 50 Гц.
*
* Sprinter ISR fires 50 times per second. `halt` parks the CPU until
* the next IRQ, so 50 halts = ~1 second of wall clock. This is the
* same trick solid-c uses in IO.ASM:285.
* ISR Sprinter срабатывает 50 раз в секунду. `halt` паркует CPU до
* следующего IRQ, так что 50 halt'ов = ~1 секунда стенного времени.
* Тот же трюк, что у solid-c в IO.ASM:285.
*
* Note: requires interrupts to be enabled (they are by default — ESTEX
* sets up IM 1 with the frame ISR before our program runs).
* Замечание: требует включённых прерываний (по умолчанию включены —
* ESTEX настраивает IM 1 с кадровым ISR до запуска нашей программы).
*/
#include <unistd.h>
@@ -16,11 +16,11 @@ void sleep(unsigned int seconds) __naked
(void)seconds;
__asm
inter:
;; HL = seconds on entry (SDCC single int arg).
;; HL = seconds на входе (единственный int-аргумент SDCC).
ld a, h
or a, l
ret Z ; sleep(0) return immediately
ld b, #50 ; 50 halts per second (50 Hz interrupt)
ret Z ; sleep(0) вернуться сразу
ld b, #50 ; 50 halt-ов на секунду (50 Гц)
inner:
halt
djnz inner