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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user