libbgi: скролл-примитивы + --w3 + отчёт раскладки памяти

Скролл региона video->video (неактивная страница -> активная, банк 0x50:
копия = скролл + heal цели):
- gfx_scroll_h / _bgi_scroll_rows_raw — горизонтальный, построчно без
  страйдов (~54Т/строку), DI/EI бандами по 16 строк, h=0=>256;
- gfx_scroll_v / _bgi_scroll_cols_raw — верт. И/ИЛИ гориз. за один проход
  без буфера (колонка = accel-burst LD A,A, STOP между read/write делает
  промежуточный OUT Port_Y безопасным), банды по 16 колонок;
- _gfx_addr_shadow_base (адрес неактивной страницы) + gfx_rect_t.
Пример examples/scroll.

check_banks.py + sprinter-cc: отчёт раскладки памяти для ЛЮБОЙ модели
(W1/W2 код/данные, остаток кучи/стека, W3 при --w3, банки при --bank),
не только при --bank.  Док docs/memory-management.md §10.

--w3 (резидентный код окна W3) + сопутствующее: crt0_banked W3_RESIDENT,
mkexe -W, tests/w3probe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 19:38:00 +03:00
parent d1bc97c589
commit 95c22be9bd
46 changed files with 4125 additions and 133 deletions
+23
View File
@@ -121,6 +121,17 @@ w2_join:
ld (_estex_block_id), a
ld (_estex_startup_ix), ix
.ifdef W3_RESIDENT
;; --w3 в HUGE: резидентный код окна W3 (0xC000) — часть HOME-образа,
;; замаплен DSS. Загрузка банков ниже подменяет W3 своими страницами;
;; запомним физ-страницу резидента, чтобы вернуть её дефолтом после
;; цикла — тогда прямые вызовы в резидентный W3-код снова корректны.
;; (Трамплин bank.s сам сохраняет/восстанавливает W3 на каждый __banked
;; вызов, поэтому дефолтная страница обязана быть резидентной.)
in a, (#0xE2)
ld (_w3_resident_page), a
.endif
;; ---- Allocate _n_banks pages via ESTEX GETMEM ----
ld a, (_n_banks)
or a, a
@@ -182,6 +193,14 @@ load_bank_done:
rst #0x10
;; Ignore CF from close.
.ifdef W3_RESIDENT
;; Вернуть резидентную страницу W3 дефолтом (цикл выше оставил в W3
;; последний банк). После этого прямые call'ы в резидентный код 0xC0xx
;; корректны, а трамплины будут сохранять/возвращать именно её.
ld a, (_w3_resident_page)
out (#0xE2), a
.endif
skip_bank_load:
;; ---- Standard SDCC init path ----
call gsinit
@@ -411,6 +430,10 @@ _estex_block_id::
.ds 1
_bank_block_id::
.ds 1
.ifdef W3_RESIDENT
_w3_resident_page:
.ds 1
.endif
.area _DATA
_argc::