SprPoP: обобщить HDD-сборку и очистить метаданные

Добавить общий каталог назначения для HDD и удалить локальную копию упаковщика.\n\nУбрать устаревшие generated-имена ресурсов, выводить число страниц Kid из kid.arc и ограничить звуковую таблицу горячим модулем.\n\nЗафиксировать планы runtime-индексов музыки и PCM-эффектов.
This commit is contained in:
2026-08-30 16:16:06 +03:00
parent 623199337e
commit ea8efdb0fd
22 changed files with 706 additions and 296 deletions
+67 -12
View File
@@ -1,28 +1,64 @@
#!/bin/bash
# make_hdd.sh OUT.chd FILE1 [FILE2 ...]
# make_hdd.sh [--dest DIR] OUT.chd FILE1 [FILE2 ...]
#
# Собирает 32 МБ RAW-образ жёсткого диска (MBR + один раздел FAT16) с
# указанными файлами в корне и конвертит его в CHD для MAME (монтируется
# как -hard2). Быстрая альтернатива floppy (mc.img): MAME эмулирует FDD
# с реальной черепашьей скоростью, HDD — в разы быстрее.
# указанными файлами и конвертит его в CHD для MAME (монтируется как -hard2).
# По умолчанию файлы кладутся в корень. --dest DIR (или HDD_DEST_DIR)
# переносит всё дерево под DIR, например games/sprpop.
#
# Требует: mtools (mpartition/mformat/mcopy) + chdman (из MAME).
# Sprinter DSS штатно монтирует стандартный MBR+FAT16 (подтверждено).
#
# Использование:
# toolchain/make_hdd.sh mame/v306/IMG/test_hdd.chd prog.exe data1 data2 ...
# toolchain/make_hdd.sh --dest games/sprpop out.chd prog.exe data1 ...
# toolchain/make_hdd.sh out.chd prog.exe KID:kid0.atl GUARD:g0.atl ...
# — аргумент вида КАТАЛОГ:файл кладёт файл в подкаталог образа
# (каталог создаётся); без префикса файл идёт в корень.
# — аргумент вида КАТАЛОГ:файл кладёт файл в подкаталог относительно
# DIR; без префикса файл идёт непосредственно в DIR.
set -e
DEST_DIR=${HDD_DEST_DIR:-}
while [ $# -gt 0 ]; do
case "$1" in
--dest)
if [ $# -lt 2 ]; then
echo "make_hdd.sh: --dest требует путь" >&2
exit 1
fi
DEST_DIR="$2"
shift 2
;;
--dest=*)
DEST_DIR="${1#--dest=}"
shift
;;
--)
shift
break
;;
*) break ;;
esac
done
if [ $# -lt 2 ]; then
echo "usage: $0 OUT.chd FILE1 [FILE2 ...]" >&2
echo "usage: $0 [--dest DIR] OUT.chd FILE1 [FILE2 ...]" >&2
exit 1
fi
OUT_CHD="$1"; shift
# DSS использует обратный слэш, но mtools — прямой. Ведущие/замыкающие
# разделители не несут смысла: DIR всегда задаётся относительно корня HDD.
DEST_DIR="${DEST_DIR//\\//}"
while [ "${DEST_DIR#/}" != "$DEST_DIR" ]; do DEST_DIR="${DEST_DIR#/}"; done
while [ "${DEST_DIR%/}" != "$DEST_DIR" ]; do DEST_DIR="${DEST_DIR%/}"; done
case "/$DEST_DIR/" in
*/./*|*/../*|*:* )
echo "make_hdd.sh: недопустимый каталог назначения: $DEST_DIR" >&2
exit 1
;;
esac
# Геометрия: 128*16*32*512 = 32 МБ. BPS=512.
CYLS=128; HEADS=16; SECS=32
SECTORS=$((CYLS * HEADS * SECS)) # 65536
@@ -57,6 +93,21 @@ mt() {
"$@" < /dev/null
}
# mmd не создаёт родителей сам: строим путь по одному компоненту. Пустой
# путь означает корень и сохраняет прежнее поведение скрипта.
make_dir_tree() {
local path="$1" part current="" old_ifs="$IFS"
[ -z "$path" ] && return
IFS='/'
for part in $path; do
[ -z "$part" ] && continue
current="${current:+$current/}$part"
mt mmd "z:/$current" >/dev/null 2>&1 || true
done
IFS="$old_ifs"
}
# MBR + раздел 1 на весь диск (тип FAT16), затем формат FAT16.
echo "--- разметка и формат образа ---"
mt mpartition -I -c -t $CYLS -h $HEADS -s $SECS z:
@@ -64,17 +115,21 @@ mt mformat z:
echo "--- копирование файлов ---"
make_dir_tree "$DEST_DIR"
DEST_ROOT="z:${DEST_DIR:+/$DEST_DIR}"
# Аргумент может быть либо файлом (кладём в корень), либо парой
# КАТАЛОГ:файл — тогда каталог создаётся на образе и файл кладётся туда.
# Имена на Sprinter/DSS — 8.3, каталоги тоже (KID, GUARD, BG, LEVELS...).
# КАТАЛОГ:файл — тогда каталог создаётся относительно DEST_ROOT и файл
# кладётся туда. Имена на Sprinter/DSS — 8.3.
for f in "$@"; do
case "$f" in
*:*) dir="${f%%:*}"; src="${f#*:}"
target_dir="${DEST_DIR:+$DEST_DIR/}$dir"
# Каталог может уже быть — это не ошибка; stderr НЕ прячем, иначе
# непрошедший вопрос mtools снова окажется невидимым.
mt mmd "z:/$dir" >/dev/null 2>&1 || true
mt mcopy -o "$src" "z:/$dir/" ;;
*) mt mcopy -o "$f" z: ;;
make_dir_tree "$target_dir"
mt mcopy -o "$src" "z:/$target_dir/" ;;
*) mt mcopy -o "$f" "$DEST_ROOT/" ;;
esac
done