Горизонтальный скролл (Фаза 5, финал):
- Скроллим по ТИПУ, а не по длине: новый флаг IF_HSCROLL ставится только
на код и таблицы; HR и границы fence (IF_NOWRAP без IF_HSCROLL) не
двигаются. Блок едет целиком, включая строки короче 80.
- Обход бага кодогенерации SDCC z80: `if (n!=g) g=n;` пишет (n-g) вместо n
(SUB сравнения затирает A, store переиспользует испорченный A). Лечится
записью viewport_x ДО сравнения. Минимальный репродьюсер и оба описания
для трекера — в docs/bugs/sdcc-z80-cmp-store-a/ (воспроизводится на чистом
sdcc 4.5, в т.ч. с --no-peep → это кодогенератор, не peephole).
Рендеринг:
- Отступленный fence (```c внутри списка) теперь распознаётся: is_fence_raw
пропускает ведущие пробелы/табы; то же в рендере прячет строку-границу.
- Строки-разделители (HR, ровно 80) больше не участвуют в скролле.
Чистка: удалён мёртвый код (is_fence_delim, get_init_style[_raw], is_cont,
seg_flags). Makefile (mdview/mdview2): iconv UTF-8→CP866 завершается ненулевым
кодом при отбрасывании символов — игнорируем (|| true).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace per-character wrchar() loops in render_line/fill_row/help screens
with batched BIOS calls (bios_writeattr/bios_fillcharattr), and cache the
per-line index record (idx_get) instead of refetching it ~13 times per
rendered line — each refetch cost two W3 bank switches via bank_read().
Also fixes a pre-existing indexer bug: when word-wrap pushes a token that
starts with an emphasis/code marker (e.g. `_text_`) onto a new line, the
marker got re-scanned a second time during the wrap continuation, flipping
line_style back off and corrupting the rendered attribute of the next
word. Fixed by snapshotting line_style at the last seen space and rolling
back to that snapshot (both the saved continuation style and the live
scan state) when a wrap is taken.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- исправлен rewind до первого non-cont сегмента для continuation
- для quote-потока newline обрабатывается как soft join с пропуском сырого ' > ' маркера
- восстановлен quote-префикс на continuation строках
Co-Authored-By: Oz <oz-agent@warp.dev>
- Quote blocks now join consecutive quote lines into one paragraph with
soft breaks and wrap continuation under quote prefix.
- Empty quote lines ('>' / '> ') act as quote-paragraph separators.
- Nested quote starts ('> > ...') are not merged into the parent text and
stay separate rows.
- Keeps existing inline emphasis handling inside quote content.
Co-Authored-By: Oz <oz-agent@warp.dev>
Replace status-line printf formatting with compact manual decimal rendering
(u16/u8 right-aligned helpers + wrchar/put_str_attr). This removes runtime
printf usage from mdview.c and keeps fixed status columns without stale digits.
Co-Authored-By: Oz <oz-agent@warp.dev>
- List items (UL/OL) can now span multiple source lines: non-marker
lines are joined into the current item as lazy continuation.
- Continuation-line leading indentation is trimmed before joining so
wrapped item text is separated by a single space.
- A single blank line between adjacent list markers is suppressed
(same visual list), while 2+ blank lines still produce a separator.
Co-Authored-By: Oz <oz-agent@warp.dev>
- Paragraph scanning no longer swallows the blank line separating it from
the next block; runs of blank lines collapse to one row. Restores blank
separation between paragraphs, headers and horizontal rules.
- Detect table rows (first non-space char '|') as nowrap segments; they are
no longer merged into surrounding text or each other.
- Continuation (wrapped) rows render content as plain text and are no longer
re-classified, so a wrapped word starting with '-'/'#'/'>' is not mis-drawn
as a list/heading/quote marker.
Co-Authored-By: Oz <oz-agent@warp.dev>
- A trailing backslash before a newline now forces an in-paragraph line
break (like two trailing spaces); render consumes the marker (non-code).
- Add ~~strikethrough~~ inline style (INIT_STYLE_STRIKE / EM_STRIKE),
parsed in inline_scan, the paragraph merger and render, mirroring **.
- Horizontal pan is bounded by the widest nowrap segment on screen, and a
'<' indicator marks hidden content off the left edge.
Co-Authored-By: Oz <oz-agent@warp.dev>
- Index is now an 8-byte record per visible segment in a dedicated EMM
block (idx_get/idx_put), freeing ~11 KB of near RAM and lifting the
old 2048-line cap (dynamic max_lines = index_pages * 2048).
- The per-byte scan keeps the previous segment offset in a near var
(cur_seg_off) and mirrors the last record (cur_rec), so it never reads
the index back from the bank.
- fb()/map_page() are inlined now that there is code headroom, removing
per-byte call + 32-bit argument marshalling overhead.
Co-Authored-By: Oz <oz-agent@warp.dev>
Decode page/offset from the 32-bit offset's bytes to avoid SDCC z80
32-bit shift/mask helpers on the hot path; map_page() uses a cached
file_phys[] table to skip mem_get_page() on every W3 swap.
Behaviour-preserving.
Co-Authored-By: Oz <oz-agent@warp.dev>
- Add fenced code block tracking to the wrap-pass in index_lines().
line_style is reset to PLAIN at every ``` delimiter, and all segs
inside a fenced block get init_style=PLAIN. This prevents emphasis
markers (e.g. _ in __var) inside code blocks from leaking into later
normal text.
- Also carry init_style across wrap continuation segs so that a long
bold/italic line that is wrapped continues with the correct style on
the next segment.
- The fence bitmap pass now only updates in_code[], since init_style is
already set correctly by the wrap pass.
- Split tests/ (libc feature tests) and examples/ (real apps); shared
app.mk in repo root, was examples/example.mk
- libc/io/* split into libc/{conio,env,errno,file,mouse,string,sys,
time,video}/ — clearer module boundaries
- New examples/mdview/: markdown viewer (Phases 1-5 + light nested
lists). Headers (H1-H4), HR, ulist/olist/quote with nesting via
leading spaces, fenced code blocks, inline emphasis (bold/italic/
underscore/code), wrap/unwrap mode with soft wrap (F2), horizontal
pan (← →) with '>' truncation indicator
- libc additions: scroll() in conio (ESTEX SCROLL), strlwr/strupr,
gets() test
- Makefile updates across tests/ for the new shared app.mk path
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>