Bonjour à tous,
Je voulais vous présenter Encore, un émulateur Pinball 2000 que je développe depuis plusieurs mois. Tout est écrit depuis zéro, en C, sous Linux, et publié en open source.
https://github.com/ThomazPom/Encore-Pinball2000
L'objectif est simple : faire tourner le logiciel d'origine de Star Wars Episode I et Revenge From Mars sur un PC moderne, sans dépendre d'aucune solution fermée. Jusqu'ici, le seul outil qui existait était
un fork de QEMU 0.8.1 datant de 2007, fermé, qui ne se compile plus sur un Linux 64 bits récent. Encore repart de zéro, le code est lisible, documenté, et se compile en quelques secondes.
Ce qui fonctionne aujourd'hui
- Boot complet du système XINA depuis les ROMs d'origine
- Affichage vidéo natif (SDL2)
- Audio DCS dans les deux modes (BAR4 et IO-handled)
- Passthrough LPT pour piloter du vrai matériel via le port parallèle
- Mode headless et matrice de régression : 12 combinaisons jeu × version × mode DCS sur 12 passent boot + affichage + activité audio
Versions actuellement dans le périmètre :
- SWE1 : v1.5 (officielle Williams) et v2.1 (communauté)
- RFM : v1.6 (r2), v1.8 (officielle Williams), v2.5 et v2.6 (communauté)
L'émulateur sélectionne par défaut la dernière mise à jour compatible, parce que les ROMs de base seules déclenchent un panic en sysinit XINA — ce qui est cohérent avec ce qu'on trouvait flashé sur les
cartes en sortie d'usine.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Documentation
41 pages couvrant l'architecture, le CPU, le memory map, le pipeline de chargement des ROMs, le deinterleave, le loader d'updates, les deux modes DCS, le watchdog, la symbol table, le boot XINU, le
correctif de l'ordonnanceur, le VBLANK, le LPT réel, la philosophie de patching, la distinction entre exceptions fatales et non fatales, les différences entre RFM et SWE1, et l'historique complet du projet.
Ce n'est pas un README marketing : c'est la véritable histoire technique.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Encore n'a pas encore été validé sur un cabinet Pinball 2000 complet. La partie émulation est solide et reproductible, mais il manque la confrontation au terrain : bobines, switches et lampes via du vrai
matériel. C'est précisément là que j'aurais besoin de la communauté.
Ce que je cherche :
- Des possesseurs de RFM, de SWE1, ou même d'une carte CPU seule, prêts à tenter Encore via LPT
- Des retours de tests sur matériel réel, même partiels (lampes seules, switches seuls, son seul — tout est utile)
- Des échanges techniques avec ceux qui connaissent bien la plateforme
https://github.com/ThomazPom/Encore-Pinball2000
Captures d'attract SWE1 et RFM dans le README, index complet de la documentation accessible depuis la page d'accueil.
Merci d'avance.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Quelques découvertes concrètes, toutes documentées dans le dépôt.
- Une banque de ROM Pinball 2000, ce sont huit puces physiques entrelacées par paires de 16 bits, et non un seul gros dump linéaire. Les puces U100 à U107 portent chacune 2 Mo d'une voie (« byte-lane ») du
bloc logique de 16 Mo. Le motif est le suivant : l'octet 0 vient de U100, l'octet 1 de U101, l'octet 2 de U102… puis l'octet 8 revient sur U100, avec un pas de 16 (8 puces × 2 octets). Si on dumpe puce par
puce et qu'on concatène naïvement, on obtient une bouillie illisible — il faut réentrelacer à la granularité de 2 octets. Encore fournit le script tools/deinterleave_rebuild.sh pour ça, et la fonction
interleave_file() dans src/rom.c documente le code exact.
- Williams ne peuplait que la banque 0 sur les cartes sorties d'usine. Les banques 1 à 3 étaient prévues côté hardware mais restées vides. Encore réserve l'espace, à blanc.
- Une table de présence DCS de 4 Ko à l'offset 0x10000 de la banque 0 : le jeu la lit en début d'init pour décider si la carte son DCS-2 est physiquement présente. Or, sur certains bundles dearchivés qui
circulent, cette table a été mise à zéro par l'outil de dearchivage, qui ignorait qu'elle avait un sens. Résultat : le jeu saute l'init DCS, et il faut alors passer en --dcs-mode bar4-patch côté Encore pour
récupérer le son. C'est désormais documenté noir sur blanc.
- L'installeur Williams .exe est en réalité un ZIP renommé. Encore le détecte avec un unzip -l silencieux, l'extrait dans un dossier temporaire, et reconstruit l'image update.bin de 4 Mo en concaténant les
quatre payloads (bootdata.rom, im_flsh0.rom, game.rom, symbols.rom) à des offsets fixes. L'aller-retour avec tools/build_update_bin.py est strict.
- Une cinquième ROM cachée dans chaque bundle : à côté de bootdata.rom, im_flsh0.rom et game.rom, chaque mise à jour embarque un blob symbols.rom portant le magic "SYMBOL TABLE" — une véritable table de
symboles que Williams utilisait pour son analyse post-mortem. Encore s'en sert au runtime pour éviter de coder en dur les adresses dépendantes de la version. Conséquence : ajouter une nouvelle version se
fait sans toucher au code.
Du côté de l'OS et du runtime :
- XINA, c'est « It's Not APPLE » — le système d'exploitation que tout jeu Pinball 2000 fait tourner. APPLE était l'OS du WPC (« Applied Pinball Programming Language Environment »). Williams a construit
XINA par-dessus PC-XINU (Université Purdue, Douglas Comer) plutôt que Linux pour deux raisons : un modèle temps-réel plus simple, et une licence non-GPL — leur service juridique refusait l'obligation de
publier les modifications de noyau.
- Le bandeau XINU: V7 au boot, c'est en fait deux couches : XINA: V1.12 côté applicatif, XINU: V7 côté noyau.
- Le scanner du watchdog : pour ne pas planter au reboot logiciel, il faut nourrir une cellule mémoire que le watchdog scrute. Plutôt que coder son adresse en dur pour chaque version, Encore la trouve à
l'exécution par un balayage en quatre étapes : il cherche la chaîne "pci_watchdog_bone(): the watchdog has expired" en RAM, remonte au PUSH imm32 qui la pousse sur la pile, recule jusqu'au CALL rel32 le
plus proche, et identifie l'idiome CMP dword [addr32], 0xFFFF qui révèle l'adresse de la cellule. Indépendant de la version. C'est probablement la pièce de reverse la plus utile du projet.
- La sonde DCS et son motif d'écriture inversé : la même cellule mémoire sert à la fois de sonde DCS et de keep-alive du watchdog, et la polarité dépend du mode (0 ou 0xFFFF). C'est ce qui permet à Encore
de proposer deux modes audio DCS distincts (BAR4 et IO-handled) au lieu d'un seul.
- Le bug du JMP $ (BT-74) : XINU termine sa fonction nulluser() par for(;;); (opcodes EB FE). Sur du vrai MediaGX 200 MHz, le timer matériel coupe la boucle. Sous Unicorn Engine, en revanche, uc_emu_start
ne rend jamais la main — aucun IRQ0 n'est livré, et tout l'ordonnanceur XINU reste figé. Pendant des semaines, le boot finissait sur écran noir. Le correctif : un balayage de motif sur la séquence et une
injection contrôlée d'IRQ0.
Petit résumé des commandes et arguments
Lancer le jeu rapidement :
./build/encore --game swe1
./build/encore --game rfm
Encore détecte automatiquement les ROMs dans ./roms/ et choisit la dernière mise à jour disponible.
Choisir une version précise :
./build/encore --game swe1 --update 0150 # Williams officielle
./build/encore --game swe1 --update 0210 # communauté
./build/encore --game swe1 --update none # ROMs de base seules
./build/encore --game rfm --update /chemin/vers/update.bin
Le flag --update accepte aussi un dossier de bundle, un installeur .exe Williams (ZIP renommé), ou directement un update.bin pré-construit.
Mode son DCS :
--dcs-mode bar4-patch # défaut, fonctionne sur tous les bundles
--dcs-mode io-handled # sans patch, sonde PCI naturelle du jeu
Console série XINA en TCP (pas besoin de fenêtre SDL) :
./build/encore --game swe1 --serial-tcp 4444 &
nc localhost 4444
On voit le shell XINA, les pinevents, les assertions, les crash dumps. Compatible script.
Headless :
./build/encore --game swe1 --headless --serial-tcp 4444
Ni fenêtre, ni audio — juste le CPU et la console série en TCP.
Pilotage d'une vraie carte Pinball 2000 via port parallèle :
sudo modprobe ppdev parport parport_pc
sudo usermod -a -G lp $USER
./build/encore --game swe1 --lpt-device /dev/parport0
Forwarde tout le trafic LPT (0x378/0x379/0x37A) vers la vraie carte. Forcer l'émulation : --lpt-device none.
Autres flags utiles :
--no-savedata # boot propre, ne charge ni n'écrit la NVRAM
--fullscreen # plein écran direct
--flipscreen # affichage retourné verticalement
--roms /chemin # dossier ROMs alternatif
--savedata /chemin # dossier de sauvegarde alternatif
--config encore.yaml # tous les flags dans un fichier (auto-chargé si présent)
Touches dans la fenêtre SDL (positionnelles, marchent sur AZERTY/QWERTY) :
┌───────────────────────┬─────────────────────────────────────────────┐
│ Touche │ Action │
├───────────────────────┼─────────────────────────────────────────────┤
│ F1 │ Quitter │
├───────────────────────┼─────────────────────────────────────────────┤
│ F2 │ Retourner l'affichage verticalement │
├───────────────────────┼─────────────────────────────────────────────┤
│ F3 │ Capture d'écran (PNG dans ./screenshots/) │
├───────────────────────┼─────────────────────────────────────────────┤
│ F4 │ Ouvrir / fermer la coin door │
├───────────────────────┼─────────────────────────────────────────────┤
│ F6 / F9 │ Boutons d'action gauche / droit │
├───────────────────────┼─────────────────────────────────────────────┤
│ F7 / F8 │ Flippers gauche / droit │
├───────────────────────┼─────────────────────────────────────────────┤
│ F10 ou C │ Insérer un crédit (mash pour multi) │
├───────────────────────┼─────────────────────────────────────────────┤
│ F11 ou Alt+Entrée │ Plein écran │
├───────────────────────┼─────────────────────────────────────────────┤
│ Espace ou S │ Bouton Start │
├───────────────────────┼─────────────────────────────────────────────┤
│ Alt+K │ Captures clavier brut → PS/2 du jeu │
└───────────────────────┴─────────────────────────────────────────────┘
Panneau coin door (4 boutons, double rôle attract / service) :
┌────────────────┬─────────────────┬────────────────┐
│ Touche │ Attract │ Service / Test │
├────────────────┼─────────────────┼────────────────┤
│ Échap / ← │ Service Credits │ Escape │
├────────────────┼─────────────────┼────────────────┤
│ ↓ / Pavé − │ Volume − │ Menu Down │
├────────────────┼─────────────────┼────────────────┤
│ ↑ / Pavé + │ Volume + │ Menu Up │
├────────────────┼─────────────────┼────────────────┤
│ → / Entrée │ Begin Test │ Enter │
└────────────────┴─────────────────┴────────────────┘
Référence complète : ./build/encore --help ou la page CLI dans la doc.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Encore — un nouvel émulateur Pinball 2000, écrit from scratch et open source
-
kbboard
- Dept: 56
- Rech/Achete: 0 flip
- Messages : 128
- Inscription : ven. 13 01, 2023 15:01
- Niveau : Débutant
- Pro / revendeur : non
Re: Encore — un nouvel émulateur Pinball 2000, écrit from scratch et open source
BRAVO ! Quel travail, c'est géant
Courage pour la suite !!!
Courage pour la suite !!!
À bas le 2 €/3 crédits !!!! Vive le 10 francs/5 crédits !
- flip78
- Dept: 78
- Rech/Achete: 0 flip
- Messages : 1845
- Inscription : lun. 26 05, 2008 23:09
- Niveau : Expert
- Localisation : Verneuil sur Seine
- Contact :
Re: Encore — un nouvel émulateur Pinball 2000, écrit from scratch et open source
Beau travail !
Très intéressant ce que tu as documenté sur les parties software.
Très intéressant ce que tu as documenté sur les parties software.
Expert en flippers électroniques GOTTLIEB des SYS80 aux SYS3
Hmm, Hmmm, Qu'a dit le monstre à trois têtes ? Ne vous mêlez pas de choses que vous ne comprenez pas. (IRON MAIDEN --- PIECE OF MIND)
Retrouvez nous également ici : http://www.flipprojets.fr/
Hmm, Hmmm, Qu'a dit le monstre à trois têtes ? Ne vous mêlez pas de choses que vous ne comprenez pas. (IRON MAIDEN --- PIECE OF MIND)
Retrouvez nous également ici : http://www.flipprojets.fr/
- sebinouse
- Dept: 75
- Rech/Achete: 0 flip
- Messages : 91
- Inscription : dim. 29 09, 2019 22:15
- Niveau : Initié
- Pro / revendeur : non
- Localisation : Paris
Re: Encore — un nouvel émulateur Pinball 2000, écrit from scratch et open source
Super travail ! BRAVO !
Je n’ai pas encore remonté mon RFM mais je vais tester d’installer tout ça sur un nouveau PC.

Je n’ai pas encore remonté mon RFM mais je vais tester d’installer tout ça sur un nouveau PC.