52636a5d6e
Графика вынесена из libc/ в новую библиотеку libbgi/:
- common/ — mode-agnostic математика и состояние (один исходник,
.rel попадает в оба driver-архива);
- bgi256/ + bgi16/ — mode-specific leaf'ы (raw-плот/чтение/спаны);
- include/ — graphics.h + gfx.h; _bgi.h — внутренний заголовок.
Собираются lib/bgi256.lib (и bgi16.lib в Фазе 2); выбор режима
линковкой через sprinter-cc --gfx 256|16. libc/ теперь без графики.
tests/bgi_img — тест спрайтов getimage/putimage/imagesize (5 операций
COPY/XOR/OR/AND/NOT + XOR-round-trip + self-check imagesize).
Проверен автотестом в MAME.
Примечание: make size-check пока красный (gfx_dbuf/gfx_demo выросли
после реорга) — закрыть по завершении миграции libbgi.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
198 lines
11 KiB
C
198 lines
11 KiB
C
/*
|
||
* _bgi.h — внутренности графической подсистемы BGI (НЕ публичный заголовок).
|
||
*
|
||
* Слияние старых libc/bgi/_bgi.h и libc/gfx/_gfx.h. Графика вынесена из
|
||
* libc в самостоятельную библиотеку libbgi/ (см. docs + memory
|
||
* bgi_two_lib_design). Из libbgi собираются две driver-библиотеки
|
||
* (каждый .c → отдельный .rel):
|
||
* bgi256.lib ← common/ + bgi256/ (320×256×256, mode 0x81)
|
||
* bgi16.lib ← common/ + bgi16/ (640×256×16, mode 0x82)
|
||
* common/ — mode-agnostic: .rel компилируется ОДИН раз и кладётся в
|
||
* ОБА архива (один исходник для функций, общих 256- и 16-цветной
|
||
* версиям). bgi256/ и bgi16/ — mode-specific leaf'ы (реальные
|
||
* реализации, БЕЗ обёрток-делегатов). Режим выбирается линковкой
|
||
* (--gfx 256 / --gfx 16), одновременно один.
|
||
*
|
||
* Публичные leaf-символы (_bgi_plot_raw, _bgi_hspan_raw, _bgi_read_raw,
|
||
* _bgi_vspan_raw, _bgi_clear_raw, _bgi_mode_set) одинаково объявлены в
|
||
* обоих driver-каталогах, поэтому common-математика не знает режима —
|
||
* нужный .rel тянет линкер из выбранной библиотеки.
|
||
*/
|
||
#ifndef _BGI_INTERNAL_H
|
||
#define _BGI_INTERNAL_H
|
||
|
||
#include <stdint.h>
|
||
#include <graphics.h>
|
||
#include <gfx.h> /* GFX_MODE_*, размеры — для внутренних таблиц */
|
||
|
||
/* ---- Состояние BGI (_bgi_state.c) -------------------------------- */
|
||
extern uint8_t _bgi_fg; /* текущий цвет рисования */
|
||
extern uint8_t _bgi_bg; /* фоновый цвет */
|
||
extern int _bgi_cx; /* текущая позиция X (CP) */
|
||
extern int _bgi_cy; /* текущая позиция Y */
|
||
extern int _bgi_maxx; /* правая граница (319 / 639) */
|
||
extern int _bgi_maxy; /* нижняя граница (255) */
|
||
extern int _bgi_maxcolor; /* макс. индекс цвета (255 / 15) */
|
||
extern uint8_t _bgi_prevmode; /* видеорежим до initgraph */
|
||
extern int _bgi_result; /* код graphresult */
|
||
|
||
/* ---- Общее gfx-состояние (common/_gfx_state.c) ------------------ *
|
||
* Пишут gfx_set_visible_page / gfx_set_draw_page /
|
||
* gfx_set_bank; читают все mode-специфичные примитивы. */
|
||
|
||
extern uint8_t _gfx_visible_page;
|
||
extern uint8_t _gfx_draw_page;
|
||
|
||
/* Байт страницы W3 (0x50..0x5F) — какой видеобанк мапится при записи.
|
||
* См. memory/sprinter_vram_transparency.md (0x50 normal, 0x54 temp,
|
||
* 0x58 transparent, 0x5C оба). */
|
||
extern uint8_t _gfx_bank;
|
||
|
||
/* CPU-адрес колонки 0 текущей draw-страницы: 0xC000 (page 0) или
|
||
* 0xC140 (page 1); каждый примитив использует его вместо константы. */
|
||
extern uint16_t _gfx_addr_base;
|
||
|
||
/* ---- Низкоуровневый видеорежим (libc/video) ---------------------- */
|
||
uint8_t _videomode_raw_get(void);
|
||
int _videomode_raw_set(uint8_t mode);
|
||
|
||
/* ---- W3-скобки (common/_bgi_begin.c, _bgi_end.c) ----------------- *
|
||
* begin: DI + сохранить текущий W3 и замапить _gfx_bank;
|
||
* end: восстановить W3 + EI. Не реентерабельно (сейв в статике). */
|
||
|
||
extern uint8_t _gfx_saved_w3;
|
||
|
||
void _bgi_begin(void);
|
||
void _bgi_end(void);
|
||
|
||
/* ---- LEAF-операции драйвера (bgi256/ или bgi16/) ----------------- *
|
||
* Каждая self-contained: raw-варианты НЕ ставят свою W3-скобку
|
||
* (вызывающий обязан обернуть в _bgi_begin/_bgi_end); self-bracket
|
||
* (_bgi_read/_bgi_hspan/_bgi_clearall) ставят скобку сами. */
|
||
|
||
uint8_t _bgi_mode_set(void); /* войти в режим + палитра + границы */
|
||
|
||
void _bgi_plot_raw (int x, int y, uint8_t color); /* точка, без скобки */
|
||
uint8_t _bgi_read_raw (int x, int y); /* чтение, без скобки */
|
||
void _bgi_hspan_raw(int x, int y, int len, uint8_t color); /* H-отрезок, без скобки */
|
||
void _bgi_vspan_raw(int x, int y, int len, uint8_t color); /* V-отрезок, без скобки */
|
||
void _bgi_clear_raw(uint8_t color); /* заливка экрана, без скобки */
|
||
|
||
/* Self-bracket версии (begin + raw + end) — для разовых вызовов из
|
||
* математики, которой не нужен пакетный режим (floodfill, cleardevice).
|
||
* _bgi_read возвращает цвет пикселя как unsigned (в SDCC __sdcccall(1)
|
||
* 8-битный возврат идёт в A, расширяется до int). */
|
||
unsigned _bgi_read (int x, int y);
|
||
void _bgi_hspan (int x, int y, int len, uint8_t color);
|
||
void _bgi_clearall(uint8_t color);
|
||
|
||
/* ---- Скретч акселератора 256 (bgi256/_gfx_acc256.c) -------------- *
|
||
* Общий для hspan/vspan/clear; однопоточно, IRQ выключены между
|
||
* _bgi_begin/_bgi_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);
|
||
|
||
/* ---- Скретч 16-цветных примитивов (bgi16/_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 (bgi16/_gfx_hfill16.c). */
|
||
void _gfx_hfill16_chunk(void);
|
||
|
||
/* RMW одного нибла по (_gfx_g16_addr, _gfx_g16_y) (bgi16/_gfx_rmw16.c). */
|
||
void _gfx_rmw16_pixel(void);
|
||
|
||
/* ---- Шрифт (common/_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);
|
||
|
||
/* 8 байт строк глифа c (грузит шрифт при первом использовании) —
|
||
* mode-agnostic, просто читает _gfx_font_ptr. common/_bgi_font_rows.c. */
|
||
void _bgi_font_rows(unsigned char c, uint8_t *rows8);
|
||
|
||
/* ---- Тригонометрия для дуг (common/_bgi_trig.c) ------------------ *
|
||
* Угол в градусах; результат sin/cos × 128 (Q7 — чтобы радиус×значение
|
||
* влезало в int без 32-бит арифметики). */
|
||
int _bgi_sin128(int deg);
|
||
int _bgi_cos128(int deg);
|
||
|
||
/* Общий рисователь дуги/контура эллипса (common/_bgi_arc_draw.c):
|
||
* полилиния по точкам от stangle до endangle с полуосями xr,yr вокруг
|
||
* (cx,cy). */
|
||
void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle,
|
||
int xr, int yr, uint8_t color);
|
||
|
||
/* Целочисленный sqrt (0..~32767) для fillellipse (common/_bgi_isqrt.c). */
|
||
int _bgi_isqrt(int n);
|
||
|
||
/* ---- Состояние линий (common/_bgi_line_state.c) ------------------ */
|
||
extern uint8_t _bgi_line_style; /* SOLID_LINE..USERBIT_LINE */
|
||
extern uint8_t _bgi_line_thick; /* 1 (NORM) или 3 (THICK) */
|
||
extern uint16_t _bgi_line_pattern; /* маска для USERBIT_LINE */
|
||
|
||
/* Отрезок текущим стилем/толщиной линии (common/_bgi_styled_line.c). */
|
||
void _bgi_styled_line(int x0, int y0, int x1, int y1, uint8_t color);
|
||
|
||
/* Отрезок (x0,y0)->(x1,y1) БЕЗ стиля: ортогонал → hspan/vspan,
|
||
* диагональ → Брезенхэм over _bgi_plot_raw, своя W3-скобка
|
||
* (common/_bgi_lineseg.c). Реальная логика, не обёртка. */
|
||
void _bgi_lineseg(int x0, int y0, int x1, int y1, uint8_t color);
|
||
|
||
/* ---- Состояние заливки (common/_bgi_fill_state.c) ---------------- */
|
||
extern uint8_t _bgi_fill_pattern; /* *_FILL */
|
||
extern uint8_t _bgi_fill_color;
|
||
|
||
/* Залить строку [x0..x1] на y ТЕКУЩИМ стилем заливки (паттерн+цвет),
|
||
* с клипом по экрану. Вызывать между _bgi_begin/_bgi_end. */
|
||
void _bgi_fill_span(int x0, int x1, int y);
|
||
|
||
/* ---- Стиль текста (common/_bgi_text_state.c) --------------------- */
|
||
extern uint8_t _bgi_text_dir; /* HORIZ_DIR / VERT_DIR */
|
||
extern uint8_t _bgi_text_size; /* масштаб 1..10 */
|
||
|
||
/* Нарисовать строку s в (x,y) текущим стилем текста (масштаб/направление,
|
||
* цвет _bgi_fg, прозрачный фон) — common/_bgi_draw_scaled.c. */
|
||
void _bgi_draw_scaled(int x, int y, const char *s);
|
||
|
||
/* ---- Скан-таблицы min/max X по строкам для fillpoly -------------- *
|
||
* (common/_bgi_poly_state.c). GFX_HEIGHT — высота экрана (256 в обоих
|
||
* режимах), см. <gfx.h>. */
|
||
extern int _bgi_span_min[GFX_HEIGHT];
|
||
extern int _bgi_span_max[GFX_HEIGHT];
|
||
|
||
/* Прогнать ребро (Брезенхэм) обновляя _bgi_span_min/max
|
||
* (common/_bgi_poly_edge.c). */
|
||
void _bgi_poly_edge(int x0, int y0, int x1, int y1);
|
||
|
||
/* ---- Cross-library: внутренние символы libc/cbl ------------------ *
|
||
* libbgi ВСЕГДА линкуется вместе с libc (sprinter.lib), поэтому
|
||
* зависимость от внутренних символов libc допустима. gfx_wait_vsync
|
||
* держит bit7 порта 0x004E через рефкаунт _cbl_port_ref/unref, чтобы
|
||
* бит 5 порта 0xFE (позиция луча) был доступен.
|
||
* ВНИМАНИЕ: это ВНУТРЕННИЕ символы libc/cbl — при изменении сигнатур
|
||
* СВЕРЯТЬ с libc/cbl/_cbl.h и синхронизировать. (По тому же паттерну,
|
||
* каким здесь живут _videomode_raw_* из libc/video.) */
|
||
extern void _cbl_port_ref(void);
|
||
extern void _cbl_port_unref(void);
|
||
|
||
#endif
|