I was the main programmer on both the Playstation and 3D0 versions of Onside soccer, helping out with the PC version. The PC version was already underway when I started working at Elite Systems in October ’94. Initially, I was working solely on the 3D0 version, somewhat annoyed that I couldn’t play Doom like everyone else, because my 3D0 devkit was hooked up to an Apple Quadra 840AV, or some such beast.
The 3Do was a very nice console to work on. The debug tools were easy to use and reliable. The development itself used Macintosh Programmer’s Workshop. My favourite feature about editing code in MPW, is that the command line and the editor are the same thing. If you hit enter on the keypad, the current line in the file you are editing is executed through the CLI, and any output is written back into the file you’re editing. It sounds weird – ok, it sounds awful – but it was actually very useful. It was great for generating and embedding static arrays of data in the C code.
Onside 3D0 was written in a mixture of C and ARM assembly language. Profiling would quickly identify the C functions that were being hit the most, and these were candidates for hand-coding in assembly language. With more insight than the compiler into what the functions were doing, I was usually able to squeeze out at least an additional 30% speed improvement. A lot of the speedup came from knowing what values to keep in registers and what, if anything, needed to be pushed to the stack. If a function call had more than four parameters, the stack came into use and that was a big performance hit.
I remember one cunning trick to cut down on memory use. The cell engine (image renderer) had a RLE format, but the minimum stride between scan lines was something like 32 bytes. A small enough image may use 16 or less bytes, leaving empty space in the upper 16 bytes of each scan line. You could interleave a second small image at a 16 byte offset to the first, and even though the data is mixed, because the RLE contains an end-of-line code, the two images can exist in the same space without affecting the renderer.
I ended up writing a video codec for the game. I was all set to use the cinepak library that was included in the SDK, but a soak test I left running revealed that it was leaking a small amount of memory every time it played a movie. Not good when there’s basically no memory left to use. The codec I came up with used run-length encoded 2×2 and single pixel deltas from the previous frame, including an initial x/y offset of the previous frame in order to minimize the delta caused by camera pans. The encoder ran multiple passes on each frame, increasing or decreasing the margin of difference between the target color and decoded color to achieve the best quality possible in the amount of data it was allowed to use (approx 18KB). Audio was interleaved.
The 3D0 version, shown above, was abandoned late into the development, partly because the console itself was pretty much DOA, and mostly because the Playstation programmer quit. I had to finish off the Playstation version instead. “Finish off” didn’t sound that bad until we had a look at the code and found what little that had been done, had been done working to the devkit’s 8MB memory profile, instead of the console’s 2MB limit. Oh dear.
The lead programmer was then fired for allegedly punching the QA manager over a missed fantasy football transfer request. The PC version, which was originally using 3d meshes for the players, was rewritten to look more like the 3D0 version, which was sprite based.
Both the PC and Playstation versions were published by Telstar. The 3D0 version was never completed.
In 2002, I received an inquiry about the status of the 3D0 version, with the aim of ressurecting the project. The only version I had was an old test CD, condition unknown.
I referred the inquirer to Elite Systems, and didn’t hear anything else. I recently discovered that OlderGames.com managed to get a hold of the game and released it in 2007, albeit in it’s unfinished state. Looks like they’ve gone out of business now, which is a shame, as I wouldn’t have minded a copy myself!