From 2b535525ef1ed5d1dd15753a9095a277d79f2c3b Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:08:40 +0200 Subject: [PATCH] fix: let a declared size contest another size System.dat pins the 2 KiB X1 font as xmil/IPLROM.X1T, where xmil reads a 32 KiB Turbo IPL. A held copy of the exact size a profile declares now proves its claim against a file of another size, so the existence packs ship the IPL. The font's duplicate under the IPL name is removed. --- .../IPLROM.X1T.44620f57 => IPLROM.X1T} | Bin bios/Sharp/X1/iplrom.x1t | Bin 2048 -> 0 bytes database.json | 77 ++++++++---------- emulators/x1.yml | 3 +- install/batocera.json | 6 +- install/lakka.json | 60 ++++++++++++-- install/recalbox.json | 6 +- install/retroarch.json | 60 ++++++++++++-- install/retrobat.json | 4 +- install/retrodeck.json | 4 +- install/retropie.json | 60 ++++++++++++-- install/rocknix.json | 4 +- install/romm.json | 4 +- scripts/slots.py | 27 +++++- tests/test_slots.py | 32 ++++++++ 15 files changed, 264 insertions(+), 83 deletions(-) rename bios/Sharp/X1/{.variants/IPLROM.X1T.44620f57 => IPLROM.X1T} (100%) delete mode 100644 bios/Sharp/X1/iplrom.x1t diff --git a/bios/Sharp/X1/.variants/IPLROM.X1T.44620f57 b/bios/Sharp/X1/IPLROM.X1T similarity index 100% rename from bios/Sharp/X1/.variants/IPLROM.X1T.44620f57 rename to bios/Sharp/X1/IPLROM.X1T diff --git a/bios/Sharp/X1/iplrom.x1t b/bios/Sharp/X1/iplrom.x1t deleted file mode 100644 index e6f02a22843510c212eafd39470628210b695c5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmX|CziZ@16n<8Qc#36jSVRzEu?HcHFeyZeAQrJ1gjg06jwL8ZFfNR_94W5Ya*IK+ zU8G78{5PaHQl?DhDpg2%^%W^YaOuKm^L-;ZPm4air71jXpfVacF=@<=@+Ld`P0u& zPlBH`4g2BEkZ+!**{8(WJnWmANkqOScs2Kp>(exj2mSOkraeaF1BP`=rOi^dZu@el zry^SQN{fhfy|W^wY#EU7)|Lh@2B8kCwFD+S7SdMR8Xknwv1F6$OAua^gB(8%OXJ@q{Ah$O(q{tl5OzA z@13V-ufDQJl4NyP*R_D0KiHjfsLw7#+Or+}yPZQ^13JEcS>rwSgncD~F{YF$%C8V- z-K@9krWUY3I;r2BpOe47`uc1Igul8*pU@c=1pN&4r_Oy!%U_u1& z7e$Lzy;=mlbCpa&U0K-0YPE=}upa&mvd!;TG6@NAu32xsZ-SL}k$>(WK=5Nd`T0H6 zuP%^)fiI%Ye26TO06(6G;Y4M#`lkuX&vUU^I&tX?JI4A2~1=*BmSbrG~IM_v0QUjwbratoAFYua}j7xlJP zb0Upkixb2s;O0p{wkG%q1K`1?L5Fk3XOK1Cv#sH`%CN2wTdmRG&^-sxOYZZW=aF2h z*Gg|`*X;cejfLN)$+!>u+X+x_$%pkV!U9jp&w!30Dsto`w7qqRlsQ4jUgaith(q&8 z6;4<1XEa8!!5nd{!#WlG;134J7~?iA&qu_WGp|Uw?D)dE#sg^vuXyV%;J`kcYAuk}$I-e=D zQ~12U39|q7o8cOcm0rr`cjU82zWcIm@5Fra2>cEIE67^@2R?__Py8(YL_fXjf9YfF syG3XGDcN8DzWRH;L7jj0o8Cx&ch}$E{s=w@_M6QUO3))O(!(PE0bvN4{{R30 diff --git a/database.json b/database.json index 4501dbe0..bfe8634f 100644 --- a/database.json +++ b/database.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "generated_at": "2026-10-18T06:45:25Z", + "generated_at": "2026-10-18T11:04:01Z", "total_files": 19075, "total_size": 17567770846, "bios_dir": "bios", @@ -188752,23 +188752,6 @@ "crc32": "7b28d9de", "adler32": "d6c53905" }, - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3": { - "path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", - "name": "IPLROM.X1T", - "size": 32768, - "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", - "md5": "56c28adcf1f3a2f87cf3d57c378013f5", - "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", - "crc32": "2e8b767c", - "adler32": "7af8f6bb", - "provenance": { - "tosec": { - "dat": "Sharp X1 Turbo - Firmware", - "name": "Sharp X1 Turbo IPL ROM (198x)(Sharp).bin", - "description": "Sharp X1 Turbo IPL ROM (198x)(Sharp)" - } - } - }, "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2": { "path": "bios/Sharp/X1/FNT0808.X1", "name": "FNT0808.X1", @@ -188806,6 +188789,23 @@ "crc32": "46826745", "adler32": "5991cbd7" }, + "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3": { + "path": "bios/Sharp/X1/IPLROM.X1T", + "name": "IPLROM.X1T", + "size": 32768, + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "md5": "56c28adcf1f3a2f87cf3d57c378013f5", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "crc32": "2e8b767c", + "adler32": "7af8f6bb", + "provenance": { + "tosec": { + "dat": "Sharp X1 Turbo - Firmware", + "name": "Sharp X1 Turbo IPL ROM (198x)(Sharp).bin", + "description": "Sharp X1 Turbo IPL ROM (198x)(Sharp)" + } + } + }, "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a": { "path": "bios/Sharp/X1/iplrom.x1", "name": "iplrom.x1", @@ -214475,10 +214475,10 @@ "1474da2b8fbbb37abce8e7ab5cf9024c": "fec7527ecbf79b1ac697137f770bb8715fe8a652", "e634c906c23e62d5d3cd63581e5748ff": "2ca428b70ed1746834d129c11fb8e60a56317cff", "59074727a953fe965109b7dbe3298e30": "c4db9a6e99873808c8022afd1c50fef556a8b44d", - "56c28adcf1f3a2f87cf3d57c378013f5": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "851e4a5936f17d13f8c39a980cf00d77": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", "fb31145036be80d392c95ff50ee8553c": "4f06d20c997a79ee6af954b69498147789bf1847", "77000214fda5f3ecd2043db1e6091074": "b9e6c320611f0842df6f45673c47c3e23bc14272", + "56c28adcf1f3a2f87cf3d57c378013f5": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "eeeea1cd29c6e0e8b094790ae969bfa7": "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a", "51b55ee3807901c015fdb93616858b8b": "76c18deb168ad0ffd7886a130a9e74e915070782", "d407317a52f8425a6753232064d14700": "77be2f6f28897f99b73d4c47bf7cd47e999fd7cd", @@ -263515,9 +263515,6 @@ "IPLROM.X1": [ "c4db9a6e99873808c8022afd1c50fef556a8b44d" ], - "IPLROM.X1T": [ - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" - ], "FNT0808.X1": [ "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2" ], @@ -263527,6 +263524,9 @@ "FNT1616.X1": [ "b9e6c320611f0842df6f45673c47c3e23bc14272" ], + "IPLROM.X1T": [ + "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" + ], "iplrom.x1": [ "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a" ], @@ -268584,10 +268584,6 @@ "sega-saturn:85ec9ca47d8f6807718151cbcca8b964": [ "df94c5b4d47eb3cc404d88b33a8fda237eaf4720" ], - "iplrom.x1t": [ - "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" - ], "cgrom.tmp": [ "8d72c5b4d63bb14c5dbdac495244d659aa1498b6" ], @@ -269321,6 +269317,10 @@ "Kickstart v3.0 rev 39.106 (1992)(Commodore)(A1200)[!].rom": [ "70033828182fffc7ed106e5373a8b89dda76faa5" ], + "iplrom.x1t": [ + "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2" + ], "basic11.rom": [ "9451a1a09d8f75944dbd6f91193fc360f1de80ac" ], @@ -290459,10 +290459,10 @@ "17878e56": "fec7527ecbf79b1ac697137f770bb8715fe8a652", "a61ca7c7": "2ca428b70ed1746834d129c11fb8e60a56317cff", "7b28d9de": "c4db9a6e99873808c8022afd1c50fef556a8b44d", - "2e8b767c": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "e3995a57": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", "8f9fb213": "4f06d20c997a79ee6af954b69498147789bf1847", "46826745": "b9e6c320611f0842df6f45673c47c3e23bc14272", + "2e8b767c": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "e70011d3": "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a", "72628c06": "76c18deb168ad0ffd7886a130a9e74e915070782", "5dd9a0c5": "77be2f6f28897f99b73d4c47bf7cd47e999fd7cd", @@ -309536,10 +309536,10 @@ "b853ce2856970592853e19e91f855e9905e4d9e5af46da26e8e818e0ed456cdf": "fec7527ecbf79b1ac697137f770bb8715fe8a652", "ad1b2eb9300efd3d9476dad742c72e7436d9a9f67c951d537868553fa0c80843": "2ca428b70ed1746834d129c11fb8e60a56317cff", "0513077cb96c90c3ab8809c44259d8274c7a34862ea7df1b957b2d6129eaaeb1": "c4db9a6e99873808c8022afd1c50fef556a8b44d", - "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", "e356dd1992708d2bdf03d4029ba07a8177158e1cb0eac145f881ed8dcdae35d8": "4f06d20c997a79ee6af954b69498147789bf1847", "40c080b7ad381050fe9f8d8063985a2648785ef470e397fbeb3d606a9774fc48": "b9e6c320611f0842df6f45673c47c3e23bc14272", + "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "e6295a523008688421991b651ab61de392b28c67bec9efbf040b0004e4b70a2a": "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a", "847de5c002e031b53459f76fd630779f692ff3d1e824ad5859e439ce1069c410": "76c18deb168ad0ffd7886a130a9e74e915070782", "07ab9575dfc9024cd52ebc92e2f3e64e9a0a3d713f6902eaf81974f20174d582": "77be2f6f28897f99b73d4c47bf7cd47e999fd7cd", @@ -544446,15 +544446,6 @@ ".variants/IPLROM.X1.c4db9a6e": [ "c4db9a6e99873808c8022afd1c50fef556a8b44d" ], - "Sharp/X1/.variants/IPLROM.X1T.44620f57": [ - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" - ], - "X1/.variants/IPLROM.X1T.44620f57": [ - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" - ], - ".variants/IPLROM.X1T.44620f57": [ - "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" - ], "Sharp/X1/FNT0808.X1": [ "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2" ], @@ -544473,6 +544464,12 @@ "X1/FNT1616.X1": [ "b9e6c320611f0842df6f45673c47c3e23bc14272" ], + "Sharp/X1/IPLROM.X1T": [ + "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" + ], + "X1/IPLROM.X1T": [ + "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3" + ], "Sharp/X1/iplrom.x1": [ "d3395e9aeb5b8bbba7654dd471bcd8af228ee69a" ], @@ -578233,12 +578230,6 @@ "Saturn/sega_101.bin": [ "df94c5b4d47eb3cc404d88b33a8fda237eaf4720" ], - "Sharp/X1/iplrom.x1t": [ - "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2" - ], - "X1/iplrom.x1t": [ - "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2" - ], "Sharp/X68000/cgrom.tmp": [ "8d72c5b4d63bb14c5dbdac495244d659aa1498b6" ], diff --git a/emulators/x1.yml b/emulators/x1.yml index 71759257..01de113d 100644 --- a/emulators/x1.yml +++ b/emulators/x1.yml @@ -53,10 +53,11 @@ notes: | files: - name: IPLROM.X1 path: xmil/IPLROM.X1 - size: 32768 + size: 4096 required: false hle_fallback: true description: "X1 IPL ROM. Loaded when ROM_TYPE=1 (X1 model)." + note: "file_read copies up to 0x8000 bytes into biosmem, unchecked; the X1 IPL dump is 4 KiB." source_ref: "io/memio.c:82,96-108" - name: IPLROM.X1T diff --git a/install/batocera.json b/install/batocera.json index d10a279b..7e36f86c 100644 --- a/install/batocera.json +++ b/install/batocera.json @@ -5,7 +5,7 @@ "platform": "batocera", "display_name": "Batocera", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "bios", "detect": [ { @@ -9951,7 +9951,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "sharp-x1" @@ -139643,7 +139643,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ], diff --git a/install/lakka.json b/install/lakka.json index b56892ae..a7053e64 100644 --- a/install/lakka.json +++ b/install/lakka.json @@ -5,7 +5,7 @@ "platform": "lakka", "display_name": "Lakka", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "system", "detect": [ { @@ -17,9 +17,9 @@ ], "standalone_copies": [], "total_files": 5887, - "total_size": 6132361388, + "total_size": 6132392108, "pack_files": 8529, - "pack_size": 6172909591, + "pack_size": 6172940311, "total_omitted": 8, "omitted_files": [ { @@ -3930,6 +3930,28 @@ "systems": [ "galaksija" ], + "slot_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "cores": [ + "galaksija" + ] + } + ], + "declared_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "systems": [ + "galaksija" + ] + } + ], "alternatives": [ { "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", @@ -9577,20 +9599,42 @@ }, { "dest": "xmil/IPLROM.X1T", - "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", - "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", - "size": 2048, - "repo_path": "bios/Sharp/X1/FNT0808.X1", + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "sharp-x1" ], + "slot_choices": [ + { + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", + "cores": [ + "x1" + ] + } + ], + "declared_choices": [ + { + "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", + "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", + "size": 2048, + "repo_path": "bios/Sharp/X1/FNT0808.X1", + "systems": [ + "sharp-x1" + ] + } + ], "alternatives": [ { "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/recalbox.json b/install/recalbox.json index fc96b4ea..1f785ca5 100644 --- a/install/recalbox.json +++ b/install/recalbox.json @@ -5,7 +5,7 @@ "platform": "recalbox", "display_name": "Recalbox", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "bios", "detect": [ { @@ -6928,7 +6928,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "x1" @@ -6938,7 +6938,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/retroarch.json b/install/retroarch.json index 1a0f13d2..999be904 100644 --- a/install/retroarch.json +++ b/install/retroarch.json @@ -5,7 +5,7 @@ "platform": "retroarch", "display_name": "RetroArch", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "system", "detect": [ { @@ -268,9 +268,9 @@ } ], "total_files": 5880, - "total_size": 6132196328, + "total_size": 6132227048, "pack_files": 8522, - "pack_size": 6172744531, + "pack_size": 6172775251, "total_omitted": 8, "omitted_files": [ { @@ -4181,6 +4181,28 @@ "systems": [ "galaksija" ], + "slot_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "cores": [ + "galaksija" + ] + } + ], + "declared_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "systems": [ + "galaksija" + ] + } + ], "alternatives": [ { "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", @@ -9696,20 +9718,42 @@ }, { "dest": "xmil/IPLROM.X1T", - "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", - "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", - "size": 2048, - "repo_path": "bios/Sharp/X1/FNT0808.X1", + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "sharp-x1" ], + "slot_choices": [ + { + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", + "cores": [ + "x1" + ] + } + ], + "declared_choices": [ + { + "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", + "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", + "size": 2048, + "repo_path": "bios/Sharp/X1/FNT0808.X1", + "systems": [ + "sharp-x1" + ] + } + ], "alternatives": [ { "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/retrobat.json b/install/retrobat.json index 8d8fcdd5..ee346913 100644 --- a/install/retrobat.json +++ b/install/retrobat.json @@ -5,7 +5,7 @@ "platform": "retrobat", "display_name": "RetroBat", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "bios", "detect": [ { @@ -7706,7 +7706,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "sharp-x1" diff --git a/install/retrodeck.json b/install/retrodeck.json index ec8b0f64..8f121f05 100644 --- a/install/retrodeck.json +++ b/install/retrodeck.json @@ -5,7 +5,7 @@ "platform": "retrodeck", "display_name": "RetroDECK", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "", "detect": [ { @@ -84621,7 +84621,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/retropie.json b/install/retropie.json index 762760b7..246d0760 100644 --- a/install/retropie.json +++ b/install/retropie.json @@ -5,7 +5,7 @@ "platform": "retropie", "display_name": "RetroPie", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "BIOS", "detect": [ { @@ -16,9 +16,9 @@ ], "standalone_copies": [], "total_files": 9930, - "total_size": 8499656937, + "total_size": 8499687657, "pack_files": 12572, - "pack_size": 8540205140, + "pack_size": 8540235860, "total_omitted": 107, "omitted_files": [ { @@ -4993,6 +4993,28 @@ "systems": [ "galaksija" ], + "slot_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "cores": [ + "galaksija" + ] + } + ], + "declared_choices": [ + { + "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", + "sha256": "7d93fe474fcc98c06a6d96e533f8935e4e707edf0792d3e9d679ea68404375de", + "size": 4096, + "repo_path": "bios/Galaksija/ROM2.BIN", + "systems": [ + "galaksija" + ] + } + ], "alternatives": [ { "sha1": "5d5ab4313a2d0effe7572bb129193b64cab002c1", @@ -10641,20 +10663,42 @@ }, { "dest": "xmil/IPLROM.X1T", - "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", - "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", - "size": 2048, - "repo_path": "bios/Sharp/X1/FNT0808.X1", + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": null, "systems": [ "sharp-x1" ], + "slot_choices": [ + { + "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", + "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", + "size": 32768, + "repo_path": "bios/Sharp/X1/IPLROM.X1T", + "cores": [ + "x1" + ] + } + ], + "declared_choices": [ + { + "sha1": "1c1a0d8c9f4c446ccd7470516b215ddca5052fb2", + "sha256": "42139ed610747190c8ca9046c799907b52582c0d642b5f52f1548d9c1d4a86f8", + "size": 2048, + "repo_path": "bios/Sharp/X1/FNT0808.X1", + "systems": [ + "sharp-x1" + ] + } + ], "alternatives": [ { "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/rocknix.json b/install/rocknix.json index 665f2c6b..f10f6111 100644 --- a/install/rocknix.json +++ b/install/rocknix.json @@ -5,7 +5,7 @@ "platform": "rocknix", "display_name": "ROCKNIX", "version": "1.0", - "generated": "2026-10-18T06:45:25Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "bios", "detect": [ { @@ -61702,7 +61702,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ] diff --git a/install/romm.json b/install/romm.json index 6970eae6..6d04c924 100644 --- a/install/romm.json +++ b/install/romm.json @@ -5,7 +5,7 @@ "platform": "romm", "display_name": "RomM", "version": "1.0", - "generated": "2026-10-18T00:39:54Z", + "generated": "2026-10-18T11:04:01Z", "base_destination": "bios", "detect": [ { @@ -14580,7 +14580,7 @@ "sha1": "44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3", "sha256": "212895703175665be8544daa55b65da1aebcf1e9a2db65bcc1622e564b802b71", "size": 32768, - "repo_path": "bios/Sharp/X1/.variants/IPLROM.X1T.44620f57", + "repo_path": "bios/Sharp/X1/IPLROM.X1T", "cores": [ "x1" ], diff --git a/scripts/slots.py b/scripts/slots.py index 9b22e28e..eaa48148 100644 --- a/scripts/slots.py +++ b/scripts/slots.py @@ -16,6 +16,7 @@ union and is never discarded, the same rule region.py already applies. from __future__ import annotations +import os from dataclasses import dataclass, field from typing import TYPE_CHECKING @@ -43,7 +44,23 @@ if TYPE_CHECKING: # A profile entry can prove a slot without declaring a hash: Dolphin names no # checksum for the GameCube boot ROM because its source names none, and the # proof is then the path the repository stores the file at. -PROVEN_STATUSES = frozenset({"path_exact", "members_held"}) +# A profile entry that names an exact size, for a file the code reads in +# full (no hash to declare), is proven by a held copy of that size: the +# platform's xmil/IPLROM.X1T pinned the 2 KiB X1 font where xmil reads a +# 32 KiB Turbo IPL, and a name-only claim could not contest it. +SIZE_EXACT = "size_exact" +PROVEN_STATUSES = frozenset({"path_exact", "members_held", SIZE_EXACT}) + + +def _size_the_code_reads(entry: dict, local: str | None) -> bool: + """Whether a name-resolved copy has the exact size the entry declares.""" + size = entry.get("size") + if not local or not isinstance(size, int) or size <= 0: + return False + try: + return os.path.getsize(local) == size + except OSError: + return False # A core that reads ROMs inside an archive proves the archive by its members: # FBNeo's neocdz.zip is any copy holding neocd.bin and 000-lo.lo by crc. @@ -229,6 +246,8 @@ def profile_claims( dest_hint=dest, data_dir_registry=data_dir_registry, ) + if status == "name_exact" and _size_the_code_reads(entry, local): + status = SIZE_EXACT claims.append( Claim( origin="profile", @@ -372,6 +391,12 @@ def _slot_claims( platform = by_dest.get(key) if platform is None or not claim.is_proven: continue + if claim.status == SIZE_EXACT and ( + not platform.local_path + or _size_the_code_reads(claim.entry, platform.local_path) + ): + # A size proves a claim only against a file of another size. + continue if not platform.is_proven and not (path_only and platform.local_path): continue by_slot.setdefault(key, []).append(claim) diff --git a/tests/test_slots.py b/tests/test_slots.py index 132eb4ce..d3afb088 100644 --- a/tests/test_slots.py +++ b/tests/test_slots.py @@ -610,6 +610,38 @@ class TestProvenEvidence(unittest.TestCase): +class AnExactSizeContestsAnotherSize(unittest.TestCase): + """System.dat pinned the 2 KiB X1 font as xmil/IPLROM.X1T, where xmil + reads a 32 KiB Turbo IPL; the profile's name-only claim could not + contest it, and RetroArch packs shipped the font as the IPL.""" + + def setUp(self): + import tempfile + + self._tmp = tempfile.TemporaryDirectory() + self.addCleanup(self._tmp.cleanup) + root = Path(self._tmp.name) + self.ipl = root / "IPLROM.X1T" + self.ipl.write_bytes(b"i" * 32768) + self.font = root / "FNT0808.X1" + self.font.write_bytes(b"f" * 2048) + + def test_a_held_copy_of_the_declared_size_proves_the_claim(self): + entry = {"name": "IPLROM.X1T", "size": 32768} + self.assertTrue(slots._size_the_code_reads(entry, str(self.ipl))) + self.assertFalse(slots._size_the_code_reads(entry, str(self.font))) + self.assertTrue(slots.Claim("profile", "d", "n", status=slots.SIZE_EXACT).is_proven) + + def test_retroarch_ships_the_turbo_ipl(self): + import json as _json + + manifest = _json.loads( + (Path(__file__).resolve().parents[1] / "install" / "retroarch.json").read_text() + ) + entry = next(f for f in manifest["files"] if f["dest"] == "xmil/IPLROM.X1T") + self.assertEqual(entry["size"], 32768) + + class ManifestFollowsTheArbitration(unittest.TestCase): """The installer is handed the file the ZIP carries on a contested slot."""