21/07/2026
Paramétrer Batocera pour lancer les jeux Amstrad CPC tenant sur une disquette ne pose pas de problème : le jeu est automatiquement décompressé et lu par RetroArch. C'est lorsqu'il s'agit de jeux tenant sur plusieurs disquettes que des soucis peuvent se présenter.
Sur émulateur, l'approche classique pour gérer les jeux nécessitant plusieurs disques consiste à :
- Créer un fichier M3U listant les fichiers DSK du jeu
- Placer les fichiers DSK dans ce même répertoire car RetroArch ne lit pas directement les archives
Plusieurs inconvénients se présentent sur cette façon de faire :
- Les fichiers DSK ne sont pas compressés dans le répertoire des ROMs (alors qu'on obtient régulièrement des taux de compression de 300% sur les DSK)
- On a plusieurs fichiers pour un seul jeu : il est quand même plus pratique de ne manipuler qu'un seul fichier par jeu. Et le fichier M3U parasite légèrement le répertoire car il ne s'agit pas d'une ROM en soit.
- EmulationStation affiche le jeu en plusieurs exemplaires : un par disque et un pour le fichier M3U.
Proposition d'une nouvelle approche
Je souhaite utiliser un seul fichier 7Zip par jeu, et ceci quel que soit le nombre de disques.
Voici le fonctionnement pour mettre ceci en place :
- Chaque archive (ZIP ou 7ZIP) contient l'ensemble des fichiers DSK ainsi qu'un fichier M3U.
- Le fichier M3U liste les fichiers DSK, sans présenter de sous-répertoire. Par exemple :
Sram_Disk_1_of_2.dsk
Sram_Disk_2_of_2.dsk
- Lors du scan des jeux par EmulationStation, un seul fichier ROM est trouvé : celui de l'archive.
- Lors du lancement d'un jeu, un script dédié se cale avant l'appel à RetroArch et décompresse les fichiers DSK dans le répertoire attendu par RetroArch.
- EmulationStation continue le lancement et envoie à RetroArch le nom de l'archive. RetroArch décompresse uniquement le fichier M3U.
Script pour décompresser les DSK des archives multi-disques
Il faut savoir que les scripts présents dans /userdata/system/scripts sont lancés par EmulationStation dans plusieurs cas :
- Juste après avoir lancé un jeu et avant le lancement de RetroArch
- Lorsqu'un jeu est fermé dans RetroArch
On va exploiter ce fonctionnement en créant un script dédié :
- Allez sur la machine en ligne de commande et paramétrez le répertoire du script :
mkdir /userdata/system/scripts/
touch /userdata/system/scripts/lancement_rom_amstrad_cpc.sh
chmod +x /userdata/system/scripts/lancement_rom_amstrad_cpc.sh
- Modifiez le fichier lancement_rom_amstrad_cpc.sh ainsi créé et collez-y le code suivant :
#!/bin/bash
set -e
# Ce script gère la décompression de ROMS pour Amstrad CPC tenant sur plusieurs disquettes
# Pré-requis :
# ------------
# - Avoir une archive zip/7zip contenant les fichiers DSK + un fichier MP3 les listant
# - Le fichier M3U liste l'ensemble des fichiers DSK
# A noter que ces fichiers DSK ne doivent pas contenir les caractères : ( )
#
# Fonctionnement :
# ----------------
# Seul le fichier M3U est extrait par RetroArch tandis que les fichiers DSK sont extraits par ce script,
# pour les placer dans le répertoire temporaire
#
# Eric Quillévéré / juillet 2026
#
CHEMIN_7Z="/usr/bin/7z"
REP_EXTRACTION_ROM="/userdata/system/configs/retroarch/cache/"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LOG="$SCRIPT_DIR/lancement_rom.log"
ACTION="${1:-}"
SYSTEM="${2:-}"
chemin_complet_archive="${5:-}"
# Supprime le fichier de log
rm -f "$LOG"
echo "=== $(date -Is) ===" >>"$LOG"
echo "- Fichier ROM : $chemin_complet_archive" >> "$LOG"
if [ -n "$chemin_complet_archive" ] \
&& { [ "${chemin_complet_archive<a class="lien_interne" href="/programmation/langages/php/creer-tache-cron-serveur-php_14508.htm">Créer une tâche CRON pour PHP</a>*.}" = "7z" ] || [ "${chemin_complet_archive<a class="lien_interne" href="/programmation/langages/php/creer-tache-cron-serveur-php_14508.htm">Créer une tâche CRON pour PHP</a>*.}" = "zip" ]; } \
&& [ "$SYSTEM" = "amstradcpc" ]; then
echo "- Rep extraction : $REP_EXTRACTION_ROM" >>"$LOG"
case "$ACTION" in
gameStart)
# Supprime le contenu du répertoire
find "$REP_EXTRACTION_ROM" -mindepth 1 -delete
# Vérifie accès 7Z
if [ -z "$CHEMIN_7Z" ] || [ ! -x "$CHEMIN_7Z" ]; then
echo "ERREUR: 7z non trouvable/executable. PATH=$PATH" >>"$LOG"
exit 1
fi
cmd=(
"$CHEMIN_7Z" x -y -bb0 -bso0 -bsp0
-o"$REP_EXTRACTION_ROM"
"$chemin_complet_archive" "*.dsk" "*.DSK"
)
printf '%q ' "${cmd[@]}" >>"$LOG"; printf '\n' >>"$LOG"
"${cmd[@]}" >>"$LOG" 2>&1
rc=$?
echo "- Code retour 7zip : $rc" >>"$LOG"
;;
gameEnd|gameStop)
find "$REP_EXTRACTION_ROM" -mindepth 1 -delete
echo "Répertoire vidé" >>"$LOG"
;;
esac
fi
- Vérifiez que le répertoire d'extraction des ROMs (variable REP_EXTRACTION_ROM) correspond bien à votre installation.
- Pour tester ce script, vous pouvez vérifier sur les jeux d'aventure SRAM ou La Chose de Grotembourg, qui nécessitent rapidement un changement de disque :
- Créez un fichier sram.m3u
- Mettez le contenu suivant dans le fichier et sauvez-le :
Sram_Disk_1_of_2.dsk
Sram_Disk_2_of_2.dsk
- Créez une archive 7zip de ce fichier et ajoutez-y les 2 ROMs avec les noms correspondants. A noter que ces fichiers DSK ne doivent pas contenir certains caractères comme ( ).
- Déposez l'arvhive sram.7z dans votre répertoire de ROMs Amstrad
- Sur EmulationStation, actualisez la liste des jeux.
- Recherchez le jeu SRAM
- Lancez-le
- Allez dans le paramétrage de RetroArch, puis Contrôle du disque, Ejecter le disque, Changez le disque, Insérer le disque. RetroArch doit vous proposer 3 disques (les 2 fichiers DSK et le fichier M3U, qui n'est lui pas utilisable).
Si tout fonctionne, vous pouvez appliquer cette méthode sur vos autres ROMs Amstrad, c'est là que le second script entre en jeu !
Script pour ajouter les M3U aux archives multi-disques
Ce script n'est à lancer qu'une seule fois (il ne fera rien la fois suivante de toute façon). Il itère les archives Zip et 7Zip d'un répertoire donné pour créer automatiquement le fichier M3U s'il n'existe pas dans l'archive.
- Allez sur la machine en ligne de commande et paramétrez le répertoire du script :
touch /userdata/system/scripts/cree_m3u.sh
chmod +x /userdata/system/cree_m3u.sh
- Modifiez le fichier cree_m3u.sh ainsi créé et collez-y le code suivant :
#!/bin/bash
set -e
# Ce script recherche tous les fichier .zip et .7z d'un répertoire, contenant au moins 2 DSK et pas de fichier M3U
#
# Fonctionnement :
# ----------------
# Lancer le script sur un répertoire : cree_m3u /userdata/roms/amstradcpc/
#
# Pour les fichiers trouvés, il crée un fichier M3U listant l'ensemble des fichiers DSK
# et recrée l'archive initiale
#
# Eric Quillévéré / juillet 2026
#
CHEMIN_7Z="/usr/bin/7z"
if [[ -z "$1" ]]; then
echo "Usage: $0 /chemin_roms"
exit 1
fi
rep_source="$1"
if [[ ! -d "$rep_source" ]]; then
echo "Le répertoire n'existe pas: $rep_source"
exit 1
fi
# Crée un dossier temporaire unique
tmp_root="$(mktemp -d)"
# Définit une fonction cleanup qui supprime récursivement ce dossier
cleanup() { rm -rf "$tmp_root"; }
# Quand le script se termine, le nettoyage est fait
trap cleanup EXIT
echo "Parcours le répertoire $rep_source"
for archive in "$rep_source"/*.zip "$rep_source"/*.7z "$rep_source"/*.ZIP "$rep_source"/*.7Z; do
[ -e "$archive" ] || continue
ext_lc="$(echo "${archive<a class="lien_interne" href="/programmation/langages/php/creer-tache-cron-serveur-php_14508.htm">Créer une tâche CRON pour PHP</a>*.}" | tr '[:upper:]' '[:lower:]')"
base_noext="$(basename "${archive%.*}")"
default_m3u="${base_noext}.m3u"
# Passe au suivant si un seul fichier DSK
dsk_count="$(
"$CHEMIN_7Z" l "$archive" 2>/dev/null \
| grep -Ei '\.dsk$' \
| wc -l | tr -d ' '
)"
if [[ "$dsk_count" -le 1 ]]; then
continue
fi
# Passe au suivant si un .m3u existe déjà dans l'archive (insensible à la casse)
if "$CHEMIN_7Z" l "$archive" 2>/dev/null | grep -Ei '\.m3u$' -q; then
continue
fi
workdir="${tmp_root}/${base_noext}"
mkdir -p "$workdir"
echo "-> Crée M3U pour $archive"
# Extraire TOUT le contenu (pour conserver les autres fichiers comme file_id.diz)
"$CHEMIN_7Z" x -y -o"$workdir" "$archive" >/dev/null
# Renomme uniquement les .dsk (insensible à la casse), en supprimant '(' et ')'
find "$workdir" -type f -iname "*.dsk" -print0 | while IFS= read -r -d '' f; do
dir="$(dirname "$f")"
old="$(basename "$f")"
new="${old//[()]/}"
[[ "$new" == "$old" ]] && continue
target="${dir}/${new}"
# Collision éventuelle après nettoyage
if [[ -e "$target" ]]; then
stem="${new%.*}"
suffix="${new<a class="lien_interne" href="/programmation/langages/php/creer-tache-cron-serveur-php_14508.htm">Créer une tâche CRON pour PHP</a>*.}"
i=1
while [[ -e "${dir}/${stem}_$i.${suffix}" ]]; do
i=$((i+1))
done
target="${dir}/${stem}_$i.${suffix}"
fi
mv -f -- "$f" "$target"
done
# Créer le .m3u à la racine de l'archive, listant tous les .dsk (insensible à la casse)
chemin_m3u="${workdir}/${default_m3u}"
: > "$chemin_m3u"
# On liste les noms tels qu'ils seront dans l'archive
while IFS= read -r line; do
echo "$line" >> "$chemin_m3u"
done < <(
find "$workdir" -type f -iname "*.dsk" \
-printf '%P\n' | sort | grep -v '[()]'
)
# Repack : recrée l'archive en gardant tout
nouvelle_archive="${archive}.new"
if [[ "$ext_lc" == "zip" ]]; then
(cd "$workdir" && "$CHEMIN_7Z" a -tzip "$nouvelle_archive" -y -r . >/dev/null)
else
(cd "$workdir" && "$CHEMIN_7Z" a -t7z "$nouvelle_archive" -y -r . >/dev/null)
fi
mv -f -- "$nouvelle_archive" "$archive"
done
echo "Terminé"
- Lancez le script sur vos ROMs Amstrad (sauvegardez-les avant, au cas où bien sûr)
bash ./cree_m3u.sh /userdata/roms/amstradcpc/
- Vérifiez que vos ROMs concernées ont bien été modifiées, grâce au retour de la commande:
![]()
Une fois vos ROMs traitées, vous avez à présent un seul fichier archive par ROM dans le répertoire dédié et celles-ci sont automatiquement décompressées lors de l'utilisation de RetroArch.
Dernière modification le 21/07/2026 - Quillevere.net