ChangeLog:

- memory optimized version.
This commit is contained in:
2026-06-08 15:34:36 +03:00
parent 07c4004bd9
commit f87b52bb7f
2 changed files with 68 additions and 25 deletions
+4 -4
View File
@@ -175,8 +175,8 @@ State machine:
- **Lazy continuation**: áâப¨ ¡¥§ ¬ àª¥à , ­® á ¯à ¢¨«ì­ë¬ indent ¯®¤ - **Lazy continuation**: áâப¨ ¡¥§ ¬ àª¥à , ­® á ¯à ¢¨«ì­ë¬ indent ¯®¤
¯à¥¤ë¤ã騬 bullet'®¬, ¤®«¦­ë áç¨â âìáï ¯à®¤®«¦¥­¨¥¬ ⮣® bullet'  ¯à¥¤ë¤ã騬 bullet'®¬, ¤®«¦­ë áç¨â âìáï ¯à®¤®«¦¥­¨¥¬ ⮣® bullet' 
(¢¨§ã «ì­® - ®¡é¨© attr). (¢¨§ã «ì­® - ®¡é¨© attr).
- **Strict CommonMark indent rules**: ¢«®¦¥­­ë© ¯ã­ªâ ¤®«¦¥­ ¡ëâì ­  indent - **Strict CommonMark indent rules**: ¢«®¦¥­­ë© ¯ã­ªâ ¤®«¦¥­ ¡ëâì ­ 
>= content_col த¨â¥«ï, ¨­ ç¥ áç¨â ¥âáï breakout. 㦥­ ¬¨­¨-stack indent >= content_col த¨â¥«ï, ¨­ ç¥ áç¨â ¥âáï breakout. 㦥­ ¬¨­¨-stack
 ªâ¨¢­ëå ᯨ᪮¢ ¯à¨ ¨­¤¥ªá æ¨¨.  ªâ¨¢­ëå ᯨ᪮¢ ¯à¨ ¨­¤¥ªá æ¨¨.
