VOGONS


First post, by Rolling

User metadata
Rank Newbie
Rank
Newbie

I'm trying to get The Orion Conspiracy to run on original hardware. In DOSBox all versions of the game work just fine, but it crashes/hangs under MS-DOS 6.22 due to a problem with the SVGA VESA driver.

This is a known issue of the game and Domark released a SVGA patch back in 1995.

The problem is, i can't use the patch (it's not really a patch, but a replacement of the games EXE file) for international releases like french, italian or german versions. I have the following versions of the game:

  • ENGLISH.EXE - 114.608 Bytes => v3.777 - (probably an early realease, to be ignored)
  • ENGLISH.EXE - 114.736 Bytes => v3.778 - (most common english release)
  • GERMAN.EXE - 117.360 Bytes => v3.780 - (the only german version)
  • ENGLISH.EXE - 114.768 Bytes => v3.781 - (fixed SVGA EXE from patch for english version)

So, does anyone know, if there is a SVGA fix for the german / international versions of the game?

If not, do you think it's possible to adapt the changes from the SVGA patch of the english version to the german one?

I tried comparing the non-patched ENGLISH.EXE (v3.778) with the patched one (v3.781), to figure out, what the patch does. Looking at it with a hex editor there are a lot of different bytes, but comparing them with bindiff after disassembling them with IDA), there seem to be not many differences (no primary/secondary unmatched functions), etc.

The attachment Screenshot 2026-06-06 103041.png is no longer available

I just can't quite figure out what's going on. Attached you find the mentioned EXE files with IDA disassemblies.

Reply 1 of 2, by MagefromAntares

User metadata
Rank Member
Rank
Member

Hi,

I currently don't have the time to do a comparison for the disassemblies, but if there are lot of difference with a hex editor, but a dissassembler shows that the functions are mostly the same, it usually means that the actual code change in the original C/C++ code(or whatever high level language they have used) is most likely small. The difference in a high number of bytes most likely are addresses which has been pushed around when some new code is added to the program.

For the actual functional differences in this case I would look at the parts of the program calling int 10h with AH set to 4Fh as that is the VESA interrupt.(Actually to be more precise that is the Video Interrupt(10h) with VESA functions(4Fh))

"A process cannot be understood by stopping it. Understanding must move with the flow of the process, must join it and flow with it." - Dune

Reply 2 of 2, by Rolling

User metadata
Rank Newbie
Rank
Newbie

That was a great hint! I finally found some time to work with DOSBox Debugger and compare the original english EXE file with the fixed one.

It seems, that in the fixed EXE file, the pointer to the data segment is moved by two bytes, which results in a check right before the vesa function to be interpreted differently.

The attachment dsect.png is no longer available

The broken EXE file points at a wrong place in the data segment at ds:[00DC] that contains "0000", which causes the following jump to be executed and jump over the initialization routine for SVGA/VESA stuff.

01A2:12E0  05FF03              add  ax,03FF
01A2:12E3 2500FC and ax,FC00
01A2:12E6 A3D000 mov [00D0],ax ds:[00D0]=0800
01A2:12E9 833EDC0000 cmp word [00DC],0000 ds:[00DC]=0000 <<== read at wrong address in DS
01A2:12EE 7406 je 000012F6 ($+6) (down)
01A2:12F3 E9FE04 jmp 000017F4 ($+4fe) (down) <<== probably SVGA initialization
01A2:12F6 B800C0 mov ax,C000
01A2:12F9 8EC0 mov es,ax

DOSBox throws a couple of errors like "INT10:Function 7000 not supported" and "VGAMISC:VGA:S3:SEQ:Read from illegal index 5" but starts the game nonetheless. Only on real hardware the screen freezes during startup. I guess MS-DOS is more strict about some things like illegal memory access or not properly initialized hardware.

In the fixed EXE ds:[00DC] points at "0001", which causes the jump not to be executed and initialize SVGA correctly. This works under MS-DOS and also causes no errors in DOSBox.

With this information, i tried to find the corresponding statements in the german EXE file. To properly fix this, one would probably have to track down the point, where the data section gets initialized, but i'm afraid by tampering with the early load routines addresses i'll break stuff (german version loads a larger codepage f.e. to display more characters). A quick and dirty fix is to just invert the jump (JE=74 to JNE=75) after the faulty compare.

The attachment hxd.png is no longer available

This causes the SVGA stuff to be initialized properly and now the german version works as well under MS-DOS. Success! 😀

The attachment success.png is no longer available