libbgi: тривиальные аксессоры → inline в заголовках (17 модулей удалено)

setcolor/getcolor/setbkcolor/getbkcolor/getmaxx/getmaxy/getmaxcolor/
getx/gety/moveto/moverel/setfillstyle/graphresult (graphics.h) и
gfx_get_bank/gfx_set_bank/gfx_get_draw_page/gfx_get_visible_page
(gfx.h) определены inline в публичных заголовках; state-переменные
объявлены там же (хранилище прежнее — _bgi_state.c/_gfx_state.c).

Именно `inline` БЕЗ static: проверено артефактами (.asm) — SDCC 4.5
инлайнит вызов при всех наших флагах (--opt-code-size/--opt-code-speed/
--max-allocs) и не эмитит standalone-тело; `static inline` эмитил бы
мёртвую копию каждого аксессора в КАЖДЫЙ включивший модуль.  Отказ
инлайнить = громкая ошибка линковки (все 47 программ слинковались).

Экономия ~30-40Т на вызов, минус 17 .rel; по _CODE размер-нейтрально
(сайт вызова ≈ телу).  size_baseline: bgitest +267/accfill +528 — это
НЕ inline, а run-рендер текста из ba09c0b (draw_scaled потянул
vspan_raw+vfill256 и сам вырос) — цена за ~2-6× скорость текста.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 21:21:26 +03:00
parent ba09c0bd05
commit 5de2f06cfb
21 changed files with 58 additions and 176 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
# Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
accfill 3435
accfill 3963
argv 3431
assrtest 3847
attrprob 4091
@@ -8,7 +8,7 @@ bankedbg 1067
banklocl 4832
banktest 3767
bgi_img 5931
bgitest 3786
bgitest 4053
bios_text 4470
cat 915
cblstream 6277
1 # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
2 accfill
3 argv
4 assrtest
5 attrprob
8 banklocl
9 banktest
10 bgi_img
11 bgitest
12 bios_text
13 cat
14 cblstream
+7 -21
View File
@@ -25,28 +25,14 @@
#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) */
/* ---- Состояние BGI (_bgi_state.c) -------------------------------- *
* _bgi_fg/_bgi_bg/_bgi_cx/_bgi_cy/_bgi_maxx/_bgi_maxy/_bgi_maxcolor/
* _bgi_result объявлены в ПУБЛИЧНОМ graphics.h (нужны static inline
* аксессорам: setcolor/moveto/getmaxx/…, 2026-07-10);
* _gfx_visible_page/_gfx_draw_page/_gfx_bank — в публичном gfx.h.
* Байт _gfx_bank (0x50..0x5F): какой видеобанк мапится при записи —
* 0x50 normal, 0x54 temp, 0x58 transparent, 0x5C оба. */
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); каждый примитив использует его вместо константы. */
-7
View File
@@ -1,7 +0,0 @@
/* getbkcolor — текущий фоновый цвет. */
#include "../_bgi.h"
color_t getbkcolor(void)
{
return _bgi_bg;
}
-7
View File
@@ -1,7 +0,0 @@
/* getcolor — текущий цвет рисования. */
#include "../_bgi.h"
color_t getcolor(void)
{
return _bgi_fg;
}
-7
View File
@@ -1,7 +0,0 @@
/* getmaxcolor — максимальный индекс цвета (255 в 256-цветном режиме). */
#include "../_bgi.h"
color_t getmaxcolor(void)
{
return _bgi_maxcolor;
}
-7
View File
@@ -1,7 +0,0 @@
/* getmaxx — максимальная координата X (ширина-1). */
#include "../_bgi.h"
int getmaxx(void)
{
return _bgi_maxx;
}
-7
View File
@@ -1,7 +0,0 @@
/* getmaxy — максимальная координата Y (высота-1). */
#include "../_bgi.h"
int getmaxy(void)
{
return _bgi_maxy;
}
-7
View File
@@ -1,7 +0,0 @@
/* getx — текущая позиция X. */
#include "../_bgi.h"
int getx(void)
{
return _bgi_cx;
}
-7
View File
@@ -1,7 +0,0 @@
/* gety — текущая позиция Y. */
#include "../_bgi.h"
int gety(void)
{
return _bgi_cy;
}
-10
View File
@@ -1,10 +0,0 @@
/*
* gfx_get_bank — текущий байт страницы W3 (0x50..0x5F).
*/
#include "../_bgi.h"
uint8_t gfx_get_bank(void)
{
return _gfx_bank;
}
-10
View File
@@ -1,10 +0,0 @@
/*
* gfx_get_draw_page — кэшированный номер рисуемой страницы (0/1).
*/
#include "../_bgi.h"
uint8_t gfx_get_draw_page(void)
{
return _gfx_draw_page;
}
-10
View File
@@ -1,10 +0,0 @@
/*
* gfx_get_visible_page — кэшированный номер видимой страницы (0/1).
*/
#include "../_bgi.h"
uint8_t gfx_get_visible_page(void)
{
return _gfx_visible_page;
}
-10
View File
@@ -1,10 +0,0 @@
/*
* gfx_set_bank — задать байт страницы W3 (0x50..0x5F) для gfx-записей.
*/
#include "../_bgi.h"
void gfx_set_bank(uint8_t bank)
{
_gfx_bank = bank;
}
-9
View File
@@ -1,9 +0,0 @@
/* graphresult — код последней ошибки; вызов сбрасывает его в grOk. */
#include "../_bgi.h"
int graphresult(void)
{
int r = _bgi_result;
_bgi_result = grOk;
return r;
}
-8
View File
@@ -1,8 +0,0 @@
/* moverel — сдвинуть текущую позицию относительно. */
#include "../_bgi.h"
void moverel(int dx, int dy)
{
_bgi_cx += dx;
_bgi_cy += dy;
}
-8
View File
@@ -1,8 +0,0 @@
/* moveto — задать текущую позицию (CP). */
#include "../_bgi.h"
void moveto(int x, int y)
{
_bgi_cx = x;
_bgi_cy = y;
}
-7
View File
@@ -1,7 +0,0 @@
/* setbkcolor — задать фоновый цвет (cleardevice, фон текста). */
#include "../_bgi.h"
void setbkcolor(color_t color)
{
_bgi_bg = (uint8_t)color;
}
-7
View File
@@ -1,7 +0,0 @@
/* setcolor — задать текущий цвет рисования. */
#include "../_bgi.h"
void setcolor(color_t color)
{
_bgi_fg = (uint8_t)color;
}
-8
View File
@@ -1,8 +0,0 @@
/* setfillstyle — задать паттерн и цвет заливки (bar/fillpoly/…). */
#include "../_bgi.h"
void setfillstyle(int pattern, color_t color)
{
_bgi_fill_pattern = (uint8_t)pattern;
_bgi_fill_color = (uint8_t)color;
}
+8 -4
View File
@@ -38,12 +38,16 @@
#define GFX_COLORS_16 16
/* ---- Page selection (double-buffering) and bank control ---------- */
/* Внутреннее состояние (хранилище: libbgi/common/_gfx_state.c) — НЕ
* трогать напрямую, только через функции ниже. */
extern uint8_t _gfx_visible_page, _gfx_draw_page, _gfx_bank;
void gfx_set_visible_page(uint8_t page); /* 0 or 1 */
uint8_t gfx_get_visible_page(void);
inline uint8_t gfx_get_visible_page(void) { return _gfx_visible_page; }
void gfx_set_draw_page(uint8_t page); /* 0 or 1 */
uint8_t gfx_get_draw_page(void);
void gfx_set_bank(uint8_t bank); /* 0x50..0x5F */
uint8_t gfx_get_bank(void);
inline uint8_t gfx_get_draw_page(void) { return _gfx_draw_page; }
inline void gfx_set_bank(uint8_t bank) { _gfx_bank = bank; } /* 0x50..0x5F */
inline uint8_t gfx_get_bank(void) { return _gfx_bank; }
/* Block until the next frame (50 Hz). Типичный double-buffer:
* gfx_set_draw_page(hidden); draw_frame(); gfx_wait_vsync();
+41 -13
View File
@@ -41,6 +41,21 @@ typedef uint8_t color_t;
#define grNoInitGraph (-1)
#define grError (-11)
/* ---- Внутреннее состояние BGI ------------------------------------- *
* НЕ трогать напрямую — только через функции ниже. Объявлено здесь,
* чтобы тривиальные аксессоры были inline (без call/ret и без
* .rel-модуля на каждый геттер). Именно `inline` БЕЗ static: SDCC
* инлайнит вызов и НЕ эмитит standalone-тело (static inline эмитил бы
* мёртвую копию в каждый включивший модуль — проверено 2026-07-10);
* если SDCC когда-нибудь откажется инлайнить — будет громкая ошибка
* линковки, не тихая деградация. Хранилище — libbgi/common/
* _bgi_state.c и _bgi_fill_state.c. */
extern uint8_t _bgi_fg, _bgi_bg;
extern int _bgi_cx, _bgi_cy;
extern int _bgi_maxx, _bgi_maxy, _bgi_maxcolor;
extern int _bgi_result;
extern uint8_t _bgi_fill_pattern, _bgi_fill_color;
/* ---- Setup / teardown -------------------------------------------- */
/* Перейти в графический режим (для этой либы — 320×256×256), загрузить
@@ -52,21 +67,28 @@ void initgraph(void);
void closegraph(void);
/* Код последней ошибки; вызов сбрасывает его в grOk (как в BGI). */
int graphresult(void);
inline int graphresult(void)
{
int r = _bgi_result;
_bgi_result = grOk;
return r;
}
/* Очистить экран фоновым цветом и вернуть позицию в (0,0). */
void cleardevice(void);
/* ---- Границы и цвета --------------------------------------------- */
int getmaxx(void); /* 319 */
int getmaxy(void); /* 255 */
color_t getmaxcolor(void); /* 255 */
inline int getmaxx(void) { return _bgi_maxx; } /* 319 */
inline int getmaxy(void) { return _bgi_maxy; } /* 255 */
inline color_t getmaxcolor(void) { return (color_t)_bgi_maxcolor; } /* 255 */
void setcolor(color_t color); /* текущий цвет рисования */
color_t getcolor(void);
void setbkcolor(color_t color); /* фоновый цвет (для cleardevice/текста) */
color_t getbkcolor(void);
/* текущий цвет рисования */
inline void setcolor(color_t color) { _bgi_fg = (uint8_t)color; }
inline color_t getcolor(void) { return _bgi_fg; }
/* фоновый цвет (для cleardevice/текста) */
inline void setbkcolor(color_t color) { _bgi_bg = (uint8_t)color; }
inline color_t getbkcolor(void) { return _bgi_bg; }
/* ---- Точки ------------------------------------------------------- */
@@ -75,10 +97,12 @@ color_t getpixel(int x, int y);
/* ---- Текущая позиция и линии ------------------------------------- */
void moveto(int x, int y); /* задать текущую позицию (CP) */
void moverel(int dx, int dy); /* сдвинуть CP относительно */
int getx(void);
int gety(void);
/* задать текущую позицию (CP) */
inline void moveto(int x, int y) { _bgi_cx = x; _bgi_cy = y; }
/* сдвинуть CP относительно */
inline void moverel(int dx, int dy) { _bgi_cx += dx; _bgi_cy += dy; }
inline int getx(void) { return _bgi_cx; }
inline int gety(void) { return _bgi_cy; }
void lineto(int x, int y); /* линия CP→(x,y), CP := (x,y) */
void linerel(int dx, int dy); /* линия CP→CP+(dx,dy), CP сдвигается */
@@ -124,7 +148,11 @@ enum {
struct fillsettingstype { int pattern; color_t color; };
void setfillstyle(int pattern, color_t color);
inline void setfillstyle(int pattern, color_t color)
{
_bgi_fill_pattern = (uint8_t)pattern;
_bgi_fill_color = (uint8_t)color;
}
void getfillsettings(struct fillsettingstype *fillinfo);
/* bar — залитый прямоугольник (текущий стиль заливки, без рамки). */