ChangeLog:
- memory optimized version.
This commit is contained in:
@@ -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).
|
||||
|
||||
+64
-21
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user