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
+64 -21
View File
@@ -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;