mdview2: percent на 16-битной арифметике (убрать __divulong)

calc_md_pct/calc_raw_pct тянули 32-битное деление __divulong (+__muluint2ulong)
ради показа процента в статусе. Оба дают операнды ≤16 бит (≤18432 / ≤1024),
переполняет только *100. Новый pct16() масштабирует оба вниз и считает долю
циклом-вычитанием — 66 Б, НОЛЬ подтянутых арифм-хелперов. Точность ±1%
(на границах точно), для индикатора прокрутки незаметно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 23:00:14 +03:00
parent 977e2d3d4a
commit fabbc8129c
4 changed files with 23 additions and 6 deletions
+4 -5
View File
@@ -161,15 +161,14 @@ static uint32_t raw_prev(uint32_t off)
/* ---- статус-бар: % по байтам (отрисовка — render_raw_status_numbers
* в mdview2_status.c, читает позицию через этот raw_pct) ---- */
/* Процент по байтам без 32-битного деления: масштабируем offset'ы (>>8),
* дальше 32-битная арифметика. raw_top приватен модулю, поэтому % считаем
* здесь и отдаём готовым числом в статус-модуль. */
/* Процент по байтам без 32-битного деления: масштабируем offset'ы (>>8
* ≤1024), дальше 16-битный pct16 (без __divulong). raw_top приватен модулю,
* поэтому % считаем здесь и отдаём готовым числом в статус-модуль. */
uint8_t calc_raw_pct(void)
{
uint16_t a = (uint16_t)(raw_top >> 8);
uint16_t b = (uint16_t)(file_size >> 8);
if (b == 0) return 0; /* файл < 1 КБ */
return (uint8_t)(a * 100UL / b);
return pct16(a, b); /* den==0 (файл < 1 КБ) → pct16 вернёт 0 */
}
/* ---- посев позиции / пересев при смене активного буфера ----------- */