mdview2: переименовать view→md и причесать секции ядра

- mdview2_view.c → mdview2_md.c: модуль уже содержит отрисовку MD-документа
  из рендер-кэша + скролл + статус-бар, т.е. это парный к mdview2_raw.c вид
  (MD ↔ RAW). Переименование делает пару явной.
- mdview2.c: обновлён устаревший заголовок-комментарий («Фаза 0 — копия
  mdview.c») на описание ядра + карту модулей; убраны осиротевшие после
  выноса комментарии; нормализованы баннеры секций (рендер-кэш / примитивы
  экрана+EMM / загрузка файла / doc-slots / loading-loop / точка входа).
- mdview2.h: освежён заголовок-комментарий под текущую раскладку модулей.

Только переименование и комментарии/баннеры — поведение и размер не
меняются (exe 28115, как до). Сборка чистая.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 11:15:28 +03:00
parent 858f748e7a
commit ee87ae1bd9
4 changed files with 49 additions and 49 deletions
+39 -42
View File
@@ -1,23 +1,29 @@
/*
* mdview2 — просмотрщик Markdown для Sprinter (render-cache версия).
*
* Фаза 0 (скаффолдинг): этот файл — копия mdview/mdview.c, без изменений
* логики. План переделки на render-cache — docs/mdview2-plan.md.
* Этот файл — ЯДРО (инфраструктура + точка входа). Прикладные подсистемы
* вынесены в отдельные модули (общий интерфейс — mdview2.h):
* mdview2_index.c — парсер/индексатор markdown (построение рендер-кэша)
* mdview2_md.c — представление MD-документа (отрисовка из кэша + скролл)
* mdview2_raw.c — RAW-просмотр исходного текста (F2/F3)
* mdview2_enc.c — кодировки CP866/CP1251/KOI8R + UTF-8 конвертер
* mdview2_table.c — выровненная отрисовка таблиц
* mdview2_help.c — диалог справки (F1)
*
* В ядре остаётся: пул рендер-кэша, доступ к EMM/окну W3 (fb/win_rest),
* примитивы экрана, загрузка файла, наборы документа (doc-slots), кооператив-
* ная loading-loop и диспетчер клавиш, сборка наборов и main().
*
* Разметка экрана (80x32):
* строка 0 — статус-бар (имя файла / диапазон строк / всего / %)
* строки 1..30 — область документа (30 видимых строк текста)
* строка 31 — меню (F1 Help / F2 Reserved / F10 Exit)
*
* Навигация:
* стрелки, PgUp/PgDn, Home/End, F1 (справка), F10/Esc (выход).
* Горизонтальный сдвиг доступен только для nowrap-строк.
* строка 31 — меню (F1 Help / F2 RAW / F3 Wrap / F8 CodePg / F10 Exit)
*
* Память:
* CODE → W1 (режим sprinter-cc --memory small)
* STACK/HEAP/DATA → W2
* Буфер файла → страницы EMM (до 8 × 16 КБ = 128 КБ),
* отображаемые в W3 по требованию через fb()/map_page().
* отображаемые в W3 по требованию через fb().
*/
#include <stdint.h>
@@ -30,7 +36,7 @@
#include <sprinter.h>
#include <sprinter_mem.h>
#include <palette.h>
#include "mdview2.h" /* геометрия, атрибуты, extern для модуля RAW */
#include "mdview2.h" /* геометрия, атрибуты, общий интерфейс модулей */
/* ---- Палитра атрибутов ------------------------------------------- */
@@ -53,38 +59,19 @@ static const uint8_t md_pallete[16 * 4] = {
0xFF, 0xFF, 0xFF, 0xFF
};
/* Атрибуты экрана/справки и геометрия — в mdview2.h (общие с модулем RAW).
* Диалог справки (F1) вынесен в модуль mdview2_help.c. */
/* ---- Глобальное состояние ---------------------------------------- */
/* Файл до 128 КБ хранится в наборе EMM-страниц (до 8 шт. по 16 КБ).
* В окно W3 одновременно отображается только одна страница (FILE_BUF):
* функция fb() при необходимости переключает маппинг и кэширует текущую
* страницу в cur_page, чтобы не делать лишние переключения.
/* Атрибуты экрана/справки и геометрия — в mdview2.h (общие со всеми модулями).
* Типы записей (idx_rec_t — в mdview2_index.c, cache_rec_t — в mdview2.h),
* словари флагов/стилей (IF_, CK_, INIT_STYLE_) и константы индекса
* (INDEX_RECS_PER_PAGE, MAX_CACHE_LINE_LEN) — в mdview2.h.
*
* Индекс экранных сегментов хранится отдельно в EMM (записи по 8 байт,
* одна запись на видимую строку). Каждая запись содержит:
* - смещение первого байта сегмента в исходном файле,
* - флаги (continuation/nowrap/blank/code),
* - начальный inline-стиль сегмента.
* Правая граница сегмента определяется смещением следующей записи.
* Такой подход освобождает около 11 КБ ближней RAM и снимает старый
* лимит MAX_LINES для near-массивов.
*/
* В SDCC/z80 критично явно инициализировать static-переменные (`= 0`):
* неинициализированные static-объекты могут конфликтовать по размещению
* и перезаписывать друг друга (см. memory/sdcc_static_storage_gotcha). */
/* В SDCC/z80 критично явно инициализировать static-переменные (`= 0`).
* Неинициализированные static-объекты могут конфликтовать по размещению
* и перезаписывать друг друга. См. заметку memory/sdcc_static_storage_gotcha. */
/* Компактная запись индекса сегмента.
* Каждый элемент соответствует одной строке рендера в viewport. */
/* idx_rec_t + INDEX_REC_SIZE — в mdview2_index.c; INDEX_RECS_PER_PAGE — в mdview2.h. */
#define MAX_INDEX_PAGES 8u /* максимум 8 * 2048 = 16384 сегментов индекса */
/* Флаги IF_* сегмента — в mdview2.h (общие с индексатором/кэшем/вью). */
/* ==================================================================
* Фаза 1 (mdview2): директория и пул рендер-кэша
* Рендер-кэш: директория и пул EMM-страниц
* ==================================================================
* Каждая логическая строка экрана рендерится РОВНО ОДИН РАЗ (Фаза 2)
* в готовый буфер и больше никогда не парсится повторно при скролле.
@@ -276,7 +263,7 @@ static uint8_t spinner_phase = 0;
static uint8_t spinner_active = 0;
/* ==================================================================
* Вспомогательные функции
* Примитивы экрана, доступ к EMM/окну W3 (fb/win_rest), палитра
* ================================================================== */
/* Печатает строку с указанным атрибутом, начиная с позиции (x,y),
@@ -586,9 +573,13 @@ static void unload_file(void)
/* Таблицы ремапа, set_encoding, кодировки и UTF-8 конвертер — в mdview2_enc.c. */
/* ---------- Сохранение/восстановление/переключение наборов ----------
* doc_save_live: живые глобалы → g_doc[i]. doc_load_live: g_doc[i] → живые
* глобалы (+ инвалидация маппинга fb() и активной кодировки). */
/* ==================================================================
* Наборы документа (doc-slots): сохранение/свап
* ==================================================================
* Два сосуществующих набора (DOC_8BIT / DOC_UTF8) живут как копии всего
* состояния (file/index/cache/позиция) в g_doc[]; «живые» глобалы — это
* активный набор. doc_save_live: живые → g_doc[i]; doc_load_live: g_doc[i]
* → живые (+ инвалидация маппинга fb() и активной кодировки). */
static void doc_save_live(uint8_t i)
{
docset_t *d = &g_doc[i];
@@ -636,7 +627,7 @@ static void doc_switch(uint8_t target)
/* Автоопределение/имя кодировки, ремап-вывод и UTF-8→CP866 конвертер — в mdview2_enc.c. */
/* Отрисовка области/статус-бара/меню и прокрутка — в модуле mdview2_view.c. */
/* Отрисовка области/статус-бара/меню и прокрутка — в модуле mdview2_md.c. */
/* ==================================================================
@@ -652,7 +643,13 @@ static void die(const char *msg)
(void)getkey();
}
/* Диалог справки (F1) — в модуле mdview2_help.c (show_help). */
/* ==================================================================
* Прогрессивная загрузка и диспетчер клавиш (MD)
* ==================================================================
* index_lines() строит индекс кооперативно и периодически зовёт
* progress_tick(): тот рисует первый готовый экран, крутит спиннер и
* обрабатывает клавиши на лету (load_key). Диалог справки (F1) — в
* mdview2_help.c, RAW-навигация — в mdview2_raw.c. */
/* Обработка клавиши во время прогрессивной загрузки: скролл строго в
* пределах готовых строк (drawable_lines); End = последняя готовая страница;