From f87b52bb7f39776602df07593b6c636893a54523 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 8 Jun 2026 15:34:36 +0300 Subject: [PATCH] ChangeLog: - memory optimized version. --- examples/mdview/PLAN_866.md | 8 ++-- examples/mdview/mdview.c | 85 ++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/examples/mdview/PLAN_866.md b/examples/mdview/PLAN_866.md index 1d632c1..9c05245 100644 --- a/examples/mdview/PLAN_866.md +++ b/examples/mdview/PLAN_866.md @@ -175,8 +175,8 @@ State machine: - **Lazy continuation**: ப થ, ࠢ indent ।騬 bullet', த ⮣ bullet' (㠫쭮 - 騩 attr). -- **Strict CommonMark indent rules**: 㭪 indent - >= content_col த⥫, ⠥ breakout. 㦥 -stack +- **Strict CommonMark indent rules**: 㭪 + indent >= content_col த⥫, ⠥ breakout. 㦥 -stack ⨢ ᯨ᪮ 樨. ### Phase 5 - Wrap / Unwrap ப @@ -211,8 +211,8 @@ State machine: - **Inline emphasis १ ࠭**: 䠧, ࢮ seg' , த ஬. ॡ ࠭ emph state per seg (3 ). -- Compact way: ࠫ ᨢ `seg_meta[MAX_SEGS]` 1 - - marker_width (4 ) + emph_state (3 ) + base_attr_idx +- Compact way: ࠫ ᨢ `seg_meta[MAX_SEGS]` 1 - + marker_width (4 ) + emph_state (3 ) + base_attr_idx (4 ⠡ -> 㦥 2-⮢ seg_meta). - **Hpan ப**: ᫨ wrap 몫祭, <-/-> ਧ⠫쭮 ஫ >80 cols. 騩 堭 tables (Phase 6). diff --git a/examples/mdview/mdview.c b/examples/mdview/mdview.c index 97306f9..bbe6e34 100644 --- a/examples/mdview/mdview.c +++ b/examples/mdview/mdview.c @@ -126,22 +126,22 @@ typedef struct idx_rec_s { #define IF_BLANK 0x04u /* визуально пустая строка */ #define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */ -static uint16_t n_lines = 0; -static uint16_t max_lines = 0; /* ёмкость индекса: index_pages * 2048 */ -static uint16_t top_line = 0; -static uint32_t file_size = 0; -static uint8_t file_blk = 0; -static uint8_t file_pages = 0; -static uint8_t file_phys[MAX_PAGES] = {0}; -static uint8_t index_blk = 0; -static uint8_t index_pages = 0; -static uint8_t index_phys[MAX_INDEX_PAGES] = {0}; -static uint8_t index_truncated = 0; /* выставляется при исчерпании ёмкости индекса */ -static uint32_t cur_seg_off = 0; /* смещение последнего emit_seg (кэш в near-памяти) */ +static uint16_t n_lines = 0; +static uint16_t max_lines = 0; /* ёмкость индекса: index_pages * 2048 */ +static uint16_t top_line = 0; +static uint32_t file_size = 0; +static uint8_t file_blk = 0; +static uint8_t file_pages = 0; +static uint8_t file_phys[MAX_PAGES] = {0}; +static uint8_t index_blk = 0; +static uint8_t index_pages = 0; +static uint8_t index_phys[MAX_INDEX_PAGES] = {0}; +static uint8_t index_truncated = 0; /* выставляется при исчерпании ёмкости индекса */ +static uint32_t cur_seg_off = 0; /* смещение последнего emit_seg (кэш в near-памяти) */ static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */ -static uint8_t cur_page = 0xFF; /* 0xFF = в W3 ещё не отображена ни одна страница */ -static uint8_t viewport_x = 0; /* горизонтальный сдвиг для nowrap-строк */ -static char filename[64] = {0}; +static uint8_t cur_page = 0xFF; /* 0xFF = в W3 ещё не отображена ни одна страница */ +static uint8_t viewport_x = 0; /* горизонтальный сдвиг для nowrap-строк */ +static char filename[64] = {0}; #define HPAN_STEP 8u @@ -205,17 +205,60 @@ static inline void map_page(uint8_t page) /* Читает один байт логического файла по смещению p. * При переходе между страницами автоматически переключает W3. * Проверка границ выполняется вызывающей стороной. - * - * Это горячий путь (вызывается очень часто из index_lines()), поэтому - * декодирование page/off сделано через little-endian представление p, - * чтобы избежать тяжёлых 32-битных сдвигов/масок на z80. */ -static inline char fb(uint32_t p) + */ + +static char fb(uint32_t p) { uint8_t *pb = (uint8_t *)&p; uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2)); uint16_t off = (uint16_t)(((uint16_t)(pb[1] & 0x3F) << 8) | pb[0]); map_page(page); return FILE_BUF[off]; +/* + // p = HLDE + (void)p; + + __asm +; uint16_t off = (uint16_t)(((uint16_t)(pb[1] | 0xC0) << 8) | pb[0]); + ld a, d + or a, #0xC0 + ld b, a + ld c, e + +; uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2)); + ld a, l ;; pb[2] << 2 + add a, a + add a, a + ld e, a ;; e = pb[2] << 2 + + ld a, d ;; pb[1] >> 6 + rlca + rlca + and a, #0x03 + + or a, e ;; a = (pb[2] << 2) | (pb[1] >> 6) + ld e, a +; map_page(page); +; if (page != cur_page) { + ld a, (_cur_page) + cp e + jr Z, __fbl0 +; cur_page = page; + ld a, e + ld (_cur_page), a +; sprinter_page_w3(file_phys[page]); + ld hl, #_file_phys + ld d, #0x00 + add hl, de + ld a, (hl) + out (__io_page_w3), a +; } +__fbl0: +; return FILE_BUF[off]; + ld a, (bc) + ret + __endasm; +*/ } /* Для проверки границ выделения считаем пробел/таб/конец строки/0 пробельными. */ @@ -1042,7 +1085,7 @@ static void index_lines(void) while (t < file_size && fb(t) != '\n') t++; if (t < file_size) t++; blanks++; - if (blanks >= 2) break; + // if (blanks >= 2) break; } if (blanks == 1 && t < file_size) { uint32_t d = t;