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