mdview2: HEX-режим (F4) — дамп оригинального файла; версия v1.0 (b1)
Новый модуль mdview2_hex.c (WITH_HEX в conf): формат ' 0x012340 │ 16×hex │ 16 print', 30 строк, один атрибут. - Дамп всегда ОРИГИНАЛЬНОГО файла (orig_file_phys), не активного буфера; ряд выровнен на 16 → один bank_read на ряд (не пересекает EMM-страницу), fb()/W3 не используются. - Printable по текущей кодировке: CP866 как есть, CP1251/KOI8 через g_remap, UTF-8 — глиф на позиции лид-байта (continuation → '.') через новый utf_cp_glyph(), выделенный из конвертера enc-модуля. - Навигация: ±16 / ±480 / Home / End; одна строка — аппаратный scroll() + подрисовка одного ряда (как MD/RAW); процент в статусе. - F4 — тумблер HEX ↔ прежний вид; F2 из HEX уводит в MD; позиция при всех переходах через view_pos/view_reanchor (map_off orig ↔ active). - F8 в HEX: hex-колонка неизменна, printable перерисовывается в новой кодировке; позиция не двигается. - Help: версия v1.0 (b1), строка F4. exe 25725 → 27893 (+2168). Проверено в MAME. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -230,20 +230,24 @@ static const utf_sym_t utf_sym[] = {
|
||||
};
|
||||
#define UTF_SYM_N (uint8_t)(sizeof(utf_sym) / sizeof(utf_sym[0]))
|
||||
|
||||
/* Кодпойнт → CP866-глиф(ы). Кириллица по таблице; спецслучаи (…, BOM) явно;
|
||||
* остальные ходовые символы по таблице utf_sym[]; прочее → '?'. */
|
||||
/* Кодпойнт → ОДИН CP866-глиф: кириллица по таблице, ходовые символы по
|
||||
* utf_sym[], прочее → '?'. Общая для конвертера и HEX-printable (F4). */
|
||||
uint8_t utf_cp_glyph(uint32_t cp)
|
||||
{
|
||||
if (cp < 0x80) return (uint8_t)cp;
|
||||
if (cp >= 0x0400 && cp <= 0x045F) return utf_cyr_to_866[cp - 0x0400];
|
||||
for (uint8_t i = 0; i < UTF_SYM_N; i++)
|
||||
if (utf_sym[i].utf8 == (uint16_t)cp) return utf_sym[i].cp866;
|
||||
return '?';
|
||||
}
|
||||
|
||||
/* Кодпойнт → CP866-глиф(ы) в поток конвертера. Спецслучаи с НЕ-1:1 заменой
|
||||
* (… → "...", BOM → ничего) здесь; остальное через utf_cp_glyph(). */
|
||||
static void conv_emit_cp(uint32_t cp)
|
||||
{
|
||||
if (cp < 0x80) { conv_put((uint8_t)cp); return; }
|
||||
if (cp >= 0x0400 && cp <= 0x045F) { conv_put(utf_cyr_to_866[cp - 0x0400]); return; }
|
||||
if (cp == 0x2026) { conv_put('.'); conv_put('.'); conv_put('.'); return; } /* … → "..." */
|
||||
if (cp == 0xFEFF) return; /* BOM/ZWNBSP — выкинуть */
|
||||
for (uint8_t i = 0; i < UTF_SYM_N; i++)
|
||||
if (utf_sym[i].utf8 == (uint16_t)cp) {
|
||||
conv_put(utf_sym[i].cp866);
|
||||
return;
|
||||
}
|
||||
conv_put('?');
|
||||
conv_put(utf_cp_glyph(cp));
|
||||
}
|
||||
|
||||
/* Последовательное чтение байта ОРИГИНАЛА (utf-8) конвертером. Оригинал лежит
|
||||
|
||||
Reference in New Issue
Block a user