25cb7ba554
Растровые образы: imagesize (4 байта заголовка w,h + w*h пикселей), getimage (захват прямоугольника), putimage с COPY/XOR/OR/AND/NOT_PUT. Блит идёт raw в одной W3-скобке — добавлен _gfx_getpixel256_raw в gfx + leaf _bgi_read_raw в drv256. Проверено в MAME (tests/bgitest): захват спрайта, 3 COPY-копии, XOR/OR/COPY поверх фона. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
111 lines
5.0 KiB
C
111 lines
5.0 KiB
C
/*
|
||
* _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);
|
||
uint8_t _gfx_getpixel256_raw(int x, int y);
|
||
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
|