WORK IN PROGRESS · ALPINE · CUTS

EXTENDED

VIRTUA RACING EXTENDED

Virtua Racing · Sega Model 1 (1992) · ten courses

The arcade Virtua Racing has three courses; the 1995 Saturn port added seven of its own. Those seven are converted from the Saturn disc into the arcade game's own data formats and race on the arcade's engine, in MAME: its opponents, its time limits and checkpoints, its render rate. The three original courses are untouched, byte for byte.

Work in progress. Not public yet; the game is not distributed. The ten courses race, and the tuning, the course walls and the finish are still being worked on. The converter that builds this from a player's own arcade ROM set and Saturn disc is private while it is being finished. No ROMs, disc images, patched sets or extracted data are distributed or linked to, here or anywhere, and nothing will be sent on request. The clips and pictures below are captures of the build running in MAME, shown for demonstration.

WATCH ON YOUTUBE PATCH · COMING SOON

Ten coursesPractice mode's row scrolls through ten entries: the three originals and the Saturn's seven, each with a generated select panel
The arcade's own raceFifteen opponents on every course, time limits and checkpoints per lap, the start grid and gantries re-placed on each new road
Stock MAME 0.289Every byte fits the existing ROM images, no driver change; 28 to 29 display-list switches per 57 frames, as the originals

IN MOTION

Captures of MAME running the build, at the Model 1's native 496×384 scaled 2× with no filtering, with the game's own sound. The car is driven by the project's autopilot script, which follows the road's centreline and cannot overtake, so it drives like a machine, in traffic. Each clip is cut from a longer run: the HUD clock jumps between cuts.

CUTS The select screen: the wheel scrolls the row of ten from BIG FOREST past the originals to the Saturn entries, whose generated panels show their maps in the hosts' colours. Then Pacific Coast in two cuts: 12th at full speed through a checkpoint gantry re-placed on the Saturn's road, and 7th on the second lap under the C.P. flag.
CUTS Surfers Oval in three cuts: 12th past the green infield, under a checkpoint gantry, and the seafront straight with cars ahead and alongside at full speed.

WHAT'S NEW

The game is the arcade's: its physics, its opponents' driving, its HUD, its sound. What is new is where it races.

The seven courses

Each Saturn course lives in the slot of one of the originals, whose backdrop, music and race furniture it borrows:

  • Alpine, in Big Forest's: a long mountain lap with the hairpins the Saturn version is known for.
  • Amazon Falls, in Bay Bridge's: the short lap through the falls, where the road passes close to itself.
  • Diablo Canyon, in Acropolis's: climbs and drops, with the hairpins the autopilot likes least.
  • Metropolis, in Acropolis's: the city course that crosses over itself twice.
  • Pacific Coast, in Bay Bridge's: the coast road and its own bridge.
  • Surfers Oval, in Bay Bridge's: the speedway, flat here (the Saturn's banking is left out).
  • Surfers Road, in Bay Bridge's: the road course laid out beside the speedway.

The select screen

Practice mode's three panels become a window on a row of ten. Turn the wheel and the row scrolls behind the three frames; the converted entries carry generated panels in the originals' style, a stylised map of the lap in the host's colours. The BEGINNER, MEDIUM and EXPERT labels stay with the three frames, not with the entry that scrolls into them, and the row's order is the project's choice, not the Saturn's.

A race per course

Each course has its own race tables: checkpoints at thirds of its lap, time extensions scaled from the host's by sector length, five laps, the original car table. The opponents follow generated road lines, the start grid and the gantries stand on the new road, and the hosts' own props (Bay Bridge's boards once stood on Pacific Coast's tarmac) are left out.

What stays the same

The three original courses are in their slots, unchanged; the operator settings, the HUD and the sound are the game's own (the attract rotation may show a converted course). A build takes a player's own arcade ROM set and Saturn disc and writes a new set beside them; the inputs are never modified.

Knobs for the playtest

Per course, the build can scale the opponents' pace and the time extensions and set the lap count. The shipped balance is the arcade's own tables; "average difficulty" is still to be tuned by playing, and the single-file starts of two of the hosts are as the game plays them.

HOW IT'S DONE

From the Saturn disc

Each Saturn course is a file of road slices (four planes, a normal and tilt angles each), a 16×16 grid of ground tiles, placed scenery objects with their meshes, and a backdrop. The slices are ordered into a lap by adjacency, the lap's height profile is read from the ground mesh, and the whole course is rotated and shifted so that its start lands on the arcade's absolute start grid, which is where the game spawns the player and the field.

The arcade's data

The Model 1 keeps a course as several tables. The road: a centreline and seven AI lines of road points with headings, and a segment array that maps every collision quad to a road point; the opponents' line-following rule, read from the boot ROM, decides how those must be laid out. Collision: quads for the TGP coprocessor, tarmac and verges, which answers the car's height and surface; the verges are built from the road's measured edge so that they never overlap the tarmac, and a band across the start line credits the last road point before the lap wraps. Scenery: the Saturn's tiles and objects become polygon-ROM cell objects in the arcade's own format, in the free space of the existing images, with the colour table shared by all ten courses.

