From 6a97124e0d1cb1b8d4b111410a5c7e766cf7bcec Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 2 Sep 2026 14:59:43 +0300 Subject: [PATCH] =?UTF-8?q?sprinter-cc:=20--bank-data=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20=D0=BD=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=20=D0=B1=D0=B0=D0=BD=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Правка пользователя, разобранная по диффу и закоммиченная как есть. Было «всё или ничего»: --bank-data уводил писучие данные В СТРАНИЦУ для ВСЕХ банков сразу. Теперь флаг принимает необязательный номер и повторяется: --bank-data 5 --bank-data 6. Без аргумента поведение прежнее (все банки), поэтому существующие сборки не меняются. Зачем поштучно: данные в странице банка НЕ ВИДНЫ снаружи, поэтому модуль с экспортируемым глобалом обязан остаться на общем _DATA в W1/W2 — а его сосед в это же время может держать большой приватный буфер вне резидентного бюджета. Одним флагом на всю программу это не выражается. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4 --- bin/sprinter-cc | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/bin/sprinter-cc b/bin/sprinter-cc index cab852c..30819c0 100755 --- a/bin/sprinter-cc +++ b/bin/sprinter-cc @@ -33,9 +33,16 @@ # --data-loc 0xN override SDCC --data-loc (default: derived from --memory) # -Wl FLAG extra linker flag (repeatable) # --bank N=FILE.c compile FILE.c as bank N; repeatable; pulls crt0_banked -# --bank-data put bank modules' writable data INTO the bank page +# --bank-data [N] put bank modules' writable data INTO the bank page # (default: it goes to the shared _DATA in W1/W2, which -# stays mapped and is visible from everywhere) +# stays mapped and is visible from everywhere). +# Without an argument — for ALL banks (old behaviour). +# With a bank number — only for that bank; repeatable: +# --bank-data 5 --bank-data 6 +# Per-bank matters because bank-local data is NOT visible +# from outside the bank: a module with an exported global +# must stay on the shared _DATA while its neighbour keeps +# a big private buffer off the resident budget. # automatically and adds -Wl-b_BANKN=0x{N}C000 # --w3 FILE.c place FILE.c resident in window 3 (0xC000), called # DIRECTLY (no trampoline). Repeatable. Defaults to @@ -111,7 +118,8 @@ MKEXE_EXTRA=() BANK_SPECS=() # entries like "1=engine.c" W3_SPECS=() # entries like "mod.c" — резидентные модули окна W3 (--w3) USER_DEFS=() # -DFOO / -DFOO=bar — пробрасываются в sdcc как есть -BANK_LOCAL_DATA=0 # 1 (--bank-data): писучие данные банков — В СТРАНИЦУ банка +BANK_LOCAL_DATA=0 # 1 (--bank-data без аргумента): данные ВСЕХ банков — в страницу +BANK_LOCAL_LIST=() # номера банков из --bank-data N (по одному на банк) W3_RELS=() # заполняется при компиляции W3-модулей W3_LD_FLAGS=() # -Wl-b_W3CODE=0xC000, если есть --w3 USER_SET_MEMORY="" # непусто, если --memory задан явно (для --w3 авто-small) @@ -147,7 +155,14 @@ while [[ $# -gt 0 ]]; do -Wl) LD_EXTRA+=("$2"); shift 2;; -D*) USER_DEFS+=("$1"); shift;; --bank) BANK_SPECS+=("$2"); shift 2;; - --bank-data) BANK_LOCAL_DATA=1; shift;; + --bank-data) + # Аргумент необязателен: «--bank-data» = все банки (как было), + # «--bank-data N» = только банк N, флаг повторяемый. + if [[ -n "${2:-}" && "$2" =~ ^[0-9]+$ ]]; then + BANK_LOCAL_LIST+=("$2"); shift 2 + else + BANK_LOCAL_DATA=1; shift + fi;; --mkexe) MKEXE_EXTRA+=("$2"); shift 2;; --max-allocs) MAX_ALLOCS="$2"; shift 2;; --gfx) GFX_MODE="$2"; shift 2;; @@ -464,7 +479,11 @@ if [[ "$CRT0_TYPE" == "banked" ]]; then # W1/W2, но требует ручного контроля видимости, поэтому # включается явно через --bank-data. bank_data_flags=() - [[ $BANK_LOCAL_DATA -eq 1 ]] && bank_data_flags=(--dataseg "BANK${bank_n}") + bank_local=$BANK_LOCAL_DATA + for bl in "${BANK_LOCAL_LIST[@]}"; do + [[ "$bl" == "$bank_n" ]] && bank_local=1 + done + [[ $bank_local -eq 1 ]] && bank_data_flags=(--dataseg "BANK${bank_n}") run "$SDCC" "${CC_FLAGS[@]}" \ --codeseg "BANK${bank_n}" --constseg "BANK${bank_n}" \ "${bank_data_flags[@]}" \