From c9ac0999fd606826736cbae64b6c82513f51978a Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Fri, 10 Jul 2026 21:53:37 +0300 Subject: [PATCH] =?UTF-8?q?libc:=20=D1=82=D0=BE=D0=BD=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B0=D0=BA=D1=81=D0=B5=D1=81=D1=81=D0=BE=D1=80=D1=8B=20?= =?UTF-8?q?=E2=86=92=20inline=20=D0=B2=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=D1=85=20(=D0=BF=D0=BE=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D1=80=D0=BD=D0=BE=D0=BC=D1=83=20=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D1=80=D0=B8=D1=8E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inline (чистый C99 `inline` без static, паттерн из libbgi/5de2f06): textattr, get_text_attr, get/set_putch_raw_mode (conio.h; g_text_attr и pc_raw_mode объявлены публично), isatty (unistd.h — сворачивается в константу при константном fd). Модули удалены (5 шт). «Толстые» кандидаты НЕ инлайнены — критерий проверен замером на 47 программах: feof/ferror/clearerr (тело ~12-15 байт с NULL-проверкой, filetest +56 Б при инлайне) и textcolor/textbackground/set_text_attr (RMW-маски, conio2 +13 Б) остаются модулями — при 2+ сайтах вызова инлайн крупнее call+общее тело. Правило: инлайнить только тела <= ~6 байт на сайте или сворачиваемые константами. Дельты: solidt -94, hello -24, mouse -7, bios_text -7; conio2 +11 (textattr×5 — паритет, принято за скорость). z80.lib SDCC не содержит feof/isatty — маскировки удалённых модулей нет, провал инлайна = ошибка линковки. Проверено в MAME: conio2 (атрибутная матрица), filetest (полный прогон). В size_baseline также вошли gfx_dbuf +608/gfx_demo +25 — это первый чистый релинк run-рендера текста (ba09c0b), не inline. Co-Authored-By: Claude Fable 5 --- docs/size_baseline.tsv | 26 +++++++++++--------------- libc/conio/_conio.h | 8 ++------ libc/conio/get_putch_raw_mode.c | 11 ----------- libc/conio/get_text_attr.c | 10 ---------- libc/conio/set_putch_raw_mode.c | 12 ------------ libc/conio/textattr.c | 11 ----------- libc/include/conio.h | 25 ++++++++++++++++++------- libc/include/stdio.h | 2 ++ libc/include/unistd.h | 5 +++-- libc/io/isatty.c | 16 ---------------- 10 files changed, 36 insertions(+), 90 deletions(-) delete mode 100644 libc/conio/get_putch_raw_mode.c delete mode 100644 libc/conio/get_text_attr.c delete mode 100644 libc/conio/set_putch_raw_mode.c delete mode 100644 libc/conio/textattr.c delete mode 100644 libc/io/isatty.c diff --git a/docs/size_baseline.tsv b/docs/size_baseline.tsv index 847f64a..3870fe4 100644 --- a/docs/size_baseline.tsv +++ b/docs/size_baseline.tsv @@ -1,5 +1,4 @@ # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update -accfill 3963 argv 3431 assrtest 3847 attrprob 4091 @@ -7,42 +6,39 @@ banked 1056 bankedbg 1067 banklocl 4832 banktest 3767 -bgi_img 5931 -bgitest 4053 -bios_text 4470 +bios_text 4463 cat 915 -cblstream 6277 cbltest 6407 cblwav 6486 conio 4634 -conio2 3946 +conio2 3957 dec_test 860 errno 6216 fbench 9040 fdmax 6337 filetest 11624 gets 509 -gfx_dbuf 4770 -gfx_demo 4261 -hello 4176 -hello2 4251 +gfx_dbuf 5378 +gfx_demo 4286 +hello 4170 +hello2 4247 irqtest 5881 ls 4919 malloc 4462 -mdview 19122 -mdview2 27029 +mdview 19118 +mdview2 27036 mem_test 4558 -mouse 4394 +mouse 4387 openenv 6127 ptime 5896 rt_test 4906 seek 4177 simple 963 -solidt 12381 +solidt 12287 stattest 7700 stdlib 6643 stest2 3644 strtest 1340 text_palette 5039 timedir 5471 -winrest 4481 +winrest 4479 diff --git a/libc/conio/_conio.h b/libc/conio/_conio.h index 34c984f..83a668a 100644 --- a/libc/conio/_conio.h +++ b/libc/conio/_conio.h @@ -20,17 +20,13 @@ #include /* two_bytes, KEEP_EXIST_ATTR */ #include -/* Текущий текстовый атрибут: 0x00..0xFF — реальный байт атрибута, - * KEEP_EXIST_ATTR (0xFFFF) — быстрый путь без атрибута. */ -extern two_bytes g_text_attr; +/* g_text_attr (текущий атрибут) и pc_raw_mode объявлены в ПУБЛИЧНОМ + * conio.h (нужны inline-аксессорам textcolor/textattr/…, 2026-07-10). */ /* Позиция курсора: .byte.low = col, .byte.high = row. * Поддерживается gotoxy/wherex/wherey/wherexy и воркерами putch. */ extern two_bytes pc_place; -/* 0 — BS/TAB/LF/CR интерпретируются; 1 — печатаются как глифы. */ -extern uint8_t pc_raw_mode; - /* Прочитать курсор BIOS (rst 8, $8E) в pc_place. */ void _get_cursor(void); diff --git a/libc/conio/get_putch_raw_mode.c b/libc/conio/get_putch_raw_mode.c deleted file mode 100644 index 32bbbdd..0000000 --- a/libc/conio/get_putch_raw_mode.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * get_putch_raw_mode — текущий режим обработки управляющих символов - * putch/cputs (см. set_putch_raw_mode). - */ - -#include "_conio.h" - -uint8_t get_putch_raw_mode(void) -{ - return pc_raw_mode; -} diff --git a/libc/conio/get_text_attr.c b/libc/conio/get_text_attr.c deleted file mode 100644 index 6f26204..0000000 --- a/libc/conio/get_text_attr.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * get_text_attr — текущий 16-битный атрибут conio (см. set_text_attr). - */ - -#include "_conio.h" - -int16_t get_text_attr(void) -{ - return g_text_attr.value; -} diff --git a/libc/conio/set_putch_raw_mode.c b/libc/conio/set_putch_raw_mode.c deleted file mode 100644 index 6dd90ce..0000000 --- a/libc/conio/set_putch_raw_mode.c +++ /dev/null @@ -1,12 +0,0 @@ -/* - * set_putch_raw_mode — режим обработки управляющих символов в - * putch/cputs: 0 — BS/TAB/LF/CR интерпретируются, 1 — все байты - * печатаются как глифы CP437 (см. pc_raw_mode). - */ - -#include "_conio.h" - -void set_putch_raw_mode(uint8_t mode) -{ - pc_raw_mode = mode; -} diff --git a/libc/conio/textattr.c b/libc/conio/textattr.c deleted file mode 100644 index 6e6bd88..0000000 --- a/libc/conio/textattr.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * textattr — заменить атрибут целиком одним байтом (fg | bg | blink). - * Turbo-C-стиль. Сбрасывает KEEP_EXIST_ATTR (старший байт = 0). - */ - -#include "_conio.h" - -void textattr(uint8_t attr) -{ - g_text_attr.value = (uint16_t)attr; -} diff --git a/libc/include/conio.h b/libc/include/conio.h index a562a55..fd004c0 100644 --- a/libc/include/conio.h +++ b/libc/include/conio.h @@ -160,12 +160,23 @@ int settextmode(uint8_t mode); /* 0 OK, -1 + errno on bad mode */ * ------------------------------------------------------------------ */ #define KEEP_EXIST_ATTR 0xFFFF -void textcolor(uint8_t fg); -void textbackground(uint8_t bg); -void textattr(uint8_t attr); +/* Внутреннее состояние (хранилище: libc/conio/_g_text_attr.c и + * _pc_raw_mode.c) — НЕ трогать напрямую, только через функции ниже. + * Объявлено здесь, чтобы ТОНКИЕ аксессоры были inline: чистый C99 + * `inline` БЕЗ static — SDCC инлайнит вызов и не эмитит standalone- + * тело (см. memory/sdcc_inline_codegen_findings). «Толстые» (RMW- + * маски textcolor/textbackground, set_text_attr с возвратом прежнего) + * НЕ inline — замерено: тело 12+ байт при 2+ сайтах вызова крупнее + * call+общее тело (conio2 +13 Б). */ +extern two_bytes g_text_attr; +extern uint8_t pc_raw_mode; -int16_t set_text_attr(int16_t attr); /* returns the previous value */ -int16_t get_text_attr(void); +void textcolor(uint8_t fg); +void textbackground(uint8_t bg); +inline void textattr(uint8_t attr) { g_text_attr.value = (uint16_t)attr; } + +int16_t set_text_attr(int16_t attr); /* возвращает прежнее значение */ +inline int16_t get_text_attr(void) { return g_text_attr.value; } /* Control how putch / cputs / cprintf (the WRCHAR path) treat * control characters (< 0x20): @@ -183,8 +194,8 @@ int16_t get_text_attr(void); * Only affects the WRCHAR path (attr ≤ 0xFF). When attr is * KEEP_EXIST_ATTR, ESTEX's own PUTCHAR/PCHARS rule the cursor and * pc_raw_mode is irrelevant. */ -void set_putch_raw_mode(uint8_t mode); -uint8_t get_putch_raw_mode(void); +inline void set_putch_raw_mode(uint8_t mode) { pc_raw_mode = mode; } +inline uint8_t get_putch_raw_mode(void) { return pc_raw_mode; } /* Sprinter text-mode 03h attribute byte (verified via attr_probe): * bits 0..3 = foreground (0..15) diff --git a/libc/include/stdio.h b/libc/include/stdio.h index 3be1c69..cedf403 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -122,6 +122,8 @@ void rewind(FILE *fp); int fgetpos(FILE *fp, fpos_t *pos); int fsetpos(FILE *fp, const fpos_t *pos); +/* НЕ inline (замерено 2026-07-10, filetest +56 Б): тело с NULL-проверкой + * ~12-15 байт — при 2+ сайтах вызова инлайн крупнее call+общее тело. */ int feof (FILE *fp); int ferror(FILE *fp); void clearerr(FILE *fp); diff --git a/libc/include/unistd.h b/libc/include/unistd.h index e3ca245..ad5b1f8 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -34,8 +34,9 @@ void sleep(unsigned int seconds); void delayms(uint16_t ms); /* 1, если fd — консоль (наши псевдо-fd 0/-1/-2), 0 — файл (любой - * положительный манипулятор DSS; из командной строки они идут с 1). */ -int isatty(int fd); + * положительный манипулятор DSS; из командной строки они идут с 1). + * inline без static — см. memory/sdcc_inline_codegen_findings. */ +inline int isatty(int fd) { return fd <= 0; } /* Directory operations (ESTEX $1B-$1E). All return 0 on success and -1 * with errno set on failure; getcwd returns the buffer on success or NULL. diff --git a/libc/io/isatty.c b/libc/io/isatty.c deleted file mode 100644 index b38b7de..0000000 --- a/libc/io/isatty.c +++ /dev/null @@ -1,16 +0,0 @@ -/* - * isatty — 1, если fd указывает на консоль, 0 — на файл. - * - * Консольные псевдо-fd наших stdin/stdout/stderr: 0, -1, -2 - * (см. libc/file/std_streams.c). Все положительные fd — файловые - * манипуляторы DSS: из командной строки DSS нумерация начинается - * с 1, под Flex Navigator — с 2 (fd 1 держит сам навигатор), т.е. - * fd == 1 может быть обычным файлом. - */ - -#include - -int isatty(int fd) -{ - return fd <= 0; -}