Around the race

A course directory in free program ROM, reached through nine small patches of the V60 code, lets the game load any of ten entries; the select panels are generated tile maps; each course carries a race blob (time records, checkpoints, car table, lap count) and a spawn list of the host's race furniture re-placed road-relatively. All of it fits the stock images, so MAME 0.289 runs the set as it runs the original.

Checked in MAME

Every build is driven headless in MAME by a Lua autopilot. The gates: the render rate stays at the arcade's 28 to 29 display-list switches per 57 frames on every entry; the player's checkpoints fire and the clock extends on every course; in 150-second races with the full field no opponent parks, every one of the fifteen keeps moving, and the field runs at 85 to 100 % of the original courses' speed in units per second. The originals' tables are re-encoded byte for byte as a check on the decoders.

Found on the way

  • The TGP reports, of all the quads under the car, the one whose height is nearest the car's own, and breaks ties by rounding: a verge that overlaps tarmac holds a car that has once touched it. The originals' quads never overlap; now neither do these.
  • An opponent's line cursor advances only while the road point of the segment its line names is at or behind the car's own: generated lines and segments that ignored this stalled the whole field.
  • The arcade's start grid is an absolute place in the world; the player spawns relative to the host course's road, so every course is placed to put its own start there.

Speed, and the limits

  • Tested in MAME 0.289 only. Nothing has been tried on a real Model 1 board.
  • The course edges have no walls yet. The originals stop a car at their barriers; here the verges are grass 80 units wide and the game's own off-course rule puts the car back on the road after 40 frames with a wheel off the tarmac (the originals allow 128), so a car that runs wide spends a second or two on the grass or the water before it is put back. The autopilot does it at a few corners; the clips are cut around those moments. Walls are the next thing.
  • Fixed since the first captures: the player's car was not drawn for stretches at a time, because the converted ground tiles sorted in front of it (the arcade sorts whole objects by depth; the originals' ground sorts at its farthest point and ours now does too). The clips and stills here are no longer cut around it.
  • Fixed since the first captures: the HUD's course map is drawn around the player's car with the heading up, so an anticlockwise course (Alpine, Pacific Coast) hung its outline into the middle of the screen; those two courses now draw their map and the car's cross 11 cells further right, in the originals' corner.
  • Built from the European Saturn release only; other regions' discs are not tested.
  • The AI lines are offsets of the centreline, not hand-made racing lines; on the Bay Bridge and Acropolis hosts the game lines the field up single file ahead of the player, as the original Bay Bridge does.
  • The Saturn's banking, backdrops and music per course are not carried over; each converted course uses its host's.
  • Difficulty is not yet tuned: the clock and the opponents are the host's tables, scaled by sector length.

GET THE PATCH

Coming soon. The converter is private until it is finished; when it is published, this is what it will be.

What you will need

  • Your own copy of the arcade game: the MAME 0.289 vr ROM set, all 38 files, with model1io.zip and m1comm.zip beside it.
  • Your own copy of the Saturn port: Virtua Racing (Europe) as a .cue with its .bin.
  • Python 3.12 or later, and MAME 0.289 to play.

One command checks the inputs, names anything wrong with them (a file with the wrong checksum, a disc of another region), and writes a new folder beside your files without touching them.

What will be in it

None of the game. The repository will hold the converter and its tests, the notes on the arcade's and the Saturn's data formats, and facts about the original program: addresses, sizes and checksums. Every course's road, collision, scenery and race tables are computed from your own disc when the build runs.

SCREENSHOTS

Native 496×384 frames from MAME, shown pixel for pixel.

The Practice select screen with the row at its start: BIG FOREST, BAY BRIDGE highlighted in the middle frame, ACROPOLIS
The select screen at the row's start: the three originals in their frames, the countdown running.
The select screen scrolled to three Saturn entries: generated map panels in the host's tan, the middle one highlighted
Scrolled on to the Saturn entries: generated panels in the originals' style, each a map of its lap, under the frames' own labels.
Alpine: the player's car 7th at a checkpoint gantry at 324 km/h, the road curving ahead under a cloudy sky
Alpine, in Big Forest's slot: 7th through a checkpoint gantry.
Amazon Falls: the player's car 6th at 330 km/h with flags and a gantry ahead, an opponent at the left edge
Amazon Falls, the short lap, in Bay Bridge's slot: 6th at full speed.
Diablo Canyon: the player's car 15th at 207 km/h on the road along the water, the field small ahead
Diablo Canyon, in Acropolis's slot, soon after the start: the field pulling away.
Metropolis: the player's car 13th at 324 km/h on the road along the water, hills behind
Metropolis, in Acropolis's slot, with the host's sea and hills behind.
Surfers Oval: the player's car 11th at 331 km/h between a white car on the left and a green one on the right, the sea beyond
Surfers Oval, flat (the Saturn's banking is left out): three abreast on the seafront.
Surfers Road: the player's car 16th at 306 km/h under a C.P. gantry
Surfers Road, in Bay Bridge's slot: last through the checkpoint.