Motocross Championship

Behold, a rushed 32X sports game that uses JPEGs so gratuitously.

Error and JPEG conversion tool Text
There is quite a bit of text relating to all sorts of errors, mostly, if not completely, relating to the JPEG technology used in this game. Naturally, these wouldn't show up while playing the game.



Insufficient memory (case %d)

Bogus free_small request

Image too wide for this implementation



Bogus free_small_sarray request



Bogus free_small_barray request



Bogus access_big_sarray request

Virtual control array messed up



Bogus access_big_barray request



Bogus free_big_sarray request



Bogus free_big_barray request



Premature EOF in JPEG



Skipping marker 0x%02x, length %u

Define Huffman Table 0x%02x

%3d %3d %3d %3d %3d %3d %3d %3d Bogus DHT counts

Bogus DHT index %d



Define Arithmetic Table 0x%02x: 0x%02x

Bogus DAC index %d

Bogus DAC value 0x%x



Define Quantization Table %d precision %d

Bogus table number %d



Bogus length in DRI Define Restart Interval %u



Unsupported JFIF revision number %d.%02d

Warning: unknown JFIF revision number %d.%02d

JFIF APP0 marker, density %dx%d %d

with %d x %d thumbnail image

Warning: thumbnail image size does not match data length %u

Unknown APP0 marker (not JFIF), length %u

Short APP0 marker, length %u



Start Of Frame 0x%02x: width=%u, height=%u, components=%d

Empty JPEG image (DNL not supported)

Unsupported JPEG data precision

Component %d: %dhx%dv q=%d



Bogus SOS length

Start Of Scan: %d components

Invalid component number in SOS

c%d: [dc=%d ac=%d]



Start of Image



Corrupt JPEG data: %d extraneous bytes before marker 0x%02x



Unexpected marker 0x%02x



Not a FF file

Not a M_SOI file

Not a JPEG file

Unsupported SOF marker type 0x%02x

Unrecognized component IDs %d %d %d, assuming YCbCr



End of Image

Corrupt JPEG data: found 0x%02x marker instead of RST%d

At marker 0x%02x, recovery action %



Arithmetic coding not supported

Bogus sampling factors



Empty JPEG file



Backing store not supported



Corrupt JPEG data: premature end of data segment



Corrupt JPEG data: bad Huffman code



Use of undefined Huffman table



Corrupt JPEG data: %d extraneous bytes before marker 0x%02x



Bogus JPEG colorspace

Unsupported JPEG colorspace

Unsupported color conversion request



Cannot quantize to fewer than %d colors



Cannot quantize more than %d color components

Cannot request more than %d quantized colors

Quantizing to %d = %d*%d*%d colors

Quantizing to %d colors



Selected %d colors for quantization



Cannot request less than 8 quantized colors

Cannot request more than %d quantized colors



Should not get here!

2-pass quantization only handles YCbCr input



Too many components for interleaved scan

I'm confused about the image width

Sampling factors too large for interleaved scan



Didn't expect more than one scan



CCIR601 upsampling not implemented yet

Fractional upsampling not implemented yet

Uncompiled code
Staring at, an entire segment of uncompiled source code can be found within the game's data. The #ifdef PC and #ifdef MARS (the 32x's codename) lines and their associated comments suggest a PC port that ultimately never surfaced.

to limit the # of lines that need to be drawn DrawScrollPlane(2, &CopyOfCamera2, camDX, lineCountForBackGround);
 * 1) endif
 * 1) endif

DrawObjects (CopyOfCamera2.currentTile, NumberOfTiles, RoadDistances, 		TileScreenPositionArray, SM);

DrawPlayerLapFlag(2);

