mdview2: единая позиция при переключениях F2 (MD↔RAW) и F8 (8bit↔UTF-8)
Валюта позиции — байт-offset активного буфера: - line_at_off(off): обратный перевод offset → MD-строка (бинарный поиск по seg_off, оффсеты сегментов монотонны); - map_off(off, from, to): пропорциональный перенос позиции между буферами разного размера — один цикл restoring-деления, без __mullong/__divulong, точность from/65536; - raw_pos()/raw_reanchor(off) в RAW-модуле; raw_seed_from через reanchor, raw_home стал приватным (только клавиша Home). F2 RAW→MD: top_line = line_at_off(raw_pos()) — точное позиционирование. F8 между готовыми наборами: view_pos → map_off → view_reanchor вместо восстановления сохранённой позиции набора. Ленивая сборка — по-прежнему с начала (в RAW с raw_reanchor(0) и откатом при неудаче). Попутно: F8 в RAW-режиме больше не рисует MD-вид поверх RAW — перерисовка по g_view. exe 25100 → 25725 (+625). Проверено в MAME. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -98,6 +98,20 @@ uint32_t seg_off(uint16_t idx)
|
||||
return r.off;
|
||||
}
|
||||
|
||||
/* Последняя строка индекса с исходным offset <= off — обратный перевод
|
||||
* байт-позиции в MD-строку (позиционирование при F2/F8). Оффсеты сегментов
|
||||
* монотонны, поэтому бинарный поиск (~15 bank-чтений). */
|
||||
uint16_t line_at_off(uint32_t off)
|
||||
{
|
||||
uint16_t lo = 0, hi = n_lines;
|
||||
while (lo < hi) {
|
||||
uint16_t mid = (uint16_t)((lo + hi) >> 1);
|
||||
if (seg_off(mid) <= off) lo = (uint16_t)(mid + 1);
|
||||
else hi = mid;
|
||||
}
|
||||
return (lo > 0) ? (uint16_t)(lo - 1) : 0;
|
||||
}
|
||||
|
||||
/* Установка флагов (маска IF_*) всегда идёт в последний emit_seg (n_lines-1).
|
||||
* Используется near-копия cur_rec, чтобы не делать обратное чтение из банка. */
|
||||
static void set_cur_flags(uint8_t f) { cur_rec.flags |= f; idx_put((uint16_t)(n_lines - 1), &cur_rec); }
|
||||
|
||||
Reference in New Issue
Block a user