From 40e896a73d57f55f4d018a0017dd12b1a5b436b0 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Fri, 10 Jul 2026 19:35:32 +0300 Subject: [PATCH] =?UTF-8?q?libbgi:=20=D1=84=D0=B8=D0=BA=D1=81=20=D1=83?= =?UTF-8?q?=D1=82=D0=B5=D1=87=D0=BA=D0=B8=20W3-=D1=81=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B2=20bar()=20+=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=20=5Fbgi=5Fread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bar(): rectfill-ветки выходили ранним return без _bgi_end() — W3 оставался замаплен на видеобанк после каждого bar() со сплошной заливкой. _bgi_read дублировал getpixel (та же композиция begin+read_raw+end); единственный потребитель floodfill переведён на getpixel, модуль удалён. getpixel.c: убраны мёртвые статики _gp_* (остались от до-register версии). Co-Authored-By: Claude Fable 5 --- libbgi/_bgi.h | 19 +++++++++++-------- libbgi/bgi256/getpixel.c | 14 +++++--------- libbgi/common/_bgi_read.c | 16 ---------------- libbgi/common/bar.c | 7 +++---- libbgi/common/floodfill.c | 4 ++-- 5 files changed, 21 insertions(+), 39 deletions(-) delete mode 100644 libbgi/common/_bgi_read.c diff --git a/libbgi/_bgi.h b/libbgi/_bgi.h index 8205397..19f3b25 100644 --- a/libbgi/_bgi.h +++ b/libbgi/_bgi.h @@ -72,17 +72,20 @@ void _bgi_end(void) __preserves_regs(b,c,d,e,h,l); 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); /* заливка экрана, без скобки */ +/* __preserves_regs(d,e): проверено по asm — эти примитивы читают D/E + * (y приходит в DE), но НЕ пишут; SDCC не обязан спасать DE вокруг + * вызова (экономит push/pop в горячих циклах Брезенхэма/блита). + * При правке asm сверять клоббер-лист заново! */ +void _bgi_plot_raw (int x, int y, uint8_t color) __preserves_regs(d,e); /* точка, без скобки */ +uint8_t _bgi_read_raw (int x, int y) __preserves_regs(d,e); /* чтение, без скобки */ +void _bgi_hspan_raw(int x, int y, int len, uint8_t color) __preserves_regs(d,e); /* H-отрезок, без скобки */ +void _bgi_vspan_raw(int x, int y, int len, uint8_t color) __preserves_regs(d,e); /* 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); + * Разовое чтение пикселя — публичный getpixel (та же композиция; + * бывший дубликат _bgi_read удалён 2026-07-10). */ void _bgi_hspan (int x, int y, int len, uint8_t color); void _bgi_clearall(uint8_t color); diff --git a/libbgi/bgi256/getpixel.c b/libbgi/bgi256/getpixel.c index 41b1b7f..d7bb5ec 100644 --- a/libbgi/bgi256/getpixel.c +++ b/libbgi/bgi256/getpixel.c @@ -1,21 +1,17 @@ /* - * getpixel (bgi256) — цвет пикселя (x,y), mode 0x81. Полностью inline - * (bounds + W3-скобка + чтение пикселя), без вызовов _bgi_read/raw. - * Возвращает 0 вне экрана. + * getpixel (bgi256) — цвет пикселя (x,y), mode 0x81: bounds-check + + * W3-скобка + _bgi_read_raw. Возвращает 0 вне экрана. + * `register` на локали — возврат идёт регистрами, без скретча в _DATA. */ #include "../_bgi.h" -static uint8_t _gp_y; -static uint16_t _gp_addr; -static uint8_t _gp_color; - color_t getpixel(int x, int y) { #ifndef GFX_NOCHECK if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return 0; #endif _bgi_begin(); - register uint8_t _gp_color = _bgi_read_raw(x, y); + register uint8_t c = _bgi_read_raw(x, y); _bgi_end(); - return _gp_color; + return c; } diff --git a/libbgi/common/_bgi_read.c b/libbgi/common/_bgi_read.c deleted file mode 100644 index c00d7fa..0000000 --- a/libbgi/common/_bgi_read.c +++ /dev/null @@ -1,16 +0,0 @@ -/* - * _bgi_read — цвет пикселя (x,y), self-bracket (своя W3-скобка). - * Для разовых чтений из математики, которой не нужен пакетный режим - * (floodfill). getpixel тоже зовёт это. Реальная композиция - * _bgi_begin + _bgi_read_raw + _bgi_end — не обёртка над обёрткой. - */ -#include "../_bgi.h" - -unsigned _bgi_read(int x, int y) -{ - register unsigned c; - _bgi_begin(); - c = _bgi_read_raw(x, y); - _bgi_end(); - return c; -} diff --git a/libbgi/common/bar.c b/libbgi/common/bar.c index f557c64..529b673 100644 --- a/libbgi/common/bar.c +++ b/libbgi/common/bar.c @@ -12,15 +12,14 @@ void bar(int left, int top, int right, int bottom) if (bottom < top) { t = top; top = bottom; bottom = t; } _bgi_begin(); - if (_bgi_fill_pattern == EMPTY_FILL) { - _gfx_rectfill256(left, top, right - left + 1, bottom - top + 1, _bgi_bg); return; + if (_bgi_fill_pattern == EMPTY_FILL) { + _gfx_rectfill256(left, top, right - left + 1, bottom - top + 1, _bgi_bg); } else if (_bgi_fill_pattern == SOLID_FILL || _bgi_fill_pattern == USER_FILL || _bgi_fill_pattern > CLOSE_DOT_FILL) { _gfx_rectfill256(left, top, right - left + 1, bottom - top + 1, _bgi_fill_color); - return; } else { for (y = top; y <= bottom; y++) _bgi_fill_span(left, right, y); } - _bgi_end(); + _bgi_end(); /* ранний return здесь ЗАПРЕЩЁН — течёт W3-скобка */ } diff --git a/libbgi/common/floodfill.c b/libbgi/common/floodfill.c index 96aa892..bcaad48 100644 --- a/libbgi/common/floodfill.c +++ b/libbgi/common/floodfill.c @@ -7,7 +7,7 @@ * заливки (иначе не сойдётся). Паттерн в floodfill не применяется — * заливаем сплошным _bgi_fill_color (упрощение). * - * Чтение/запись — self-bracket (_bgi_read/_bgi_hspan): чуть медленнее, + * Чтение/запись — self-bracket (getpixel/_bgi_hspan): чуть медленнее, * зато не держим DI на всю (возможно большую) заливку. * * Стек затравок ограничен FF_STACK; при переполнении лишние затравки @@ -27,7 +27,7 @@ static int ff_stop(int x, int y, int border) { int c; if (x < 0 || x > _bgi_maxx || y < 0 || y > _bgi_maxy) return 1; - c = _bgi_read(x, y); + c = getpixel(x, y); return (c == border || c == _bgi_fill_color); }