if (SM == MASTER) {	   Camera1Data = CopyOfCamera1; Camera2Data = CopyOfCamera2; }
 * 1) ifdef MARS
 * 1) endif

}   else /* Not split screen. */   {	CopyOfCamera1 = Camera1Data; /* Copy the whole structure. */

WindowWidth = SMALLWINDOWWIDTH; HalfWindowWidth = WindowWidth / 2; WindowX = SCREENWIDTH / 2 - HalfWindowWidth; WindowY = SCREENHEIGHT / 2 - SMALLWINDOWHEIGHT / 2; WindowHeight = SMALLWINDOWHEIGHT; WindowScaleFactor = 2; WindowX = WINDOWXMARGIN; WindowWidth = SCREENWIDTH - (WINDOWXMARGIN * 2); HalfWindowWidth = WindowWidth / 2; WindowY = 4; WindowHeight = SCREENHEIGHT - (WINDOWYMARGIN * 2) - 4; WindowScaleFactor = 1;
 * 1) ifdef DEBUGSPEED
 * 1) else
 * 1) endif

/* PC background is a full screen and must be drawn first. */   drawBackground (FALSE, 0, 0, SM);
 * 1) ifdef PC
 * 1) endif

NumberOfTiles = CalculateTileAndCameraPositions (TileScreenPositionArray,   &CopyOfCamera1, &camDX, &camDY);

// .......... calc the difference in absolute heights between the bike and camera heightDiffForHorizon = (CopyOfCamera1.SubjectBikeTileHeight + CopyOfCamera1.subjectBike->bottomY) - (CopyOfCamera1.absoluteTileHeight + CopyOfCamera1.yOffset);

lineCountForBackGround = DrawGround (NumberOfTiles, RoadDistances,	TileScreenPositionArray, SM);

// .......... 32X background gets drawn after, to limit the # of lines that need to be drawn DrawScrollPlane(1, &CopyOfCamera1, camDX, lineCountForBackGround); DrawObjects (CopyOfCamera1.currentTile, NumberOfTiles, RoadDistances, 	TileScreenPositionArray, SM);
 * 1) ifdef MARS
 * 1) endif

DrawPlayerLapFlag(1);

ShowNum(heightDiffForHorizon);
 * 1) if 0
 * 1) endif

if (SM == MASTER) {	   Camera1Data = CopyOfCamera1; }
 * 1) ifdef MARS
 * 1) endif

}

/* Print out the debug value. */   if (SM == MASTER) {       char TempString [40];
 * 1) if 0
 * 2) ifdef DEBUG

#ifdef DEBUGSPEED #else IntToAscii ((int) DebugValue, TempString, 10); PutString (0, 0, "Debug value:", WHITECOLOUR); PutString (120, 0, TempString, WHITECOLOUR); #endif } }
 * 1) endif
 * 2) endif

void ShowNum(int num) {	char String1[100],String2[20];

StringCopy (String1,"Number: "); IntToAscii (num, String2,10);

StringCat(String1,String2);

ColorAreaNOCLIP(50,50,100,20,0,0); PutString(50,50,String1,100); }
 * 1) ifdef MARS
 * 1) endif

void ShowAbsoluteTileHeight(CameraDataRecord CopyOfCamera) {	char String1[100],String2[20];

StringCopy (String1,"TileHeight: "); IntToAscii ((int) CopyOfCamera.absoluteTileHeight, String2,10);

StringCat(String1,String2); ColorAreaNOCLIP(90,30,100,20,0,0); PutString(10,30,String1,100); }
 * 1) ifdef MARS
 * 1) endif

void ShowSegment(void) {   trackTilePointer   CurrentTilePtr; char String1[100],String2[20];

CurrentTilePtr = GetTrackTileForNumber (Camera1Data.currentTile);

StringCopy (String1,"Segment # "); IntToAscii ((int) CurrentTilePtr->segmentNumber, String2,10);

StringCat(String1,String2);

PutString(10,30,String1,100); }

/**************************************************************************** * Draw the race track and objects on it to the screen. */

void Render (void) {   RenderTrackAndObjectsToRamScreen ; DisplayStatusInfo ;

//ShowSegment;

sendBuffersToScreen ; }