3 ms·
Nice work! As it stands, you seem to be doing pure interpretation for the CPU; have you considered dynamic recompilation? You can see this in practice for the
by daeken 16y ago
Nice work! As it stands, you seem to be doing pure interpretation for the CPU; have you considered dynamic recompilation? You can see this in practice for the 6502 here: https://github.com/daeken/Dyna6502Asm https://github.com/daeken/Dyna6502Asm
In essence, you accumulate instructions in basic blocks and turn them into functions, which are then 'executed' (meaning turned into function objects) and then cached. In your case it becomes a little more complex as you do cycle timing, interrupts, etc, but there's no reason you can't bake this into your basic block functions. This drastically increases the performance of CPU emulation, while maintaining the same high quality.
If you're interested in doing this and/or have any questions, feel free to contact me.
- grantg 16y agoYou might want to talk to me then (Look at the user name on the github repo. ;) ). The DMG/CGB CPU needs to be emulated with clock-cycle accuracy though, so dynarec would be very difficult. P.S.: Here's another game - http://www.grantgalitz.org/SuperMarioLand2/ http://www.grantgalitz.org/SuperMarioLand2/
- daeken 16y agoAh, my apologies -- thought that the OP was the original creator. So, in effect what you do is take your code from `GameBoyCore.prototype.executeIteration' and roll that into your dynarec'd function on a per-instruction basis. The simpler you can make it, the better for performance; you have the benefit of knowing how long each instruction will take to execute at dynarec-time, so you can do some fun optimizations there. Dynarec'ing cycle-accurate code is hard, but it's a lot of fun and damn efficient if you get it right.