ChangeLog:
- memory optimized version.
This commit is contained in:
+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