From f237781f87aed9bef7dc108020e1cf40a6806f7a Mon Sep 17 00:00:00 2001 From: Francis Date: Tue, 16 Jun 2026 14:30:49 +0200 Subject: [PATCH 1/2] test(gb-test-runner): import samesuite v7 standalone report --- .github/workflows/test-roms-extra.yml | 3 +- .../apu/channel_1/channel_1_align_12-cgbE.png | Bin 73515 -> 0 bytes .../apu/channel_1/channel_1_align_25-cgbE.png | Bin 73515 -> 0 bytes .../apu/channel_1/channel_1_align_75-cgbE.png | Bin 716 -> 0 bytes .../channel_1_freq_change_timing-cgbDE.png | Bin 621 -> 0 bytes .../apu/channel_1/channel_1_stop_div-cgbE.png | Bin 902 -> 0 bytes .../apu/channel_1/channel_1_sweep-cgbE.png | Bin 1064 -> 0 bytes .../channel_1_sweep_restart-cgbE.png | Bin 1269 -> 0 bytes .../channel_1_sweep_restart_2-cgbE.png | Bin 1173 -> 0 bytes .../channel_1/channel_1_volume_div-cgbE.png | Bin 922 -> 0 bytes .../channel_3_wave_ram_dac_on_rw.png | Bin 74038 -> 0 bytes .../fixtures/dmg/apu/div_write_trigger.png | Bin 1420 -> 0 bytes .../fixtures/dmg/apu/div_write_trigger_10.png | Bin 1393 -> 0 bytes .../fixtures/dmg/interrupt/ei_delay_halt.png | Bin 963 -> 0 bytes .../samesuite-apu-channel-1.suite.toml | 96 ++++ .../samesuite-apu-channel-2.suite.toml | 68 +++ .../samesuite-apu-channel-3.suite.toml | 74 ++++ .../samesuite-apu-channel-4.suite.toml | 60 +++ .../data/samesuite/samesuite-apu.suite.toml | 31 ++ .../data/samesuite/samesuite-cgb.suite.toml | 67 --- .../data/samesuite/samesuite-dma.suite.toml | 22 + .../data/samesuite/samesuite-dmg.suite.toml | 21 - .../samesuite/samesuite-interrupt.suite.toml | 10 + .../data/samesuite/samesuite-ppu.suite.toml | 10 + .../data/samesuite/samesuite-sgb.suite.toml | 15 + .../data/samesuite/sources.report.toml | 414 +++++++++++++++--- .../src/oracle/fibonacci_result.rs | 8 + .../src/oracle/test/fibonacci_result.rs | 23 + .../gb-test-runner/src/suite/test/manifest.rs | 60 ++- docs/REFERENCES.md | 2 +- docs/info/ROM-SUITES.md | 8 +- docs/roadmap/10-cgb.md | 6 +- 32 files changed, 837 insertions(+), 161 deletions(-) delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_12-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_25-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_align_75-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_freq_change_timing-cgbDE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_stop_div-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_sweep_restart_2-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_1/channel_1_volume_div-cgbE.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/cgb/apu/channel_3/channel_3_wave_ram_dac_on_rw.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/dmg/apu/div_write_trigger_10.png delete mode 100644 crates/gb-test-runner/data/samesuite/fixtures/dmg/interrupt/ei_delay_halt.png create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-apu-channel-1.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-apu-channel-2.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-apu-channel-3.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-apu-channel-4.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-apu.suite.toml delete mode 100644 crates/gb-test-runner/data/samesuite/samesuite-cgb.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-dma.suite.toml delete mode 100644 crates/gb-test-runner/data/samesuite/samesuite-dmg.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-interrupt.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-ppu.suite.toml create mode 100644 crates/gb-test-runner/data/samesuite/samesuite-sgb.suite.toml 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 bb558da64bd5087230d9dc0aa840858d819fcc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73515 zcmeHN30zHG*Kd;MK}Cb+C`}SgG-*;QN`pvgcvUpdRMMb%piyZ+gCxy~qCt~N8i+=c zsez=KN`1$BzVANwyB9rrywB^NXP@8CZlAT*S!=KVf3JP^c29`bzCDy=%w%|Yc$8|Y zN(Z37m!W^>NeG}8uWPOg50CnhhpvIk0aJGl2Pb=r<2J`QTuwP0<2ZKmxCI{G$=-@Y z+h}g7NTuZ|dQT#6g4d3!1Uvdz-cQW!PJCkYL}$Brg?VXoW=1&4Hr4jQ4?fY$ZD*>c zk4pD;CeOETQRkT&&dD$TEHc%_Ez7>de`d+mYVXnn->K8aa_35xr57KB%)D~=GV|%& zT+yt!>%u-dA{m04+d^^iE zSk*L6Jj~Uz&(t&C^x^4C`;v!uyp02__tMGUFOw8Ciyi0S+ul5|ectP)IM>a+$)6k- zi+yHUKVOQx#VEOt<_4p{7uPLi-YK8Vx5$a7fAR2obCi8#dqu;@>|>M3g_O?+Sz?x+ zw0gzQ=v?+(UeY}yV<%)df68OL$E!{5;PkUKKFty}-h!20N7rh2-Y_kQW^1bpnwW{2 zJ4wb_VPaTyiQ0z!t*3fZzHaIS+d2J={G>Wo@~7wVy$!b^FUd*S)$4@^qa1J9B;6{J zN+H~TFx6U8QY_GgLEsI&r=UpB$tmNBn+;4^hdiHZ+8)Zu-|#T&x!KHdhF#$obMCYq zY%tYno)wrKeP(^NY&6kRJ@t(kSCnhTwlYo|DS=w~^zqjglP*VCrsxUMU1PO#_@!DG zi-i1giBs4JH;oNXdXy)wOKb`an{^CP^mL*+WMycaU$k(-BEJ4}^?5JV@U9`p#_Rdp z?he$P=ID6k-*f0pR*}V1-P!Y%5qu@(=DR=BCE;h5#&2!3xTIe-)f%@yx#*(%rUpxW z$$NH$xm~QC#>Xp?T&jA7s$_}=zU1ZV>pPhjn&%k#-7l3p`Y4zB%-F=%j^?3OCT&IA zimJn;GrS2y?^Ws!o4;f*D%QCm?W0c=J9GVui0(+ArTb3!4gFcI52T-u zT2gZlYxa;zH7Ar`mPq3~KT^?R?;p}DzcbK+w=VhprW0OmS3c`K=~AQ&F*R3~ZQbP@ z`fSVlGkvULA2cGRuhZ?_ncE`Evxdg^A#-lQEWyogNt>7a95Er;Ru{TSY-=K;%4xL@ zUfRTt*JRfB-t3wxoA1!+X4cm+F*hD`j`)%ssn(mbl2ej%2B`&g8j+%f52^!{6;3@21zH$;Uu%Y`ec8v ziHwoW#7=M0Ej9w4^4#gXzUJdSTI+Hg^k*+WSC4!)b5-#z<1^Z(n#%msq6?h|X_(E% zZWTWFGQ4?FE7>^kMoq=uz~EroY$n0#vArp|xy5bgZ=Y4;I`o?4-t*7vb}Ws(QH^rB zLdclCE=HPPgQwW!ZlX=bTcLLMwWk|NiEbvTv=H^3qH4M`Td{`Nr7vWW_3?%>-A?|V z6LjAATl`sKI{c62Ni~`ncaR&ruC8ghSaLtVTBkiCm1rs4cT9*ri`dasd0$@j?qQa@ zRR<}=r*?=NaJWq?4TY5i#jx~L;3-XpMCw{RXYa3Ef4IZq)tFUBF7^6kllX8Q{YE!= zTc4#PZnLlaH+xCtZ_4XWZ+d1zz{%o6C3ie-#+AtB0&ztxSO2{HlnBXX0}*Z2t)ttA zJmR*i)h1qw)Zx{LOjCG9^S0cclkT#oo+pjJ%Q5-*j`8sP5g-l6UX)Oga)><96Yz6rXGf-XI&C(Myp)-hKO8{(b#?mH39<0adam zTpy@kt=$ zkw7ZdYqau{M1PXWDG%=g`%|iNO!%9rdepcm%+ERSlhXEtAKBxXsd)Tc#cA@RR*aX$ z8r=)D8&dgo#B)p=EKSBP`d?v`((+*`qkNM7!cf}J;&|F} zjTj`{mvJ;7meLtAYS4JWZ$N*jT0`2T$c{4YhKygZbcreTb|?1WFaoM>zjO*F+Ynw?89tThE_D!gN7av?- zFCXsuaaU3}Hz$W+XWR*DdzcT`z}nHX(W4@VnFFNTof#g`oswR-`mkD0hD%w$fI+3hVUTQHpf0E3TCWhz z+lgD!*00}8Al&eTHG^nNf3f)0XS=drlTbhMi(*W0khV=MusX?WVZ^SJ_OY5=LGw02 zDZAyZcu!j02n9k}a@DY?PcJ)jc!wu_sP9Vjgt~5IuI8Us61_pm$RTlxER74^1<5JB1$8Ar-sqDlKCkn**Y(Ndj-qyNMT^p&%9sGbp?%r0V#feUB9J@jjPL zet~ytORcGHP5Ky7(e2}mXESA~%TS6Yq9hic<9ekMc|P+QvnElq6gQ7FNvI{iVw>2@bwFHke?*Dt&i;+5nY!0AY_D`` zXDx^hOujmwuihRd^<0W)fj)!WmV-t6y)&Da8;3AEQP>Srr}qy+>uN*kTRh119xmi6 zlnyj*Q}epz$4f#|UU>3;#M{t%fdF4edwOq?gco{D^rl91Dr^5G5o#0nk!xPiB_cG2 zG$1C8V9jjfhPd^ghjra}2=z$&sf#-be0d7AC1PV*@xM^hZwMN{Qeq`!MC(v0A;$P2 z+=hpan^#1-adRGdlY&(PmGu^S&Qm%{0|Dc;n%<4Prfa5pNHi~nu2H6PGo;6aJ4ZBbToC=&riH;rlxw+lu1!&@H&bv<{7|b=A1U2BROQj z%3Zm6W-YC@MG!;dx^?8D!OXeWHHS#n9`(mdNtFvc7fNW&P$K@Zx5UkFObi3dbT2B0FaItNBvutMaIfBaeB2L?a zYL^}pws7a^7`)A$npd^LUh_=}i>HL|e#jM?z(1-SBD;ZARK+r`B>NgkSC%53EzjMA zJ#pg|XASoy#VIAtT$z^XrI2JlaG^eZ*WPrZeSO7lFw>${!w zM0agGloYN|y-tvPT;0T7HR)83?v!aY1GfAIhZ(hm?(yVLM7nJC5pADP zzjcrZCZvJ)VjAcr7JN$fk{ErPMw{m_Udz%?T zT3iq#aNRJV^jgCj?ucC`RoSHTQXNy522=4!6nq2S9o`A-Z4IjQXOIJCuS#}>AW0ZsO|6>q1Mo(-Z@ zOQKFzDq*A$?hO0lal2H2UXa=A?66LJxXGZE<$1GC-bAuKX~B^r9fNxh)F#)CY_pYa zprpGtsJqS8l4X`Wggd_`wqI1}B!w_1Q~FU;?U|z1i?^LAzr3ViVo@pbp68)Ft`#`i zVHf*JXw-a;JF3AzJ6X9nq-d$Vt)_+N1GJymM(@MzrTcDL-(&06ohIEcS=71u_BGaX zX!lV$Z|(N(J^$X1IlJ;pBdm9NQZl0^L6Ew%(@40W)z*ph#sJvaw{ zB^{dC(4q&o@FYO*V@q(z9-M<=`ViYBBxD53noP8&a1<6o9`;zL*sZ4GX$ZqXZqCM*ylMjI|WHg@nIQj_nN& zfgTqX6gI|)4(wNr&mYSs&QDd4z_$=s%{dtIgF0fO`$P%hbsoC?o)%W2+hZ7`hk(2R z`_ccIz7Fz=B(Xsj|d@y&^@WVfDQ8Vbr zW1hxeBzYrgACdQtwh?0Oa@z+-plF!`GdI-;0cwziAee|UjeNp}1vnbCfW5^Qf z!!5QJTLSFSvHB@|z&RL#4$0?o%w6=?bXU4iGYG>FuI#T%9{6n-1DgNd?P@9*9xcow zL^f*h=o0ik${uA5X`w#cVr#J_z#bi|pTY;Tf+0uH1-k$(5)gnY34PN9r34?sejvwA z8#4ZZJ+>AOfgTqX6gI~22JBaj4>$*7Pgg`qR&x%9PL1$N4!5YEEx#v+0Ylfqk6=sC zp~co>OMpE(1>eL6bCU(XfT0xf6NatDmH>NnY`=-mcfOGh zvPzZv<68i995MPR&M@TQ_BTWTb4UGCLxiReWDofMDbW6AuBwgI*KW0ZaiEkqLf*%TTR>iG3NIrg|ACqM9mt%XCN`$q+ZjWN6d`&Hxf$1WF} zHXuO&0^m&i^_2vjCLu1rd8R~hjIG6%pp3ui?Z09V&ct6yfjEX<3UCXPgx<%N;E?@y z&ctv|-)SK%zM}!+-wpxHUGz^45Sqx4J&JF5(*y}&Iehz54uSD6M*wq)Mh^h<1oMa9 zhi!f=`KA^%6(B9thg+04lone8?9s9MDSR+17;*$%u!|qGunh(!Kd=X?{~7`iNf>J> z>d5syIrdl~CqM9mt%XCN`$q+ZjWN6d`&Hxfb*aQA3`h`z0Ok^nn8ZLLFam&JgwF&( zFd!I0;FT+T@t^t@0O4riczU3kah$-Fh7Sl{2_YQU1A=j!z?Fs%2wn*x9M=Paah$-F zh7Sl{2_YQU1A=j!z?Fs%2wn*x9M=Paah$-Fh7Sl{2_YQU1A=j!z?Fs%2wn*x9M=Pa zah$-Fh7Sl{2_YQU1A=j!z?Fs%2wn*x9M`XkV1I|l%HUf79ArMz_ptY>7{|d}|FJ^` z1S6b!KrkQ};Rql+Jy5}bV1y%p@bo|h1A-Bb0K(G)6$}VQI06Vy4^%K97~u#YJUvjs zfMA3pfbjG{1p|T+jsU{b`->Hv5z;vgz6HRQIr10D#+5Yxx#I)`Bb<9cFd!J=2p~K? zP{Dv;gd>3P^gsmzf)S1Y!qWp43ncVK{EgmVuF1_UD<0feUqDi{!qa0C#Z9;jeI zFv1Z)czU3M0l^4I0O9F@3I+rt907!<2Pzm4jBo@Ho*t-RKrq4)KzMrp(F$JlebfNH z1^9ht(0`Qd-zUv~?nnT^2PLu z{heh0o(Ld(RQM|7Wz&FVgtH6?1_UD<0feUqDi{!qa0C#Z9;jf16MU^x{WWXfV)NHD N)s*)s{SRQyPM!b& 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 bb558da64bd5087230d9dc0aa840858d819fcc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73515 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 N)s*)s{SRQyPM!b& 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 86e709e0a0a5bf31c517066f752411377f936879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|V1!PZ!6KiaBp*JLWYTh_Jq0 z@!g*F$*gyWgp_uyYs;mUi0!v0{{5L)=kZV5w&+Ipp3cq3cUsq5e@!-$bYAl%;0?fw&#n#Jm~*=X!TR~YfFBq z#!v5fyZDd(an)am@0z{8@b91bQ}CyT?T_NUAF?W|4XlA0E?;i`9{juZX0!6M?b%Q@68DRI&JguC&@qUZS`udtykgu+qBi1b*^p1ZuU0^ z1FIfh{q!xt;#)!m(3bP=FApYGKY8b*0|S$Zr;B4q#hka-1M_Y*az4vzER5R6BEh%s&0s_f}s!ez!C`rtVb$V)f_r2P>qV9h!Ki#z_KYw5Y zRA27yKKsAo`GbY)ZBhyyn2vMGs29vRP&mrK41_!Rm6P92ym-X8AC!zdUHx3vIVCg! E05n1z_5c6? 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 a42f1ec307e7c987f3425b7997f4c71990a3f9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 902 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|T?Kr;B4q#hkZu0w=9j5MeES z^|oHLaNEh>1zkx81YDBlZ2R5)z|+KR`{-0P@v$ZsSqjB!^ zJG%du)&9-Cd0)V+KVO!8cJ%vc{>HtJ7pT_Hd*EBPce3@9-`e&Ux&;Rg^b!6sm z|CmSrs_t3MIG4HFGe1h#F#dcr`{9=>n=kvm%#LJ_H=Mur?zSzLy&bDAR!r-+jjTRV zwftw*zIw5_z5MAHub=s@BR*}GAb|^zF0m2=;j6 zd|963Rx{>p=SzFOw)x@Dd0!t`xEaOp%gvT=DmAdlm-PY4&fU(}R($XKqUZOQ_}{cK z`ux>uhw1%5_V>BR=cS9!+|c^-o7Ij<@8`Q-H~tz~ax3`TZ2jt2(b_+q?d5CJ_RjOq z-#ugfllV)M-iz^i(>OT{r7hXG9 zu%`JX(2ZsHtR&{yfBF63%%jtuVP&?NE4k0gpQ%r?wYc5=_x)?2o04UDKmoFmZ(rWM zuL%|RzCMV461^?#llye;^4kADAH7~5etQ2B)&D2`H~jtjPjUW(c~(1AmBkpk)*O~sJ(8WO$l)pS({an^LB{Ts5H|(Ik 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 b4044996b5562602a69593f7b57a1a045eecc034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|WDWPZ!6KiaBrRI!?N+Ai|oc zCGK;!sKzF9ou`;jpoC83=iW!>gZGOz_HCMQV2gvwk}1$8Xo%;BGhWoeeK!pKK~=11f3%GUyn%r8&`aL#jky)=3h-e9Imv9 zm~*`O=;d>Z;ywROJnwu&GHb?O}P`5+sWJ4uz%kkseJERfBPEq=&FMIRTI8{ zaEb3d-h4Ir!>xAlgUz*{fX01DD3#;C_UvOq;k`|AG4m#>rLSk7FPs1RxbwByKtVbF zFn+l;XCEJYlo-Fo;=bRe8{)dhqQAKsukxQVeINh5Ppds2=hjaDn(*VYO~jh_TI^u6 zK0Y}3$VN`*98g>3%ij-{&Hhxo;V@Wijhs!yY@kP**}H+BvFK;-KE6-x&;Nd}Z`=N9 zRmXi1Y*W0&ng8*DGS5e$b0;qW-GyY<#`Wya7cK~MxYjJo#xM5#W5U-52X6uGk$Y?z znYv)z@hqDg%JEeN?=HHZigr(Z`(fuYP5;7kSKjO?6#M&Og-+TZ_;7mt|LN(7spa7k029>HN)c<(1FBJR_49=<>;%h-6d$9Q`&}d+&T>ZRZ`_=6`_45sXPhRuy z=dJlJ2lyXWUQ`5z-e1S=zfn1h0%Y8Cc&%6d0tkRfl2^RS3j3^P6W!BVXrLnrrE#VSrr#me} zMcs7H2R7@-v3#{GT!NijBHdv!HNdn1iiG(HuQ#U5N4vD0wzEHezu!OK$LDo^IWbYY z-Cb9^l1L=?h&|!4#Cw%E1}WkpkYvGK)CE@%*^7q_oD4z)>oH=nK3$g(+*yO5VrQIonxmE>KM zx;lICa@wPid`uP7#eHri3%wRJlVNCUL95j~x^|r^dr6?=6-jLNX0dYijIg?HbLI zl%ZK_%eAN-%7YCiA=l3~n47T`pzIeTTrcBN${(m18A4z!#5h>4f|Zb(e}=KUCSdd1x?ukZL*o>R4T zi+xWPO>NNqcrOebXVW(pv+4csgP7@zL&kmShkr{a7Ft~MElPD+K;L^{f`7mlA-AkT z>gi1lTFrKJ%=ZZD)10=FY;!gCx~@E^pW}YbJM6&X6IV9ZPQ%-A7a@!iJEB%vpZ^|tTv_>ns3+3_*`AS14q2Vt*u!4E$ z17`qU1OaP|A}moXe+o+jkI^!7WZ1q4Lv;jN+s`jl!0zj%n)_A!CVa`W&8LEElNl|YU=+-}C=-)?N?eQsKf$1N0+^f0 z81MH<<8&HfY65T@wN|Y{B`J7$^a=nmBcq!RBO>qtj<6ifUPs~#sxV- z(Ra>n6CHyUQp>L0u_%ssK(mYT11k1UMZFxC`w)S*?xeJ}uQ28jPWL8#{>osB3q3Wb z^~scCrX!Zev}1>^0GSc~W531~J9t^c@%EXr`n8aHnl@2+c&ibHX74&MdI$J?xdiIA zYFk?_@+x<s-mo+A;$QL2pkx35 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 f40ce21979c26bf73cd3a9590e3bf1373a4718e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcma)+e=wVO9LICUGEuU%#ml;n2Kgl+iAn6C|7`#5?)&|I{`uVd^M1d+ z-}~Ok%t&!3_z-Y7oI5o&=_FRa!}hH=oUjx3!tw%#b1tMNC7y!#T0!C!KIzS5ci(Qu%~aMjorbem<|I(&yur%KUpvgT~0AouB(c3W8BB zNAx>*J;3QxR$oPIeNxuG1Jg%ygP18?n&-0YeBMY|VGTEf5L?vY&-Jn&SWS(o4t;2P zMA|8lykGMCgo?cSc~DJ7{O#=@UB>z3?Q7d9W)p?0k_I~2a&rp1yUvD|KerY+eOq~2 zu+&=Vv$M2x?vzdI;wGmi6Lo`!*l2Njm2C6=hh3^m9O>7~+|YZF=b77$b!}qjCtx5a znzkcoCUT}zkS#IcLD4xJse)5`#& z7f%Ljsq~)tSsni0^+93?1lA18>C9LKvDRYnAjbFgqo3&=9FlYbF8{`|0joYSCTj=# z9|f3n)g&ow@wPI)@YV3*Z?dYyO})(@@d3Z6HCOpG3agBCyAoLefwnO$I!BJeP45Y{ zcoYISLA1_*KdtU+Y@T5+0TF1!_)KH8#v8lc%Du8QVg4IgY_y~Zsh=n5j7q=Si2Y0Y zx>^~$0plN=AaN9C+vKP&l^kCT?-2b><)Vo9IwZDIfDi!8<;&n<^|r9hOa_6OclD;} zvG&mzrNTJaY8=n*ic1$If|B4lHL}`I{?(mvk*+^-20Evgq681cgT_c;=9y%N-BIne zKq(tCLSlOyGdv5FBx0!lWt65t%&_kwM!O8m1tBp7bA(<+MTcC|Y?1gr#`wO0^>X2&dE%~`I&%^~w!lZ+|_rARl_XxhfEQizI%hsxy(7zQkZ zKnDL(iAAv-gm^bjXUpFKW}`d~6KaB>WiJB4l_#m|j+xq-zt%=KR8UHZ-K z;m98F;!ZQHKsCFZP!ZJ|frl|U%xDY`UxE>&=)+5U(-S0#j=#t;n_mfx-CIa=(<@Pc zhv!kbwz2-Tum{KCb`2uW*FkJ%{}S}}r1&%k%mnJg4fz=b!<{)KHMw4m ptRQ>AL1DsZVhq8>i}=6SQ(9U>2Oc+ltYG)Mp(bY}{qzC->ObDzO%4D6 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 c4e45b0ff4e708a3cf30173ea05134007535e9cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 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 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 3cf24347bdfb9fdb76cd263183db210fc7140365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmZuxYgE!_75Bu=E?}z6+=XZI2?|VJK-`m2> z+RVhn#KPCd>oj!NKy_o2DRi0)tA(J`qlT)9Z5WzEX{&wN$bM3Xn3-EtrpB=XBc6BRrgARb zS8(JAFbSDF!xjRv&LSF0v`Ynp)iiDSx4 z>^=>_(qrII_1Mo&)2E6@uHj||@fWEV0vb!+-RXOsTx=h4rF&};whz00B2?r^I)DSs z8xfS|&ET7=I$+~)*rq8x6?I}!b=hWIG;c>~Gy{k7kAN)O)3-b8Wv>m6AEw{AXux01k{4~EOXw-MLvMuerU#5ZC z!g#FJZ3w802cNGz!Vgo?n_l77V^Itbt4N%d07BGJPT{)28229d{7K49b~#M~hphQ> zxs=*GvHSW6z_`I|kdoU9tEch}F8_=f6+=RhIe@GBRe&-v=7Eut4LD&VMRb&Z#oY6~IJe9d?mv%B^JM4=$^X*P2QRu)(5w-ldukNe zD8F?4>>9may~kr5X>L(juYh`=JN%xb$(yGg>l*MWo4@)LWc-iH7#&sjWg*)pQ8)Mo&s0K=Te5xXsO&$22 zcbUi&&rIA+Ozp?5itAwh{(*a&eLi~`L1^b#uWyi9=ZaT^Ds_NESQ}R9B%3gy4K3CYe znwhUt)GKqc3`rW;2W+-6#mr7rMXDXtG%jO>t6CCkxxBo~nL;3CYByYo2?A{egYd~- zX6{F_w=i++qF(x&rYi%_oz!}IQ?D2FprW+go4fnrll)fjWFGV)P~~&vB}a-+N}PNPc>Y2R`LQE5A>+8|!q6uVkzy$TzifJ!l zbk8_Np;G-YoNzCGTc7@mz^a3?<;fkwlLA2ghR!_(=5`e1>q`#M5@k7jJ+S zdRXP)rh{PqMGJ7O2tX=A{qa0Zbh+d5Q62%q)Yhh~Kn wl3RY4p1sQDnbLD$8!b1RBez>c{%@nPb88g3R}Rb;8-H2fWBy)^o`j4)0TWQ&?*IS* 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 5abb23ac34b5c1fc1c7b9518a9c0d0ea56e9fe43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1393 zcmZuxeN>WH7}6hDLs+%@jW{Ezc<(IVTB;r07a&y7 zbn&=#HpicY967~rpD^fD+R|qgM`$^+MS}}Vf~Guxh2aq z(d@B0<7cuDfbGlcH~K#S*RMMKz@^Sff@t3FzRs29b?s|#aWKG_f2$oBp}GJg>{B(Sq?z7Zvz4NCmzzTbC5DWupAoBvUtN z>}m0p-+g(tAjy{Sug0Y;;N^q-5>9f8tfGm6+OzOC@)5#EWEkyS*w!@s{KtCM5j5 zxyqN_ytp@_Bn-o9TG9CFi+g%uNU6-Ux07AWXK$K}EJ8u09r65DWkL+;oa9TBnO36% zadDaR;7T5*EoYG08Op{uCi~Flwu$SL8l?%ZhRNF%K=tikQZ=WF`0!aXCfo{f6hLU8 zAiF?f{=e~di_cc;VXHF`?_#^1rz@dk{7g6D_QI-GW(LvrtRC!c&}BgT+)}7f8rSzb z>A123U(W1e3sCylppSHKKe3@1>=i(d7Glnr2Bd9Lj7Ye#riGj}CV-DtQoXz{tAX>> zVhX-QTxY`hJ#!BzBbhE>is>q^0L{eZC)~}-Kcg44;G2U>ApY5zrqvQYfC0u< z6ex!+TSIvdao-dm+LxmgQ-E57zHd)CU$Ve4KcqsRPn>mJQ?o0*{Q6s`)9AXSa4kq? zFA`7lQJ4Z@{A78Hwn9GCe|h30Ox2y(-N<^UoaxTH;+wW%fRJ7F!C(k1?17Vq$M5AF zuo|V%ro!cVLN&5?Oa+$ql{mN`HpR+j0eVr9r>L}{r9dsXs0^Xb=~WzeQE}&MBkEk>ti> zw!#l3T!SwSs+zLqD}B*WSMX3De+H7mk9hOyh-be7-<&7`do6)-tMv}{HlA*d$^X02 Y@lnh$81Ypb*0|RrHr;B4q#hkaZ&KBM_5Mg`R z6ZPSsYQ{0%h}s=O(;sZ^Tjx}Jfw!Vf^~nUaq6KY^9xO~66E>OcHg7!NuQ08C{*(6a z{U3gc?y~EV`S$RsWy^(}nga}d1`tb8dkzN0EmRd%yoT z{8?k;JO66Y^*2r&?X@p{9r=1Mt477H)JyK$%;toT@89KrOQ!C&yQsL?G~WLH@1y@zKO3@#U-kXV^9`}A-2ZQS`no=lU}|eNOFpvEKJz*UD29#dn`w`N}?KpJ8tNrb#jX z)Uv%FF=rf_YWe9=&8lDe6)Y)MI{&g#wJhp1BW6#3Za?`S-^1NMYmTWMzkGHdbKIon z$Iboz9W{J@_X_rf_MJJud|Q3Z$KKbMKUADOD0FC=<&8O2lV$eD^39WFMg{ Jvd$@?2>^XX&JX|q 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..cb6b73c9 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-1.suite.toml @@ -0,0 +1,96 @@ +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" + +[[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" + +[[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..22d62fd7 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-2.suite.toml @@ -0,0 +1,68 @@ +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" + +[[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..4b9b2af2 --- /dev/null +++ b/crates/gb-test-runner/data/samesuite/samesuite-apu-channel-4.suite.toml @@ -0,0 +1,60 @@ +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" + +[[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..09d5c4b7 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,46 @@ 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::CpuCgbE) + .any(|case| case.hardware_revision == gb_core::HardwareRevision::CpuCgbD) ); } 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. From 1431ca4ed525d27e5bdb6962bf540d95853206d0 Mon Sep 17 00:00:00 2001 From: Francis Date: Tue, 16 Jun 2026 14:47:50 +0200 Subject: [PATCH 2/2] fix(gb-test-runner): carry samesuite long-row timeouts --- .../samesuite-apu-channel-1.suite.toml | 2 + .../samesuite-apu-channel-2.suite.toml | 1 + .../samesuite-apu-channel-4.suite.toml | 1 + .../gb-test-runner/src/suite/test/manifest.rs | 42 +++++++++++++++++++ 4 files changed, 46 insertions(+) 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 index cb6b73c9..e1fd0466 100644 --- 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 @@ -46,6 +46,7 @@ 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" @@ -85,6 +86,7 @@ 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" 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 index 22d62fd7..c212cc83 100644 --- 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 @@ -21,6 +21,7 @@ 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" 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 index 4b9b2af2..844d21cf 100644 --- 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 @@ -13,6 +13,7 @@ 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" diff --git a/crates/gb-test-runner/src/suite/test/manifest.rs b/crates/gb-test-runner/src/suite/test/manifest.rs index 09d5c4b7..a77aba17 100644 --- a/crates/gb-test-runner/src/suite/test/manifest.rs +++ b/crates/gb-test-runner/src/suite/test/manifest.rs @@ -1850,6 +1850,48 @@ fn real_standalone_extra_report_manifests_load_new_runner_oracles() { .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() + .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" { let suites =