feat: better DMA, PPU, add more tests

This commit is contained in:
EliseZeroTwo 2024-01-19 11:44:51 -07:00
parent 0afc556233
commit c6dd3a7bd5
Signed by: elise
GPG key ID: FA8F56FFFE6E8B3E
166 changed files with 917 additions and 696 deletions

View file

@ -20,284 +20,292 @@ jobs:
- name: Run test ROM (blargg cpu_instrs)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/cpu_instrs.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/cpu_instrs.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/cpu_instrs.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/cpu_instrs.bin
- name: Run test ROM (blargg instr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/instr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/instr_timing.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/instr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/instr_timing.bin
- name: Run test ROM (blargg mem_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/mem_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/mem_timing.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/mem_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/mem_timing.bin
- name: Run test ROM (mooneye-test-suite add_sp_e_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/add_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/add_sp_e_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/add_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/add_sp_e_timing.bin
- name: Run test ROM (mooneye-test-suite boot_hwio-dmgABCmgb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_hwio-dmgABCmgb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_hwio-dmgABCmgb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_hwio-dmgABCmgb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_hwio-dmgABCmgb.bin
- name: Run test ROM (mooneye-test-suite boot_regs-dmgABC)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_regs-dmgABC.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_regs-dmgABC.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_regs-dmgABC.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_regs-dmgABC.bin
- name: Run test ROM (mooneye-test-suite call_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing.bin
- name: Run test ROM (mooneye-test-suite call_cc_timing2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing2.bin
- name: Run test ROM (mooneye-test-suite call_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing.bin
- name: Run test ROM (mooneye-test-suite call_timing2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing2.bin
- name: Run test ROM (mooneye-test-suite di_timing-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/di_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/di_timing-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/di_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/di_timing-GS.bin
- name: Run test ROM (mooneye-test-suite div_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/div_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/div_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/div_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/div_timing.bin
- name: Run test ROM (mooneye-test-suite ei_sequence)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_sequence.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_sequence.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_sequence.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_sequence.bin
- name: Run test ROM (mooneye-test-suite ei_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime0_ei)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_ei.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_ei.bin
- name: Run test ROM (mooneye-test-suite halt_ime0_nointr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_nointr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_nointr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_nointr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_nointr_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime1_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime1_timing2-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing2-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing2-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing2-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing2-GS.bin
- name: Run test ROM (mooneye-test-suite if_ie_registers)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/if_ie_registers.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/if_ie_registers.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/if_ie_registers.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/if_ie_registers.bin
- name: Run test ROM (mooneye-test-suite intr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/intr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/intr_timing.bin
- name: Run test ROM (mooneye-test-suite jp_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_cc_timing.bin
- name: Run test ROM (mooneye-test-suite jp_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_timing.bin
- name: Run test ROM (mooneye-test-suite ld_hl_sp_e_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ld_hl_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ld_hl_sp_e_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ld_hl_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ld_hl_sp_e_timing.bin
- name: Run test ROM (mooneye-test-suite oam_dma_restart)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_restart.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_restart.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_restart.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_restart.bin
- name: Run test ROM (mooneye-test-suite oam_dma_start)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_start.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_start.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_start.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_start.bin
- name: Run test ROM (mooneye-test-suite oam_dma_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_timing.bin
- name: Run test ROM (mooneye-test-suite pop_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/pop_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/pop_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/pop_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/pop_timing.bin
- name: Run test ROM (mooneye-test-suite push_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/push_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/push_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/push_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/push_timing.bin
- name: Run test ROM (mooneye-test-suite rapid_di_ei)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rapid_di_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rapid_di_ei.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rapid_di_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rapid_di_ei.bin
- name: Run test ROM (mooneye-test-suite ret_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_cc_timing.bin
- name: Run test ROM (mooneye-test-suite ret_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_timing.bin
- name: Run test ROM (mooneye-test-suite reti_intr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_intr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_intr_timing.bin
- name: Run test ROM (mooneye-test-suite reti_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_timing.bin
- name: Run test ROM (mooneye-test-suite rst_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rst_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rst_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rst_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rst_timing.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_bank1)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank1.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank1.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank1.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_bank2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank2.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_mode)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_mode.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_mode.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_mode.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_ramg)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_ramg.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_ramg.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_ramg.bin
- name: Run test ROM (mooneye-test-suite MBC1/multicart_rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/multicart_rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/ram_256kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_256kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_256kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_256kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/ram_64kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_64kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_64kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_64kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_16Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_16Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_16Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_16Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_1Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_1Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_1Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_1Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_2Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_2Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_2Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_2Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_4Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_4Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_4Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_4Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_512kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_512kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_512kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_512kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_8Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_8Mb.bin
- name: Run test ROM (mooneye-test-suite bits/mem_oam)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/mem_oam.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/mem_oam.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/mem_oam.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/mem_oam.bin
- name: Run test ROM (mooneye-test-suite bits/reg_f)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/reg_f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/reg_f.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/reg_f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/reg_f.bin
- name: Run test ROM (mooneye-test-suite bits/unused_hwio-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/unused_hwio-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/unused_hwio-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/unused_hwio-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/unused_hwio-GS.bin
- name: Run test ROM (mooneye-test-suite instr/daa)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/instr/daa.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/instr/daa.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/instr/daa.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/instr/daa.bin
- name: Run test ROM (mooneye-test-suite oam_dma/basic)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/basic.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/basic.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/basic.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/basic.bin
- name: Run test ROM (mooneye-test-suite oam_dma/reg_read)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/reg_read.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/reg_read.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/reg_read.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/reg_read.bin
- name: Run test ROM (mooneye-test-suite ppu/intr_1_2_timing-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_1_2_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_1_2_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin
- name: Run test ROM (mooneye-test-suite ppu/intr_2_0_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_2_0_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_2_0_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_0_timing.bin
- name: Run test ROM (mooneye-test-suite ppu/stat_irq_blocking)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_irq_blocking.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_irq_blocking.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_irq_blocking.bin
- name: Run test ROM (mooneye-test-suite ppu/stat_lyc_onoff)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_lyc_onoff.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_lyc_onoff.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_lyc_onoff.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_lyc_onoff.bin
- name: Run test ROM (mooneye-test-suite ppu/vblank_stat_intr-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/vblank_stat_intr-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/vblank_stat_intr-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin
- name: Run test ROM (mooneye-test-suite timer/div_write)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/div_write.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/div_write.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/div_write.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/div_write.bin
- name: Run test ROM (mooneye-test-suite timer/rapid_toggle)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/rapid_toggle.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/rapid_toggle.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/rapid_toggle.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/rapid_toggle.bin
- name: Run test ROM (mooneye-test-suite timer/tim00)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00.bin
- name: Run test ROM (mooneye-test-suite timer/tim00_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim01)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01.bin
- name: Run test ROM (mooneye-test-suite timer/tim01_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim10)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10.bin
- name: Run test ROM (mooneye-test-suite timer/tim10_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim11)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11.bin
- name: Run test ROM (mooneye-test-suite timer/tim11_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tima_reload)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_reload.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_reload.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_reload.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_reload.bin
- name: Run test ROM (mooneye-test-suite timer/tima_write_reloading)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_write_reloading.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_write_reloading.bin
- name: Run test ROM (mooneye-test-suite timer/tma_write_reloading)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tma_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tma_write_reloading.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tma_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tma_write_reloading.bin
- name: Run test ROM (hacktix bully)
if: always()
run: ./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/bully.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/bully.bin
- name: Run test ROM (hacktix strikethrough)
if: always()
run: ./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/strikethrough.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/strikethrough.bin

View file

@ -20,284 +20,292 @@ jobs:
- name: Run test ROM (blargg cpu_instrs)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/cpu_instrs.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/cpu_instrs.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/cpu_instrs.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/cpu_instrs.bin
- name: Run test ROM (blargg instr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/instr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/instr_timing.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/instr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/instr_timing.bin
- name: Run test ROM (blargg mem_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/blargg/roms/mem_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/mem_timing.bin
run: ./target/release/meowgb-tests test-roms/blargg/serial-roms/mem_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/mem_timing.bin
- name: Run test ROM (mooneye-test-suite add_sp_e_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/add_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/add_sp_e_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/add_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/add_sp_e_timing.bin
- name: Run test ROM (mooneye-test-suite boot_hwio-dmgABCmgb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_hwio-dmgABCmgb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_hwio-dmgABCmgb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_hwio-dmgABCmgb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_hwio-dmgABCmgb.bin
- name: Run test ROM (mooneye-test-suite boot_regs-dmgABC)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_regs-dmgABC.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_regs-dmgABC.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_regs-dmgABC.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_regs-dmgABC.bin
- name: Run test ROM (mooneye-test-suite call_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing.bin
- name: Run test ROM (mooneye-test-suite call_cc_timing2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing2.bin
- name: Run test ROM (mooneye-test-suite call_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing.bin
- name: Run test ROM (mooneye-test-suite call_timing2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing2.bin
- name: Run test ROM (mooneye-test-suite di_timing-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/di_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/di_timing-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/di_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/di_timing-GS.bin
- name: Run test ROM (mooneye-test-suite div_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/div_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/div_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/div_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/div_timing.bin
- name: Run test ROM (mooneye-test-suite ei_sequence)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_sequence.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_sequence.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_sequence.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_sequence.bin
- name: Run test ROM (mooneye-test-suite ei_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime0_ei)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_ei.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_ei.bin
- name: Run test ROM (mooneye-test-suite halt_ime0_nointr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_nointr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_nointr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_nointr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_nointr_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime1_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing.bin
- name: Run test ROM (mooneye-test-suite halt_ime1_timing2-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing2-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing2-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing2-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing2-GS.bin
- name: Run test ROM (mooneye-test-suite if_ie_registers)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/if_ie_registers.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/if_ie_registers.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/if_ie_registers.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/if_ie_registers.bin
- name: Run test ROM (mooneye-test-suite intr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/intr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/intr_timing.bin
- name: Run test ROM (mooneye-test-suite jp_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_cc_timing.bin
- name: Run test ROM (mooneye-test-suite jp_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_timing.bin
- name: Run test ROM (mooneye-test-suite ld_hl_sp_e_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ld_hl_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ld_hl_sp_e_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ld_hl_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ld_hl_sp_e_timing.bin
- name: Run test ROM (mooneye-test-suite oam_dma_restart)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_restart.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_restart.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_restart.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_restart.bin
- name: Run test ROM (mooneye-test-suite oam_dma_start)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_start.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_start.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_start.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_start.bin
- name: Run test ROM (mooneye-test-suite oam_dma_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_timing.bin
- name: Run test ROM (mooneye-test-suite pop_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/pop_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/pop_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/pop_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/pop_timing.bin
- name: Run test ROM (mooneye-test-suite push_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/push_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/push_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/push_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/push_timing.bin
- name: Run test ROM (mooneye-test-suite rapid_di_ei)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rapid_di_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rapid_di_ei.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rapid_di_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rapid_di_ei.bin
- name: Run test ROM (mooneye-test-suite ret_cc_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_cc_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_cc_timing.bin
- name: Run test ROM (mooneye-test-suite ret_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_timing.bin
- name: Run test ROM (mooneye-test-suite reti_intr_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_intr_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_intr_timing.bin
- name: Run test ROM (mooneye-test-suite reti_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_timing.bin
- name: Run test ROM (mooneye-test-suite rst_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rst_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rst_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rst_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rst_timing.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_bank1)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank1.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank1.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank1.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_bank2)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank2.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank2.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_mode)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_mode.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_mode.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_mode.bin
- name: Run test ROM (mooneye-test-suite MBC1/bits_ramg)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_ramg.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_ramg.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_ramg.bin
- name: Run test ROM (mooneye-test-suite MBC1/multicart_rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/multicart_rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/ram_256kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_256kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_256kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_256kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/ram_64kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_64kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_64kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_64kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_16Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_16Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_16Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_16Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_1Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_1Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_1Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_1Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_2Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_2Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_2Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_2Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_4Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_4Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_4Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_4Mb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_512kb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_512kb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_512kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_512kb.bin
- name: Run test ROM (mooneye-test-suite MBC1/rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_8Mb.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_8Mb.bin
- name: Run test ROM (mooneye-test-suite bits/mem_oam)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/mem_oam.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/mem_oam.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/mem_oam.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/mem_oam.bin
- name: Run test ROM (mooneye-test-suite bits/reg_f)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/reg_f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/reg_f.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/reg_f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/reg_f.bin
- name: Run test ROM (mooneye-test-suite bits/unused_hwio-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/unused_hwio-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/unused_hwio-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/unused_hwio-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/unused_hwio-GS.bin
- name: Run test ROM (mooneye-test-suite instr/daa)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/instr/daa.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/instr/daa.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/instr/daa.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/instr/daa.bin
- name: Run test ROM (mooneye-test-suite oam_dma/basic)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/basic.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/basic.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/basic.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/basic.bin
- name: Run test ROM (mooneye-test-suite oam_dma/reg_read)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/reg_read.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/reg_read.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/reg_read.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/reg_read.bin
- name: Run test ROM (mooneye-test-suite ppu/intr_1_2_timing-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_1_2_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_1_2_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin
- name: Run test ROM (mooneye-test-suite ppu/intr_2_0_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_2_0_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_2_0_timing.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_0_timing.bin
- name: Run test ROM (mooneye-test-suite ppu/stat_irq_blocking)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_irq_blocking.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_irq_blocking.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_irq_blocking.bin
- name: Run test ROM (mooneye-test-suite ppu/stat_lyc_onoff)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_lyc_onoff.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_lyc_onoff.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_lyc_onoff.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_lyc_onoff.bin
- name: Run test ROM (mooneye-test-suite ppu/vblank_stat_intr-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/vblank_stat_intr-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/vblank_stat_intr-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin
- name: Run test ROM (mooneye-test-suite timer/div_write)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/div_write.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/div_write.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/div_write.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/div_write.bin
- name: Run test ROM (mooneye-test-suite timer/rapid_toggle)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/rapid_toggle.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/rapid_toggle.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/rapid_toggle.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/rapid_toggle.bin
- name: Run test ROM (mooneye-test-suite timer/tim00)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00.bin
- name: Run test ROM (mooneye-test-suite timer/tim00_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim01)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01.bin
- name: Run test ROM (mooneye-test-suite timer/tim01_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim10)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10.bin
- name: Run test ROM (mooneye-test-suite timer/tim10_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tim11)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11.bin
- name: Run test ROM (mooneye-test-suite timer/tim11_div_trigger)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11_div_trigger.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11_div_trigger.bin
- name: Run test ROM (mooneye-test-suite timer/tima_reload)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_reload.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_reload.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_reload.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_reload.bin
- name: Run test ROM (mooneye-test-suite timer/tima_write_reloading)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_write_reloading.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_write_reloading.bin
- name: Run test ROM (mooneye-test-suite timer/tma_write_reloading)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tma_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tma_write_reloading.bin
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tma_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tma_write_reloading.bin
- name: Run test ROM (hacktix bully)
if: always()
run: ./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/bully.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/bully.bin
- name: Run test ROM (hacktix strikethrough)
if: always()
run: ./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/strikethrough.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/strikethrough.bin

66
Cargo.lock generated
View file

@ -222,15 +222,6 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
[[package]]
name = "block-buffer"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]]
name = "block-sys"
version = "0.1.0-beta.1"
@ -451,15 +442,6 @@ dependencies = [
"libc",
]
[[package]]
name = "cpufeatures"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
version = "1.3.2"
@ -469,16 +451,6 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "d3d12"
version = "0.6.0"
@ -534,16 +506,6 @@ dependencies = [
"powerfmt",
]
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]]
name = "dispatch"
version = "0.2.0"
@ -728,16 +690,6 @@ dependencies = [
"percent-encoding",
]
[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "gimli"
version = "0.28.1"
@ -1110,7 +1062,6 @@ dependencies = [
"log",
"meowgb-opcode",
"paste",
"sha1",
"thiserror",
]
@ -1654,17 +1605,6 @@ dependencies = [
"serde",
]
[[package]]
name = "sha1"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]]
name = "simd-adler32"
version = "0.3.7"
@ -1902,12 +1842,6 @@ dependencies = [
"rustc-hash",
]
[[package]]
name = "typenum"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ultraviolet"
version = "0.9.2"

View file

@ -50,10 +50,10 @@ cat >>$TEST_MD_FILE << EOF
EOF
for full_f in ./test-roms/blargg/roms/*.gb
for full_f in ./test-roms/blargg/serial-roms/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/blargg/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/$f.bin"
TEST_CMD="./target/release/meowgb-tests test-roms/blargg/serial-roms/$f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/$f.bin"
cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
@ -69,7 +69,7 @@ fi
EOF
cat >>$TEST_MD_FILE << EOF
* $f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/blargg/$f.bin)
* $f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/serial/blargg/$f.bin)
EOF
tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
@ -86,10 +86,10 @@ cat >>$TEST_MD_FILE << EOF
EOF
for full_f in ./test-roms/mooneye-test-suite/roms/*.gb
for full_f in ./test-roms/mooneye-test-suite/serial-roms/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/$f.bin"
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/$f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/$f.bin"
cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
@ -105,7 +105,7 @@ fi
EOF
cat >>$TEST_MD_FILE << EOF
* $f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/mooneye-test-suite/$f.bin)
* $f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/serial/mooneye-test-suite/$f.bin)
EOF
tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
@ -116,7 +116,7 @@ EOF
EOF
done
for directory in ./test-roms/mooneye-test-suite/roms/*/
for directory in ./test-roms/mooneye-test-suite/serial-roms/*/
do
d=$(basename $directory)
@ -126,10 +126,10 @@ do
EOF
for full_f in ./test-roms/mooneye-test-suite/roms/$d/*.gb
for full_f in ./test-roms/mooneye-test-suite/serial-roms/$d/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/$d/$f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/$d/$f.bin"
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/$d/$f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/$d/$f.bin"
cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
@ -145,7 +145,7 @@ fi
EOF
cat >>$TEST_MD_FILE << EOF
* $d/$f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/mooneye-test-suite/$d/$f.bin)
* $d/$f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/serial/mooneye-test-suite/$d/$f.bin)
EOF
tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
@ -158,6 +158,42 @@ EOF
done
cat >>$TEST_MD_FILE << EOF
## Hacktix Test ROMs
EOF
for full_f in ./test-roms/hacktix/framebuffer-roms/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/$f.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/$f.bin"
cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
echo "Running test ROM $full_f"
TEST_TOTAL=\$((TEST_TOTAL + 1))
if res=\$($TEST_CMD 2>&1 > /dev/null) ; then
TEST_SUCCESS=\$((TEST_SUCCESS + 1))
else
echo "Failed: \$res"
fi
EOF
cat >>$TEST_MD_FILE << EOF
* $f.gb - [ROM]($full_f) - [Expected Framebuffer (RGBA32)](./meowgb-tests/expected_output/framebuffer/hacktix/$f.bin)
EOF
tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
- name: Run test ROM (hacktix $f)
if: always()
run: $TEST_CMD
EOF
done
cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
echo "Succeeded in running \$TEST_SUCCESS/\$TEST_TOTAL"

View file

@ -13,4 +13,3 @@ paste = "1.0.6"
meowgb-opcode = { path = "../meowgb-opcode" }
bmp = "0.5.0"
thiserror = "1.0.30"
sha1 = { version = "0.10.6", features = ["std"] }

View file

@ -1,4 +1,3 @@
pub mod bootrom;
pub mod cpu;
pub mod dma;
pub mod interrupts;
@ -27,10 +26,12 @@ use self::{
#[cfg(feature = "instr-dbg")]
use crate::ringbuffer::RingBuffer;
pub type GenericCartridge = dyn Mapper + Send + Sync;
pub struct Gameboy<S: SerialWriter> {
pub ppu: Ppu,
pub memory: Memory,
pub cartridge: Option<Box<dyn Mapper + Send + Sync>>,
pub cartridge: Option<Box<GenericCartridge>>,
pub interrupts: Interrupts,
pub timer: Timer,
pub registers: Registers,
@ -54,20 +55,21 @@ pub struct Gameboy<S: SerialWriter> {
}
impl<S: SerialWriter> Gameboy<S> {
pub fn new(bootrom: Option<[u8; 0x100]>, serial_writer: S) -> Self {
Self {
memory: Memory::new(bootrom),
cartridge: None,
pub fn new(serial_writer: S, rom: Option<Vec<u8>>) -> Self {
Self::new_with_cartridge(serial_writer, rom.map(Self::parse_rom))
}
pub fn new_with_cartridge(serial_writer: S, cartridge: Option<Box<GenericCartridge>>) -> Self {
let mut out = Self {
memory: Memory::new(),
cartridge,
interrupts: Interrupts::new(),
timer: Timer::new(),
joypad: Joypad::new(),
serial: Serial::new(serial_writer),
dma: DmaState::new(),
ppu: Ppu::new(bootrom.is_some()),
registers: match bootrom.is_some() {
true => Registers::default(),
false => Registers::post_rom(),
},
ppu: Ppu::new(),
registers: Registers::default(),
sound: Sound::new(),
halt: false,
halt_bug: false,
@ -78,18 +80,166 @@ impl<S: SerialWriter> Gameboy<S> {
last_write: None,
#[cfg(feature = "instr-dbg")]
pc_history: RingBuffer::new(),
};
out.run_bootrom();
out.registers.set_post_rom();
out
}
pub fn run_bootrom(&mut self) {
macro_rules! push8 {
($byte:expr) => {
self.registers.sp = self.registers.sp.overflowing_sub(1).0;
self.debug_write_u8(self.registers.sp, $byte);
};
}
macro_rules! push16 {
($byte:expr) => {
push8!(($byte >> 8) as u8);
push8!($byte as u8);
};
}
macro_rules! pop8 {
() => {
{
let res = self.debug_read_u8(self.registers.sp);
self.registers.sp = self.registers.sp.overflowing_add(1).0;
res
}
};
}
macro_rules! pop16 {
() => {
(pop8!() as u16) | ((pop8!() as u16) << 8)
};
}
macro_rules! rl {
($reg:ident) => {
{
let new_carry = self.registers.$reg >> 7 == 1;
self.registers.$reg <<= 1;
if self.registers.get_carry() {
self.registers.$reg |= 1;
}
self.registers.set_carry(new_carry);
}
};
}
self.registers.sp = 0xFFFE;
// Clear VRAM
self.registers.a = 0;
let mut address = 0x9FFF;
while address >= 0x8000 {
self.debug_write_u8(address, 0);
address -= 1;
}
// // Configure Audio
// self.registers.set_hl(0xFF26);
// self.registers.c = 0x11;
// self.registers.a = 0x80;
// let hl_content = self.registers.get_hl();
// self.debug_write_u8(hl_content, self.registers.a);
// self.registers.set_hl(hl_content - 1);
// self.debug_write_u8(0xFF00 | self.registers.c as u16, self.registers.a);
// self.registers.c += 1;
// self.registers.a = 0xF3;
// self.debug_write_u8(0xFF00 | self.registers.c as u16, self.registers.a);
// let hl_content = self.registers.get_hl();
// self.debug_write_u8(hl_content, self.registers.a);
// self.registers.set_hl(hl_content - 1);
// self.registers.a = 0x77;
// self.debug_write_u8(hl_content, self.registers.a);
// Configure Background Palette
self.registers.a = 0xFC;
self.debug_write_u8(0xFF47, self.registers.a);
// Load logo data from cartridge into VRAM
self.registers.set_de(0x0104);
self.registers.set_hl(0x8010);
loop {
self.registers.a = self.debug_read_u8(self.registers.get_de());
self.registers.c = self.registers.a;
for _ in 0..2 {
self.registers.b = 4;
while self.registers.b != 0 {
push16!(self.registers.get_bc());
rl!(c);
rl!(a);
let bc = pop16!();
self.registers.set_bc(bc);
rl!(c);
rl!(a);
self.registers.b -= 1;
}
self.debug_write_u8(self.registers.get_hl(), self.registers.a);
self.registers.set_hl(self.registers.get_hl() + 2);
self.debug_write_u8(self.registers.get_hl(), self.registers.a);
self.registers.set_hl(self.registers.get_hl() + 2);
}
self.registers.set_de(self.registers.get_de() + 1);
self.registers.a = self.registers.e;
assert!(self.registers.a <= 0x34);
if self.registers.a == 0x34 {
break;
}
}
// Extra 8 bytes into VRAM from BROM
const EXTRA_VRAM_DATA: [u8; 8] = [0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C];
for value in EXTRA_VRAM_DATA {
self.registers.a = value;
self.debug_write_u8(self.registers.get_hl(), self.registers.a);
self.registers.set_hl(self.registers.get_hl() + 2);
}
self.registers.set_de(0xE0);
self.registers.b = 0;
// BG Tilemap
self.registers.a = 0x19;
self.debug_write_u8(0x9910, self.registers.a);
self.registers.set_hl(0x992F);
'outer: loop {
self.registers.c = 0xc;
while self.registers.c != 0 {
self.registers.a -= 1;
if self.registers.a == 0 {
break 'outer;
}
self.debug_write_u8(self.registers.get_hl(), self.registers.a);
self.registers.set_hl(self.registers.get_hl() - 1);
self.registers.c -= 1;
}
self.registers.l = 0xf;
}
}
pub fn load_cartridge(&mut self, bytes: Vec<u8>) {
fn parse_rom(bytes: Vec<u8>) -> Box<GenericCartridge> {
if bytes.len() < 0x150 {
panic!("Bad cartridge (len < 0x150)");
}
match bytes[0x147] {
0 => self.cartridge = Some(Box::new(NoMBC::new(bytes))),
1 => self.cartridge = Some(Box::new(MBC1::new(bytes))),
2 => self.cartridge = Some(Box::new(MBC1::new(bytes))),
3 => self.cartridge = Some(Box::new(MBC1::new(bytes))),
0 => Box::new(NoMBC::new(bytes)),
1 => Box::new(MBC1::new(bytes)),
2 => Box::new(MBC1::new(bytes)),
3 => Box::new(MBC1::new(bytes)),
other => unimplemented!("Cartidge type: {:#X}", other),
}
}
@ -105,9 +255,9 @@ impl<S: SerialWriter> Gameboy<S> {
pub fn tick(&mut self) -> bool {
if self.tick_count == 0 {
self.dma.tick_dma(&mut self.ppu, &self.memory, self.cartridge.as_deref());
cpu::tick_cpu(self);
let redraw_requested = self.ppu.tick(&self.dma, &mut self.interrupts);
self.dma.tick_dma(&mut self.ppu, &self.memory, self.cartridge.as_deref());
self.serial.tick(&mut self.interrupts);
self.timer.tick(&mut self.interrupts);
@ -244,11 +394,7 @@ impl<S: SerialWriter> Gameboy<S> {
0xFF4B => self.ppu.registers.wx = value,
0xFF4C..=0xFF4E => {} // Unused
0xFF4F => {} // CGB VRAM Bank Select
0xFF50 => {
if value & 0b1 == 1 {
self.memory.bootrom_disabled = true;
}
}
0xFF50 => {} // BROM lockout
0xFF51..=0xFF55 => {} // CGB VRAM DMA
0xFF56..=0xFF67 => {} // Unused
0xFF68..=0xFF69 => {} // CGB BG/OBJ Palettes
@ -273,7 +419,6 @@ impl<S: SerialWriter> Gameboy<S> {
/// debugging/testing purposes
pub fn debug_read_u8(&self, address: u16) -> u8 {
match address {
0..=0xFF if !self.memory.bootrom_disabled => self.memory.bootrom[address as usize],
0..=0x7FFF => match self.cartridge.as_ref() {
Some(mapper) => mapper.read_rom_u8(address),
None => 0xFF,
@ -298,7 +443,6 @@ impl<S: SerialWriter> Gameboy<S> {
#[allow(unused)]
pub fn debug_write_u8(&mut self, address: u16, value: u8) {
match address {
0..=0xFF if !self.memory.bootrom_disabled => {}
0..=0x7FFF => {
if let Some(mapper) = self.cartridge.as_mut() {
mapper.write_rom_u8(address, value)
@ -330,13 +474,13 @@ impl<S: SerialWriter> Gameboy<S> {
self.registers.mem_op_happened = true;
let value = match self.dma.is_conflict(address) {
true => match address {
0..=0xFEFF => 0xFF,
0..=0xFDFF => self.dma.read_next_byte(&self.ppu, &self.memory, self.cartridge.as_deref()),
0xFE00..=0xFEFF => 0xFF,
0xFF00..=0xFF7F => self.cpu_read_io(address),
0xFF80..=0xFFFE => self.memory.hram[address as usize - 0xFF80],
0xFFFF => self.interrupts.interrupt_enable,
},
false => match address {
0..=0xFF if !self.memory.bootrom_disabled => self.memory.bootrom[address as usize],
0..=0x7FFF => match self.cartridge.as_ref() {
Some(mapper) => mapper.read_rom_u8(address),
None => 0xFF,
@ -374,7 +518,6 @@ impl<S: SerialWriter> Gameboy<S> {
0xFFFF => self.interrupts.cpu_set_interrupt_enable(value),
},
false => match address {
0..=0xFF if !self.memory.bootrom_disabled => {}
0..=0x7FFF => {
if let Some(mapper) = self.cartridge.as_mut() {
mapper.write_rom_u8(address, value)

View file

@ -1,48 +0,0 @@
use std::{io::Read, path::Path};
use sha1::{Digest, Sha1};
#[derive(Debug, thiserror::Error)]
pub enum BootromParseError {
#[error("Bootrom file cannot be found")]
BootromNotFound,
#[error("IO error whilst reading bootrom: {0}")]
Io(#[from] std::io::Error),
#[error("Bootrom size is {0} bytes, expected 256 bytes")]
InvalidSize(u64),
#[error("Bootrom has an invalid SHA1 (expected \"4ed31ec6b0b175bb109c0eb5fd3d193da823339f\")")]
InvalidHash,
#[error("Failed to open bootrom file: {0}")]
FileOpen(std::io::Error),
#[error("Failed to read bootrom file: {0}")]
FileRead(std::io::Error),
}
pub fn verify_parse_bootrom(path: &Path) -> Result<[u8; 0x100], BootromParseError> {
if !path.is_file() {
return Err(BootromParseError::BootromNotFound);
}
let mut bootrom_slice = [0u8; 0x100];
let mut file = std::fs::File::open(path).map_err(BootromParseError::FileOpen)?;
let metadata = file.metadata()?;
if metadata.len() != 256 {
return Err(BootromParseError::InvalidSize(metadata.len()));
}
file.read_exact(&mut bootrom_slice).map_err(BootromParseError::FileRead)?;
let mut hash_ctx = Sha1::new();
hash_ctx.update(&bootrom_slice);
let digest = hash_ctx.finalize();
if digest.as_slice()
!= b"\x4e\xd3\x1e\xc6\xb0\xb1\x75\xbb\x10\x9c\x0e\xb5\xfd\x3d\x19\x3d\xa8\x23\x33\x9f"
{
return Err(BootromParseError::InvalidHash);
}
Ok(bootrom_slice)
}

View file

@ -95,20 +95,17 @@ impl Registers {
define_register!(d, e);
define_register!(h, l);
pub fn post_rom() -> Self {
Self {
a: 0x01,
f: 0xB0,
b: 0x00,
c: 0x13,
d: 0x00,
e: 0xD8,
h: 0x01,
l: 0x4D,
sp: 0xFFFE,
pc: 0x0100,
..Default::default()
}
pub fn set_post_rom(&mut self) {
self.a = 0x01;
self.f = 0xB0;
self.b = 0x00;
self.c = 0x13;
self.d = 0x00;
self.e = 0xD8;
self.h = 0x01;
self.l = 0x4D;
self.sp = 0xFFFE;
self.pc = 0x0100;
}
/// This is just a helper function for macros utilizing ident pasting

View file

@ -1,4 +1,4 @@
use super::{mapper::Mapper, memory::Memory, ppu::Ppu};
use super::{memory::Memory, ppu::Ppu, GenericCartridge};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DmaMemoryBus {
@ -36,7 +36,7 @@ impl DmaMemoryBus {
#[derive(Debug, Clone, Copy)]
pub struct DmaState {
original_base: u8,
pub dma_in_progress: bool,
pub dma_in_progress: Option<u16>,
pub base: u8,
pub remaining_cycles: u8,
restarting: Option<(u8, bool)>,
@ -48,7 +48,7 @@ impl DmaState {
}
pub fn in_progress(&self) -> Option<DmaMemoryBus> {
match self.dma_in_progress {
match self.dma_in_progress.is_some() {
true => Some(DmaMemoryBus::from_base(self.original_base)),
false => None,
}
@ -56,7 +56,7 @@ impl DmaState {
pub fn new() -> Self {
Self {
dma_in_progress: false,
dma_in_progress: None,
original_base: 0,
base: 0,
remaining_cycles: 0,
@ -69,11 +69,29 @@ impl DmaState {
self.restarting = Some((base, false));
}
pub fn read_next_byte(&self, ppu: &Ppu, memory: &Memory, cartridge: Option<&GenericCartridge>) -> u8 {
let read_address = self.dma_in_progress.unwrap() as usize;
match self.original_base {
0..=0x7F => match cartridge {
Some(cart) => cart.read_rom_u8(read_address as u16),
None => 0xFF,
},
0x80..=0x9F => ppu.vram[read_address - 0x8000],
0xA0..=0xBF => match cartridge {
Some(mapper) => mapper.read_eram_u8(read_address as u16 - 0xA000),
None => 0xFF,
},
0xC0..=0xDF => memory.wram[read_address - 0xC000],
0xE0..=0xFD => memory.wram[read_address - 0xE000],
0xFE..=0xFF => 0xFF
}
}
pub fn tick_dma(
&mut self,
ppu: &mut Ppu,
memory: &Memory,
cartridge: Option<&(dyn Mapper + Send + Sync)>,
cartridge: Option<&GenericCartridge>,
) {
match self.restarting {
Some((base, false)) => self.restarting = Some((base, true)),
@ -85,30 +103,15 @@ impl DmaState {
None => {}
}
self.dma_in_progress = self.remaining_cycles > 0;
// We do not clear this after running because the "in progress" should remain the entire cycle
self.dma_in_progress = match self.remaining_cycles > 0 {
true => Some(((self.original_base as u16) << 8) | (0xA0 - self.remaining_cycles) as u16),
false => None,
};
if self.remaining_cycles > 0 {
let offset = 0xA0 - self.remaining_cycles;
let read_address = ((self.original_base as usize) << 8) | offset as usize;
let value = if self.original_base <= 0x7F {
match cartridge {
Some(cart) => cart.read_rom_u8(read_address as u16),
None => 0xFF,
}
} else if self.original_base <= 0x9F {
let address = read_address - 0x8000;
ppu.vram[address]
} else if self.original_base <= 0xDF {
let address = read_address - 0xC000;
memory.wram[address]
} else if self.original_base <= 0xFD {
let address = read_address - 0xE000;
memory.wram[address]
} else {
0xFF
};
ppu.dma_write_oam(offset, value);
let value = self.read_next_byte(ppu, memory, cartridge);
ppu.dma_write_oam(0xA0 - self.remaining_cycles, value);
self.remaining_cycles -= 1;
}
}

View file

@ -9,7 +9,7 @@ macro_rules! joypad_input {
($input:ident, $mode:ident) => {
paste::paste! {
pub fn [<set_ $input>](&mut self, val: bool) {
if val && self.mode == JoypadMode::$mode {
if val && (self.mode == JoypadMode::$mode || self.mode == JoypadMode::Both) {
self.interrupt_triggered = true;
}
self.$input = val;
@ -17,7 +17,7 @@ macro_rules! joypad_input {
pub fn [<invert_ $input>](&mut self) {
let val = !self.$input;
if val && self.mode == JoypadMode::$mode {
if val && (self.mode == JoypadMode::$mode || self.mode == JoypadMode::Both) {
self.interrupt_triggered = true;
}
self.$input = val;
@ -86,9 +86,9 @@ impl Joypad {
joypad_input!(right, Direction);
pub fn cpu_write(&mut self, content: u8) {
if (content >> 5) & 0b1 == 0 {
if (content >> 5) & 0b1 == 0 && (content >> 4) & 0b1 == 1 {
self.mode = JoypadMode::Action;
} else if (content >> 4) & 0b1 == 0 {
} else if (content >> 4) & 0b1 == 0 && (content >> 5) & 0b1 == 1 {
self.mode = JoypadMode::Direction;
} else {
self.mode = JoypadMode::Both;

View file

@ -1,25 +1,17 @@
pub struct Memory {
pub wram: [u8; 0x2000],
pub hram: [u8; 0xAF],
pub bootrom_disabled: bool,
pub bootrom: [u8; 0x100],
}
impl Memory {
pub fn new(bootrom: Option<[u8; 0x100]>) -> Self {
pub fn new() -> Self {
Self {
wram: [0; 0x2000],
hram: [0; 0xAF],
bootrom: bootrom.unwrap_or_else(|| [0u8; 0x100]),
bootrom_disabled: bootrom.is_none(),
}
}
pub fn get_bootrom_disabled(&self) -> u8 {
match self.bootrom_disabled {
true => 0xFF,
false => 0x00,
}
0xFF
}
}

View file

@ -273,7 +273,9 @@ pub struct PpuRegisters {
pub scx: u8,
pub ly: u8,
cycles_since_last_ly_increment: u64,
cycles_since_stat_mode_0: u64,
cycles_since_last_last_mode_start_increment: [u64; 4],
cycles_since_stat_mode_2: u64,
pub lyc: u8,
pub wy: u8,
pub wx: u8,
@ -306,6 +308,7 @@ pub struct Ppu {
total_dots: u16,
is_irq_high: bool,
window_counter: usize,
}
impl Ppu {
@ -320,16 +323,17 @@ impl Ppu {
self.first_frame = true;
self.first_line = true;
self.total_dots = 0;
self.window_counter = 0;
}
pub fn start(&mut self, interrupts: &mut Interrupts) {
self.set_scanline(interrupts, 0);
}
pub fn new(bootrom_ran: bool) -> Self {
pub fn new() -> Self {
Self {
registers: PpuRegisters {
lcdc: (!bootrom_ran).then_some(0b1001_0001).unwrap_or_default(),
lcdc: 0b1001_0001,
stat_flags: StatFlags::default(),
mode: PPUMode::HBlank,
scy: 0,
@ -341,6 +345,8 @@ impl Ppu {
wy: 0,
wx: 0,
ly_lyc: true,
cycles_since_stat_mode_0: 0,
cycles_since_stat_mode_2: 0,
},
vram: [0; 0x2000],
oam: [0; 0xA0],
@ -359,6 +365,7 @@ impl Ppu {
total_dots: 0,
first_line: true,
is_irq_high: false,
window_counter: 0,
}
}
@ -383,6 +390,11 @@ impl Ppu {
self.is_irq_high = stat_int || ly_eq_lyc_int || vblank_causing_oam_int_bug;
if !old_irq_high && self.is_irq_high {
if stat_int && self.registers.mode == PPUMode::HBlank {
self.registers.cycles_since_stat_mode_0 = 0;
} else if stat_int && self.registers.mode == PPUMode::SearchingOAM {
self.registers.cycles_since_stat_mode_2 = 0;
}
interrupts.write_if_lcd_stat(true);
}
}
@ -415,7 +427,7 @@ impl Ppu {
}
pub fn sprite_height(&self) -> SpriteHeight {
match (self.registers.lcdc >> 2) == 1 {
match (self.registers.lcdc >> 2) & 0b1 == 1 {
false => SpriteHeight::Eight,
true => SpriteHeight::Sixteen,
}
@ -546,11 +558,14 @@ impl Ppu {
}
fn set_scanline(&mut self, interrupts: &mut Interrupts, scanline: u8) {
// println!("LY incrementing: {} cycles since last incrementation. cycles since:
// {:?}", self.registers.cycles_since_last_ly_increment,
// self.registers.cycles_since_last_last_mode_start_increment.iter().
// enumerate().map(|(idx, value)| { let idx_enum = match idx {
// 0 => PPUMode::HBlank,
// println!("LY incrementing: {} cycles since last incrementation and {} cycles
// since last stat mode0 interrupt",
// self.registers.cycles_since_last_ly_increment,
// self.registers.cycles_since_stat_mode_0); println!("LY incrementing: {}
// cycles since last incrementation. cycles since: {:?}", self.registers.
// cycles_since_last_ly_increment, self.registers.
// cycles_since_last_last_mode_start_increment.iter(). enumerate().map(|(idx,
// value)| { let idx_enum = match idx { 0 => PPUMode::HBlank,
// 1 => PPUMode::VBlank,
// 2 => PPUMode::SearchingOAM,
// 3 => PPUMode::TransferringData,
@ -568,13 +583,16 @@ impl Ppu {
pub fn tick(&mut self, dma_state: &DmaState, interrupts: &mut Interrupts) -> bool {
if self.enabled() {
self.registers.cycles_since_last_ly_increment += 1;
self.registers.cycles_since_stat_mode_0 += 1;
self.registers.cycles_since_stat_mode_2 += 1;
match self.mode() {
PPUMode::SearchingOAM => {
self.registers.cycles_since_last_last_mode_start_increment[2] += 1;
if self.current_dot == 0 {
if self.registers.ly == 0 {
self.wy_match = self.registers.wy == self.registers.ly;
self.wy_match = false;
}
self.wy_match |= self.registers.wy == self.registers.ly;
self.sprite_buffer = [None; 10];
self.sprite_count = 0;
}
@ -679,6 +697,7 @@ impl Ppu {
false
}
PPUMode::VBlank => {
self.window_counter = 0;
self.registers.cycles_since_last_last_mode_start_increment[1] += 1;
self.current_dot += 1;
if self.current_dot % 456 == 0 {
@ -711,8 +730,9 @@ impl Ppu {
fn clear_line_sprite_fb(&mut self, real_line_number: usize) {
assert!(real_line_number < FB_HEIGHT as usize);
for value in 0..256 {
let idx = ((real_line_number * FB_WIDTH as usize) + value) * PIXEL_SIZE;
let y_fb_offset = (real_line_number * FB_WIDTH as usize) * PIXEL_SIZE;
for value in 0..FB_WIDTH as usize {
let idx = y_fb_offset + (value * PIXEL_SIZE);
self.sprite_framebuffer[idx] = 0;
self.sprite_framebuffer[idx + 1] = 0;
self.sprite_framebuffer[idx + 2] = 0;
@ -724,6 +744,7 @@ impl Ppu {
let state = match self.current_draw_state.take() {
Some(state) => state,
None => {
self.clear_line_sprite_fb(self.registers.ly as usize);
let scrolling_delay = self.registers.scx % 8;
self.dot_target += scrolling_delay as u16;
if scrolling_delay != 0 {
@ -733,7 +754,6 @@ impl Ppu {
self.registers.scy,
)
} else {
self.clear_line_sprite_fb(self.registers.ly as usize);
LineDrawingState::BackgroundAndObjectFifo(
self.registers.scx,
self.registers.scy,
@ -760,7 +780,6 @@ impl Ppu {
false,
self.registers.lcdc & 0b1 == 0,
));
self.clear_line_sprite_fb(self.registers.ly as usize);
}
}
LineDrawingState::BackgroundAndObjectFifo(
@ -770,8 +789,6 @@ impl Ppu {
mut window_drawn,
draw_only_sprites,
) => {
// assert_eq!(scy, self.registers.scy);
// assert_eq!(scx, self.registers.scx);
let wx_match = (drawn_pixels as usize + 7) >= self.registers.wx as usize;
let scrolled_y = self.registers.ly.wrapping_add(scy) as usize;
let scrolled_x = drawn_pixels.wrapping_add(scx) as usize;
@ -795,14 +812,16 @@ impl Ppu {
as usize;
let window_y =
self.registers.ly.wrapping_sub(self.registers.wy) as usize;
let tilemap_idx = window_x / 8 + ((window_y / 8) * 32);
let tilemap_idx = window_x / 8 + ((self.window_counter / 8) * 32);
let tilemap_value = self.read_window_tile_map()[tilemap_idx];
(bg_color_id, bg_color) = Self::parse_tile_color(
let (window_color_id, window_color) = Self::parse_tile_color(
self.read_bg_win_tile(tilemap_value),
window_x % 8,
window_y % 8,
&self.bgp,
);
bg_color_id = window_color_id;
bg_color = window_color;
}
(bg_color_id, bg_color)
@ -816,69 +835,82 @@ impl Ppu {
self.framebuffer[framebuffer_offset + idx] = *byte;
}
let mut sprite_buffer = Vec::new();
for sprite_idx in 0..self.sprite_count {
// WARNING: Sprites are not scrolled, they have an absolute position!
let sprite = self.sprite_buffer[sprite_idx]
.as_ref()
.expect("within the sprite count there should be non `None`s");
if (self.registers.lcdc >> 1) & 0b1 == 1 {
let mut sprite_buffer: Vec<OAMEntry> = Vec::new();
for sprite_idx in 0..self.sprite_count {
// WARNING: Sprites are not scrolled, they have an absolute position!
let sprite = self.sprite_buffer[sprite_idx]
.as_ref()
.expect("within the sprite count there should be no `None`s");
let x_valid =
drawn_pixels < sprite.x && drawn_pixels.wrapping_add(8) >= sprite.x;
let y_valid = self.registers.ly < sprite.y
&& self.registers.ly.wrapping_add(16) >= sprite.y;
let x_valid =
drawn_pixels < sprite.x && drawn_pixels.wrapping_add(8) >= sprite.x;
let y_valid = self.registers.ly < sprite.y
&& self.registers.ly.wrapping_add(16) >= sprite.y;
if x_valid && y_valid {
sprite_buffer.push(*sprite);
}
}
sprite_buffer.sort_by(|l, r| l.x.cmp(&r.x));
// TODO: Adjust mode length based on sprites
for sprite in &sprite_buffer {
let mut sprite_x_idx =
drawn_pixels.wrapping_sub(sprite.x.wrapping_sub(8)) as usize;
let mut sprite_y_idx =
self.registers.ly.wrapping_sub(sprite.y.wrapping_sub(16)) as usize;
let tile_idx = match self.sprite_height() {
SpriteHeight::Eight => sprite.tile_idx,
SpriteHeight::Sixteen => match sprite_y_idx >= 8 {
true => sprite.tile_idx | 1,
false => sprite.tile_idx & 0xFE,
},
};
if sprite_y_idx >= 8 {
sprite_y_idx -= 8;
assert!(sprite_y_idx < 8);
if !sprite_buffer.iter().any(|existing| existing.x == sprite.x)
&& x_valid && y_valid
{
sprite_buffer.push(*sprite);
}
}
if sprite.y_flip() {
sprite_y_idx = 7 - sprite_y_idx;
}
sprite_buffer.sort_by(|l, r| r.x.cmp(&l.x));
if sprite.x_flip() {
sprite_x_idx = 7 - sprite_x_idx;
}
// TODO: Adjust mode length based on sprites
for sprite in &sprite_buffer {
let mut sprite_x_idx =
drawn_pixels.wrapping_sub(sprite.x.wrapping_sub(8)) as usize;
let mut sprite_y_idx =
self.registers.ly.wrapping_sub(sprite.y.wrapping_sub(16)) as usize;
let color_id =
self.read_obj_tile_colour_id(tile_idx, sprite_x_idx, sprite_y_idx);
let palette = &self.obp[sprite.palette_number() as usize];
let sprite_color = palette.color_from_2bit(color_id);
if sprite.y_flip() {
let sprite_offset = match self.sprite_height() {
SpriteHeight::Eight => 7,
SpriteHeight::Sixteen => 15,
};
sprite_y_idx = sprite_offset - sprite_y_idx;
}
if color_id != 0 && !(sprite.covered_by_bg_window() && bg_color_id != 0) {
self.sprite_framebuffer[framebuffer_offset + 0] = sprite_color.rgba()[0];
self.sprite_framebuffer[framebuffer_offset + 1] = sprite_color.rgba()[1];
self.sprite_framebuffer[framebuffer_offset + 2] = sprite_color.rgba()[2];
self.sprite_framebuffer[framebuffer_offset + 3] = sprite_color.rgba()[3];
if sprite.x_flip() {
sprite_x_idx = 7 - sprite_x_idx;
}
let tile_idx = match self.sprite_height() {
SpriteHeight::Eight => sprite.tile_idx,
SpriteHeight::Sixteen => match sprite_y_idx >= 8 {
true => sprite.tile_idx | 1,
false => sprite.tile_idx & 0xFE,
},
};
if sprite_y_idx >= 8 {
sprite_y_idx -= 8;
assert!(sprite_y_idx < 8);
}
let color_id =
self.read_obj_tile_colour_id(tile_idx, sprite_x_idx, sprite_y_idx);
let palette = &self.obp[sprite.palette_number() as usize];
let sprite_color = palette.color_from_2bit(color_id);
let sprite_covered = sprite.covered_by_bg_window() && bg_color_id != 0;
if color_id != 0 && !sprite_covered {
let [r, g, b, a] = *sprite_color.rgba();
self.sprite_framebuffer[framebuffer_offset + 0] = r;
self.sprite_framebuffer[framebuffer_offset + 1] = g;
self.sprite_framebuffer[framebuffer_offset + 2] = b;
self.sprite_framebuffer[framebuffer_offset + 3] = a;
}
}
}
drawn_pixels += 1;
if drawn_pixels == FB_WIDTH as u8 {
if window_drawn {
self.window_counter += 1;
self.dot_target += 6;
}
self.current_draw_state = Some(LineDrawingState::Finished);

View file

@ -8,13 +8,11 @@ pub mod ringbuffer;
pub fn setup_test_emulator<const ROM_LENGTH: usize>(
test_opcodes: [u8; ROM_LENGTH],
) -> gameboy::Gameboy<std::io::Stdout> {
let mut gameboy = gameboy::Gameboy::new(None, std::io::stdout());
let mut cartridge = gameboy::mapper::NoMBC { rom: [0u8; 0x8000], ram: None };
(&mut cartridge.rom[0x100..ROM_LENGTH + 0x100]).copy_from_slice(&test_opcodes);
gameboy.cartridge = Some(Box::new(cartridge));
let mut gameboy = gameboy::Gameboy::new_with_cartridge(std::io::stdout(), Some(Box::new(cartridge)));
gameboy.tick_4(); // Prefetch instruction
assert!(gameboy.registers.mem_read_hold.is_some()); // Assert prefetch happened and opcode is now sitting in the memory bus

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -18,7 +18,15 @@ pub struct CliArgs {
#[derive(Debug, Subcommand)]
pub enum Operation {
Test {
TestFramebuffer {
/// maximum M-cycles
#[clap(short = 'm', long)]
maximum_m_cycles: u64,
/// path to expected framebuffer (RGBA)
#[clap(short = 's', long)]
expected_framebuffer: PathBuf,
},
TestSerial {
/// maximum M-cycles
#[clap(short = 'm', long)]
maximum_m_cycles: u64,
@ -26,7 +34,7 @@ pub enum Operation {
#[clap(short = 's', long)]
expected_serial: PathBuf,
},
GenerateOutput {
GenerateOutputSerial {
/// M-cycles to run for
#[clap(short = 'm', long)]
m_cycles: u64,
@ -34,6 +42,14 @@ pub enum Operation {
#[clap(short = 's', long)]
expected_serial: PathBuf,
},
GenerateOutputFramebuffer {
/// M-cycles to run for
#[clap(short = 'm', long)]
m_cycles: u64,
/// path to expected framebuffer output
#[clap(short = 's', long)]
expected_framebuffer: PathBuf,
},
}
#[derive(Debug, thiserror::Error)]
@ -42,14 +58,16 @@ pub enum DmgTestError {
RomNotFound,
#[error("ROM reading error: {0}")]
RomRead(std::io::Error),
#[error("Missing serial output file")]
SerialOutputFileNotFound,
#[error("Error reading serial output file: {0}")]
SerialOutputFileRead(std::io::Error),
#[error("Error writing serial output file: {0}")]
SerialOutputFileWrite(std::io::Error),
#[error("Missing output file")]
OutputFileNotFound,
#[error("Error reading output file: {0}")]
OutputFileRead(std::io::Error),
#[error("Error writing output file: {0}")]
OutputFileWrite(std::io::Error),
#[error("Serial mismatch\nExpected: {0}\nFound: {1}")]
SerialDifferent(String, String),
#[error("Framebuffer mismatch")]
FramebufferDifferent,
}
#[derive(Debug, Clone)]
@ -75,10 +93,10 @@ impl SerialWriter for SyncWriter {
}
}
fn generate_output(
fn generate_output<const FRAMEBUFFER: bool>(
rom: &Path,
m_cycles: u64,
expected_serial: &Path,
expected: &Path,
) -> Result<Duration, DmgTestError> {
let rom = {
if !rom.is_file() {
@ -88,29 +106,39 @@ fn generate_output(
};
let sync_writer = SyncWriter::new();
let mut fb = None;
let mut gameboy = Gameboy::new(None, sync_writer.clone());
gameboy.load_cartridge(rom);
let mut gameboy = Gameboy::new(sync_writer.clone(), Some(rom));
let instant = std::time::Instant::now();
for _ in 0..m_cycles {
gameboy.tick_4();
let new_fb = gameboy.tick_4();
if FRAMEBUFFER && new_fb {
fb = Some(gameboy.ppu.write_fb());
}
}
drop(gameboy);
let serial_content = sync_writer.into_inner();
std::fs::write(expected_serial, &serial_content)
.map_err(DmgTestError::SerialOutputFileWrite)?;
if FRAMEBUFFER {
std::fs::write(expected, &fb.unwrap())
.map_err(DmgTestError::OutputFileWrite)?;
} else {
let serial_content = sync_writer.into_inner();
std::fs::write(expected, &serial_content)
.map_err(DmgTestError::OutputFileWrite)?;
}
Ok(instant.elapsed())
}
fn run_test(
fn run_test<const FRAMEBUFFER: bool>(
rom: &Path,
maximum_m_cycles: u64,
expected_serial: &Path,
expected: &Path,
) -> Result<(u64, Duration), DmgTestError> {
let rom = {
if !rom.is_file() {
@ -119,38 +147,51 @@ fn run_test(
std::fs::read(rom).map_err(DmgTestError::RomRead)?
};
let expected_serial = {
if !expected_serial.is_file() {
return Err(DmgTestError::SerialOutputFileNotFound);
let expected = {
if !expected.is_file() {
return Err(DmgTestError::OutputFileNotFound);
}
std::fs::read(expected_serial).map_err(DmgTestError::SerialOutputFileRead)?
std::fs::read(expected).map_err(DmgTestError::OutputFileRead)?
};
if FRAMEBUFFER {
assert_eq!(expected.len(), (meowgb_core::gameboy::ppu::FB_WIDTH as usize * meowgb_core::gameboy::ppu::FB_HEIGHT as usize) * meowgb_core::gameboy::ppu::PIXEL_SIZE as usize);
}
let sync_writer = SyncWriter::new();
let mut gameboy = Gameboy::new(None, sync_writer.clone());
gameboy.load_cartridge(rom);
let mut gameboy = Gameboy::new(sync_writer.clone(), Some(rom));
let instant = Instant::now();
let mut cycle_counter = 0;
while cycle_counter < maximum_m_cycles {
gameboy.tick_4();
if FRAMEBUFFER {
let redraw = gameboy.tick_4();
cycle_counter += 1;
cycle_counter += 1;
if sync_writer.compare(&expected_serial) {
return Ok((cycle_counter, instant.elapsed()));
if redraw && expected == gameboy.ppu.write_fb() {
return Ok((cycle_counter, instant.elapsed()));
}
} else {
gameboy.tick_4();
cycle_counter += 1;
if sync_writer.compare(&expected) {
return Ok((cycle_counter, instant.elapsed()));
}
}
}
drop(gameboy);
match sync_writer.compare(&expected_serial) {
match sync_writer.compare(&expected) {
true => Ok((cycle_counter, instant.elapsed())),
false => Err(DmgTestError::SerialDifferent(
expected_serial.into_iter().map(char::from).collect(),
expected.into_iter().map(char::from).collect(),
sync_writer.into_inner().into_iter().map(char::from).collect(),
)),
}
@ -160,8 +201,8 @@ fn main() {
let args = CliArgs::parse();
match args.operation {
Operation::Test { maximum_m_cycles, expected_serial } => {
match run_test(args.rom.as_path(), maximum_m_cycles, expected_serial.as_path()) {
Operation::TestSerial { maximum_m_cycles, expected_serial } => {
match run_test::<false>(args.rom.as_path(), maximum_m_cycles, expected_serial.as_path()) {
Ok((m_cycles, duration)) => {
println!("Success! Ran {} M-Cycles in {}ms", m_cycles, duration.as_millis());
}
@ -171,8 +212,8 @@ fn main() {
}
}
}
Operation::GenerateOutput { m_cycles, expected_serial } => {
match generate_output(args.rom.as_path(), m_cycles, expected_serial.as_path()) {
Operation::GenerateOutputSerial { m_cycles, expected_serial } => {
match generate_output::<false>(args.rom.as_path(), m_cycles, expected_serial.as_path()) {
Ok(duration) => {
println!("Successfully written serial output to {} in {} M-Cycles ({}ms), please verify it is correct", expected_serial.display(), m_cycles, duration.as_millis());
}
@ -182,5 +223,27 @@ fn main() {
}
}
}
Operation::TestFramebuffer { maximum_m_cycles, expected_framebuffer } => {
match run_test::<true>(args.rom.as_path(), maximum_m_cycles, expected_framebuffer.as_path()) {
Ok((m_cycles, duration)) => {
println!("Success! Ran {} M-Cycles in {}ms", m_cycles, duration.as_millis());
}
Err(why) => {
eprintln!("{}", why);
std::process::exit(1);
}
}
},
Operation::GenerateOutputFramebuffer { m_cycles, expected_framebuffer } => {
match generate_output::<true>(args.rom.as_path(), m_cycles, expected_framebuffer.as_path()) {
Ok(duration) => {
println!("Successfully written framebuffer output to {} in {} M-Cycles ({}ms), please verify it is correct", expected_framebuffer.display(), m_cycles, duration.as_millis());
}
Err(why) => {
eprintln!("{}", why);
std::process::exit(1);
}
}
},
}
}

View file

@ -13,7 +13,6 @@ use std::{
use clap::Parser;
use config::MeowGBConfig;
use meowgb_core::gameboy::{
bootrom::{verify_parse_bootrom, BootromParseError},
serial::SerialWriter,
Gameboy,
};
@ -23,9 +22,6 @@ use window::events::{EmulatorDebugEvent, EmulatorWindowEvent, GameboyEvent};
#[derive(Debug, Parser)]
/// DMG Emulator
pub struct CliArgs {
/// bootrom path
#[clap(long)]
pub bootrom: Option<PathBuf>,
/// game path
#[clap(long)]
pub rom: Option<PathBuf>,
@ -38,9 +34,6 @@ pub struct CliArgs {
#[derive(Debug, Parser)]
/// DMG Emulator
pub struct CliArgs {
/// bootrom path
#[clap(long)]
pub bootrom: Option<PathBuf>,
/// game path
#[clap(long)]
pub rom: Option<PathBuf>,
@ -48,8 +41,6 @@ pub struct CliArgs {
#[derive(Debug, thiserror::Error)]
pub enum MeowGBError {
#[error(transparent)]
Bootrom(BootromParseError),
#[error("Game Not Found")]
GameNotFound,
#[error("IO Error: {0}")]
@ -71,12 +62,18 @@ fn real_main() -> Result<(), MeowGBError> {
path.file_name().and_then(|name| name.to_str().map(str::to_string).map(Cow::Owned))
});
let bootrom = match args.bootrom.as_deref() {
Some(path) => Some(verify_parse_bootrom(path).map_err(MeowGBError::Bootrom)?),
None => None,
let rom = match args.rom.as_deref() {
Some(rom) => {
if !rom.is_file() {
return Err(MeowGBError::GameNotFound);
}
Some(std::fs::read(rom)?)
},
None => None
};
let mut gameboy = WrappedGameboy::new(Gameboy::new(bootrom, std::io::stdout()));
let mut gameboy = WrappedGameboy::new(Gameboy::new(std::io::stdout(), rom));
#[cfg(feature = "debugger")]
let dbg = args.debug;
#[cfg(not(feature = "debugger"))]
@ -87,7 +84,7 @@ fn real_main() -> Result<(), MeowGBError> {
let jh = std::thread::Builder::new()
.name(String::from("mewmulator"))
.spawn(move || run_gameboy(args, gameboy_2, gb_side_rx, gb_side_tx).unwrap())
.spawn(move || run_gameboy(gameboy_2, gb_side_rx, gb_side_tx).unwrap())
.unwrap();
window::run_window(
@ -123,25 +120,10 @@ impl<W: SerialWriter> WrappedGameboy<W> {
}
pub fn run_gameboy(
args: CliArgs,
gameboy_arc: Arc<RwLock<WrappedGameboy<impl SerialWriter>>>,
rx: Receiver<EmulatorWindowEvent>,
tx: Sender<GameboyEvent>,
) -> Result<(), MeowGBError> {
let mut gameboy = gameboy_arc.write().unwrap();
if let Some(rom) = args.rom {
if !rom.is_file() {
return Err(MeowGBError::GameNotFound);
}
let rom = std::fs::read(rom.as_path())?;
gameboy.gameboy.load_cartridge(rom)
}
drop(gameboy);
let mut goal = time::OffsetDateTime::now_utc() + time::Duration::milliseconds(1000 / 60);
let mut frame_counter = 0;
let mut debugging_tbf = None;

View file

@ -7,711 +7,731 @@ fi
TEST_TOTAL=0
TEST_SUCCESS=0
echo "Running test ROM ./test-roms/blargg/roms/cpu_instrs.gb"
echo "Running test ROM ./test-roms/blargg/serial-roms/cpu_instrs.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/blargg/roms/cpu_instrs.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/cpu_instrs.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/blargg/serial-roms/cpu_instrs.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/cpu_instrs.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/blargg/roms/instr_timing.gb"
echo "Running test ROM ./test-roms/blargg/serial-roms/instr_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/blargg/roms/instr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/instr_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/blargg/serial-roms/instr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/instr_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/blargg/roms/mem_timing.gb"
echo "Running test ROM ./test-roms/blargg/serial-roms/mem_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/blargg/roms/mem_timing.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/mem_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/blargg/serial-roms/mem_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/blargg/mem_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/add_sp_e_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/add_sp_e_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/add_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/add_sp_e_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/add_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/add_sp_e_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/boot_hwio-dmgABCmgb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/boot_hwio-dmgABCmgb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_hwio-dmgABCmgb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_hwio-dmgABCmgb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_hwio-dmgABCmgb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_hwio-dmgABCmgb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/boot_regs-dmgABC.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/boot_regs-dmgABC.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/boot_regs-dmgABC.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/boot_regs-dmgABC.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/boot_regs-dmgABC.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/boot_regs-dmgABC.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/call_cc_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/call_cc_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/call_cc_timing2.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/call_cc_timing2.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_cc_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_cc_timing2.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_cc_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_cc_timing2.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/call_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/call_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/call_timing2.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/call_timing2.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/call_timing2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/call_timing2.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/call_timing2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/call_timing2.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/di_timing-GS.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/di_timing-GS.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/di_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/di_timing-GS.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/di_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/di_timing-GS.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/div_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/div_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/div_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/div_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/div_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/div_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ei_sequence.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ei_sequence.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_sequence.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_sequence.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_sequence.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_sequence.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ei_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ei_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ei_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ei_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ei_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ei_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/halt_ime0_ei.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/halt_ime0_ei.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_ei.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_ei.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/halt_ime0_nointr_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/halt_ime0_nointr_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime0_nointr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime0_nointr_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime0_nointr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime0_nointr_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/halt_ime1_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/halt_ime1_timing2-GS.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing2-GS.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/halt_ime1_timing2-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/halt_ime1_timing2-GS.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/halt_ime1_timing2-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/halt_ime1_timing2-GS.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/if_ie_registers.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/if_ie_registers.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/if_ie_registers.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/if_ie_registers.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/if_ie_registers.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/if_ie_registers.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/intr_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/intr_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/intr_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/intr_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/jp_cc_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/jp_cc_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_cc_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_cc_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/jp_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/jp_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/jp_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/jp_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/jp_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/jp_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ld_hl_sp_e_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ld_hl_sp_e_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ld_hl_sp_e_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ld_hl_sp_e_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ld_hl_sp_e_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ld_hl_sp_e_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/oam_dma_restart.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/oam_dma_restart.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_restart.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_restart.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_restart.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_restart.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/oam_dma_start.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/oam_dma_start.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_start.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_start.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_start.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_start.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/oam_dma_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/oam_dma_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/pop_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/pop_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/pop_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/pop_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/pop_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/pop_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/push_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/push_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/push_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/push_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/push_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/push_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/rapid_di_ei.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/rapid_di_ei.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rapid_di_ei.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rapid_di_ei.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rapid_di_ei.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rapid_di_ei.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ret_cc_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ret_cc_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_cc_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_cc_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_cc_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_cc_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ret_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ret_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ret_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ret_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ret_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ret_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/reti_intr_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/reti_intr_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_intr_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_intr_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_intr_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_intr_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/reti_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/reti_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/reti_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/reti_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/reti_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/reti_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/rst_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/rst_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/rst_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/rst_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/rst_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/rst_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank1.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank1.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank1.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank1.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank2.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_bank2.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_bank2.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_bank2.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/bits_mode.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_mode.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_mode.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_mode.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/bits_ramg.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/bits_ramg.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/bits_ramg.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/bits_ramg.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/multicart_rom_8Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/multicart_rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/multicart_rom_8Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/ram_256kb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_256kb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_256kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_256kb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/ram_64kb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/ram_64kb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/ram_64kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/ram_64kb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_16Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_16Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_16Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_16Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_1Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_1Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_1Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_1Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_2Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_2Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_2Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_2Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_4Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_4Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_4Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_4Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_512kb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_512kb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_512kb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_512kb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/MBC1/rom_8Mb.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/MBC1/rom_8Mb.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/MBC1/rom_8Mb.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/MBC1/rom_8Mb.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/bits/mem_oam.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/bits/mem_oam.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/mem_oam.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/mem_oam.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/mem_oam.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/mem_oam.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/bits/reg_f.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/bits/reg_f.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/reg_f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/reg_f.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/reg_f.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/reg_f.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/bits/unused_hwio-GS.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/bits/unused_hwio-GS.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/bits/unused_hwio-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/bits/unused_hwio-GS.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/bits/unused_hwio-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/bits/unused_hwio-GS.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/instr/daa.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/instr/daa.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/instr/daa.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/instr/daa.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/instr/daa.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/instr/daa.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/oam_dma/basic.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/oam_dma/basic.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/basic.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/basic.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/basic.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/basic.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/oam_dma/reg_read.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/oam_dma/reg_read.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/oam_dma/reg_read.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/oam_dma/reg_read.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/oam_dma/reg_read.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/oam_dma/reg_read.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ppu/intr_1_2_timing-GS.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ppu/intr_1_2_timing-GS.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_1_2_timing-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_1_2_timing-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_1_2_timing-GS.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ppu/intr_2_0_timing.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/intr_2_0_timing.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/intr_2_0_timing.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_0_timing.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ppu/stat_irq_blocking.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_irq_blocking.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_irq_blocking.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_irq_blocking.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ppu/stat_lyc_onoff.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ppu/stat_lyc_onoff.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/stat_lyc_onoff.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/stat_lyc_onoff.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_lyc_onoff.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_lyc_onoff.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/ppu/vblank_stat_intr-GS.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/ppu/vblank_stat_intr-GS.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/ppu/vblank_stat_intr-GS.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/vblank_stat_intr-GS.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/vblank_stat_intr-GS.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/div_write.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/div_write.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/div_write.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/div_write.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/div_write.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/div_write.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/rapid_toggle.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/rapid_toggle.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/rapid_toggle.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/rapid_toggle.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/rapid_toggle.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/rapid_toggle.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim00.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim00.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim00_div_trigger.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim00_div_trigger.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim00_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim00_div_trigger.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim00_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim00_div_trigger.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim01.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim01.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim01_div_trigger.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim01_div_trigger.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim01_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim01_div_trigger.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim01_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim01_div_trigger.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim10.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim10.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim10_div_trigger.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim10_div_trigger.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim10_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim10_div_trigger.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim10_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim10_div_trigger.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim11.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim11.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tim11_div_trigger.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tim11_div_trigger.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tim11_div_trigger.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tim11_div_trigger.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tim11_div_trigger.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tim11_div_trigger.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tima_reload.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tima_reload.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_reload.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_reload.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_reload.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_reload.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tima_write_reloading.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tima_write_reloading.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tima_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tima_write_reloading.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tima_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tima_write_reloading.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/mooneye-test-suite/roms/timer/tma_write_reloading.gb"
echo "Running test ROM ./test-roms/mooneye-test-suite/serial-roms/timer/tma_write_reloading.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/timer/tma_write_reloading.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/timer/tma_write_reloading.bin 2>&1 > /dev/null) ; then
if res=$(./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/timer/tma_write_reloading.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/timer/tma_write_reloading.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/hacktix/framebuffer-roms/bully.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/bully.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/bully.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"
fi
echo "Running test ROM ./test-roms/hacktix/framebuffer-roms/strikethrough.gb"
TEST_TOTAL=$((TEST_TOTAL + 1))
if res=$(./target/release/meowgb-tests test-roms/hacktix/framebuffer-roms/strikethrough.gb test-framebuffer -m 100000000 -s meowgb-tests/expected_output/framebuffer/hacktix/strikethrough.bin 2>&1 > /dev/null) ; then
TEST_SUCCESS=$((TEST_SUCCESS + 1))
else
echo "Failed: $res"

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Optix
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,5 @@
# Hacktix Tests
These test ROMs were written by "Hacktix", and are licensed by them under the MIT license, a copy of their license is in [BullyGB-LICENSE](./BullyGB-LICENSE) and [strikethrough-gb-LICENSE](./strikethrough-gb-LICENSE).
The original source code can be found at [https://github.com/Hacktix/strikethrough.gb](https://github.com/Hacktix/strikethrough.gb) and [https://github.com/Hacktix/BullyGB](https://github.com/Hacktix/BullyGB).

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Optix™
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Some files were not shown because too many files have changed in this diff Show more