diff --git a/docs/size_baseline.tsv b/docs/size_baseline.tsv index 857774d..847f64a 100644 --- a/docs/size_baseline.tsv +++ b/docs/size_baseline.tsv @@ -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 diff --git a/libbgi/_bgi.h b/libbgi/_bgi.h index 19f3b25..cfa0b58 100644 --- a/libbgi/_bgi.h +++ b/libbgi/_bgi.h @@ -25,28 +25,14 @@ #include #include /* 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); каждый примитив использует его вместо константы. */ diff --git a/libbgi/common/getbkcolor.c b/libbgi/common/getbkcolor.c deleted file mode 100644 index 9ce4df6..0000000 --- a/libbgi/common/getbkcolor.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getbkcolor — текущий фоновый цвет. */ -#include "../_bgi.h" - -color_t getbkcolor(void) -{ - return _bgi_bg; -} diff --git a/libbgi/common/getcolor.c b/libbgi/common/getcolor.c deleted file mode 100644 index fc350a4..0000000 --- a/libbgi/common/getcolor.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getcolor — текущий цвет рисования. */ -#include "../_bgi.h" - -color_t getcolor(void) -{ - return _bgi_fg; -} diff --git a/libbgi/common/getmaxcolor.c b/libbgi/common/getmaxcolor.c deleted file mode 100644 index 680a016..0000000 --- a/libbgi/common/getmaxcolor.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getmaxcolor — максимальный индекс цвета (255 в 256-цветном режиме). */ -#include "../_bgi.h" - -color_t getmaxcolor(void) -{ - return _bgi_maxcolor; -} diff --git a/libbgi/common/getmaxx.c b/libbgi/common/getmaxx.c deleted file mode 100644 index 830042e..0000000 --- a/libbgi/common/getmaxx.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getmaxx — максимальная координата X (ширина-1). */ -#include "../_bgi.h" - -int getmaxx(void) -{ - return _bgi_maxx; -} diff --git a/libbgi/common/getmaxy.c b/libbgi/common/getmaxy.c deleted file mode 100644 index a018431..0000000 --- a/libbgi/common/getmaxy.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getmaxy — максимальная координата Y (высота-1). */ -#include "../_bgi.h" - -int getmaxy(void) -{ - return _bgi_maxy; -} diff --git a/libbgi/common/getx.c b/libbgi/common/getx.c deleted file mode 100644 index 5635ae3..0000000 --- a/libbgi/common/getx.c +++ /dev/null @@ -1,7 +0,0 @@ -/* getx — текущая позиция X. */ -#include "../_bgi.h" - -int getx(void) -{ - return _bgi_cx; -} diff --git a/libbgi/common/gety.c b/libbgi/common/gety.c deleted file mode 100644 index 7a17b14..0000000 --- a/libbgi/common/gety.c +++ /dev/null @@ -1,7 +0,0 @@ -/* gety — текущая позиция Y. */ -#include "../_bgi.h" - -int gety(void) -{ - return _bgi_cy; -} diff --git a/libbgi/common/gfx_get_bank.c b/libbgi/common/gfx_get_bank.c deleted file mode 100644 index 8ce444f..0000000 --- a/libbgi/common/gfx_get_bank.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * gfx_get_bank — текущий байт страницы W3 (0x50..0x5F). - */ - -#include "../_bgi.h" - -uint8_t gfx_get_bank(void) -{ - return _gfx_bank; -} diff --git a/libbgi/common/gfx_get_draw_page.c b/libbgi/common/gfx_get_draw_page.c deleted file mode 100644 index c5340e6..0000000 --- a/libbgi/common/gfx_get_draw_page.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * gfx_get_draw_page — кэшированный номер рисуемой страницы (0/1). - */ - -#include "../_bgi.h" - -uint8_t gfx_get_draw_page(void) -{ - return _gfx_draw_page; -} diff --git a/libbgi/common/gfx_get_visible_page.c b/libbgi/common/gfx_get_visible_page.c deleted file mode 100644 index 46d0a14..0000000 --- a/libbgi/common/gfx_get_visible_page.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * gfx_get_visible_page — кэшированный номер видимой страницы (0/1). - */ - -#include "../_bgi.h" - -uint8_t gfx_get_visible_page(void) -{ - return _gfx_visible_page; -} diff --git a/libbgi/common/gfx_set_bank.c b/libbgi/common/gfx_set_bank.c deleted file mode 100644 index 914af9f..0000000 --- a/libbgi/common/gfx_set_bank.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * gfx_set_bank — задать байт страницы W3 (0x50..0x5F) для gfx-записей. - */ - -#include "../_bgi.h" - -void gfx_set_bank(uint8_t bank) -{ - _gfx_bank = bank; -} diff --git a/libbgi/common/graphresult.c b/libbgi/common/graphresult.c deleted file mode 100644 index 4975dad..0000000 --- a/libbgi/common/graphresult.c +++ /dev/null @@ -1,9 +0,0 @@ -/* graphresult — код последней ошибки; вызов сбрасывает его в grOk. */ -#include "../_bgi.h" - -int graphresult(void) -{ - int r = _bgi_result; - _bgi_result = grOk; - return r; -} diff --git a/libbgi/common/moverel.c b/libbgi/common/moverel.c deleted file mode 100644 index 273236b..0000000 --- a/libbgi/common/moverel.c +++ /dev/null @@ -1,8 +0,0 @@ -/* moverel — сдвинуть текущую позицию относительно. */ -#include "../_bgi.h" - -void moverel(int dx, int dy) -{ - _bgi_cx += dx; - _bgi_cy += dy; -} diff --git a/libbgi/common/moveto.c b/libbgi/common/moveto.c deleted file mode 100644 index 8c592da..0000000 --- a/libbgi/common/moveto.c +++ /dev/null @@ -1,8 +0,0 @@ -/* moveto — задать текущую позицию (CP). */ -#include "../_bgi.h" - -void moveto(int x, int y) -{ - _bgi_cx = x; - _bgi_cy = y; -} diff --git a/libbgi/common/setbkcolor.c b/libbgi/common/setbkcolor.c deleted file mode 100644 index 02141c8..0000000 --- a/libbgi/common/setbkcolor.c +++ /dev/null @@ -1,7 +0,0 @@ -/* setbkcolor — задать фоновый цвет (cleardevice, фон текста). */ -#include "../_bgi.h" - -void setbkcolor(color_t color) -{ - _bgi_bg = (uint8_t)color; -} diff --git a/libbgi/common/setcolor.c b/libbgi/common/setcolor.c deleted file mode 100644 index d63aaba..0000000 --- a/libbgi/common/setcolor.c +++ /dev/null @@ -1,7 +0,0 @@ -/* setcolor — задать текущий цвет рисования. */ -#include "../_bgi.h" - -void setcolor(color_t color) -{ - _bgi_fg = (uint8_t)color; -} diff --git a/libbgi/common/setfillstyle.c b/libbgi/common/setfillstyle.c deleted file mode 100644 index 3376f86..0000000 --- a/libbgi/common/setfillstyle.c +++ /dev/null @@ -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; -} diff --git a/libbgi/include/gfx.h b/libbgi/include/gfx.h index d8ffa55..adf2967 100644 --- a/libbgi/include/gfx.h +++ b/libbgi/include/gfx.h @@ -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(); diff --git a/libbgi/include/graphics.h b/libbgi/include/graphics.h index 6833744..57a12ab 100644 --- a/libbgi/include/graphics.h +++ b/libbgi/include/graphics.h @@ -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 — залитый прямоугольник (текущий стиль заливки, без рамки). */