[Haskell] ANNOUNCE: OmegaGB, Haskell Game Boy Emulator

Bit Connor bit at mutantlemon.com
Thu Mar 1 11:32:42 EST 2007


OmegaGB is an emulator for the Nintendo Game Boy, written in pure haskell.

It's in a very early state, and only barely shows the title screen of
a few games. It uses gtk2hs for the user interface, but there is also
a version that doesn't require gtk2hs and uses ascii art. The main
problem I am having is getting decent performance.

I have set up a darcs repository in the hopes of receiving advice or
patches to improve performance. You can find more information about
the program at the website:

http://www.mutantlemon.com/omegagb/

The program works by maintaining a state of all of the gameboy
hardware: cpu registers, memory, and internal timers for various
interrupts and other things. A function is used to update the state:

updateMachineDisplayFrame :: JoypadKeyStates ->
                             ((RegisterStates, Memory), IrqStates) ->
                             (Display, ((RegisterStates, Memory), IrqStates))

This approach does not give enough performance, and the emulator is
not able to run in real time. I have experimented with replacing most
of the state with mutable IORefs and an IOUArray for the memory. This
gave approximately double the performance, but that is still only 10%
of real time speed on my computer. And all this is still without
emulating most of the GB graphics hardware, which will require quite a
bit more computations.

I originally started this project to explore whether haskell is really
a capable language in the domain of performance critical applications.
I think that with the right optimizations, OmegaGB will be able to do
real time emulation. Unfortunately, I am not experienced enough to
know what kind of optimizations to use. This is why I am calling out
for help.

Thanks,
Bit Connor

PS: Here is some of the profiling output from a typical run:

        total time  =      174.10 secs   (3482 ticks @ 50 ms)
        total alloc = 31,338,925,440 bytes  (excludes profiling overheads)

COST CENTRE                    MODULE               %time %alloc

renderScanLine                 Machine               28.6   17.9
machineCpuExecute'             Machine               12.6   11.4
tickHBlank                     Machine                9.1   21.1
tickHBlankMode0                Machine                6.3   13.7
executeInstruction             Cpu                    5.6    1.6
test02                         GuiTest02              5.0    1.4
tickDIV                        Machine                4.7   13.1
irqUpdate                      Machine                3.4    0.8
transformIrq                   Machine                3.3    3.2
tickHBlankMode3                Machine                3.1    6.9
mcti                           Cpu                    2.2    0.5
setRegState                    Machine                1.9    1.7
setReg2State                   Machine                1.7    1.8
doFromTo                       GuiDrawUtil            1.6    1.5
updateMachine                  Machine                1.4    0.5
updateMachineDisplayFrame      Machine                1.3    0.5
writeFlags                     CpuExecution           1.2    0.3
fetchInstruction               Machine                1.1    0.5


More information about the Haskell mailing list