SprPoP: обобщить HDD-сборку и очистить метаданные
Добавить общий каталог назначения для HDD и удалить локальную копию упаковщика.\n\nУбрать устаревшие generated-имена ресурсов, выводить число страниц Kid из kid.arc и ограничить звуковую таблицу горячим модулем.\n\nЗафиксировать планы runtime-индексов музыки и PCM-эффектов.
This commit is contained in:
+67
-12
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user