ALSA lib pcm_asym.c:106:(_snd_pcm_asym_open) capture slave is not defined
fixme:mixer:ALSA_MixerInit No master control found on Brooktree Bt878, disabling mixer
err:ddraw:DllMain Unknown default surface type. Supported are:
gdi, opengl
fixme:d3d:IWineD3DImpl_FillGLCaps OpenGL implementation supports 32 vertex samplers and 32 total samplers
fixme:d3d:IWineD3DImpl_FillGLCaps Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers
fixme:win:EnumDisplayDevicesW ((null),0,0x32f640,0x00000000), stub!
fixme:xrandr:X11DRV_XRandR_SetCurrentMode Cannot change screen BPP from 32 to 16
fixme:ddraw:IDirectDrawImpl_WaitForVerticalBlank (0x12f078)->(4,(nil)): Stub
It uses DirectDraw, but only copies directly to the front buffer. There are three functions that do this: one for movies, one for the UI, and one for space combat. Movies already work because of the strict timing required. The rest of the game is typical of a DOS program...
The UI function copies the whole screen at once, so adding a call to the end of this function fixes it perfectly (the sound is fixed too!)
Space combat is different. The function only copies a small part of the screen, so the call to Sleep() had to be added to the main loop.
If it is too fast or too slow, try tweaking the values at 87D79h (UI, default 20ms) and 87D8Dh (space, default 30ms).