diff --git a/.github/workflows/test-roms-extra.yml b/.github/workflows/test-roms-extra.yml index ff2252cb..d8e08692 100644 --- a/.github/workflows/test-roms-extra.yml +++ b/.github/workflows/test-roms-extra.yml @@ -16,7 +16,8 @@ jobs: matrix: include: - name: ax6 - - name: samesuite + # Temporarily disabled while the standalone SameSuite v7 report is imported and baselined. + # - name: samesuite - name: little-things-gb - name: magen # Temporarily disabled while the c-sp v7 Mealybug inventory is validated manually. diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_12-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_12-cgbE.png deleted file mode 100644 index bb558da6..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_12-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_25-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_25-cgbE.png deleted file mode 100644 index bb558da6..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_25-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_75-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_75-cgbE.png deleted file mode 100644 index 86e709e0..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_75-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_freq_change_timing-cgbDE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_freq_change_timing-cgbDE.png deleted file mode 100644 index 893f976c..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_freq_change_timing-cgbDE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_stop_div-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_stop_div-cgbE.png deleted file mode 100644 index a42f1ec3..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_stop_div-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep-cgbE.png deleted file mode 100644 index b4044996..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart-cgbE.png deleted file mode 100644 index f363cab6..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart_2-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart_2-cgbE.png deleted file mode 100644 index f40ce219..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart_2-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_volume_div-cgbE.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_volume_div-cgbE.png deleted file mode 100644 index c4e45b0f..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_volume_div-cgbE.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_3/channel_3_wave_ram_dac_on_rw.png b/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_3/channel_3_wave_ram_dac_on_rw.png deleted file mode 100644 index c9d3811c..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_3/channel_3_wave_ram_dac_on_rw.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger.png b/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger.png deleted file mode 100644 index 3cf24347..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger_10.png b/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger_10.png deleted file mode 100644 index 5abb23ac..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger_10.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/fixtures/dmg/interrupt/ei_delay_halt.png b/crates/gb-test-runner/data/samesuite/fixtures/dmg/interrupt/ei_delay_halt.png deleted file mode 100644 index e141e840..00000000 Binary files a/crates/gb-test-runner/data/samesuite/fixtures/dmg/interrupt/ei_delay_halt.png and /dev/null differ diff --git a/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-1.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-1.suite.toml new file mode 100644 index 00000000..e1fd0466 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-1.suite.toml @@ -0,0 +1,98 @@ +family = "samesuite" +suite_name = "samesuite-apu-channel-1" +report = "samesuite" +model = "cgb" +revision = "cpu-cgb-e" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-apu-channel-1-channel-1-freq-change" +rom = "apu/channel_1/channel_1_freq_change.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-freq-change-timing-cgb0bc" +rom = "apu/channel_1/channel_1_freq_change_timing-cgb0BC.gb" +revision = "cpu-cgb-c" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-duty-delay" +rom = "apu/channel_1/channel_1_duty_delay.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-align" +rom = "apu/channel_1/channel_1_align.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-restart-nrx2-glitch" +rom = "apu/channel_1/channel_1_restart_nrx2_glitch.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-delay" +rom = "apu/channel_1/channel_1_delay.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-stop-div" +rom = "apu/channel_1/channel_1_stop_div.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-align-cpu" +rom = "apu/channel_1/channel_1_align_cpu.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-sweep-restart-2" +rom = "apu/channel_1/channel_1_sweep_restart_2.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-volume-div" +rom = "apu/channel_1/channel_1_volume_div.gb" +timeout_frames = 300 + +[[case]] +id = "samesuite-apu-channel-1-channel-1-freq-change-timing-a" +rom = "apu/channel_1/channel_1_freq_change_timing-A.gb" +disabled = true +comment = "Disabled because SameSuite targets a CGB-A/B timing signature, but gb-cycle currently exposes active CGB0/CGB-C/CGB-D/CGB-E runner revisions only." + +[[case]] +id = "samesuite-apu-channel-1-channel-1-sweep-restart" +rom = "apu/channel_1/channel_1_sweep_restart.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-volume" +rom = "apu/channel_1/channel_1_volume.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-restart" +rom = "apu/channel_1/channel_1_restart.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-stop-restart" +rom = "apu/channel_1/channel_1_stop_restart.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-freq-change-timing-cgbde" +rom = "apu/channel_1/channel_1_freq_change_timing-cgbDE.gb" +revision = "cpu-cgb-d" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-sweep" +rom = "apu/channel_1/channel_1_sweep.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-duty" +rom = "apu/channel_1/channel_1_duty.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-nrx2-speed-change" +rom = "apu/channel_1/channel_1_nrx2_speed_change.gb" +timeout_frames = 420 + +[[case]] +id = "samesuite-apu-channel-1-channel-1-nrx2-glitch" +rom = "apu/channel_1/channel_1_nrx2_glitch.gb" + +[[case]] +id = "samesuite-apu-channel-1-channel-1-extra-length-clocking-cgb0b" +rom = "apu/channel_1/channel_1_extra_length_clocking-cgb0B.gb" +revision = "cpu-cgb-0" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-2.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-2.suite.toml new file mode 100644 index 00000000..c212cc83 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-2.suite.toml @@ -0,0 +1,69 @@ +family = "samesuite" +suite_name = "samesuite-apu-channel-2" +report = "samesuite" +model = "cgb" +revision = "cpu-cgb-e" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-apu-channel-2-channel-2-duty-delay" +rom = "apu/channel_2/channel_2_duty_delay.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-delay" +rom = "apu/channel_2/channel_2_delay.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-align" +rom = "apu/channel_2/channel_2_align.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-nrx2-speed-change" +rom = "apu/channel_2/channel_2_nrx2_speed_change.gb" +timeout_frames = 420 + +[[case]] +id = "samesuite-apu-channel-2-channel-2-restart" +rom = "apu/channel_2/channel_2_restart.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-extra-length-clocking-cgb0b" +rom = "apu/channel_2/channel_2_extra_length_clocking-cgb0B.gb" +revision = "cpu-cgb-0" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-duty" +rom = "apu/channel_2/channel_2_duty.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-freq-change" +rom = "apu/channel_2/channel_2_freq_change.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-stop-div" +rom = "apu/channel_2/channel_2_stop_div.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-stop-restart" +rom = "apu/channel_2/channel_2_stop_restart.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-restart-nrx2-glitch" +rom = "apu/channel_2/channel_2_restart_nrx2_glitch.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-nrx2-glitch" +rom = "apu/channel_2/channel_2_nrx2_glitch.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-align-cpu" +rom = "apu/channel_2/channel_2_align_cpu.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-volume-div" +rom = "apu/channel_2/channel_2_volume_div.gb" + +[[case]] +id = "samesuite-apu-channel-2-channel-2-volume" +rom = "apu/channel_2/channel_2_volume.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-3.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-3.suite.toml new file mode 100644 index 00000000..b75076c9 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-3.suite.toml @@ -0,0 +1,74 @@ +family = "samesuite" +suite_name = "samesuite-apu-channel-3" +report = "samesuite" +model = "cgb" +revision = "cpu-cgb-c" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-apu-channel-3-channel-3-stop-delay" +rom = "apu/channel_3/channel_3_stop_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-restart-stop-delay" +rom = "apu/channel_3/channel_3_restart_stop_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-extra-length-clocking-cgb0" +rom = "apu/channel_3/channel_3_extra_length_clocking-cgb0.gb" +revision = "cpu-cgb-0" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-wave-ram-sync" +rom = "apu/channel_3/channel_3_wave_ram_sync.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-wave-ram-locked-write" +rom = "apu/channel_3/channel_3_wave_ram_locked_write.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-wave-ram-dac-on-rw" +rom = "apu/channel_3/channel_3_wave_ram_dac_on_rw.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-and-glitch" +rom = "apu/channel_3/channel_3_and_glitch.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-shift-skip-delay" +rom = "apu/channel_3/channel_3_shift_skip_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-freq-change-delay" +rom = "apu/channel_3/channel_3_freq_change_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-restart-during-delay" +rom = "apu/channel_3/channel_3_restart_during_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-stop-div" +rom = "apu/channel_3/channel_3_stop_div.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-extra-length-clocking-cgbb" +rom = "apu/channel_3/channel_3_extra_length_clocking-cgbB.gb" +disabled = true +comment = "Disabled because SameSuite targets a CGB-B timing signature, but gb-cycle currently exposes active CGB0/CGB-C/CGB-D/CGB-E runner revisions only." + +[[case]] +id = "samesuite-apu-channel-3-channel-3-first-sample" +rom = "apu/channel_3/channel_3_first_sample.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-restart-delay" +rom = "apu/channel_3/channel_3_restart_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-delay" +rom = "apu/channel_3/channel_3_delay.gb" + +[[case]] +id = "samesuite-apu-channel-3-channel-3-shift-delay" +rom = "apu/channel_3/channel_3_shift_delay.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-4.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-4.suite.toml new file mode 100644 index 00000000..844d21cf --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-4.suite.toml @@ -0,0 +1,61 @@ +family = "samesuite" +suite_name = "samesuite-apu-channel-4" +report = "samesuite" +model = "cgb" +revision = "cpu-cgb-e" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr15" +rom = "apu/channel_4/channel_4_lfsr15.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-volume-div" +rom = "apu/channel_4/channel_4_volume_div.gb" +timeout_frames = 300 + +[[case]] +id = "samesuite-apu-channel-4-channel-4-equivalent-frequencies" +rom = "apu/channel_4/channel_4_equivalent_frequencies.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-frequency-alignment" +rom = "apu/channel_4/channel_4_frequency_alignment.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr-15-7" +rom = "apu/channel_4/channel_4_lfsr_15_7.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr-restart" +rom = "apu/channel_4/channel_4_lfsr_restart.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-freq-change" +rom = "apu/channel_4/channel_4_freq_change.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr-7-15" +rom = "apu/channel_4/channel_4_lfsr_7_15.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-extra-length-clocking-cgb0b" +rom = "apu/channel_4/channel_4_extra_length_clocking-cgb0B.gb" +revision = "cpu-cgb-0" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-delay" +rom = "apu/channel_4/channel_4_delay.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr-restart-fast" +rom = "apu/channel_4/channel_4_lfsr_restart_fast.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-align" +rom = "apu/channel_4/channel_4_align.gb" + +[[case]] +id = "samesuite-apu-channel-4-channel-4-lfsr" +rom = "apu/channel_4/channel_4_lfsr.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-apu.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-apu.suite.toml new file mode 100644 index 00000000..963b5193 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu.suite.toml @@ -0,0 +1,31 @@ +family = "samesuite" +suite_name = "samesuite-apu" +report = "samesuite" +model = "cgb" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-apu-div-write-trigger-volume" +rom = "apu/div_write_trigger_volume.gb" +revision = "cpu-cgb-c" + +[[case]] +id = "samesuite-apu-div-write-trigger-10" +rom = "apu/div_write_trigger_10.gb" +model = "dmg" + +[[case]] +id = "samesuite-apu-div-write-trigger" +rom = "apu/div_write_trigger.gb" +model = "dmg" + +[[case]] +id = "samesuite-apu-div-write-trigger-volume-10" +rom = "apu/div_write_trigger_volume_10.gb" +revision = "cpu-cgb-c" + +[[case]] +id = "samesuite-apu-div-trigger-volume-10" +rom = "apu/div_trigger_volume_10.gb" +revision = "cpu-cgb-c" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-cgb.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-cgb.suite.toml deleted file mode 100644 index b6e0583e..00000000 --- a/crates/gb-test-runner/data/samesuite/samesuite-cgb.suite.toml +++ /dev/null @@ -1,67 +0,0 @@ -family = "samesuite" -suite_name = "samesuite-cgb" -report = "samesuite" -model = "cgb" -timeout_frames = 180 -oracle = { type = "framebuffer", source = "cgb" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-align-12-cgbe" -rom = "apu/channel_1/channel_1_align_12-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_align_12-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-align-25-cgbe" -rom = "apu/channel_1/channel_1_align_25-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_align_25-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-align-75-cgbe" -rom = "apu/channel_1/channel_1_align_75-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_align_75-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-freq-change-timing-cgbde" -rom = "apu/channel_1/channel_1_freq_change_timing-cgbDE.gb" -revision = "cpu-cgb-d" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_freq_change_timing-cgbDE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-stop-div-cgbe" -rom = "apu/channel_1/channel_1_stop_div-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_stop_div-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-sweep-cgbe" -rom = "apu/channel_1/channel_1_sweep-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_sweep-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-sweep-restart-cgbe" -rom = "apu/channel_1/channel_1_sweep_restart-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_sweep_restart-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-sweep-restart-2-cgbe" -rom = "apu/channel_1/channel_1_sweep_restart_2-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_sweep_restart_2-cgbE.png" } -disabled = true -comment = "Disabled DocBoy-only variant: its short-hold CGB-E fixture conflicts with the promoted public GBEmulatorShootout SameSuite apu/channel_1/channel_1_sweep_restart_2.gb CGB-E oracle, which owns the APU model until stronger hardware evidence reconciles both rows." - -[[case]] -id = "samesuite-cgb-apu-channel-1-channel-1-volume-div-cgbe" -rom = "apu/channel_1/channel_1_volume_div-cgbE.gb" -revision = "cpu-cgb-e" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_1/channel_1_volume_div-cgbE.png" } - -[[case]] -id = "samesuite-cgb-apu-channel-3-channel-3-wave-ram-dac-on-rw" -rom = "apu/channel_3/channel_3_wave_ram_dac_on_rw.gb" -oracle = { local = true, fixture = "fixtures/cgb/apu/channel_3/channel_3_wave_ram_dac_on_rw.png" } diff --git a/crates/gb-test-runner/data/samesuite/samesuite-dma.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-dma.suite.toml new file mode 100644 index 00000000..4b282e3d --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-dma.suite.toml @@ -0,0 +1,22 @@ +family = "samesuite" +suite_name = "samesuite-dma" +report = "samesuite" +model = "cgb" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-dma-hdma-lcd-off" +rom = "dma/hdma_lcd_off.gb" + +[[case]] +id = "samesuite-dma-gdma-addr-mask" +rom = "dma/gdma_addr_mask.gb" + +[[case]] +id = "samesuite-dma-gbc-dma-cont" +rom = "dma/gbc_dma_cont.gb" + +[[case]] +id = "samesuite-dma-hdma-mode0" +rom = "dma/hdma_mode0.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-dmg.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-dmg.suite.toml deleted file mode 100644 index f3523b02..00000000 --- a/crates/gb-test-runner/data/samesuite/samesuite-dmg.suite.toml +++ /dev/null @@ -1,21 +0,0 @@ -family = "samesuite" -suite_name = "samesuite-dmg" -report = "samesuite" -model = "dmg" -timeout_frames = 180 -oracle = { type = "framebuffer" } - -[[case]] -id = "samesuite-dmg-div-write-trigger" -rom = "apu/div_write_trigger.gb" -oracle = { local = true, fixture = "fixtures/dmg/apu/div_write_trigger.png" } - -[[case]] -id = "samesuite-dmg-div-write-trigger-10" -rom = "apu/div_write_trigger_10.gb" -oracle = { local = true, fixture = "fixtures/dmg/apu/div_write_trigger_10.png" } - -[[case]] -id = "samesuite-dmg-ei-delay-halt" -rom = "interrupt/ei_delay_halt.gb" -oracle = { local = true, fixture = "fixtures/dmg/interrupt/ei_delay_halt.png" } diff --git a/crates/gb-test-runner/data/samesuite/samesuite-interrupt.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-interrupt.suite.toml new file mode 100644 index 00000000..1c612e6d --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-interrupt.suite.toml @@ -0,0 +1,10 @@ +family = "samesuite" +suite_name = "samesuite-interrupt" +report = "samesuite" +model = "dmg" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-interrupt-ei-delay-halt" +rom = "interrupt/ei_delay_halt.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-ppu.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-ppu.suite.toml new file mode 100644 index 00000000..79966625 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-ppu.suite.toml @@ -0,0 +1,10 @@ +family = "samesuite" +suite_name = "samesuite-ppu" +report = "samesuite" +model = "cgb" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-ppu-blocking-bgpi-increase" +rom = "ppu/blocking_bgpi_increase.gb" diff --git a/crates/gb-test-runner/data/samesuite/samesuite-sgb.suite.toml b/crates/gb-test-runner/data/samesuite/samesuite-sgb.suite.toml new file mode 100644 index 00000000..66995897 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-sgb.suite.toml @@ -0,0 +1,15 @@ +family = "samesuite" +suite_name = "samesuite-sgb" +report = "samesuite" +model = "sgb" +timeout_frames = 180 +oracle = { type = "fibonacci-result" } + +[[case]] +id = "samesuite-sgb-command-mlt-req" +rom = "sgb/command_mlt_req.gb" +timeout_frames = 300 + +[[case]] +id = "samesuite-sgb-command-mlt-req-1-incrementing" +rom = "sgb/command_mlt_req_1_incrementing.gb" diff --git a/crates/gb-test-runner/data/samesuite/sources.report.toml b/crates/gb-test-runner/data/samesuite/sources.report.toml index 7dba8dd2..6585cc04 100644 --- a/crates/gb-test-runner/data/samesuite/sources.report.toml +++ b/crates/gb-test-runner/data/samesuite/sources.report.toml @@ -1,87 +1,399 @@ [[source]] -id = "gbemu-shootout" -git_url = "https://github.com/gbdev/GBEmulatorShootout.git" -git_rev = "f2e95de5ae2293fdf07887b2f79e7f79baa9c63e" +id = "game-boy-test-roms" +archive_url = "https://github.com/c-sp/game-boy-test-roms/releases/download/v7.0/game-boy-test-roms-v7.0.zip" +archive_sha256 = "b9a9d7a1075aa35a3d07c07c34974048672d8520dca9e07a50178f5860c3832c" +archive_format = "zip" [[source.family]] id = "samesuite" target_root = "samesuite" -sparse_paths = ["testroms/samesuite"] [[source.family.file]] -path = "testroms/samesuite/apu/div_write_trigger.gb" -target = "apu/div_write_trigger.gb" -sha256 = "cc57fed1b1fffe6d16c1c5f405e2c7766ac305fafc6c924149929e4888906c5f" +path = "same-suite/apu/div_write_trigger_volume.gb" +target = "apu/div_write_trigger_volume.gb" +sha256 = "c947767c6128afd21754c920eb5329e22e0a4ace0fb7185397e25a9e6f199da5" [[source.family.file]] -path = "testroms/samesuite/apu/div_write_trigger_10.gb" +path = "same-suite/apu/div_write_trigger_10.gb" target = "apu/div_write_trigger_10.gb" -sha256 = "7d8d1739fc7367fa79822ee7652b22bd05a362f85419032c2338bc25cbdee8d1" +sha256 = "4294c71882a375d8395c9aa7c1c20127bd285ffa3961521703a1ac69a80a373c" -[[source]] -id = "docboy" -git_url = "https://github.com/Docheinstein/docboy.git" -git_rev = "214905562590c35ba2bc41f36da3a5d636d99378" +[[source.family.file]] +path = "same-suite/apu/div_write_trigger.gb" +target = "apu/div_write_trigger.gb" +sha256 = "437ed80ab7fdbcd6713b3b0633096ac4ba0181b2e1c099944cbfbb5f7dab8e84" -[[source.family]] -id = "samesuite" -target_root = "samesuite" -sparse_paths = [ - "tests/roms/dmg/samesuite", - "tests/roms/cgb/samesuite", -] +[[source.family.file]] +path = "same-suite/apu/div_write_trigger_volume_10.gb" +target = "apu/div_write_trigger_volume_10.gb" +sha256 = "96096cd8829ab37c5337bfde07ddddf00444e390abea34ead294df299b3552d4" [[source.family.file]] -path = "tests/roms/dmg/samesuite/interrupt/ei_delay_halt.gb" -target = "interrupt/ei_delay_halt.gb" -sha256 = "001d6572c192a630447afd2fffd1194d3105adaf7dd5ffdff7baf615930b8624" +path = "same-suite/apu/div_trigger_volume_10.gb" +target = "apu/div_trigger_volume_10.gb" +sha256 = "3a310a45b7f3345960d2a8ff6df8293d3f8489c04763ff9fa40ebe98fa91797f" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_freq_change.gb" +target = "apu/channel_1/channel_1_freq_change.gb" +sha256 = "144da4f576e67157f140a5d371c9d4db70298cd2e9a75dff29f60626b0eb93ce" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_freq_change_timing-cgb0BC.gb" +target = "apu/channel_1/channel_1_freq_change_timing-cgb0BC.gb" +sha256 = "f64f038c79ed9c8cc79dbcc362cdb057a891629496d75ebd101eea4d80dca7b8" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_duty_delay.gb" +target = "apu/channel_1/channel_1_duty_delay.gb" +sha256 = "4745e1fd06d9633b88fcd3c1d466409138d661fa9055575e41ca242fd5535cb2" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_align.gb" +target = "apu/channel_1/channel_1_align.gb" +sha256 = "1ca49fcd1113e49872c784a54d367e2fb892867d6bce05e77fc192e1956e41eb" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_align_12-cgbE.gb" -target = "apu/channel_1/channel_1_align_12-cgbE.gb" -sha256 = "6ac6e14276b6beb2add0c6f2d14bf3d3f6e8899ac3ea1dc89cac3f642dcef7d2" +path = "same-suite/apu/channel_1/channel_1_restart_nrx2_glitch.gb" +target = "apu/channel_1/channel_1_restart_nrx2_glitch.gb" +sha256 = "d31b01e46355ea076d773856e5d442c93765b0e0043586ae26c7332fc515333c" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_align_25-cgbE.gb" -target = "apu/channel_1/channel_1_align_25-cgbE.gb" -sha256 = "c261515b9ee0aa831ba11f82ff0be09da8eb7b34a3e968df7a35755866da21a4" +path = "same-suite/apu/channel_1/channel_1_delay.gb" +target = "apu/channel_1/channel_1_delay.gb" +sha256 = "85ec9c999ae0983bfe3acc49876b55d586c445db98170d71cbe123e5a728ebc0" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_align_75-cgbE.gb" -target = "apu/channel_1/channel_1_align_75-cgbE.gb" -sha256 = "62d284ee8addf05692e4b316baf1a8645bceb4e6e526903adf96a34d6b9584c5" +path = "same-suite/apu/channel_1/channel_1_stop_div.gb" +target = "apu/channel_1/channel_1_stop_div.gb" +sha256 = "423e31b01e9968b035c762261e6792d673084b76385d95ed5341c23e5221adc6" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_freq_change_timing-cgbDE.gb" +path = "same-suite/apu/channel_1/channel_1_align_cpu.gb" +target = "apu/channel_1/channel_1_align_cpu.gb" +sha256 = "2bcb12b10e3634589a680827f832c58b25c96d08ab027a53e4365e0214bfd199" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_sweep_restart_2.gb" +target = "apu/channel_1/channel_1_sweep_restart_2.gb" +sha256 = "d49b383a5d6a479e510f5cd6603a878f6e9e46cceddd6152fa2a87dda7e2ffe6" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_volume_div.gb" +target = "apu/channel_1/channel_1_volume_div.gb" +sha256 = "82725bff6c14675a96c668fe85e5d0ca681dcea27248e49ccea2cb988e997fee" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_freq_change_timing-A.gb" +target = "apu/channel_1/channel_1_freq_change_timing-A.gb" +sha256 = "3b85fcad0e70d015da6952cbcaf191e99f68a833003ac225cd044837d0d4a5ad" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_sweep_restart.gb" +target = "apu/channel_1/channel_1_sweep_restart.gb" +sha256 = "5c9b41cedecbb45280039664f9bad7b671101c7fea20d686de6f456dec78b496" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_volume.gb" +target = "apu/channel_1/channel_1_volume.gb" +sha256 = "f8dd4bd75c401dcc4cd67bd610694c210112cfc096baac06a5d124884e7bc592" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_restart.gb" +target = "apu/channel_1/channel_1_restart.gb" +sha256 = "5be8768834657ddce7286f653068ac2680e2857bd23fd4c1e9f07f6e5577265c" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_stop_restart.gb" +target = "apu/channel_1/channel_1_stop_restart.gb" +sha256 = "0b2b73b930dfa0457c52e2937b6329c95810fee3f2cd923481da9385a3fb553d" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_freq_change_timing-cgbDE.gb" target = "apu/channel_1/channel_1_freq_change_timing-cgbDE.gb" -sha256 = "4b530bc25a9fbf1053b5594980a53ec65e558f5ed8f214d65ce927df02928794" +sha256 = "2e33d96be99729bcb29ef16c340ae2b29b01a8cdc126ae33e755eaabae07c8ce" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_sweep.gb" +target = "apu/channel_1/channel_1_sweep.gb" +sha256 = "eae5bbb953e814dc0ce6e9568ee0fc731287b6e1356f9695e2063fba8e742ec4" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_duty.gb" +target = "apu/channel_1/channel_1_duty.gb" +sha256 = "b0eb7bc4fc01d17d96d28362e6e3eab6002a2d93fb5a3e19dbf1ddc2148ca650" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_nrx2_speed_change.gb" +target = "apu/channel_1/channel_1_nrx2_speed_change.gb" +sha256 = "317f727c841ffaf935f55859942fc1944ff11ffbf11cb6e3df2d107901cc6eeb" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_nrx2_glitch.gb" +target = "apu/channel_1/channel_1_nrx2_glitch.gb" +sha256 = "45f8ab450948fe8f63d089c938d82cad51099f9b1da2334afb12d08da5fa4601" + +[[source.family.file]] +path = "same-suite/apu/channel_1/channel_1_extra_length_clocking-cgb0B.gb" +target = "apu/channel_1/channel_1_extra_length_clocking-cgb0B.gb" +sha256 = "4f0b370cb5428175bacb9b2f613bbec2c7829241ceafd879226c082456c53c34" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_duty_delay.gb" +target = "apu/channel_2/channel_2_duty_delay.gb" +sha256 = "d833c03053f6a90457bfaca5fdffcdfa2e358ea6229b29fc52634b8ad99dbd87" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_delay.gb" +target = "apu/channel_2/channel_2_delay.gb" +sha256 = "d28b23d6421bffd6b5fe89f1b3c38bf48415faca57c3f867e6f5757a54bd8409" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_align.gb" +target = "apu/channel_2/channel_2_align.gb" +sha256 = "ba59787e41d57378d9ec64ab6348e933775e4c212c48a9222e37052d1da61c26" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_nrx2_speed_change.gb" +target = "apu/channel_2/channel_2_nrx2_speed_change.gb" +sha256 = "9372b59dfa4bba522b69fbf4022531143ce5d56f0d1668b74ac86a1de6e9c0d5" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_restart.gb" +target = "apu/channel_2/channel_2_restart.gb" +sha256 = "664b8107c7c5e2ce657704dada29ca74c8eac4c59041a7a15d2abb4ac3e85bf4" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_extra_length_clocking-cgb0B.gb" +target = "apu/channel_2/channel_2_extra_length_clocking-cgb0B.gb" +sha256 = "f8950754be034f0d667e0160f1d78729e26a52b94dcbec61c66cf58602e5f4bf" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_duty.gb" +target = "apu/channel_2/channel_2_duty.gb" +sha256 = "a0d866352f61f2f5739e8ada6e6a85eae41ad295a7673fb6bde72cf391a7dc46" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_freq_change.gb" +target = "apu/channel_2/channel_2_freq_change.gb" +sha256 = "0cfe17b0afebaaf43a69d3acce1c2a20567719fc647e020b109be53644fc4868" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_stop_div.gb" +target = "apu/channel_2/channel_2_stop_div.gb" +sha256 = "c1bf9fb0cd8d4fef5ab0052747af52e3da8a14950b6dc118db5ecf308439efcc" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_stop_restart.gb" +target = "apu/channel_2/channel_2_stop_restart.gb" +sha256 = "2847535c6bef5c8580444111761b5afcb45b3aef0b91e0e96e26ee71dfa0eb02" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_restart_nrx2_glitch.gb" +target = "apu/channel_2/channel_2_restart_nrx2_glitch.gb" +sha256 = "9b02f43d6915322a14b4b531ba31e187a0b14bd6ebe39f41d55faa3bb0d05726" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_nrx2_glitch.gb" +target = "apu/channel_2/channel_2_nrx2_glitch.gb" +sha256 = "24aac2bff0fa15aa146f48e6fd719472b119cb2e77a8499a5137f8f8182a982a" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_align_cpu.gb" +target = "apu/channel_2/channel_2_align_cpu.gb" +sha256 = "f4305776a87faf2b7c7a14a21594faa9dafc5d4bca110751787c0580f100b942" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_volume_div.gb" +target = "apu/channel_2/channel_2_volume_div.gb" +sha256 = "ba0583bfcdd4bdc66feb53e081508376fef91fea530d828d806b26c7957f5c05" + +[[source.family.file]] +path = "same-suite/apu/channel_2/channel_2_volume.gb" +target = "apu/channel_2/channel_2_volume.gb" +sha256 = "457588c00ef49f54f4f73dcf4471ee83cf22b2e48ba18b021297335ab14513ad" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_stop_div-cgbE.gb" -target = "apu/channel_1/channel_1_stop_div-cgbE.gb" -sha256 = "daec7e6c4054293e28ee30b0bffd3aa914106772941b5f67ad8b2fb1952ae37f" +path = "same-suite/apu/channel_3/channel_3_stop_delay.gb" +target = "apu/channel_3/channel_3_stop_delay.gb" +sha256 = "3819b732b20919700aab263643c34e99a19fc2a7cda7162dbf564afa492dc94e" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_sweep-cgbE.gb" -target = "apu/channel_1/channel_1_sweep-cgbE.gb" -sha256 = "c167a77b4471c589c11419e01c1fd7c2d500d3299fc0ea3ec999c4ea3c31702f" +path = "same-suite/apu/channel_3/channel_3_restart_stop_delay.gb" +target = "apu/channel_3/channel_3_restart_stop_delay.gb" +sha256 = "ee7fe7682191491450704121f88bbd92298cfe8aeeac980bf5c3187c110a54a4" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_sweep_restart-cgbE.gb" -target = "apu/channel_1/channel_1_sweep_restart-cgbE.gb" -sha256 = "723cbfafe504bb8f016a303a3e93dcb5a500bc5455c8c7373ab429671c5705e9" +path = "same-suite/apu/channel_3/channel_3_extra_length_clocking-cgb0.gb" +target = "apu/channel_3/channel_3_extra_length_clocking-cgb0.gb" +sha256 = "1bd45cae70cd851b2997e9faaa0d805b8fb9d8ea91384a8f58159a6caf93311e" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_sweep_restart_2-cgbE.gb" -target = "apu/channel_1/channel_1_sweep_restart_2-cgbE.gb" -sha256 = "bc925b2445ad9d1c15318d066b086e4e58043b0627a235deb9539711c37ec077" +path = "same-suite/apu/channel_3/channel_3_wave_ram_sync.gb" +target = "apu/channel_3/channel_3_wave_ram_sync.gb" +sha256 = "bc67b3de28609995ac3dae786484f723a33b8c2b3c321216ee85f8621084139e" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_1/channel_1_volume_div-cgbE.gb" -target = "apu/channel_1/channel_1_volume_div-cgbE.gb" -sha256 = "27216e5c3b5ca3de26199fd241bfbf563b866f43a8cf58c8686ad50fc4dde07d" +path = "same-suite/apu/channel_3/channel_3_wave_ram_locked_write.gb" +target = "apu/channel_3/channel_3_wave_ram_locked_write.gb" +sha256 = "44f805b342dcb2f209d4deef603dca0d078c274467493d81f12099c10fc16d31" [[source.family.file]] -path = "tests/roms/cgb/samesuite/apu/channel_3/channel_3_wave_ram_dac_on_rw.gb" +path = "same-suite/apu/channel_3/channel_3_wave_ram_dac_on_rw.gb" target = "apu/channel_3/channel_3_wave_ram_dac_on_rw.gb" -sha256 = "9e12f7b4683c845019473d70ae582766084f864de2bcc8766714e5a3f7bb4182" +sha256 = "2a22b2669b4a0a540f177846fa88d33e9d3f4c2448d60e375fd719c01525c9b3" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_and_glitch.gb" +target = "apu/channel_3/channel_3_and_glitch.gb" +sha256 = "4ef5c152c03abc525cbf2e7360489ea0c6e174f64d36e6618e890f2cb06ecdc0" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_shift_skip_delay.gb" +target = "apu/channel_3/channel_3_shift_skip_delay.gb" +sha256 = "1d361236b7dc945ae4d7e5a71bfd4f42c96280bcdf72f8d9c1c72e59af2f8fa1" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_freq_change_delay.gb" +target = "apu/channel_3/channel_3_freq_change_delay.gb" +sha256 = "7c7f6ba21eb3fbda1ff8ef122bc8e7bcc7d5a441333b9476e641888f59246b80" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_restart_during_delay.gb" +target = "apu/channel_3/channel_3_restart_during_delay.gb" +sha256 = "676d547959e60f636ae6af4d2e323b24522ab78e61fbd4467ae631cbe1965ab6" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_stop_div.gb" +target = "apu/channel_3/channel_3_stop_div.gb" +sha256 = "5e7aed963797926e9c81cda40db1fc2f465dbf72c3eb75c4a00e6087d70dca04" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_extra_length_clocking-cgbB.gb" +target = "apu/channel_3/channel_3_extra_length_clocking-cgbB.gb" +sha256 = "7a121035a5998435ab5cce7bfb9411fc1082887cad213a02f86776adb5a73181" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_first_sample.gb" +target = "apu/channel_3/channel_3_first_sample.gb" +sha256 = "180c0c7c67c41d28080939649d232c378c34792a3606018a0e7337eefa142807" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_restart_delay.gb" +target = "apu/channel_3/channel_3_restart_delay.gb" +sha256 = "f01bb28f9d8993108efe1e15d66b0331c95b7843ddb9c04c975f29b1b258c675" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_delay.gb" +target = "apu/channel_3/channel_3_delay.gb" +sha256 = "811a481191376ea81750835e7d7b7ba1c739264a46a5a76a978c9f0ab64227ca" + +[[source.family.file]] +path = "same-suite/apu/channel_3/channel_3_shift_delay.gb" +target = "apu/channel_3/channel_3_shift_delay.gb" +sha256 = "512fb6fc4551156090a81415b941e1c684ba35f1f7793f4455eec53926748fa5" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr15.gb" +target = "apu/channel_4/channel_4_lfsr15.gb" +sha256 = "e210a115c06e6bcd5507abfceac5926dbb99eaca3cf10cf8d69d1bf0f3dbae4d" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_volume_div.gb" +target = "apu/channel_4/channel_4_volume_div.gb" +sha256 = "ff8145597adf36b08dc0b32fa30cb855b230d70e082e77b33ee54279e1b9f642" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_equivalent_frequencies.gb" +target = "apu/channel_4/channel_4_equivalent_frequencies.gb" +sha256 = "2f518867a4426b590b4b650c2f4180b90d1d4206e3cfbf42e3fa23d7a5c4e7fd" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_frequency_alignment.gb" +target = "apu/channel_4/channel_4_frequency_alignment.gb" +sha256 = "eb3781e7686ad31b486f2af703c405705ce02bba66879b7d77e4d845b143567a" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr_15_7.gb" +target = "apu/channel_4/channel_4_lfsr_15_7.gb" +sha256 = "20d6e72c9166d1b4fc94ae70ca1530cebc5ae810df1834db62da404c73a8be9d" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr_restart.gb" +target = "apu/channel_4/channel_4_lfsr_restart.gb" +sha256 = "49d9e6c09ebde591ddb178ebd1b0bacefa70c7e7fd80311b9f91944cdd59581a" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_freq_change.gb" +target = "apu/channel_4/channel_4_freq_change.gb" +sha256 = "37f141efca6505ec37a3b1a131153867339eac0d4deeaf4e446152f75815eb2e" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr_7_15.gb" +target = "apu/channel_4/channel_4_lfsr_7_15.gb" +sha256 = "734d8be70f25828fb968c1852cf7cc33185fed3222b2b8a8b650a9720e98a557" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_extra_length_clocking-cgb0B.gb" +target = "apu/channel_4/channel_4_extra_length_clocking-cgb0B.gb" +sha256 = "e37dca76e6e9dc9d7f9d5ee96937dfea19c77d881e01db6d4357f7328436966d" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_delay.gb" +target = "apu/channel_4/channel_4_delay.gb" +sha256 = "f694ea8f238365be19b121dd346759deda801bab47fb4e1f277b4a4e9e56e23a" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr_restart_fast.gb" +target = "apu/channel_4/channel_4_lfsr_restart_fast.gb" +sha256 = "b7838d49ad08436cdcece65b35e786838298848bef523af9a7aa83347e2dc983" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_align.gb" +target = "apu/channel_4/channel_4_align.gb" +sha256 = "1230e7c4b3e2e7e60722cda039f3798c43218a71239cdde9be8bd570067c67a6" + +[[source.family.file]] +path = "same-suite/apu/channel_4/channel_4_lfsr.gb" +target = "apu/channel_4/channel_4_lfsr.gb" +sha256 = "dd46439f07bdcfff8db0ac0fa49bcda4f9fccb8f722a9aa673325aa45196d98b" + +[[source.family.file]] +path = "same-suite/dma/hdma_lcd_off.gb" +target = "dma/hdma_lcd_off.gb" +sha256 = "d6c3dde21fe7104129bc8ef0dde7f5d5f050b4de5498fc8f2f06e0d37bdfd0db" + +[[source.family.file]] +path = "same-suite/dma/gdma_addr_mask.gb" +target = "dma/gdma_addr_mask.gb" +sha256 = "63c855b24300ac477ae783c17444ead5ec97be45a9e699b3dddd1a622955fbbf" + +[[source.family.file]] +path = "same-suite/dma/gbc_dma_cont.gb" +target = "dma/gbc_dma_cont.gb" +sha256 = "d67cbce95838335a9946af1254a751f4a8532756b2e4851ee8a54fb73af4763f" + +[[source.family.file]] +path = "same-suite/dma/hdma_mode0.gb" +target = "dma/hdma_mode0.gb" +sha256 = "e5ded5dc154004bdaafc443df6e63459ec7eb7d636687a4a578f91820557e0b2" + +[[source.family.file]] +path = "same-suite/interrupt/ei_delay_halt.gb" +target = "interrupt/ei_delay_halt.gb" +sha256 = "69cdd4ab9e8b4d16364f3efcba4db90b050e09eed9db8412f395e11c9484d92c" + +[[source.family.file]] +path = "same-suite/ppu/blocking_bgpi_increase.gb" +target = "ppu/blocking_bgpi_increase.gb" +sha256 = "3bb5ac17d140d54135c9d993f626de682d5160025a7dd702c733df273f3ff502" + +[[source.family.file]] +path = "same-suite/sgb/command_mlt_req.gb" +target = "sgb/command_mlt_req.gb" +sha256 = "ab2b438be04957ab879d632670b3fb6e173747f112af5422fe49a9b33870a17b" + +[[source.family.file]] +path = "same-suite/sgb/command_mlt_req_1_incrementing.gb" +target = "sgb/command_mlt_req_1_incrementing.gb" +sha256 = "fdc96316f94536bc04348c75b4b85644633cc8b8bfd8a6169db04b63e8cb645d" diff --git a/crates/gb-test-runner/src/oracle/fibonacci_result.rs b/crates/gb-test-runner/src/oracle/fibonacci_result.rs index d84e8a47..580513b9 100644 --- a/crates/gb-test-runner/src/oracle/fibonacci_result.rs +++ b/crates/gb-test-runner/src/oracle/fibonacci_result.rs @@ -4,6 +4,7 @@ const MAGIC_BREAKPOINT_OPCODE: u8 = 0x40; const LEGACY_MAGIC_BREAKPOINT_OPCODE: u8 = 0xED; const PASS_SIGNATURE: [u8; 6] = [3, 5, 8, 13, 21, 34]; const FAIL_SIGNATURE: [u8; 6] = [0x42; 6]; +const BREAKPOINT_HALT_BYTES: [u8; 2] = [0x40, 0x76]; const NOP_PADDED_TERMINAL_LOOP_BYTES: [u8; 4] = [0x40, 0x00, 0x18, 0xFD]; const COMPACT_TERMINAL_LOOP_BYTES: [u8; 3] = [0x40, 0x18, 0xFE]; @@ -130,6 +131,7 @@ impl FibonacciFailure { fn terminal_signal_reached(cpu: CpuObservation, legacy: bool) -> bool { cpu.current_opcode == Some(MAGIC_BREAKPOINT_OPCODE) || legacy && legacy_terminal_signal_reached(cpu) + || breakpoint_halt_reached(cpu) || terminal_loop_reached(cpu) } @@ -137,6 +139,12 @@ fn legacy_terminal_signal_reached(cpu: CpuObservation) -> bool { cpu.current_opcode == Some(LEGACY_MAGIC_BREAKPOINT_OPCODE) } +fn breakpoint_halt_reached(cpu: CpuObservation) -> bool { + cpu.pc_window + .windows(BREAKPOINT_HALT_BYTES.len()) + .any(|window| window == BREAKPOINT_HALT_BYTES) +} + fn terminal_loop_reached(cpu: CpuObservation) -> bool { cpu.pc_window .windows(NOP_PADDED_TERMINAL_LOOP_BYTES.len()) diff --git a/crates/gb-test-runner/src/oracle/test/fibonacci_result.rs b/crates/gb-test-runner/src/oracle/test/fibonacci_result.rs index 7adaa44a..4f60e3ff 100644 --- a/crates/gb-test-runner/src/oracle/test/fibonacci_result.rs +++ b/crates/gb-test-runner/src/oracle/test/fibonacci_result.rs @@ -61,6 +61,12 @@ fn compact_terminal_loop_window() -> [u8; CPU_OBSERVATION_WINDOW_BYTES] { window } +fn breakpoint_halt_window() -> [u8; CPU_OBSERVATION_WINDOW_BYTES] { + let mut window = [0xFF; CPU_OBSERVATION_WINDOW_BYTES]; + window[2..4].copy_from_slice(&[0x40, 0x76]); + window +} + fn fibonacci_oracle() -> Oracle { Oracle::from_manifest(&parse_oracle_config( "oracle = { type = \"fibonacci-result\" }", @@ -277,6 +283,23 @@ fn fibonacci_result_detects_compact_breakpoint_loop_near_pc() { ); } +#[test] +fn fibonacci_result_detects_breakpoint_halt_near_pc() { + let mut oracle = fibonacci_oracle(); + assert_eq!( + oracle + .observe(observations(PASS_SIGNATURE, None, breakpoint_halt_window())) + .expect("oracle should observe"), + OracleStep::Stop + ); + assert_eq!( + oracle + .finish(observations(PASS_SIGNATURE, None, breakpoint_halt_window())) + .expect("oracle should finish"), + OracleOutcome::Passed + ); +} + #[test] fn fibonacci_result_fails_when_timeout_finishes_without_result() { let mut oracle = fibonacci_oracle(); diff --git a/crates/gb-test-runner/src/suite/test/manifest.rs b/crates/gb-test-runner/src/suite/test/manifest.rs index 4c4e3d99..a77aba17 100644 --- a/crates/gb-test-runner/src/suite/test/manifest.rs +++ b/crates/gb-test-runner/src/suite/test/manifest.rs @@ -1761,8 +1761,15 @@ fn real_standalone_extra_report_manifests_load_new_runner_oracles() { ( "samesuite", &[ - ("samesuite-dmg", 3, "samesuite"), - ("samesuite-cgb", 9, "samesuite"), + ("samesuite-apu", 5, "samesuite"), + ("samesuite-apu-channel-1", 20, "samesuite"), + ("samesuite-apu-channel-2", 15, "samesuite"), + ("samesuite-apu-channel-3", 15, "samesuite"), + ("samesuite-apu-channel-4", 13, "samesuite"), + ("samesuite-dma", 4, "samesuite"), + ("samesuite-interrupt", 1, "samesuite"), + ("samesuite-ppu", 1, "samesuite"), + ("samesuite-sgb", 2, "samesuite"), ][..], ), ]; @@ -1802,21 +1809,88 @@ fn real_standalone_extra_report_manifests_load_new_runner_oracles() { } if report_id == "samesuite" { - let suites = load_selected_suites(&workspace, report, Some("samesuite-cgb"), None) - .expect("samesuite CGB suite should load"); - let cgb_d = suites[0] - .cases - .iter() - .find(|case| { - case.id == "samesuite-cgb-apu-channel-1-channel-1-freq-change-timing-cgbde" - }) - .expect("CGB-D row should exist"); - assert_eq!(cgb_d.hardware_revision, gb_core::HardwareRevision::CpuCgbD); + let apu = load_selected_suites(&workspace, report, Some("samesuite-apu"), None) + .expect("samesuite APU suite should load"); + assert!( + apu[0] + .cases + .iter() + .all(|case| matches!(&case.oracle, Oracle::FibonacciResult(_))) + ); + assert!( + apu[0] + .cases + .iter() + .any(|case| case.console_model == gb_core::ConsoleModel::GameBoy) + ); + assert!( + apu[0] + .cases + .iter() + .any(|case| case.hardware_revision == gb_core::HardwareRevision::CpuCgbC) + ); + let channel_1 = + load_selected_suites(&workspace, report, Some("samesuite-apu-channel-1"), None) + .expect("samesuite APU CH1 suite should load"); + assert!( + channel_1[0] + .cases + .iter() + .all(|case| matches!(&case.oracle, Oracle::FibonacciResult(_))) + ); + assert!( + channel_1[0] + .cases + .iter() + .any(|case| case.hardware_revision == gb_core::HardwareRevision::CpuCgb0) + ); assert!( - suites[0] + channel_1[0] + .cases + .iter() + .any(|case| case.hardware_revision == gb_core::HardwareRevision::CpuCgbD) + ); + assert_eq!( + channel_1[0] + .cases + .iter() + .find(|case| case.id == "samesuite-apu-channel-1-channel-1-volume-div") + .expect("CH1 volume DIV row should exist") + .timeout_frames, + 300 + ); + assert_eq!( + channel_1[0] + .cases + .iter() + .find(|case| case.id == "samesuite-apu-channel-1-channel-1-nrx2-speed-change") + .expect("CH1 NRX2 speed row should exist") + .timeout_frames, + 420 + ); + let channel_2 = + load_selected_suites(&workspace, report, Some("samesuite-apu-channel-2"), None) + .expect("samesuite APU CH2 suite should load"); + assert_eq!( + channel_2[0] + .cases + .iter() + .find(|case| case.id == "samesuite-apu-channel-2-channel-2-nrx2-speed-change") + .expect("CH2 NRX2 speed row should exist") + .timeout_frames, + 420 + ); + let channel_4 = + load_selected_suites(&workspace, report, Some("samesuite-apu-channel-4"), None) + .expect("samesuite APU CH4 suite should load"); + assert_eq!( + channel_4[0] .cases .iter() - .any(|case| case.hardware_revision == gb_core::HardwareRevision::CpuCgbE) + .find(|case| case.id == "samesuite-apu-channel-4-channel-4-volume-div") + .expect("CH4 volume DIV row should exist") + .timeout_frames, + 300 ); } if report_id == "little-things-gb" { diff --git a/docs/REFERENCES.md b/docs/REFERENCES.md index 09081fe2..52eac93e 100644 --- a/docs/REFERENCES.md +++ b/docs/REFERENCES.md @@ -29,7 +29,7 @@ Consult primary documentation and hardware research before emulator source code. - [gb-cycle GBEmulatorShootout fork dashboard](https://pakitovic.github.io/GBEmulatorShootout/) — project-facing summary of the current gb-cycle counted rows. - [blargg test ROMs](https://github.com/retrio/gb-test-roms) — CPU, timing, memory, OAM, and DMG/CGB sound ROMs, currently consumed through the curated GBEmulatorShootout source path rather than a direct retrio checkout. - [Mooneye GB](https://github.com/Gekkio/mooneye-gb) — acceptance, boot, CPU/interrupt/timer/DMA, serial, and model-specific executable tests plus documentary reasoning. -- [c-sp/game-boy-test-roms](https://github.com/c-sp/game-boy-test-roms) — release-ZIP aggregate used for the archive-backed Mooneye and Wilbertpol Mooneye-derived ROM channels, including independently pinned ROM and fixture hashes. +- [c-sp/game-boy-test-roms](https://github.com/c-sp/game-boy-test-roms) — release-ZIP aggregate used for archive-backed Blargg, Mooneye, Wilbertpol, and standalone SameSuite channels, including independently pinned ROM and fixture hashes. - [dmg-acid2](https://github.com/mattcurrie/dmg-acid2), [cgb-acid2](https://github.com/mattcurrie/cgb-acid2), and Acid-family CGB hardening ROMs — framebuffer-oracle visual PPU references. - [mealybug-tearoom-tests](https://github.com/mattcurrie/mealybug-tearoom-tests) — DMG/CGB PPU timing and LCD pipeline framebuffer-oracle rows. - [SameSuite](https://github.com/LIJI32/SameSuite) — CGB APU, DMA, palette/PPU, and SGB command/multiplayer executable tests. diff --git a/docs/info/ROM-SUITES.md b/docs/info/ROM-SUITES.md index 052a2868..96bc1d9b 100644 --- a/docs/info/ROM-SUITES.md +++ b/docs/info/ROM-SUITES.md @@ -22,7 +22,7 @@ Fetchable reports use `crates/gb-test-runner/data//sources.report.toml`. | `docboy` | `cargo rom-suite`, `cargo rom-suite-link` | DocBoy single-machine suites plus DocBoy DMG linked session suite. | | `gbmicrotest` | `cargo rom-suite` | Flat gbmicrotest report. | | `blargg` | `cargo rom-suite` | Standalone exploratory Blargg channel archive-backed by c-sp `game-boy-test-roms` v7.0, with GB Emulator Shootout framebuffer fixtures where the promoted Blargg manifests already use them. | -| `mooneye`, `ax6`, `little-things-gb`, `magen`, `mealybug-tearoom-tests`, `samesuite` | `cargo rom-suite` | Standalone exploratory report channels used by `test-roms-extra`; `mooneye` and `mealybug-tearoom-tests` are archive-backed by c-sp `game-boy-test-roms`, with Mealybug temporarily removed from the workflow matrix while its v7 inventory is validated manually. | +| `mooneye`, `ax6`, `little-things-gb`, `magen`, `mealybug-tearoom-tests`, `samesuite` | `cargo rom-suite` | Standalone exploratory report channels; `mooneye` and `mealybug-tearoom-tests` are archive-backed by c-sp `game-boy-test-roms`, with Mealybug and SameSuite temporarily removed from `test-roms-extra` while their v7 inventories are validated manually. | | `wilbertpol` | `cargo rom-suite` | Archive-backed standalone Mooneye-derived Wilbertpol channel; it is intentionally not mirrored by `test-roms-extra` until it has a verified green local baseline. | | `linked` | `cargo rom-suite-link` | Repo-local synthetic linked-session fixtures. | @@ -34,6 +34,8 @@ The standalone `mooneye` report is archive-backed by the c-sp `game-boy-test-rom The standalone `mealybug-tearoom-tests` report materializes the complete c-sp `game-boy-test-roms` v7.0 `mealybug-tearoom-tests/` archive inventory under `/test/mealybug-tearoom-tests/mealybug-tearoom-tests/`. The c-sp import is split into one suite manifest per upstream folder: `dma` and `mbc` use the Fibonacci pass/fail signature, while `ppu` uses strict framebuffer fixtures for active DMG-CPU-C and CPU CGB C/D lanes, three source-tracked DocBoy `cgb_dmg_mode` CPU-CGB-D fixtures for the `m3_wx_4/5/6_change` rows not shipped with c-sp CGB fixtures, and CPU-CGB-C/D rows for `m3_lcdc_win_en_change_multiple_wx` that temporarily use the source-tracked DocBoy fixture because upstream Mealybug `expected/CPU CGB C/D` PNG files are placeholders. DocBoy targets are materialized under `ppu/` alongside the c-sp ROMs and fixtures inside the report store so the suite has a single PPU asset root. DMG-CPU-B fixture lanes and `ppu/win_without_bg.gb` remain listed as disabled cases with comments because the current runner does not expose DMG-CPU-B as an active Game Boy revision and the window-without-BG ROM has no compatible framebuffer fixture in the archive. +The standalone `samesuite` report materializes only the c-sp `game-boy-test-roms` v7.0 `same-suite/` archive under the `samesuite` family using the upstream folder structure. The c-sp v7 SameSuite rows are split into folder-scoped manifests and use `fibonacci-result` because upstream finishes on opcode `0x40` with the standard Fibonacci pass registers; the former DocBoy/GBEmulatorShootout framebuffer-only rows and local framebuffer fixtures have been retired after validation. The CGB-A/B-specific rows stay disabled until those revisions are explicit active runner targets. + Wilbertpol's upstream `utils/` directory contains helper utilities rather than pass/fail tests. Do not add `utils/dump_boot_hwio.gb` to the Wilbertpol source manifest or suites, because it jumps to the memory-dump helper and terminates without the Fibonacci pass signature. Mooneye and Wilbertpol `madness/mgb_oam_dma_halt_sprites.gb` are MGB-specific visual OAM-DMA/HALT edge cases. Keep the manifest model at `model = "mgb"` and the upstream framebuffer fixture wiring in place, but keep the cases disabled until the current gb-cycle framebuffer mismatch is investigated. @@ -94,7 +96,7 @@ oracle = { type = "serial-hex-exact", target_participant = "receiver", expected oracle = { type = "trace" } ``` -`fibonacci-result` defaults to the current Mooneye-style `0x40` breakpoint or terminal loop signal, including the `0x40 0x00 0x18 0xFD` loop used by older promoted assets and the compact `0x40 0x18 0xFE` loop used by the c-sp Mooneye ZIP. Set `legacy = true` only for old Mooneye-derived ROMs such as Wilbertpol that finish on undefined opcode `0xED` with the same Fibonacci register signature; when legacy mode observes `0xED` without the pass signature, the case fails immediately instead of running until timeout. +`fibonacci-result` defaults to the current Mooneye/SameSuite-style `0x40` breakpoint or terminal signal, including the `0x40 0x00 0x18 0xFD` loop used by older promoted assets, the compact `0x40 0x18 0xFE` loop used by the c-sp Mooneye ZIP, and the `0x40 0x76` breakpoint-then-HALT sequence used by c-sp v7 SameSuite. Set `legacy = true` only for old Mooneye-derived ROMs such as Wilbertpol that finish on undefined opcode `0xED` with the same Fibonacci register signature; when legacy mode observes `0xED` without the pass signature, the case fails immediately instead of running until timeout. Framebuffer defaults are `mode = "final"`, `source = "dmg"`, `projection = "palette-rank"`, and `compare = "exact"`. Use `mode = "until-match"` with `check_interval_tcycles` or `check_at_tcycles` for polling/point-in-time checks, `source = "cgb"` for RGB555 output, `projection = "grayscale"` plus `compare = "grayscale-tolerance"` only for explicitly tolerated fixtures, and `mode = "info"` for CI-successful captures that do not compare. @@ -152,7 +154,7 @@ Same-ROM model variants are ordered DMG before MGB before GBC before AGB before - Local pre-commit checks and `make coverage` do not fetch or run external ROM suites. - GitHub `ci` mirrors Rust checks and coverage. - GitHub `test-roms` runs the promoted `gb-emulator-shootout` matrix with `cargo rom-suite gb-emulator-shootout --suite `. -- GitHub `test-roms-extra` runs explicitly promoted standalone report lanes with `cargo rom-suite `; `mealybug-tearoom-tests` is temporarily commented out while the c-sp v7 inventory is validated manually, and `wilbertpol` stays out of this workflow until a green local baseline is verified and promotion is intentional. +- GitHub `test-roms-extra` runs explicitly promoted standalone report lanes with `cargo rom-suite `; `mealybug-tearoom-tests` and `samesuite` are temporarily commented out while their c-sp v7 inventories are validated manually, and `wilbertpol` stays out of this workflow until a green local baseline is verified and promotion is intentional. - RealBoot, commercial, red, linked, and local-only lanes stay outside GitHub ROM workflows unless promoted intentionally. ## Private and commercial ROMs diff --git a/docs/roadmap/10-cgb.md b/docs/roadmap/10-cgb.md index 95313433..390a95f5 100644 --- a/docs/roadmap/10-cgb.md +++ b/docs/roadmap/10-cgb.md @@ -31,7 +31,7 @@ This table is the planning inventory, not an executable suite definition. Every - CGB manifests must carry enough console-family metadata to distinguish rows where GBEmulatorShootout labels the row with a console suffix; use `console = "dmg"` or `console = "cgb"` for the runner console and `report_console_suffix = true` only when the upstream row label includes `(DMG)` or `(GBC)`, as with `acid/which.gb (DMG)` and `acid/which.gb (GBC)`, and must not add a suffix to rows such as `mooneye/misc/boot_regs-cgb.gb` where the upstream row has none. - Report ordering must continue to follow GBEmulatorShootout rather than local suite grouping: sort by known family rank, then by the pinned report `sources.report.toml` ROM order inside that family, then by console variant order DMG before GBC for same-ROM rows, then by manifest order and lexical fallback for unknowns; mixed-family CGB suites must merge into this ordering rather than rendering as one pseudo-family block. - Each promoted suite needs a report-local `*.suite.toml` manifest and a stable cargo invocation; promoted closure invokes `cargo rom-suite gb-emulator-shootout --suite `, which verifies or fetches the required upstream families on demand so the command used for slice closure is stable and reviewable. Extra/internal targets that are not part of the promoted report use their standalone `cargo rom-suite --suite ` lanes once their reports are split. -- External ROM suites run through `cargo rom-suite` report lanes. Promoted CGB rows that live inside complete family suites such as `acid`, `ashiepaws`, `daid`, or consolidated `samesuite`, plus dedicated promoted CGB suites such as `blargg-cgb-sound`, `samesuite-apu`, and `ax6`, run through `cargo rom-suite gb-emulator-shootout --suite `. Non-DocBoy extra/internal suites such as `mooneye-misc`, `samesuite-cgb`, `magen-cgb`, `mealybug-tearoom-tests`, and `little-things-gb-cgb` each live in their own standalone report lane; green lanes are mirrored by the GitHub `test-roms-extra` workflow, while `mealybug-tearoom-tests` is temporarily commented out during the c-sp v7 inventory validation. DocBoy exploratory suites stay outside GitHub ROM workflows until their acceptance meaning is promoted intentionally. +- External ROM suites run through `cargo rom-suite` report lanes. Promoted CGB rows that live inside complete family suites such as `acid`, `ashiepaws`, `daid`, or consolidated `samesuite`, plus dedicated promoted CGB suites such as `blargg-cgb-sound`, `samesuite-apu`, and `ax6`, run through `cargo rom-suite gb-emulator-shootout --suite `. Non-DocBoy extra/internal suites such as `mooneye-misc`, `magen-cgb`, `mealybug-tearoom-tests`, and `little-things-gb-cgb` each live in their own standalone report lane; green lanes are mirrored by the GitHub `test-roms-extra` workflow, while `mealybug-tearoom-tests` is temporarily commented out during the c-sp v7 inventory validation. DocBoy exploratory suites stay outside GitHub ROM workflows until their acceptance meaning is promoted intentionally. - If a CGB suite uses a new upstream family such as SameSuite or AX6 RTC tests, add that family to the owning `sources.report.toml`, source-family selection, materialization tests, and the relevant `cargo rom-suite` workflow entry in the same change that introduces the suite manifest. - Adding or promoting a CGB suite must update the runner list/help coverage, manifest parser coverage when new metadata is required, source-filter/materialization tests, and docs in [`docs/TESTING.md`](../TESTING.md) or [`docs/info/ROM-SUITES.md`](../info/ROM-SUITES.md) so CGB suites remain discoverable like the current DMG suites. - Exploratory status changes only the gate semantics, not the repo-management protocol: exploratory CGB suites still require source inventory, a data manifest, stable execution command, local status reporting, and artifact retention before their results can be cited in a slice. @@ -369,8 +369,8 @@ This matrix is an internal core contract for Slice 5 and must be tested with syn - Experimental `OperatingMode::CgbDmgExt` is now supported only under the explicit experimental compatibility policy: direct-boot CGB header bit `3` (`0x88..0x8F`) and real-boot `KEY0` bit `3` select a CGB-family DMG software-contract mode, bit `3` wins over bit `2`, strict/permissive noncanonical CGB flags preserve their existing native-CGB fallback, and runtime `KEY0` remains unavailable after lock (`$FF` reads, ignored writes). - The CGB DMG-ext contract is intentionally narrow and DocBoy-driven: it exposes `BCPS`, `OCPS`, `OPRI` latch/readback, `VBK`, `SVBK`, `KEY1`, `RP`, serial `SC.1`, `PCM12`/`PCM34`, and `FF72`-`FF75`, blocks `BCPD`, `OCPD`, and `HDMA1..HDMA5`, keeps DMG-style OBJ/OBJ priority, and prevents native CGB tile attributes, native CGB palette data mutation, PSM NMI, boot-ROM remap side effects, external-LCD/PGB visuals, and live post-boot `OPRI` visual switching. -- The DocBoy report suite `docboy-cgb` validates DocBoy `tests/config/cgb.json` in native CGB mode: at the pinned DocBoy commit gb-cycle materializes 6815 manifest rows from `tests/roms/cgb`, skips the one upstream-disabled `daid/ppu_scanline_bgp.gbc` row that is absent from the checkout, keeps the remaining 643 upstream-disabled rows visible but non-runnable, intentionally excludes duplicate Blargg `cgb_sound` rows already owned by `blargg-cgb-sound` plus Daid speed-switch / STOP rows already owned by `daid`, Acid `cgb-acid2.gbc` already owned by `acid`, Little Things `whichboot.gb` CGB custom-boot coverage split into `little-things-gb-cgb`, and SameSuite rows either promoted into `samesuite` / `samesuite-apu` or split into `samesuite-cgb` / `magen-cgb`, and runs 6172 cases under `console = "cgb"` with the default strict execution mode because this suite exercises ordinary native CGB rather than the experimental CGB DMG-ext policy; it is available through the `docboy-cgb` report lane and included only in the `docboy` report lane, not the promoted `cargo rom-suite gb-emulator-shootout` or standalone non-DocBoy cargo report gates. -- The extra suite `samesuite-cgb` carries the 10 DocBoy-sourced SameSuite CGB-only APU variant rows removed from `docboy-cgb`: it reports as logical family `samesuite`, materializes under `/test/samesuite/samesuite/`, uses `console = "cgb"`, `report_console_suffix = true`, `timeout_frames = 180`, and RGB555 fixtures under `crates/gb-test-runner/data/samesuite/fixtures/cgb/`, selects `revision = "cpu-cgb-d"` for the `*-cgbDE` timing row and `revision = "cpu-cgb-e"` for runnable `*-cgbE` rows, keeps revision behavior reproducible through `gb-cli --revision` / `gb-desktop --revision` instead of runner-only overlays, and is included in its standalone cargo report lane rather than in the promoted `cargo rom-suite gb-emulator-shootout` or the large DocBoy report. `channel_1_sweep_restart_2-cgbE.gb` is disabled, not informational, while preserving its original RGB555 fixture because its DocBoy-only short-hold fixture conflicts with the promoted public GBEmulatorShootout `apu/channel_1/channel_1_sweep_restart_2.gb` CGB-E oracle. +- The DocBoy report suite `docboy-cgb` validates DocBoy `tests/config/cgb.json` in native CGB mode: at the pinned DocBoy commit gb-cycle materializes 6815 manifest rows from `tests/roms/cgb`, skips the one upstream-disabled `daid/ppu_scanline_bgp.gbc` row that is absent from the checkout, keeps the remaining 643 upstream-disabled rows visible but non-runnable, intentionally excludes duplicate Blargg `cgb_sound` rows already owned by `blargg-cgb-sound` plus Daid speed-switch / STOP rows already owned by `daid`, Acid `cgb-acid2.gbc` already owned by `acid`, Little Things `whichboot.gb` CGB custom-boot coverage split into `little-things-gb-cgb`, and SameSuite rows either promoted into `samesuite` / `samesuite-apu` or superseded by the standalone c-sp v7 `samesuite` report, and runs 6172 cases under `console = "cgb"` with the default strict execution mode because this suite exercises ordinary native CGB rather than the experimental CGB DMG-ext policy; it is available through the `docboy-cgb` report lane and included only in the `docboy` report lane, not the promoted `cargo rom-suite gb-emulator-shootout` or standalone non-DocBoy cargo report gates. +- The previous DocBoy-sourced SameSuite CGB-E variant split and its local framebuffer assets were retired after those variants were validated against the c-sp v7 SameSuite successors. The standalone `samesuite` report now owns only the c-sp v7 `same-suite/` archive through `fibonacci-result`; no DocBoy/GBEmulatorShootout legacy source family remains in that report. - The extra suite `magen-cgb` carries the eight DocBoy-sourced Magen native-CGB rows removed from `docboy-cgb`: it reports as logical family `magen`, materializes under `/test/magen/magen/`, uses `console = "cgb"`, uses fixed-time RGB555 fixture oracles with `timeout_frames = 72`, and uses fixtures under `crates/gb-test-runner/data/magen/fixtures/`; it is included in its standalone cargo report lane rather than in the promoted `cargo rom-suite gb-emulator-shootout` or the large DocBoy report. - The standalone `mealybug-tearoom-tests` report carries the complete c-sp `game-boy-test-roms` v7.0 Mealybug inventory split across `dma`, `mbc`, and `ppu` manifests under `/test/mealybug-tearoom-tests/mealybug-tearoom-tests/`; the previous GB Emulator Shootout-sourced legacy manifest and source family have been removed. The new c-sp PPU manifest has active strict fixture lanes for DMG-CPU-C and CPU CGB C/D where fixtures exist, three CPU-CGB-D `m3_wx_4/5/6_change` fixture rows source-tracked from DocBoy `cgb_dmg_mode` under `ppu/`, CPU-CGB-C/D rows for `m3_lcdc_win_en_change_multiple_wx` that temporarily use the same DocBoy fixture because upstream Mealybug `expected/CPU CGB C/D` PNG files are placeholders, and disabled inventory rows for DMG-CPU-B-only lanes plus `ppu/win_without_bg.gb` until revision support or an oracle is added. The DocBoy `m3_lcdc_win_en_change_multiple_wx` fixture differs from the older local legacy fixture and anchors the corrected CGB C/D window seam. The GitHub `test-roms-extra` matrix entry is temporarily commented out while this expanded inventory receives manual validation, so do not treat it as a current workflow gate. - The extra suite `little-things-gb-cgb` carries the DocBoy-sourced CGB `whichboot.gb` row removed from `docboy-cgb`: it reports as logical family `little-things-gb`, materializes under `/test/little-things-gb/little-things-gb/`, uses `console = "cgb"`, `startup = "custom-boot"`, `timeout_frames = 180`, `report_console_suffix = true`, and the fixture under `crates/gb-test-runner/data/little-things-gb/fixtures/cgb/`; it is green in the default `CustomBoot` lane through the core CGB cartridge-entry timer/raster bucket, has local default CGB-E `cgbE_boot.bin` `RealBoot` evidence through `cargo rom-suite little-things-gb --suite little-things-gb-cgb --boot-rom-dir `, and remains outside the promoted `cargo rom-suite gb-emulator-shootout` and large DocBoy report.