World Rally Championship

World Rally is a C++ recompilation of the World Rally arcade game for Windows, featuring Vulkan and OpenGL renderers.

README

wrally bezel

World Rally – statisch rekompiliert

World Rally Championship (Gaelco / Zigurat, 1993) als eigenständiges Windows-Programm. Das 68000-Programm des Automaten ist nach C++ übersetzt und läuft ohne Interpreter. Die übrige Hardware wird nachgebildet: der Schutzprozessor DS5002FP (ein 8051), die Gaelco-Grafik mit verschlüsseltem Video-RAM und der OKI-Soundchip. Das Ergebnis ist eine einzige wrally.exe (Launcher und Spiel, statisch gelinkt, keine DLL nötig).

Das Projekt enthält keine ROMs. Du brauchst dein eigenes, legal erworbenes wrally.zip (MAME-Set „wrally“, Version 1.0 vom 08.11.1993, Prüfsumme DE0D). Andere Sets (wrallya, wrallyb …) haben ein anderes Programm und werden nicht unterstützt.

Bauen mit MSYS2

In der „MSYS2 MINGW64“-Shell (Pakete: gcc, cmake, ninja, sdl3, vulkan-headers, glslang, python):

pacman -S mingw-w64-x86_64-{gcc,cmake,ninja,sdl3,vulkan-headers,glslang} python
cp /pfad/zu/wrally.zip roms/
bash go.sh

go.sh erzeugt aus deinem ROM den rekompilierten Code (tools/recomp_pipeline.sh → generated/), baut WorldRally_Recompiled/wrally.exe und kopiert roms/wrally.zip daneben.

Ohne Vulkan-Header oder glslang baut CMake automatisch nur mit OpenGL (-DWRALLY_VULKAN=OFF erzwingt das).

Grafik: Vulkan und OpenGL

Das Frontend nutzt SDL3. Der CRT-Shader läuft wahlweise über Vulkan oder OpenGL; beide liefern dasselbe Bild. Auswahl im Launcher (Video → Renderer), im Spiel per F4 → „Renderer“ (das Fenster wird neu geöffnet), in wrally.ini ([video] renderer=auto|vulkan|opengl|sdl) oder einmalig mit --renderer NAME.

  • auto (Standard): Vulkan, sonst OpenGL, sonst der einfache SDL-Renderer (ohne CRT-Effekte).
  • Klappt die gewählte API nicht, nimmt das Spiel die andere und als Letztes den SDL-Renderer.
  • vulkan-1.dll wird zur Laufzeit geladen; die exe startet also auch ohne Vulkan-Treiber.
  • Fehlersuche: WRALLY_VK_VALIDATION=1 schaltet die Khronos-Validierung ein (falls installiert), WRALLY_VK_DEVICE=N wählt die N-te Vulkan-GPU.

Wie der Code gefunden wird

Für World Rally findet tools/gen_recomp.py den Code selbst: rekursiv ab Reset- und Interrupt-Vektoren, dazu Konstanten und Sprungtabellen, die auf Code zeigen (vorsichtig geprüft). Sprungziele, die erst zur Laufzeit berechnet werden, stehen in data/entries_wrally.txt. Neue findet

bash tools/discover.sh

Das Skript baut eine Testversion, lässt das Spiel mit festen Eingaben und einem Zufalls-Bot laufen (WRALLY_DISCOVER=1) und wiederholt das, bis kein unbekannter Code mehr erreicht wird. Stand: 14.055 Befehle, 6 zusätzliche Einsprungstellen.

Steuerung

AktionSpieler 1Spieler 2
LenkenPfeiltastenI / J / K / L
GasZU
Schaltung (niedrig/hoch)X (schaltet um)O (halten)
Münze / Start5 / 16 / 2
Service / Testmodus9 / 0

Gamepad: Steuerkreuz oder linker Stick lenkt, A = Gas, B = Schaltung, Back = Münze, Start = Start.

Stufenlos lenken: DIP-Schalter „Control Configuration“ auf „Pot Wheel (analog stick)“ stellen (Launcher → Game Rules oder F1 im Spiel). Dann wirkt der linke Stick wie das Poti-Lenkrad des Automaten; die Pfeiltasten drehen das Lenkrad allmählich und lassen es beim Loslassen zurückfedern. Im Spiel: F1 DIP-Schalter, F2 Cheats, F3 Reset, F4 Video, F10 Pixelfilter, F11 Vollbild, Esc Beenden.

Einstellungen stehen in wrally.ini neben der exe. Launcher, Video-Presets, CRT-Shader und Bezel funktionieren über ini und ingame Tasten (Bezel: bezel/wrally.png).

Aufbau

src/machine.*         Speicherkarte, VRAM-Entschlüsselung, Ein-/Ausgabe, Takt-Verzahnung 68000/MCU
src/mcu8051.*         8051-Kern mit den DS5002FP-Registern (Partition, timed access)
src/video.*           zwei Tile-Ebenen, Sprites mit Schatten, Palette xBRG444
src/oki6295.*         OKI M6295 mit Bankumschaltung
src/recomp_cpu.cpp    Block-Dispatcher, Entdeckungsmodus
src/romset.*          ROM-Laden (ZIP/Ordner) mit CRC-Prüfung
src/launcher.*        Launcher (Dear ImGui), src/main.cpp Frontend (SDL3), Menüs
src/renderer.*        gemeinsame Renderer-Schnittstelle, Phosphor-Nachleuchten
src/vk_renderer.*     Vulkan-Renderer, src/shaders/ (GLSL → SPIR-V beim Bauen)
src/gl_renderer.*     OpenGL-2.1-Renderer mit demselben CRT-Shader
tools/                dump_prg.py, gen_recomp.py (Analyse + Übersetzung), recomp_pipeline.sh, discover.sh
data/                 entries_wrally.txt (zusätzliche Einsprungstellen), m68k_cycles.bin (Zyklentabelle)

Lizenz

Eigener Code: noch nicht festgelegt. Fremdcode in third_party/ behält seine Lizenz: miniz (MIT), stb_image (Public Domain/MIT), Dear ImGui (MIT). Hardware-Beschreibung, Entschlüsselungs-Algorithmus und ROM-Daten (Namen, CRCs) stammen aus dem MAME-Treiber gaelco/wrally.cpp; die Zyklentabelle aus Musashi.