arm_asm_emu
arm_asm_emu copied to clipboard
Gameboy Emulator in ARM Assembly
arm_asm_emu
A Game Boy emulator written entirely in ARM assemly language.
Why assembly language? Why not.
Cross-assembling
The Makefile is set up for both native building on an ARM platform as well as
cross-compling. Pass your favorite cross-compiling prefix to the make
invocation with something like CROSS=arm-none-eabi-
.
The testing harness can also be invoked on a non-arm platform using QEMU.
Specify something like TEST_WRAPPER=qemu-arm
during the make test
invocation to use QEMU when running tests.
Testing
A test harness has been created which runs a ROM for a given number of cycles
and checks a CRC32 of the screen contents against a set value. If the value
doesn't match, a capture of the screen is saved as a .bmp
file and the
process returns non-zero.
At present, only the Blargg tests are targeted. Here are the current passing tests:
cpu_instrs | passing |
---|---|
special | :heavy_check_mark: |
interrupts | :heavy_check_mark: |
op sp,hl | :heavy_check_mark: |
op r,imm | :heavy_check_mark: |
op rp | :heavy_check_mark: |
ld r,r | :heavy_check_mark: |
jr,jp,call,ret,rst | :heavy_check_mark: |
misc instrs | :heavy_check_mark: |
op r,r | :heavy_check_mark: |
bit ops | :heavy_check_mark: |
op a,(hl) | :heavy_check_mark: |
timing | passing |
---|---|
instr_timing | :heavy_check_mark: |
mem_timing | :heavy_check_mark: |
mem_timing-2 | :heavy_check_mark: |
misc | passing |
---|---|
oam_bug causes | :heavy_check_mark: |
oam_bug non_causes | :heavy_check_mark: |
oam_bug timing_bug | :heavy_check_mark: |
Interface
Supported graphics interfaces
- Null
- Linux framebuffer
- Bitmap (capture)
Supported control interfaces
- Null
- Linux evdev
Sound
(not implemented)
License
All code is published under the BSD-3-Clause License. See LICENSE for more information.