From 50aa652dbe619779dd06c89b6946ac3be8e5f193 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 29 Jul 2026 12:04:18 +0300 Subject: [PATCH] =?UTF-8?q?sprinter-cc:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B9=20=C2=AB--w3=20=D0=BD=D0=B5=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D0=BC=20=D1=81=20huge=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Комментарий у блока разбора --w3 утверждал, что режим подразумевает small и несовместим с huge, хотя код тремя строками ниже huge как раз поддерживает: резидент делит окно W3 с трамплин-банками (порт 0xE2), crt0_banked запоминает резидентную страницу и возвращает её дефолтом после загрузки банков, а трамплин bank.s сохраняет/восстанавливает W3 на каждый __banked вызов. Следствие, которое теперь тоже записано: резидент -> __banked работает, обратное невозможно (из банка резидентной страницы в W3 просто нет). В справке по --w3 дополнено правило «W3-код не переключает страницу W3»: сюда же относится собственная графическая скобка _bgi_begin/_bgi_end — она маппит видеобанк ЧЕРЕЗ ТОТ ЖЕ порт 0xE2, и открытая из W3-кода означает исполнение из видео-ОЗУ (белый экран). Звать графические примитивы HOME можно: скобку они открывают и закрывают внутри себя. Только комментарии, поведение не менялось. Co-Authored-By: Claude Opus 5 --- bin/sprinter-cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/bin/sprinter-cc b/bin/sprinter-cc index 45e1e22..c015294 100755 --- a/bin/sprinter-cc +++ b/bin/sprinter-cc @@ -40,11 +40,16 @@ # --constseg W3CODE (writable statics stay in W2). In huge # the resident page SHARES W3 with trampoline banks: crt0 # captures/restores it (W3_RESIDENT), mkexe gets -W. -# Rules: W3 code must NOT switch the W3 page; W1/W2 code that -# swaps W3 to another page must restore it; no writable data -# belongs in W3 (code + rodata only). From a __banked -# context the resident W3 code is unreachable (but resident -# -> __banked via the W1 trampoline is fine). +# Rules: W3 code must NOT switch the W3 page — this includes +# opening a graphics batch bracket itself (_bgi_begin/_bgi_end +# map the video bank via the SAME port 0xE2; doing that from +# W3 code executes from video RAM -> white screen). Calling +# HOME graphics primitives is fine: they open and close the +# bracket internally and restore the page before returning. +# W1/W2 code that swaps W3 to another page must restore it; +# no writable data belongs in W3 (code + rodata only). From a +# __banked context the resident W3 code is unreachable (but +# resident -> __banked via the W1 trampoline is fine). # --mkexe FLAG extra mkexe flag (repeatable; e.g. --mkexe -p --mkexe 0) # --max-allocs N SDCC --max-allocs-per-node (default: 100000 — smaller/ # faster code at the cost of compile time; pass a lower @@ -154,7 +159,12 @@ done # W3-модули едут в область W3CODE @0xC000 и вызываются напрямую (без # трамплинов). Работает поверх small-лейаута: main-код с 0x4100 (W1/W2), # W3 свободно, DSS маппит все страницы образа сам (проверено tests/w3probe). -# --w3 подразумевает small; с huge несовместим (там W3 занят банками). +# --w3 подразумевает small ПО УМОЛЧАНИЮ, но поддержан во всех режимах +# tiny|small|big|huge. В huge резидент ДЕЛИТ окно W3 с трамплин-банками +# (порт 0xE2): crt0_banked запоминает резидентную страницу и возвращает её +# дефолтом после загрузки банков, а трамплин bank.s сохраняет/восстанавливает +# W3 на каждый __banked вызов (см. W3_RESIDENT ниже). Следствие: резидент -> +# __banked работает, обратное — НЕТ (из банка резидентной страницы в W3 нет). if [[ ${#W3_SPECS[@]} -gt 0 ]]; then [[ -z "$USER_SET_MEMORY" ]] && MEMORY_MODE="small" # --w3 → small по умолчанию case "$MEMORY_MODE" in