mdview2: статик-кэш статуса в file-scope + сентинел вместо force-флага

render_full_status форсирует перерисовку чисел через local_loading=UCHAR_MAX
(сентинел), а не отдельным force_redraw в условии. Отдельный 4-й терм + запись
флага опрокидывали render_md_status_numbers в IX-стек-фрейм (все локали в
память, +68 Б). Вынос local_* в file-scope разгрузил регистровый аллокатор
SDCC — функция осталась на регистрах. Итог даже меньше базы (28215 Б).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 23:00:22 +03:00
parent fabbc8129c
commit 3a33b30c07
+6 -5
View File
@@ -79,15 +79,16 @@ void status_encoding(void)
bios_write_until(enc_name(g_encoding), 8, 0); bios_write_until(enc_name(g_encoding), 8, 0);
} }
static uint16_t local_total = UINT_MAX;
static uint16_t local_last = UINT_MAX;
static uint8_t local_loading = UCHAR_MAX;
static uint8_t local_pct = UCHAR_MAX;
/* Числовая часть (MD): "L a-b / total" между разделителями + "pct%" справа. /* Числовая часть (MD): "L a-b / total" между разделителями + "pct%" справа.
* Перезаписывает ТОЛЬКО области между/после разделителей, сами │ и фикс. * Перезаписывает ТОЛЬКО области между/после разделителей, сами │ и фикс.
* хром не трогает. */ * хром не трогает. */
void render_md_status_numbers(void) void render_md_status_numbers(void)
{ {
static uint16_t local_total = UINT_MAX;
static uint16_t local_last = UINT_MAX;
static uint8_t local_loading = UCHAR_MAX;
uint16_t total = drawable_lines(); uint16_t total = drawable_lines();
uint16_t last = top_line + VIEW_H; uint16_t last = top_line + VIEW_H;
if (last > total) if (last > total)
@@ -113,12 +114,12 @@ void render_md_status_numbers(void)
/* Полное обновление переменной части (MD): кодировка + числа. */ /* Полное обновление переменной части (MD): кодировка + числа. */
void render_full_status(void) void render_full_status(void)
{ {
local_loading = UCHAR_MAX;
status_encoding(); status_encoding();
render_md_status_numbers(); render_md_status_numbers();
} }
void render_percent_progress(uint8_t pct) { void render_percent_progress(uint8_t pct) {
static uint8_t local_pct = UCHAR_MAX;
if (local_pct != pct) { if (local_pct != pct) {
local_pct = pct; local_pct = pct;
gotoxy(DIV2_X + 2, 0); gotoxy(DIV2_X + 2, 0);