### Phase 5 - Wrap / Unwrap ¤«¨­­ëå áâப ### Phase 5 - Wrap / Unwrap ¤«¨­­ëå áâப
@@ -211,8 +211,8 @@ State machine:
- **Inline emphasis ç¥à¥§ £à ­¨æã**: í¬ä §¨á, ®âªàëâë© ¢ ¯¥à¢®¬ seg'¥ ¨ ­¥ - **Inline emphasis ç¥à¥§ £à ­¨æã**: í¬ä §¨á, ®âªàëâë© ¢ ¯¥à¢®¬ seg'¥ ¨ ­¥
§ ªàëâë©, ¤®«¦¥­ ¯à®¤®«¦ âìáï ¢® ¢â®à®¬. ’ॡã¥â åà ­¨âì emph state per § ªàëâë©, ¤®«¦¥­ ¯à®¤®«¦ âìáï ¢® ¢â®à®¬. ’ॡã¥â åà ­¨âì emph state per
seg (3 ¡¨â ). seg (3 ¡¨â ).
- Compact way: ¤®¡ ¢¨âì ¯ à ««¥«ì­ë© ¬ áᨢ `seg_meta[MAX_SEGS]` ¯® 1 ¡ ©âã - Compact way: ¤®¡ ¢¨âì ¯ à ««¥«ì­ë© ¬ áᨢ `seg_meta[MAX_SEGS]` ¯® 1 ¡ ©âã -
- ¯ ªã¥â marker_width (4 ¡¨â ) + emph_state (3 ¡¨â ) + base_attr_idx ¯ ªã¥â marker_width (4 ¡¨â ) + emph_state (3 ¡¨â ) + base_attr_idx
(4 ¡¨â  ¨§ â ¡«¨æë -> ­ã¦¥­ 2-¡ ©â®¢ë© seg_meta). (4 ¡¨â  ¨§ â ¡«¨æë -> ­ã¦¥­ 2-¡ ©â®¢ë© seg_meta).
- **Hpan ¤«ï ¤«¨­­ëå áâப**: ¥á«¨ wrap ¢ëª«î祭, ¤®¡ ¢¨âì <-/-> ¤«ï - **Hpan ¤«ï ¤«¨­­ëå áâப**: ¥á«¨ wrap ¢ëª«î祭, ¤®¡ ¢¨âì <-/-> ¤«ï
£®à¨§®­â «ì­®£® áªà®««  >80 cols. ޡ鍩 ¬¥å ­¨§¬ á tables (Phase 6). £®à¨§®­â «ì­®£® áªà®««  >80 cols. ޡ鍩 ¬¥å ­¨§¬ á tables (Phase 6).
+64 -21
View File
@@ -126,22 +126,22 @@ typedef struct idx_rec_s {
#define IF_BLANK 0x04u /* визуально пустая строка */ #define IF_BLANK 0x04u /* визуально пустая строка */
#define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */ #define IF_CODE 0x08u /* тело fenced code-блока (verbatim-режим) */
static uint16_t n_lines = 0; static uint16_t n_lines = 0;
static uint16_t max_lines = 0; /* ёмкость индекса: index_pages * 2048 */ static uint16_t max_lines = 0; /* ёмкость индекса: index_pages * 2048 */
static uint16_t top_line = 0; static uint16_t top_line = 0;
static uint32_t file_size = 0; static uint32_t file_size = 0;
static uint8_t file_blk = 0; static uint8_t file_blk = 0;
static uint8_t file_pages = 0; static uint8_t file_pages = 0;
static uint8_t file_phys[MAX_PAGES] = {0}; static uint8_t file_phys[MAX_PAGES] = {0};
static uint8_t index_blk = 0; static uint8_t index_blk = 0;
static uint8_t index_pages = 0; static uint8_t index_pages = 0;
static uint8_t index_phys[MAX_INDEX_PAGES] = {0}; static uint8_t index_phys[MAX_INDEX_PAGES] = {0};
static uint8_t index_truncated = 0; /* выставляется при исчерпании ёмкости индекса */ static uint8_t index_truncated = 0; /* выставляется при исчерпании ёмкости индекса */
static uint32_t cur_seg_off = 0; /* смещение последнего emit_seg (кэш в near-памяти) */ static uint32_t cur_seg_off = 0; /* смещение последнего emit_seg (кэш в near-памяти) */
static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */ static idx_rec_t cur_rec; /* near-копия последней записанной idx-записи */
static uint8_t cur_page = 0xFF; /* 0xFF = в W3 ещё не отображена ни одна страница */ static uint8_t cur_page = 0xFF; /* 0xFF = в W3 ещё не отображена ни одна страница */
static uint8_t viewport_x = 0; /* горизонтальный сдвиг для nowrap-строк */ static uint8_t viewport_x = 0; /* горизонтальный сдвиг для nowrap-строк */
static char filename[64] = {0}; static char filename[64] = {0};
#define HPAN_STEP 8u #define HPAN_STEP 8u
@@ -205,17 +205,60 @@ static inline void map_page(uint8_t page)
/* Читает один байт логического файла по смещению p. /* Читает один байт логического файла по смещению p.
* При переходе между страницами автоматически переключает W3. * При переходе между страницами автоматически переключает W3.
* Проверка границ выполняется вызывающей стороной. * Проверка границ выполняется вызывающей стороной.
* */
* Это горячий путь (вызывается очень часто из index_lines()), поэтому
* декодирование page/off сделано через little-endian представление p, static char fb(uint32_t p)
* чтобы избежать тяжёлых 32-битных сдвигов/масок на z80. */
static inline char fb(uint32_t p)
{ {
uint8_t *pb = (uint8_t *)&p; uint8_t *pb = (uint8_t *)&p;
uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2)); uint8_t page = (uint8_t)((pb[1] >> 6) | (pb[2] << 2));
uint16_t off = (uint16_t)(((uint16_t)(pb[1] & 0x3F) << 8) | pb[0]); uint16_t off = (uint16_t)(((uint16_t)(pb[1] & 0x3F) << 8) | pb[0]);
map_page(page); map_page(page);
return FILE_BUF[off]; 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 пробельными. */ /* Для проверки границ выделения считаем пробел/таб/конец строки/0 пробельными. */
@@ -1042,7 +1085,7 @@ static void index_lines(void)
while (t < file_size && fb(t) != '\n') t++; while (t < file_size && fb(t) != '\n') t++;
if (t < file_size) t++; if (t < file_size) t++;
blanks++; blanks++;
if (blanks >= 2) break; // if (blanks >= 2) break;
} }
if (blanks == 1 && t < file_size) { if (blanks == 1 && t < file_size) {
uint32_t d = t; uint32_t d = t;