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
+109
View File
@@ -0,0 +1,109 @@
/*
* _gfx.h — внутренности графической подсистемы (НЕ публичный заголовок).
*
* Общее состояние лежит в data-модулях (_gfx_state.c, _gfx_w3_state.c,
* _gfx_acc256.c, _gfx_g16_state.c, _gfx_font_state.c), helpers — в
* отдельных internal-модулях; см. docs/libc-split-asm-cases.md.
*/
#ifndef _GFX_INTERNAL_H
#define _GFX_INTERNAL_H
#include <gfx.h>
/* ---- Общее состояние (_gfx_state.c) ------------------------------ */
/* Кэш SELPAGE: видимая и рисуемая страницы (0/1). */
extern uint8_t _gfx_visible_page;
extern uint8_t _gfx_draw_page;
/* Байт страницы W3 (0x50..0x5F) — какой видеобанк мапится при записи. */
extern uint8_t _gfx_bank;
/* CPU-адрес колонки 0 текущей draw-страницы: 0xC000 (page 0) или
* 0xC140 (page 1); каждый примитив использует его вместо константы. */
extern uint16_t _gfx_addr_base;
/* ---- Низкоуровневый видеорежим (video/videomode_raw.c) ----------- */
uint8_t _videomode_raw_get(void);
int _videomode_raw_set(uint8_t mode);
/* ---- W3-скобки (_gfx_w3_video_begin/end.c, _gfx_w3_state.c) ------ *
* begin: DI + сохранить текущий W3 и замапить _gfx_bank;
* end: восстановить W3 + EI. Не реентерабельно (сейв в статике). */
extern uint8_t _gfx_saved_w3;
void _gfx_w3_video_begin(void);
void _gfx_w3_video_end(void);
/* ---- Raw-примитивы 256 цветов (mode 0x81) ------------------------- *
* "Raw" = W3-naive: вызывающий обязан обернуть последовательность в
* одну пару _gfx_w3_video_begin/_gfx_w3_video_end. */
void _gfx_putpixel256_raw(int x, int y, uint8_t color);
void _gfx_hline256_raw (int x, int y, int len, uint8_t color);
void _gfx_vline256_raw (int x, int y, int len, uint8_t color);
void _gfx_clear256_raw (uint8_t color);
/* Скретч акселератора (_gfx_acc256.c) — общий для hline/vline/clear;
* однопоточно, IRQ выключены между begin/end. */
extern uint8_t _gfx_acc_color;
extern uint8_t _gfx_acc_y;
extern uint8_t _gfx_acc_len; /* 0 = 256 — конвенция акселератора */
extern uint16_t _gfx_acc_addr;
/* Горизонтальный Fill-burst: _gfx_acc_len байт с _gfx_acc_addr на
* строке _gfx_acc_y (W3 замаплен, DI активен). */
void _gfx_hfill256_chunk(void);
/* ---- Raw-примитивы 16 цветов (mode 0x82) -------------------------- */
void _gfx_putpixel16_raw(int x, int y, uint8_t color);
void _gfx_hline16_raw (int x, int y, int len, uint8_t color);
void _gfx_vline16_raw (int x, int y, int len, uint8_t color);
void _gfx_clear16_raw (uint8_t color);
/* Скретч 16-цветных примитивов (_gfx_g16_state.c). */
extern uint8_t _gfx_g16_y;
extern uint8_t _gfx_g16_byte; /* nibble | (nibble<<4) */
extern uint8_t _gfx_g16_nibble; /* цвет в нужной половине байта */
extern uint8_t _gfx_g16_mask; /* маска, сохраняющая ДРУГУЮ половину */
extern uint8_t _gfx_g16_len; /* размер accel-блока (0 = 256) */
extern uint16_t _gfx_g16_addr;
/* Горизонтальный Fill-burst байтами _gfx_g16_byte (_gfx_hfill16.c). */
void _gfx_hfill16_chunk(void);
/* RMW одного нибла по (_gfx_g16_addr, _gfx_g16_y) (_gfx_rmw16.c). */
void _gfx_rmw16_pixel(void);
/* ---- Шрифт (_gfx_font_state.c, _gfx_font_ensure.c) ---------------- *
* Формат: 256 глифов × 8 рядов, INTERLEAVED — offset = row*256 + char;
* биты MSB-first. См. memory/sprinter_font_format. */
#define _GFX_FONT_BYTES 2048
extern uint8_t _gfx_font_buf[_GFX_FONT_BYTES];
extern const uint8_t *_gfx_font_ptr;
extern uint8_t _gfx_font_loaded;
/* Ленивая инициализация: грузит системный шрифт при первом использовании. */
void _gfx_font_ensure(void);
/* ---- Текст 16 цветов: общая машинерия ----------------------------- *
* Данные в _gfx_t16_state.c, рендер ряда в _gfx_render_row16.c,
* pair-таблица в _gfx_t16_pair_build.c. */
extern uint8_t _gfx_t16_y;
extern uint8_t _gfx_t16_row; /* битовый паттерн ряда глифа */
extern uint16_t _gfx_t16_addr; /* VRAM-адрес ряда */
extern uint8_t _gfx_t16_pair[4]; /* LEFT*2+RIGHT → (LEFT<<4)|RIGHT */
/* Отрисовать один 8-пиксельный ряд по pair-таблице (4 записи байт). */
void _gfx_render_row16(void);
/* Заполнить pair-таблицу для пары цветов fg/bg. */
void _gfx_t16_pair_build(uint8_t fg, uint8_t bg);
#endif