/* * _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_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