Extinct is an x86/DOS emulator using libSDL. The aim of the project is to interpret just enough x86 instructions and interrupt functions/services to be able to play certain early DOS games. I'm developing it in C on Linux primarily for embedded Linux devices such as the Sharp Zaurus , Nokia 770 and GP2X .
At the moment I am concentrating on getting one single game working -- King's Bounty by New World Computing 1990 -- that is relatively straightforward i.e. 256 colours 1 pixel 1 byte and beepy sound that I could ignore for the time being. Once the emulator becomes sufficiently advanced enough to be able to run at least one game, there is no reason why this game couldn't be enhanced in some way, for example playing wavs and oggs instead of emulating the PC speaker.
I would like to make it clear that Extinct is an emulator and does not require any reverse engineering or proprietary data from any particular game. I am not writing a game engine. I'm using King's Bounty as an example because of its simplicity and I could have chosen any simple game.
With handheld devices there could be issues with user input. Whereas a game will accept keyboard input, there might not actually be one available so virtual keyboard/stylus support would be required. Fortunately many early DOS games use a resolution of 320x200 when modern devices use either 320x240 or 640x480 which leaves enough space 'underneath' to place a mini keyboard for use with a stylus. Again the game King's Bounty is rather useful in this respect as it only uses a few keys -- I have made a mock-up to illustrate this :-
Very fast on the Zaurus SL-5500 (206MHz Intel SA-1110 StrongARM) and slightly faster on the GP2X (200MHz ARM920T).
In version 0.0.4 the following are implemented :-
A simple DOS VGA freeware Pac-Man game (included) can be emulated.
- An initial memory block header structure is set-up in the DOS memory array.
- A COM file can be loaded into 'memory'.
- INT 20 Program Terminate
- INT 21 Function 02 Character Output
- INT 21 Function 09 String Output
- INT 21 Function 30 Get DOS Version Number
- INT 21 Function 3C Create File
- INT 21 Function 3D Open Handle
- INT 21 Function 3E Close Handle
- INT 21 Function 3F Read from File or Device
- INT 21 Function 42 Move File Pointer
- INT 21 Function 48 Allocate Memory Block
- INT 21 Function 49 Free Memory Block
- INT 21 Function 4A Resize Memory Block
- INT 21 Function 4C Terminate With Return Code
- Video mode 13 VGA 256 colours
- Video refresh timer @ 20ms (50Hz)
- INT 10 Service 00 Set Video Mode
- INT 10 Service 10 Colour Palette Interface
- INT 10 Service 1A Read/Write Display Combination Code
- Programmable Interval Timer (PIT)
- Channel 0 timer - system (clock-tick) timer @ 20ms
- INT 16 Service 00 Read Next Keyboard Character
- INT 16 Service 01 Report Whether Character Ready
- ROM and ROM BIOS
- Interrupt vector table
- INT 8
- INT 9
- INT 1A Service 00 Time-of-Day Services
- INT 1C (triggered by INT 8)
- Programmable Interrupt Controller (PIC)
- Virtual keyboard (vkeyb)
- Command line options
- Register dump
- Assembly output
- RAM (memory array) dump
- RAM read/writes can be dumped to the terminal.
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Free Art Licence
This project -- although stable -- is a work-in-progress and has yet to reach its development milestone of emulating King's Bounty.