sprinter-cc: --bank-data принимает номер банка

Правка пользователя, разобранная по диффу и закоммиченная как есть.

Было «всё или ничего»: --bank-data уводил писучие данные В СТРАНИЦУ для
ВСЕХ банков сразу.  Теперь флаг принимает необязательный номер и
повторяется: --bank-data 5 --bank-data 6.  Без аргумента поведение прежнее
(все банки), поэтому существующие сборки не меняются.

Зачем поштучно: данные в странице банка НЕ ВИДНЫ снаружи, поэтому модуль с
экспортируемым глобалом обязан остаться на общем _DATA в W1/W2 — а его
сосед в это же время может держать большой приватный буфер вне резидентного
бюджета.  Одним флагом на всю программу это не выражается.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4
This commit is contained in:
2026-09-02 14:59:43 +03:00
parent 8610a8c178
commit 6a97124e0d
+24 -5
View File
@@ -33,9 +33,16 @@
# --data-loc 0xN override SDCC --data-loc (default: derived from --memory) # --data-loc 0xN override SDCC --data-loc (default: derived from --memory)
# -Wl FLAG extra linker flag (repeatable) # -Wl FLAG extra linker flag (repeatable)
# --bank N=FILE.c compile FILE.c as bank N; repeatable; pulls crt0_banked # --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 # (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 # automatically and adds -Wl-b_BANKN=0x{N}C000
# --w3 FILE.c place FILE.c resident in window 3 (0xC000), called # --w3 FILE.c place FILE.c resident in window 3 (0xC000), called
# DIRECTLY (no trampoline). Repeatable. Defaults to # DIRECTLY (no trampoline). Repeatable. Defaults to
@@ -111,7 +118,8 @@ MKEXE_EXTRA=()
BANK_SPECS=() # entries like "1=engine.c" BANK_SPECS=() # entries like "1=engine.c"
W3_SPECS=() # entries like "mod.c" — резидентные модули окна W3 (--w3) W3_SPECS=() # entries like "mod.c" — резидентные модули окна W3 (--w3)
USER_DEFS=() # -DFOO / -DFOO=bar — пробрасываются в sdcc как есть 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_RELS=() # заполняется при компиляции W3-модулей
W3_LD_FLAGS=() # -Wl-b_W3CODE=0xC000, если есть --w3 W3_LD_FLAGS=() # -Wl-b_W3CODE=0xC000, если есть --w3
USER_SET_MEMORY="" # непусто, если --memory задан явно (для --w3 авто-small) USER_SET_MEMORY="" # непусто, если --memory задан явно (для --w3 авто-small)
@@ -147,7 +155,14 @@ while [[ $# -gt 0 ]]; do
-Wl) LD_EXTRA+=("$2"); shift 2;; -Wl) LD_EXTRA+=("$2"); shift 2;;
-D*) USER_DEFS+=("$1"); shift;; -D*) USER_DEFS+=("$1"); shift;;
--bank) BANK_SPECS+=("$2"); shift 2;; --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;; --mkexe) MKEXE_EXTRA+=("$2"); shift 2;;
--max-allocs) MAX_ALLOCS="$2"; shift 2;; --max-allocs) MAX_ALLOCS="$2"; shift 2;;
--gfx) GFX_MODE="$2"; shift 2;; --gfx) GFX_MODE="$2"; shift 2;;
@@ -464,7 +479,11 @@ if [[ "$CRT0_TYPE" == "banked" ]]; then
# W1/W2, но требует ручного контроля видимости, поэтому # W1/W2, но требует ручного контроля видимости, поэтому
# включается явно через --bank-data. # включается явно через --bank-data.
bank_data_flags=() 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[@]}" \ run "$SDCC" "${CC_FLAGS[@]}" \
--codeseg "BANK${bank_n}" --constseg "BANK${bank_n}" \ --codeseg "BANK${bank_n}" --constseg "BANK${bank_n}" \
"${bank_data_flags[@]}" \ "${bank_data_flags[@]}" \