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:
+24
-5
@@ -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[@]}" \
|
||||
|
||||
Reference in New Issue
Block a user