diff --git a/.gitignore b/.gitignore index e9a99e37..f7774f60 100644 --- a/.gitignore +++ b/.gitignore @@ -49,9 +49,9 @@ bios/Nintendo/Nintendo DSi/DSi_Nand_KOR.bin bios/Nintendo/Nintendo DSi/dsi_nand.bin # QEMU EDK2 firmware (64MB each) -bios/QEMU/edk2-aarch64-code.fd -bios/QEMU/edk2-arm-code.fd -bios/QEMU/edk2-arm-vars.fd +bios/QEMU/QEMU/edk2-aarch64-code.fd +bios/QEMU/QEMU/edk2-arm-code.fd +bios/QEMU/QEMU/edk2-arm-vars.fd # ScummVM data bundle (79MB, fetched from large-files release) bios/ScummVM/scummvm.zip diff --git a/bios/Arcade/FBAlpha 2012/samples/dkong.zip b/bios/Arcade/fba2012/samples/dkong.zip similarity index 100% rename from bios/Arcade/FBAlpha 2012/samples/dkong.zip rename to bios/Arcade/fba2012/samples/dkong.zip diff --git a/bios/Arcade/FBAlpha 2012/samples/dkongjr.zip b/bios/Arcade/fba2012/samples/dkongjr.zip similarity index 100% rename from bios/Arcade/FBAlpha 2012/samples/dkongjr.zip rename to bios/Arcade/fba2012/samples/dkongjr.zip diff --git a/bios/Arcade/FBAlpha 2012/samples/galaga.zip b/bios/Arcade/fba2012/samples/galaga.zip similarity index 100% rename from bios/Arcade/FBAlpha 2012/samples/galaga.zip rename to bios/Arcade/fba2012/samples/galaga.zip diff --git a/bios/QEMU/MacROM.bin b/bios/QEMU/QEMU/MacROM.bin similarity index 100% rename from bios/QEMU/MacROM.bin rename to bios/QEMU/QEMU/MacROM.bin diff --git a/bios/QEMU/QEMU,cgthree.bin b/bios/QEMU/QEMU/QEMU,cgthree.bin similarity index 100% rename from bios/QEMU/QEMU,cgthree.bin rename to bios/QEMU/QEMU/QEMU,cgthree.bin diff --git a/bios/QEMU/QEMU,tcx.bin b/bios/QEMU/QEMU/QEMU,tcx.bin similarity index 100% rename from bios/QEMU/QEMU,tcx.bin rename to bios/QEMU/QEMU/QEMU,tcx.bin diff --git a/bios/QEMU/ast27x0_bootrom.bin b/bios/QEMU/QEMU/ast27x0_bootrom.bin similarity index 100% rename from bios/QEMU/ast27x0_bootrom.bin rename to bios/QEMU/QEMU/ast27x0_bootrom.bin diff --git a/bios/QEMU/bamboo.dtb b/bios/QEMU/QEMU/bamboo.dtb similarity index 100% rename from bios/QEMU/bamboo.dtb rename to bios/QEMU/QEMU/bamboo.dtb diff --git a/bios/QEMU/bios-256k.bin b/bios/QEMU/QEMU/bios-256k.bin similarity index 100% rename from bios/QEMU/bios-256k.bin rename to bios/QEMU/QEMU/bios-256k.bin diff --git a/bios/QEMU/bios-microvm.bin b/bios/QEMU/QEMU/bios-microvm.bin similarity index 100% rename from bios/QEMU/bios-microvm.bin rename to bios/QEMU/QEMU/bios-microvm.bin diff --git a/bios/QEMU/bios.bin b/bios/QEMU/QEMU/bios.bin similarity index 100% rename from bios/QEMU/bios.bin rename to bios/QEMU/QEMU/bios.bin diff --git a/bios/QEMU/bios_loongson3.bin b/bios/QEMU/QEMU/bios_loongson3.bin similarity index 100% rename from bios/QEMU/bios_loongson3.bin rename to bios/QEMU/QEMU/bios_loongson3.bin diff --git a/bios/QEMU/canon-a1100-rom1.bin b/bios/QEMU/QEMU/canon-a1100-rom1.bin similarity index 100% rename from bios/QEMU/canon-a1100-rom1.bin rename to bios/QEMU/QEMU/canon-a1100-rom1.bin diff --git a/bios/QEMU/canyonlands.dtb b/bios/QEMU/QEMU/canyonlands.dtb similarity index 100% rename from bios/QEMU/canyonlands.dtb rename to bios/QEMU/QEMU/canyonlands.dtb diff --git a/bios/QEMU/edk2-i386-code.fd b/bios/QEMU/QEMU/edk2-i386-code.fd similarity index 100% rename from bios/QEMU/edk2-i386-code.fd rename to bios/QEMU/QEMU/edk2-i386-code.fd diff --git a/bios/QEMU/edk2-i386-secure-code.fd b/bios/QEMU/QEMU/edk2-i386-secure-code.fd similarity index 100% rename from bios/QEMU/edk2-i386-secure-code.fd rename to bios/QEMU/QEMU/edk2-i386-secure-code.fd diff --git a/bios/QEMU/edk2-i386-vars.fd b/bios/QEMU/QEMU/edk2-i386-vars.fd similarity index 100% rename from bios/QEMU/edk2-i386-vars.fd rename to bios/QEMU/QEMU/edk2-i386-vars.fd diff --git a/bios/QEMU/edk2-riscv-code.fd b/bios/QEMU/QEMU/edk2-riscv-code.fd similarity index 100% rename from bios/QEMU/edk2-riscv-code.fd rename to bios/QEMU/QEMU/edk2-riscv-code.fd diff --git a/bios/QEMU/edk2-riscv-vars.fd b/bios/QEMU/QEMU/edk2-riscv-vars.fd similarity index 100% rename from bios/QEMU/edk2-riscv-vars.fd rename to bios/QEMU/QEMU/edk2-riscv-vars.fd diff --git a/bios/QEMU/edk2-x86_64-code.fd b/bios/QEMU/QEMU/edk2-x86_64-code.fd similarity index 100% rename from bios/QEMU/edk2-x86_64-code.fd rename to bios/QEMU/QEMU/edk2-x86_64-code.fd diff --git a/bios/QEMU/edk2-x86_64-secure-code.fd b/bios/QEMU/QEMU/edk2-x86_64-secure-code.fd similarity index 100% rename from bios/QEMU/edk2-x86_64-secure-code.fd rename to bios/QEMU/QEMU/edk2-x86_64-secure-code.fd diff --git a/bios/QEMU/efi-e1000.rom b/bios/QEMU/QEMU/efi-e1000.rom similarity index 100% rename from bios/QEMU/efi-e1000.rom rename to bios/QEMU/QEMU/efi-e1000.rom diff --git a/bios/QEMU/efi-e1000e.rom b/bios/QEMU/QEMU/efi-e1000e.rom similarity index 100% rename from bios/QEMU/efi-e1000e.rom rename to bios/QEMU/QEMU/efi-e1000e.rom diff --git a/bios/QEMU/efi-eepro100.rom b/bios/QEMU/QEMU/efi-eepro100.rom similarity index 100% rename from bios/QEMU/efi-eepro100.rom rename to bios/QEMU/QEMU/efi-eepro100.rom diff --git a/bios/QEMU/efi-ne2k_pci.rom b/bios/QEMU/QEMU/efi-ne2k_pci.rom similarity index 100% rename from bios/QEMU/efi-ne2k_pci.rom rename to bios/QEMU/QEMU/efi-ne2k_pci.rom diff --git a/bios/QEMU/efi-pcnet.rom b/bios/QEMU/QEMU/efi-pcnet.rom similarity index 100% rename from bios/QEMU/efi-pcnet.rom rename to bios/QEMU/QEMU/efi-pcnet.rom diff --git a/bios/QEMU/efi-rtl8139.rom b/bios/QEMU/QEMU/efi-rtl8139.rom similarity index 100% rename from bios/QEMU/efi-rtl8139.rom rename to bios/QEMU/QEMU/efi-rtl8139.rom diff --git a/bios/QEMU/efi-virtio.rom b/bios/QEMU/QEMU/efi-virtio.rom similarity index 100% rename from bios/QEMU/efi-virtio.rom rename to bios/QEMU/QEMU/efi-virtio.rom diff --git a/bios/QEMU/efi-vmxnet3.rom b/bios/QEMU/QEMU/efi-vmxnet3.rom similarity index 100% rename from bios/QEMU/efi-vmxnet3.rom rename to bios/QEMU/QEMU/efi-vmxnet3.rom diff --git a/bios/QEMU/hppa-firmware.img b/bios/QEMU/QEMU/hppa-firmware.img similarity index 100% rename from bios/QEMU/hppa-firmware.img rename to bios/QEMU/QEMU/hppa-firmware.img diff --git a/bios/QEMU/hppa-firmware64.img b/bios/QEMU/QEMU/hppa-firmware64.img similarity index 100% rename from bios/QEMU/hppa-firmware64.img rename to bios/QEMU/QEMU/hppa-firmware64.img diff --git a/bios/QEMU/kvmvapic.bin b/bios/QEMU/QEMU/kvmvapic.bin similarity index 100% rename from bios/QEMU/kvmvapic.bin rename to bios/QEMU/QEMU/kvmvapic.bin diff --git a/bios/QEMU/linuxboot.bin b/bios/QEMU/QEMU/linuxboot.bin similarity index 100% rename from bios/QEMU/linuxboot.bin rename to bios/QEMU/QEMU/linuxboot.bin diff --git a/bios/QEMU/linuxboot_dma.bin b/bios/QEMU/QEMU/linuxboot_dma.bin similarity index 100% rename from bios/QEMU/linuxboot_dma.bin rename to bios/QEMU/QEMU/linuxboot_dma.bin diff --git a/bios/QEMU/mips_bios.bin b/bios/QEMU/QEMU/mips_bios.bin similarity index 100% rename from bios/QEMU/mips_bios.bin rename to bios/QEMU/QEMU/mips_bios.bin diff --git a/bios/QEMU/mipsel_bios.bin b/bios/QEMU/QEMU/mipsel_bios.bin similarity index 100% rename from bios/QEMU/mipsel_bios.bin rename to bios/QEMU/QEMU/mipsel_bios.bin diff --git a/bios/QEMU/multiboot.bin b/bios/QEMU/QEMU/multiboot.bin similarity index 100% rename from bios/QEMU/multiboot.bin rename to bios/QEMU/QEMU/multiboot.bin diff --git a/bios/QEMU/multiboot_dma.bin b/bios/QEMU/QEMU/multiboot_dma.bin similarity index 100% rename from bios/QEMU/multiboot_dma.bin rename to bios/QEMU/QEMU/multiboot_dma.bin diff --git a/bios/QEMU/npcm7xx_bootrom.bin b/bios/QEMU/QEMU/npcm7xx_bootrom.bin similarity index 100% rename from bios/QEMU/npcm7xx_bootrom.bin rename to bios/QEMU/QEMU/npcm7xx_bootrom.bin diff --git a/bios/QEMU/npcm8xx_bootrom.bin b/bios/QEMU/QEMU/npcm8xx_bootrom.bin similarity index 100% rename from bios/QEMU/npcm8xx_bootrom.bin rename to bios/QEMU/QEMU/npcm8xx_bootrom.bin diff --git a/bios/QEMU/openbios-ppc b/bios/QEMU/QEMU/openbios-ppc similarity index 100% rename from bios/QEMU/openbios-ppc rename to bios/QEMU/QEMU/openbios-ppc diff --git a/bios/QEMU/openbios-sparc32 b/bios/QEMU/QEMU/openbios-sparc32 similarity index 100% rename from bios/QEMU/openbios-sparc32 rename to bios/QEMU/QEMU/openbios-sparc32 diff --git a/bios/QEMU/openbios-sparc64 b/bios/QEMU/QEMU/openbios-sparc64 similarity index 100% rename from bios/QEMU/openbios-sparc64 rename to bios/QEMU/QEMU/openbios-sparc64 diff --git a/bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin b/bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin similarity index 100% rename from bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin rename to bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin diff --git a/bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin b/bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin similarity index 100% rename from bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin rename to bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin diff --git a/bios/QEMU/palcode-clipper b/bios/QEMU/QEMU/palcode-clipper similarity index 100% rename from bios/QEMU/palcode-clipper rename to bios/QEMU/QEMU/palcode-clipper diff --git a/bios/QEMU/pegasos2.dtb b/bios/QEMU/QEMU/pegasos2.dtb similarity index 100% rename from bios/QEMU/pegasos2.dtb rename to bios/QEMU/QEMU/pegasos2.dtb diff --git a/bios/QEMU/petalogix-ml605.dtb b/bios/QEMU/QEMU/petalogix-ml605.dtb similarity index 100% rename from bios/QEMU/petalogix-ml605.dtb rename to bios/QEMU/QEMU/petalogix-ml605.dtb diff --git a/bios/QEMU/petalogix-s3adsp1800.dtb b/bios/QEMU/QEMU/petalogix-s3adsp1800.dtb similarity index 100% rename from bios/QEMU/petalogix-s3adsp1800.dtb rename to bios/QEMU/QEMU/petalogix-s3adsp1800.dtb diff --git a/bios/QEMU/pmon_2e.bin b/bios/QEMU/QEMU/pmon_2e.bin similarity index 100% rename from bios/QEMU/pmon_2e.bin rename to bios/QEMU/QEMU/pmon_2e.bin diff --git a/bios/QEMU/pnv-pnor.bin b/bios/QEMU/QEMU/pnv-pnor.bin similarity index 100% rename from bios/QEMU/pnv-pnor.bin rename to bios/QEMU/QEMU/pnv-pnor.bin diff --git a/bios/QEMU/pvh.bin b/bios/QEMU/QEMU/pvh.bin similarity index 100% rename from bios/QEMU/pvh.bin rename to bios/QEMU/QEMU/pvh.bin diff --git a/bios/QEMU/pxe-e1000.rom b/bios/QEMU/QEMU/pxe-e1000.rom similarity index 100% rename from bios/QEMU/pxe-e1000.rom rename to bios/QEMU/QEMU/pxe-e1000.rom diff --git a/bios/QEMU/pxe-eepro100.rom b/bios/QEMU/QEMU/pxe-eepro100.rom similarity index 100% rename from bios/QEMU/pxe-eepro100.rom rename to bios/QEMU/QEMU/pxe-eepro100.rom diff --git a/bios/QEMU/pxe-ne2k_pci.rom b/bios/QEMU/QEMU/pxe-ne2k_pci.rom similarity index 100% rename from bios/QEMU/pxe-ne2k_pci.rom rename to bios/QEMU/QEMU/pxe-ne2k_pci.rom diff --git a/bios/QEMU/pxe-pcnet.rom b/bios/QEMU/QEMU/pxe-pcnet.rom similarity index 100% rename from bios/QEMU/pxe-pcnet.rom rename to bios/QEMU/QEMU/pxe-pcnet.rom diff --git a/bios/QEMU/pxe-rtl8139.rom b/bios/QEMU/QEMU/pxe-rtl8139.rom similarity index 100% rename from bios/QEMU/pxe-rtl8139.rom rename to bios/QEMU/QEMU/pxe-rtl8139.rom diff --git a/bios/QEMU/pxe-virtio.rom b/bios/QEMU/QEMU/pxe-virtio.rom similarity index 100% rename from bios/QEMU/pxe-virtio.rom rename to bios/QEMU/QEMU/pxe-virtio.rom diff --git a/bios/QEMU/qboot.rom b/bios/QEMU/QEMU/qboot.rom similarity index 100% rename from bios/QEMU/qboot.rom rename to bios/QEMU/QEMU/qboot.rom diff --git a/bios/QEMU/qemu_vga.ndrv b/bios/QEMU/QEMU/qemu_vga.ndrv similarity index 100% rename from bios/QEMU/qemu_vga.ndrv rename to bios/QEMU/QEMU/qemu_vga.ndrv diff --git a/bios/QEMU/s390-ccw.img b/bios/QEMU/QEMU/s390-ccw.img similarity index 100% rename from bios/QEMU/s390-ccw.img rename to bios/QEMU/QEMU/s390-ccw.img diff --git a/bios/QEMU/s390-netboot.img b/bios/QEMU/QEMU/s390-netboot.img similarity index 100% rename from bios/QEMU/s390-netboot.img rename to bios/QEMU/QEMU/s390-netboot.img diff --git a/bios/QEMU/skiboot.lid b/bios/QEMU/QEMU/skiboot.lid similarity index 100% rename from bios/QEMU/skiboot.lid rename to bios/QEMU/QEMU/skiboot.lid diff --git a/bios/QEMU/slof.bin b/bios/QEMU/QEMU/slof.bin similarity index 100% rename from bios/QEMU/slof.bin rename to bios/QEMU/QEMU/slof.bin diff --git a/bios/QEMU/u-boot-sam460-20100605.bin b/bios/QEMU/QEMU/u-boot-sam460-20100605.bin similarity index 100% rename from bios/QEMU/u-boot-sam460-20100605.bin rename to bios/QEMU/QEMU/u-boot-sam460-20100605.bin diff --git a/bios/QEMU/u-boot.bin b/bios/QEMU/QEMU/u-boot.bin similarity index 100% rename from bios/QEMU/u-boot.bin rename to bios/QEMU/QEMU/u-boot.bin diff --git a/bios/QEMU/u-boot.e500 b/bios/QEMU/QEMU/u-boot.e500 similarity index 100% rename from bios/QEMU/u-boot.e500 rename to bios/QEMU/QEMU/u-boot.e500 diff --git a/bios/QEMU/vgabios-ati.bin b/bios/QEMU/QEMU/vgabios-ati.bin similarity index 100% rename from bios/QEMU/vgabios-ati.bin rename to bios/QEMU/QEMU/vgabios-ati.bin diff --git a/bios/QEMU/vgabios-bochs-display.bin b/bios/QEMU/QEMU/vgabios-bochs-display.bin similarity index 100% rename from bios/QEMU/vgabios-bochs-display.bin rename to bios/QEMU/QEMU/vgabios-bochs-display.bin diff --git a/bios/QEMU/vgabios-cirrus.bin b/bios/QEMU/QEMU/vgabios-cirrus.bin similarity index 100% rename from bios/QEMU/vgabios-cirrus.bin rename to bios/QEMU/QEMU/vgabios-cirrus.bin diff --git a/bios/QEMU/vgabios-qxl.bin b/bios/QEMU/QEMU/vgabios-qxl.bin similarity index 100% rename from bios/QEMU/vgabios-qxl.bin rename to bios/QEMU/QEMU/vgabios-qxl.bin diff --git a/bios/QEMU/vgabios-ramfb.bin b/bios/QEMU/QEMU/vgabios-ramfb.bin similarity index 100% rename from bios/QEMU/vgabios-ramfb.bin rename to bios/QEMU/QEMU/vgabios-ramfb.bin diff --git a/bios/QEMU/vgabios-stdvga.bin b/bios/QEMU/QEMU/vgabios-stdvga.bin similarity index 100% rename from bios/QEMU/vgabios-stdvga.bin rename to bios/QEMU/QEMU/vgabios-stdvga.bin diff --git a/bios/QEMU/vgabios-virtio.bin b/bios/QEMU/QEMU/vgabios-virtio.bin similarity index 100% rename from bios/QEMU/vgabios-virtio.bin rename to bios/QEMU/QEMU/vgabios-virtio.bin diff --git a/bios/QEMU/vgabios-vmware.bin b/bios/QEMU/QEMU/vgabios-vmware.bin similarity index 100% rename from bios/QEMU/vgabios-vmware.bin rename to bios/QEMU/QEMU/vgabios-vmware.bin diff --git a/bios/QEMU/vgabios.bin b/bios/QEMU/QEMU/vgabios.bin similarity index 100% rename from bios/QEMU/vgabios.bin rename to bios/QEMU/QEMU/vgabios.bin diff --git a/bios/QEMU/virtex-ml507.dtb b/bios/QEMU/QEMU/virtex-ml507.dtb similarity index 100% rename from bios/QEMU/virtex-ml507.dtb rename to bios/QEMU/QEMU/virtex-ml507.dtb diff --git a/bios/QEMU/vof-nvram.bin b/bios/QEMU/QEMU/vof-nvram.bin similarity index 100% rename from bios/QEMU/vof-nvram.bin rename to bios/QEMU/QEMU/vof-nvram.bin diff --git a/bios/QEMU/vof.bin b/bios/QEMU/QEMU/vof.bin similarity index 100% rename from bios/QEMU/vof.bin rename to bios/QEMU/QEMU/vof.bin diff --git a/bios/Roland/CM32L_CONTROL.ROM b/bios/Roland/CM-32L/CM32L_CONTROL.ROM similarity index 100% rename from bios/Roland/CM32L_CONTROL.ROM rename to bios/Roland/CM-32L/CM32L_CONTROL.ROM diff --git a/bios/Roland/CM32L_PCM.ROM b/bios/Roland/CM-32L/CM32L_PCM.ROM similarity index 100% rename from bios/Roland/CM32L_PCM.ROM rename to bios/Roland/CM-32L/CM32L_PCM.ROM diff --git a/bios/Roland/MT32_CONTROL.ROM b/bios/Roland/MT-32/MT32_CONTROL.ROM similarity index 100% rename from bios/Roland/MT32_CONTROL.ROM rename to bios/Roland/MT-32/MT32_CONTROL.ROM diff --git a/bios/Roland/MT32_PCM.ROM b/bios/Roland/MT-32/MT32_PCM.ROM similarity index 100% rename from bios/Roland/MT32_PCM.ROM rename to bios/Roland/MT-32/MT32_PCM.ROM diff --git a/bios/Microsoft/Chihiro/cerbios.bin b/bios/Sega/Chihiro/cerbios.bin similarity index 100% rename from bios/Microsoft/Chihiro/cerbios.bin rename to bios/Sega/Chihiro/cerbios.bin diff --git a/bios/Oric/Oric/8dos2.rom b/bios/Tangerine/Oric/8dos2.rom similarity index 100% rename from bios/Oric/Oric/8dos2.rom rename to bios/Tangerine/Oric/8dos2.rom diff --git a/bios/Oric/Oric/Bas122de.pch b/bios/Tangerine/Oric/Bas122de.pch similarity index 100% rename from bios/Oric/Oric/Bas122de.pch rename to bios/Tangerine/Oric/Bas122de.pch diff --git a/bios/Oric/Oric/Bas122fr.pch b/bios/Tangerine/Oric/Bas122fr.pch similarity index 100% rename from bios/Oric/Oric/Bas122fr.pch rename to bios/Tangerine/Oric/Bas122fr.pch diff --git a/bios/Oric/Oric/Bas122uk.pch b/bios/Tangerine/Oric/Bas122uk.pch similarity index 100% rename from bios/Oric/Oric/Bas122uk.pch rename to bios/Tangerine/Oric/Bas122uk.pch diff --git a/bios/Oric/Oric/Oric/colour.rom b/bios/Tangerine/Oric/Oric/colour.rom similarity index 100% rename from bios/Oric/Oric/Oric/colour.rom rename to bios/Tangerine/Oric/Oric/colour.rom diff --git a/bios/Oric/Oric/basic10.pch b/bios/Tangerine/Oric/basic10.pch similarity index 100% rename from bios/Oric/Oric/basic10.pch rename to bios/Tangerine/Oric/basic10.pch diff --git a/bios/Oric/Oric/basic10.rom b/bios/Tangerine/Oric/basic10.rom similarity index 100% rename from bios/Oric/Oric/basic10.rom rename to bios/Tangerine/Oric/basic10.rom diff --git a/bios/Oric/Oric/basic11b.rom b/bios/Tangerine/Oric/basic11b.rom similarity index 100% rename from bios/Oric/Oric/basic11b.rom rename to bios/Tangerine/Oric/basic11b.rom diff --git a/bios/Oric/Oric/bd500.rom b/bios/Tangerine/Oric/bd500.rom similarity index 100% rename from bios/Oric/Oric/bd500.rom rename to bios/Tangerine/Oric/bd500.rom diff --git a/bios/Oric/Oric/empty_orix.rom b/bios/Tangerine/Oric/empty_orix.rom similarity index 100% rename from bios/Oric/Oric/empty_orix.rom rename to bios/Tangerine/Oric/empty_orix.rom diff --git a/bios/Oric/Oric/hyperbas.rom b/bios/Tangerine/Oric/hyperbas.rom similarity index 100% rename from bios/Oric/Oric/hyperbas.rom rename to bios/Tangerine/Oric/hyperbas.rom diff --git a/bios/Oric/Oric/jasmin.rom b/bios/Tangerine/Oric/jasmin.rom similarity index 100% rename from bios/Oric/Oric/jasmin.rom rename to bios/Tangerine/Oric/jasmin.rom diff --git a/bios/Oric/Oric/kernel.rom b/bios/Tangerine/Oric/kernel.rom similarity index 100% rename from bios/Oric/Oric/kernel.rom rename to bios/Tangerine/Oric/kernel.rom diff --git a/bios/Oric/Oric/microdis.rom b/bios/Tangerine/Oric/microdis.rom similarity index 100% rename from bios/Oric/Oric/microdis.rom rename to bios/Tangerine/Oric/microdis.rom diff --git a/bios/Oric/Oric/pravetz.rom b/bios/Tangerine/Oric/pravetz.rom similarity index 100% rename from bios/Oric/Oric/pravetz.rom rename to bios/Tangerine/Oric/pravetz.rom diff --git a/bios/Oric/Oric/pravetzt.pch b/bios/Tangerine/Oric/pravetzt.pch similarity index 100% rename from bios/Oric/Oric/pravetzt.pch rename to bios/Tangerine/Oric/pravetzt.pch diff --git a/bios/Oric/Oric/pravetzt.rom b/bios/Tangerine/Oric/pravetzt.rom similarity index 100% rename from bios/Oric/Oric/pravetzt.rom rename to bios/Tangerine/Oric/pravetzt.rom diff --git a/bios/Oric/Oric/shell.rom b/bios/Tangerine/Oric/shell.rom similarity index 100% rename from bios/Oric/Oric/shell.rom rename to bios/Tangerine/Oric/shell.rom diff --git a/bios/Oric/Oric/teleass.rom b/bios/Tangerine/Oric/teleass.rom similarity index 100% rename from bios/Oric/Oric/teleass.rom rename to bios/Tangerine/Oric/teleass.rom diff --git a/bios/Oric/Oric/telmatic.rom b/bios/Tangerine/Oric/telmatic.rom similarity index 100% rename from bios/Oric/Oric/telmatic.rom rename to bios/Tangerine/Oric/telmatic.rom diff --git a/bios/Oric/Oric/telmon24.pch b/bios/Tangerine/Oric/telmon24.pch similarity index 100% rename from bios/Oric/Oric/telmon24.pch rename to bios/Tangerine/Oric/telmon24.pch diff --git a/bios/Oric/Oric/telmon24.rom b/bios/Tangerine/Oric/telmon24.rom similarity index 100% rename from bios/Oric/Oric/telmon24.rom rename to bios/Tangerine/Oric/telmon24.rom diff --git a/database.json b/database.json index 9508bef9..520d0bc1 100644 --- a/database.json +++ b/database.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "generated_at": "2026-10-23T07:43:10Z", + "generated_at": "2026-10-23T12:47:02Z", "total_files": 19711, "total_size": 16808555694, "bios_dir": "bios", @@ -10294,36 +10294,6 @@ "crc32": "732f8208", "adler32": "fd717083" }, - "764ec667084bc237c1de6bd1db7541ad8cb59975": { - "path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", - "name": "dkong.zip", - "size": 29270, - "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", - "md5": "a93ed3e9468576c03528bceec8a6236a", - "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", - "crc32": "ff2dc92e", - "adler32": "8783efdf" - }, - "2725373cc8e6e3c04bca4bf7bd0b027be6bec058": { - "path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", - "name": "dkongjr.zip", - "size": 300220, - "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", - "md5": "c2428525597a69fc71621e0cdf114619", - "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", - "crc32": "8e243fa9", - "adler32": "876c8eb3" - }, - "9e52cc30850cf9e1855fbd2e26f987cbc05b910a": { - "path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", - "name": "galaga.zip", - "size": 243090, - "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", - "md5": "40b8624b7a72c782998e52a0782b69e2", - "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", - "crc32": "e37c02b4", - "adler32": "54e4596a" - }, "1bef29ccc16eeb2e3c0759bfd2a4f86b1aba03a7": { "path": "bios/Arcade/FBNeo/.variants/hiscore.dat.37fc4e05", "name": "hiscore.dat", @@ -31555,6 +31525,26 @@ "crc32": "c4c96c52", "adler32": "01a73180" }, + "764ec667084bc237c1de6bd1db7541ad8cb59975": { + "path": "bios/Arcade/fba2012/samples/dkong.zip", + "name": "dkong.zip", + "size": 29270, + "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", + "md5": "a93ed3e9468576c03528bceec8a6236a", + "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", + "crc32": "ff2dc92e", + "adler32": "8783efdf" + }, + "2725373cc8e6e3c04bca4bf7bd0b027be6bec058": { + "path": "bios/Arcade/fba2012/samples/dkongjr.zip", + "name": "dkongjr.zip", + "size": 300220, + "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", + "md5": "c2428525597a69fc71621e0cdf114619", + "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", + "crc32": "8e243fa9", + "adler32": "876c8eb3" + }, "cdb09d3ffaa867ff9e7387cf1934e9011565d546": { "path": "bios/Arcade/fba2012/samples/fireshrk.zip", "name": "fireshrk.zip", @@ -31565,6 +31555,16 @@ "crc32": "37c6b3d0", "adler32": "907cbc85" }, + "9e52cc30850cf9e1855fbd2e26f987cbc05b910a": { + "path": "bios/Arcade/fba2012/samples/galaga.zip", + "name": "galaga.zip", + "size": 243090, + "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", + "md5": "40b8624b7a72c782998e52a0782b69e2", + "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", + "crc32": "e37c02b4", + "adler32": "54e4596a" + }, "11ab10d51b27594f71336dd6d83ef30cd2742e6e": { "path": "bios/Arcade/fba2012/samples/ghox.zip", "name": "ghox.zip", @@ -127315,16 +127315,6 @@ } } }, - "5996972d3e033f6c525c1988c563b4ffe4c58f22": { - "path": "bios/Microsoft/Chihiro/cerbios.bin", - "name": "cerbios.bin", - "size": 262144, - "sha1": "5996972d3e033f6c525c1988c563b4ffe4c58f22", - "md5": "f23d7e00ae8fbf88908ed1f9165f35eb", - "sha256": "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958", - "crc32": "a73a4d20", - "adler32": "8c41bfd4" - }, "bf5fb954db868e523febccc68549ed9187961076": { "path": "bios/Microsoft/MSX/.variants/CARTS.SHA.bf5fb954", "name": "CARTS.SHA", @@ -134853,216 +134843,6 @@ "crc32": "343a0710", "adler32": "328b8b49" }, - "746a2996967282281a980842a93642ad7d740f9e": { - "path": "bios/Oric/Oric/8dos2.rom", - "name": "8dos2.rom", - "size": 512, - "sha1": "746a2996967282281a980842a93642ad7d740f9e", - "md5": "5f3cd5a4307fed7a9dfe8faa4c044273", - "sha256": "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6", - "crc32": "efc88d2b", - "adler32": "82ebe76f" - }, - "3e8f851df9319891fb9849c922437468df98915d": { - "path": "bios/Oric/Oric/Bas122de.pch", - "name": "Bas122de.pch", - "size": 2037, - "sha1": "3e8f851df9319891fb9849c922437468df98915d", - "md5": "80fe771abf403e67f5640b2107c375c9", - "sha256": "cf3d0e680a362084aadb184a4a57a35432e5af885aa2f7838578e3116fb57c2e", - "crc32": "bfaaa640", - "adler32": "20bea5df" - }, - "c92aa5e5fedf94a01519867fd8235f33731b8191": { - "path": "bios/Oric/Oric/Bas122fr.pch", - "name": "Bas122fr.pch", - "size": 2037, - "sha1": "c92aa5e5fedf94a01519867fd8235f33731b8191", - "md5": "61e9414a2c0e2f71b5a25233506b4bf3", - "sha256": "52d5bda9d4624da09a6efa8a9fe1c956e602ead506822f205486e915e9ba88a7", - "crc32": "169dc64a", - "adler32": "c207a5d1" - }, - "ee9dc592128ff337be5ef0bfb6d059752296b445": { - "path": "bios/Oric/Oric/Bas122uk.pch", - "name": "Bas122uk.pch", - "size": 2037, - "sha1": "ee9dc592128ff337be5ef0bfb6d059752296b445", - "md5": "120a23e1566195050983764e7d4543ce", - "sha256": "a5340b6e01719a736a328cfff3a7449ddf77f76f138b07024648b6fcf15368de", - "crc32": "3a0be9f6", - "adler32": "1a00a5de" - }, - "bda81f64be319d8793d284bf9d40f01d19b33515": { - "path": "bios/Oric/Oric/Oric/colour.rom", - "name": "colour.rom", - "size": 128, - "sha1": "bda81f64be319d8793d284bf9d40f01d19b33515", - "md5": "c888b36bf0fc222c3585c3fabe556d21", - "sha256": "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293", - "crc32": "d50fca65", - "adler32": "e82c1d5b" - }, - "6c62326403ecdf3d120fa7ffea47f4f1d5b40020": { - "path": "bios/Oric/Oric/basic10.pch", - "name": "basic10.pch", - "size": 2016, - "sha1": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", - "md5": "c3944a435cc249196db09290aa17e9cf", - "sha256": "2152eafd6573626b7467402838352d4cfbf22f43b4f9940eee7048aea7098dc1", - "crc32": "801dea4e", - "adler32": "8baea102" - }, - "333116e6884d85aaa4dfc7578a91cceeea66d016": { - "path": "bios/Oric/Oric/basic10.rom", - "name": "basic10.rom", - "size": 16384, - "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", - "md5": "ebe418ec8a6c85d5ac32956c9a96c179", - "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", - "crc32": "f18710b4", - "adler32": "7c6b1a61" - }, - "9451a1a09d8f75944dbd6f91193fc360f1de80ac": { - "path": "bios/Oric/Oric/basic11b.rom", - "name": "basic11b.rom", - "size": 16384, - "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", - "md5": "a330779c42ad7d0c4ac6ef9e92788ec6", - "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", - "crc32": "c3a92bef", - "adler32": "4d981bd9" - }, - "447975ed022379fb6b80a22fa37c2d188ca3aa88": { - "path": "bios/Oric/Oric/bd500.rom", - "name": "bd500.rom", - "size": 8192, - "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", - "md5": "2b6498fd29a0adbf1c529762c02c33ab", - "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", - "crc32": "61952e34", - "adler32": "4d7e15ec" - }, - "e7c32e4f75a58c87de1672e4dbd0794083535a60": { - "path": "bios/Oric/Oric/empty_orix.rom", - "name": "empty_orix.rom", - "size": 16384, - "sha1": "e7c32e4f75a58c87de1672e4dbd0794083535a60", - "md5": "af3cec316a4960be1c9987599066c792", - "sha256": "d1ca02145bc2d539ed45097712046228caf0e04d591ba4463a0ff2a0dad90f45", - "crc32": "c98b4655", - "adler32": "10b105dc" - }, - "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63": { - "path": "bios/Oric/Oric/hyperbas.rom", - "name": "hyperbas.rom", - "size": 16384, - "sha1": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", - "md5": "364bf095e0dc4222d75354d50b8cddfc", - "sha256": "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6", - "crc32": "1d96ab50", - "adler32": "f69457ec" - }, - "70e59b8abd67092f050462abc6cb5271e4c15f01": { - "path": "bios/Oric/Oric/jasmin.rom", - "name": "jasmin.rom", - "size": 2048, - "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", - "md5": "5136f764a7dbd1352519351fbb53a9f3", - "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", - "crc32": "37220e89", - "adler32": "a9993e51" - }, - "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6": { - "path": "bios/Oric/Oric/kernel.rom", - "name": "kernel.rom", - "size": 16384, - "sha1": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", - "md5": "1d63b6289c7e3566d411cf0682e401bc", - "sha256": "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144", - "crc32": "356231a6", - "adler32": "c1d39847" - }, - "0d2ef6e67322f48f4b7e08d8bbe68827e2074561": { - "path": "bios/Oric/Oric/microdis.rom", - "name": "microdis.rom", - "size": 8192, - "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", - "md5": "df864344d2a2091c3f952bd1c5ce1707", - "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", - "crc32": "a9664a9c", - "adler32": "b4326558" - }, - "7afc276cb118adff72e4f16698f94bf3b2c64146": { - "path": "bios/Oric/Oric/pravetz.rom", - "name": "pravetz.rom", - "size": 16384, - "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", - "md5": "8712a22e7e078de3343667d9fc1f2390", - "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", - "crc32": "58079502", - "adler32": "e5c81c95" - }, - "3dd12d7ba54fee06a7e20dadb2c278a23a17af50": { - "path": "bios/Oric/Oric/pravetzt.pch", - "name": "pravetzt.pch", - "size": 2390, - "sha1": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", - "md5": "eaa5158b07b439faab0db30e357f0af2", - "sha256": "191b5e58d65eee4b2ae74aefd882b0df44d321be6c226349293fad7c10fcdcbf", - "crc32": "46bab02d", - "adler32": "4a13f713" - }, - "926b95e1cb574d4914dbed0681729a7c1a4bc68d": { - "path": "bios/Oric/Oric/shell.rom", - "name": "shell.rom", - "size": 16384, - "sha1": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", - "md5": "642e8504adc72e7c16384dbdc1665fa2", - "sha256": "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8", - "crc32": "8d166635", - "adler32": "a9d0bac9" - }, - "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d": { - "path": "bios/Oric/Oric/teleass.rom", - "name": "teleass.rom", - "size": 16384, - "sha1": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", - "md5": "2324c9cc227c1327a72a667c97ed2990", - "sha256": "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee", - "crc32": "68b0fde6", - "adler32": "a1258c43" - }, - "35f92a0477a88f5cf564971125047ffcfa02ec10": { - "path": "bios/Oric/Oric/telmatic.rom", - "name": "telmatic.rom", - "size": 8192, - "sha1": "35f92a0477a88f5cf564971125047ffcfa02ec10", - "md5": "0a814078410353744e2947a8e9342e4e", - "sha256": "f213042b9b166b443b8a5a336a325ba4a2ae9482db369754932a7b3c802ed980", - "crc32": "94358dc6", - "adler32": "8c7a9749" - }, - "d8ce5b1405b6428969493efeb6f3aa2027c41bdc": { - "path": "bios/Oric/Oric/telmon24.pch", - "name": "telmon24.pch", - "size": 218, - "sha1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", - "md5": "82a22231d402cd3284c698ba16a51d1d", - "sha256": "3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1", - "crc32": "29e86dbc", - "adler32": "32334634" - }, - "86fc8dc0932f983efa199e31ae05a4424772f959": { - "path": "bios/Oric/Oric/telmon24.rom", - "name": "telmon24.rom", - "size": 16384, - "sha1": "86fc8dc0932f983efa199e31ae05a4424772f959", - "md5": "9a432244d9ee4a49e8ddcde64af94e05", - "sha256": "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094", - "crc32": "aa727c5d", - "adler32": "13643247" - }, "451c85c46b92e6ad2ad930f055ccf0fe3049936d": { "path": "bios/Other/Clock Signal/AppleII/scsi.rom", "name": "scsi.rom", @@ -165124,7 +164904,7 @@ "adler32": "9f865ebb" }, "f2a9ce387019bf272c6e3459d961b30f28942ac5": { - "path": "bios/QEMU/MacROM.bin", + "path": "bios/QEMU/QEMU/MacROM.bin", "name": "MacROM.bin", "size": 1048576, "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", @@ -165134,7 +164914,7 @@ "adler32": "e6360545" }, "619b86fb02faf8f682474be3f0653b58015008ba": { - "path": "bios/QEMU/QEMU,cgthree.bin", + "path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "name": "QEMU,cgthree.bin", "size": 850, "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", @@ -165144,7 +164924,7 @@ "adler32": "036bc8fb" }, "5f1792a73ee47d78b2160191ecb2c92f353f93ad": { - "path": "bios/QEMU/QEMU,tcx.bin", + "path": "bios/QEMU/QEMU/QEMU,tcx.bin", "name": "QEMU,tcx.bin", "size": 1402, "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", @@ -165154,7 +164934,7 @@ "adler32": "fb001da8" }, "9dda4cbcc1d3f6d38c10fee3de53b9abd5e47ec0": { - "path": "bios/QEMU/ast27x0_bootrom.bin", + "path": "bios/QEMU/QEMU/ast27x0_bootrom.bin", "name": "ast27x0_bootrom.bin", "size": 28564, "sha1": "9dda4cbcc1d3f6d38c10fee3de53b9abd5e47ec0", @@ -165164,7 +164944,7 @@ "adler32": "452a899b" }, "ebdf1745479f4ec88459bbd9ef16ee1114018508": { - "path": "bios/QEMU/bamboo.dtb", + "path": "bios/QEMU/QEMU/bamboo.dtb", "name": "bamboo.dtb", "size": 3211, "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", @@ -165174,7 +164954,7 @@ "adler32": "caeec677" }, "5fe6078506094333106e6b3f33c7185dea7f0268": { - "path": "bios/QEMU/bios-256k.bin", + "path": "bios/QEMU/QEMU/bios-256k.bin", "name": "bios-256k.bin", "size": 262144, "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", @@ -165184,7 +164964,7 @@ "adler32": "c2dd4a56" }, "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257": { - "path": "bios/QEMU/bios-microvm.bin", + "path": "bios/QEMU/QEMU/bios-microvm.bin", "name": "bios-microvm.bin", "size": 131072, "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", @@ -165194,7 +164974,7 @@ "adler32": "0b74f3f0" }, "f402170ee4f374c304a7ce0b139d6cecb1732aff": { - "path": "bios/QEMU/bios.bin", + "path": "bios/QEMU/QEMU/bios.bin", "name": "bios.bin", "size": 131072, "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", @@ -165204,7 +164984,7 @@ "adler32": "95b05338" }, "8e99ed6157811282b7570f5f2e13b81a3913497e": { - "path": "bios/QEMU/bios_loongson3.bin", + "path": "bios/QEMU/QEMU/bios_loongson3.bin", "name": "bios_loongson3.bin", "size": 561168, "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", @@ -165214,7 +164994,7 @@ "adler32": "70af376f" }, "3df540b7517f27b3a76e31f193821d04e5805f89": { - "path": "bios/QEMU/canon-a1100-rom1.bin", + "path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "name": "canon-a1100-rom1.bin", "size": 4194304, "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", @@ -165224,7 +165004,7 @@ "adler32": "9810a0e7" }, "8a2fda0b4f23a92eb44776b5d7ffe951987062da": { - "path": "bios/QEMU/canyonlands.dtb", + "path": "bios/QEMU/QEMU/canyonlands.dtb", "name": "canyonlands.dtb", "size": 9779, "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", @@ -165234,7 +165014,7 @@ "adler32": "20f37484" }, "514edbce58bfa877170673c1799351a7dab3b6df": { - "path": "bios/QEMU/edk2-aarch64-code.fd", + "path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "name": "edk2-aarch64-code.fd", "size": 67108864, "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", @@ -165244,7 +165024,7 @@ "adler32": "40bc1dc3" }, "c20f01c28b59b388abb9d0febeec45d801a632f0": { - "path": "bios/QEMU/edk2-arm-code.fd", + "path": "bios/QEMU/QEMU/edk2-arm-code.fd", "name": "edk2-arm-code.fd", "size": 67108864, "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", @@ -165254,7 +165034,7 @@ "adler32": "82f50279" }, "b051167e0e57bd13d77ed92ef7b474872f44ec6d": { - "path": "bios/QEMU/edk2-arm-vars.fd", + "path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "name": "edk2-arm-vars.fd", "size": 67108864, "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", @@ -165264,7 +165044,7 @@ "adler32": "07a25505" }, "45b8faebdfaaf19d16e3a7c5f60d69214685071c": { - "path": "bios/QEMU/edk2-i386-code.fd", + "path": "bios/QEMU/QEMU/edk2-i386-code.fd", "name": "edk2-i386-code.fd", "size": 3653632, "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", @@ -165274,7 +165054,7 @@ "adler32": "40366717" }, "6982abec8ef2ed7c8293163d5a0bd69a01a2126f": { - "path": "bios/QEMU/edk2-i386-secure-code.fd", + "path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "name": "edk2-i386-secure-code.fd", "size": 3653632, "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", @@ -165284,7 +165064,7 @@ "adler32": "a9298ccb" }, "b62e676c9317a32aaa9ee1d76268d8c55663bd6e": { - "path": "bios/QEMU/edk2-i386-vars.fd", + "path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "name": "edk2-i386-vars.fd", "size": 540672, "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", @@ -165294,7 +165074,7 @@ "adler32": "8b83dcdb" }, "2c8633d881ece0c4794d740138a318f7e9af480c": { - "path": "bios/QEMU/edk2-riscv-code.fd", + "path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "name": "edk2-riscv-code.fd", "size": 33554432, "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", @@ -165304,7 +165084,7 @@ "adler32": "63a4c181" }, "c4e6cce4247ba8f32f528c1c69f49228f616677f": { - "path": "bios/QEMU/edk2-riscv-vars.fd", + "path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "name": "edk2-riscv-vars.fd", "size": 33554432, "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", @@ -165314,7 +165094,7 @@ "adler32": "dc1a5505" }, "eac1a94b8e0d7c53fd5df001c36794ec34c7c724": { - "path": "bios/QEMU/edk2-x86_64-code.fd", + "path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "name": "edk2-x86_64-code.fd", "size": 3653632, "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", @@ -165324,7 +165104,7 @@ "adler32": "b542445f" }, "617abe2746696bb4a309d72cecb446dc76a2a61e": { - "path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "name": "edk2-x86_64-secure-code.fd", "size": 3653632, "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", @@ -165334,7 +165114,7 @@ "adler32": "9d7c7175" }, "a3df5fc33ab0190f470b34104ff3c0679cecbab6": { - "path": "bios/QEMU/efi-e1000.rom", + "path": "bios/QEMU/QEMU/efi-e1000.rom", "name": "efi-e1000.rom", "size": 159232, "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", @@ -165344,7 +165124,7 @@ "adler32": "280ff49b" }, "1d37f3ae6748d4deefe9fd5188a2f557bf265d61": { - "path": "bios/QEMU/efi-e1000e.rom", + "path": "bios/QEMU/QEMU/efi-e1000e.rom", "name": "efi-e1000e.rom", "size": 159232, "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", @@ -165354,7 +165134,7 @@ "adler32": "90521649" }, "956d9592fea33374ef0f1900a185b6e1109ea765": { - "path": "bios/QEMU/efi-eepro100.rom", + "path": "bios/QEMU/QEMU/efi-eepro100.rom", "name": "efi-eepro100.rom", "size": 159232, "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", @@ -165364,7 +165144,7 @@ "adler32": "c4244d48" }, "adb7199f545fdb66c325b142c8dbc4cddb99a20d": { - "path": "bios/QEMU/efi-ne2k_pci.rom", + "path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "name": "efi-ne2k_pci.rom", "size": 157696, "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", @@ -165374,7 +165154,7 @@ "adler32": "08f89a5e" }, "9e5a4bb247c6a1777c89117ca091f94342b9046d": { - "path": "bios/QEMU/efi-pcnet.rom", + "path": "bios/QEMU/QEMU/efi-pcnet.rom", "name": "efi-pcnet.rom", "size": 157696, "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", @@ -165384,7 +165164,7 @@ "adler32": "8c51a7bf" }, "99a1e431cc0cb0a78d5803875dfa687e12a947f4": { - "path": "bios/QEMU/efi-rtl8139.rom", + "path": "bios/QEMU/QEMU/efi-rtl8139.rom", "name": "efi-rtl8139.rom", "size": 160768, "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", @@ -165394,7 +165174,7 @@ "adler32": "020e62ee" }, "1596e9b97f0bc8b5ff3e444235690a549ee982c6": { - "path": "bios/QEMU/efi-virtio.rom", + "path": "bios/QEMU/QEMU/efi-virtio.rom", "name": "efi-virtio.rom", "size": 160768, "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", @@ -165404,7 +165184,7 @@ "adler32": "8ce8ce07" }, "6557242402387a6319a0db6abb916ada48e1391c": { - "path": "bios/QEMU/efi-vmxnet3.rom", + "path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "name": "efi-vmxnet3.rom", "size": 156672, "sha1": "6557242402387a6319a0db6abb916ada48e1391c", @@ -165414,7 +165194,7 @@ "adler32": "368193a7" }, "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0": { - "path": "bios/QEMU/hppa-firmware.img", + "path": "bios/QEMU/QEMU/hppa-firmware.img", "name": "hppa-firmware.img", "size": 167820, "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", @@ -165424,7 +165204,7 @@ "adler32": "cfc8d575" }, "b42f6d4ca74073de6c038579b4a9323ad0a6b398": { - "path": "bios/QEMU/hppa-firmware64.img", + "path": "bios/QEMU/QEMU/hppa-firmware64.img", "name": "hppa-firmware64.img", "size": 206024, "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", @@ -165434,7 +165214,7 @@ "adler32": "b4a5cfa1" }, "670c9cc79b4859944705eece710dc332188b79b4": { - "path": "bios/QEMU/kvmvapic.bin", + "path": "bios/QEMU/QEMU/kvmvapic.bin", "name": "kvmvapic.bin", "size": 9216, "sha1": "670c9cc79b4859944705eece710dc332188b79b4", @@ -165444,7 +165224,7 @@ "adler32": "da17ec01" }, "fd19bef7f5647960952520389f448364762ed948": { - "path": "bios/QEMU/linuxboot.bin", + "path": "bios/QEMU/QEMU/linuxboot.bin", "name": "linuxboot.bin", "size": 1024, "sha1": "fd19bef7f5647960952520389f448364762ed948", @@ -165454,7 +165234,7 @@ "adler32": "2ddc6510" }, "0bff50c10727bd9c85c831ea92b7a52699959992": { - "path": "bios/QEMU/linuxboot_dma.bin", + "path": "bios/QEMU/QEMU/linuxboot_dma.bin", "name": "linuxboot_dma.bin", "size": 1536, "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", @@ -165464,7 +165244,7 @@ "adler32": "46702910" }, "358abab78f3bfba72b7b45cb5dd66ce4411e2618": { - "path": "bios/QEMU/mips_bios.bin", + "path": "bios/QEMU/QEMU/mips_bios.bin", "name": "mips_bios.bin", "size": 298835, "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", @@ -165474,7 +165254,7 @@ "adler32": "1f516c85" }, "daa15fb1b8829da5c5bd473243acf19cd0f17a74": { - "path": "bios/QEMU/mipsel_bios.bin", + "path": "bios/QEMU/QEMU/mipsel_bios.bin", "name": "mipsel_bios.bin", "size": 300324, "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", @@ -165484,7 +165264,7 @@ "adler32": "4e362aa7" }, "a8b58ae464fc6fb26799432ae867bf57c546ff80": { - "path": "bios/QEMU/multiboot.bin", + "path": "bios/QEMU/QEMU/multiboot.bin", "name": "multiboot.bin", "size": 1024, "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", @@ -165494,7 +165274,7 @@ "adler32": "d9320a10" }, "32ab1cf336b674bfb154eb7a939a3e3275a92647": { - "path": "bios/QEMU/multiboot_dma.bin", + "path": "bios/QEMU/QEMU/multiboot_dma.bin", "name": "multiboot_dma.bin", "size": 1024, "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", @@ -165504,7 +165284,7 @@ "adler32": "44b92f10" }, "22a75d26a0591d2c7763765b6381fa2f73de43e1": { - "path": "bios/QEMU/npcm7xx_bootrom.bin", + "path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "name": "npcm7xx_bootrom.bin", "size": 768, "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", @@ -165514,7 +165294,7 @@ "adler32": "b604f177" }, "732d7ebd8496debd6455f19db8e1d8d1a8be1f33": { - "path": "bios/QEMU/npcm8xx_bootrom.bin", + "path": "bios/QEMU/QEMU/npcm8xx_bootrom.bin", "name": "npcm8xx_bootrom.bin", "size": 672, "sha1": "732d7ebd8496debd6455f19db8e1d8d1a8be1f33", @@ -165524,7 +165304,7 @@ "adler32": "7eea86ca" }, "0ef5051dcb318c0bc45d1908f8318d6eece8686a": { - "path": "bios/QEMU/openbios-ppc", + "path": "bios/QEMU/QEMU/openbios-ppc", "name": "openbios-ppc", "size": 677196, "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", @@ -165534,7 +165314,7 @@ "adler32": "f515649e" }, "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26": { - "path": "bios/QEMU/openbios-sparc32", + "path": "bios/QEMU/QEMU/openbios-sparc32", "name": "openbios-sparc32", "size": 382080, "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", @@ -165544,7 +165324,7 @@ "adler32": "9e10189e" }, "c6e215fe460629d35688ab8e51faf6f765827cd6": { - "path": "bios/QEMU/openbios-sparc64", + "path": "bios/QEMU/QEMU/openbios-sparc64", "name": "openbios-sparc64", "size": 1593408, "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", @@ -165554,7 +165334,7 @@ "adler32": "9f0bb62b" }, "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f": { - "path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "name": "opensbi-riscv32-generic-fw_dynamic.bin", "size": 268312, "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", @@ -165564,7 +165344,7 @@ "adler32": "e7947756" }, "6883bfd1991c0ef0d67b0967e7dcbd60420dd480": { - "path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "name": "opensbi-riscv64-generic-fw_dynamic.bin", "size": 272504, "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", @@ -165574,7 +165354,7 @@ "adler32": "c5a7609b" }, "47b0870aaa45a7aa0d48847fd905908fb06f3e9f": { - "path": "bios/QEMU/palcode-clipper", + "path": "bios/QEMU/QEMU/palcode-clipper", "name": "palcode-clipper", "size": 153728, "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", @@ -165584,7 +165364,7 @@ "adler32": "05450b4a" }, "a4c1a8d4b15ade6653364286a160759b5b4caa85": { - "path": "bios/QEMU/pegasos2.dtb", + "path": "bios/QEMU/QEMU/pegasos2.dtb", "name": "pegasos2.dtb", "size": 2963, "sha1": "a4c1a8d4b15ade6653364286a160759b5b4caa85", @@ -165594,7 +165374,7 @@ "adler32": "e806983b" }, "892d265838866869b8a8ef104252ff5b2fda156f": { - "path": "bios/QEMU/petalogix-ml605.dtb", + "path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "name": "petalogix-ml605.dtb", "size": 9882, "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", @@ -165604,7 +165384,7 @@ "adler32": "8f21ee45" }, "976600e3f89ecc1f3564b7077f53c58e0b565280": { - "path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "name": "petalogix-s3adsp1800.dtb", "size": 8161, "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", @@ -165614,7 +165394,7 @@ "adler32": "185d9ccf" }, "41c43f4e8956169ab7602230a3a63934b26d65de": { - "path": "bios/QEMU/pmon_2e.bin", + "path": "bios/QEMU/QEMU/pmon_2e.bin", "name": "pmon_2e.bin", "size": 442384, "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", @@ -165624,7 +165404,7 @@ "adler32": "fb8015a3" }, "d8bf94da3e018ac22c1f63246acc3aa1e9a07992": { - "path": "bios/QEMU/pnv-pnor.bin", + "path": "bios/QEMU/QEMU/pnv-pnor.bin", "name": "pnv-pnor.bin", "size": 139264, "sha1": "d8bf94da3e018ac22c1f63246acc3aa1e9a07992", @@ -165634,7 +165414,7 @@ "adler32": "7f496f5e" }, "c2191e6495103c1f43e9b6ca8930e44c2245e476": { - "path": "bios/QEMU/pvh.bin", + "path": "bios/QEMU/QEMU/pvh.bin", "name": "pvh.bin", "size": 1536, "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", @@ -165644,7 +165424,7 @@ "adler32": "dda68210" }, "368e8e9827ae8757a7449319831078b6d5efb83f": { - "path": "bios/QEMU/pxe-e1000.rom", + "path": "bios/QEMU/QEMU/pxe-e1000.rom", "name": "pxe-e1000.rom", "size": 67072, "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", @@ -165654,7 +165434,7 @@ "adler32": "0be29edc" }, "b19572c9c2a11f03282df81c0397aceed409a86c": { - "path": "bios/QEMU/pxe-eepro100.rom", + "path": "bios/QEMU/QEMU/pxe-eepro100.rom", "name": "pxe-eepro100.rom", "size": 61440, "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", @@ -165664,7 +165444,7 @@ "adler32": "a4e05846" }, "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6": { - "path": "bios/QEMU/pxe-ne2k_pci.rom", + "path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "name": "pxe-ne2k_pci.rom", "size": 61440, "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", @@ -165674,7 +165454,7 @@ "adler32": "2fe4f846" }, "13a039bf9916f1db42d3a019591d372b4cf4aee9": { - "path": "bios/QEMU/pxe-pcnet.rom", + "path": "bios/QEMU/QEMU/pxe-pcnet.rom", "name": "pxe-pcnet.rom", "size": 61440, "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", @@ -165684,7 +165464,7 @@ "adler32": "7394ee46" }, "7b512c0a7a13bc3c254a25237e4d4612170f4391": { - "path": "bios/QEMU/pxe-rtl8139.rom", + "path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "name": "pxe-rtl8139.rom", "size": 61440, "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", @@ -165694,7 +165474,7 @@ "adler32": "f8f8e946" }, "3e3f77cfe70af904133db94f27ec24e3c9c43648": { - "path": "bios/QEMU/pxe-virtio.rom", + "path": "bios/QEMU/QEMU/pxe-virtio.rom", "name": "pxe-virtio.rom", "size": 60416, "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", @@ -165704,7 +165484,7 @@ "adler32": "3aa8ab28" }, "339d3a93c967491c9f1fffe963484386f48bd22c": { - "path": "bios/QEMU/qboot.rom", + "path": "bios/QEMU/QEMU/qboot.rom", "name": "qboot.rom", "size": 65536, "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", @@ -165714,7 +165494,7 @@ "adler32": "258694b8" }, "638c6262a6eb579ec3d1c9292566ac94c942dc15": { - "path": "bios/QEMU/qemu_vga.ndrv", + "path": "bios/QEMU/QEMU/qemu_vga.ndrv", "name": "qemu_vga.ndrv", "size": 18752, "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", @@ -165724,7 +165504,7 @@ "adler32": "83efe2ac" }, "7b4fa888d32ca8ddbc752f7442e4d055cee1871a": { - "path": "bios/QEMU/s390-ccw.img", + "path": "bios/QEMU/QEMU/s390-ccw.img", "name": "s390-ccw.img", "size": 42608, "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", @@ -165734,7 +165514,7 @@ "adler32": "e8e35133" }, "f6cec671408117bd9a31e982682662f27ef4fb2c": { - "path": "bios/QEMU/s390-netboot.img", + "path": "bios/QEMU/QEMU/s390-netboot.img", "name": "s390-netboot.img", "size": 67232, "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", @@ -165744,7 +165524,7 @@ "adler32": "d80aa006" }, "8052069aa9714c23be05b4e62fb245a3d572cb0f": { - "path": "bios/QEMU/skiboot.lid", + "path": "bios/QEMU/QEMU/skiboot.lid", "name": "skiboot.lid", "size": 2527328, "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", @@ -165754,7 +165534,7 @@ "adler32": "25153bd7" }, "a03a94acfe555804d66cc6c74760ae1375a71a64": { - "path": "bios/QEMU/slof.bin", + "path": "bios/QEMU/QEMU/slof.bin", "name": "slof.bin", "size": 995000, "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", @@ -165764,7 +165544,7 @@ "adler32": "14a181dd" }, "0399a79ac0cf77f0da70af9baec7548a3b368f0a": { - "path": "bios/QEMU/u-boot-sam460-20100605.bin", + "path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "name": "u-boot-sam460-20100605.bin", "size": 524288, "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", @@ -165774,7 +165554,7 @@ "adler32": "27b1d275" }, "2aa01b414a703880192277f9ce0dae193e9d2c8d": { - "path": "bios/QEMU/u-boot.bin", + "path": "bios/QEMU/QEMU/u-boot.bin", "name": "u-boot.bin", "size": 141072, "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", @@ -165784,7 +165564,7 @@ "adler32": "fa1dde04" }, "9ea03f249f856cdcb4399cc1f5a5031729379911": { - "path": "bios/QEMU/u-boot.e500", + "path": "bios/QEMU/QEMU/u-boot.e500", "name": "u-boot.e500", "size": 421720, "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", @@ -165794,7 +165574,7 @@ "adler32": "310e0a2c" }, "ded141cacdebf557ec552597cbf57cd989cec3e2": { - "path": "bios/QEMU/vgabios-ati.bin", + "path": "bios/QEMU/QEMU/vgabios-ati.bin", "name": "vgabios-ati.bin", "size": 39424, "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", @@ -165804,7 +165584,7 @@ "adler32": "1db966fe" }, "9e2edd3d835219cde63a20e2cd58107d7e96ef5b": { - "path": "bios/QEMU/vgabios-bochs-display.bin", + "path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "name": "vgabios-bochs-display.bin", "size": 28672, "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", @@ -165814,7 +165594,7 @@ "adler32": "34ab824a" }, "883eb2657ce29661a0466b6b41ce75411f37aad9": { - "path": "bios/QEMU/vgabios-cirrus.bin", + "path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "name": "vgabios-cirrus.bin", "size": 38912, "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", @@ -165824,7 +165604,7 @@ "adler32": "cf318bfe" }, "527227abd5f3348c382d4b02703389fbeb83b067": { - "path": "bios/QEMU/vgabios-qxl.bin", + "path": "bios/QEMU/QEMU/vgabios-qxl.bin", "name": "vgabios-qxl.bin", "size": 39424, "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", @@ -165834,7 +165614,7 @@ "adler32": "4f6f1e0d" }, "49df9be557f0f0277c8fedb889257e279586d536": { - "path": "bios/QEMU/vgabios-ramfb.bin", + "path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "name": "vgabios-ramfb.bin", "size": 28672, "sha1": "49df9be557f0f0277c8fedb889257e279586d536", @@ -165844,7 +165624,7 @@ "adler32": "5efbca4a" }, "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5": { - "path": "bios/QEMU/vgabios-stdvga.bin", + "path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "name": "vgabios-stdvga.bin", "size": 39424, "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", @@ -165854,7 +165634,7 @@ "adler32": "36a71e0d" }, "cddc53b94793609d1e837d78cd5468fcc1ed9164": { - "path": "bios/QEMU/vgabios-virtio.bin", + "path": "bios/QEMU/QEMU/vgabios-virtio.bin", "name": "vgabios-virtio.bin", "size": 39424, "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", @@ -165864,7 +165644,7 @@ "adler32": "43ea1f0d" }, "c54901ab8f526ab201ebf1b3ecdf711e38e6c259": { - "path": "bios/QEMU/vgabios-vmware.bin", + "path": "bios/QEMU/QEMU/vgabios-vmware.bin", "name": "vgabios-vmware.bin", "size": 39424, "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", @@ -165874,7 +165654,7 @@ "adler32": "48a01e0d" }, "63d87e2a6618c3a9b2aabecf03ac2456e5e63410": { - "path": "bios/QEMU/vgabios.bin", + "path": "bios/QEMU/QEMU/vgabios.bin", "name": "vgabios.bin", "size": 38912, "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", @@ -165884,7 +165664,7 @@ "adler32": "70dd56fe" }, "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1": { - "path": "bios/QEMU/virtex-ml507.dtb", + "path": "bios/QEMU/QEMU/virtex-ml507.dtb", "name": "virtex-ml507.dtb", "size": 11248, "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", @@ -165894,7 +165674,7 @@ "adler32": "d2b0afba" }, "5d1184609b87f78635f0575467a1c3f440900ff0": { - "path": "bios/QEMU/vof-nvram.bin", + "path": "bios/QEMU/QEMU/vof-nvram.bin", "name": "vof-nvram.bin", "size": 16384, "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", @@ -165904,7 +165684,7 @@ "adler32": "98f3a82e" }, "fc737b34a390f5752cb7e35b33d71f4f438ab607": { - "path": "bios/QEMU/vof.bin", + "path": "bios/QEMU/QEMU/vof.bin", "name": "vof.bin", "size": 3456, "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", @@ -191418,7 +191198,7 @@ "adler32": "ab36789b" }, "a439fbb390da38cada95a7cbb1d6ca199cd66ef8": { - "path": "bios/Roland/CM32L_CONTROL.ROM", + "path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "name": "CM32L_CONTROL.ROM", "size": 65536, "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", @@ -191428,7 +191208,7 @@ "adler32": "586ed7ae" }, "289cc298ad532b702461bfc738009d9ebe8025ea": { - "path": "bios/Roland/CM32L_PCM.ROM", + "path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "name": "CM32L_PCM.ROM", "size": 1048576, "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", @@ -191438,7 +191218,7 @@ "adler32": "884b72ba" }, "b083518fffb7f66b03c23b7eb4f868e62dc5a987": { - "path": "bios/Roland/MT32_CONTROL.ROM", + "path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "name": "MT32_CONTROL.ROM", "size": 65536, "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", @@ -191448,7 +191228,7 @@ "adler32": "1e07fec4" }, "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252": { - "path": "bios/Roland/MT32_PCM.ROM", + "path": "bios/Roland/MT-32/MT32_PCM.ROM", "name": "MT32_PCM.ROM", "size": 524288, "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", @@ -193228,6 +193008,16 @@ "crc32": "b1642de4", "adler32": "11d8aee2" }, + "5996972d3e033f6c525c1988c563b4ffe4c58f22": { + "path": "bios/Sega/Chihiro/cerbios.bin", + "name": "cerbios.bin", + "size": 262144, + "sha1": "5996972d3e033f6c525c1988c563b4ffe4c58f22", + "md5": "f23d7e00ae8fbf88908ed1f9165f35eb", + "sha256": "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958", + "crc32": "a73a4d20", + "adler32": "8c41bfd4" + }, "77197fba2781ed1d81402c48bd743adb26d3161a": { "path": "bios/Sega/Chihiro/fpr-23887_29lv160te.ic4", "name": "fpr-23887_29lv160te.ic4", @@ -201208,6 +200998,216 @@ "crc32": "99a449b5", "adler32": "a32774de" }, + "746a2996967282281a980842a93642ad7d740f9e": { + "path": "bios/Tangerine/Oric/8dos2.rom", + "name": "8dos2.rom", + "size": 512, + "sha1": "746a2996967282281a980842a93642ad7d740f9e", + "md5": "5f3cd5a4307fed7a9dfe8faa4c044273", + "sha256": "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6", + "crc32": "efc88d2b", + "adler32": "82ebe76f" + }, + "3e8f851df9319891fb9849c922437468df98915d": { + "path": "bios/Tangerine/Oric/Bas122de.pch", + "name": "Bas122de.pch", + "size": 2037, + "sha1": "3e8f851df9319891fb9849c922437468df98915d", + "md5": "80fe771abf403e67f5640b2107c375c9", + "sha256": "cf3d0e680a362084aadb184a4a57a35432e5af885aa2f7838578e3116fb57c2e", + "crc32": "bfaaa640", + "adler32": "20bea5df" + }, + "c92aa5e5fedf94a01519867fd8235f33731b8191": { + "path": "bios/Tangerine/Oric/Bas122fr.pch", + "name": "Bas122fr.pch", + "size": 2037, + "sha1": "c92aa5e5fedf94a01519867fd8235f33731b8191", + "md5": "61e9414a2c0e2f71b5a25233506b4bf3", + "sha256": "52d5bda9d4624da09a6efa8a9fe1c956e602ead506822f205486e915e9ba88a7", + "crc32": "169dc64a", + "adler32": "c207a5d1" + }, + "ee9dc592128ff337be5ef0bfb6d059752296b445": { + "path": "bios/Tangerine/Oric/Bas122uk.pch", + "name": "Bas122uk.pch", + "size": 2037, + "sha1": "ee9dc592128ff337be5ef0bfb6d059752296b445", + "md5": "120a23e1566195050983764e7d4543ce", + "sha256": "a5340b6e01719a736a328cfff3a7449ddf77f76f138b07024648b6fcf15368de", + "crc32": "3a0be9f6", + "adler32": "1a00a5de" + }, + "bda81f64be319d8793d284bf9d40f01d19b33515": { + "path": "bios/Tangerine/Oric/Oric/colour.rom", + "name": "colour.rom", + "size": 128, + "sha1": "bda81f64be319d8793d284bf9d40f01d19b33515", + "md5": "c888b36bf0fc222c3585c3fabe556d21", + "sha256": "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293", + "crc32": "d50fca65", + "adler32": "e82c1d5b" + }, + "6c62326403ecdf3d120fa7ffea47f4f1d5b40020": { + "path": "bios/Tangerine/Oric/basic10.pch", + "name": "basic10.pch", + "size": 2016, + "sha1": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", + "md5": "c3944a435cc249196db09290aa17e9cf", + "sha256": "2152eafd6573626b7467402838352d4cfbf22f43b4f9940eee7048aea7098dc1", + "crc32": "801dea4e", + "adler32": "8baea102" + }, + "333116e6884d85aaa4dfc7578a91cceeea66d016": { + "path": "bios/Tangerine/Oric/basic10.rom", + "name": "basic10.rom", + "size": 16384, + "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", + "md5": "ebe418ec8a6c85d5ac32956c9a96c179", + "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", + "crc32": "f18710b4", + "adler32": "7c6b1a61" + }, + "9451a1a09d8f75944dbd6f91193fc360f1de80ac": { + "path": "bios/Tangerine/Oric/basic11b.rom", + "name": "basic11b.rom", + "size": 16384, + "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", + "md5": "a330779c42ad7d0c4ac6ef9e92788ec6", + "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", + "crc32": "c3a92bef", + "adler32": "4d981bd9" + }, + "447975ed022379fb6b80a22fa37c2d188ca3aa88": { + "path": "bios/Tangerine/Oric/bd500.rom", + "name": "bd500.rom", + "size": 8192, + "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", + "md5": "2b6498fd29a0adbf1c529762c02c33ab", + "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", + "crc32": "61952e34", + "adler32": "4d7e15ec" + }, + "e7c32e4f75a58c87de1672e4dbd0794083535a60": { + "path": "bios/Tangerine/Oric/empty_orix.rom", + "name": "empty_orix.rom", + "size": 16384, + "sha1": "e7c32e4f75a58c87de1672e4dbd0794083535a60", + "md5": "af3cec316a4960be1c9987599066c792", + "sha256": "d1ca02145bc2d539ed45097712046228caf0e04d591ba4463a0ff2a0dad90f45", + "crc32": "c98b4655", + "adler32": "10b105dc" + }, + "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63": { + "path": "bios/Tangerine/Oric/hyperbas.rom", + "name": "hyperbas.rom", + "size": 16384, + "sha1": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", + "md5": "364bf095e0dc4222d75354d50b8cddfc", + "sha256": "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6", + "crc32": "1d96ab50", + "adler32": "f69457ec" + }, + "70e59b8abd67092f050462abc6cb5271e4c15f01": { + "path": "bios/Tangerine/Oric/jasmin.rom", + "name": "jasmin.rom", + "size": 2048, + "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", + "md5": "5136f764a7dbd1352519351fbb53a9f3", + "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", + "crc32": "37220e89", + "adler32": "a9993e51" + }, + "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6": { + "path": "bios/Tangerine/Oric/kernel.rom", + "name": "kernel.rom", + "size": 16384, + "sha1": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", + "md5": "1d63b6289c7e3566d411cf0682e401bc", + "sha256": "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144", + "crc32": "356231a6", + "adler32": "c1d39847" + }, + "0d2ef6e67322f48f4b7e08d8bbe68827e2074561": { + "path": "bios/Tangerine/Oric/microdis.rom", + "name": "microdis.rom", + "size": 8192, + "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", + "md5": "df864344d2a2091c3f952bd1c5ce1707", + "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", + "crc32": "a9664a9c", + "adler32": "b4326558" + }, + "7afc276cb118adff72e4f16698f94bf3b2c64146": { + "path": "bios/Tangerine/Oric/pravetz.rom", + "name": "pravetz.rom", + "size": 16384, + "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", + "md5": "8712a22e7e078de3343667d9fc1f2390", + "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", + "crc32": "58079502", + "adler32": "e5c81c95" + }, + "3dd12d7ba54fee06a7e20dadb2c278a23a17af50": { + "path": "bios/Tangerine/Oric/pravetzt.pch", + "name": "pravetzt.pch", + "size": 2390, + "sha1": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", + "md5": "eaa5158b07b439faab0db30e357f0af2", + "sha256": "191b5e58d65eee4b2ae74aefd882b0df44d321be6c226349293fad7c10fcdcbf", + "crc32": "46bab02d", + "adler32": "4a13f713" + }, + "926b95e1cb574d4914dbed0681729a7c1a4bc68d": { + "path": "bios/Tangerine/Oric/shell.rom", + "name": "shell.rom", + "size": 16384, + "sha1": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", + "md5": "642e8504adc72e7c16384dbdc1665fa2", + "sha256": "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8", + "crc32": "8d166635", + "adler32": "a9d0bac9" + }, + "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d": { + "path": "bios/Tangerine/Oric/teleass.rom", + "name": "teleass.rom", + "size": 16384, + "sha1": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", + "md5": "2324c9cc227c1327a72a667c97ed2990", + "sha256": "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee", + "crc32": "68b0fde6", + "adler32": "a1258c43" + }, + "35f92a0477a88f5cf564971125047ffcfa02ec10": { + "path": "bios/Tangerine/Oric/telmatic.rom", + "name": "telmatic.rom", + "size": 8192, + "sha1": "35f92a0477a88f5cf564971125047ffcfa02ec10", + "md5": "0a814078410353744e2947a8e9342e4e", + "sha256": "f213042b9b166b443b8a5a336a325ba4a2ae9482db369754932a7b3c802ed980", + "crc32": "94358dc6", + "adler32": "8c7a9749" + }, + "d8ce5b1405b6428969493efeb6f3aa2027c41bdc": { + "path": "bios/Tangerine/Oric/telmon24.pch", + "name": "telmon24.pch", + "size": 218, + "sha1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", + "md5": "82a22231d402cd3284c698ba16a51d1d", + "sha256": "3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1", + "crc32": "29e86dbc", + "adler32": "32334634" + }, + "86fc8dc0932f983efa199e31ae05a4424772f959": { + "path": "bios/Tangerine/Oric/telmon24.rom", + "name": "telmon24.rom", + "size": 16384, + "sha1": "86fc8dc0932f983efa199e31ae05a4424772f959", + "md5": "9a432244d9ee4a49e8ddcde64af94e05", + "sha256": "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094", + "crc32": "aa727c5d", + "adler32": "13643247" + }, "ce08f6a808701fc6672230a790167ee485157561": { "path": "bios/Texas Instruments/TI-83/TI83_102.rom", "name": "TI83_102.rom", @@ -203333,9 +203333,6 @@ "cec002ace50f3a048a3f6c096b85e6da": "adbc01de2b85148080add3123cf1d78599dae8ea", "9e7ec19b80ea4ac41953c6384850f148": "d7769bbda95fef35866ab00248628603595d4dce", "05f3b12502bb6c9c1b986f4065528c65": "34bf7dc699080552e89342bf8ad59dc6a2f0a5db", - "a93ed3e9468576c03528bceec8a6236a": "764ec667084bc237c1de6bd1db7541ad8cb59975", - "c2428525597a69fc71621e0cdf114619": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", - "40b8624b7a72c782998e52a0782b69e2": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "37fc4e050b53a1ef2c2e7f3042553025": "1bef29ccc16eeb2e3c0759bfd2a4f86b1aba03a7", "192918d31f38165d2b898891c7ea658d": "de369cb4a7df147b55168fa7aaf0b98c753b735e", "054a7bcc1f2a16264472dfbeb25768ea": "f4aa64bfe0b93e5df07b4fe2e0f638d91c7f2e71", @@ -205448,7 +205445,10 @@ "468e876b23be2c9c102aa68dcd12feb5": "d4b0c8277c187a92279e2d2b71fc91b72d581257", "19a3df57a902f49f8b022fc3d26de048": "a7d7a0538e2d1d9f3c623488af44b0d8b5e564e2", "d744304609ce1bd8509cea018fe7c648": "d1e956230118b8198c526693cd24d70ec2050e7b", + "a93ed3e9468576c03528bceec8a6236a": "764ec667084bc237c1de6bd1db7541ad8cb59975", + "c2428525597a69fc71621e0cdf114619": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "1ea651a4211f738077eb29cfb6c26ca1": "cdb09d3ffaa867ff9e7387cf1934e9011565d546", + "40b8624b7a72c782998e52a0782b69e2": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "c53298b7736577e0cd9f57d4fcbfdf4c": "11ab10d51b27594f71336dd6d83ef30cd2742e6e", "9d8d873d6646b799d003433d06156d5c": "17997863696749e6ff07e0f4659631e3c9e0ef2f", "b0385bbe76f9ea31ce499fa570306b70": "df704220bce28652ced65f53ca18d286b4bcd42f", @@ -214894,7 +214894,6 @@ "62e761035cb657903761800f4437b8af": "5a65b922b562cb1f57dab51b73151283f0e20c7a", "0cd5946c6473e42e8e4c2137785e427f": "f9608bb4ad1cfe3640d02844c7ad8e0bcd974917", "d5530f74681ec6e0f282dab42e6b1c5f": "618563e512ff5665183664f52270fa9606c9d289", - "f23d7e00ae8fbf88908ed1f9165f35eb": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "74b0f217fa0e2b8bb5a2f8e2ecc69da3": "bf5fb954db868e523febccc68549ed9187961076", "254bfa82fa9b34c82d7b9766b193c303": "b7068e2aab02072852ca249596b7550ac632c4c2", "5353336d9c81946fa17582daccbb5cae": "1ef3956f7f918873fb9b031339bba45d1e5e5878", @@ -215546,27 +215545,6 @@ "3b6cd137d963bfc996d0b3dd38a5a130": "d08ffcf19945b63c7baf35d9965a9cd6bf61332b", "6924e3c6a145f16d4383253048ea0f9c": "cd34a0ee9b7a8cbb9c9eae34739704a9dd4dd413", "64a95a4a884cf4cc15a566b856603193": "34e5be43effe08435b4535b68b45bb9e61d384e9", - "5f3cd5a4307fed7a9dfe8faa4c044273": "746a2996967282281a980842a93642ad7d740f9e", - "80fe771abf403e67f5640b2107c375c9": "3e8f851df9319891fb9849c922437468df98915d", - "61e9414a2c0e2f71b5a25233506b4bf3": "c92aa5e5fedf94a01519867fd8235f33731b8191", - "120a23e1566195050983764e7d4543ce": "ee9dc592128ff337be5ef0bfb6d059752296b445", - "c888b36bf0fc222c3585c3fabe556d21": "bda81f64be319d8793d284bf9d40f01d19b33515", - "c3944a435cc249196db09290aa17e9cf": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", - "ebe418ec8a6c85d5ac32956c9a96c179": "333116e6884d85aaa4dfc7578a91cceeea66d016", - "a330779c42ad7d0c4ac6ef9e92788ec6": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", - "2b6498fd29a0adbf1c529762c02c33ab": "447975ed022379fb6b80a22fa37c2d188ca3aa88", - "af3cec316a4960be1c9987599066c792": "e7c32e4f75a58c87de1672e4dbd0794083535a60", - "364bf095e0dc4222d75354d50b8cddfc": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", - "5136f764a7dbd1352519351fbb53a9f3": "70e59b8abd67092f050462abc6cb5271e4c15f01", - "1d63b6289c7e3566d411cf0682e401bc": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", - "df864344d2a2091c3f952bd1c5ce1707": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", - "8712a22e7e078de3343667d9fc1f2390": "7afc276cb118adff72e4f16698f94bf3b2c64146", - "eaa5158b07b439faab0db30e357f0af2": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", - "642e8504adc72e7c16384dbdc1665fa2": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", - "2324c9cc227c1327a72a667c97ed2990": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", - "0a814078410353744e2947a8e9342e4e": "35f92a0477a88f5cf564971125047ffcfa02ec10", - "82a22231d402cd3284c698ba16a51d1d": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", - "9a432244d9ee4a49e8ddcde64af94e05": "86fc8dc0932f983efa199e31ae05a4424772f959", "d260e5ea815f73c8b15155fa2ffb97c3": "451c85c46b92e6ad2ad930f055ccf0fe3049936d", "06c4104c60e6eacd29cc87d54aa7d224": "227ec84ea3dcb9b3d3db15a543ac19e5923732d8", "a77c7946128ca0b2c5e5a66b17c99dae": "5f461811edd22c08d5fb0e13a7bae99ee571c9f6", @@ -221355,6 +221333,7 @@ "7ca240eb19818825f9d59d26b3037f69": "a7e0143dee5a47e679fd5155e58e717813912692", "080b53f5d3952a8a07981f9f66997887": "b3480714b11fc49b449660431f85d4ba92f799ba", "a5d31549c638f0dc0ad4f3bb163ba4b7": "f63eca9a1b1e92ee1582ff5e4c0db55193f97e33", + "f23d7e00ae8fbf88908ed1f9165f35eb": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "f8d4a97e47840e45598721a527d07ea5": "77197fba2781ed1d81402c48bd743adb26d3161a", "284c29e927164692f4884563859319d5": "45d94d0c39be1cb3db9fab6610a88a550adda4e9", "e80075c0dfcd39ab2bea972d150e0ba1": "ff161eaa16b36b519eeab26364b99f59b9e8128c", @@ -221921,6 +221900,27 @@ "71f71d32cbb5e2fcc7d11e8735c97b6e": "bc58ac28be4854fb198b895c7fd999f599b5a961", "8a0f1567df8f166f4056a6a71ef7dce5": "497eea6e0ed80501ca3beee714d71a5815495b07", "3424f1a2df9d971024a50955cb05e067": "beff39b4edb449c66b704e1c64ee6ed58e30a868", + "5f3cd5a4307fed7a9dfe8faa4c044273": "746a2996967282281a980842a93642ad7d740f9e", + "80fe771abf403e67f5640b2107c375c9": "3e8f851df9319891fb9849c922437468df98915d", + "61e9414a2c0e2f71b5a25233506b4bf3": "c92aa5e5fedf94a01519867fd8235f33731b8191", + "120a23e1566195050983764e7d4543ce": "ee9dc592128ff337be5ef0bfb6d059752296b445", + "c888b36bf0fc222c3585c3fabe556d21": "bda81f64be319d8793d284bf9d40f01d19b33515", + "c3944a435cc249196db09290aa17e9cf": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", + "ebe418ec8a6c85d5ac32956c9a96c179": "333116e6884d85aaa4dfc7578a91cceeea66d016", + "a330779c42ad7d0c4ac6ef9e92788ec6": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", + "2b6498fd29a0adbf1c529762c02c33ab": "447975ed022379fb6b80a22fa37c2d188ca3aa88", + "af3cec316a4960be1c9987599066c792": "e7c32e4f75a58c87de1672e4dbd0794083535a60", + "364bf095e0dc4222d75354d50b8cddfc": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", + "5136f764a7dbd1352519351fbb53a9f3": "70e59b8abd67092f050462abc6cb5271e4c15f01", + "1d63b6289c7e3566d411cf0682e401bc": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", + "df864344d2a2091c3f952bd1c5ce1707": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", + "8712a22e7e078de3343667d9fc1f2390": "7afc276cb118adff72e4f16698f94bf3b2c64146", + "eaa5158b07b439faab0db30e357f0af2": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", + "642e8504adc72e7c16384dbdc1665fa2": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", + "2324c9cc227c1327a72a667c97ed2990": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", + "0a814078410353744e2947a8e9342e4e": "35f92a0477a88f5cf564971125047ffcfa02ec10", + "82a22231d402cd3284c698ba16a51d1d": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", + "9a432244d9ee4a49e8ddcde64af94e05": "86fc8dc0932f983efa199e31ae05a4424772f959", "4edf419caa9fb0542b4fed8bcd8b54c2": "ce08f6a808701fc6672230a790167ee485157561", "28308683219bc1242b3a423f05061e69": "8399e384804d8d29866caa4c8763d7a61946a467", "02d48eaad98a74619e2f68de23ac212f": "33877ff637dc5f4c5388799fd7e2159b48e72893", @@ -225151,15 +225151,6 @@ "uvt.zip": [ "34bf7dc699080552e89342bf8ad59dc6a2f0a5db" ], - "dkong.zip": [ - "764ec667084bc237c1de6bd1db7541ad8cb59975" - ], - "dkongjr.zip": [ - "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" - ], - "galaga.zip": [ - "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" - ], "236-bios.sp1": [ "de369cb4a7df147b55168fa7aaf0b98c753b735e" ], @@ -231475,9 +231466,18 @@ "gts80a.zip": [ "d1e956230118b8198c526693cd24d70ec2050e7b" ], + "dkong.zip": [ + "764ec667084bc237c1de6bd1db7541ad8cb59975" + ], + "dkongjr.zip": [ + "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" + ], "fireshrk.zip": [ "cdb09d3ffaa867ff9e7387cf1934e9011565d546" ], + "galaga.zip": [ + "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" + ], "ghox.zip": [ "11ab10d51b27594f71336dd6d83ef30cd2742e6e" ], @@ -254745,9 +254745,6 @@ "IVOICE.BIN": [ "618563e512ff5665183664f52270fa9606c9d289" ], - "cerbios.bin": [ - "5996972d3e033f6c525c1988c563b4ffe4c58f22" - ], "CARTS.SHA": [ "bf5fb954db868e523febccc68549ed9187961076", "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81" @@ -256454,69 +256451,6 @@ "34e5be43effe08435b4535b68b45bb9e61d384e9", "b184f1c1febf66c8168fcae0b8aa37a5754f79db" ], - "8dos2.rom": [ - "746a2996967282281a980842a93642ad7d740f9e" - ], - "Bas122de.pch": [ - "3e8f851df9319891fb9849c922437468df98915d" - ], - "Bas122fr.pch": [ - "c92aa5e5fedf94a01519867fd8235f33731b8191" - ], - "Bas122uk.pch": [ - "ee9dc592128ff337be5ef0bfb6d059752296b445" - ], - "colour.rom": [ - "bda81f64be319d8793d284bf9d40f01d19b33515" - ], - "basic10.pch": [ - "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" - ], - "basic10.rom": [ - "333116e6884d85aaa4dfc7578a91cceeea66d016" - ], - "basic11b.rom": [ - "9451a1a09d8f75944dbd6f91193fc360f1de80ac" - ], - "bd500.rom": [ - "447975ed022379fb6b80a22fa37c2d188ca3aa88" - ], - "empty_orix.rom": [ - "e7c32e4f75a58c87de1672e4dbd0794083535a60" - ], - "hyperbas.rom": [ - "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" - ], - "jasmin.rom": [ - "70e59b8abd67092f050462abc6cb5271e4c15f01" - ], - "kernel.rom": [ - "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" - ], - "microdis.rom": [ - "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" - ], - "pravetz.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], - "pravetzt.pch": [ - "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" - ], - "shell.rom": [ - "926b95e1cb574d4914dbed0681729a7c1a4bc68d" - ], - "teleass.rom": [ - "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" - ], - "telmatic.rom": [ - "35f92a0477a88f5cf564971125047ffcfa02ec10" - ], - "telmon24.pch": [ - "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" - ], - "telmon24.rom": [ - "86fc8dc0932f983efa199e31ae05a4424772f959" - ], "ADT-1.40.rom": [ "227ec84ea3dcb9b3d3db15a543ac19e5923732d8" ], @@ -270360,6 +270294,9 @@ "beena.zip": [ "f63eca9a1b1e92ee1582ff5e4c0db55193f97e33" ], + "cerbios.bin": [ + "5996972d3e033f6c525c1988c563b4ffe4c58f22" + ], "fpr-23887_29lv160te.ic4": [ "77197fba2781ed1d81402c48bd743adb26d3161a" ], @@ -271846,6 +271783,69 @@ "vis.zip": [ "beff39b4edb449c66b704e1c64ee6ed58e30a868" ], + "8dos2.rom": [ + "746a2996967282281a980842a93642ad7d740f9e" + ], + "Bas122de.pch": [ + "3e8f851df9319891fb9849c922437468df98915d" + ], + "Bas122fr.pch": [ + "c92aa5e5fedf94a01519867fd8235f33731b8191" + ], + "Bas122uk.pch": [ + "ee9dc592128ff337be5ef0bfb6d059752296b445" + ], + "colour.rom": [ + "bda81f64be319d8793d284bf9d40f01d19b33515" + ], + "basic10.pch": [ + "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" + ], + "basic10.rom": [ + "333116e6884d85aaa4dfc7578a91cceeea66d016" + ], + "basic11b.rom": [ + "9451a1a09d8f75944dbd6f91193fc360f1de80ac" + ], + "bd500.rom": [ + "447975ed022379fb6b80a22fa37c2d188ca3aa88" + ], + "empty_orix.rom": [ + "e7c32e4f75a58c87de1672e4dbd0794083535a60" + ], + "hyperbas.rom": [ + "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" + ], + "jasmin.rom": [ + "70e59b8abd67092f050462abc6cb5271e4c15f01" + ], + "kernel.rom": [ + "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" + ], + "microdis.rom": [ + "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" + ], + "pravetz.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], + "pravetzt.pch": [ + "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" + ], + "shell.rom": [ + "926b95e1cb574d4914dbed0681729a7c1a4bc68d" + ], + "teleass.rom": [ + "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" + ], + "telmatic.rom": [ + "35f92a0477a88f5cf564971125047ffcfa02ec10" + ], + "telmon24.pch": [ + "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" + ], + "telmon24.rom": [ + "86fc8dc0932f983efa199e31ae05a4424772f959" + ], "TI83_102.rom": [ "ce08f6a808701fc6672230a790167ee485157561" ], @@ -272116,6 +272116,9 @@ "Amsdos.rom": [ "39102c8e9cb55fcc0b9b62098780ed4a3cb6a4bb" ], + "AMSDOS_0.5.ROM": [ + "39102c8e9cb55fcc0b9b62098780ed4a3cb6a4bb" + ], "boot-16.rom": [ "d4181c9f046aafc3fb326b381baac809d9e38d16" ], @@ -272125,6 +272128,12 @@ "c600.rom": [ "d4181c9f046aafc3fb326b381baac809d9e38d16" ], + "controller.rom": [ + "d4181c9f046aafc3fb326b381baac809d9e38d16" + ], + "diskII.prom": [ + "d4181c9f046aafc3fb326b381baac809d9e38d16" + ], "DISK2.rom": [ "d4181c9f046aafc3fb326b381baac809d9e38d16" ], @@ -272262,6 +272271,12 @@ "Kickstart v1.3 r34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom": [ "891e9a547772fe0c6c19b610baf8bc4ea7fcb785" ], + "Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV)[!].rom": [ + "891e9a547772fe0c6c19b610baf8bc4ea7fcb785" + ], + "Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom": [ + "891e9a547772fe0c6c19b610baf8bc4ea7fcb785" + ], "amiga-os-205.rom": [ "02843c4253bbd29aba535b0aa3bd9a85034ecde4" ], @@ -272274,6 +272289,9 @@ "Kickstart v2.05 r37.350 (1992)(Commodore)(A600HD)[!].rom": [ "02843c4253bbd29aba535b0aa3bd9a85034ecde4" ], + "Kickstart v2.05 rev 37.350 (1992)(Commodore)(A600HD)[!].rom": [ + "02843c4253bbd29aba535b0aa3bd9a85034ecde4" + ], "cd32.rom": [ "3525be8887f79b5929e017b42380a79edfee542d" ], @@ -272283,6 +272301,9 @@ "Kickstart v3.1 r40.60 (1993)(Commodore)(CD32).rom": [ "3525be8887f79b5929e017b42380a79edfee542d" ], + "Kickstart v3.1 rev 40.60 (1993)(Commodore)(CD32).rom": [ + "3525be8887f79b5929e017b42380a79edfee542d" + ], "cd32ext.rom": [ "5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f" ], @@ -272295,6 +272316,12 @@ "amiga-os-310-cd32-ext.rom": [ "5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f" ], + "CD32 Extended.ROM": [ + "5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f" + ], + "CD32 Extended-ROM rev 40.60 (1993)(Commodore)(CD32).rom": [ + "5bef3d628ce59cc02a66e6e4ae0da48f60e78f7f" + ], "cdtv.rom": [ "7ba40ffa17e500ed9fed041f3424bd81d9c907be" ], @@ -272302,8 +272329,10 @@ "7ba40ffa17e500ed9fed041f3424bd81d9c907be" ], "CDTV Extended-ROM v1.0 (1991)(Commodore)(CDTV)[!].rom": [ - "7ba40ffa17e500ed9fed041f3424bd81d9c907be", - "5bc114bba29f60a614a311745b3e2464bfa06846" + "7ba40ffa17e500ed9fed041f3424bd81d9c907be" + ], + "CDTV Extended.ROM": [ + "7ba40ffa17e500ed9fed041f3424bd81d9c907be" ], "kick20.rom": [ "c5839f5cb98a7a8947065c3ed2f14f5f42e334a1" @@ -272314,18 +272343,39 @@ "Kickstart v2.04 r37.175 (1991)(Commodore)(A500+)[!].rom": [ "c5839f5cb98a7a8947065c3ed2f14f5f42e334a1" ], + "kick204.rom": [ + "c5839f5cb98a7a8947065c3ed2f14f5f42e334a1" + ], + "Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+)[!].rom": [ + "c5839f5cb98a7a8947065c3ed2f14f5f42e334a1" + ], + "Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+).rom": [ + "c5839f5cb98a7a8947065c3ed2f14f5f42e334a1" + ], "kick33180.A500": [ "11f9e62cf299f72184835b7b2a70a16333fc0d88" ], "Kickstart v1.2 r33.180 (1986)(Commodore)(A500-A1000-A2000)[!].rom": [ "11f9e62cf299f72184835b7b2a70a16333fc0d88" ], + "Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A2000)[!].rom": [ + "11f9e62cf299f72184835b7b2a70a16333fc0d88" + ], + "Kickstart v1.2 rev 33.180 (1986)(Commodore)(A500-A1000-A2000).rom": [ + "11f9e62cf299f72184835b7b2a70a16333fc0d88" + ], "kick40063.A600": [ "3b7f1493b27e212830f989f26ca76c02049f09ca" ], "amiga-os-310-a600.rom": [ "3b7f1493b27e212830f989f26ca76c02049f09ca" ], + "Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000)[!].rom": [ + "3b7f1493b27e212830f989f26ca76c02049f09ca" + ], + "Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000).rom": [ + "3b7f1493b27e212830f989f26ca76c02049f09ca" + ], "kick40068.A1200": [ "e21545723fe8374e91342617604f1b3d703094f1" ], @@ -272335,12 +272385,21 @@ "AmigaVision.rom": [ "e21545723fe8374e91342617604f1b3d703094f1" ], + "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom": [ + "e21545723fe8374e91342617604f1b3d703094f1" + ], + "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200).rom": [ + "e21545723fe8374e91342617604f1b3d703094f1" + ], "kick40068.A4000": [ "5fe04842d04a489720f0f4bb0e46948199406f49" ], "Kickstart v3.1 r40.68 (1993)(Commodore)(A4000).rom": [ "5fe04842d04a489720f0f4bb0e46948199406f49" ], + "Kickstart v3.1 rev 40.68 (1993)(Commodore)(A4000).rom": [ + "5fe04842d04a489720f0f4bb0e46948199406f49" + ], "1541 ROM": [ "ab16f56989b27d89babe5f89c5a8cb3da71a82f0" ], @@ -272555,6 +272614,21 @@ "d64tano.rom": [ "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" ], + "d64rom1": [ + "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" + ], + "dragrom": [ + "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" + ], + "Dragon Data Ltd - Dragon 64 - IC17": [ + "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" + ], + "Dragon Data Ltd - TANO IC18": [ + "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" + ], + "Eurohard S.A. - Dragon 200 IC18": [ + "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" + ], "alpha_ba": [ "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" ], @@ -272570,6 +272644,18 @@ "d64tano2.rom": [ "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" ], + "d64rom2": [ + "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" + ], + "Dragon Data Ltd - Dragon 64 - IC18": [ + "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" + ], + "Dragon Data Ltd - TANO IC17": [ + "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" + ], + "Eurohard S.A. - Dragon 200 IC17": [ + "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" + ], "deltados.rom": [ "686ebb5f39dd4fc907a0b748867d0a022d2f1a60" ], @@ -272582,6 +272668,9 @@ "Expandible OS v2.0 (1984)(Intelligent Software).bin": [ "6033a0535136c40c47137e4d1cd9273c06d5fdff" ], + "EXOS20.ROM": [ + "6033a0535136c40c47137e4d1cd9273c06d5fdff" + ], "zx48.rom": [ "5ea7c2b824672e914525d1d5c419d71b84a426a2" ], @@ -274332,6 +274421,9 @@ "n88knj1.rom": [ "82e11a177af6a5091dd67f50a2f4bafda84d6556" ], + "kanji1.rom": [ + "82e11a177af6a5091dd67f50a2f4bafda84d6556" + ], "fx-scsi.rom": [ "65482a23ac5c10a6095aee1db5824cca54ead6e5" ], @@ -274352,6 +274444,10 @@ "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", "1db57a1e8b6e4096f811587f9eab0c6675fd9755" ], + "dmg0_rom.bin": [ + "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", + "1db57a1e8b6e4096f811587f9eab0c6675fd9755" + ], "gba_bios.bin": [ "300c20df6731a33952ded8c436f7f186d25d3492" ], @@ -274395,6 +274491,9 @@ "IPL_JAP.n64": [ "bf861922dcb78c316360e3e742f4f70ff63c9bc3" ], + "64dd_ipl_J.bin": [ + "bf861922dcb78c316360e3e742f4f70ff63c9bc3" + ], "64DD_IPL_USA.bin": [ "3c5b93ca231550c68693a14f03cea8d5dbd1be9e" ], @@ -274404,6 +274503,9 @@ "boot5.rom": [ "3c5b93ca231550c68693a14f03cea8d5dbd1be9e" ], + "64dd_ipl_U.bin": [ + "3c5b93ca231550c68693a14f03cea8d5dbd1be9e" + ], "nds7.bin": [ "24f67bdea115a2c847c8813a262502ee1607b7df" ], @@ -274486,9 +274588,6 @@ "SNES_SGB_RevB_(World).sfc": [ "973e10840db683cf3faf61bd443090786b3a9f04" ], - "pravetzt.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], "squirreljme-0.3.0-test.jar": [ "600cf0440594b0c69339ba4b626a47288b342d77" ], @@ -275659,6 +275758,12 @@ "boot.bin": [ "8951d1bb219ab2ff8583033d2119c899cc81f18c" ], + "dc_boot.bin.bin": [ + "8951d1bb219ab2ff8583033d2119c899cc81f18c" + ], + "dc_bios.bin.bin": [ + "8951d1bb219ab2ff8583033d2119c899cc81f18c" + ], "bios.gg": [ "914aa165e3d879f060be77870d345b60cfeb4ede" ], @@ -275680,6 +275785,9 @@ "bios.sms": [ "c315672807d8ddb8d91443729405c766dd95cae7" ], + "BIOS.sms": [ + "c315672807d8ddb8d91443729405c766dd95cae7" + ], "bios_CD_E.bin": [ "f891e0ea651e2232af0c5c4cb46a0cae2ee8f356" ], @@ -275723,7 +275831,8 @@ "b3c20fbe57cd2eb595e9edac86817e5948dccae4" ], "mpr-17933.bin": [ - "faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3" + "faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3", + "df94c5b4d47eb3cc404d88b33a8fda237eaf4720" ], "saturn_bios_E.bin": [ "faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3" @@ -275962,7 +276071,8 @@ "ec0121bb8e2a209044309780d2efc2559c9a0ef1" ], "SCPH-70004_BIOS_V12_EUR_200.ROM1": [ - "cc44355ded232a2ba5309bb24d4cd55af08696b2" + "cc44355ded232a2ba5309bb24d4cd55af08696b2", + "747e36b086aceceb300c72c0d1bbab38e2920e63" ], "SCPH-90006_BIOS_VX_HK _230.ROM2": [ "b96cf94772f01b8434038285896467884a84b0c2" @@ -276426,6 +276536,9 @@ "microdisc.rom": [ "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" ], + "pravetzt.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], "custom0.sf2": [ "286b2e1fb21cc79851da01666db6c0b0e88f25e3" ], @@ -276724,9 +276837,6 @@ "bsx_bios.rom": [ "4891d739a8a8b67923681bad4fb67edab2e90e50" ], - "BS-X.bios": [ - "4891d739a8a8b67923681bad4fb67edab2e90e50" - ], "neo-epo.sp1": [ "1b3b22092f30c4d1b2c15f04d1670eb1e9fbea07" ], @@ -278370,9 +278480,6 @@ "DMG_ROM.bin": [ "1db57a1e8b6e4096f811587f9eab0c6675fd9755" ], - "dmg0_rom.bin": [ - "1db57a1e8b6e4096f811587f9eab0c6675fd9755" - ], "EXOS21.ROM": [ "55315b20fecb4441a07ee4bc5dc7153f396e0a2e" ], @@ -278529,9 +278636,6 @@ "Parallel.rom": [ "c75c751589cbcc1ad4ab4f63676af7abadd86f5b" ], - "FdsBios.bin": [ - "af5af53f66982e749643fdf8b2acbb7d4d3ed229" - ], "POCKSTAT.ROM": [ "6ae880493ddde880827d1e9f08e9cb2c38f9f2ec" ], @@ -278589,12 +278693,6 @@ "Kickstart v1.1 rev 32.34 (1986)(Commodore)(A1000)(PAL).rom": [ "16df8b5fd524c5a1c7584b2457ac15aff9e3ad6d" ], - "amiga-os-130-cdtv-ext.rom": [ - "5bc114bba29f60a614a311745b3e2464bfa06846" - ], - "CDTV Extended-ROM v1.0 (1992)(Commodore)(CDTV).rom": [ - "5bc114bba29f60a614a311745b3e2464bfa06846" - ], "SeaBIOS (128 KB)": [ "f402170ee4f374c304a7ce0b139d6cecb1732aff" ], @@ -280217,9 +280315,6 @@ "c7052ca4": "adbc01de2b85148080add3123cf1d78599dae8ea", "04600953": "d7769bbda95fef35866ab00248628603595d4dce", "732f8208": "34bf7dc699080552e89342bf8ad59dc6a2f0a5db", - "ff2dc92e": "764ec667084bc237c1de6bd1db7541ad8cb59975", - "8e243fa9": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", - "e37c02b4": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "92cfba00": "1bef29ccc16eeb2e3c0759bfd2a4f86b1aba03a7", "853e6b96": "de369cb4a7df147b55168fa7aaf0b98c753b735e", "02bf4426": "f4aa64bfe0b93e5df07b4fe2e0f638d91c7f2e71", @@ -282332,7 +282427,10 @@ "45dde813": "d4b0c8277c187a92279e2d2b71fc91b72d581257", "d0f35b64": "a7d7a0538e2d1d9f3c623488af44b0d8b5e564e2", "c4c96c52": "d1e956230118b8198c526693cd24d70ec2050e7b", + "ff2dc92e": "764ec667084bc237c1de6bd1db7541ad8cb59975", + "8e243fa9": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "37c6b3d0": "cdb09d3ffaa867ff9e7387cf1934e9011565d546", + "e37c02b4": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "23974c8e": "11ab10d51b27594f71336dd6d83ef30cd2742e6e", "59a8ab28": "17997863696749e6ff07e0f4659631e3c9e0ef2f", "33fedbd5": "df704220bce28652ced65f53ca18d286b4bcd42f", @@ -291778,7 +291876,6 @@ "cbce86f7": "5a65b922b562cb1f57dab51b73151283f0e20c7a", "683a4158": "f9608bb4ad1cfe3640d02844c7ad8e0bcd974917", "0de7579d": "618563e512ff5665183664f52270fa9606c9d289", - "a73a4d20": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "d42f4444": "bf5fb954db868e523febccc68549ed9187961076", "ac7d92b4": "b7068e2aab02072852ca249596b7550ac632c4c2", "a068cba9": "1ef3956f7f918873fb9b031339bba45d1e5e5878", @@ -292430,27 +292527,6 @@ "3843dcf5": "d08ffcf19945b63c7baf35d9965a9cd6bf61332b", "1eed61f5": "cd34a0ee9b7a8cbb9c9eae34739704a9dd4dd413", "343a0710": "34e5be43effe08435b4535b68b45bb9e61d384e9", - "efc88d2b": "746a2996967282281a980842a93642ad7d740f9e", - "bfaaa640": "3e8f851df9319891fb9849c922437468df98915d", - "169dc64a": "c92aa5e5fedf94a01519867fd8235f33731b8191", - "3a0be9f6": "ee9dc592128ff337be5ef0bfb6d059752296b445", - "d50fca65": "bda81f64be319d8793d284bf9d40f01d19b33515", - "801dea4e": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", - "f18710b4": "333116e6884d85aaa4dfc7578a91cceeea66d016", - "c3a92bef": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", - "61952e34": "447975ed022379fb6b80a22fa37c2d188ca3aa88", - "c98b4655": "e7c32e4f75a58c87de1672e4dbd0794083535a60", - "1d96ab50": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", - "37220e89": "70e59b8abd67092f050462abc6cb5271e4c15f01", - "356231a6": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", - "a9664a9c": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", - "58079502": "7afc276cb118adff72e4f16698f94bf3b2c64146", - "46bab02d": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", - "8d166635": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", - "68b0fde6": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", - "94358dc6": "35f92a0477a88f5cf564971125047ffcfa02ec10", - "29e86dbc": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", - "aa727c5d": "86fc8dc0932f983efa199e31ae05a4424772f959", "5aff85d3": "451c85c46b92e6ad2ad930f055ccf0fe3049936d", "8314fed0": "227ec84ea3dcb9b3d3db15a543ac19e5923732d8", "9ec2dbd0": "5f461811edd22c08d5fb0e13a7bae99ee571c9f6", @@ -298239,6 +298315,7 @@ "a85bb823": "a7e0143dee5a47e679fd5155e58e717813912692", "95344b04": "b3480714b11fc49b449660431f85d4ba92f799ba", "b1642de4": "f63eca9a1b1e92ee1582ff5e4c0db55193f97e33", + "a73a4d20": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "13034372": "77197fba2781ed1d81402c48bd743adb26d3161a", "fb55e65e": "ff161eaa16b36b519eeab26364b99f59b9e8128c", "c295a8c2": "cdf247154e28c4b352b962a4a523587f2fde9305", @@ -298804,6 +298881,27 @@ "6377a7f8": "bc58ac28be4854fb198b895c7fd999f599b5a961", "e6fda693": "497eea6e0ed80501ca3beee714d71a5815495b07", "99a449b5": "beff39b4edb449c66b704e1c64ee6ed58e30a868", + "efc88d2b": "746a2996967282281a980842a93642ad7d740f9e", + "bfaaa640": "3e8f851df9319891fb9849c922437468df98915d", + "169dc64a": "c92aa5e5fedf94a01519867fd8235f33731b8191", + "3a0be9f6": "ee9dc592128ff337be5ef0bfb6d059752296b445", + "d50fca65": "bda81f64be319d8793d284bf9d40f01d19b33515", + "801dea4e": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", + "f18710b4": "333116e6884d85aaa4dfc7578a91cceeea66d016", + "c3a92bef": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", + "61952e34": "447975ed022379fb6b80a22fa37c2d188ca3aa88", + "c98b4655": "e7c32e4f75a58c87de1672e4dbd0794083535a60", + "1d96ab50": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", + "37220e89": "70e59b8abd67092f050462abc6cb5271e4c15f01", + "356231a6": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", + "a9664a9c": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", + "58079502": "7afc276cb118adff72e4f16698f94bf3b2c64146", + "46bab02d": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", + "8d166635": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", + "68b0fde6": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", + "94358dc6": "35f92a0477a88f5cf564971125047ffcfa02ec10", + "29e86dbc": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", + "aa727c5d": "86fc8dc0932f983efa199e31ae05a4424772f959", "7ee5d27b": "ce08f6a808701fc6672230a790167ee485157561", "926f72a4": "8399e384804d8d29866caa4c8763d7a61946a467", "dccb73d3": "33877ff637dc5f4c5388799fd7e2159b48e72893", @@ -299929,9 +300027,6 @@ "994d0a53357ca1f0a8712aa4ba37fc12b29222502befd8ffd943fcc73b303825": "adbc01de2b85148080add3123cf1d78599dae8ea", "a4e5a732be1663eec6affbf19bec6509f4eec517e1660c4cb38fa5ae27611008": "d7769bbda95fef35866ab00248628603595d4dce", "89f877baa90d76d058954eb364cdff9b3f099231141c7a892538cc7c856d7f8d": "34bf7dc699080552e89342bf8ad59dc6a2f0a5db", - "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d": "764ec667084bc237c1de6bd1db7541ad8cb59975", - "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", - "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "eea7622c75e304f896f327d54adcc5683947e2fa33a81f0f2e0a505ad3e581c6": "1bef29ccc16eeb2e3c0759bfd2a4f86b1aba03a7", "2d491586dffd8f4387c340457a30161272e3e18bbba4a439c1890cb4590fc6bc": "de369cb4a7df147b55168fa7aaf0b98c753b735e", "847a46bff44756487e157c4aa30802e0fa9d92186a371ec315abecabb15c4ef0": "f4aa64bfe0b93e5df07b4fe2e0f638d91c7f2e71", @@ -302044,7 +302139,10 @@ "bc9de75976d523320ebb05b8a31e4c082c442bc564475db540b36c68026b6e15": "d4b0c8277c187a92279e2d2b71fc91b72d581257", "4cb64ed2a761883a674a338e2f41cb83648867046c69a3c866964bccf3b676cf": "a7d7a0538e2d1d9f3c623488af44b0d8b5e564e2", "637f7cbe7cc2ec95752821e744889c096897edc29ed7ef78ff50133bf670e22a": "d1e956230118b8198c526693cd24d70ec2050e7b", + "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d": "764ec667084bc237c1de6bd1db7541ad8cb59975", + "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "6588d252edde50d4e997227995a85f377d773536aafe33eba1be294ecc013789": "cdb09d3ffaa867ff9e7387cf1934e9011565d546", + "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "999eb2dd6f45fd6a208758eb2891937f74eddaf2d30dcc95340bd69e86390da8": "11ab10d51b27594f71336dd6d83ef30cd2742e6e", "1cd58a73f74f220aae72a6db9dd6956bd14c8fe08154745ebc7b08e9e5e0705b": "17997863696749e6ff07e0f4659631e3c9e0ef2f", "e59827ad24dd295eb1eb5c6c820c4d0ef548bc36fbcf3bcf64ad02e2ac6ba5f7": "df704220bce28652ced65f53ca18d286b4bcd42f", @@ -311490,7 +311588,6 @@ "1aeb614856beba95463166daf09304b414d5617d3f37d221724b3337fc4b2722": "5a65b922b562cb1f57dab51b73151283f0e20c7a", "a80b6841182547d08635ad30a6af71441c4c9eed9391b3dd22feb30d8e50cc85": "f9608bb4ad1cfe3640d02844c7ad8e0bcd974917", "dabade432af1523f43029057071ca8c1ed3604498c784603e8733023382ad7a5": "618563e512ff5665183664f52270fa9606c9d289", - "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "0a09940701f40647a2715271b43c9ab0d82bd488871427ad627b7e0f462f5dda": "bf5fb954db868e523febccc68549ed9187961076", "e33df7537335c0b6402ced6b3be70ef305e9158896e90b7939f8d406e5184b03": "b7068e2aab02072852ca249596b7550ac632c4c2", "01f43988d825d48a46915199b6cd42ae1505bdf83d642511204c50ecdf95c741": "1ef3956f7f918873fb9b031339bba45d1e5e5878", @@ -312142,27 +312239,6 @@ "eab425e6e65430232ec87a776d352f8fe1be4905df3a6bdaa0941c03e20069bc": "d08ffcf19945b63c7baf35d9965a9cd6bf61332b", "662bc6c693c88040531fbe51186ce203e188d1c67ad788b2013b3c91ce595420": "cd34a0ee9b7a8cbb9c9eae34739704a9dd4dd413", "afc1cc8b693f2b68d23ca203aa4d4eb4266baad4ab718f013a33b915d39574ef": "34e5be43effe08435b4535b68b45bb9e61d384e9", - "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6": "746a2996967282281a980842a93642ad7d740f9e", - "cf3d0e680a362084aadb184a4a57a35432e5af885aa2f7838578e3116fb57c2e": "3e8f851df9319891fb9849c922437468df98915d", - "52d5bda9d4624da09a6efa8a9fe1c956e602ead506822f205486e915e9ba88a7": "c92aa5e5fedf94a01519867fd8235f33731b8191", - "a5340b6e01719a736a328cfff3a7449ddf77f76f138b07024648b6fcf15368de": "ee9dc592128ff337be5ef0bfb6d059752296b445", - "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293": "bda81f64be319d8793d284bf9d40f01d19b33515", - "2152eafd6573626b7467402838352d4cfbf22f43b4f9940eee7048aea7098dc1": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", - "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff": "333116e6884d85aaa4dfc7578a91cceeea66d016", - "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", - "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3": "447975ed022379fb6b80a22fa37c2d188ca3aa88", - "d1ca02145bc2d539ed45097712046228caf0e04d591ba4463a0ff2a0dad90f45": "e7c32e4f75a58c87de1672e4dbd0794083535a60", - "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", - "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23": "70e59b8abd67092f050462abc6cb5271e4c15f01", - "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", - "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", - "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae": "7afc276cb118adff72e4f16698f94bf3b2c64146", - "191b5e58d65eee4b2ae74aefd882b0df44d321be6c226349293fad7c10fcdcbf": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", - "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", - "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", - "f213042b9b166b443b8a5a336a325ba4a2ae9482db369754932a7b3c802ed980": "35f92a0477a88f5cf564971125047ffcfa02ec10", - "3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", - "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094": "86fc8dc0932f983efa199e31ae05a4424772f959", "5e1efe51b2c8be901ab4283c671bd84364a574845b7269f92bdddc4dae9ae5d5": "451c85c46b92e6ad2ad930f055ccf0fe3049936d", "224b6d041e3491ed95928241206772dbbae1ab86779d02548f0b02a13884e0d3": "227ec84ea3dcb9b3d3db15a543ac19e5923732d8", "482c8e4eab3cf02fe7c2815df3bbccdef96ae4bc8c5e3e24265fc3943e72b535": "5f461811edd22c08d5fb0e13a7bae99ee571c9f6", @@ -317951,6 +318027,7 @@ "736773e82afccac7fa253d0d43b13f0f23c365fbbbf860597b68e13286f3ea4f": "a7e0143dee5a47e679fd5155e58e717813912692", "086285c30b1453ab797ace7dcd7665440fa187cfc6407d391d3bb96fba9f549f": "b3480714b11fc49b449660431f85d4ba92f799ba", "6a8bf30a5a0942f500d1d617506a99552e33774207d3e895258abafe35979641": "f63eca9a1b1e92ee1582ff5e4c0db55193f97e33", + "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "44c6f9a25a133d38d719a9adf08c914f7e64736f26446d8c84555b983a95e5b7": "77197fba2781ed1d81402c48bd743adb26d3161a", "e0be3fc086fd478c9879f983af743bada512dedab144667039e8c147e502ce6d": "45d94d0c39be1cb3db9fab6610a88a550adda4e9", "df47c364fd16a4816d43f4b542544e902c8e62d8835fc5bd15eb3f83feca06e8": "ff161eaa16b36b519eeab26364b99f59b9e8128c", @@ -318517,6 +318594,27 @@ "24a286c1818d14c003d9aec26bf2a1fe307a173fc2731e4757583a1c0b96d78b": "bc58ac28be4854fb198b895c7fd999f599b5a961", "a351c2d792a73e9e0dbd7533821087b9a3fe3545006d2f7e7d7d4b10342f5ce7": "497eea6e0ed80501ca3beee714d71a5815495b07", "dd9c48c06081b3e7caeb7651bdb176d6c7fc057ede1415eeb1cde4abe499106d": "beff39b4edb449c66b704e1c64ee6ed58e30a868", + "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6": "746a2996967282281a980842a93642ad7d740f9e", + "cf3d0e680a362084aadb184a4a57a35432e5af885aa2f7838578e3116fb57c2e": "3e8f851df9319891fb9849c922437468df98915d", + "52d5bda9d4624da09a6efa8a9fe1c956e602ead506822f205486e915e9ba88a7": "c92aa5e5fedf94a01519867fd8235f33731b8191", + "a5340b6e01719a736a328cfff3a7449ddf77f76f138b07024648b6fcf15368de": "ee9dc592128ff337be5ef0bfb6d059752296b445", + "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293": "bda81f64be319d8793d284bf9d40f01d19b33515", + "2152eafd6573626b7467402838352d4cfbf22f43b4f9940eee7048aea7098dc1": "6c62326403ecdf3d120fa7ffea47f4f1d5b40020", + "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff": "333116e6884d85aaa4dfc7578a91cceeea66d016", + "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", + "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3": "447975ed022379fb6b80a22fa37c2d188ca3aa88", + "d1ca02145bc2d539ed45097712046228caf0e04d591ba4463a0ff2a0dad90f45": "e7c32e4f75a58c87de1672e4dbd0794083535a60", + "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", + "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23": "70e59b8abd67092f050462abc6cb5271e4c15f01", + "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", + "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", + "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae": "7afc276cb118adff72e4f16698f94bf3b2c64146", + "191b5e58d65eee4b2ae74aefd882b0df44d321be6c226349293fad7c10fcdcbf": "3dd12d7ba54fee06a7e20dadb2c278a23a17af50", + "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", + "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", + "f213042b9b166b443b8a5a336a325ba4a2ae9482db369754932a7b3c802ed980": "35f92a0477a88f5cf564971125047ffcfa02ec10", + "3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc", + "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094": "86fc8dc0932f983efa199e31ae05a4424772f959", "9e443aa45fe8dde921c91fbebfb510afcb2a8566d3fc34e5b6bdadfa50fa42a9": "ce08f6a808701fc6672230a790167ee485157561", "faed05692fbb2efa86d3dc64c5e5d48de34cb761058dde8347fad8e3b185f93c": "8399e384804d8d29866caa4c8763d7a61946a467", "1e4b3144defa48b102e91818b0ee3b53a7e06906ba5394d7bd3ab3e8161b2e15": "33877ff637dc5f4c5388799fd7e2159b48e72893", @@ -325068,33 +325166,6 @@ "Daphne/uvt.zip": [ "34bf7dc699080552e89342bf8ad59dc6a2f0a5db" ], - "Arcade/FBAlpha 2012/samples/dkong.zip": [ - "764ec667084bc237c1de6bd1db7541ad8cb59975" - ], - "FBAlpha 2012/samples/dkong.zip": [ - "764ec667084bc237c1de6bd1db7541ad8cb59975" - ], - "samples/dkong.zip": [ - "764ec667084bc237c1de6bd1db7541ad8cb59975" - ], - "Arcade/FBAlpha 2012/samples/dkongjr.zip": [ - "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" - ], - "FBAlpha 2012/samples/dkongjr.zip": [ - "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" - ], - "samples/dkongjr.zip": [ - "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" - ], - "Arcade/FBAlpha 2012/samples/galaga.zip": [ - "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" - ], - "FBAlpha 2012/samples/galaga.zip": [ - "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" - ], - "samples/galaga.zip": [ - "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" - ], "Arcade/FBNeo/.variants/hiscore.dat.37fc4e05": [ "1bef29ccc16eeb2e3c0759bfd2a4f86b1aba03a7" ], @@ -342398,6 +342469,24 @@ "roms/gts80a.zip": [ "d1e956230118b8198c526693cd24d70ec2050e7b" ], + "Arcade/fba2012/samples/dkong.zip": [ + "764ec667084bc237c1de6bd1db7541ad8cb59975" + ], + "fba2012/samples/dkong.zip": [ + "764ec667084bc237c1de6bd1db7541ad8cb59975" + ], + "samples/dkong.zip": [ + "764ec667084bc237c1de6bd1db7541ad8cb59975" + ], + "Arcade/fba2012/samples/dkongjr.zip": [ + "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" + ], + "fba2012/samples/dkongjr.zip": [ + "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" + ], + "samples/dkongjr.zip": [ + "2725373cc8e6e3c04bca4bf7bd0b027be6bec058" + ], "Arcade/fba2012/samples/fireshrk.zip": [ "cdb09d3ffaa867ff9e7387cf1934e9011565d546" ], @@ -342407,6 +342496,15 @@ "samples/fireshrk.zip": [ "cdb09d3ffaa867ff9e7387cf1934e9011565d546" ], + "Arcade/fba2012/samples/galaga.zip": [ + "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" + ], + "fba2012/samples/galaga.zip": [ + "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" + ], + "samples/galaga.zip": [ + "9e52cc30850cf9e1855fbd2e26f987cbc05b910a" + ], "Arcade/fba2012/samples/ghox.zip": [ "11ab10d51b27594f71336dd6d83ef30cd2742e6e" ], @@ -476942,12 +477040,6 @@ "Intellivision/IVOICE.BIN": [ "618563e512ff5665183664f52270fa9606c9d289" ], - "Microsoft/Chihiro/cerbios.bin": [ - "5996972d3e033f6c525c1988c563b4ffe4c58f22" - ], - "Chihiro/cerbios.bin": [ - "5996972d3e033f6c525c1988c563b4ffe4c58f22" - ], "Microsoft/MSX/.variants/CARTS.SHA.bf5fb954": [ "bf5fb954db868e523febccc68549ed9187961076" ], @@ -484253,135 +484345,6 @@ "N-Gage/SYM.ROM": [ "34e5be43effe08435b4535b68b45bb9e61d384e9" ], - "Oric/Oric/8dos2.rom": [ - "746a2996967282281a980842a93642ad7d740f9e" - ], - "Oric/8dos2.rom": [ - "746a2996967282281a980842a93642ad7d740f9e" - ], - "Oric/Oric/Bas122de.pch": [ - "3e8f851df9319891fb9849c922437468df98915d" - ], - "Oric/Bas122de.pch": [ - "3e8f851df9319891fb9849c922437468df98915d" - ], - "Oric/Oric/Bas122fr.pch": [ - "c92aa5e5fedf94a01519867fd8235f33731b8191" - ], - "Oric/Bas122fr.pch": [ - "c92aa5e5fedf94a01519867fd8235f33731b8191" - ], - "Oric/Oric/Bas122uk.pch": [ - "ee9dc592128ff337be5ef0bfb6d059752296b445" - ], - "Oric/Bas122uk.pch": [ - "ee9dc592128ff337be5ef0bfb6d059752296b445" - ], - "Oric/Oric/Oric/colour.rom": [ - "bda81f64be319d8793d284bf9d40f01d19b33515" - ], - "Oric/Oric/colour.rom": [ - "bda81f64be319d8793d284bf9d40f01d19b33515" - ], - "Oric/colour.rom": [ - "bda81f64be319d8793d284bf9d40f01d19b33515" - ], - "Oric/Oric/basic10.pch": [ - "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" - ], - "Oric/basic10.pch": [ - "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" - ], - "Oric/Oric/basic10.rom": [ - "333116e6884d85aaa4dfc7578a91cceeea66d016" - ], - "Oric/basic10.rom": [ - "333116e6884d85aaa4dfc7578a91cceeea66d016" - ], - "Oric/Oric/basic11b.rom": [ - "9451a1a09d8f75944dbd6f91193fc360f1de80ac" - ], - "Oric/basic11b.rom": [ - "9451a1a09d8f75944dbd6f91193fc360f1de80ac" - ], - "Oric/Oric/bd500.rom": [ - "447975ed022379fb6b80a22fa37c2d188ca3aa88" - ], - "Oric/bd500.rom": [ - "447975ed022379fb6b80a22fa37c2d188ca3aa88" - ], - "Oric/Oric/empty_orix.rom": [ - "e7c32e4f75a58c87de1672e4dbd0794083535a60" - ], - "Oric/empty_orix.rom": [ - "e7c32e4f75a58c87de1672e4dbd0794083535a60" - ], - "Oric/Oric/hyperbas.rom": [ - "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" - ], - "Oric/hyperbas.rom": [ - "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" - ], - "Oric/Oric/jasmin.rom": [ - "70e59b8abd67092f050462abc6cb5271e4c15f01" - ], - "Oric/jasmin.rom": [ - "70e59b8abd67092f050462abc6cb5271e4c15f01" - ], - "Oric/Oric/kernel.rom": [ - "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" - ], - "Oric/kernel.rom": [ - "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" - ], - "Oric/Oric/microdis.rom": [ - "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" - ], - "Oric/microdis.rom": [ - "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" - ], - "Oric/Oric/pravetz.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], - "Oric/pravetz.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], - "Oric/Oric/pravetzt.pch": [ - "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" - ], - "Oric/pravetzt.pch": [ - "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" - ], - "Oric/Oric/shell.rom": [ - "926b95e1cb574d4914dbed0681729a7c1a4bc68d" - ], - "Oric/shell.rom": [ - "926b95e1cb574d4914dbed0681729a7c1a4bc68d" - ], - "Oric/Oric/teleass.rom": [ - "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" - ], - "Oric/teleass.rom": [ - "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" - ], - "Oric/Oric/telmatic.rom": [ - "35f92a0477a88f5cf564971125047ffcfa02ec10" - ], - "Oric/telmatic.rom": [ - "35f92a0477a88f5cf564971125047ffcfa02ec10" - ], - "Oric/Oric/telmon24.pch": [ - "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" - ], - "Oric/telmon24.pch": [ - "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" - ], - "Oric/Oric/telmon24.rom": [ - "86fc8dc0932f983efa199e31ae05a4424772f959" - ], - "Oric/telmon24.rom": [ - "86fc8dc0932f983efa199e31ae05a4424772f959" - ], "Other/Clock Signal/AppleII/scsi.rom": [ "451c85c46b92e6ad2ad930f055ccf0fe3049936d" ], @@ -512961,228 +512924,465 @@ "LaserActive/laseractive_dyw_1322a.bin": [ "b1e48d1f5e494a6cbece61cfca4469dea33fba4b" ], + "QEMU/QEMU/MacROM.bin": [ + "f2a9ce387019bf272c6e3459d961b30f28942ac5" + ], "QEMU/MacROM.bin": [ "f2a9ce387019bf272c6e3459d961b30f28942ac5" ], + "QEMU/QEMU/QEMU,cgthree.bin": [ + "619b86fb02faf8f682474be3f0653b58015008ba" + ], "QEMU/QEMU,cgthree.bin": [ "619b86fb02faf8f682474be3f0653b58015008ba" ], + "QEMU/QEMU/QEMU,tcx.bin": [ + "5f1792a73ee47d78b2160191ecb2c92f353f93ad" + ], "QEMU/QEMU,tcx.bin": [ "5f1792a73ee47d78b2160191ecb2c92f353f93ad" ], + "QEMU/QEMU/ast27x0_bootrom.bin": [ + "9dda4cbcc1d3f6d38c10fee3de53b9abd5e47ec0" + ], "QEMU/ast27x0_bootrom.bin": [ "9dda4cbcc1d3f6d38c10fee3de53b9abd5e47ec0" ], + "QEMU/QEMU/bamboo.dtb": [ + "ebdf1745479f4ec88459bbd9ef16ee1114018508" + ], "QEMU/bamboo.dtb": [ "ebdf1745479f4ec88459bbd9ef16ee1114018508" ], + "QEMU/QEMU/bios-256k.bin": [ + "5fe6078506094333106e6b3f33c7185dea7f0268" + ], + "QEMU/QEMU/bios-microvm.bin": [ + "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257" + ], "QEMU/bios-microvm.bin": [ "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257" ], + "QEMU/QEMU/bios.bin": [ + "f402170ee4f374c304a7ce0b139d6cecb1732aff" + ], + "QEMU/QEMU/bios_loongson3.bin": [ + "8e99ed6157811282b7570f5f2e13b81a3913497e" + ], "QEMU/bios_loongson3.bin": [ "8e99ed6157811282b7570f5f2e13b81a3913497e" ], + "QEMU/QEMU/canon-a1100-rom1.bin": [ + "3df540b7517f27b3a76e31f193821d04e5805f89" + ], "QEMU/canon-a1100-rom1.bin": [ "3df540b7517f27b3a76e31f193821d04e5805f89" ], + "QEMU/QEMU/canyonlands.dtb": [ + "8a2fda0b4f23a92eb44776b5d7ffe951987062da" + ], "QEMU/canyonlands.dtb": [ "8a2fda0b4f23a92eb44776b5d7ffe951987062da" ], + "QEMU/QEMU/edk2-aarch64-code.fd": [ + "514edbce58bfa877170673c1799351a7dab3b6df" + ], "QEMU/edk2-aarch64-code.fd": [ "514edbce58bfa877170673c1799351a7dab3b6df" ], + "QEMU/QEMU/edk2-arm-code.fd": [ + "c20f01c28b59b388abb9d0febeec45d801a632f0" + ], "QEMU/edk2-arm-code.fd": [ "c20f01c28b59b388abb9d0febeec45d801a632f0" ], + "QEMU/QEMU/edk2-arm-vars.fd": [ + "b051167e0e57bd13d77ed92ef7b474872f44ec6d" + ], "QEMU/edk2-arm-vars.fd": [ "b051167e0e57bd13d77ed92ef7b474872f44ec6d" ], + "QEMU/QEMU/edk2-i386-code.fd": [ + "45b8faebdfaaf19d16e3a7c5f60d69214685071c" + ], "QEMU/edk2-i386-code.fd": [ "45b8faebdfaaf19d16e3a7c5f60d69214685071c" ], + "QEMU/QEMU/edk2-i386-secure-code.fd": [ + "6982abec8ef2ed7c8293163d5a0bd69a01a2126f" + ], "QEMU/edk2-i386-secure-code.fd": [ "6982abec8ef2ed7c8293163d5a0bd69a01a2126f" ], + "QEMU/QEMU/edk2-i386-vars.fd": [ + "b62e676c9317a32aaa9ee1d76268d8c55663bd6e" + ], "QEMU/edk2-i386-vars.fd": [ "b62e676c9317a32aaa9ee1d76268d8c55663bd6e" ], + "QEMU/QEMU/edk2-riscv-code.fd": [ + "2c8633d881ece0c4794d740138a318f7e9af480c" + ], "QEMU/edk2-riscv-code.fd": [ "2c8633d881ece0c4794d740138a318f7e9af480c" ], + "QEMU/QEMU/edk2-riscv-vars.fd": [ + "c4e6cce4247ba8f32f528c1c69f49228f616677f" + ], "QEMU/edk2-riscv-vars.fd": [ "c4e6cce4247ba8f32f528c1c69f49228f616677f" ], + "QEMU/QEMU/edk2-x86_64-code.fd": [ + "eac1a94b8e0d7c53fd5df001c36794ec34c7c724" + ], "QEMU/edk2-x86_64-code.fd": [ "eac1a94b8e0d7c53fd5df001c36794ec34c7c724" ], + "QEMU/QEMU/edk2-x86_64-secure-code.fd": [ + "617abe2746696bb4a309d72cecb446dc76a2a61e" + ], "QEMU/edk2-x86_64-secure-code.fd": [ "617abe2746696bb4a309d72cecb446dc76a2a61e" ], + "QEMU/QEMU/efi-e1000.rom": [ + "a3df5fc33ab0190f470b34104ff3c0679cecbab6" + ], "QEMU/efi-e1000.rom": [ "a3df5fc33ab0190f470b34104ff3c0679cecbab6" ], + "QEMU/QEMU/efi-e1000e.rom": [ + "1d37f3ae6748d4deefe9fd5188a2f557bf265d61" + ], "QEMU/efi-e1000e.rom": [ "1d37f3ae6748d4deefe9fd5188a2f557bf265d61" ], + "QEMU/QEMU/efi-eepro100.rom": [ + "956d9592fea33374ef0f1900a185b6e1109ea765" + ], "QEMU/efi-eepro100.rom": [ "956d9592fea33374ef0f1900a185b6e1109ea765" ], + "QEMU/QEMU/efi-ne2k_pci.rom": [ + "adb7199f545fdb66c325b142c8dbc4cddb99a20d" + ], "QEMU/efi-ne2k_pci.rom": [ "adb7199f545fdb66c325b142c8dbc4cddb99a20d" ], + "QEMU/QEMU/efi-pcnet.rom": [ + "9e5a4bb247c6a1777c89117ca091f94342b9046d" + ], "QEMU/efi-pcnet.rom": [ "9e5a4bb247c6a1777c89117ca091f94342b9046d" ], + "QEMU/QEMU/efi-rtl8139.rom": [ + "99a1e431cc0cb0a78d5803875dfa687e12a947f4" + ], "QEMU/efi-rtl8139.rom": [ "99a1e431cc0cb0a78d5803875dfa687e12a947f4" ], + "QEMU/QEMU/efi-virtio.rom": [ + "1596e9b97f0bc8b5ff3e444235690a549ee982c6" + ], "QEMU/efi-virtio.rom": [ "1596e9b97f0bc8b5ff3e444235690a549ee982c6" ], + "QEMU/QEMU/efi-vmxnet3.rom": [ + "6557242402387a6319a0db6abb916ada48e1391c" + ], "QEMU/efi-vmxnet3.rom": [ "6557242402387a6319a0db6abb916ada48e1391c" ], + "QEMU/QEMU/hppa-firmware.img": [ + "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0" + ], "QEMU/hppa-firmware.img": [ "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0" ], + "QEMU/QEMU/hppa-firmware64.img": [ + "b42f6d4ca74073de6c038579b4a9323ad0a6b398" + ], "QEMU/hppa-firmware64.img": [ "b42f6d4ca74073de6c038579b4a9323ad0a6b398" ], + "QEMU/QEMU/kvmvapic.bin": [ + "670c9cc79b4859944705eece710dc332188b79b4" + ], "QEMU/kvmvapic.bin": [ "670c9cc79b4859944705eece710dc332188b79b4" ], + "QEMU/QEMU/linuxboot.bin": [ + "fd19bef7f5647960952520389f448364762ed948" + ], "QEMU/linuxboot.bin": [ "fd19bef7f5647960952520389f448364762ed948" ], + "QEMU/QEMU/linuxboot_dma.bin": [ + "0bff50c10727bd9c85c831ea92b7a52699959992" + ], "QEMU/linuxboot_dma.bin": [ "0bff50c10727bd9c85c831ea92b7a52699959992" ], + "QEMU/QEMU/mips_bios.bin": [ + "358abab78f3bfba72b7b45cb5dd66ce4411e2618" + ], "QEMU/mips_bios.bin": [ "358abab78f3bfba72b7b45cb5dd66ce4411e2618" ], + "QEMU/QEMU/mipsel_bios.bin": [ + "daa15fb1b8829da5c5bd473243acf19cd0f17a74" + ], "QEMU/mipsel_bios.bin": [ "daa15fb1b8829da5c5bd473243acf19cd0f17a74" ], + "QEMU/QEMU/multiboot.bin": [ + "a8b58ae464fc6fb26799432ae867bf57c546ff80" + ], "QEMU/multiboot.bin": [ "a8b58ae464fc6fb26799432ae867bf57c546ff80" ], + "QEMU/QEMU/multiboot_dma.bin": [ + "32ab1cf336b674bfb154eb7a939a3e3275a92647" + ], "QEMU/multiboot_dma.bin": [ "32ab1cf336b674bfb154eb7a939a3e3275a92647" ], + "QEMU/QEMU/npcm7xx_bootrom.bin": [ + "22a75d26a0591d2c7763765b6381fa2f73de43e1" + ], "QEMU/npcm7xx_bootrom.bin": [ "22a75d26a0591d2c7763765b6381fa2f73de43e1" ], + "QEMU/QEMU/npcm8xx_bootrom.bin": [ + "732d7ebd8496debd6455f19db8e1d8d1a8be1f33" + ], "QEMU/npcm8xx_bootrom.bin": [ "732d7ebd8496debd6455f19db8e1d8d1a8be1f33" ], + "QEMU/QEMU/openbios-ppc": [ + "0ef5051dcb318c0bc45d1908f8318d6eece8686a" + ], "QEMU/openbios-ppc": [ "0ef5051dcb318c0bc45d1908f8318d6eece8686a" ], + "QEMU/QEMU/openbios-sparc32": [ + "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26" + ], "QEMU/openbios-sparc32": [ "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26" ], + "QEMU/QEMU/openbios-sparc64": [ + "c6e215fe460629d35688ab8e51faf6f765827cd6" + ], "QEMU/openbios-sparc64": [ "c6e215fe460629d35688ab8e51faf6f765827cd6" ], + "QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin": [ + "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f" + ], "QEMU/opensbi-riscv32-generic-fw_dynamic.bin": [ "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f" ], + "QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin": [ + "6883bfd1991c0ef0d67b0967e7dcbd60420dd480" + ], "QEMU/opensbi-riscv64-generic-fw_dynamic.bin": [ "6883bfd1991c0ef0d67b0967e7dcbd60420dd480" ], + "QEMU/QEMU/palcode-clipper": [ + "47b0870aaa45a7aa0d48847fd905908fb06f3e9f" + ], "QEMU/palcode-clipper": [ "47b0870aaa45a7aa0d48847fd905908fb06f3e9f" ], + "QEMU/QEMU/pegasos2.dtb": [ + "a4c1a8d4b15ade6653364286a160759b5b4caa85" + ], "QEMU/pegasos2.dtb": [ "a4c1a8d4b15ade6653364286a160759b5b4caa85" ], + "QEMU/QEMU/petalogix-ml605.dtb": [ + "892d265838866869b8a8ef104252ff5b2fda156f" + ], "QEMU/petalogix-ml605.dtb": [ "892d265838866869b8a8ef104252ff5b2fda156f" ], + "QEMU/QEMU/petalogix-s3adsp1800.dtb": [ + "976600e3f89ecc1f3564b7077f53c58e0b565280" + ], "QEMU/petalogix-s3adsp1800.dtb": [ "976600e3f89ecc1f3564b7077f53c58e0b565280" ], + "QEMU/QEMU/pmon_2e.bin": [ + "41c43f4e8956169ab7602230a3a63934b26d65de" + ], "QEMU/pmon_2e.bin": [ "41c43f4e8956169ab7602230a3a63934b26d65de" ], + "QEMU/QEMU/pnv-pnor.bin": [ + "d8bf94da3e018ac22c1f63246acc3aa1e9a07992" + ], "QEMU/pnv-pnor.bin": [ "d8bf94da3e018ac22c1f63246acc3aa1e9a07992" ], + "QEMU/QEMU/pvh.bin": [ + "c2191e6495103c1f43e9b6ca8930e44c2245e476" + ], "QEMU/pvh.bin": [ "c2191e6495103c1f43e9b6ca8930e44c2245e476" ], + "QEMU/QEMU/pxe-e1000.rom": [ + "368e8e9827ae8757a7449319831078b6d5efb83f" + ], "QEMU/pxe-e1000.rom": [ "368e8e9827ae8757a7449319831078b6d5efb83f" ], + "QEMU/QEMU/pxe-eepro100.rom": [ + "b19572c9c2a11f03282df81c0397aceed409a86c" + ], "QEMU/pxe-eepro100.rom": [ "b19572c9c2a11f03282df81c0397aceed409a86c" ], + "QEMU/QEMU/pxe-ne2k_pci.rom": [ + "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6" + ], "QEMU/pxe-ne2k_pci.rom": [ "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6" ], + "QEMU/QEMU/pxe-pcnet.rom": [ + "13a039bf9916f1db42d3a019591d372b4cf4aee9" + ], "QEMU/pxe-pcnet.rom": [ "13a039bf9916f1db42d3a019591d372b4cf4aee9" ], + "QEMU/QEMU/pxe-rtl8139.rom": [ + "7b512c0a7a13bc3c254a25237e4d4612170f4391" + ], "QEMU/pxe-rtl8139.rom": [ "7b512c0a7a13bc3c254a25237e4d4612170f4391" ], + "QEMU/QEMU/pxe-virtio.rom": [ + "3e3f77cfe70af904133db94f27ec24e3c9c43648" + ], "QEMU/pxe-virtio.rom": [ "3e3f77cfe70af904133db94f27ec24e3c9c43648" ], + "QEMU/QEMU/qboot.rom": [ + "339d3a93c967491c9f1fffe963484386f48bd22c" + ], "QEMU/qboot.rom": [ "339d3a93c967491c9f1fffe963484386f48bd22c" ], + "QEMU/QEMU/qemu_vga.ndrv": [ + "638c6262a6eb579ec3d1c9292566ac94c942dc15" + ], "QEMU/qemu_vga.ndrv": [ "638c6262a6eb579ec3d1c9292566ac94c942dc15" ], + "QEMU/QEMU/s390-ccw.img": [ + "7b4fa888d32ca8ddbc752f7442e4d055cee1871a" + ], "QEMU/s390-ccw.img": [ "7b4fa888d32ca8ddbc752f7442e4d055cee1871a" ], + "QEMU/QEMU/s390-netboot.img": [ + "f6cec671408117bd9a31e982682662f27ef4fb2c" + ], "QEMU/s390-netboot.img": [ "f6cec671408117bd9a31e982682662f27ef4fb2c" ], + "QEMU/QEMU/skiboot.lid": [ + "8052069aa9714c23be05b4e62fb245a3d572cb0f" + ], "QEMU/skiboot.lid": [ "8052069aa9714c23be05b4e62fb245a3d572cb0f" ], + "QEMU/QEMU/slof.bin": [ + "a03a94acfe555804d66cc6c74760ae1375a71a64" + ], "QEMU/slof.bin": [ "a03a94acfe555804d66cc6c74760ae1375a71a64" ], + "QEMU/QEMU/u-boot-sam460-20100605.bin": [ + "0399a79ac0cf77f0da70af9baec7548a3b368f0a" + ], "QEMU/u-boot-sam460-20100605.bin": [ "0399a79ac0cf77f0da70af9baec7548a3b368f0a" ], + "QEMU/QEMU/u-boot.bin": [ + "2aa01b414a703880192277f9ce0dae193e9d2c8d" + ], "QEMU/u-boot.bin": [ "2aa01b414a703880192277f9ce0dae193e9d2c8d" ], + "QEMU/QEMU/u-boot.e500": [ + "9ea03f249f856cdcb4399cc1f5a5031729379911" + ], "QEMU/u-boot.e500": [ "9ea03f249f856cdcb4399cc1f5a5031729379911" ], + "QEMU/QEMU/vgabios-ati.bin": [ + "ded141cacdebf557ec552597cbf57cd989cec3e2" + ], "QEMU/vgabios-ati.bin": [ "ded141cacdebf557ec552597cbf57cd989cec3e2" ], + "QEMU/QEMU/vgabios-bochs-display.bin": [ + "9e2edd3d835219cde63a20e2cd58107d7e96ef5b" + ], "QEMU/vgabios-bochs-display.bin": [ "9e2edd3d835219cde63a20e2cd58107d7e96ef5b" ], + "QEMU/QEMU/vgabios-cirrus.bin": [ + "883eb2657ce29661a0466b6b41ce75411f37aad9" + ], "QEMU/vgabios-cirrus.bin": [ "883eb2657ce29661a0466b6b41ce75411f37aad9" ], + "QEMU/QEMU/vgabios-qxl.bin": [ + "527227abd5f3348c382d4b02703389fbeb83b067" + ], "QEMU/vgabios-qxl.bin": [ "527227abd5f3348c382d4b02703389fbeb83b067" ], + "QEMU/QEMU/vgabios-ramfb.bin": [ + "49df9be557f0f0277c8fedb889257e279586d536" + ], "QEMU/vgabios-ramfb.bin": [ "49df9be557f0f0277c8fedb889257e279586d536" ], + "QEMU/QEMU/vgabios-stdvga.bin": [ + "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5" + ], + "QEMU/QEMU/vgabios-virtio.bin": [ + "cddc53b94793609d1e837d78cd5468fcc1ed9164" + ], "QEMU/vgabios-virtio.bin": [ "cddc53b94793609d1e837d78cd5468fcc1ed9164" ], + "QEMU/QEMU/vgabios-vmware.bin": [ + "c54901ab8f526ab201ebf1b3ecdf711e38e6c259" + ], "QEMU/vgabios-vmware.bin": [ "c54901ab8f526ab201ebf1b3ecdf711e38e6c259" ], + "QEMU/QEMU/vgabios.bin": [ + "63d87e2a6618c3a9b2aabecf03ac2456e5e63410" + ], + "QEMU/QEMU/virtex-ml507.dtb": [ + "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1" + ], "QEMU/virtex-ml507.dtb": [ "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1" ], + "QEMU/QEMU/vof-nvram.bin": [ + "5d1184609b87f78635f0575467a1c3f440900ff0" + ], "QEMU/vof-nvram.bin": [ "5d1184609b87f78635f0575467a1c3f440900ff0" ], + "QEMU/QEMU/vof.bin": [ + "fc737b34a390f5752cb7e35b33d71f4f438ab607" + ], "QEMU/vof.bin": [ "fc737b34a390f5752cb7e35b33d71f4f438ab607" ], @@ -556221,16 +556421,28 @@ "Pro-1000/pro1000.zip": [ "94e1e19004b2d87735b6874d07d9ca2cca2b418c" ], - "Roland/CM32L_CONTROL.ROM": [ + "Roland/CM-32L/CM32L_CONTROL.ROM": [ "a439fbb390da38cada95a7cbb1d6ca199cd66ef8" ], - "Roland/CM32L_PCM.ROM": [ + "CM-32L/CM32L_CONTROL.ROM": [ + "a439fbb390da38cada95a7cbb1d6ca199cd66ef8" + ], + "Roland/CM-32L/CM32L_PCM.ROM": [ "289cc298ad532b702461bfc738009d9ebe8025ea" ], - "Roland/MT32_CONTROL.ROM": [ + "CM-32L/CM32L_PCM.ROM": [ + "289cc298ad532b702461bfc738009d9ebe8025ea" + ], + "Roland/MT-32/MT32_CONTROL.ROM": [ "b083518fffb7f66b03c23b7eb4f868e62dc5a987" ], - "Roland/MT32_PCM.ROM": [ + "MT-32/MT32_CONTROL.ROM": [ + "b083518fffb7f66b03c23b7eb4f868e62dc5a987" + ], + "Roland/MT-32/MT32_PCM.ROM": [ + "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252" + ], + "MT-32/MT32_PCM.ROM": [ "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252" ], "Roland/mt32-roms/ctrl_cm32l_1_00.rom": [ @@ -557502,6 +557714,12 @@ "Beena/beena.zip": [ "f63eca9a1b1e92ee1582ff5e4c0db55193f97e33" ], + "Sega/Chihiro/cerbios.bin": [ + "5996972d3e033f6c525c1988c563b4ffe4c58f22" + ], + "Chihiro/cerbios.bin": [ + "5996972d3e033f6c525c1988c563b4ffe4c58f22" + ], "Sega/Chihiro/fpr-23887_29lv160te.ic4": [ "77197fba2781ed1d81402c48bd743adb26d3161a" ], @@ -561435,6 +561653,135 @@ "VIS/vis.zip": [ "beff39b4edb449c66b704e1c64ee6ed58e30a868" ], + "Tangerine/Oric/8dos2.rom": [ + "746a2996967282281a980842a93642ad7d740f9e" + ], + "Oric/8dos2.rom": [ + "746a2996967282281a980842a93642ad7d740f9e" + ], + "Tangerine/Oric/Bas122de.pch": [ + "3e8f851df9319891fb9849c922437468df98915d" + ], + "Oric/Bas122de.pch": [ + "3e8f851df9319891fb9849c922437468df98915d" + ], + "Tangerine/Oric/Bas122fr.pch": [ + "c92aa5e5fedf94a01519867fd8235f33731b8191" + ], + "Oric/Bas122fr.pch": [ + "c92aa5e5fedf94a01519867fd8235f33731b8191" + ], + "Tangerine/Oric/Bas122uk.pch": [ + "ee9dc592128ff337be5ef0bfb6d059752296b445" + ], + "Oric/Bas122uk.pch": [ + "ee9dc592128ff337be5ef0bfb6d059752296b445" + ], + "Tangerine/Oric/Oric/colour.rom": [ + "bda81f64be319d8793d284bf9d40f01d19b33515" + ], + "Oric/Oric/colour.rom": [ + "bda81f64be319d8793d284bf9d40f01d19b33515" + ], + "Oric/colour.rom": [ + "bda81f64be319d8793d284bf9d40f01d19b33515" + ], + "Tangerine/Oric/basic10.pch": [ + "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" + ], + "Oric/basic10.pch": [ + "6c62326403ecdf3d120fa7ffea47f4f1d5b40020" + ], + "Tangerine/Oric/basic10.rom": [ + "333116e6884d85aaa4dfc7578a91cceeea66d016" + ], + "Oric/basic10.rom": [ + "333116e6884d85aaa4dfc7578a91cceeea66d016" + ], + "Tangerine/Oric/basic11b.rom": [ + "9451a1a09d8f75944dbd6f91193fc360f1de80ac" + ], + "Oric/basic11b.rom": [ + "9451a1a09d8f75944dbd6f91193fc360f1de80ac" + ], + "Tangerine/Oric/bd500.rom": [ + "447975ed022379fb6b80a22fa37c2d188ca3aa88" + ], + "Oric/bd500.rom": [ + "447975ed022379fb6b80a22fa37c2d188ca3aa88" + ], + "Tangerine/Oric/empty_orix.rom": [ + "e7c32e4f75a58c87de1672e4dbd0794083535a60" + ], + "Oric/empty_orix.rom": [ + "e7c32e4f75a58c87de1672e4dbd0794083535a60" + ], + "Tangerine/Oric/hyperbas.rom": [ + "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" + ], + "Oric/hyperbas.rom": [ + "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63" + ], + "Tangerine/Oric/jasmin.rom": [ + "70e59b8abd67092f050462abc6cb5271e4c15f01" + ], + "Oric/jasmin.rom": [ + "70e59b8abd67092f050462abc6cb5271e4c15f01" + ], + "Tangerine/Oric/kernel.rom": [ + "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" + ], + "Oric/kernel.rom": [ + "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6" + ], + "Tangerine/Oric/microdis.rom": [ + "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" + ], + "Oric/microdis.rom": [ + "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" + ], + "Tangerine/Oric/pravetz.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], + "Oric/pravetz.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], + "Tangerine/Oric/pravetzt.pch": [ + "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" + ], + "Oric/pravetzt.pch": [ + "3dd12d7ba54fee06a7e20dadb2c278a23a17af50" + ], + "Tangerine/Oric/shell.rom": [ + "926b95e1cb574d4914dbed0681729a7c1a4bc68d" + ], + "Oric/shell.rom": [ + "926b95e1cb574d4914dbed0681729a7c1a4bc68d" + ], + "Tangerine/Oric/teleass.rom": [ + "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" + ], + "Oric/teleass.rom": [ + "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d" + ], + "Tangerine/Oric/telmatic.rom": [ + "35f92a0477a88f5cf564971125047ffcfa02ec10" + ], + "Oric/telmatic.rom": [ + "35f92a0477a88f5cf564971125047ffcfa02ec10" + ], + "Tangerine/Oric/telmon24.pch": [ + "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" + ], + "Oric/telmon24.pch": [ + "d8ce5b1405b6428969493efeb6f3aa2027c41bdc" + ], + "Tangerine/Oric/telmon24.rom": [ + "86fc8dc0932f983efa199e31ae05a4424772f959" + ], + "Oric/telmon24.rom": [ + "86fc8dc0932f983efa199e31ae05a4424772f959" + ], "Texas Instruments/TI-83/TI83_102.rom": [ "ce08f6a808701fc6672230a790167ee485157561" ], @@ -580706,12 +581053,6 @@ "scerts/CACERT_NINTENDO_CA.der": [ "b5229455dd26c1f53c73060e9089b391389e1f75" ], - "Oric/Oric/pravetzt.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], - "Oric/pravetzt.rom": [ - "7afc276cb118adff72e4f16698f94bf3b2c64146" - ], "Other/SquirrelJME/squirreljme-0.3.0-test.jar": [ "600cf0440594b0c69339ba4b626a47288b342d77" ], @@ -594116,6 +594457,12 @@ "Oric/microdisc.rom": [ "0d2ef6e67322f48f4b7e08d8bbe68827e2074561" ], + "Tangerine/Oric/pravetzt.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], + "Oric/pravetzt.rom": [ + "7afc276cb118adff72e4f16698f94bf3b2c64146" + ], "ZC/ZC210/zc210/sf2/custom0.sf2": [ "286b2e1fb21cc79851da01666db6c0b0e88f25e3" ], diff --git a/emulators/lrps2.yml b/emulators/lrps2.yml index 3b1aa8d5..6b189103 100644 --- a/emulators/lrps2.yml +++ b/emulators/lrps2.yml @@ -1,12 +1,12 @@ # LRPS2 - libretro PlayStation 2 core -# Source: https://github.com/libretro/ps2 +# Source: https://github.com/libretro/parallel-ps2 # Upstream: https://github.com/PCSX2/pcsx2 emulator: LRPS2 type: libretro core_classification: community_fork bios_mode: agnostic -source: "https://github.com/libretro/ps2" +source: "https://github.com/libretro/parallel-ps2" upstream: "https://github.com/PCSX2/pcsx2" profiled_date: "2026-10-21" source_commit: "6664c60294ee05fe5e8c7645ab7da546dae78ed2" diff --git a/emulators/nesoid.yml b/emulators/nesoid.yml index 2a64be26..e9821479 100644 --- a/emulators/nesoid.yml +++ b/emulators/nesoid.yml @@ -141,7 +141,7 @@ files: 16 KB further in, so such a file needs at least 16656 bytes. Anything else is read as a raw 4352 byte image. A failed open or a short read leaves the Game Genie off and the content still runs. No hash is compared. - source_ref: "app/jni/neslib/cart.c:475-521 (open and format branch), app/jni/neslib/svga.c:132-140 (setter), app/jni/neslib/drivers/android/nesengine.cpp:242-243, app/jni/neslib/fce.c:1201-1203 (call site), EmulatorActivity.java:870-874, EmulatorSettingsFragment.java:179-193 (picker)" + source_ref: "app/jni/neslib/cart.c:475-521 (open and format branch), app/jni/neslib/svga.c:132-140 (setter), app/jni/neslib/drivers/android/nesengine.cpp:242-243, app/jni/neslib/fce.c:1201-1203 (call site), app/src/main/java/com/androidemu/nes/EmulatorActivity.java:870-874, app/src/main/java/com/androidemu/nes/EmulatorSettingsFragment.java:179-193 (picker)" - name: ".pal" system: nintendo-nes diff --git a/emulators/pce-emu.yml b/emulators/pce-emu.yml index 82f2af7a..fd27e46e 100644 --- a/emulators/pce-emu.yml +++ b/emulators/pce-emu.yml @@ -52,7 +52,7 @@ files: validation: [existence, size] min_size: 262144 category: bios - source_ref: "PCE.emu/src/main/Main.cc:80-91 (throws without it), PCE.emu/src/main/options.cc:275-301 (path resolution), PCE.emu/src/main/EmuMenuViews.cc:176-191 (selection), src/pce_fast/pce.cpp:477-483 + src/pce_fast/huc.cpp:284-304 (default module load), src/pce/pce.cpp:645-653 (accurate module load), src/pce_fast/pce.cpp:663 + src/pce/pce.cpp:1094 (name)" + source_ref: "PCE.emu/src/main/Main.cc:80-91 (throws without it), PCE.emu/src/main/options.cc:275-301 (path resolution), PCE.emu/src/main/EmuMenuViews.cc:176-191 (selection), PCE.emu/src/pce_fast/pce.cpp:477-483, PCE.emu/src/pce_fast/huc.cpp:284-304 (default module load), PCE.emu/src/pce/pce.cpp:645-653 (accurate module load), PCE.emu/src/pce_fast/pce.cpp:663, PCE.emu/src/pce/pce.cpp:1094 (name)" note: > min_size comes from the fixed 262144-byte read in pce_fast (huc.cpp:302) with Stream::read throwing on a short file @@ -64,7 +64,7 @@ files: required: false validation: [existence] category: bios - source_ref: "src/pce/pce.cpp:512-551 (DetectGECD), src/pce/pce.cpp:644-646 (gecdbios branch), src/pce/huc.cpp:225-316 (size-agnostic read), src/pce/pce.cpp:1095 (name)" + source_ref: "PCE.emu/src/pce/pce.cpp:512-551 (DetectGECD), PCE.emu/src/pce/pce.cpp:644-646 (gecdbios branch), PCE.emu/src/pce/huc.cpp:225-316 (size-agnostic read), PCE.emu/src/pce/pce.cpp:1095 (name)" note: > Reached only when the accurate module runs and DetectGECD matches the disc, since pce_fast has no Games Express branch. Served through the same diff --git a/emulators/stonesoup.yml b/emulators/stonesoup.yml index 8fdc9a6c..c2d1339e 100644 --- a/emulators/stonesoup.yml +++ b/emulators/stonesoup.yml @@ -16,10 +16,10 @@ notes: | Accepts .crawlrc config files as content (supported_extensions: crawlrc). The libretro wrapper sets -dir to the content directory. - ref: libretro/libretro.cc:178-198 (main_wrap() passes -dir content_dir) + ref: crawl-ref/libretro/libretro.cc:178-198 (main_wrap() passes -dir content_dir) Game data loaded at runtime from dat/ tree via datafile_path(). - ref: source/files.cc:375-458 (_get_base_dirs() + datafile_path()) + ref: crawl-ref/source/files.cc:375-458 (_get_base_dirs() + datafile_path()) No DATA_DIR_PATH defined in Makefile.libretro, so it falls back to SysEnv.crawl_dir. Data is NOT compiled into the binary. @@ -37,7 +37,7 @@ notes: | data_directories: - ref: stonesoup installed_on: [recalbox] - source_ref: "source/files.cc:375-458" + source_ref: "crawl-ref/source/files.cc:375-458" files: [] # no BIOS/firmware, game data loaded via data_directories diff --git a/emulators/trident.yml b/emulators/trident.yml index 0ffd332b..498e196e 100644 --- a/emulators/trident.yml +++ b/emulators/trident.yml @@ -3,9 +3,10 @@ display_name: "Nintendo - 3DS (Trident)" type: libretro core_classification: community_fork source: https://github.com/DanAlexMorton/3dsTrident -upstream: https://github.com/wheremyfoodat/Panda3DS +upstream: https://github.com/DanAlexMorton/Panda3DS profiled_date: "2026-03-25" source_commit: "b97b0befa326105e181838bc6fa11c546de8294d" +upstream_commit: "69095ee6d68d21eacac8d1517f0b7b4ed27884d3" core_version: git library_name: "Trident" @@ -24,8 +25,10 @@ notes: >- Files are resolved from the RetroArch save directory (/Emulator Files/sysdata/), not the system directory, or from the working directory when the frontend gives none. The core reports - library_name "Trident". The wrapper is vendor/Panda3DS at 69095ee6 - (DanAlexMorton/Panda3DS src/libretro_core.cpp:30, 243, 280-285). + library_name "Trident" (src/libretro_core.cpp:29, 243, 280-285). + 3dsTrident builds the vendor/Panda3DS submodule, DanAlexMorton/Panda3DS + at 69095ee6, a fork of wheremyfoodat/Panda3DS from their merge base + 944b9892. The libretro wrapper and the files cited below are in that tree. files: - name: aes_keys.txt diff --git a/emulators/uqm.yml b/emulators/uqm.yml index bbbf4f84..54243aef 100644 --- a/emulators/uqm.yml +++ b/emulators/uqm.yml @@ -60,7 +60,7 @@ files: validation: [md5] description: "UQM core game data archive" note: "Published apart from the source release. The RetroPie scriptmodule downloads it into content/packages." - source_ref: "build/win32_install/packages.nsh:3-5; sc2/build/win32_install/uqm-installer.nsi:289-306" + source_ref: "sc2/build/win32_install/packages.nsh:3-5; sc2/build/win32_install/uqm-installer.nsi:289-306" - name: uqm-0.8.0-3domusic.uqm path: uqm/content/addons/uqm-0.8.0-3domusic.uqm @@ -70,7 +70,7 @@ files: md5: "9e5801d45ca12028b486cdeb83568c02" validation: [md5] description: "UQM 3DO music track pack" - source_ref: "build/win32_install/packages.nsh:6-8; sc2/build/win32_install/uqm-installer.nsi:315-327, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:6-8; sc2/build/win32_install/uqm-installer.nsi:315-327, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" - name: uqm-0.8.0-voice.uqm path: uqm/content/addons/uqm-0.8.0-voice.uqm @@ -80,7 +80,7 @@ files: md5: "fc89f77d7b66c2669abca6c157f5259a" validation: [md5] description: "UQM alien-race voice-over pack" - source_ref: "build/win32_install/packages.nsh:9-11; sc2/build/win32_install/uqm-installer.nsi:329-341, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:9-11; sc2/build/win32_install/uqm-installer.nsi:329-341, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" - name: uqm-remix-disc1.uqm path: uqm/content/addons/uqm-remix-disc1.uqm @@ -90,7 +90,7 @@ files: md5: "09f242d8d72166d1d5ccbd3d99c93e7d" validation: [md5] description: "Precursor Remix disc 1 (modern remixes)" - source_ref: "build/win32_install/packages.nsh:12-14; sc2/build/win32_install/uqm-installer.nsi:345-358, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:12-14; sc2/build/win32_install/uqm-installer.nsi:345-358, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" - name: uqm-remix-disc2.uqm path: uqm/content/addons/uqm-remix-disc2.uqm @@ -100,7 +100,7 @@ files: md5: "fbc8bdcb709939d559d8c7216ad15cc2" validation: [md5] description: "Precursor Remix disc 2" - source_ref: "build/win32_install/packages.nsh:15-17, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:15-17, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" - name: uqm-remix-disc3.uqm path: uqm/content/addons/uqm-remix-disc3.uqm @@ -110,7 +110,7 @@ files: md5: "5ccc6d4ac301ae98e172ac6835dcdead" validation: [md5] description: "Precursor Remix disc 3" - source_ref: "build/win32_install/packages.nsh:18-20, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:18-20, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" - name: uqm-remix-disc4-1.uqm path: uqm/content/addons/uqm-remix-disc4-1.uqm @@ -120,4 +120,4 @@ files: md5: "3fb63f4ac514343ed4b4b5b194c413fb" validation: [md5] description: "Precursor Remix disc 4-1" - source_ref: "build/win32_install/packages.nsh:21-23, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" + source_ref: "sc2/build/win32_install/packages.nsh:21-23, sc2/src/options.c:393-402, 518-551, sc2/src/uqm/setup.c:118-132" diff --git a/install.ps1 b/install.ps1 index 04f64092..0a17aab8 100644 --- a/install.ps1 +++ b/install.ps1 @@ -11,7 +11,7 @@ $ErrorActionPreference = "Stop" $defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py" - $defaultInstallSha256 = "532f0b8d96e0dcf62164daa16837dc21918ced45d46c01e84dd60650dcc73256" + $defaultInstallSha256 = "2606f825ea887d70d58c8938fa726bd92236161b907159d34643bff24ca349fc" $maximumInstallerBytes = 2MB $installerExit = 0 $installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null } diff --git a/install.py b/install.py index f207d986..f44ad0be 100644 --- a/install.py +++ b/install.py @@ -18,6 +18,7 @@ import argparse import codecs import concurrent.futures import contextlib +import datetime import errno import hashlib import http.client @@ -46,7 +47,7 @@ import urllib.request import xml.etree.ElementTree as ET import zipfile import zlib -from collections.abc import Callable, Iterator, Mapping +from collections.abc import Callable, Collection, Iterator, Mapping from pathlib import Path, PurePosixPath from typing import BinaryIO, NamedTuple, TextIO @@ -289,6 +290,8 @@ def _os_default_dests(os_type: str) -> dict[str, Path]: # Set when the run is interrupted, so queued downloads end instead of draining # the pool: every future is submitted before the first one completes. _stop = threading.Event() +# Set once a run starts writing: Ctrl+C before that has nothing to carry on. +_writing = threading.Event() class _Interrupted(Exception): """Raised inside a worker once the run has been stopped.""" @@ -328,6 +331,9 @@ class Terminal: """What the output stream can show: a live line, colour, or neither. A pipe or a log gets plain lines, and NO_COLOR and TERM=dumb are honoured. + As no-color.org reads it, an empty NO_COLOR is not set: `NO_COLOR= cmd` + turned colour off. FORCE_COLOR or CLICOLOR_FORCE paints a pipe, for a + log viewer that shows colour, and never makes the line live. """ def __init__(self, stream: TextIO | None = None, quiet: bool = False) -> None: @@ -335,8 +341,10 @@ class Terminal: self.quiet = quiet isatty = getattr(self.stream, "isatty", None) self.live = bool(isatty and isatty()) and os.environ.get("TERM") != "dumb" + forced = any(os.environ.get(name, "0") not in ("", "0") + for name in ("FORCE_COLOR", "CLICOLOR_FORCE")) self.colour = ( - self.live and "NO_COLOR" not in os.environ and _enable_ansi() + (self.live or forced) and not os.environ.get("NO_COLOR") and _enable_ansi() ) if not self.colour: self.live = self.live and os.name != "nt" @@ -383,6 +391,9 @@ class Progress: self.files = 0 self.bytes = 0 self.resumed = 0 + # Files written to their place, which a stopped run counts: the + # queue's length said "118 files installed" over 8 on disk. + self.installed = 0 self.start = time.monotonic() self._drawn = 0.0 self._evented = self.start @@ -479,8 +490,10 @@ EVENT_KEYS: dict[str, tuple[str, ...]] = { "start": ("schema", "installer", "mode"), # platforms: [{"platform", "name", "bios_dir"}], empty when none is found. "detect": ("os", "os_name", "platforms"), - # stage: manifest (reason: network, not_found or invalid) or detect - # (reason: conflict, two systems found on one machine). + # stage: manifest (reason: network, not_found, invalid, clock for a + # refused certificate under a clock set in the past, or no_ca for no + # trusted certificates on the machine) or detect (reason: conflict, two + # systems found on one machine). "error": ("stage", "reason", "platform", "message"), # state: present (hash verified), wrong_hash or missing. "file": ("platform", "dest", "systems", "size", "state"), @@ -562,8 +575,14 @@ def _os_name() -> str: def _emit_check( plat: str, manifest: dict, bios_path: Path, files: list[dict], up_to_date: list[dict], mismatched: list[dict], data_missing: int, not_installable: int, + chosen: list[str] | None = None, ) -> None: - """One event per file, per system and per platform after a check.""" + """One event per file, per system and per platform after a check. + + With systems chosen, only those are described: a file of SkyEmu's + carries four systems, and --system nintendo-gba described gb, gbc and + ds by the few files the choice kept of them. + """ present = {id(entry) for entry in up_to_date} wrong = {id(entry) for entry in mismatched} systems: dict[str, dict[str, int]] = {} @@ -584,6 +603,8 @@ def _emit_check( counts["bytes_needed"] += size names = manifest.get("system_names") or {} for system in sorted(systems): + if chosen and system not in chosen: + continue EVENTS.emit("system", platform=plat, system=system, name=", ".join(names.get(system) or [system]), **systems[system]) needed = [entry for entry in files if id(entry) not in present] @@ -1255,8 +1276,9 @@ _EMBEDDED_RULES: tuple[_OsRule, ...] = ( _OsRule("", "TrimUI", "file_exists", ("/usr/trimui",), None), # MinUI, MyMinUI and NextUI keep their system in .system at the card root # (MinUI dbf89435, workspace/all/common/defines.h:14-16) and give each core - # Bios// (workspace/all/minarch/minarch.c:2942), a layout the - # installer does not write. + # Bios// (workspace/all/minarch/minarch.c:2942). Their file lists + # write that layout below the card root, and the card's version.txt + # says which of the three it is (card_platform). _OsRule("", "MinUI", "file_exists", ("/mnt/SDCARD/.system/res",), None, base="TrimUI"), _OsRule("", "MinUI", "file_exists", ("/mnt/sdcard/.system/res",), None, base="TrimUI"), _OsRule("retroarch", "Anbernic stock firmware", "file_exists", @@ -1266,9 +1288,13 @@ _EMBEDDED_RULES: tuple[_OsRule, ...] = ( # Why a system found here gets no folder: said once per run. _NO_FOLDER = { "TrimUI": "its firmware publishes no source naming the folder its RetroArch reads", - "MinUI": "MinUI, MyMinUI and NextUI give each core its own Bios// folder, " - "a layout the installer does not write yet", + "MinUI": f"its card names no release in {CARD_MARKER}, which tells MinUI, NextUI " + "and MyMinUI apart. Name the card's root and the one it runs: " + "--platform minui (or nextui, myminui) --dest /mnt/SDCARD", } +# A system found by its card, with the end of the path that proves it: the +# card root is what comes before. +_CARD_SYSTEMS = {"MinUI": "/.system/res"} # (platform, BIOS folder) -> the name the system found there gives itself. _DETECTED_OS: dict[tuple[str, Path], str] = {} @@ -1338,15 +1364,23 @@ def _detect_embedded() -> list[tuple[str, Path]]: if name in bases: continue rules = [rule for rule in matched if rule.name == name] - folder = _os_system_dir(rules) if rules[0].manifest else None + plat = rules[0].manifest + folder = _os_system_dir(rules) if plat else None + if name in _CARD_SYSTEMS: + marker = next(value for rule in rules for value in rule.values + if value.endswith(_CARD_SYSTEMS[name])) + root = _on_device(marker[:-len(_CARD_SYSTEMS[name])]) + plat = card_platform(root) or "" + if plat: + folder, name = root, display_name(plat) if folder is None: reason = _NO_FOLDER.get( name, "nothing on it names the folder its RetroArch reads") - print(f"{name} found here, but {reason}. Name the folder with --dest.", - file=sys.stderr) + closing = "" if name in _CARD_SYSTEMS else " Name the folder with --dest." + print(f"{name} found here, but {reason}.{closing}", file=sys.stderr) continue - _DETECTED_OS[(rules[0].manifest, folder)] = name - found.append((rules[0].manifest, folder)) + _DETECTED_OS[(plat, folder)] = name + found.append((plat, folder)) return found @@ -1366,7 +1400,10 @@ def _system_lines() -> list[str]: lines = [] for name in dict.fromkeys(rule.name for rule in _EMBEDDED_RULES): plat = next(rule.manifest for rule in _EMBEDDED_RULES if rule.name == name) - if plat: + if name in _CARD_SYSTEMS: + lines.append(f"{name}: minui, nextui or myminui, as the card's {CARD_MARKER} " + "names it (from a computer: --dest )") + elif plat: lines.append(f"{name}: {plat}") else: lines.append(f"{name}: not installed to, {_NO_FOLDER[name]} (use --dest)") @@ -2237,15 +2274,58 @@ def _name_key(name: str) -> str: SHORT_LIST = 12 +# Names people type for a system, each with its id. Only ever suggested: +# --system gba, psx and ps1 were refused with no hint on RetroArch, whose +# list names no system that way, and taking one in silence could install +# another console than the one meant. +SYSTEM_SHORT_NAMES = { + **dict.fromkeys(("psx", "ps1", "ps", "playstation1"), "sony-playstation"), + "ps2": "sony-playstation-2", "ps3": "sony-playstation-3", "psp": "sony-psp", + **dict.fromkeys(("vita", "psvita"), "sony-playstation-vita"), + "gb": "nintendo-gb", "gbc": "nintendo-gbc", "gba": "nintendo-gba", + **dict.fromkeys(("nes", "famicom", "fc"), "nintendo-nes"), "fds": "nintendo-fds", + **dict.fromkeys(("snes", "sfc", "superfamicom"), "nintendo-snes"), + "n64": "nintendo-64", "n64dd": "nintendo-64dd", "sgb": "nintendo-sgb", + **dict.fromkeys(("nds", "ds"), "nintendo-ds"), "dsi": "nintendo-dsi", + "3ds": "nintendo-3ds", "wiiu": "nintendo-wii-u", "switch": "nintendo-switch", + **dict.fromkeys(("gc", "ngc", "gcn", "gamecube"), "nintendo-gamecube"), + "pokemini": "nintendo-pokemon-mini", + **dict.fromkeys(("md", "gen", "genesis", "megadrive"), "sega-mega-drive"), + **dict.fromkeys(("scd", "segacd", "megacd"), "sega-mega-cd"), + "32x": "sega-32x", **dict.fromkeys(("sms", "mastersystem"), "sega-master-system"), + **dict.fromkeys(("gg", "gamegear"), "sega-game-gear"), + **dict.fromkeys(("ss", "saturn"), "sega-saturn"), + **dict.fromkeys(("dc", "dreamcast"), "sega-dreamcast"), + **dict.fromkeys(("naomi", "atomiswave"), "sega-dreamcast-arcade"), + **dict.fromkeys(("pce", "tg16", "turbografx", "turbografx16", "pcengine", + "supergrafx"), "nec-pc-engine"), + **dict.fromkeys(("pcecd", "tgcd", "turbografxcd"), "nec-pc-engine-cd"), + "pcfx": "nec-pc-fx", + **dict.fromkeys(("mvs", "aes"), "snk-neogeo"), + **dict.fromkeys(("neocd", "neogeocd"), "snk-neogeo-cd"), + **dict.fromkeys(("msx", "msx2"), "microsoft-msx"), + "c64": "commodore-c64", "c128": "commodore-c128", + **dict.fromkeys(("amiga", "cd32"), "commodore-amiga"), + "x68k": "sharp-x68000", **dict.fromkeys(("jag", "jaguar"), "atari-jaguar"), + **dict.fromkeys(("st", "atarist"), "atari-st"), "a800": "atari-400-800", + **dict.fromkeys(("coleco", "colecovision"), "coleco-colecovision"), + **dict.fromkeys(("intv", "intellivision"), "mattel-intellivision"), + "o2": "magnavox-odyssey2", "channelf": "fairchild-channel-f", + **dict.fromkeys(("zx", "spectrum", "zxspectrum"), "sinclair-zx-spectrum"), + "cpc": "amstrad-cpc", "bbc": "acorn-bbc-micro", "apple2": "apple-ii", +} + + def did_you_mean( typed: list[str], known: list[str], listing: str, - aliases: dict[str, str] | None = None, + aliases: dict[str, str] | None = None, inside_from: int = 4, ) -> str: """The closest known names to what was typed, and the option listing them all. A typo was answered with every name the platform has, up to 400 on one line, with no hint that playstation is sony-playstation. An alias close - to what was typed suggests the name it stands for. + to what was typed suggests the name it stands for. A name holding what + was typed, inside_from letters or more, is suggested too. """ import difflib # noqa: PLC0415 @@ -2260,9 +2340,12 @@ def did_you_mean( if not key: continue matches = difflib.get_close_matches(key, list(by_key), n=3, cutoff=0.6) - if len(key) >= 4: + if len(key) >= inside_from: matches += sorted(k for k in by_key if key in k and k not in matches) - close += [by_key[k] for k in matches if by_key[k] not in close] + for k in matches: + # Two aliases of one system (psx, ps1) name it once. + if by_key[k] not in close: + close.append(by_key[k]) if close: return f"Did you mean: {', '.join(close[:3])}? {listing} lists all {len(known)}." if len(known) <= SHORT_LIST: @@ -2280,6 +2363,13 @@ def normalize_platform(name: str) -> str: for plat in AVAILABLE_PLATFORMS: if key and key in (_name_key(plat), _name_key(display_name(plat))): return plat + # --list-platforms prints `muOS: retroarch`, and --platform muos was + # refused: a system named there stands for the list it gets. + for rule in _EMBEDDED_RULES: + if key and rule.manifest and key == _name_key(rule.name): + print(f" {rule.name} gets the {display_name(rule.manifest)} file list: " + f"--platform {rule.manifest}.") + return rule.manifest print(f"Unknown platform '{name.strip()}'. " + did_you_mean([name], list(AVAILABLE_PLATFORMS), "--list-platforms"), file=sys.stderr) @@ -2909,6 +2999,102 @@ NETWORK_ADVICE = (" Check the connection, and HTTPS_PROXY if this network needs f" More help: {TROUBLESHOOTING_PAGE}") +# The installer was written after this day. A clock that reads earlier is +# wrong, and TLS then finds every certificate not yet valid: a handheld +# with no clock battery boots on 1970 or 1980. +CLOCK_FLOOR = datetime.date(2026, 1, 1) +# Where systems keep their trusted certificates, for a Python built to look +# elsewhere: Debian, Fedora, openSUSE, the BSDs and macOS, Homebrew, Termux. +CA_BUNDLES = ( + "/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/certs/ca-bundle.crt", + "/etc/ssl/ca-bundle.pem", "/etc/pki/tls/cacert.pem", "/etc/ssl/cert.pem", + "/usr/local/etc/openssl/cert.pem", "/opt/homebrew/etc/openssl@3/cert.pem", + "/data/data/com.termux/files/usr/etc/tls/cert.pem", +) +# Set from --verbose: the error text Python gives stays beside the words. +_RAW_ERRORS = threading.Event() + + +def _default_ca_present() -> bool: + """Whether the certificates this Python reads by default exist.""" + import ssl # noqa: PLC0415 + + paths = ssl.get_default_verify_paths() + for value in (os.environ.get("SSL_CERT_FILE"), paths.cafile, paths.openssl_cafile): + if value and Path(value).is_file(): + return True + for value in (os.environ.get("SSL_CERT_DIR"), paths.capath, paths.openssl_capath): + try: + if value and any(Path(value).iterdir()): + return True + except OSError: + continue + return False + + +def _known_bundle() -> str: + """A certificate bundle the system keeps where this Python does not look.""" + return next((path for path in CA_BUNDLES if Path(path).is_file()), "") + + +def _ca_bundle_found() -> bool: + """Whether any list of trusted certificates is on this machine. + + Windows verifies against its own store, which Python reads directly. + """ + return os.name == "nt" or _default_ca_present() or bool(_known_bundle()) + + +def network_words( + exc: BaseException, today: datetime.date | None = None, verbose: bool | None = None, +) -> tuple[str, str]: + """The reason a request failed, and the same in words a beginner reads. + + The reason is clock, no_ca or network. Offline, the run printed + "[Errno -2] Name or service not known": the raw text now follows the + words only under --verbose. + """ + reason = getattr(exc, "reason", None) + inner = reason if isinstance(reason, BaseException) else exc + raw = str(reason or exc) + code, words = "network", "" + cert_error = getattr(sys.modules.get("ssl"), "SSLCertVerificationError", None) + if cert_error is not None and isinstance(inner, cert_error): + today = today or datetime.date.today() + if not _ca_bundle_found(): + code = "no_ca" + words = ("This system has no list of trusted certificates to check the " + "server with. Install the ca-certificates package, or name a " + "certificate bundle with SSL_CERT_FILE, then run again") + elif today < CLOCK_FLOOR: + code = "clock" + words = (f"The clock reads {today.isoformat()}: connect to Wi-Fi and let the " + "time sync, or set the date, then run again") + else: + words = "the server's certificate was rejected" + bundle = "" if _default_ca_present() else _known_bundle() + words += (f": this Python reads no certificate list, run again with " + f"SSL_CERT_FILE={bundle}" if bundle + else ", which a proxy or a filter on this network can cause") + elif isinstance(inner, socket.gaierror): + words = "no internet connection, or the server name could not be looked up" + elif isinstance(inner, (socket.timeout, TimeoutError)): + words = "the connection timed out" + elif isinstance(inner, ConnectionRefusedError): + words = "the server refused the connection" + elif isinstance(inner, OSError) and inner.errno in ( + errno.ENETUNREACH, errno.EHOSTUNREACH, errno.ENETDOWN): + words = "no internet connection: the network cannot be reached" + elif isinstance(inner, (ConnectionResetError, ConnectionAbortedError, + http.client.HTTPException)): + words = "the connection was cut" + if not words: + return code, raw + if _RAW_ERRORS.is_set() if verbose is None else verbose: + words += f" [{raw}]" + return code, words + + def _address_lines(url: str) -> list[str]: """The address that failed, and the override that chose it if one did. @@ -2940,12 +3126,13 @@ def _fetch_json(url: str, limit: int, label: str) -> object: delay = _retry_delay(attempt, exc.headers.get("Retry-After") if exc.headers else None) problem = f"HTTP {exc.code}" except (urllib.error.URLError, OSError, http.client.HTTPException) as exc: - if attempt == MAX_RETRIES: + code, problem = network_words(exc) + # A wrong clock or no certificate list fails every attempt alike. + if attempt == MAX_RETRIES or code != "network": if isinstance(exc, http.client.HTTPException): raise ConnectionError(f"connection cut: {exc!r}") from exc raise delay = _retry_delay(attempt, None) - problem = str(getattr(exc, "reason", None) or exc) # Said, or three 30-second attempts read as a frozen program. print(f" The {label} did not arrive ({problem}), trying again " f"({attempt + 1}/{MAX_RETRIES}) in {delay:.0f} s.", file=sys.stderr) @@ -2966,7 +3153,7 @@ def fetch_manifest(plat: str) -> dict: sys.exit(1) url = MANIFEST_URL.format(platform=plat) try: - return _validate_manifest(_fetch_json(url, MAX_MANIFEST_BYTES, "manifest"), plat) + return _validate_manifest(_fetch_json(url, MAX_MANIFEST_BYTES, "file list"), plat) except ValueError as exc: EVENTS.emit("error", stage="manifest", reason="invalid", platform=plat, message=f"the file list is not valid: {exc}") @@ -3000,11 +3187,16 @@ def fetch_manifest(plat: str) -> dict: print(NETWORK_ADVICE, file=sys.stderr) sys.exit(1) except (urllib.error.URLError, OSError) as exc: - EVENTS.emit("error", stage="manifest", reason="network", platform=plat, - message=f"the file list could not be fetched: " - f"{getattr(exc, 'reason', None) or exc}") + code, words = network_words(exc) + EVENTS.emit("error", stage="manifest", reason=code, platform=plat, + message=words if code != "network" + else f"the file list could not be fetched: {words}") + if code != "network": + print(f" Could not fetch the file list for {plat}.", file=sys.stderr) + print(f" {words}.", file=sys.stderr) + sys.exit(1) print(f" Could not fetch the file list for {plat} after {MAX_RETRIES} " - f"attempts: {getattr(exc, 'reason', None) or exc}", file=sys.stderr) + f"attempts: {words}", file=sys.stderr) for line in _address_lines(url): print(line, file=sys.stderr) print(NETWORK_ADVICE, file=sys.stderr) @@ -3020,7 +3212,7 @@ def fetch_targets(plat: str) -> "dict | None": """ url = TARGETS_URL.format(platform=plat) try: - return _validate_targets(_fetch_json(url, MAX_TARGETS_BYTES, "targets manifest")) + return _validate_targets(_fetch_json(url, MAX_TARGETS_BYTES, "target list")) except urllib.error.HTTPError as exc: if exc.code == 404: return {} @@ -3034,7 +3226,7 @@ def fetch_targets(plat: str) -> "dict | None": return None except (urllib.error.URLError, OSError) as exc: print(f" Error: failed to fetch targets for {plat}: " - f"{getattr(exc, 'reason', None) or exc}", file=sys.stderr) + f"{network_words(exc)[1]}", file=sys.stderr) for line in _address_lines(url): print(line, file=sys.stderr) print(NETWORK_ADVICE, file=sys.stderr) @@ -3424,9 +3616,15 @@ def resolve_choices( raise ValueError(f"unknown {label}: {', '.join(unknown)}. This list records none.") listing = {"system": "--list-systems", "emulator": "--list-emulators"}.get( label, "--list-cores") + hints, inside_from = aliases, 4 + if label == "system": + # gba is the end of nintendo-gba: three letters are enough here. + hints = {**{short: name for short, name in SYSTEM_SHORT_NAMES.items() + if name in known}, **aliases} + inside_from = 3 raise ValueError( f"unknown {label}: {', '.join(unknown)}. " - f"{did_you_mean(unknown, known, listing, aliases)}" + f"{did_you_mean(unknown, known, listing, hints, inside_from)}" ) if values and not chosen: raise ValueError(f"--{label} needs at least one name") @@ -4176,7 +4374,7 @@ def _download_one( reason = READ_ONLY if _read_only_file(dest) else NOT_WRITABLE refused = True elif _transfer_failure(exc): - reason = NetworkReason(getattr(exc, "reason", "") or exc) + reason = NetworkReason(network_words(exc)[1]) else: reason = str(getattr(exc, "reason", "") or exc) if verbose: @@ -4847,14 +5045,15 @@ def download_files( """Download files in parallel. Returns the destinations that failed, each with its reason, and whether - the run was interrupted. Every future is submitted up front, so a bare - KeyboardInterrupt would let the pool drain the queue in full: the stop - flag is what makes Ctrl+C end the run rather than only stop the - reporting. + the run was interrupted. progress.installed counts the files written. + Every future is submitted up front, so a bare KeyboardInterrupt would + let the pool drain the queue in full: the stop flag is what makes Ctrl+C + end the run rather than only stop the reporting. """ failed: list[tuple[str, str]] = [] interrupted = False _stop.clear() + _writing.set() term = term or Terminal() if progress is None: progress = Progress(len(files), sum(f.get("size", 0) for f in files), term) @@ -4865,14 +5064,24 @@ def download_files( for f in files } refused = False + refused_events = 0 try: for future in concurrent.futures.as_completed(future_map): dest, success, reason = future.result() if refused: # The folder they all go in refused the first: each - # would fail alike, counted without a line of its own. + # would fail alike, counted without a line of its own, + # though a program reading the events still gets one. if not success: failed.append((dest, NOT_WRITABLE)) + refused_events += 1 + EVENTS.emit( + "downloaded", dest=dest, ok=False, reason=NOT_WRITABLE, + size=future_map[future].get("size", 0), + files_done=progress.files + refused_events, + files_total=progress.total_files, bytes_done=progress.bytes, + bytes_total=progress.expected_bytes, + ) continue if _stop.is_set(): continue @@ -4895,6 +5104,12 @@ def download_files( _stop.set() progress.finish() print("\n Stopping. Files already installed are kept.") + # The pool has run every future by now: a file that landed after Ctrl+C + # is on disk and counts. + progress.installed = sum( + 1 for future in future_map + if not future.cancelled() and future.exception() is None and future.result()[1] + ) progress.finish() return failed, interrupted @@ -5005,6 +5220,7 @@ def install_data_directory(entry: dict, bios_path: Path) -> dict: "not_kept": []} if not needed: return counts + _writing.set() try: root.mkdir(parents=True, exist_ok=True) with tempfile.TemporaryDirectory(dir=root) as scratch: @@ -5207,7 +5423,7 @@ def _install_standalone_folders( to_download, folder, jobs=args.jobs, verbose=args.verbose, term=term, progress=progress, ) - downloaded += len(to_download) - len(failed) + downloaded += progress.installed errors += len(failed) failures.extend((str(folder / dest), reason) for dest, reason in failed) transferred += progress.transferred() @@ -5380,7 +5596,7 @@ def _choose_platform(title: str, default: str = "") -> str: if not choice and default: return default if choice.lower() == "q": - sys.exit(0) + _quit() if choice.isdigit() and 1 <= int(choice) <= len(AVAILABLE_PLATFORMS): return AVAILABLE_PLATFORMS[int(choice) - 1] key = _name_key(choice) @@ -5393,7 +5609,8 @@ def _choose_platform(title: str, default: str = "") -> str: def _prompt_manual_platform(os_type: str) -> list[tuple[str, Path]]: """Ask for a platform and a BIOS directory when nothing was detected.""" - plat = _choose_platform("Choose the platform to install for:") + plat = _choose_platform("No supported platform found here. Choose the one to " + "install for:", "retroarch") default_dest = _default_dest(os_type, plat) raw = "" while not raw: @@ -5403,10 +5620,24 @@ def _prompt_manual_platform(os_type: str) -> list[tuple[str, Path]]: ) if default_dest is not None: break - dest = Path(raw).expanduser() if raw else default_dest - if os_type == "windows" and raw: - dest = Path(os.path.expandvars(raw)) - return [(plat, dest)] + if raw: + return [(plat, _typed_folder(raw))] + state = "" if default_dest.exists() else ". It does not exist yet and will be created" + print(f" {display_name(plat)}'s default BIOS folder: {default_dest}{state}.") + return [(plat, default_dest)] + + +def _typed_folder(raw: str) -> Path: + """A folder typed at a question, read as a shell reads an argument. + + Explorer's "Copy as path" puts quotes around it, and users quote a path + with spaces: kept, they sent the files into a folder named `"` under + the current directory, and the run said Done. + """ + text = raw.strip() + if len(text) >= 2 and text[0] == text[-1] and text[0] in "'\"": + text = text[1:-1].strip() + return Path(os.path.expandvars(os.path.expanduser(text))) # Platforms with no install location of their own: the BIOS folder sits @@ -5469,10 +5700,10 @@ def _manual_usage_hint(os_type: str, listing: str = "") -> list[str]: def _prompt_platform_choice( - platforms: list[tuple[str, Path]], + platforms: list[tuple[str, Path]], title: str = "Install for:", ) -> list[tuple[str, Path]]: """Prompt user to choose among detected platforms.""" - print("\nInstall for:") + print(f"\n{title}") for i, (name, path) in enumerate(platforms, 1): system = detected_os(name, path) label = f"{system}, {display_name(name)} files" if system and system != display_name(name) \ @@ -5487,7 +5718,7 @@ def _prompt_platform_choice( while True: choice = _ask("> ").lower() if choice == "q": - sys.exit(0) + _quit() idx = int(choice) if choice.isdigit() else 0 if 1 <= idx <= len(platforms): return [platforms[idx - 1]] @@ -5511,26 +5742,62 @@ def _ask(prompt: str) -> str: raise KeyboardInterrupt from None +def _quit() -> None: + """q at a question ends the run where Ctrl+C does, on 130: with 0, + `install.sh && retroarch` started RetroArch on no BIOS.""" + sys.exit(130) + + def _sized(files: list[dict]) -> str: return f"{_plural(len(files), 'file')}, {format_size(sum(f.get('size', 0) for f in files))}" -def _pick(title: str, rows: list[tuple[str, list[dict]]], ordered: bool = False) -> list[str]: - """Numbered list of names. An empty answer keeps every one.""" +# A core whose files are all the platform's own. "pcsx_rearmed 0 files, +# 0 B" read as a core that gets nothing. +NO_CORE_FILES = "no extra file: it reads the platform's own, always kept" + + +def _core_sized(files: list[dict]) -> str: + return _sized(files) if files else NO_CORE_FILES + + +def _system_sized(files: list[dict]) -> str: + """A system's files, those other systems share counted apart. + + `3do 1704 files, 349.0 MB` read as the 3DO BIOS: 1689 of them are the + MAME hash and plugin files six systems carry. + """ + shared = [f for f in files if len(entry_systems(f)) > 1] + if not shared: + return _sized(files) + if len(shared) == len(files): + return f"{_sized(shared)}, all shared with other systems" + own = [f for f in files if len(entry_systems(f)) <= 1] + return f"{_sized(own)}, and {_sized(shared)} shared with other systems" + + +def _pick( + title: str, rows: list[tuple[str, list[dict]]], ordered: bool = False, + sizer: Callable[[list[dict]], str] = _sized, +) -> list[str]: + """Numbered list of names. An empty answer keeps every one. + + sizer says what each name holds. + """ if not rows: return [] print(f"\n{title}") width = len(str(len(rows))) name_width = min(max(len(name) for name, _files in rows), 32) for index, (name, files) in enumerate(rows, 1): - print(f" {index:>{width}}) {name:<{name_width}} {_sized(files)}") + print(f" {index:>{width}}) {name:<{name_width}} {sizer(files)}") hint = "order of preference, e.g. 2,1" if ordered else "e.g. 1,3-5" while True: text = _ask(f"Numbers ({hint}), Enter for all, q to quit: ") if not text: return [] if text.lower() == "q": - sys.exit(0) + _quit() try: chosen = parse_selection(text, len(rows), ordered=ordered) except ValueError as exc: @@ -5566,7 +5833,7 @@ def _prompt_custom_selection( if answer == "": return None if answer == "q": - sys.exit(0) + _quit() if answer == "i" and installed is not None: return INSTALLED_ONLY if answer == "c": @@ -5581,7 +5848,7 @@ def _prompt_custom_selection( systems = _pick("Systems:", [ (name, [f for f in files if _chosen(f, {name})]) for name in choices["systems"] - ]) + ], sizer=_system_sized) kept, kept_omitted = narrow(files, omitted, systems, [], []) cores: list[str] = [] @@ -5593,7 +5860,7 @@ def _prompt_custom_selection( (name, _filter_by_target( [f for f in kept if f.get("cores") is not None], [name])) for name in core_names - ]) + ], sizer=_core_sized) kept, kept_omitted = narrow(kept, kept_omitted, [], cores, []) regions: list[str] = [] @@ -5654,7 +5921,8 @@ def _print_choices( if systems else _filter_by_target([f for f in files if f.get("cores") is not None], [name]) ) - print(f" {labels[name]:<{width}} {_sized(held)}") + print(f" {labels[name]:<{width}} " + f"{_system_sized(held) if systems else _core_sized(held)}") def emulator_names(manifest: dict, files: list[dict], omitted: list[dict]) -> dict[str, str]: @@ -6570,11 +6838,15 @@ def _bytes(files: list[dict]) -> int: def bulk_hint( to_download: list[dict], manifest: dict, systems_chosen: bool, cores_chosen: bool, + accepted: Collection[str] = (), ) -> list[str]: """Name what pulls most of a download, when narrowing saves over half of it. `--system 3do` fetched 349 MB for RetroArch, and `--core opera` 12.5 MB: the arcade cores that also read 3DO pulled the rest, and nothing said so. + accepted holds the names --core takes. Drawn from every core of the + system, the advice named ares, which loads no file of its own, and + `--core ares` was then refused. """ total = _bytes(to_download) if total < BULK_HINT_FROM: @@ -6582,7 +6854,8 @@ def bulk_hint( systems = {s for entry in to_download for s in entry_systems(entry)} if not cores_chosen and len(systems) == 1: system = next(iter(systems)) - candidates = (manifest.get("system_cores") or {}).get(system) or [] + candidates = [core for core in (manifest.get("system_cores") or {}).get(system) or [] + if core in accepted] by_core: dict[str, int] = {} for entry in to_download: for core in entry.get("cores") or []: @@ -6844,6 +7117,8 @@ def main() -> None: ) args = parser.parse_args() + if args.verbose: + _RAW_ERRORS.set() if args.cores_dir: args.installed_cores = True _INVOCATION.record(args) @@ -6980,7 +7255,7 @@ def _open_local_sources(args: argparse.Namespace) -> None: sys.exit(1) -def _missing_dest(dest: Path, ask: bool) -> None: +def _missing_dest(dest: Path, ask: bool, named: str = "named with --dest") -> None: """Say that a --dest folder does not exist before anything goes there. A typo (~/.config/retroarh/system) was created with every missing @@ -6999,7 +7274,7 @@ def _missing_dest(dest: Path, ask: bool) -> None: if missing > 1 and ask: answer = _ask(f" Create {_plural(missing, 'folder')} under {nearest}? [y/N] ") if not answer.strip().lower().startswith("y"): - print(" Nothing installed. Check the folder named with --dest, then run " + print(f" Nothing installed. Check the folder {named}, then run " "the command again.") sys.exit(2) @@ -7119,7 +7394,8 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: print("Available platforms:") for p in AVAILABLE_PLATFORMS: print(f" {p}") - print("\nSystems recognized by their own files:") + print("\nSystems recognized by their own files, and the file list each gets " + "(--platform takes either name):") for line in _system_lines(): print(f" {line}") detected = detect_platforms(os_type) @@ -7128,6 +7404,8 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: for name, path in detected: system = detected_os(name, path) print(f" {name}: {path}" + (f" ({system})" if system else "")) + else: + print("\nDetected on this system: none") return # Platform detection or override. A destination taken from the default @@ -7221,8 +7499,13 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: print(line) sys.exit(1) platforms = _prompt_manual_platform(os_type) - for name, path in platforms: - print(f" Found {found_label(name, path)}") + plat, typed = platforms[0] + if typed != _default_dest(os_type, plat): + _missing_dest(typed, not (args.check or args.dry_run or args.yes), + "typed") + else: + for name, path in platforms: + print(f" Found {found_label(name, path)}") conflict = os_conflict(platforms) if conflict and not interactive and not listing: @@ -7243,7 +7526,9 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: ]) if len(platforms) > 1 and not listing and interactive: - platforms = _prompt_platform_choice(platforms) + # --check installs nothing, and "Install for:" said it would. + platforms = _prompt_platform_choice( + platforms, "Check:" if args.check else "Install for:") if args.dest is not None and not listing: _missing_dest(args.dest, interactive and not (args.check or args.dry_run or args.yes)) @@ -7445,7 +7730,11 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: args.emulator, manifest, plat_name, files, omitted_files ) + # What --core resolves against, for advice that names one. + core_choices = set(available_choices(files, omitted_files)["cores"]) selection = _requested_narrowing(args, plat_name, files, omitted_files, manifest) + # What declining the size question points back at, when it was asked. + smaller = "" if ( selection is None and interactive @@ -7461,6 +7750,13 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: plat_name, files, omitted_files, installed, display_name(plat_name, manifest), ) + if selection is None: + smaller = (" Nothing downloaded. To install less, run the same command " + "again and type c at the first question to choose systems") + if installed is not None: + smaller += (f", or i for only what the installed cores read " + f"({format_size(_bytes(installed[0]))})") + smaller += "." if selection == INSTALLED_ONLY: files, omitted_files = installed print("\n Same choice without questions: " @@ -7557,6 +7853,7 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: systems_chosen=bool(selection and selection[0]), cores_chosen=bool((selection and selection[1]) or args.emulator or args.installed_cores or target), + accepted=core_choices, ) narrowed = bool( @@ -7572,6 +7869,7 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: _emit_check( plat_name, manifest, bios_path, files, up_to_date, mismatched, sum(len(state[1]) for _entry, state in data_states), len(omitted_files), + chosen=selection[0] if selection else None, ) total_verified += len(up_to_date) @@ -7636,7 +7934,9 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: f"\nDownload {format_size(dl_size)} to {bios_path}? [Y/n] " ) ): - print(" Nothing downloaded. --system, --core and --region " + # A beginner who just passed the c entry was sent to a + # 91-line --help. + print(smaller or " Nothing downloaded. --system, --core and --region " "install less (see --help).") total_up_to_date += len(up_to_date) total_declined += len(to_download) @@ -7674,10 +7974,9 @@ def _install(args: argparse.Namespace, real_stdout: TextIO) -> None: term=term, progress=progress, ) bulk_lines += hint - total_downloaded += len(to_download) - len(failed) - files_pending += len(failed) - if interrupted: - files_pending += max(len(to_download) - progress.files, 0) + total_downloaded += progress.installed + files_pending += len(to_download) - progress.installed if interrupted \ + else len(failed) total_errors += len(failed) failures.extend(failed) total_bytes += progress.transferred() @@ -9909,7 +10208,11 @@ if __name__ == "__main__": except KeyboardInterrupt: # Outside the download phase (fetching the file list, checking the # files present, rebuilding data directories): nothing is half - # written there, and a socket traceback read as a crash. - print("\nStopped. Run the same command again to carry on from here. " - "Nothing is lost.") + # written there, and a socket traceback read as a crash. Stopped at + # a question, nothing has started, and there is nothing to carry on. + if _writing.is_set(): + print("\nStopped. Run the same command again to carry on from here. " + "Nothing is lost.") + else: + print("\nStopped. Nothing was installed.") sys.exit(130) diff --git a/install.sh b/install.sh index 52403b20..3bbeeeaa 100755 --- a/install.sh +++ b/install.sh @@ -18,7 +18,7 @@ esac TEMP_INSTALLER="" TEMP_DIRECTORY="" DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py" -DEFAULT_INSTALL_SHA256="532f0b8d96e0dcf62164daa16837dc21918ced45d46c01e84dd60650dcc73256" +DEFAULT_INSTALL_SHA256="2606f825ea887d70d58c8938fa726bd92236161b907159d34643bff24ca349fc" MAX_INSTALLER_BYTES=2097152 cleanup() { diff --git a/install/amberelec.json b/install/amberelec.json index ad30a4fb..ae88cd88 100644 --- a/install/amberelec.json +++ b/install/amberelec.json @@ -6,7 +6,7 @@ "platform": "amberelec", "display_name": "AmberELEC", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "", "detect": [ { @@ -8249,7 +8249,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox_core", "dosbox_pure" @@ -8260,7 +8260,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox_core", "dosbox_pure" @@ -40283,7 +40283,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -40296,7 +40296,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -40309,7 +40309,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -40322,7 +40322,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -41341,7 +41341,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -41352,7 +41352,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -41363,7 +41363,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -63038,7 +63038,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -63048,7 +63048,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -63058,7 +63058,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ] @@ -63068,7 +63068,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ] diff --git a/install/batocera.json b/install/batocera.json index b3cbe256..ab47b4e3 100644 --- a/install/batocera.json +++ b/install/batocera.json @@ -6,7 +6,7 @@ "platform": "batocera", "display_name": "Batocera", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "bios", "detect": [ { @@ -7942,7 +7942,7 @@ "sha1": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "sha256": "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958", "size": 262144, - "repo_path": "bios/Microsoft/Chihiro/cerbios.bin", + "repo_path": "bios/Sega/Chihiro/cerbios.bin", "cores": null, "systems": [ "chihiro" @@ -10654,7 +10654,7 @@ "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", "size": 16384, - "repo_path": "bios/Oric/Oric/basic11b.rom", + "repo_path": "bios/Tangerine/Oric/basic11b.rom", "cores": null, "systems": [ "oricatmos" @@ -10664,7 +10664,7 @@ "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", "size": 16384, - "repo_path": "bios/Oric/Oric/basic11b.rom", + "repo_path": "bios/Tangerine/Oric/basic11b.rom", "cores": [ "clk" ] @@ -10676,7 +10676,7 @@ "sha1": "bda81f64be319d8793d284bf9d40f01d19b33515", "sha256": "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293", "size": 128, - "repo_path": "bios/Oric/Oric/Oric/colour.rom", + "repo_path": "bios/Tangerine/Oric/Oric/colour.rom", "cores": null, "systems": [ "oricatmos" @@ -10686,7 +10686,7 @@ "sha1": "bda81f64be319d8793d284bf9d40f01d19b33515", "sha256": "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293", "size": 128, - "repo_path": "bios/Oric/Oric/Oric/colour.rom", + "repo_path": "bios/Tangerine/Oric/Oric/colour.rom", "cores": [ "clk" ] @@ -10918,7 +10918,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "scummvm" @@ -10928,7 +10928,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -10940,7 +10940,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "scummvm" @@ -10950,7 +10950,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -52802,7 +52802,7 @@ "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", "size": 16384, - "repo_path": "bios/Oric/Oric/basic10.rom", + "repo_path": "bios/Tangerine/Oric/basic10.rom", "cores": [ "clk" ] @@ -52812,7 +52812,7 @@ "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", "size": 16384, - "repo_path": "bios/Oric/Oric/pravetz.rom", + "repo_path": "bios/Tangerine/Oric/pravetz.rom", "cores": [ "clk" ] @@ -52842,7 +52842,7 @@ "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", "size": 8192, - "repo_path": "bios/Oric/Oric/bd500.rom", + "repo_path": "bios/Tangerine/Oric/bd500.rom", "cores": [ "clk" ] @@ -52852,7 +52852,7 @@ "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", "size": 2048, - "repo_path": "bios/Oric/Oric/jasmin.rom", + "repo_path": "bios/Tangerine/Oric/jasmin.rom", "cores": [ "clk" ] @@ -52862,7 +52862,7 @@ "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", "size": 8192, - "repo_path": "bios/Oric/Oric/microdis.rom", + "repo_path": "bios/Tangerine/Oric/microdis.rom", "cores": [ "clk" ] @@ -57460,7 +57460,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox-x", @@ -57502,7 +57502,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -57572,7 +57572,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -57692,7 +57692,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -57726,7 +57726,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -176469,7 +176469,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -176482,7 +176482,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -179780,7 +179780,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -179791,7 +179791,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -179802,7 +179802,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -242705,7 +242705,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -242718,7 +242718,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], @@ -245089,7 +245089,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox-x", diff --git a/install/emudeck.json b/install/emudeck.json index a64c86c0..1201af98 100644 --- a/install/emudeck.json +++ b/install/emudeck.json @@ -6,7 +6,7 @@ "platform": "emudeck", "display_name": "EmuDeck", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "bios", "detect": [ { @@ -3123,7 +3123,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -3135,7 +3135,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -64208,7 +64208,7 @@ "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", "sha256": "8244f3e5eaca828cc0a6a963f1fad15d68d8d3c0b5c80b8451b3067a85f14ae1", "size": 131072, - "repo_path": "bios/QEMU/bios.bin", + "repo_path": "bios/QEMU/QEMU/bios.bin", "cores": [ "qemu" ] @@ -64218,7 +64218,7 @@ "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", "sha256": "f1d4f396011197eb989029659cde250751cc711c336b8fbbe6f77cfe0dc5dcd8", "size": 262144, - "repo_path": "bios/QEMU/bios-256k.bin", + "repo_path": "bios/QEMU/QEMU/bios-256k.bin", "cores": [ "qemu" ] @@ -64228,7 +64228,7 @@ "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", "sha256": "42780e1ab9161752848475529a25c39d7c76baee82a1b2ddff666c2f7de7bbee", "size": 131072, - "repo_path": "bios/QEMU/bios-microvm.bin", + "repo_path": "bios/QEMU/QEMU/bios-microvm.bin", "cores": [ "qemu" ] @@ -64238,7 +64238,7 @@ "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", "sha256": "9b9dfc6c25740d6225625570d71cab6805cc9216e68c8932e343266daaeb8c4b", "size": 65536, - "repo_path": "bios/QEMU/qboot.rom", + "repo_path": "bios/QEMU/QEMU/qboot.rom", "cores": [ "qemu" ] @@ -64248,7 +64248,7 @@ "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", "sha256": "f0defab87465236d0d22b6000bd2c270e05a56ff3bb7fd209a56069caed86d57", "size": 38912, - "repo_path": "bios/QEMU/vgabios.bin", + "repo_path": "bios/QEMU/QEMU/vgabios.bin", "cores": [ "qemu" ] @@ -64258,7 +64258,7 @@ "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", "sha256": "305d3b15f67e65f1899a1664621f6b471e4345d33fd9eb4f6320b4559f6a04f2", "size": 38912, - "repo_path": "bios/QEMU/vgabios-cirrus.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "cores": [ "qemu" ] @@ -64268,7 +64268,7 @@ "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", "sha256": "651513519f9e0d5b99d3b051a8f5c68db69e987339b59a441d371068c34c146b", "size": 39424, - "repo_path": "bios/QEMU/vgabios-stdvga.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "cores": [ "qemu" ] @@ -64278,7 +64278,7 @@ "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", "sha256": "d5fd6992dfdf0c980996b79c5ea13b9c8b36342c1dc94fcd682a6c3e8df850ff", "size": 28672, - "repo_path": "bios/QEMU/vgabios-bochs-display.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "cores": [ "qemu" ] @@ -64288,7 +64288,7 @@ "sha1": "49df9be557f0f0277c8fedb889257e279586d536", "sha256": "31b26b2288ed5594b65a234e797ee7105d225d48086170b27ab518c3fb69b7de", "size": 28672, - "repo_path": "bios/QEMU/vgabios-ramfb.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "cores": [ "qemu" ] @@ -64298,7 +64298,7 @@ "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", "sha256": "9d4d1f32a7e059de82c09c19fc25e276a39d96a1a516605a32ba704596e10d8e", "size": 39424, - "repo_path": "bios/QEMU/vgabios-ati.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ati.bin", "cores": [ "qemu" ] @@ -64308,7 +64308,7 @@ "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", "sha256": "e81cc2807ebb9a1467b1933d192a4313424b499b73e7674257f07cd2171e01c7", "size": 39424, - "repo_path": "bios/QEMU/vgabios-qxl.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-qxl.bin", "cores": [ "qemu" ] @@ -64318,7 +64318,7 @@ "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", "sha256": "746f38c2023dbbc071503113f970bcf69d49c6e7c55fa8c0e3748dbccba42772", "size": 39424, - "repo_path": "bios/QEMU/vgabios-virtio.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-virtio.bin", "cores": [ "qemu" ] @@ -64328,7 +64328,7 @@ "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", "sha256": "c12841eb2b057b6d99bfbc7ab72bea896e2b5cd694c93b026d7510de2b68ca11", "size": 39424, - "repo_path": "bios/QEMU/vgabios-vmware.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-vmware.bin", "cores": [ "qemu" ] @@ -64338,7 +64338,7 @@ "sha1": "670c9cc79b4859944705eece710dc332188b79b4", "sha256": "cdf057a71b07e3b52b19cbe210bdefa59250d01a9810b960f7fe1f98eed95a27", "size": 9216, - "repo_path": "bios/QEMU/kvmvapic.bin", + "repo_path": "bios/QEMU/QEMU/kvmvapic.bin", "cores": [ "qemu" ] @@ -64348,7 +64348,7 @@ "sha1": "fd19bef7f5647960952520389f448364762ed948", "sha256": "1ecfb26c19da9dc00cdec0d0d738db69aeea4f1231c0c0ffc483ff69b3cda6ce", "size": 1024, - "repo_path": "bios/QEMU/linuxboot.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot.bin", "cores": [ "qemu" ] @@ -64358,7 +64358,7 @@ "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", "sha256": "9c49e255340c78fc12e54ed043462bca02fb7fca29b7cfab62ff88a5344b6950", "size": 1536, - "repo_path": "bios/QEMU/linuxboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot_dma.bin", "cores": [ "qemu" ] @@ -64368,7 +64368,7 @@ "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", "sha256": "13a3f9f119797b8776105f020f36572ce6a20fa2c60d3b8112818bfaefcdd348", "size": 1024, - "repo_path": "bios/QEMU/multiboot.bin", + "repo_path": "bios/QEMU/QEMU/multiboot.bin", "cores": [ "qemu" ] @@ -64378,7 +64378,7 @@ "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", "sha256": "e01667420ee78a318ea44627d2dd68058d3377d024e6eb7237700afe2e86507d", "size": 1024, - "repo_path": "bios/QEMU/multiboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/multiboot_dma.bin", "cores": [ "qemu" ] @@ -64388,7 +64388,7 @@ "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", "sha256": "918ff03a118615c2f4611a5df2d9496aabe099b5cfaaf69e544ebf973305d59d", "size": 1536, - "repo_path": "bios/QEMU/pvh.bin", + "repo_path": "bios/QEMU/QEMU/pvh.bin", "cores": [ "qemu" ] @@ -64398,7 +64398,7 @@ "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", "sha256": "981a728f95b7a01645645e9b753cfb764c9eb59266fa888ac58d7008fbb48c10", "size": 67072, - "repo_path": "bios/QEMU/pxe-e1000.rom", + "repo_path": "bios/QEMU/QEMU/pxe-e1000.rom", "cores": [ "qemu" ] @@ -64408,7 +64408,7 @@ "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", "sha256": "07b89a742e0f6d0e92dafe57b0f28c493436d0e1e07b7b77e728490c1f7b45dd", "size": 61440, - "repo_path": "bios/QEMU/pxe-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/pxe-eepro100.rom", "cores": [ "qemu" ] @@ -64418,7 +64418,7 @@ "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", "sha256": "bb9c0eaad36b9b4ce26c5f348bd05a832c8bf83ef38391db0ce9b51de8523ac7", "size": 61440, - "repo_path": "bios/QEMU/pxe-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "cores": [ "qemu" ] @@ -64428,7 +64428,7 @@ "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", "sha256": "92358396c05b3346c6bfd52bbf2a47978d0a8c6ddea932ee091a24faefbd489e", "size": 61440, - "repo_path": "bios/QEMU/pxe-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/pxe-pcnet.rom", "cores": [ "qemu" ] @@ -64438,7 +64438,7 @@ "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", "sha256": "d491351e37a50eb5a40e98a9f6b4d85010ee60fb9e64129d65ea10839287f138", "size": 61440, - "repo_path": "bios/QEMU/pxe-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "cores": [ "qemu" ] @@ -64448,7 +64448,7 @@ "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", "sha256": "6994337fe07783a6233072e33771dc4f58260edc3269debe677a5227b264bfdc", "size": 60416, - "repo_path": "bios/QEMU/pxe-virtio.rom", + "repo_path": "bios/QEMU/QEMU/pxe-virtio.rom", "cores": [ "qemu" ] @@ -64458,7 +64458,7 @@ "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", "sha256": "f37222fcdf0481bfbaf7a16d9aaf740aeb41d3d24c187801eb6e9a628cec0fc8", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000.rom", "cores": [ "qemu" ] @@ -64468,7 +64468,7 @@ "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", "sha256": "102c20348be2d0ebe45a77b076b31848182c2f7b4364775b6bc2ece6e97b4024", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000e.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000e.rom", "cores": [ "qemu" ] @@ -64478,7 +64478,7 @@ "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", "sha256": "2b5b55ba8afae7b5ef7116606babf60e6ceaa531c345d54542857cc3fbe3912e", "size": 159232, - "repo_path": "bios/QEMU/efi-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/efi-eepro100.rom", "cores": [ "qemu" ] @@ -64488,7 +64488,7 @@ "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", "sha256": "9925e0a34547118110479d8fc4e01092a0a73e0a236416e9ff862655b46751f7", "size": 157696, - "repo_path": "bios/QEMU/efi-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "cores": [ "qemu" ] @@ -64498,7 +64498,7 @@ "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", "sha256": "71c494fde94efa9871cf43868d7e3c8f4190e406d47a5102a2a21b36ded8a162", "size": 157696, - "repo_path": "bios/QEMU/efi-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/efi-pcnet.rom", "cores": [ "qemu" ] @@ -64508,7 +64508,7 @@ "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", "sha256": "4cdd69a7f5c6ce7aec3a3f20a034dc80e1d22aa37a739c364378952d997a32c7", "size": 160768, - "repo_path": "bios/QEMU/efi-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/efi-rtl8139.rom", "cores": [ "qemu" ] @@ -64518,7 +64518,7 @@ "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", "sha256": "26be36901db7f8181c306cc62bd74891d8646528965a78e40cceadba5dd7c8e7", "size": 160768, - "repo_path": "bios/QEMU/efi-virtio.rom", + "repo_path": "bios/QEMU/QEMU/efi-virtio.rom", "cores": [ "qemu" ] @@ -64528,7 +64528,7 @@ "sha1": "6557242402387a6319a0db6abb916ada48e1391c", "sha256": "33e833123ad9831df94b2d623a17f91e4c779e3cb799baa97058f5972676a32a", "size": 156672, - "repo_path": "bios/QEMU/efi-vmxnet3.rom", + "repo_path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "cores": [ "qemu" ] @@ -64538,7 +64538,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -64548,7 +64548,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -64558,7 +64558,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -64568,7 +64568,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -64578,7 +64578,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -64588,7 +64588,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -64600,7 +64600,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -64612,7 +64612,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -64624,7 +64624,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -64634,7 +64634,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -64644,7 +64644,7 @@ "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", "sha256": "f1d9bdb018e59ff65e39ce60cc0f9199af73d1770c34137ce423e04662cf96c8", "size": 677196, - "repo_path": "bios/QEMU/openbios-ppc", + "repo_path": "bios/QEMU/QEMU/openbios-ppc", "cores": [ "qemu" ], @@ -64655,7 +64655,7 @@ "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", "sha256": "9a9047e0d949097724dec83260f04fc1dd1e55af0b7debbcad3889ff7114ffb7", "size": 995000, - "repo_path": "bios/QEMU/slof.bin", + "repo_path": "bios/QEMU/QEMU/slof.bin", "cores": [ "qemu" ] @@ -64665,7 +64665,7 @@ "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", "sha256": "6de4771f2f686482d387532115004cddaaa9d2bb39ef18d81e9629b11195c106", "size": 2527328, - "repo_path": "bios/QEMU/skiboot.lid", + "repo_path": "bios/QEMU/QEMU/skiboot.lid", "cores": [ "qemu" ] @@ -64675,7 +64675,7 @@ "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", "sha256": "8c88070f252075111468e7b2a8043209e7798c3fb136326227390ea50f168f13", "size": 3456, - "repo_path": "bios/QEMU/vof.bin", + "repo_path": "bios/QEMU/QEMU/vof.bin", "cores": [ "qemu" ] @@ -64685,7 +64685,7 @@ "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", "sha256": "cf97201f9403212ab75287bf209bfb7710cb5f253e8fe80723cf43760a9e8a12", "size": 16384, - "repo_path": "bios/QEMU/vof-nvram.bin", + "repo_path": "bios/QEMU/QEMU/vof-nvram.bin", "cores": [ "qemu" ] @@ -64695,7 +64695,7 @@ "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", "sha256": "f0250e391566bca7b5e643c43b761ab9629a0b82427792a772e80c8b97836425", "size": 421720, - "repo_path": "bios/QEMU/u-boot.e500", + "repo_path": "bios/QEMU/QEMU/u-boot.e500", "cores": [ "qemu" ], @@ -64706,7 +64706,7 @@ "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", "sha256": "be88ed96a6f50d5ba8ad7bf019f48e7f73acee95402d90d0dac3775d9c7a8d03", "size": 524288, - "repo_path": "bios/QEMU/u-boot-sam460-20100605.bin", + "repo_path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "cores": [ "qemu" ] @@ -64716,7 +64716,7 @@ "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", "sha256": "d8697354bde8a7ac9e6fe3a5fbca03698de623e95433a59c248e8e09b882c6b8", "size": 18752, - "repo_path": "bios/QEMU/qemu_vga.ndrv", + "repo_path": "bios/QEMU/QEMU/qemu_vga.ndrv", "cores": [ "qemu" ] @@ -64726,7 +64726,7 @@ "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", "sha256": "6ca2ed8f39e6e4fe3a88e84c0153836a8811cbb8c6a2019c33b63de372706733", "size": 382080, - "repo_path": "bios/QEMU/openbios-sparc32", + "repo_path": "bios/QEMU/QEMU/openbios-sparc32", "cores": [ "qemu" ], @@ -64737,7 +64737,7 @@ "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", "sha256": "9c976bc634115fee073e788b8812aed263213380e16fbee55ca04d4c3cb4def8", "size": 1593408, - "repo_path": "bios/QEMU/openbios-sparc64", + "repo_path": "bios/QEMU/QEMU/openbios-sparc64", "cores": [ "qemu" ], @@ -64748,7 +64748,7 @@ "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", "sha256": "92da99a770ab24f96c33c78382940cac8b25e88cb110634c1b32aa2d8cb852e7", "size": 1402, - "repo_path": "bios/QEMU/QEMU,tcx.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,tcx.bin", "cores": [ "qemu" ] @@ -64758,7 +64758,7 @@ "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", "sha256": "a99f3a06fdac5cf5d72bd0fd24647d897302c3ff8e918add65168185f8cbdf4d", "size": 850, - "repo_path": "bios/QEMU/QEMU,cgthree.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "cores": [ "qemu" ] @@ -64768,7 +64768,7 @@ "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", "sha256": "9f8da7264c7438fe4a24a2215e81893586f5cfafcd6e5fd0059fccc31a4e8839", "size": 153728, - "repo_path": "bios/QEMU/palcode-clipper", + "repo_path": "bios/QEMU/QEMU/palcode-clipper", "cores": [ "qemu" ], @@ -64779,7 +64779,7 @@ "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", "sha256": "1ebbd077b2b4c0f26dc0649124f8d5d56f925279dc6fc66c8adca9bb5f7855fc", "size": 268312, - "repo_path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -64789,7 +64789,7 @@ "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", "sha256": "f61451043f3ab1bb83eef32100678fde818508c682b97591a08a46683705a167", "size": 272504, - "repo_path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -64799,7 +64799,7 @@ "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", "sha256": "0985865e94e3a4f2a4db9c62a2cc2cf32075d4df8e7ddf641633e92840683b65", "size": 42608, - "repo_path": "bios/QEMU/s390-ccw.img", + "repo_path": "bios/QEMU/QEMU/s390-ccw.img", "cores": [ "qemu" ], @@ -64810,7 +64810,7 @@ "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", "sha256": "ef4ef1630a8111dfe132be467818f121537c7e86c94238273a2073b114ab256e", "size": 67232, - "repo_path": "bios/QEMU/s390-netboot.img", + "repo_path": "bios/QEMU/QEMU/s390-netboot.img", "cores": [ "qemu" ], @@ -64821,7 +64821,7 @@ "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", "sha256": "3dd2013c37f9468d3c905a2efd607bf317686e7a2aa7d139baee772b0f70b74c", "size": 167820, - "repo_path": "bios/QEMU/hppa-firmware.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware.img", "cores": [ "qemu" ], @@ -64832,7 +64832,7 @@ "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", "sha256": "a531f03a9f982a7e8811cdf3bc670f3c40d6d8b12c465f637247b16b18b851e0", "size": 206024, - "repo_path": "bios/QEMU/hppa-firmware64.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware64.img", "cores": [ "qemu" ], @@ -64843,7 +64843,7 @@ "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", "sha256": "1e643db3e209e801f30f4492fdbdafca3e8f251a7b8e12239249eb480f081003", "size": 768, - "repo_path": "bios/QEMU/npcm7xx_bootrom.bin", + "repo_path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "cores": [ "qemu" ] @@ -64853,7 +64853,7 @@ "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", "sha256": "36a49d253e2bd907a54ca5e61965438b65fac0cf152c9b11f83c0c965203f218", "size": 3211, - "repo_path": "bios/QEMU/bamboo.dtb", + "repo_path": "bios/QEMU/QEMU/bamboo.dtb", "cores": [ "qemu" ] @@ -64863,7 +64863,7 @@ "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", "sha256": "3e7ed2ed8637d8c8a1e619d8a280bc2da853e7a17eab689597c7b69770e503b0", "size": 9779, - "repo_path": "bios/QEMU/canyonlands.dtb", + "repo_path": "bios/QEMU/QEMU/canyonlands.dtb", "cores": [ "qemu" ] @@ -64873,7 +64873,7 @@ "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", "sha256": "37bda496b0b4216cce70626492b43d9aaf0d5fcdefcce45efa09d5c583770c69", "size": 9882, - "repo_path": "bios/QEMU/petalogix-ml605.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "cores": [ "qemu" ] @@ -64883,7 +64883,7 @@ "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", "sha256": "ef9f3112b7d9258cfad362dba8338ce9a8bdce59dec4d47c690b28fbefc841d7", "size": 8161, - "repo_path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "cores": [ "qemu" ] @@ -66935,7 +66935,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ] @@ -66945,7 +66945,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ] @@ -66955,7 +66955,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ] @@ -66965,7 +66965,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ] @@ -69599,7 +69599,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -69610,7 +69610,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -69621,7 +69621,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -93222,7 +93222,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -93232,7 +93232,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -93242,7 +93242,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -93252,7 +93252,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -93262,7 +93262,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -93272,7 +93272,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -93282,7 +93282,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -93292,7 +93292,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -93527,7 +93527,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -93537,7 +93537,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -93547,7 +93547,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ] @@ -93557,7 +93557,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ] diff --git a/install/emuelec.json b/install/emuelec.json index 7868b537..47a40bfb 100644 --- a/install/emuelec.json +++ b/install/emuelec.json @@ -6,7 +6,7 @@ "platform": "emuelec", "display_name": "EmuELEC", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "", "detect": [ { @@ -11184,7 +11184,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox_pure" ] @@ -11194,7 +11194,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox_pure" ] @@ -43909,7 +43909,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -43922,7 +43922,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -43935,7 +43935,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -43948,7 +43948,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -45507,7 +45507,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -45518,7 +45518,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -45529,7 +45529,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -68040,7 +68040,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -68050,7 +68050,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -68060,7 +68060,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ] @@ -68070,7 +68070,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ] diff --git a/install/knulli.json b/install/knulli.json index 4bade4d0..99fe1c0b 100644 --- a/install/knulli.json +++ b/install/knulli.json @@ -6,7 +6,7 @@ "platform": "knulli", "display_name": "KNULLI", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "bios", "detect": [ { @@ -7453,7 +7453,7 @@ "sha1": "5996972d3e033f6c525c1988c563b4ffe4c58f22", "sha256": "b2dba4425355c42a15f9dd2b62158213ea9485de137739d95582e695da404958", "size": 262144, - "repo_path": "bios/Microsoft/Chihiro/cerbios.bin", + "repo_path": "bios/Sega/Chihiro/cerbios.bin", "cores": null, "systems": [ "chihiro" @@ -9506,7 +9506,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "scummvm" @@ -9516,7 +9516,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -9528,7 +9528,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "scummvm" @@ -9538,7 +9538,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -13071,7 +13071,7 @@ "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", "size": 16384, - "repo_path": "bios/Oric/Oric/basic10.rom", + "repo_path": "bios/Tangerine/Oric/basic10.rom", "cores": [ "clk" ] @@ -13081,7 +13081,7 @@ "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", "size": 16384, - "repo_path": "bios/Oric/Oric/basic11b.rom", + "repo_path": "bios/Tangerine/Oric/basic11b.rom", "cores": [ "clk" ] @@ -13091,7 +13091,7 @@ "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", "size": 16384, - "repo_path": "bios/Oric/Oric/pravetz.rom", + "repo_path": "bios/Tangerine/Oric/pravetz.rom", "cores": [ "clk" ] @@ -13101,7 +13101,7 @@ "sha1": "bda81f64be319d8793d284bf9d40f01d19b33515", "sha256": "c24fd91c9f0687bf2033abd7747d3f5b162bba4f23692640f69ee62eb404b293", "size": 128, - "repo_path": "bios/Oric/Oric/Oric/colour.rom", + "repo_path": "bios/Tangerine/Oric/Oric/colour.rom", "cores": [ "clk" ] @@ -13131,7 +13131,7 @@ "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", "size": 8192, - "repo_path": "bios/Oric/Oric/bd500.rom", + "repo_path": "bios/Tangerine/Oric/bd500.rom", "cores": [ "clk" ] @@ -13141,7 +13141,7 @@ "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", "size": 2048, - "repo_path": "bios/Oric/Oric/jasmin.rom", + "repo_path": "bios/Tangerine/Oric/jasmin.rom", "cores": [ "clk" ] @@ -13151,7 +13151,7 @@ "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", "size": 8192, - "repo_path": "bios/Oric/Oric/microdis.rom", + "repo_path": "bios/Tangerine/Oric/microdis.rom", "cores": [ "clk" ] @@ -17737,7 +17737,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox-x", @@ -17779,7 +17779,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -17849,7 +17849,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -17969,7 +17969,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -18003,7 +18003,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -108674,7 +108674,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -108687,7 +108687,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -112803,7 +112803,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -112814,7 +112814,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -112825,7 +112825,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -163506,7 +163506,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -163519,7 +163519,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], @@ -165757,7 +165757,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox-x", diff --git a/install/lakka.json b/install/lakka.json index 6a83238e..bf9271e4 100644 --- a/install/lakka.json +++ b/install/lakka.json @@ -6,7 +6,7 @@ "platform": "lakka", "display_name": "Lakka", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "system", "detect": [ { @@ -3461,7 +3461,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -3485,7 +3485,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "dos" @@ -3495,7 +3495,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -3509,7 +3509,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -3533,7 +3533,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": null, "systems": [ "dos" @@ -3543,7 +3543,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -79616,7 +79616,7 @@ "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", "sha256": "8244f3e5eaca828cc0a6a963f1fad15d68d8d3c0b5c80b8451b3067a85f14ae1", "size": 131072, - "repo_path": "bios/QEMU/bios.bin", + "repo_path": "bios/QEMU/QEMU/bios.bin", "cores": [ "qemu" ] @@ -79626,7 +79626,7 @@ "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", "sha256": "f1d4f396011197eb989029659cde250751cc711c336b8fbbe6f77cfe0dc5dcd8", "size": 262144, - "repo_path": "bios/QEMU/bios-256k.bin", + "repo_path": "bios/QEMU/QEMU/bios-256k.bin", "cores": [ "qemu" ] @@ -79636,7 +79636,7 @@ "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", "sha256": "42780e1ab9161752848475529a25c39d7c76baee82a1b2ddff666c2f7de7bbee", "size": 131072, - "repo_path": "bios/QEMU/bios-microvm.bin", + "repo_path": "bios/QEMU/QEMU/bios-microvm.bin", "cores": [ "qemu" ] @@ -79646,7 +79646,7 @@ "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", "sha256": "9b9dfc6c25740d6225625570d71cab6805cc9216e68c8932e343266daaeb8c4b", "size": 65536, - "repo_path": "bios/QEMU/qboot.rom", + "repo_path": "bios/QEMU/QEMU/qboot.rom", "cores": [ "qemu" ] @@ -79656,7 +79656,7 @@ "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", "sha256": "f0defab87465236d0d22b6000bd2c270e05a56ff3bb7fd209a56069caed86d57", "size": 38912, - "repo_path": "bios/QEMU/vgabios.bin", + "repo_path": "bios/QEMU/QEMU/vgabios.bin", "cores": [ "qemu" ] @@ -79666,7 +79666,7 @@ "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", "sha256": "305d3b15f67e65f1899a1664621f6b471e4345d33fd9eb4f6320b4559f6a04f2", "size": 38912, - "repo_path": "bios/QEMU/vgabios-cirrus.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "cores": [ "qemu" ] @@ -79676,7 +79676,7 @@ "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", "sha256": "651513519f9e0d5b99d3b051a8f5c68db69e987339b59a441d371068c34c146b", "size": 39424, - "repo_path": "bios/QEMU/vgabios-stdvga.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "cores": [ "qemu" ] @@ -79686,7 +79686,7 @@ "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", "sha256": "d5fd6992dfdf0c980996b79c5ea13b9c8b36342c1dc94fcd682a6c3e8df850ff", "size": 28672, - "repo_path": "bios/QEMU/vgabios-bochs-display.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "cores": [ "qemu" ] @@ -79696,7 +79696,7 @@ "sha1": "49df9be557f0f0277c8fedb889257e279586d536", "sha256": "31b26b2288ed5594b65a234e797ee7105d225d48086170b27ab518c3fb69b7de", "size": 28672, - "repo_path": "bios/QEMU/vgabios-ramfb.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "cores": [ "qemu" ] @@ -79706,7 +79706,7 @@ "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", "sha256": "9d4d1f32a7e059de82c09c19fc25e276a39d96a1a516605a32ba704596e10d8e", "size": 39424, - "repo_path": "bios/QEMU/vgabios-ati.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ati.bin", "cores": [ "qemu" ] @@ -79716,7 +79716,7 @@ "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", "sha256": "e81cc2807ebb9a1467b1933d192a4313424b499b73e7674257f07cd2171e01c7", "size": 39424, - "repo_path": "bios/QEMU/vgabios-qxl.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-qxl.bin", "cores": [ "qemu" ] @@ -79726,7 +79726,7 @@ "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", "sha256": "746f38c2023dbbc071503113f970bcf69d49c6e7c55fa8c0e3748dbccba42772", "size": 39424, - "repo_path": "bios/QEMU/vgabios-virtio.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-virtio.bin", "cores": [ "qemu" ] @@ -79736,7 +79736,7 @@ "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", "sha256": "c12841eb2b057b6d99bfbc7ab72bea896e2b5cd694c93b026d7510de2b68ca11", "size": 39424, - "repo_path": "bios/QEMU/vgabios-vmware.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-vmware.bin", "cores": [ "qemu" ] @@ -79746,7 +79746,7 @@ "sha1": "670c9cc79b4859944705eece710dc332188b79b4", "sha256": "cdf057a71b07e3b52b19cbe210bdefa59250d01a9810b960f7fe1f98eed95a27", "size": 9216, - "repo_path": "bios/QEMU/kvmvapic.bin", + "repo_path": "bios/QEMU/QEMU/kvmvapic.bin", "cores": [ "qemu" ] @@ -79756,7 +79756,7 @@ "sha1": "fd19bef7f5647960952520389f448364762ed948", "sha256": "1ecfb26c19da9dc00cdec0d0d738db69aeea4f1231c0c0ffc483ff69b3cda6ce", "size": 1024, - "repo_path": "bios/QEMU/linuxboot.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot.bin", "cores": [ "qemu" ] @@ -79766,7 +79766,7 @@ "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", "sha256": "9c49e255340c78fc12e54ed043462bca02fb7fca29b7cfab62ff88a5344b6950", "size": 1536, - "repo_path": "bios/QEMU/linuxboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot_dma.bin", "cores": [ "qemu" ] @@ -79776,7 +79776,7 @@ "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", "sha256": "13a3f9f119797b8776105f020f36572ce6a20fa2c60d3b8112818bfaefcdd348", "size": 1024, - "repo_path": "bios/QEMU/multiboot.bin", + "repo_path": "bios/QEMU/QEMU/multiboot.bin", "cores": [ "qemu" ] @@ -79786,7 +79786,7 @@ "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", "sha256": "e01667420ee78a318ea44627d2dd68058d3377d024e6eb7237700afe2e86507d", "size": 1024, - "repo_path": "bios/QEMU/multiboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/multiboot_dma.bin", "cores": [ "qemu" ] @@ -79796,7 +79796,7 @@ "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", "sha256": "918ff03a118615c2f4611a5df2d9496aabe099b5cfaaf69e544ebf973305d59d", "size": 1536, - "repo_path": "bios/QEMU/pvh.bin", + "repo_path": "bios/QEMU/QEMU/pvh.bin", "cores": [ "qemu" ] @@ -79806,7 +79806,7 @@ "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", "sha256": "981a728f95b7a01645645e9b753cfb764c9eb59266fa888ac58d7008fbb48c10", "size": 67072, - "repo_path": "bios/QEMU/pxe-e1000.rom", + "repo_path": "bios/QEMU/QEMU/pxe-e1000.rom", "cores": [ "qemu" ] @@ -79816,7 +79816,7 @@ "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", "sha256": "07b89a742e0f6d0e92dafe57b0f28c493436d0e1e07b7b77e728490c1f7b45dd", "size": 61440, - "repo_path": "bios/QEMU/pxe-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/pxe-eepro100.rom", "cores": [ "qemu" ] @@ -79826,7 +79826,7 @@ "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", "sha256": "bb9c0eaad36b9b4ce26c5f348bd05a832c8bf83ef38391db0ce9b51de8523ac7", "size": 61440, - "repo_path": "bios/QEMU/pxe-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "cores": [ "qemu" ] @@ -79836,7 +79836,7 @@ "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", "sha256": "92358396c05b3346c6bfd52bbf2a47978d0a8c6ddea932ee091a24faefbd489e", "size": 61440, - "repo_path": "bios/QEMU/pxe-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/pxe-pcnet.rom", "cores": [ "qemu" ] @@ -79846,7 +79846,7 @@ "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", "sha256": "d491351e37a50eb5a40e98a9f6b4d85010ee60fb9e64129d65ea10839287f138", "size": 61440, - "repo_path": "bios/QEMU/pxe-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "cores": [ "qemu" ] @@ -79856,7 +79856,7 @@ "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", "sha256": "6994337fe07783a6233072e33771dc4f58260edc3269debe677a5227b264bfdc", "size": 60416, - "repo_path": "bios/QEMU/pxe-virtio.rom", + "repo_path": "bios/QEMU/QEMU/pxe-virtio.rom", "cores": [ "qemu" ] @@ -79866,7 +79866,7 @@ "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", "sha256": "f37222fcdf0481bfbaf7a16d9aaf740aeb41d3d24c187801eb6e9a628cec0fc8", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000.rom", "cores": [ "qemu" ] @@ -79876,7 +79876,7 @@ "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", "sha256": "102c20348be2d0ebe45a77b076b31848182c2f7b4364775b6bc2ece6e97b4024", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000e.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000e.rom", "cores": [ "qemu" ] @@ -79886,7 +79886,7 @@ "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", "sha256": "2b5b55ba8afae7b5ef7116606babf60e6ceaa531c345d54542857cc3fbe3912e", "size": 159232, - "repo_path": "bios/QEMU/efi-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/efi-eepro100.rom", "cores": [ "qemu" ] @@ -79896,7 +79896,7 @@ "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", "sha256": "9925e0a34547118110479d8fc4e01092a0a73e0a236416e9ff862655b46751f7", "size": 157696, - "repo_path": "bios/QEMU/efi-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "cores": [ "qemu" ] @@ -79906,7 +79906,7 @@ "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", "sha256": "71c494fde94efa9871cf43868d7e3c8f4190e406d47a5102a2a21b36ded8a162", "size": 157696, - "repo_path": "bios/QEMU/efi-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/efi-pcnet.rom", "cores": [ "qemu" ] @@ -79916,7 +79916,7 @@ "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", "sha256": "4cdd69a7f5c6ce7aec3a3f20a034dc80e1d22aa37a739c364378952d997a32c7", "size": 160768, - "repo_path": "bios/QEMU/efi-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/efi-rtl8139.rom", "cores": [ "qemu" ] @@ -79926,7 +79926,7 @@ "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", "sha256": "26be36901db7f8181c306cc62bd74891d8646528965a78e40cceadba5dd7c8e7", "size": 160768, - "repo_path": "bios/QEMU/efi-virtio.rom", + "repo_path": "bios/QEMU/QEMU/efi-virtio.rom", "cores": [ "qemu" ] @@ -79936,7 +79936,7 @@ "sha1": "6557242402387a6319a0db6abb916ada48e1391c", "sha256": "33e833123ad9831df94b2d623a17f91e4c779e3cb799baa97058f5972676a32a", "size": 156672, - "repo_path": "bios/QEMU/efi-vmxnet3.rom", + "repo_path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "cores": [ "qemu" ] @@ -79946,7 +79946,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -79956,7 +79956,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -79966,7 +79966,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -79976,7 +79976,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -79986,7 +79986,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -79996,7 +79996,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -80008,7 +80008,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -80020,7 +80020,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -80032,7 +80032,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -80042,7 +80042,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -80052,7 +80052,7 @@ "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", "sha256": "f1d9bdb018e59ff65e39ce60cc0f9199af73d1770c34137ce423e04662cf96c8", "size": 677196, - "repo_path": "bios/QEMU/openbios-ppc", + "repo_path": "bios/QEMU/QEMU/openbios-ppc", "cores": [ "qemu" ], @@ -80063,7 +80063,7 @@ "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", "sha256": "9a9047e0d949097724dec83260f04fc1dd1e55af0b7debbcad3889ff7114ffb7", "size": 995000, - "repo_path": "bios/QEMU/slof.bin", + "repo_path": "bios/QEMU/QEMU/slof.bin", "cores": [ "qemu" ] @@ -80073,7 +80073,7 @@ "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", "sha256": "6de4771f2f686482d387532115004cddaaa9d2bb39ef18d81e9629b11195c106", "size": 2527328, - "repo_path": "bios/QEMU/skiboot.lid", + "repo_path": "bios/QEMU/QEMU/skiboot.lid", "cores": [ "qemu" ] @@ -80083,7 +80083,7 @@ "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", "sha256": "8c88070f252075111468e7b2a8043209e7798c3fb136326227390ea50f168f13", "size": 3456, - "repo_path": "bios/QEMU/vof.bin", + "repo_path": "bios/QEMU/QEMU/vof.bin", "cores": [ "qemu" ] @@ -80093,7 +80093,7 @@ "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", "sha256": "cf97201f9403212ab75287bf209bfb7710cb5f253e8fe80723cf43760a9e8a12", "size": 16384, - "repo_path": "bios/QEMU/vof-nvram.bin", + "repo_path": "bios/QEMU/QEMU/vof-nvram.bin", "cores": [ "qemu" ] @@ -80103,7 +80103,7 @@ "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", "sha256": "f0250e391566bca7b5e643c43b761ab9629a0b82427792a772e80c8b97836425", "size": 421720, - "repo_path": "bios/QEMU/u-boot.e500", + "repo_path": "bios/QEMU/QEMU/u-boot.e500", "cores": [ "qemu" ], @@ -80114,7 +80114,7 @@ "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", "sha256": "be88ed96a6f50d5ba8ad7bf019f48e7f73acee95402d90d0dac3775d9c7a8d03", "size": 524288, - "repo_path": "bios/QEMU/u-boot-sam460-20100605.bin", + "repo_path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "cores": [ "qemu" ] @@ -80124,7 +80124,7 @@ "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", "sha256": "d8697354bde8a7ac9e6fe3a5fbca03698de623e95433a59c248e8e09b882c6b8", "size": 18752, - "repo_path": "bios/QEMU/qemu_vga.ndrv", + "repo_path": "bios/QEMU/QEMU/qemu_vga.ndrv", "cores": [ "qemu" ] @@ -80134,7 +80134,7 @@ "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", "sha256": "6ca2ed8f39e6e4fe3a88e84c0153836a8811cbb8c6a2019c33b63de372706733", "size": 382080, - "repo_path": "bios/QEMU/openbios-sparc32", + "repo_path": "bios/QEMU/QEMU/openbios-sparc32", "cores": [ "qemu" ], @@ -80145,7 +80145,7 @@ "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", "sha256": "9c976bc634115fee073e788b8812aed263213380e16fbee55ca04d4c3cb4def8", "size": 1593408, - "repo_path": "bios/QEMU/openbios-sparc64", + "repo_path": "bios/QEMU/QEMU/openbios-sparc64", "cores": [ "qemu" ], @@ -80156,7 +80156,7 @@ "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", "sha256": "92da99a770ab24f96c33c78382940cac8b25e88cb110634c1b32aa2d8cb852e7", "size": 1402, - "repo_path": "bios/QEMU/QEMU,tcx.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,tcx.bin", "cores": [ "qemu" ] @@ -80166,7 +80166,7 @@ "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", "sha256": "a99f3a06fdac5cf5d72bd0fd24647d897302c3ff8e918add65168185f8cbdf4d", "size": 850, - "repo_path": "bios/QEMU/QEMU,cgthree.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "cores": [ "qemu" ] @@ -80176,7 +80176,7 @@ "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", "sha256": "9f8da7264c7438fe4a24a2215e81893586f5cfafcd6e5fd0059fccc31a4e8839", "size": 153728, - "repo_path": "bios/QEMU/palcode-clipper", + "repo_path": "bios/QEMU/QEMU/palcode-clipper", "cores": [ "qemu" ], @@ -80187,7 +80187,7 @@ "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", "sha256": "1ebbd077b2b4c0f26dc0649124f8d5d56f925279dc6fc66c8adca9bb5f7855fc", "size": 268312, - "repo_path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -80197,7 +80197,7 @@ "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", "sha256": "f61451043f3ab1bb83eef32100678fde818508c682b97591a08a46683705a167", "size": 272504, - "repo_path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -80207,7 +80207,7 @@ "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", "sha256": "0985865e94e3a4f2a4db9c62a2cc2cf32075d4df8e7ddf641633e92840683b65", "size": 42608, - "repo_path": "bios/QEMU/s390-ccw.img", + "repo_path": "bios/QEMU/QEMU/s390-ccw.img", "cores": [ "qemu" ], @@ -80218,7 +80218,7 @@ "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", "sha256": "ef4ef1630a8111dfe132be467818f121537c7e86c94238273a2073b114ab256e", "size": 67232, - "repo_path": "bios/QEMU/s390-netboot.img", + "repo_path": "bios/QEMU/QEMU/s390-netboot.img", "cores": [ "qemu" ], @@ -80229,7 +80229,7 @@ "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", "sha256": "3dd2013c37f9468d3c905a2efd607bf317686e7a2aa7d139baee772b0f70b74c", "size": 167820, - "repo_path": "bios/QEMU/hppa-firmware.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware.img", "cores": [ "qemu" ], @@ -80240,7 +80240,7 @@ "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", "sha256": "a531f03a9f982a7e8811cdf3bc670f3c40d6d8b12c465f637247b16b18b851e0", "size": 206024, - "repo_path": "bios/QEMU/hppa-firmware64.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware64.img", "cores": [ "qemu" ], @@ -80251,7 +80251,7 @@ "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", "sha256": "1e643db3e209e801f30f4492fdbdafca3e8f251a7b8e12239249eb480f081003", "size": 768, - "repo_path": "bios/QEMU/npcm7xx_bootrom.bin", + "repo_path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "cores": [ "qemu" ] @@ -80261,7 +80261,7 @@ "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", "sha256": "36a49d253e2bd907a54ca5e61965438b65fac0cf152c9b11f83c0c965203f218", "size": 3211, - "repo_path": "bios/QEMU/bamboo.dtb", + "repo_path": "bios/QEMU/QEMU/bamboo.dtb", "cores": [ "qemu" ] @@ -80271,7 +80271,7 @@ "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", "sha256": "3e7ed2ed8637d8c8a1e619d8a280bc2da853e7a17eab689597c7b69770e503b0", "size": 9779, - "repo_path": "bios/QEMU/canyonlands.dtb", + "repo_path": "bios/QEMU/QEMU/canyonlands.dtb", "cores": [ "qemu" ] @@ -80281,7 +80281,7 @@ "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", "sha256": "37bda496b0b4216cce70626492b43d9aaf0d5fcdefcce45efa09d5c583770c69", "size": 9882, - "repo_path": "bios/QEMU/petalogix-ml605.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "cores": [ "qemu" ] @@ -80291,7 +80291,7 @@ "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", "sha256": "ef9f3112b7d9258cfad362dba8338ce9a8bdce59dec4d47c690b28fbefc841d7", "size": 8161, - "repo_path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "cores": [ "qemu" ] @@ -81952,7 +81952,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -81965,7 +81965,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -81978,7 +81978,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -81991,7 +81991,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -84289,7 +84289,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -84303,7 +84303,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -84317,7 +84317,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -111393,7 +111393,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -111403,7 +111403,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -111413,7 +111413,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -111423,7 +111423,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -111433,7 +111433,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -111443,7 +111443,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -111453,7 +111453,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -111463,7 +111463,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -114418,7 +114418,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ], @@ -114431,7 +114431,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ], @@ -114444,7 +114444,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -114457,7 +114457,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], diff --git a/install/myminui.json b/install/myminui.json index 28c564e2..16952236 100644 --- a/install/myminui.json +++ b/install/myminui.json @@ -6,7 +6,7 @@ "platform": "myminui", "display_name": "MyMinUI", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T11:13:30Z", "base_destination": "", "detect": [ { @@ -127,7 +127,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox_pure" ] @@ -137,7 +137,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox_pure" ] diff --git a/install/recalbox.json b/install/recalbox.json index 86724297..b3c32c30 100644 --- a/install/recalbox.json +++ b/install/recalbox.json @@ -6,7 +6,7 @@ "platform": "recalbox", "display_name": "Recalbox", "version": "1.0", - "generated": "2026-10-23T07:11:31Z", + "generated": "2026-10-23T11:13:30Z", "base_destination": "bios", "detect": [ { @@ -4373,7 +4373,7 @@ "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", "size": 16384, - "repo_path": "bios/Oric/Oric/basic11b.rom", + "repo_path": "bios/Tangerine/Oric/basic11b.rom", "cores": null, "systems": [ "oricatmos" @@ -4384,7 +4384,7 @@ "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", "size": 16384, - "repo_path": "bios/Oric/Oric/basic10.rom", + "repo_path": "bios/Tangerine/Oric/basic10.rom", "cores": null, "systems": [ "oricatmos" @@ -4395,7 +4395,7 @@ "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", "size": 8192, - "repo_path": "bios/Oric/Oric/bd500.rom", + "repo_path": "bios/Tangerine/Oric/bd500.rom", "cores": null, "systems": [ "oricatmos" @@ -4406,7 +4406,7 @@ "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", "size": 2048, - "repo_path": "bios/Oric/Oric/jasmin.rom", + "repo_path": "bios/Tangerine/Oric/jasmin.rom", "cores": null, "systems": [ "oricatmos" @@ -4417,7 +4417,7 @@ "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", "size": 8192, - "repo_path": "bios/Oric/Oric/microdis.rom", + "repo_path": "bios/Tangerine/Oric/microdis.rom", "cores": null, "systems": [ "oricatmos" @@ -4428,7 +4428,7 @@ "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", "size": 16384, - "repo_path": "bios/Oric/Oric/pravetz.rom", + "repo_path": "bios/Tangerine/Oric/pravetz.rom", "cores": null, "systems": [ "oricatmos" @@ -4439,7 +4439,7 @@ "sha1": "746a2996967282281a980842a93642ad7d740f9e", "sha256": "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6", "size": 512, - "repo_path": "bios/Oric/Oric/8dos2.rom", + "repo_path": "bios/Tangerine/Oric/8dos2.rom", "cores": null, "systems": [ "oricatmos" @@ -4450,7 +4450,7 @@ "sha1": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", "sha256": "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee", "size": 16384, - "repo_path": "bios/Oric/Oric/teleass.rom", + "repo_path": "bios/Tangerine/Oric/teleass.rom", "cores": null, "systems": [ "oricatmos" @@ -4461,7 +4461,7 @@ "sha1": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", "sha256": "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6", "size": 16384, - "repo_path": "bios/Oric/Oric/hyperbas.rom", + "repo_path": "bios/Tangerine/Oric/hyperbas.rom", "cores": null, "systems": [ "oricatmos" @@ -4472,7 +4472,7 @@ "sha1": "86fc8dc0932f983efa199e31ae05a4424772f959", "sha256": "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094", "size": 16384, - "repo_path": "bios/Oric/Oric/telmon24.rom", + "repo_path": "bios/Tangerine/Oric/telmon24.rom", "cores": null, "systems": [ "oricatmos" @@ -4923,7 +4923,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "scummvm" @@ -4934,7 +4934,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "scummvm" @@ -11465,7 +11465,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_pure" @@ -33696,7 +33696,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -33709,7 +33709,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -33722,7 +33722,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -33735,7 +33735,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -37962,7 +37962,7 @@ "sha1": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", "sha256": "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144", "size": 16384, - "repo_path": "bios/Oric/Oric/kernel.rom", + "repo_path": "bios/Tangerine/Oric/kernel.rom", "cores": [ "oricutron" ], @@ -37975,7 +37975,7 @@ "sha1": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", "sha256": "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8", "size": 16384, - "repo_path": "bios/Oric/Oric/shell.rom", + "repo_path": "bios/Tangerine/Oric/shell.rom", "cores": [ "oricutron" ], @@ -38566,7 +38566,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -38579,7 +38579,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], @@ -40193,7 +40193,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_pure" @@ -41098,7 +41098,7 @@ "sha1": "9451a1a09d8f75944dbd6f91193fc360f1de80ac", "sha256": "ed28568574716eef5d7c0fde2568d7a47a6e4b1fbca81daff3be05e45723466d", "size": 16384, - "repo_path": "bios/Oric/Oric/basic11b.rom", + "repo_path": "bios/Tangerine/Oric/basic11b.rom", "cores": [ "oricutron" ], @@ -41111,7 +41111,7 @@ "sha1": "333116e6884d85aaa4dfc7578a91cceeea66d016", "sha256": "83d341dab126092f7a6d56f6a92bca0643ff3aa6529d896085004f958c9be2ff", "size": 16384, - "repo_path": "bios/Oric/Oric/basic10.rom", + "repo_path": "bios/Tangerine/Oric/basic10.rom", "cores": [ "oricutron" ], @@ -41124,7 +41124,7 @@ "sha1": "7afc276cb118adff72e4f16698f94bf3b2c64146", "sha256": "a142c6a9f9ccf25ce4e7ab64107bc2210ee7f68557fe3a8bbb60d1587da814ae", "size": 16384, - "repo_path": "bios/Oric/Oric/pravetz.rom", + "repo_path": "bios/Tangerine/Oric/pravetz.rom", "cores": [ "oricutron" ], @@ -41137,7 +41137,7 @@ "sha1": "9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d", "sha256": "49921a9f932f7ecc2947b9b08f0451a393dc48f55317209c44338dc8bcf227ee", "size": 16384, - "repo_path": "bios/Oric/Oric/teleass.rom", + "repo_path": "bios/Tangerine/Oric/teleass.rom", "cores": [ "oricutron" ], @@ -41150,7 +41150,7 @@ "sha1": "f5f70a0eb59f8cd6c261e179ae78ef906f68ed63", "sha256": "08eaf63a55a7659a6da7c91cf4a57bb0e2e21ff856d0957928605aa5feed09c6", "size": 16384, - "repo_path": "bios/Oric/Oric/hyperbas.rom", + "repo_path": "bios/Tangerine/Oric/hyperbas.rom", "cores": [ "oricutron" ], @@ -41163,7 +41163,7 @@ "sha1": "86fc8dc0932f983efa199e31ae05a4424772f959", "sha256": "0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094", "size": 16384, - "repo_path": "bios/Oric/Oric/telmon24.rom", + "repo_path": "bios/Tangerine/Oric/telmon24.rom", "cores": [ "oricutron" ], @@ -41176,7 +41176,7 @@ "sha1": "0d2ef6e67322f48f4b7e08d8bbe68827e2074561", "sha256": "1b82882eeaddba463e3f89218fd9eb30147345e540bbccf96bf30c14d2e45941", "size": 8192, - "repo_path": "bios/Oric/Oric/microdis.rom", + "repo_path": "bios/Tangerine/Oric/microdis.rom", "cores": [ "oricutron" ], @@ -41189,7 +41189,7 @@ "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", "size": 8192, - "repo_path": "bios/Oric/Oric/bd500.rom", + "repo_path": "bios/Tangerine/Oric/bd500.rom", "cores": [ "oricutron" ], @@ -41202,7 +41202,7 @@ "sha1": "70e59b8abd67092f050462abc6cb5271e4c15f01", "sha256": "60d9aaaa7e787080779acbf8ad7af81fe9b8851af5e395c2f3bf10c114a76a23", "size": 2048, - "repo_path": "bios/Oric/Oric/jasmin.rom", + "repo_path": "bios/Tangerine/Oric/jasmin.rom", "cores": [ "oricutron" ], @@ -41215,7 +41215,7 @@ "sha1": "746a2996967282281a980842a93642ad7d740f9e", "sha256": "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6", "size": 512, - "repo_path": "bios/Oric/Oric/8dos2.rom", + "repo_path": "bios/Tangerine/Oric/8dos2.rom", "cores": [ "oricutron" ], @@ -41437,7 +41437,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ], @@ -41450,7 +41450,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ], diff --git a/install/retroarch.json b/install/retroarch.json index 0eff4528..4e0d7843 100644 --- a/install/retroarch.json +++ b/install/retroarch.json @@ -6,7 +6,7 @@ "platform": "retroarch", "display_name": "RetroArch", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "system", "detect": [ { @@ -4026,7 +4026,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -4050,7 +4050,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "dos" @@ -4060,7 +4060,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -4074,7 +4074,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -4098,7 +4098,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": null, "systems": [ "dos" @@ -4108,7 +4108,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -80399,7 +80399,7 @@ "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", "sha256": "8244f3e5eaca828cc0a6a963f1fad15d68d8d3c0b5c80b8451b3067a85f14ae1", "size": 131072, - "repo_path": "bios/QEMU/bios.bin", + "repo_path": "bios/QEMU/QEMU/bios.bin", "cores": [ "qemu" ] @@ -80409,7 +80409,7 @@ "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", "sha256": "f1d4f396011197eb989029659cde250751cc711c336b8fbbe6f77cfe0dc5dcd8", "size": 262144, - "repo_path": "bios/QEMU/bios-256k.bin", + "repo_path": "bios/QEMU/QEMU/bios-256k.bin", "cores": [ "qemu" ] @@ -80419,7 +80419,7 @@ "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", "sha256": "42780e1ab9161752848475529a25c39d7c76baee82a1b2ddff666c2f7de7bbee", "size": 131072, - "repo_path": "bios/QEMU/bios-microvm.bin", + "repo_path": "bios/QEMU/QEMU/bios-microvm.bin", "cores": [ "qemu" ] @@ -80429,7 +80429,7 @@ "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", "sha256": "9b9dfc6c25740d6225625570d71cab6805cc9216e68c8932e343266daaeb8c4b", "size": 65536, - "repo_path": "bios/QEMU/qboot.rom", + "repo_path": "bios/QEMU/QEMU/qboot.rom", "cores": [ "qemu" ] @@ -80439,7 +80439,7 @@ "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", "sha256": "f0defab87465236d0d22b6000bd2c270e05a56ff3bb7fd209a56069caed86d57", "size": 38912, - "repo_path": "bios/QEMU/vgabios.bin", + "repo_path": "bios/QEMU/QEMU/vgabios.bin", "cores": [ "qemu" ] @@ -80449,7 +80449,7 @@ "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", "sha256": "305d3b15f67e65f1899a1664621f6b471e4345d33fd9eb4f6320b4559f6a04f2", "size": 38912, - "repo_path": "bios/QEMU/vgabios-cirrus.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "cores": [ "qemu" ] @@ -80459,7 +80459,7 @@ "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", "sha256": "651513519f9e0d5b99d3b051a8f5c68db69e987339b59a441d371068c34c146b", "size": 39424, - "repo_path": "bios/QEMU/vgabios-stdvga.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "cores": [ "qemu" ] @@ -80469,7 +80469,7 @@ "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", "sha256": "d5fd6992dfdf0c980996b79c5ea13b9c8b36342c1dc94fcd682a6c3e8df850ff", "size": 28672, - "repo_path": "bios/QEMU/vgabios-bochs-display.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "cores": [ "qemu" ] @@ -80479,7 +80479,7 @@ "sha1": "49df9be557f0f0277c8fedb889257e279586d536", "sha256": "31b26b2288ed5594b65a234e797ee7105d225d48086170b27ab518c3fb69b7de", "size": 28672, - "repo_path": "bios/QEMU/vgabios-ramfb.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "cores": [ "qemu" ] @@ -80489,7 +80489,7 @@ "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", "sha256": "9d4d1f32a7e059de82c09c19fc25e276a39d96a1a516605a32ba704596e10d8e", "size": 39424, - "repo_path": "bios/QEMU/vgabios-ati.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ati.bin", "cores": [ "qemu" ] @@ -80499,7 +80499,7 @@ "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", "sha256": "e81cc2807ebb9a1467b1933d192a4313424b499b73e7674257f07cd2171e01c7", "size": 39424, - "repo_path": "bios/QEMU/vgabios-qxl.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-qxl.bin", "cores": [ "qemu" ] @@ -80509,7 +80509,7 @@ "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", "sha256": "746f38c2023dbbc071503113f970bcf69d49c6e7c55fa8c0e3748dbccba42772", "size": 39424, - "repo_path": "bios/QEMU/vgabios-virtio.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-virtio.bin", "cores": [ "qemu" ] @@ -80519,7 +80519,7 @@ "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", "sha256": "c12841eb2b057b6d99bfbc7ab72bea896e2b5cd694c93b026d7510de2b68ca11", "size": 39424, - "repo_path": "bios/QEMU/vgabios-vmware.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-vmware.bin", "cores": [ "qemu" ] @@ -80529,7 +80529,7 @@ "sha1": "670c9cc79b4859944705eece710dc332188b79b4", "sha256": "cdf057a71b07e3b52b19cbe210bdefa59250d01a9810b960f7fe1f98eed95a27", "size": 9216, - "repo_path": "bios/QEMU/kvmvapic.bin", + "repo_path": "bios/QEMU/QEMU/kvmvapic.bin", "cores": [ "qemu" ] @@ -80539,7 +80539,7 @@ "sha1": "fd19bef7f5647960952520389f448364762ed948", "sha256": "1ecfb26c19da9dc00cdec0d0d738db69aeea4f1231c0c0ffc483ff69b3cda6ce", "size": 1024, - "repo_path": "bios/QEMU/linuxboot.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot.bin", "cores": [ "qemu" ] @@ -80549,7 +80549,7 @@ "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", "sha256": "9c49e255340c78fc12e54ed043462bca02fb7fca29b7cfab62ff88a5344b6950", "size": 1536, - "repo_path": "bios/QEMU/linuxboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot_dma.bin", "cores": [ "qemu" ] @@ -80559,7 +80559,7 @@ "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", "sha256": "13a3f9f119797b8776105f020f36572ce6a20fa2c60d3b8112818bfaefcdd348", "size": 1024, - "repo_path": "bios/QEMU/multiboot.bin", + "repo_path": "bios/QEMU/QEMU/multiboot.bin", "cores": [ "qemu" ] @@ -80569,7 +80569,7 @@ "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", "sha256": "e01667420ee78a318ea44627d2dd68058d3377d024e6eb7237700afe2e86507d", "size": 1024, - "repo_path": "bios/QEMU/multiboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/multiboot_dma.bin", "cores": [ "qemu" ] @@ -80579,7 +80579,7 @@ "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", "sha256": "918ff03a118615c2f4611a5df2d9496aabe099b5cfaaf69e544ebf973305d59d", "size": 1536, - "repo_path": "bios/QEMU/pvh.bin", + "repo_path": "bios/QEMU/QEMU/pvh.bin", "cores": [ "qemu" ] @@ -80589,7 +80589,7 @@ "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", "sha256": "981a728f95b7a01645645e9b753cfb764c9eb59266fa888ac58d7008fbb48c10", "size": 67072, - "repo_path": "bios/QEMU/pxe-e1000.rom", + "repo_path": "bios/QEMU/QEMU/pxe-e1000.rom", "cores": [ "qemu" ] @@ -80599,7 +80599,7 @@ "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", "sha256": "07b89a742e0f6d0e92dafe57b0f28c493436d0e1e07b7b77e728490c1f7b45dd", "size": 61440, - "repo_path": "bios/QEMU/pxe-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/pxe-eepro100.rom", "cores": [ "qemu" ] @@ -80609,7 +80609,7 @@ "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", "sha256": "bb9c0eaad36b9b4ce26c5f348bd05a832c8bf83ef38391db0ce9b51de8523ac7", "size": 61440, - "repo_path": "bios/QEMU/pxe-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "cores": [ "qemu" ] @@ -80619,7 +80619,7 @@ "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", "sha256": "92358396c05b3346c6bfd52bbf2a47978d0a8c6ddea932ee091a24faefbd489e", "size": 61440, - "repo_path": "bios/QEMU/pxe-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/pxe-pcnet.rom", "cores": [ "qemu" ] @@ -80629,7 +80629,7 @@ "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", "sha256": "d491351e37a50eb5a40e98a9f6b4d85010ee60fb9e64129d65ea10839287f138", "size": 61440, - "repo_path": "bios/QEMU/pxe-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "cores": [ "qemu" ] @@ -80639,7 +80639,7 @@ "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", "sha256": "6994337fe07783a6233072e33771dc4f58260edc3269debe677a5227b264bfdc", "size": 60416, - "repo_path": "bios/QEMU/pxe-virtio.rom", + "repo_path": "bios/QEMU/QEMU/pxe-virtio.rom", "cores": [ "qemu" ] @@ -80649,7 +80649,7 @@ "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", "sha256": "f37222fcdf0481bfbaf7a16d9aaf740aeb41d3d24c187801eb6e9a628cec0fc8", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000.rom", "cores": [ "qemu" ] @@ -80659,7 +80659,7 @@ "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", "sha256": "102c20348be2d0ebe45a77b076b31848182c2f7b4364775b6bc2ece6e97b4024", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000e.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000e.rom", "cores": [ "qemu" ] @@ -80669,7 +80669,7 @@ "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", "sha256": "2b5b55ba8afae7b5ef7116606babf60e6ceaa531c345d54542857cc3fbe3912e", "size": 159232, - "repo_path": "bios/QEMU/efi-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/efi-eepro100.rom", "cores": [ "qemu" ] @@ -80679,7 +80679,7 @@ "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", "sha256": "9925e0a34547118110479d8fc4e01092a0a73e0a236416e9ff862655b46751f7", "size": 157696, - "repo_path": "bios/QEMU/efi-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "cores": [ "qemu" ] @@ -80689,7 +80689,7 @@ "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", "sha256": "71c494fde94efa9871cf43868d7e3c8f4190e406d47a5102a2a21b36ded8a162", "size": 157696, - "repo_path": "bios/QEMU/efi-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/efi-pcnet.rom", "cores": [ "qemu" ] @@ -80699,7 +80699,7 @@ "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", "sha256": "4cdd69a7f5c6ce7aec3a3f20a034dc80e1d22aa37a739c364378952d997a32c7", "size": 160768, - "repo_path": "bios/QEMU/efi-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/efi-rtl8139.rom", "cores": [ "qemu" ] @@ -80709,7 +80709,7 @@ "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", "sha256": "26be36901db7f8181c306cc62bd74891d8646528965a78e40cceadba5dd7c8e7", "size": 160768, - "repo_path": "bios/QEMU/efi-virtio.rom", + "repo_path": "bios/QEMU/QEMU/efi-virtio.rom", "cores": [ "qemu" ] @@ -80719,7 +80719,7 @@ "sha1": "6557242402387a6319a0db6abb916ada48e1391c", "sha256": "33e833123ad9831df94b2d623a17f91e4c779e3cb799baa97058f5972676a32a", "size": 156672, - "repo_path": "bios/QEMU/efi-vmxnet3.rom", + "repo_path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "cores": [ "qemu" ] @@ -80729,7 +80729,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -80739,7 +80739,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -80749,7 +80749,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -80759,7 +80759,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -80769,7 +80769,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -80779,7 +80779,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -80791,7 +80791,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -80803,7 +80803,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -80815,7 +80815,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -80825,7 +80825,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -80835,7 +80835,7 @@ "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", "sha256": "f1d9bdb018e59ff65e39ce60cc0f9199af73d1770c34137ce423e04662cf96c8", "size": 677196, - "repo_path": "bios/QEMU/openbios-ppc", + "repo_path": "bios/QEMU/QEMU/openbios-ppc", "cores": [ "qemu" ], @@ -80846,7 +80846,7 @@ "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", "sha256": "9a9047e0d949097724dec83260f04fc1dd1e55af0b7debbcad3889ff7114ffb7", "size": 995000, - "repo_path": "bios/QEMU/slof.bin", + "repo_path": "bios/QEMU/QEMU/slof.bin", "cores": [ "qemu" ] @@ -80856,7 +80856,7 @@ "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", "sha256": "6de4771f2f686482d387532115004cddaaa9d2bb39ef18d81e9629b11195c106", "size": 2527328, - "repo_path": "bios/QEMU/skiboot.lid", + "repo_path": "bios/QEMU/QEMU/skiboot.lid", "cores": [ "qemu" ] @@ -80866,7 +80866,7 @@ "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", "sha256": "8c88070f252075111468e7b2a8043209e7798c3fb136326227390ea50f168f13", "size": 3456, - "repo_path": "bios/QEMU/vof.bin", + "repo_path": "bios/QEMU/QEMU/vof.bin", "cores": [ "qemu" ] @@ -80876,7 +80876,7 @@ "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", "sha256": "cf97201f9403212ab75287bf209bfb7710cb5f253e8fe80723cf43760a9e8a12", "size": 16384, - "repo_path": "bios/QEMU/vof-nvram.bin", + "repo_path": "bios/QEMU/QEMU/vof-nvram.bin", "cores": [ "qemu" ] @@ -80886,7 +80886,7 @@ "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", "sha256": "f0250e391566bca7b5e643c43b761ab9629a0b82427792a772e80c8b97836425", "size": 421720, - "repo_path": "bios/QEMU/u-boot.e500", + "repo_path": "bios/QEMU/QEMU/u-boot.e500", "cores": [ "qemu" ], @@ -80897,7 +80897,7 @@ "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", "sha256": "be88ed96a6f50d5ba8ad7bf019f48e7f73acee95402d90d0dac3775d9c7a8d03", "size": 524288, - "repo_path": "bios/QEMU/u-boot-sam460-20100605.bin", + "repo_path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "cores": [ "qemu" ] @@ -80907,7 +80907,7 @@ "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", "sha256": "d8697354bde8a7ac9e6fe3a5fbca03698de623e95433a59c248e8e09b882c6b8", "size": 18752, - "repo_path": "bios/QEMU/qemu_vga.ndrv", + "repo_path": "bios/QEMU/QEMU/qemu_vga.ndrv", "cores": [ "qemu" ] @@ -80917,7 +80917,7 @@ "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", "sha256": "6ca2ed8f39e6e4fe3a88e84c0153836a8811cbb8c6a2019c33b63de372706733", "size": 382080, - "repo_path": "bios/QEMU/openbios-sparc32", + "repo_path": "bios/QEMU/QEMU/openbios-sparc32", "cores": [ "qemu" ], @@ -80928,7 +80928,7 @@ "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", "sha256": "9c976bc634115fee073e788b8812aed263213380e16fbee55ca04d4c3cb4def8", "size": 1593408, - "repo_path": "bios/QEMU/openbios-sparc64", + "repo_path": "bios/QEMU/QEMU/openbios-sparc64", "cores": [ "qemu" ], @@ -80939,7 +80939,7 @@ "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", "sha256": "92da99a770ab24f96c33c78382940cac8b25e88cb110634c1b32aa2d8cb852e7", "size": 1402, - "repo_path": "bios/QEMU/QEMU,tcx.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,tcx.bin", "cores": [ "qemu" ] @@ -80949,7 +80949,7 @@ "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", "sha256": "a99f3a06fdac5cf5d72bd0fd24647d897302c3ff8e918add65168185f8cbdf4d", "size": 850, - "repo_path": "bios/QEMU/QEMU,cgthree.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "cores": [ "qemu" ] @@ -80959,7 +80959,7 @@ "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", "sha256": "9f8da7264c7438fe4a24a2215e81893586f5cfafcd6e5fd0059fccc31a4e8839", "size": 153728, - "repo_path": "bios/QEMU/palcode-clipper", + "repo_path": "bios/QEMU/QEMU/palcode-clipper", "cores": [ "qemu" ], @@ -80970,7 +80970,7 @@ "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", "sha256": "1ebbd077b2b4c0f26dc0649124f8d5d56f925279dc6fc66c8adca9bb5f7855fc", "size": 268312, - "repo_path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -80980,7 +80980,7 @@ "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", "sha256": "f61451043f3ab1bb83eef32100678fde818508c682b97591a08a46683705a167", "size": 272504, - "repo_path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -80990,7 +80990,7 @@ "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", "sha256": "0985865e94e3a4f2a4db9c62a2cc2cf32075d4df8e7ddf641633e92840683b65", "size": 42608, - "repo_path": "bios/QEMU/s390-ccw.img", + "repo_path": "bios/QEMU/QEMU/s390-ccw.img", "cores": [ "qemu" ], @@ -81001,7 +81001,7 @@ "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", "sha256": "ef4ef1630a8111dfe132be467818f121537c7e86c94238273a2073b114ab256e", "size": 67232, - "repo_path": "bios/QEMU/s390-netboot.img", + "repo_path": "bios/QEMU/QEMU/s390-netboot.img", "cores": [ "qemu" ], @@ -81012,7 +81012,7 @@ "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", "sha256": "3dd2013c37f9468d3c905a2efd607bf317686e7a2aa7d139baee772b0f70b74c", "size": 167820, - "repo_path": "bios/QEMU/hppa-firmware.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware.img", "cores": [ "qemu" ], @@ -81023,7 +81023,7 @@ "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", "sha256": "a531f03a9f982a7e8811cdf3bc670f3c40d6d8b12c465f637247b16b18b851e0", "size": 206024, - "repo_path": "bios/QEMU/hppa-firmware64.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware64.img", "cores": [ "qemu" ], @@ -81034,7 +81034,7 @@ "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", "sha256": "1e643db3e209e801f30f4492fdbdafca3e8f251a7b8e12239249eb480f081003", "size": 768, - "repo_path": "bios/QEMU/npcm7xx_bootrom.bin", + "repo_path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "cores": [ "qemu" ] @@ -81044,7 +81044,7 @@ "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", "sha256": "36a49d253e2bd907a54ca5e61965438b65fac0cf152c9b11f83c0c965203f218", "size": 3211, - "repo_path": "bios/QEMU/bamboo.dtb", + "repo_path": "bios/QEMU/QEMU/bamboo.dtb", "cores": [ "qemu" ] @@ -81054,7 +81054,7 @@ "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", "sha256": "3e7ed2ed8637d8c8a1e619d8a280bc2da853e7a17eab689597c7b69770e503b0", "size": 9779, - "repo_path": "bios/QEMU/canyonlands.dtb", + "repo_path": "bios/QEMU/QEMU/canyonlands.dtb", "cores": [ "qemu" ] @@ -81064,7 +81064,7 @@ "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", "sha256": "37bda496b0b4216cce70626492b43d9aaf0d5fcdefcce45efa09d5c583770c69", "size": 9882, - "repo_path": "bios/QEMU/petalogix-ml605.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "cores": [ "qemu" ] @@ -81074,7 +81074,7 @@ "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", "sha256": "ef9f3112b7d9258cfad362dba8338ce9a8bdce59dec4d47c690b28fbefc841d7", "size": 8161, - "repo_path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "cores": [ "qemu" ] @@ -82865,7 +82865,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -82878,7 +82878,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -82891,7 +82891,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -82904,7 +82904,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -85219,7 +85219,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -85233,7 +85233,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -85247,7 +85247,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -112423,7 +112423,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -112433,7 +112433,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -112443,7 +112443,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -112453,7 +112453,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -112463,7 +112463,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -112473,7 +112473,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -112483,7 +112483,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -112493,7 +112493,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -115397,7 +115397,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ], @@ -115410,7 +115410,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ], @@ -115423,7 +115423,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -115436,7 +115436,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], diff --git a/install/retrobat.json b/install/retrobat.json index 8d6ba31f..52c3de4c 100644 --- a/install/retrobat.json +++ b/install/retrobat.json @@ -6,7 +6,7 @@ "platform": "retrobat", "display_name": "RetroBat", "version": "1.0", - "generated": "2026-10-23T07:14:35Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "bios", "detect": [ { @@ -8465,7 +8465,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "scummvm" @@ -8475,7 +8475,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -8487,7 +8487,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "scummvm" @@ -8497,7 +8497,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -18337,7 +18337,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox-pure-unleashed", @@ -18390,7 +18390,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -18460,7 +18460,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "dosbox-staging" ] @@ -18580,7 +18580,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -18614,7 +18614,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -39980,7 +39980,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -39993,7 +39993,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -43737,7 +43737,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -43748,7 +43748,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -43759,7 +43759,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -96537,7 +96537,7 @@ "sha1": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", "sha256": "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144", "size": 16384, - "repo_path": "bios/Oric/Oric/kernel.rom", + "repo_path": "bios/Tangerine/Oric/kernel.rom", "cores": [ "oricutron" ] @@ -96547,7 +96547,7 @@ "sha1": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", "sha256": "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8", "size": 16384, - "repo_path": "bios/Oric/Oric/shell.rom", + "repo_path": "bios/Tangerine/Oric/shell.rom", "cores": [ "oricutron" ] @@ -97227,7 +97227,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -97240,7 +97240,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], @@ -99160,7 +99160,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox-pure-unleashed", diff --git a/install/retrodeck.json b/install/retrodeck.json index a8a573d1..6fdc1351 100644 --- a/install/retrodeck.json +++ b/install/retrodeck.json @@ -6,7 +6,7 @@ "platform": "retrodeck", "display_name": "RetroDECK", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "", "detect": [ { @@ -42234,7 +42234,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -42246,7 +42246,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -113471,7 +113471,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -113481,7 +113481,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -113491,7 +113491,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -113501,7 +113501,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -113511,7 +113511,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -113521,7 +113521,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -113533,7 +113533,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -113545,7 +113545,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -113557,7 +113557,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -113567,7 +113567,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -115411,7 +115411,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -115424,7 +115424,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ], @@ -115437,7 +115437,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -115450,7 +115450,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ], @@ -117861,7 +117861,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -117875,7 +117875,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -117889,7 +117889,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -126836,7 +126836,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -126846,7 +126846,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -126856,7 +126856,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -126866,7 +126866,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -126876,7 +126876,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -126886,7 +126886,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -126896,7 +126896,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -126906,7 +126906,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -127081,7 +127081,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ], @@ -127094,7 +127094,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ], @@ -127107,7 +127107,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -127120,7 +127120,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], diff --git a/install/retropie.json b/install/retropie.json index de8d5884..5437f1e5 100644 --- a/install/retropie.json +++ b/install/retropie.json @@ -6,7 +6,7 @@ "platform": "retropie", "display_name": "RetroPie", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "BIOS", "detect": [ { @@ -6979,7 +6979,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -7004,7 +7004,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": null, "systems": [ "dos" @@ -7014,7 +7014,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox-pure-unleashed", @@ -7029,7 +7029,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": null, "systems": [ "dos" @@ -7054,7 +7054,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": null, "systems": [ "dos" @@ -7064,7 +7064,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox-pure-unleashed", @@ -17545,7 +17545,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "dosbox-staging" ], @@ -17636,7 +17636,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "dosbox-staging" ], @@ -17792,7 +17792,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -17833,7 +17833,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox-staging", "amiberry" @@ -83978,7 +83978,7 @@ "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", "sha256": "8244f3e5eaca828cc0a6a963f1fad15d68d8d3c0b5c80b8451b3067a85f14ae1", "size": 131072, - "repo_path": "bios/QEMU/bios.bin", + "repo_path": "bios/QEMU/QEMU/bios.bin", "cores": [ "qemu" ] @@ -83988,7 +83988,7 @@ "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", "sha256": "f1d4f396011197eb989029659cde250751cc711c336b8fbbe6f77cfe0dc5dcd8", "size": 262144, - "repo_path": "bios/QEMU/bios-256k.bin", + "repo_path": "bios/QEMU/QEMU/bios-256k.bin", "cores": [ "qemu" ] @@ -83998,7 +83998,7 @@ "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", "sha256": "42780e1ab9161752848475529a25c39d7c76baee82a1b2ddff666c2f7de7bbee", "size": 131072, - "repo_path": "bios/QEMU/bios-microvm.bin", + "repo_path": "bios/QEMU/QEMU/bios-microvm.bin", "cores": [ "qemu" ] @@ -84008,7 +84008,7 @@ "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", "sha256": "9b9dfc6c25740d6225625570d71cab6805cc9216e68c8932e343266daaeb8c4b", "size": 65536, - "repo_path": "bios/QEMU/qboot.rom", + "repo_path": "bios/QEMU/QEMU/qboot.rom", "cores": [ "qemu" ] @@ -84018,7 +84018,7 @@ "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", "sha256": "f0defab87465236d0d22b6000bd2c270e05a56ff3bb7fd209a56069caed86d57", "size": 38912, - "repo_path": "bios/QEMU/vgabios.bin", + "repo_path": "bios/QEMU/QEMU/vgabios.bin", "cores": [ "qemu" ] @@ -84028,7 +84028,7 @@ "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", "sha256": "305d3b15f67e65f1899a1664621f6b471e4345d33fd9eb4f6320b4559f6a04f2", "size": 38912, - "repo_path": "bios/QEMU/vgabios-cirrus.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "cores": [ "qemu" ] @@ -84038,7 +84038,7 @@ "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", "sha256": "651513519f9e0d5b99d3b051a8f5c68db69e987339b59a441d371068c34c146b", "size": 39424, - "repo_path": "bios/QEMU/vgabios-stdvga.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "cores": [ "qemu" ] @@ -84048,7 +84048,7 @@ "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", "sha256": "d5fd6992dfdf0c980996b79c5ea13b9c8b36342c1dc94fcd682a6c3e8df850ff", "size": 28672, - "repo_path": "bios/QEMU/vgabios-bochs-display.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "cores": [ "qemu" ] @@ -84058,7 +84058,7 @@ "sha1": "49df9be557f0f0277c8fedb889257e279586d536", "sha256": "31b26b2288ed5594b65a234e797ee7105d225d48086170b27ab518c3fb69b7de", "size": 28672, - "repo_path": "bios/QEMU/vgabios-ramfb.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "cores": [ "qemu" ] @@ -84068,7 +84068,7 @@ "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", "sha256": "9d4d1f32a7e059de82c09c19fc25e276a39d96a1a516605a32ba704596e10d8e", "size": 39424, - "repo_path": "bios/QEMU/vgabios-ati.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ati.bin", "cores": [ "qemu" ] @@ -84078,7 +84078,7 @@ "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", "sha256": "e81cc2807ebb9a1467b1933d192a4313424b499b73e7674257f07cd2171e01c7", "size": 39424, - "repo_path": "bios/QEMU/vgabios-qxl.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-qxl.bin", "cores": [ "qemu" ] @@ -84088,7 +84088,7 @@ "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", "sha256": "746f38c2023dbbc071503113f970bcf69d49c6e7c55fa8c0e3748dbccba42772", "size": 39424, - "repo_path": "bios/QEMU/vgabios-virtio.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-virtio.bin", "cores": [ "qemu" ] @@ -84098,7 +84098,7 @@ "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", "sha256": "c12841eb2b057b6d99bfbc7ab72bea896e2b5cd694c93b026d7510de2b68ca11", "size": 39424, - "repo_path": "bios/QEMU/vgabios-vmware.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-vmware.bin", "cores": [ "qemu" ] @@ -84108,7 +84108,7 @@ "sha1": "670c9cc79b4859944705eece710dc332188b79b4", "sha256": "cdf057a71b07e3b52b19cbe210bdefa59250d01a9810b960f7fe1f98eed95a27", "size": 9216, - "repo_path": "bios/QEMU/kvmvapic.bin", + "repo_path": "bios/QEMU/QEMU/kvmvapic.bin", "cores": [ "qemu" ] @@ -84118,7 +84118,7 @@ "sha1": "fd19bef7f5647960952520389f448364762ed948", "sha256": "1ecfb26c19da9dc00cdec0d0d738db69aeea4f1231c0c0ffc483ff69b3cda6ce", "size": 1024, - "repo_path": "bios/QEMU/linuxboot.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot.bin", "cores": [ "qemu" ] @@ -84128,7 +84128,7 @@ "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", "sha256": "9c49e255340c78fc12e54ed043462bca02fb7fca29b7cfab62ff88a5344b6950", "size": 1536, - "repo_path": "bios/QEMU/linuxboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot_dma.bin", "cores": [ "qemu" ] @@ -84138,7 +84138,7 @@ "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", "sha256": "13a3f9f119797b8776105f020f36572ce6a20fa2c60d3b8112818bfaefcdd348", "size": 1024, - "repo_path": "bios/QEMU/multiboot.bin", + "repo_path": "bios/QEMU/QEMU/multiboot.bin", "cores": [ "qemu" ] @@ -84148,7 +84148,7 @@ "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", "sha256": "e01667420ee78a318ea44627d2dd68058d3377d024e6eb7237700afe2e86507d", "size": 1024, - "repo_path": "bios/QEMU/multiboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/multiboot_dma.bin", "cores": [ "qemu" ] @@ -84158,7 +84158,7 @@ "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", "sha256": "918ff03a118615c2f4611a5df2d9496aabe099b5cfaaf69e544ebf973305d59d", "size": 1536, - "repo_path": "bios/QEMU/pvh.bin", + "repo_path": "bios/QEMU/QEMU/pvh.bin", "cores": [ "qemu" ] @@ -84168,7 +84168,7 @@ "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", "sha256": "981a728f95b7a01645645e9b753cfb764c9eb59266fa888ac58d7008fbb48c10", "size": 67072, - "repo_path": "bios/QEMU/pxe-e1000.rom", + "repo_path": "bios/QEMU/QEMU/pxe-e1000.rom", "cores": [ "qemu" ] @@ -84178,7 +84178,7 @@ "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", "sha256": "07b89a742e0f6d0e92dafe57b0f28c493436d0e1e07b7b77e728490c1f7b45dd", "size": 61440, - "repo_path": "bios/QEMU/pxe-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/pxe-eepro100.rom", "cores": [ "qemu" ] @@ -84188,7 +84188,7 @@ "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", "sha256": "bb9c0eaad36b9b4ce26c5f348bd05a832c8bf83ef38391db0ce9b51de8523ac7", "size": 61440, - "repo_path": "bios/QEMU/pxe-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "cores": [ "qemu" ] @@ -84198,7 +84198,7 @@ "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", "sha256": "92358396c05b3346c6bfd52bbf2a47978d0a8c6ddea932ee091a24faefbd489e", "size": 61440, - "repo_path": "bios/QEMU/pxe-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/pxe-pcnet.rom", "cores": [ "qemu" ] @@ -84208,7 +84208,7 @@ "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", "sha256": "d491351e37a50eb5a40e98a9f6b4d85010ee60fb9e64129d65ea10839287f138", "size": 61440, - "repo_path": "bios/QEMU/pxe-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "cores": [ "qemu" ] @@ -84218,7 +84218,7 @@ "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", "sha256": "6994337fe07783a6233072e33771dc4f58260edc3269debe677a5227b264bfdc", "size": 60416, - "repo_path": "bios/QEMU/pxe-virtio.rom", + "repo_path": "bios/QEMU/QEMU/pxe-virtio.rom", "cores": [ "qemu" ] @@ -84228,7 +84228,7 @@ "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", "sha256": "f37222fcdf0481bfbaf7a16d9aaf740aeb41d3d24c187801eb6e9a628cec0fc8", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000.rom", "cores": [ "qemu" ] @@ -84238,7 +84238,7 @@ "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", "sha256": "102c20348be2d0ebe45a77b076b31848182c2f7b4364775b6bc2ece6e97b4024", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000e.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000e.rom", "cores": [ "qemu" ] @@ -84248,7 +84248,7 @@ "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", "sha256": "2b5b55ba8afae7b5ef7116606babf60e6ceaa531c345d54542857cc3fbe3912e", "size": 159232, - "repo_path": "bios/QEMU/efi-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/efi-eepro100.rom", "cores": [ "qemu" ] @@ -84258,7 +84258,7 @@ "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", "sha256": "9925e0a34547118110479d8fc4e01092a0a73e0a236416e9ff862655b46751f7", "size": 157696, - "repo_path": "bios/QEMU/efi-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "cores": [ "qemu" ] @@ -84268,7 +84268,7 @@ "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", "sha256": "71c494fde94efa9871cf43868d7e3c8f4190e406d47a5102a2a21b36ded8a162", "size": 157696, - "repo_path": "bios/QEMU/efi-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/efi-pcnet.rom", "cores": [ "qemu" ] @@ -84278,7 +84278,7 @@ "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", "sha256": "4cdd69a7f5c6ce7aec3a3f20a034dc80e1d22aa37a739c364378952d997a32c7", "size": 160768, - "repo_path": "bios/QEMU/efi-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/efi-rtl8139.rom", "cores": [ "qemu" ] @@ -84288,7 +84288,7 @@ "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", "sha256": "26be36901db7f8181c306cc62bd74891d8646528965a78e40cceadba5dd7c8e7", "size": 160768, - "repo_path": "bios/QEMU/efi-virtio.rom", + "repo_path": "bios/QEMU/QEMU/efi-virtio.rom", "cores": [ "qemu" ] @@ -84298,7 +84298,7 @@ "sha1": "6557242402387a6319a0db6abb916ada48e1391c", "sha256": "33e833123ad9831df94b2d623a17f91e4c779e3cb799baa97058f5972676a32a", "size": 156672, - "repo_path": "bios/QEMU/efi-vmxnet3.rom", + "repo_path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "cores": [ "qemu" ] @@ -84308,7 +84308,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -84318,7 +84318,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -84328,7 +84328,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -84338,7 +84338,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -84348,7 +84348,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -84358,7 +84358,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -84370,7 +84370,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -84382,7 +84382,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -84394,7 +84394,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -84404,7 +84404,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -84414,7 +84414,7 @@ "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", "sha256": "f1d9bdb018e59ff65e39ce60cc0f9199af73d1770c34137ce423e04662cf96c8", "size": 677196, - "repo_path": "bios/QEMU/openbios-ppc", + "repo_path": "bios/QEMU/QEMU/openbios-ppc", "cores": [ "qemu" ], @@ -84425,7 +84425,7 @@ "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", "sha256": "9a9047e0d949097724dec83260f04fc1dd1e55af0b7debbcad3889ff7114ffb7", "size": 995000, - "repo_path": "bios/QEMU/slof.bin", + "repo_path": "bios/QEMU/QEMU/slof.bin", "cores": [ "qemu" ] @@ -84435,7 +84435,7 @@ "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", "sha256": "6de4771f2f686482d387532115004cddaaa9d2bb39ef18d81e9629b11195c106", "size": 2527328, - "repo_path": "bios/QEMU/skiboot.lid", + "repo_path": "bios/QEMU/QEMU/skiboot.lid", "cores": [ "qemu" ] @@ -84445,7 +84445,7 @@ "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", "sha256": "8c88070f252075111468e7b2a8043209e7798c3fb136326227390ea50f168f13", "size": 3456, - "repo_path": "bios/QEMU/vof.bin", + "repo_path": "bios/QEMU/QEMU/vof.bin", "cores": [ "qemu" ] @@ -84455,7 +84455,7 @@ "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", "sha256": "cf97201f9403212ab75287bf209bfb7710cb5f253e8fe80723cf43760a9e8a12", "size": 16384, - "repo_path": "bios/QEMU/vof-nvram.bin", + "repo_path": "bios/QEMU/QEMU/vof-nvram.bin", "cores": [ "qemu" ] @@ -84465,7 +84465,7 @@ "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", "sha256": "f0250e391566bca7b5e643c43b761ab9629a0b82427792a772e80c8b97836425", "size": 421720, - "repo_path": "bios/QEMU/u-boot.e500", + "repo_path": "bios/QEMU/QEMU/u-boot.e500", "cores": [ "qemu" ], @@ -84476,7 +84476,7 @@ "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", "sha256": "be88ed96a6f50d5ba8ad7bf019f48e7f73acee95402d90d0dac3775d9c7a8d03", "size": 524288, - "repo_path": "bios/QEMU/u-boot-sam460-20100605.bin", + "repo_path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "cores": [ "qemu" ] @@ -84486,7 +84486,7 @@ "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", "sha256": "d8697354bde8a7ac9e6fe3a5fbca03698de623e95433a59c248e8e09b882c6b8", "size": 18752, - "repo_path": "bios/QEMU/qemu_vga.ndrv", + "repo_path": "bios/QEMU/QEMU/qemu_vga.ndrv", "cores": [ "qemu" ] @@ -84496,7 +84496,7 @@ "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", "sha256": "6ca2ed8f39e6e4fe3a88e84c0153836a8811cbb8c6a2019c33b63de372706733", "size": 382080, - "repo_path": "bios/QEMU/openbios-sparc32", + "repo_path": "bios/QEMU/QEMU/openbios-sparc32", "cores": [ "qemu" ], @@ -84507,7 +84507,7 @@ "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", "sha256": "9c976bc634115fee073e788b8812aed263213380e16fbee55ca04d4c3cb4def8", "size": 1593408, - "repo_path": "bios/QEMU/openbios-sparc64", + "repo_path": "bios/QEMU/QEMU/openbios-sparc64", "cores": [ "qemu" ], @@ -84518,7 +84518,7 @@ "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", "sha256": "92da99a770ab24f96c33c78382940cac8b25e88cb110634c1b32aa2d8cb852e7", "size": 1402, - "repo_path": "bios/QEMU/QEMU,tcx.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,tcx.bin", "cores": [ "qemu" ] @@ -84528,7 +84528,7 @@ "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", "sha256": "a99f3a06fdac5cf5d72bd0fd24647d897302c3ff8e918add65168185f8cbdf4d", "size": 850, - "repo_path": "bios/QEMU/QEMU,cgthree.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "cores": [ "qemu" ] @@ -84538,7 +84538,7 @@ "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", "sha256": "9f8da7264c7438fe4a24a2215e81893586f5cfafcd6e5fd0059fccc31a4e8839", "size": 153728, - "repo_path": "bios/QEMU/palcode-clipper", + "repo_path": "bios/QEMU/QEMU/palcode-clipper", "cores": [ "qemu" ], @@ -84549,7 +84549,7 @@ "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", "sha256": "1ebbd077b2b4c0f26dc0649124f8d5d56f925279dc6fc66c8adca9bb5f7855fc", "size": 268312, - "repo_path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -84559,7 +84559,7 @@ "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", "sha256": "f61451043f3ab1bb83eef32100678fde818508c682b97591a08a46683705a167", "size": 272504, - "repo_path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -84569,7 +84569,7 @@ "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", "sha256": "0985865e94e3a4f2a4db9c62a2cc2cf32075d4df8e7ddf641633e92840683b65", "size": 42608, - "repo_path": "bios/QEMU/s390-ccw.img", + "repo_path": "bios/QEMU/QEMU/s390-ccw.img", "cores": [ "qemu" ], @@ -84580,7 +84580,7 @@ "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", "sha256": "ef4ef1630a8111dfe132be467818f121537c7e86c94238273a2073b114ab256e", "size": 67232, - "repo_path": "bios/QEMU/s390-netboot.img", + "repo_path": "bios/QEMU/QEMU/s390-netboot.img", "cores": [ "qemu" ], @@ -84591,7 +84591,7 @@ "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", "sha256": "3dd2013c37f9468d3c905a2efd607bf317686e7a2aa7d139baee772b0f70b74c", "size": 167820, - "repo_path": "bios/QEMU/hppa-firmware.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware.img", "cores": [ "qemu" ], @@ -84602,7 +84602,7 @@ "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", "sha256": "a531f03a9f982a7e8811cdf3bc670f3c40d6d8b12c465f637247b16b18b851e0", "size": 206024, - "repo_path": "bios/QEMU/hppa-firmware64.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware64.img", "cores": [ "qemu" ], @@ -84613,7 +84613,7 @@ "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", "sha256": "1e643db3e209e801f30f4492fdbdafca3e8f251a7b8e12239249eb480f081003", "size": 768, - "repo_path": "bios/QEMU/npcm7xx_bootrom.bin", + "repo_path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "cores": [ "qemu" ] @@ -84623,7 +84623,7 @@ "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", "sha256": "36a49d253e2bd907a54ca5e61965438b65fac0cf152c9b11f83c0c965203f218", "size": 3211, - "repo_path": "bios/QEMU/bamboo.dtb", + "repo_path": "bios/QEMU/QEMU/bamboo.dtb", "cores": [ "qemu" ] @@ -84633,7 +84633,7 @@ "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", "sha256": "3e7ed2ed8637d8c8a1e619d8a280bc2da853e7a17eab689597c7b69770e503b0", "size": 9779, - "repo_path": "bios/QEMU/canyonlands.dtb", + "repo_path": "bios/QEMU/QEMU/canyonlands.dtb", "cores": [ "qemu" ] @@ -84643,7 +84643,7 @@ "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", "sha256": "37bda496b0b4216cce70626492b43d9aaf0d5fcdefcce45efa09d5c583770c69", "size": 9882, - "repo_path": "bios/QEMU/petalogix-ml605.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "cores": [ "qemu" ] @@ -84653,7 +84653,7 @@ "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", "sha256": "ef9f3112b7d9258cfad362dba8338ce9a8bdce59dec4d47c690b28fbefc841d7", "size": 8161, - "repo_path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "cores": [ "qemu" ] @@ -87823,7 +87823,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ], @@ -87836,7 +87836,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ], @@ -89352,7 +89352,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -89366,7 +89366,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -89380,7 +89380,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -115001,7 +115001,7 @@ "sha1": "447975ed022379fb6b80a22fa37c2d188ca3aa88", "sha256": "257430f54fdc1c98bf0ddad97c6a609885b25130910c4ba370d6f51e3699b2d3", "size": 8192, - "repo_path": "bios/Oric/Oric/bd500.rom", + "repo_path": "bios/Tangerine/Oric/bd500.rom", "cores": [ "oricutron" ] @@ -115011,7 +115011,7 @@ "sha1": "746a2996967282281a980842a93642ad7d740f9e", "sha256": "d58cb6f47f808d8c890310d1c6a46e92df05971f5952bcb4f4cf88d1faf37eb6", "size": 512, - "repo_path": "bios/Oric/Oric/8dos2.rom", + "repo_path": "bios/Tangerine/Oric/8dos2.rom", "cores": [ "oricutron" ] @@ -115021,7 +115021,7 @@ "sha1": "01f7a84d5a1973623eabd2be6c2cbac1ce5096a6", "sha256": "62eaf60c3be8047599f3ef06874b86d479d9b74cf90efcd2d83f35db8c662144", "size": 16384, - "repo_path": "bios/Oric/Oric/kernel.rom", + "repo_path": "bios/Tangerine/Oric/kernel.rom", "cores": [ "oricutron" ] @@ -115031,7 +115031,7 @@ "sha1": "926b95e1cb574d4914dbed0681729a7c1a4bc68d", "sha256": "2f799c82479b64ca4fda7ed76bdc65bfb56596625061fba91933fed473fc9ae8", "size": 16384, - "repo_path": "bios/Oric/Oric/shell.rom", + "repo_path": "bios/Tangerine/Oric/shell.rom", "cores": [ "oricutron" ] @@ -116814,7 +116814,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -116824,7 +116824,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -116834,7 +116834,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -116844,7 +116844,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -116854,7 +116854,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -116864,7 +116864,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -116874,7 +116874,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -116884,7 +116884,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -120616,7 +120616,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ], @@ -120629,7 +120629,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ], @@ -120642,7 +120642,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ], @@ -120655,7 +120655,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ], @@ -120668,7 +120668,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm-sdl1" ], @@ -120681,7 +120681,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm-sdl1" ], @@ -120694,7 +120694,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm-sdl1" ], @@ -120707,7 +120707,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm-sdl1" ], diff --git a/install/rocknix.json b/install/rocknix.json index 4d313576..b780bb9b 100644 --- a/install/rocknix.json +++ b/install/rocknix.json @@ -6,7 +6,7 @@ "platform": "rocknix", "display_name": "ROCKNIX", "version": "1.0", - "generated": "2026-10-23T07:43:10Z", + "generated": "2026-10-23T12:47:02Z", "base_destination": "bios", "detect": [ { @@ -3799,7 +3799,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -3811,7 +3811,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "dosbox", "dosbox_core", @@ -49858,7 +49858,7 @@ "sha1": "f402170ee4f374c304a7ce0b139d6cecb1732aff", "sha256": "8244f3e5eaca828cc0a6a963f1fad15d68d8d3c0b5c80b8451b3067a85f14ae1", "size": 131072, - "repo_path": "bios/QEMU/bios.bin", + "repo_path": "bios/QEMU/QEMU/bios.bin", "cores": [ "qemu" ] @@ -49868,7 +49868,7 @@ "sha1": "5fe6078506094333106e6b3f33c7185dea7f0268", "sha256": "f1d4f396011197eb989029659cde250751cc711c336b8fbbe6f77cfe0dc5dcd8", "size": 262144, - "repo_path": "bios/QEMU/bios-256k.bin", + "repo_path": "bios/QEMU/QEMU/bios-256k.bin", "cores": [ "qemu" ] @@ -49878,7 +49878,7 @@ "sha1": "56f33ced7ea0f7581d776396a0ac6cfe2c7c9257", "sha256": "42780e1ab9161752848475529a25c39d7c76baee82a1b2ddff666c2f7de7bbee", "size": 131072, - "repo_path": "bios/QEMU/bios-microvm.bin", + "repo_path": "bios/QEMU/QEMU/bios-microvm.bin", "cores": [ "qemu" ] @@ -49888,7 +49888,7 @@ "sha1": "339d3a93c967491c9f1fffe963484386f48bd22c", "sha256": "9b9dfc6c25740d6225625570d71cab6805cc9216e68c8932e343266daaeb8c4b", "size": 65536, - "repo_path": "bios/QEMU/qboot.rom", + "repo_path": "bios/QEMU/QEMU/qboot.rom", "cores": [ "qemu" ] @@ -49898,7 +49898,7 @@ "sha1": "63d87e2a6618c3a9b2aabecf03ac2456e5e63410", "sha256": "f0defab87465236d0d22b6000bd2c270e05a56ff3bb7fd209a56069caed86d57", "size": 38912, - "repo_path": "bios/QEMU/vgabios.bin", + "repo_path": "bios/QEMU/QEMU/vgabios.bin", "cores": [ "qemu" ] @@ -49908,7 +49908,7 @@ "sha1": "883eb2657ce29661a0466b6b41ce75411f37aad9", "sha256": "305d3b15f67e65f1899a1664621f6b471e4345d33fd9eb4f6320b4559f6a04f2", "size": 38912, - "repo_path": "bios/QEMU/vgabios-cirrus.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-cirrus.bin", "cores": [ "qemu" ] @@ -49918,7 +49918,7 @@ "sha1": "87fbc0ecb1ee7d4d8c8c88c7d8a2fb3ec8f99ea5", "sha256": "651513519f9e0d5b99d3b051a8f5c68db69e987339b59a441d371068c34c146b", "size": 39424, - "repo_path": "bios/QEMU/vgabios-stdvga.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-stdvga.bin", "cores": [ "qemu" ] @@ -49928,7 +49928,7 @@ "sha1": "9e2edd3d835219cde63a20e2cd58107d7e96ef5b", "sha256": "d5fd6992dfdf0c980996b79c5ea13b9c8b36342c1dc94fcd682a6c3e8df850ff", "size": 28672, - "repo_path": "bios/QEMU/vgabios-bochs-display.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-bochs-display.bin", "cores": [ "qemu" ] @@ -49938,7 +49938,7 @@ "sha1": "49df9be557f0f0277c8fedb889257e279586d536", "sha256": "31b26b2288ed5594b65a234e797ee7105d225d48086170b27ab518c3fb69b7de", "size": 28672, - "repo_path": "bios/QEMU/vgabios-ramfb.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ramfb.bin", "cores": [ "qemu" ] @@ -49948,7 +49948,7 @@ "sha1": "ded141cacdebf557ec552597cbf57cd989cec3e2", "sha256": "9d4d1f32a7e059de82c09c19fc25e276a39d96a1a516605a32ba704596e10d8e", "size": 39424, - "repo_path": "bios/QEMU/vgabios-ati.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-ati.bin", "cores": [ "qemu" ] @@ -49958,7 +49958,7 @@ "sha1": "527227abd5f3348c382d4b02703389fbeb83b067", "sha256": "e81cc2807ebb9a1467b1933d192a4313424b499b73e7674257f07cd2171e01c7", "size": 39424, - "repo_path": "bios/QEMU/vgabios-qxl.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-qxl.bin", "cores": [ "qemu" ] @@ -49968,7 +49968,7 @@ "sha1": "cddc53b94793609d1e837d78cd5468fcc1ed9164", "sha256": "746f38c2023dbbc071503113f970bcf69d49c6e7c55fa8c0e3748dbccba42772", "size": 39424, - "repo_path": "bios/QEMU/vgabios-virtio.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-virtio.bin", "cores": [ "qemu" ] @@ -49978,7 +49978,7 @@ "sha1": "c54901ab8f526ab201ebf1b3ecdf711e38e6c259", "sha256": "c12841eb2b057b6d99bfbc7ab72bea896e2b5cd694c93b026d7510de2b68ca11", "size": 39424, - "repo_path": "bios/QEMU/vgabios-vmware.bin", + "repo_path": "bios/QEMU/QEMU/vgabios-vmware.bin", "cores": [ "qemu" ] @@ -49988,7 +49988,7 @@ "sha1": "670c9cc79b4859944705eece710dc332188b79b4", "sha256": "cdf057a71b07e3b52b19cbe210bdefa59250d01a9810b960f7fe1f98eed95a27", "size": 9216, - "repo_path": "bios/QEMU/kvmvapic.bin", + "repo_path": "bios/QEMU/QEMU/kvmvapic.bin", "cores": [ "qemu" ] @@ -49998,7 +49998,7 @@ "sha1": "fd19bef7f5647960952520389f448364762ed948", "sha256": "1ecfb26c19da9dc00cdec0d0d738db69aeea4f1231c0c0ffc483ff69b3cda6ce", "size": 1024, - "repo_path": "bios/QEMU/linuxboot.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot.bin", "cores": [ "qemu" ] @@ -50008,7 +50008,7 @@ "sha1": "0bff50c10727bd9c85c831ea92b7a52699959992", "sha256": "9c49e255340c78fc12e54ed043462bca02fb7fca29b7cfab62ff88a5344b6950", "size": 1536, - "repo_path": "bios/QEMU/linuxboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/linuxboot_dma.bin", "cores": [ "qemu" ] @@ -50018,7 +50018,7 @@ "sha1": "a8b58ae464fc6fb26799432ae867bf57c546ff80", "sha256": "13a3f9f119797b8776105f020f36572ce6a20fa2c60d3b8112818bfaefcdd348", "size": 1024, - "repo_path": "bios/QEMU/multiboot.bin", + "repo_path": "bios/QEMU/QEMU/multiboot.bin", "cores": [ "qemu" ] @@ -50028,7 +50028,7 @@ "sha1": "32ab1cf336b674bfb154eb7a939a3e3275a92647", "sha256": "e01667420ee78a318ea44627d2dd68058d3377d024e6eb7237700afe2e86507d", "size": 1024, - "repo_path": "bios/QEMU/multiboot_dma.bin", + "repo_path": "bios/QEMU/QEMU/multiboot_dma.bin", "cores": [ "qemu" ] @@ -50038,7 +50038,7 @@ "sha1": "c2191e6495103c1f43e9b6ca8930e44c2245e476", "sha256": "918ff03a118615c2f4611a5df2d9496aabe099b5cfaaf69e544ebf973305d59d", "size": 1536, - "repo_path": "bios/QEMU/pvh.bin", + "repo_path": "bios/QEMU/QEMU/pvh.bin", "cores": [ "qemu" ] @@ -50048,7 +50048,7 @@ "sha1": "368e8e9827ae8757a7449319831078b6d5efb83f", "sha256": "981a728f95b7a01645645e9b753cfb764c9eb59266fa888ac58d7008fbb48c10", "size": 67072, - "repo_path": "bios/QEMU/pxe-e1000.rom", + "repo_path": "bios/QEMU/QEMU/pxe-e1000.rom", "cores": [ "qemu" ] @@ -50058,7 +50058,7 @@ "sha1": "b19572c9c2a11f03282df81c0397aceed409a86c", "sha256": "07b89a742e0f6d0e92dafe57b0f28c493436d0e1e07b7b77e728490c1f7b45dd", "size": 61440, - "repo_path": "bios/QEMU/pxe-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/pxe-eepro100.rom", "cores": [ "qemu" ] @@ -50068,7 +50068,7 @@ "sha1": "f37f43f89dc99afe0442ee0b7a431ee790ad6bf6", "sha256": "bb9c0eaad36b9b4ce26c5f348bd05a832c8bf83ef38391db0ce9b51de8523ac7", "size": 61440, - "repo_path": "bios/QEMU/pxe-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/pxe-ne2k_pci.rom", "cores": [ "qemu" ] @@ -50078,7 +50078,7 @@ "sha1": "13a039bf9916f1db42d3a019591d372b4cf4aee9", "sha256": "92358396c05b3346c6bfd52bbf2a47978d0a8c6ddea932ee091a24faefbd489e", "size": 61440, - "repo_path": "bios/QEMU/pxe-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/pxe-pcnet.rom", "cores": [ "qemu" ] @@ -50088,7 +50088,7 @@ "sha1": "7b512c0a7a13bc3c254a25237e4d4612170f4391", "sha256": "d491351e37a50eb5a40e98a9f6b4d85010ee60fb9e64129d65ea10839287f138", "size": 61440, - "repo_path": "bios/QEMU/pxe-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/pxe-rtl8139.rom", "cores": [ "qemu" ] @@ -50098,7 +50098,7 @@ "sha1": "3e3f77cfe70af904133db94f27ec24e3c9c43648", "sha256": "6994337fe07783a6233072e33771dc4f58260edc3269debe677a5227b264bfdc", "size": 60416, - "repo_path": "bios/QEMU/pxe-virtio.rom", + "repo_path": "bios/QEMU/QEMU/pxe-virtio.rom", "cores": [ "qemu" ] @@ -50108,7 +50108,7 @@ "sha1": "a3df5fc33ab0190f470b34104ff3c0679cecbab6", "sha256": "f37222fcdf0481bfbaf7a16d9aaf740aeb41d3d24c187801eb6e9a628cec0fc8", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000.rom", "cores": [ "qemu" ] @@ -50118,7 +50118,7 @@ "sha1": "1d37f3ae6748d4deefe9fd5188a2f557bf265d61", "sha256": "102c20348be2d0ebe45a77b076b31848182c2f7b4364775b6bc2ece6e97b4024", "size": 159232, - "repo_path": "bios/QEMU/efi-e1000e.rom", + "repo_path": "bios/QEMU/QEMU/efi-e1000e.rom", "cores": [ "qemu" ] @@ -50128,7 +50128,7 @@ "sha1": "956d9592fea33374ef0f1900a185b6e1109ea765", "sha256": "2b5b55ba8afae7b5ef7116606babf60e6ceaa531c345d54542857cc3fbe3912e", "size": 159232, - "repo_path": "bios/QEMU/efi-eepro100.rom", + "repo_path": "bios/QEMU/QEMU/efi-eepro100.rom", "cores": [ "qemu" ] @@ -50138,7 +50138,7 @@ "sha1": "adb7199f545fdb66c325b142c8dbc4cddb99a20d", "sha256": "9925e0a34547118110479d8fc4e01092a0a73e0a236416e9ff862655b46751f7", "size": 157696, - "repo_path": "bios/QEMU/efi-ne2k_pci.rom", + "repo_path": "bios/QEMU/QEMU/efi-ne2k_pci.rom", "cores": [ "qemu" ] @@ -50148,7 +50148,7 @@ "sha1": "9e5a4bb247c6a1777c89117ca091f94342b9046d", "sha256": "71c494fde94efa9871cf43868d7e3c8f4190e406d47a5102a2a21b36ded8a162", "size": 157696, - "repo_path": "bios/QEMU/efi-pcnet.rom", + "repo_path": "bios/QEMU/QEMU/efi-pcnet.rom", "cores": [ "qemu" ] @@ -50158,7 +50158,7 @@ "sha1": "99a1e431cc0cb0a78d5803875dfa687e12a947f4", "sha256": "4cdd69a7f5c6ce7aec3a3f20a034dc80e1d22aa37a739c364378952d997a32c7", "size": 160768, - "repo_path": "bios/QEMU/efi-rtl8139.rom", + "repo_path": "bios/QEMU/QEMU/efi-rtl8139.rom", "cores": [ "qemu" ] @@ -50168,7 +50168,7 @@ "sha1": "1596e9b97f0bc8b5ff3e444235690a549ee982c6", "sha256": "26be36901db7f8181c306cc62bd74891d8646528965a78e40cceadba5dd7c8e7", "size": 160768, - "repo_path": "bios/QEMU/efi-virtio.rom", + "repo_path": "bios/QEMU/QEMU/efi-virtio.rom", "cores": [ "qemu" ] @@ -50178,7 +50178,7 @@ "sha1": "6557242402387a6319a0db6abb916ada48e1391c", "sha256": "33e833123ad9831df94b2d623a17f91e4c779e3cb799baa97058f5972676a32a", "size": 156672, - "repo_path": "bios/QEMU/efi-vmxnet3.rom", + "repo_path": "bios/QEMU/QEMU/efi-vmxnet3.rom", "cores": [ "qemu" ] @@ -50188,7 +50188,7 @@ "sha1": "eac1a94b8e0d7c53fd5df001c36794ec34c7c724", "sha256": "2df617a6fd1bae41ec7c0e3bceca96c928a5a88d8dc198468d34733393ab2792", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-code.fd", "cores": [ "qemu" ] @@ -50198,7 +50198,7 @@ "sha1": "617abe2746696bb4a309d72cecb446dc76a2a61e", "sha256": "54b5cf8601a787ad84e2d68ea979cabb111d20e3b635ad27376c4875e743db64", "size": 3653632, - "repo_path": "bios/QEMU/edk2-x86_64-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-x86_64-secure-code.fd", "cores": [ "qemu" ] @@ -50208,7 +50208,7 @@ "sha1": "45b8faebdfaaf19d16e3a7c5f60d69214685071c", "sha256": "69cebad2dac0fe52e3025836bdd09bf79d01741e4a79c680e0faa837c3fbb80f", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-code.fd", "cores": [ "qemu" ] @@ -50218,7 +50218,7 @@ "sha1": "6982abec8ef2ed7c8293163d5a0bd69a01a2126f", "sha256": "d95514ab60349ebc9355a761d4687f18e9787e66515593ea3bd98ea0131b0659", "size": 3653632, - "repo_path": "bios/QEMU/edk2-i386-secure-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-secure-code.fd", "cores": [ "qemu" ] @@ -50228,7 +50228,7 @@ "sha1": "b62e676c9317a32aaa9ee1d76268d8c55663bd6e", "sha256": "5d2ac383371b408398accee7ec27c8c09ea5b74a0de0ceea6513388b15be5d1e", "size": 540672, - "repo_path": "bios/QEMU/edk2-i386-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-i386-vars.fd", "cores": [ "qemu" ] @@ -50238,7 +50238,7 @@ "sha1": "514edbce58bfa877170673c1799351a7dab3b6df", "sha256": "c0c78f7443cce15bcc91a8b6966e759c8c5cf5c80ac0086d5d79b0455fc9ccb5", "size": 67108864, - "repo_path": "bios/QEMU/edk2-aarch64-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-aarch64-code.fd", "cores": [ "qemu" ], @@ -50250,7 +50250,7 @@ "sha1": "c20f01c28b59b388abb9d0febeec45d801a632f0", "sha256": "f9fcba7e85ab206efd88316c46ce9d7783c063abc9dd2b7b37df41cc8c0d2153", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-code.fd", "cores": [ "qemu" ], @@ -50262,7 +50262,7 @@ "sha1": "b051167e0e57bd13d77ed92ef7b474872f44ec6d", "sha256": "b3b855c5a80310168051164986855692d1bdb06e67619856177965cd87c6774f", "size": 67108864, - "repo_path": "bios/QEMU/edk2-arm-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-arm-vars.fd", "cores": [ "qemu" ], @@ -50274,7 +50274,7 @@ "sha1": "2c8633d881ece0c4794d740138a318f7e9af480c", "sha256": "8d74d1658106d4b748f2b56e1b689aad9977f7a485eb7a5654884b0b419c4ed9", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-code.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-code.fd", "cores": [ "qemu" ] @@ -50284,7 +50284,7 @@ "sha1": "c4e6cce4247ba8f32f528c1c69f49228f616677f", "sha256": "ea8094e953b1215444bd001ee1cf22818f1f7f8abcb158e62180cbaa6c1f70af", "size": 33554432, - "repo_path": "bios/QEMU/edk2-riscv-vars.fd", + "repo_path": "bios/QEMU/QEMU/edk2-riscv-vars.fd", "cores": [ "qemu" ] @@ -50294,7 +50294,7 @@ "sha1": "0ef5051dcb318c0bc45d1908f8318d6eece8686a", "sha256": "f1d9bdb018e59ff65e39ce60cc0f9199af73d1770c34137ce423e04662cf96c8", "size": 677196, - "repo_path": "bios/QEMU/openbios-ppc", + "repo_path": "bios/QEMU/QEMU/openbios-ppc", "cores": [ "qemu" ], @@ -50305,7 +50305,7 @@ "sha1": "a03a94acfe555804d66cc6c74760ae1375a71a64", "sha256": "9a9047e0d949097724dec83260f04fc1dd1e55af0b7debbcad3889ff7114ffb7", "size": 995000, - "repo_path": "bios/QEMU/slof.bin", + "repo_path": "bios/QEMU/QEMU/slof.bin", "cores": [ "qemu" ] @@ -50315,7 +50315,7 @@ "sha1": "8052069aa9714c23be05b4e62fb245a3d572cb0f", "sha256": "6de4771f2f686482d387532115004cddaaa9d2bb39ef18d81e9629b11195c106", "size": 2527328, - "repo_path": "bios/QEMU/skiboot.lid", + "repo_path": "bios/QEMU/QEMU/skiboot.lid", "cores": [ "qemu" ] @@ -50325,7 +50325,7 @@ "sha1": "fc737b34a390f5752cb7e35b33d71f4f438ab607", "sha256": "8c88070f252075111468e7b2a8043209e7798c3fb136326227390ea50f168f13", "size": 3456, - "repo_path": "bios/QEMU/vof.bin", + "repo_path": "bios/QEMU/QEMU/vof.bin", "cores": [ "qemu" ] @@ -50335,7 +50335,7 @@ "sha1": "5d1184609b87f78635f0575467a1c3f440900ff0", "sha256": "cf97201f9403212ab75287bf209bfb7710cb5f253e8fe80723cf43760a9e8a12", "size": 16384, - "repo_path": "bios/QEMU/vof-nvram.bin", + "repo_path": "bios/QEMU/QEMU/vof-nvram.bin", "cores": [ "qemu" ] @@ -50345,7 +50345,7 @@ "sha1": "9ea03f249f856cdcb4399cc1f5a5031729379911", "sha256": "f0250e391566bca7b5e643c43b761ab9629a0b82427792a772e80c8b97836425", "size": 421720, - "repo_path": "bios/QEMU/u-boot.e500", + "repo_path": "bios/QEMU/QEMU/u-boot.e500", "cores": [ "qemu" ], @@ -50356,7 +50356,7 @@ "sha1": "0399a79ac0cf77f0da70af9baec7548a3b368f0a", "sha256": "be88ed96a6f50d5ba8ad7bf019f48e7f73acee95402d90d0dac3775d9c7a8d03", "size": 524288, - "repo_path": "bios/QEMU/u-boot-sam460-20100605.bin", + "repo_path": "bios/QEMU/QEMU/u-boot-sam460-20100605.bin", "cores": [ "qemu" ] @@ -50366,7 +50366,7 @@ "sha1": "638c6262a6eb579ec3d1c9292566ac94c942dc15", "sha256": "d8697354bde8a7ac9e6fe3a5fbca03698de623e95433a59c248e8e09b882c6b8", "size": 18752, - "repo_path": "bios/QEMU/qemu_vga.ndrv", + "repo_path": "bios/QEMU/QEMU/qemu_vga.ndrv", "cores": [ "qemu" ] @@ -50376,7 +50376,7 @@ "sha1": "5a4f2124c8f093f8aee99fbcebcf5d17d789ff26", "sha256": "6ca2ed8f39e6e4fe3a88e84c0153836a8811cbb8c6a2019c33b63de372706733", "size": 382080, - "repo_path": "bios/QEMU/openbios-sparc32", + "repo_path": "bios/QEMU/QEMU/openbios-sparc32", "cores": [ "qemu" ], @@ -50387,7 +50387,7 @@ "sha1": "c6e215fe460629d35688ab8e51faf6f765827cd6", "sha256": "9c976bc634115fee073e788b8812aed263213380e16fbee55ca04d4c3cb4def8", "size": 1593408, - "repo_path": "bios/QEMU/openbios-sparc64", + "repo_path": "bios/QEMU/QEMU/openbios-sparc64", "cores": [ "qemu" ], @@ -50398,7 +50398,7 @@ "sha1": "5f1792a73ee47d78b2160191ecb2c92f353f93ad", "sha256": "92da99a770ab24f96c33c78382940cac8b25e88cb110634c1b32aa2d8cb852e7", "size": 1402, - "repo_path": "bios/QEMU/QEMU,tcx.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,tcx.bin", "cores": [ "qemu" ] @@ -50408,7 +50408,7 @@ "sha1": "619b86fb02faf8f682474be3f0653b58015008ba", "sha256": "a99f3a06fdac5cf5d72bd0fd24647d897302c3ff8e918add65168185f8cbdf4d", "size": 850, - "repo_path": "bios/QEMU/QEMU,cgthree.bin", + "repo_path": "bios/QEMU/QEMU/QEMU,cgthree.bin", "cores": [ "qemu" ] @@ -50418,7 +50418,7 @@ "sha1": "47b0870aaa45a7aa0d48847fd905908fb06f3e9f", "sha256": "9f8da7264c7438fe4a24a2215e81893586f5cfafcd6e5fd0059fccc31a4e8839", "size": 153728, - "repo_path": "bios/QEMU/palcode-clipper", + "repo_path": "bios/QEMU/QEMU/palcode-clipper", "cores": [ "qemu" ], @@ -50429,7 +50429,7 @@ "sha1": "7a23dfdeef3d78ffc89d86e89fc06a36f1e4386f", "sha256": "1ebbd077b2b4c0f26dc0649124f8d5d56f925279dc6fc66c8adca9bb5f7855fc", "size": 268312, - "repo_path": "bios/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv32-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -50439,7 +50439,7 @@ "sha1": "6883bfd1991c0ef0d67b0967e7dcbd60420dd480", "sha256": "f61451043f3ab1bb83eef32100678fde818508c682b97591a08a46683705a167", "size": 272504, - "repo_path": "bios/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", + "repo_path": "bios/QEMU/QEMU/opensbi-riscv64-generic-fw_dynamic.bin", "cores": [ "qemu" ] @@ -50449,7 +50449,7 @@ "sha1": "7b4fa888d32ca8ddbc752f7442e4d055cee1871a", "sha256": "0985865e94e3a4f2a4db9c62a2cc2cf32075d4df8e7ddf641633e92840683b65", "size": 42608, - "repo_path": "bios/QEMU/s390-ccw.img", + "repo_path": "bios/QEMU/QEMU/s390-ccw.img", "cores": [ "qemu" ], @@ -50460,7 +50460,7 @@ "sha1": "f6cec671408117bd9a31e982682662f27ef4fb2c", "sha256": "ef4ef1630a8111dfe132be467818f121537c7e86c94238273a2073b114ab256e", "size": 67232, - "repo_path": "bios/QEMU/s390-netboot.img", + "repo_path": "bios/QEMU/QEMU/s390-netboot.img", "cores": [ "qemu" ], @@ -50471,7 +50471,7 @@ "sha1": "605c36ede6c120c6cc7efe147a75a3dc4b7e4fb0", "sha256": "3dd2013c37f9468d3c905a2efd607bf317686e7a2aa7d139baee772b0f70b74c", "size": 167820, - "repo_path": "bios/QEMU/hppa-firmware.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware.img", "cores": [ "qemu" ], @@ -50482,7 +50482,7 @@ "sha1": "b42f6d4ca74073de6c038579b4a9323ad0a6b398", "sha256": "a531f03a9f982a7e8811cdf3bc670f3c40d6d8b12c465f637247b16b18b851e0", "size": 206024, - "repo_path": "bios/QEMU/hppa-firmware64.img", + "repo_path": "bios/QEMU/QEMU/hppa-firmware64.img", "cores": [ "qemu" ], @@ -50493,7 +50493,7 @@ "sha1": "22a75d26a0591d2c7763765b6381fa2f73de43e1", "sha256": "1e643db3e209e801f30f4492fdbdafca3e8f251a7b8e12239249eb480f081003", "size": 768, - "repo_path": "bios/QEMU/npcm7xx_bootrom.bin", + "repo_path": "bios/QEMU/QEMU/npcm7xx_bootrom.bin", "cores": [ "qemu" ] @@ -50503,7 +50503,7 @@ "sha1": "ebdf1745479f4ec88459bbd9ef16ee1114018508", "sha256": "36a49d253e2bd907a54ca5e61965438b65fac0cf152c9b11f83c0c965203f218", "size": 3211, - "repo_path": "bios/QEMU/bamboo.dtb", + "repo_path": "bios/QEMU/QEMU/bamboo.dtb", "cores": [ "qemu" ] @@ -50513,7 +50513,7 @@ "sha1": "8a2fda0b4f23a92eb44776b5d7ffe951987062da", "sha256": "3e7ed2ed8637d8c8a1e619d8a280bc2da853e7a17eab689597c7b69770e503b0", "size": 9779, - "repo_path": "bios/QEMU/canyonlands.dtb", + "repo_path": "bios/QEMU/QEMU/canyonlands.dtb", "cores": [ "qemu" ] @@ -50523,7 +50523,7 @@ "sha1": "892d265838866869b8a8ef104252ff5b2fda156f", "sha256": "37bda496b0b4216cce70626492b43d9aaf0d5fcdefcce45efa09d5c583770c69", "size": 9882, - "repo_path": "bios/QEMU/petalogix-ml605.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-ml605.dtb", "cores": [ "qemu" ] @@ -50533,7 +50533,7 @@ "sha1": "976600e3f89ecc1f3564b7077f53c58e0b565280", "sha256": "ef9f3112b7d9258cfad362dba8338ce9a8bdce59dec4d47c690b28fbefc841d7", "size": 8161, - "repo_path": "bios/QEMU/petalogix-s3adsp1800.dtb", + "repo_path": "bios/QEMU/QEMU/petalogix-s3adsp1800.dtb", "cores": [ "qemu" ] @@ -52594,7 +52594,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "amiberry" ] @@ -52604,7 +52604,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "amiberry" ] @@ -52614,7 +52614,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "amiberry" ] @@ -52624,7 +52624,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "amiberry" ] @@ -55066,7 +55066,7 @@ "sha1": "764ec667084bc237c1de6bd1db7541ad8cb59975", "sha256": "a66bc2ea040ec792308259ee96ba57b4c88de48fbce244714800b6b6340c730d", "size": 29270, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkong.zip", "cores": [ "fbalpha2012" ], @@ -55077,7 +55077,7 @@ "sha1": "2725373cc8e6e3c04bca4bf7bd0b027be6bec058", "sha256": "73b9e51295fe7412712ccf73c7010d92181aa12d420c40c1c6bc4f8b948e5a11", "size": 300220, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/dkongjr.zip", + "repo_path": "bios/Arcade/fba2012/samples/dkongjr.zip", "cores": [ "fbalpha2012" ], @@ -55088,7 +55088,7 @@ "sha1": "9e52cc30850cf9e1855fbd2e26f987cbc05b910a", "sha256": "a9e936f78c9db009fa9561ebb35dc374b343ba38037133ae30e95906ab0ac312", "size": 243090, - "repo_path": "bios/Arcade/FBAlpha 2012/samples/galaga.zip", + "repo_path": "bios/Arcade/fba2012/samples/galaga.zip", "cores": [ "fbalpha2012" ], @@ -76778,7 +76778,7 @@ "sha1": "2aa01b414a703880192277f9ce0dae193e9d2c8d", "sha256": "32a92bc476d476ad1befa6894edfddf5a7abe298fb02683e41f3b5f2ba5c9cd6", "size": 141072, - "repo_path": "bios/QEMU/u-boot.bin", + "repo_path": "bios/QEMU/QEMU/u-boot.bin", "cores": [ "qemu" ] @@ -76788,7 +76788,7 @@ "sha1": "358abab78f3bfba72b7b45cb5dd66ce4411e2618", "sha256": "2fb484617cc7273d971d55a5367cac91a8f86aa0de54e7e155837d09a0599bc7", "size": 298835, - "repo_path": "bios/QEMU/mips_bios.bin", + "repo_path": "bios/QEMU/QEMU/mips_bios.bin", "cores": [ "qemu" ] @@ -76798,7 +76798,7 @@ "sha1": "daa15fb1b8829da5c5bd473243acf19cd0f17a74", "sha256": "40232429030f906513bb5482c21d8b3f49626ab7808920382e065a2949caf99f", "size": 300324, - "repo_path": "bios/QEMU/mipsel_bios.bin", + "repo_path": "bios/QEMU/QEMU/mipsel_bios.bin", "cores": [ "qemu" ] @@ -76808,7 +76808,7 @@ "sha1": "8e99ed6157811282b7570f5f2e13b81a3913497e", "sha256": "fcdf6bb2cb7885a4a62f31fcb0d5e368bac7b6cea28f40c6dfa678af22fea20a", "size": 561168, - "repo_path": "bios/QEMU/bios_loongson3.bin", + "repo_path": "bios/QEMU/QEMU/bios_loongson3.bin", "cores": [ "qemu" ] @@ -76818,7 +76818,7 @@ "sha1": "41c43f4e8956169ab7602230a3a63934b26d65de", "sha256": "81576c8581e6765a73a8b5070dfb3758bcc3b0737461d481ec97ab5b67751771", "size": 442384, - "repo_path": "bios/QEMU/pmon_2e.bin", + "repo_path": "bios/QEMU/QEMU/pmon_2e.bin", "cores": [ "qemu" ] @@ -76828,7 +76828,7 @@ "sha1": "f2a9ce387019bf272c6e3459d961b30f28942ac5", "sha256": "05ad753fb594e656cf078023ec189e09e2a7655a780de993b75b8c51ed6b09ca", "size": 1048576, - "repo_path": "bios/QEMU/MacROM.bin", + "repo_path": "bios/QEMU/QEMU/MacROM.bin", "cores": [ "qemu" ] @@ -76838,7 +76838,7 @@ "sha1": "3df540b7517f27b3a76e31f193821d04e5805f89", "sha256": "93bb5d776bc5a7d609448a3fdb54f1c51653423a7baa5d9b6bcb7fa40b126f87", "size": 4194304, - "repo_path": "bios/QEMU/canon-a1100-rom1.bin", + "repo_path": "bios/QEMU/QEMU/canon-a1100-rom1.bin", "cores": [ "qemu" ] @@ -76848,7 +76848,7 @@ "sha1": "1dd1b6fd8cb47b055c729cbecda56fe1dc83d6c1", "sha256": "9d96ed4b0c1a3af09d9e0ac927f3d456c058eaf8c2fa4c167eac7437ee9a80df", "size": 11248, - "repo_path": "bios/QEMU/virtex-ml507.dtb", + "repo_path": "bios/QEMU/QEMU/virtex-ml507.dtb", "cores": [ "qemu" ] @@ -77074,7 +77074,7 @@ "sha1": "b083518fffb7f66b03c23b7eb4f868e62dc5a987", "sha256": "a73a06c23ed38370e58a11fb1b86f7ea4c547061a60d7aa62bae446235fd2dff", "size": 65536, - "repo_path": "bios/Roland/MT32_CONTROL.ROM", + "repo_path": "bios/Roland/MT-32/MT32_CONTROL.ROM", "cores": [ "scummvm" ] @@ -77084,7 +77084,7 @@ "sha1": "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", "sha256": "d9164063f293410cf33f2f64cdcea6893b44723fe41938e07ec9aef58b406238", "size": 524288, - "repo_path": "bios/Roland/MT32_PCM.ROM", + "repo_path": "bios/Roland/MT-32/MT32_PCM.ROM", "cores": [ "scummvm" ] @@ -77094,7 +77094,7 @@ "sha1": "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", "sha256": "08d68695e5bff6bbcbb751d6e4453db9f5ead0b5f41e86480798a04376dfe090", "size": 65536, - "repo_path": "bios/Roland/CM32L_CONTROL.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_CONTROL.ROM", "cores": [ "scummvm" ] @@ -77104,7 +77104,7 @@ "sha1": "289cc298ad532b702461bfc738009d9ebe8025ea", "sha256": "0dc50190bb7ea3fb212c970346b771a511772b528801e7eda6d27efda8c40698", "size": 1048576, - "repo_path": "bios/Roland/CM32L_PCM.ROM", + "repo_path": "bios/Roland/CM-32L/CM32L_PCM.ROM", "cores": [ "scummvm" ] diff --git a/scripts/common.py b/scripts/common.py index 9e19c27f..4b603ac4 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -1247,6 +1247,7 @@ def resolve_local_file( # When dest_hint contains a path, also try its basename as a name # (handles emulator profiles where name: is descriptive and path: is # the actual filename, e.g. name: "MDA font ROM", path: "mda.rom") + own_names = list(names_to_try) if dest_hint: hint_base = dest_hint.rsplit("/", 1)[-1] if "/" in dest_hint else dest_hint if hint_base and hint_base not in names_to_try: @@ -1491,12 +1492,19 @@ def resolve_local_file( if not has_strong_hash and not unsourceable: candidates = [] - for try_name in names_to_try: - for match_sha1 in by_name.get(try_name, []): - if match_sha1 in files_db and _size_ok(match_sha1): - path = files_db[match_sha1]["path"] - if os.path.exists(path) and path not in candidates: - candidates.append(path) + # The entry's own names first, the destination's basename only when + # none of them answers. melonDS Nightly's dsi_nand.bin is read at + # dsi/nand.bin: with the DSi image absent from the checkout, the + # basename let the Wii nand.bin outrank the entry's own DSi variant. + for tier in (own_names, names_to_try[len(own_names):]): + for try_name in tier: + for match_sha1 in by_name.get(try_name, []): + if match_sha1 in files_db and _size_ok(match_sha1): + path = files_db[match_sha1]["path"] + if os.path.exists(path) and path not in candidates: + candidates.append(path) + if candidates: + break if candidates and all("/.variants/" in p for p in candidates): # Only variants answer the exact casing, but the primary they # stand in for may be stored under another one: x1 asked for diff --git a/scripts/cross_reference.py b/scripts/cross_reference.py index d48d9199..7cf42561 100644 --- a/scripts/cross_reference.py +++ b/scripts/cross_reference.py @@ -53,6 +53,7 @@ from validation import ( outside_gap_scope, read_from_save_dir, unread_on, + with_archive_members, ) yaml = require_yaml() @@ -563,7 +564,12 @@ class FileConsumers: for dest, sha1 in members.items() ] else: - found = [self.sha1_of(entry, entry.get("path") or "", owner=name)] + # The archive members the profile reads decide between + # same-named copies, as in the emulator pack and verify. + found = [self.sha1_of( + with_archive_members(entry, files), entry.get("path") or "", + owner=name, + )] for sha1 in found: if sha1: self.emulators.setdefault(sha1, set()).add(name) diff --git a/scripts/generate_db.py b/scripts/generate_db.py index a62eb09e..8c1aeedf 100644 --- a/scripts/generate_db.py +++ b/scripts/generate_db.py @@ -414,7 +414,7 @@ def main() -> int: print(f" Preserved {preserved} large file entries from existing database") try: - platform_aliases = _collect_all_aliases(files) + platform_aliases = _collect_all_aliases(files, aliases) except UnreadableSource as exc: for source in exc.sources: print(f"Error: cannot read {source}", file=sys.stderr) @@ -492,10 +492,11 @@ class UnreadableSource(Exception): self.sources = sources -def _collect_all_aliases(files: dict) -> dict: +def _collect_all_aliases(files: dict, copies: dict | None = None) -> dict: """Collect alternate filenames from platform YAMLs, core-info, and known aliases. Registers alternate names so generate_pack can resolve files stored under different names. + ``copies`` maps a sha1 to the other files the scan found with that content. """ md5_to_sha1 = {} name_to_sha1 = {} @@ -504,6 +505,18 @@ def _collect_all_aliases(files: dict) -> dict: md5_to_sha1[entry["md5"]] = sha1 name_to_sha1[entry["name"]] = sha1 name_count[entry["name"]] = name_count.get(entry["name"], 0) + 1 + # The contents held under each name, every copy counted and not only the + # primary: which copy of identical bytes is primary follows path order. + # Keyed on primaries alone, project64's 64DD_IPL_v12_JPN.bin stopped + # naming its content once 64DD_IPL.bin sorted first, and its aliases + # 64dd_ipl_J.bin and 64DD_IPL_JP.n64 went with it. + holders: dict[str, set[str]] = {} + for sha1, entry in files.items(): + holders.setdefault(entry["name"], set()).add(sha1) + for sha1, copy_list in (copies or {}).items(): + if sha1 in files: + for copy in copy_list: + holders.setdefault(copy["name"], set()).add(sha1) aliases = {} @@ -598,11 +611,11 @@ def _collect_all_aliases(files: dict) -> dict: entry_aliases.insert(0, entry_name) if not entry_aliases: continue - if not matched and entry_name and name_count.get(entry_name) == 1: - # A name carried by several files names none of them: + if not matched and len(holders.get(entry_name, ())) == 1: + # A name carried by several contents names none of them: # quasi88's disk.rom aliases went to whichever # disk.rom the scan met last, a Tandy CoCo ROM. - matched = {name_to_sha1[entry_name]} + matched = set(holders[entry_name]) for sha in sorted(matched): for alias_name in entry_aliases: _add_alias(alias_name, sha) diff --git a/scripts/identity.py b/scripts/identity.py index 48246c59..745029f9 100644 --- a/scripts/identity.py +++ b/scripts/identity.py @@ -47,10 +47,6 @@ KNOWN_SHARED: dict[str, tuple[frozenset[str], str]] = { frozenset({"Magnavox", "Philips"}), "Odyssey 2 and Videopac are one machine sold under two names", ), - "0d2ef6e67322f48f4b7e08d8bbe68827e2074561": ( - frozenset({"Oric", "Tangerine"}), - "Oric Microdisc ROM, the Oric being a Tangerine machine", - ), "286b2e1fb21cc79851da01666db6c0b0e88f25e3": ( frozenset({"Infocom", "ZC"}), "one soundfont shipped by two interpreters", diff --git a/scripts/migrate.py b/scripts/migrate.py index b3a25780..ffa7248b 100644 --- a/scripts/migrate.py +++ b/scripts/migrate.py @@ -193,8 +193,8 @@ BIOS_FILE_MAP = { "psxonpsp660.bin": ("Sony", "PlayStation"), "PSXONPSP660.BIN": ("Sony", "PlayStation Portable"), "scummvm.zip": ("ScummVM", "ScummVM"), - "MT32_CONTROL.ROM": ("ScummVM", "ScummVM"), - "MT32_PCM.ROM": ("ScummVM", "ScummVM"), + "MT32_CONTROL.ROM": ("Roland", "MT-32"), + "MT32_PCM.ROM": ("Roland", "MT-32"), } PATH_PREFIX_MAP = { @@ -208,7 +208,7 @@ PATH_PREFIX_MAP = { "vice/": ("Commodore", "C128"), "bk/": ("Elektronika", "BK"), "dragon/": ("Dragon", "Dragon"), - "oricutron/": ("Oric", "Oric"), + "oricutron/": ("Tangerine", "Oric"), "trs80coco/": ("Tandy", "CoCo"), "ti994a/": ("Texas Instruments", "TI-99"), "gamecube/": ("Nintendo", "GameCube"), diff --git a/scripts/profile_sync.py b/scripts/profile_sync.py index 5e390a67..24681a3c 100644 --- a/scripts/profile_sync.py +++ b/scripts/profile_sync.py @@ -46,6 +46,8 @@ from sourceref import ( # noqa: F401 (re-exported for callers and tests) # no _PROSE_LIST_DELIMITERS, _REF_RE, _SPLIT_RE, + _BINARY_SUFFIXES, + _HEX_ADDRESS_RE, PROSE_CITE_RE, PROSE_CONT_RE, PROSE_CONT_SPACED_RE, @@ -58,6 +60,7 @@ from sourceref import ( # noqa: F401 (re-exported for callers and tests) # no _prose_external, _prose_runs, _trim_prose, + is_binary_citation, parse_source_ref, ref_prose_text, ref_role, @@ -195,33 +198,9 @@ def is_external_citation(path: str) -> bool: return "/" not in head and "." not in head -_BINARY_SUFFIXES = ( - ".dll", ".exe", ".so", ".dylib", ".apk", ".elf", ".o", ".a", ".jar", ".dex", -) -_HEX_ADDRESS_RE = re.compile(r"\b0x[0-9a-fA-F]{2,}") _VERSION_WORD_RE = re.compile(r"v?\d+(\.\d+)+[\w.-]*") -def is_binary_citation(path: str) -> bool: - """True when a ref locates code inside a shipped binary, not a source file. - - `BAM.dll 1.5-408 .text:0x100c3960-0x100c3a97`, `libmain.so LoadNES - 0x3bb49` and `.rdata dialog filter` were read by disassembly. No revision - of any repository holds those bytes, so the ref can neither anchor nor - break: 77 parts of `future-pinball-fploader` alone were reported GONE. - """ - if _HEX_ADDRESS_RE.search(path): - return True - if " " not in path: - # A bare `DesktopKinect.dll` names a shipped library, never a source - # file: no directory, no line, only its import table to read. - return "/" not in path and path.lower().endswith(_BINARY_SUFFIXES) - head = path.split(" ", 1)[0] - if head.lower().endswith(_BINARY_SUFFIXES): - return True - return head.startswith(".") and "/" not in head - - def strip_repo_word( path: str, known: frozenset[str] | set[str] = frozenset() ) -> str: @@ -1744,8 +1723,8 @@ def build_report( anything that is not a browser. Letting the first refusal abort the report leaves the mirror unread and the profile unverifiable, so the repository is muted for the rest of the pass instead. A quota signal - still stops everything, because continuing would only burn the rest of - the budget on the same wall. + still ends the profile, and upstream stops asking that host, because + continuing would only burn the rest of the budget on the same wall. """ # Keyed by host as well as slug: a mirror carries the same slug on # another forge, and muting one must not silence the other. @@ -3868,7 +3847,7 @@ def _attach_detection( Kept on the report rather than printed, so --json carries them as the text report does. A forge that refuses is named on the report: the ref report already muted it, and one refusal must not end a pass over every - profile. A quota signal still stops everything. + profile. A quota signal still ends the profile. """ if not report.head or not (args.detect_new_files or args.watch_hashes): return @@ -3969,7 +3948,7 @@ def _print_extras( The ref report mutes a forge that refuses, but the extras read the same forge again, so a refusal here is reported on the profile's own line instead of ending a pass over every profile. A quota signal still - stops everything. + ends the profile. """ _print_detection(report) if not (args.full_diff or args.tree_diff) or not report.head: @@ -4186,8 +4165,6 @@ def main() -> None: profile_path, args.cache_dir, args.offline, args.dry_run ): print(f"{name}: {line}") - except upstream.RateLimitError: - raise except upstream.UpstreamError as exc: print(f"{name}: {exc}", file=sys.stderr) failed.add(name) @@ -4200,47 +4177,21 @@ def main() -> None: reports = [] for name, profile in selected.items(): + profile_path = Path(args.emulators_dir) / f"{name}.yml" try: - profile_path = Path(args.emulators_dir) / f"{name}.yml" - report = build_report( - name, profile, args.cache_dir, args.offline, - profile_path.read_text(encoding="utf-8") - if profile_path.is_file() else None, - ) - except upstream.RateLimitError: - raise - except upstream.NotCachedError as exc: - # Offline with a cache that never stored this file: the profile - # is unverified, not wrong. Reporting GONE sent readers after - # files that exist. - report = ProfileReport( - name=name, entries=[], counts={}, skipped=f"offline: {exc}" - ) - except upstream.GoneError as exc: - # The forge is not coming back: a takedown, or a host that no - # longer resolves. Saying so once in the summary beats repeating - # it on stderr every pass, and it keeps the profile out of the - # backlog, where nobody can act on it anyway. - report = ProfileReport( - name=name, entries=[], counts={}, skipped=f"upstream gone: {exc}" - ) - except upstream.UpstreamError as exc: - # One unreachable forge must not abandon the other profiles. + report = _build_full_report(args, name, profile, profile_path, failed) + except upstream.RateLimitError as exc: + # A quota is one forge's: git.libretro.com answering 429 said + # nothing about the 600 profiles on GitHub. upstream stops asking + # that host, so the rest of the pass costs it nothing. print(f"{name}: {exc}", file=sys.stderr) report = ProfileReport( - name=name, entries=[], counts={}, skipped=f"upstream error: {exc}" + name=name, entries=[], counts={}, + skipped=f"rate limited: {exc.host or exc}", ) failed.add(name) - if not report.skipped and profile_path.is_file(): - report.stale_prose = _read_stale_prose(name, profile_path, args, failed) - if args.check_version and profile.get("version_source"): - report.declared_version = str(profile.get("core_version") or "") or None - report.page_version = page_version(profile, args.cache_dir, args.offline) - report.no_genuine_copy = str( - profile["version_source"].get("no_genuine_copy") or "") or None - if args.check_version: - _attach_version(args, profile, report) - _attach_detection(args, profile, report) + reports.append(report) + continue reports.append(report) if writes: try: @@ -4263,6 +4214,61 @@ def main() -> None: raise SystemExit(1) +def _build_full_report( + args: argparse.Namespace, + name: str, + profile: dict, + profile_path: Path, + failed: set[str], +) -> ProfileReport: + """The report of one profile, with every section the flags ask for. + + A rate limit propagates: the caller decides what one forge's quota + means for the pass. Any other forge failure becomes a skip. + """ + try: + report = build_report( + name, profile, args.cache_dir, args.offline, + profile_path.read_text(encoding="utf-8") + if profile_path.is_file() else None, + ) + except upstream.RateLimitError: + raise + except upstream.NotCachedError as exc: + # Offline with a cache that never stored this file: the profile + # is unverified, not wrong. Reporting GONE sent readers after + # files that exist. + report = ProfileReport( + name=name, entries=[], counts={}, skipped=f"offline: {exc}" + ) + except upstream.GoneError as exc: + # The forge is not coming back: a takedown, or a host that no + # longer resolves. Saying so once in the summary beats repeating + # it on stderr every pass, and it keeps the profile out of the + # backlog, where nobody can act on it anyway. + report = ProfileReport( + name=name, entries=[], counts={}, skipped=f"upstream gone: {exc}" + ) + except upstream.UpstreamError as exc: + # One unreachable forge must not abandon the other profiles. + print(f"{name}: {exc}", file=sys.stderr) + report = ProfileReport( + name=name, entries=[], counts={}, skipped=f"upstream error: {exc}" + ) + failed.add(name) + if not report.skipped and profile_path.is_file(): + report.stale_prose = _read_stale_prose(name, profile_path, args, failed) + if args.check_version and profile.get("version_source"): + report.declared_version = str(profile.get("core_version") or "") or None + report.page_version = page_version(profile, args.cache_dir, args.offline) + report.no_genuine_copy = str( + profile["version_source"].get("no_genuine_copy") or "") or None + if args.check_version: + _attach_version(args, profile, report) + _attach_detection(args, profile, report) + return report + + def _emit( args: argparse.Namespace, selected: dict, diff --git a/scripts/siterender.py b/scripts/siterender.py index 28fdc3e4..3607d3b8 100644 --- a/scripts/siterender.py +++ b/scripts/siterender.py @@ -150,8 +150,10 @@ _card_pages: dict[tuple[str, str, str], str] = {} def reset_console_pages() -> None: + """Forget where the system pages put consoles, cards and boards.""" _console_pages.clear() _card_pages.clear() + _board_sections.clear() def record_console_pages( @@ -190,7 +192,13 @@ def console_anchor(manufacturer: str, console: str) -> str: def console_href(slug: str, console: str, prefix: str = "") -> str: """Where a console's files are: its own page, or its section of the - manufacturer's page (also where a console cut into parts lists them).""" + manufacturer's page (also where a console cut into parts lists them). + An arcade board's section heads the page of its own name.""" + if slug == "arcade" and _board_sections: + board = _board_ids_by_name().get(console.casefold()) + if board in _board_sections: + anchor = board_slug(board) + return f"{prefix}systems/arcade-{urllib.parse.quote(anchor)}.md#{anchor}" stems = _console_pages.get((slug, console)) if stems and len(stems) == 1: return f"{prefix}systems/{urllib.parse.quote(stems[0])}.md" @@ -203,6 +211,10 @@ def card_page(path: str, sha1: str) -> str: parts = path.split("/") slug = parts[1].lower().replace(" ", "-") console = parts[2] if len(parts) > 2 else "" + if slug == "arcade" and _board_sections: + board = arcade_board(sha1) + if board in _board_sections: + return f"arcade-{board_slug(board)}" return _card_pages.get((slug, console, sha1), slug) @@ -225,12 +237,28 @@ def emulator_card_page(emulator: str, anchor: str) -> str: def system_section(sys_id: str) -> tuple[str, str] | None: """The console section a system id leads to, as (manufacturer slug, console): its own section, else the parent SYSTEM_PARENTS names, else - the one section whose heading reads system_name(). The folder a - system's files sit in is no answer by itself: Emerson's Arcadia 2001 - led to the Saturn and Sega's NAOMI to the Dreamcast. + the arcade board it names once record_board_section() wrote it + (``("arcade", )``, which console_href turns into + ``systems/arcade-.md#``), else the one section + whose heading reads system_name(). The folder a system's files sit in + is no answer by itself: Emerson's Arcadia 2001 led to the Saturn and + Sega's NAOMI to the Dreamcast. A heading under Arcade counts when it reads the name exactly (Namco System 246). One under Other never does, its headings name programs.""" + section = _section_without_boards(sys_id) + if (not _board_sections or sys_id in SYSTEM_PARENTS + or (section is not None and section[0] != "arcade")): + return section + board = _board_of_id(sys_id) + if board in _board_sections: + return "arcade", system_name(board) + return section + + +def _section_without_boards(sys_id: str) -> tuple[str, str] | None: + """system_section before arcade boards: what the folders and the + reviewed parents give.""" own = _own_section(sys_id) if own is not None: return _manufacturer_slug(own[0]), own[1] @@ -260,6 +288,236 @@ def _system_link(sys_id: str, prefix: str = "") -> str: return f"[{sys_id}]({console_href(slug, console, prefix)})" return sys_id + +# Arcade boards. A board is a system id that a profile entry with +# ``category: bios_zip`` names, through its ``system:``/``systems:`` or the +# profile's single system, whose archive the collection holds, and that has +# no section under a machine's maker. The archive is found by its name and, +# where the entry lists ``contents:``, kept only when it holds one of those +# CRC32s: maclc3.zip names a MAME set and an unrelated 189 MB file. The +# folder a copy sits in decides nothing. +_arcade_source: list[tuple[dict, dict] | None] = [None] +# sha1 -> the board id the archive is the BIOS of. +_archive_boards: dict[str, str] = {} +# Casefolded board name -> the board id that stands for it. +_board_names: dict[str, str] = {} +_boards_built = [False] + + +def set_arcade_boards(profiles: dict[str, dict], db: dict) -> None: + """Install the profiles and database the arcade boards are read from. + Without it they are read from the repository on first use.""" + _arcade_source[0] = (profiles, db) + _boards_built[0] = False + + +def _owner_ids(entry: dict, systems: list[str]) -> set[str]: + """The system ids a profile entry is declared for.""" + owners = {str(entry["system"])} if entry.get("system") else set() + owners.update(str(sys_id) for sys_id in entry.get("systems") or []) + if not owners and len(systems) == 1: + owners = set(systems) + return owners + + +# _board_role for an id whose archive is its machine's: a section under the +# machine's maker, or a reviewed parent outside Arcade. +_MACHINE = "\0machine" + + +def _board_role(sys_id: str) -> str | None: + """A board's name, _MACHINE for an id that names a machine with a + section of its own, None for an id that names neither (the generic + arcade id, an id with no name).""" + parent = SYSTEM_PARENTS.get(sys_id) + if parent is not None: + return None if parent[0] == "Arcade" else _MACHINE + section = _section_without_boards(sys_id) + if section is not None and section[0] != "arcade": + return _MACHINE + try: + return system_name(sys_id) + except KeyError: + return None + + +def _in_arcade(sha1: str, db: dict) -> bool: + """Whether a copy of the content sits under bios/Arcade/.""" + entry = db.get("files", {}).get(sha1) or {} + if str(entry.get("path", "")).startswith("bios/Arcade/"): + return True + return sha1 in _arcade_suffix_sha1s(db) + + +_suffix_cache: list[tuple[int, frozenset[str]] | None] = [None] + + +def _arcade_suffix_sha1s(db: dict) -> frozenset[str]: + cached = _suffix_cache[0] + if cached is not None and cached[0] == id(db): + return cached[1] + found = frozenset( + sha1s[0] + for tail, sha1s in db.get("indexes", {}).get("by_path_suffix", {}).items() + if tail.startswith("Arcade/") and len(sha1s) == 1 + ) + _suffix_cache[0] = (id(db), found) + return found + + +def _build_boards() -> None: + if _boards_built[0]: + return + from ziptools import zip_member_crcs + + _ensure_console_sections() + if _arcade_source[0] is None: + import json + + from common import load_emulator_profiles + + database = _REPO_ROOT / "database.json" + if not database.exists(): + _archive_boards.clear() + _board_names.clear() + _boards_built[0] = True + return + with open(database, encoding="utf-8") as handle: + db = json.load(handle) + profiles = load_emulator_profiles(str(_REPO_ROOT / "emulators"), skip_aliases=False) + _arcade_source[0] = (profiles, db) + profiles, db = _arcade_source[0] + files = db.get("files", {}) + by_name = db.get("indexes", {}).get("by_name", {}) + + # sha1 -> board name -> the profiles naming it. None: a machine's own. + votes: dict[str, dict[str, set[str]] | None] = {} + ids_by_name: dict[str, set[str]] = {} + for key in sorted(profiles): + profile = profiles[key] + if profile.get("type") == "test": + continue + systems = [str(sys_id) for sys_id in profile.get("systems") or []] + for entry in profile.get("files") or []: + if not isinstance(entry, dict) or entry.get("category") != "bios_zip": + continue + owners = _owner_ids(entry, systems) + if not owners: + continue + crcs = { + str(member["crc32"]).lower() + for member in entry.get("contents") or [] + if isinstance(member, dict) and member.get("crc32") + } + names = {str(entry.get("name", ""))} + names.update(str(alias) for alias in entry.get("aliases") or []) + archives: set[str] = set() + for name in names: + found = by_name.get(name.rsplit("/", 1)[-1]) or [] + for sha1 in [found] if isinstance(found, str) else found: + if sha1 not in files: + continue + if crcs: + held = zip_member_crcs(str(_REPO_ROOT / files[sha1]["path"])) + # An archive the build cannot read keeps its name. + if held and not held & crcs: + continue + archives.add(sha1) + for owner in owners: + role = _board_role(owner) + if role == _MACHINE: + for sha1 in archives: + votes[sha1] = None + continue + if role is None: + continue + ids_by_name.setdefault(role.casefold(), set()).add(owner) + for sha1 in archives: + ballot = votes.setdefault(sha1, {}) + if ballot is not None: + ballot.setdefault(role.casefold(), set()).add(key) + + _archive_boards.clear() + _board_names.clear() + for sha1, ballot in votes.items(): + if not ballot: + continue + ranked = sorted(ballot.items(), key=lambda item: (-len(item[1]), item[0])) + # Two boards named as often: a device ROM several boards share. + if len(ranked) > 1 and len(ranked[0][1]) == len(ranked[1][1]): + continue + name = ranked[0][0] + board = sorted(ids_by_name[name])[0] + _archive_boards[sha1] = board + if _in_arcade(sha1, db): + _board_names[name] = board + # A board none of whose archives sits under Arcade has no section there. + for sha1, board in list(_archive_boards.items()): + if system_name(board).casefold() not in _board_names: + del _archive_boards[sha1] + _boards_built[0] = True + + +def _board_ids_by_name() -> dict[str, str]: + _build_boards() + return _board_names + + +def _board_of_id(sys_id: str) -> str | None: + """The board an id names, by its display name: naomi2 and sega-naomi2 + are one board.""" + try: + name = system_name(sys_id) + except KeyError: + return None + return _board_ids_by_name().get(name.casefold()) + + +def arcade_board(sha1: str) -> str | None: + """The system id an arcade archive is the BIOS of, or None. + + Read from the profiles' ``system``/``systems`` and ``contents:``, + never from the folder. An archive several boards share as often (a + device ROM), or one a machine with its own section names (neogeo.zip + for the Neo Geo, cd32.zip for the CD32), has no board. Every id of a + board's name returns the same id, the first in sort order.""" + _build_boards() + return _archive_boards.get(str(sha1)) + + +def board_slug(sys_id: str) -> str: + """The slug of a board's section: its page is systems/arcade-/ + and its heading's id is . Read from the board's display name, + so every id of one board gives one slug.""" + from sitestarlight import toc_slug + + return toc_slug(system_name(str(sys_id))) + + +# Boards whose section the system pages wrote. A link waits for its +# section: before the Arcade pages were grouped by board, 8,606 links on +# 141 pages led to pages nobody wrote and the build stopped. +_board_sections: set[str] = set() + + +def record_board_section(board: str) -> None: + """Mark a board's section as written, at systems/arcade-/ + under the heading . From then on system_section() leads + every id of the board there, and card_page() sends its Arcade cards + there. The system pages call it for each board they give a section, + before any other page links one.""" + canonical = _board_of_id(str(board)) + if canonical is None: + raise KeyError(f"{board!r} is not an arcade board") + _board_sections.add(canonical) + + +def arcade_boards() -> dict[str, str]: + """Every board, by board id -> display name.""" + _build_boards() + return {board: system_name(board) for board in sorted(set(_board_names.values()))} + + def _field_text(key: object, value: object) -> str: """A scalar of a structured block. A source reference reads as code.""" if isinstance(value, bool): @@ -435,6 +693,8 @@ def set_console_sections( _program_names.clear() _program_names.update(name.casefold() for name in programs) _sections_installed[0] = True + # Which ids are boards depends on which have a section elsewhere. + _boards_built[0] = False _sections_installed = [False] @@ -586,7 +846,6 @@ SYSTEM_NAMES: dict[str, str] = { "ces-galaxy-games": "CES Galaxy Games", "cgenie": "EACA Colour Genie", "chex": "Chex Quest", - "chihiro": "Sega Chihiro", "chip8": "CHIP-8", "coco3": "Tandy Color Computer 3", "commanderx16": "Commander X16", @@ -760,7 +1019,6 @@ SYSTEM_NAMES: dict[str, str] = { "onscripter": "ONScripter visual novels", "openbor": "OpenBOR games", "opengoal": "Jak and Daxter", - "oric": "Tangerine Oric", "oricatmos": "Oric Atmos", "outlaws": "Outlaws", "palm-os": "Palm OS", @@ -923,8 +1181,10 @@ SYSTEM_NAMES: dict[str, str] = { "zn1-acclaim": "Acclaim ZN-1", "zn1-atlus": "Atlus ZN-1", "zn1-capcom": "Capcom ZN-1", - "zn1-taito": "Taito ZN-1", - "zn1-tecmo": "Tecmo ZN-1", + # mame2003 files taitofx1.zip and tps.zip under these ids, its notes + # name the boards: the Taito FX-1 and the Tecmo TPS, both ZN-1 based. + "zn1-taito": "Taito FX-1", + "zn1-tecmo": "Tecmo TPS", "zn1-video-system": "Video System ZN-1", "zn2-capcom": "Capcom ZN-2", "zx-spectrum-128": "Sinclair ZX Spectrum 128", @@ -1010,7 +1270,8 @@ SYSTEM_PARENTS: dict[str, tuple[str, str]] = { "marty": ("Fujitsu", "FM Towns"), "mz700": ("Sharp", "MZ"), "mz80k": ("Sharp", "MZ"), - "oricatmos": ("Oric", "Oric"), + "mz800": ("Sharp", "MZ"), + "oricatmos": ("Tangerine", "Oric"), "palm-os": ("Palm", "Palm"), "philips-vg5k": ("Philips", "VG5000"), "vg5k": ("Philips", "VG5000"), @@ -1034,6 +1295,22 @@ SYSTEM_PARENTS: dict[str, tuple[str, str]] = { "mohaa-spearhead": ("Electronic Arts", "Medal of Honor Allied Assault"), "ur-quan-masters": ("Toys for Bob", "The Ur-Quan Masters"), "star-control-2": ("Toys for Bob", "The Ur-Quan Masters"), + # Systems whose files sit in the folder of the program that reads them, + # the only section listing them. DOS and ScummVM also read the Roland + # MT-32 ROMs, which their own sections do not hold. + "bbc-master-128": ("Other", "beebem"), + "bbc-master-et": ("Other", "beebem"), + "cave-story": ("Other", "NXEngine"), + "dos": ("DOS", "DOSBox"), + "scummvm": ("Other", "ScummVM"), + "sinclair-zx-spectrum-next": ("Other", "cspect"), + "solarus": ("Game Engines", "Solarus"), + "sunplus-spmp8000": ("Other", "spmp8000emu"), + "tomb-raider-1": ("Game Engines", "TRX"), + "tyrian": ("Other", "opentyrian"), + "vm-labs-nuon": ("Other", "nuance"), + "xrick": ("Other", "xrick"), + "zc210": ("ZC", "ZC210"), # The collection's general arcade section, where naomi.zip, neogeo.zip # and the other board sets sit. "arcade": ("Arcade", "Arcade"), diff --git a/scripts/sitesources.py b/scripts/sitesources.py index adac7dc2..85cee28c 100644 --- a/scripts/sitesources.py +++ b/scripts/sitesources.py @@ -14,7 +14,9 @@ import urllib.request import upstream from siterender import _by_mode -from sourceref import _prose_runs, ref_role, source_ref_values, split_source_ref +from sourceref import ( + _prose_runs, is_binary_citation, ref_role, source_ref_values, split_source_ref, +) def _repo_pins(profile: dict, field: str, label: str) -> list[tuple[str, str, str]]: @@ -309,7 +311,10 @@ def _source_ref_markdown(profile: dict, value: str | dict | None) -> str: # broke 470 links. Two repositories and no tree to read: no link. selected: tuple[upstream.Repo, str] | None = None real_path = part.path - if path_re.fullmatch(part.path): + # A shipped binary (`DesktopKinect.dll`, `0x10037130-0x100371de` + # continuing a BAM.dll range) is no path of either repository: + # without a cached tree the single declared one took it. + if path_re.fullmatch(part.path) and not is_binary_citation(part.path): if current_role: # Only the repository the part names, or no link at all. selected = by_role.get(current_role) diff --git a/scripts/sourceref.py b/scripts/sourceref.py index 9ec48688..33589874 100644 --- a/scripts/sourceref.py +++ b/scripts/sourceref.py @@ -25,6 +25,32 @@ _LOCATED_RE = re.compile(r"^[^\s:]+:\d+(?:-\d+)?$") REPO_ROLES = ("source", "upstream") +_BINARY_SUFFIXES = ( + ".dll", ".exe", ".so", ".dylib", ".apk", ".elf", ".o", ".a", ".jar", ".dex", +) +_HEX_ADDRESS_RE = re.compile(r"\b0x[0-9a-fA-F]{2,}") + + +def is_binary_citation(path: str) -> bool: + """True when a ref locates code inside a shipped binary, not a source file. + + `BAM.dll 1.5-408 .text:0x100c3960-0x100c3a97`, `libmain.so LoadNES + 0x3bb49` and `.rdata dialog filter` were read by disassembly. No revision + of any repository holds those bytes, so the ref can neither anchor nor + break: 77 parts of `future-pinball-fploader` alone were reported GONE. + """ + if _HEX_ADDRESS_RE.search(path): + return True + if " " not in path: + # A bare `DesktopKinect.dll` names a shipped library, never a source + # file: no directory, no line, only its import table to read. + return "/" not in path and path.lower().endswith(_BINARY_SUFFIXES) + head = path.split(" ", 1)[0] + if head.lower().endswith(_BINARY_SUFFIXES): + return True + return head.startswith(".") and "/" not in head + + def ref_role(path: str) -> tuple[str, str]: """The role word a cited path opens with, and the path without it.""" word, _, rest = path.partition(" ") diff --git a/scripts/upstream.py b/scripts/upstream.py index 69fdae40..487c9e3c 100644 --- a/scripts/upstream.py +++ b/scripts/upstream.py @@ -30,6 +30,10 @@ ABSENT = "\0absent\0" GITHUB_COMPARE_CAP = 300 RETRIES = 3 RETRY_BACKOFF = (0.5, 2.0) +# A 429 is waited out, as base_scraper does: git.libretro.com answers it +# a few hundred requests into a pass and serves again a minute later. +RATE_LIMIT_WAITS = (5.0, 20.0, 60.0) +RATE_LIMIT_WAIT_CAP = 120.0 GITHUB_HOSTS = frozenset( {"github.com", "api.github.com", "raw.githubusercontent.com"} ) @@ -85,6 +89,9 @@ _HOSTS: dict[str, tuple[str, str, str]] = { _sleep = time.sleep +# Hosts still refusing after every wait. Asking them again in the same pass +# only spends the waits again, while the other forges keep answering. +_exhausted_hosts: set[str] = set() class UpstreamError(Exception): @@ -94,6 +101,10 @@ class UpstreamError(Exception): class RateLimitError(UpstreamError): """The forge refused the request for quota reasons.""" + def __init__(self, message: str, host: str = "") -> None: + super().__init__(message) + self.host = host + class NotCachedError(UpstreamError): """An offline read of something the cache never stored. @@ -232,15 +243,16 @@ def _http_failure(url: str, exc: urllib.error.HTTPError) -> UpstreamError: GitHub reports exhaustion with X-RateLimit-Remaining: 0, and 429 is the standard quota status everywhere, so those two are the only fatal cases. """ + host = urllib.parse.urlsplit(url).hostname or "" if exc.code == 429: - return RateLimitError(f"{url}: HTTP 429") + return RateLimitError(f"{url}: HTTP 429", host) if exc.code in (410, 451): reason = "withdrawn for legal reasons" if exc.code == 451 else "gone" return GoneError(f"{url}: HTTP {exc.code}, {reason}") if exc.code == 403 and exc.headers is not None: remaining = exc.headers.get("X-RateLimit-Remaining") if remaining is not None and remaining.strip() == "0": - return RateLimitError(f"{url}: HTTP 403, quota exhausted") + return RateLimitError(f"{url}: HTTP 403, quota exhausted", host) return UpstreamError(f"{url}: HTTP {exc.code}") @@ -278,15 +290,37 @@ def _resolver_answers() -> bool: return True +def _rate_limit_wait(exc: urllib.error.HTTPError, waited: int) -> float | None: + """Seconds to wait before asking again, or None when waiting is futile. + + GitHub's exhausted quota (403) resets on the hour. A 429 names its wait + in Retry-After, which is followed up to a cap, else the fixed steps. + """ + if exc.code != 429 or waited >= len(RATE_LIMIT_WAITS): + return None + retry_after = (exc.headers.get("Retry-After") or "").strip() if exc.headers else "" + if retry_after.isdigit(): + delay = float(retry_after) + return delay if delay <= RATE_LIMIT_WAIT_CAP else None + return RATE_LIMIT_WAITS[waited] + + def _fetch(url: str, accept_json: bool = False) -> bytes | None: """Body of a GET, or None on 404. A pass over every profile issues thousands of requests, so a dropped connection or a transient 5xx is a certainty rather than an accident. - Those are retried, a definitive answer from the forge is not. + Those are retried, a definitive answer from the forge is not. A rate + limit is waited out, and a host that outlasts the waits is not asked + again in this process. """ + host = urllib.parse.urlsplit(url).hostname or "" + if host in _exhausted_hosts: + raise RateLimitError(f"{url}: {host} rate limited earlier in this run", host) failure: UpstreamError | None = None - for attempt in range(RETRIES): + attempt = 0 + waited = 0 + while True: req = urllib.request.Request(url, headers=_headers(url, accept_json)) try: with urllib.request.urlopen(req, timeout=30) as resp: @@ -295,15 +329,24 @@ def _fetch(url: str, accept_json: bool = False) -> bytes | None: if exc.code == 404: return None failure = _http_failure(url, exc) - if isinstance(failure, RateLimitError) or exc.code < 500: + if isinstance(failure, RateLimitError): + delay = _rate_limit_wait(exc, waited) + if delay is None: + _exhausted_hosts.add(host) + raise failure from exc + waited += 1 + _sleep(delay) + continue + if exc.code < 500: raise failure from exc except (urllib.error.URLError, http.client.HTTPException, OSError) as exc: if _host_is_unresolvable(exc): raise GoneError(f"{url}: host does not resolve") from exc failure = UpstreamError(f"{url}: {exc}") - if attempt + 1 < RETRIES: - _sleep(RETRY_BACKOFF[attempt]) - raise failure + attempt += 1 + if attempt >= RETRIES: + raise failure + _sleep(RETRY_BACKOFF[attempt - 1]) def _http_text(url: str) -> str | None: @@ -780,12 +823,28 @@ def list_tree( payload = _api(url, cache_dir, offline) if not isinstance(payload, dict): return [], True + entries = list(payload.get("tree") or []) + truncated = bool(payload.get("truncated")) + # Forgejo pages a recursive tree, 1000 entries at a time, and says how + # many there are: mirrors/Ryujinx holds 4704, and read as one page every + # citation past the first thousand was unverifiable. GitHub reports no + # count, its truncation is final. + total = payload.get("total_count") + if truncated and repo.family == "forgejo" and isinstance(total, int): + for page in range(2, MAX_TREE_PAGES + 1): + if len(entries) >= total: + break + more = _api(f"{url}&page={page}", cache_dir, offline) + if not isinstance(more, dict) or not more.get("tree"): + break + entries.extend(more["tree"]) + truncated = len(entries) < total paths = [ entry["path"] - for entry in payload.get("tree") or [] + for entry in entries if isinstance(entry, dict) and entry.get("type") == "blob" and entry.get("path") ] - return paths, bool(payload.get("truncated")) + return paths, truncated def list_gitlinks( diff --git a/tests/test_bios_layout.py b/tests/test_bios_layout.py new file mode 100644 index 00000000..e447e43b --- /dev/null +++ b/tests/test_bios_layout.py @@ -0,0 +1,60 @@ +"""bios/ is laid out maker, then machine, then files. + +QEMU kept 79 files and Roland four at the maker level, so neither had a +machine page. Chihiro was filed under Microsoft and Sega, and the Oric under +Oric and Tangerine: one machine, two folders, two pages. +""" + +from __future__ import annotations + +import subprocess +import unittest +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] + +# Files the trees below them address at the maker level, left as they are. +MAKER_LEVEL = { + "RPG Maker/wildmidi.cfg", + "ScummVM/scummvm.zip", +} + +# The machines filed under one maker only, and that maker. +ONE_MAKER = {"Chihiro": "Sega", "Oric": "Tangerine"} + + +def _tracked_and_ignored() -> list[str]: + out = subprocess.run( + ["git", "ls-files", "--cached", "--others", "bios"], + cwd=REPO_ROOT, capture_output=True, text=True, check=True, + ).stdout + return [line[len("bios/"):] for line in out.splitlines() if line.startswith("bios/")] + + +class MakerThenMachine(unittest.TestCase): + def setUp(self): + if not (REPO_ROOT / ".git").exists(): + self.skipTest("not a git checkout") + self.paths = _tracked_and_ignored() + if not self.paths: + self.skipTest("bios/ not present") + + def test_no_file_sits_at_the_maker_level(self): + loose = sorted( + p for p in self.paths + if p.count("/") == 1 and p not in MAKER_LEVEL + ) + self.assertEqual(loose, []) + + def test_one_machine_has_one_maker(self): + for machine, maker in ONE_MAKER.items(): + makers = sorted({ + p.split("/", 1)[0] for p in self.paths + if p.count("/") >= 2 and p.split("/")[1] == machine + and p.split("/", 1)[0] != "Other" + }) + self.assertEqual(makers, [maker], machine) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_db_aliases.py b/tests/test_db_aliases.py index 1ffe4fe2..6e814857 100644 --- a/tests/test_db_aliases.py +++ b/tests/test_db_aliases.py @@ -191,5 +191,64 @@ class DrasticNamesTheDSDumps(unittest.TestCase): ) +class AliasesFollowContentNotPrimaryCopy(unittest.TestCase): + """Two copies of one IPL dump: 64DD_IPL.bin and 64DD_IPL_v12_JPN.bin. + The scan keeps the first by path order as primary and lists the other as + a copy. project64 names the second and declares no hash, so its aliases + attached only while that copy happened to be primary.""" + + PROFILE = ( + 'files:\n - name: "64DD_IPL_v12_JPN.bin"\n' + ' aliases: ["64DD_IPL_JP.n64", "64dd_ipl_J.bin"]\n' + ) + + def _aliases(self, primary: str, copy: str) -> dict: + files = {"s": {"name": primary, "path": f"bios/N64DD/{primary}", "md5": "m"}} + copies = {"s": [{"name": copy, "path": f"bios/N64DD/{copy}"}]} + with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp") as tmp: + previous = os.getcwd() + os.chdir(tmp) + try: + Path("emulators").mkdir() + Path("emulators/p.yml").write_text(self.PROFILE) + return generate_db._collect_all_aliases(files, copies) + finally: + os.chdir(previous) + + def test_either_copy_primary_gives_the_same_names(self): + names = [] + for primary, copy in ( + ("64DD_IPL.bin", "64DD_IPL_v12_JPN.bin"), + ("64DD_IPL_v12_JPN.bin", "64DD_IPL.bin"), + ): + aliases = self._aliases(primary, copy) + names.append({a["name"] for a in aliases.get("s", [])}) + self.assertEqual(names[0], names[1]) + self.assertEqual(names[0], {"64DD_IPL_JP.n64", "64dd_ipl_J.bin"}) + + def test_a_copy_of_other_content_makes_the_name_ambiguous(self): + files = { + "a": {"name": "BS-X.bin", "path": "bios/SNES/BS-X.bin", "md5": "m1"}, + "b": {"name": "Satellaview_BS-X.sfc", "path": "bios/SNES/x.sfc", "md5": "m2"}, + } + copies = {"b": [{"name": "BS-X.bin", "path": "bios/Satellaview/BS-X.bin"}]} + with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp") as tmp: + previous = os.getcwd() + os.chdir(tmp) + try: + Path("emulators").mkdir() + Path("emulators/s.yml").write_text( + 'files:\n - name: "BS-X.bin"\n aliases: ["BS-X.bios"]\n' + ) + aliases = generate_db._collect_all_aliases(files, copies) + finally: + os.chdir(previous) + self.assertEqual(aliases, {}) + + def test_the_build_passes_the_scan_copies(self): + source = (REPO_ROOT / "scripts" / "generate_db.py").read_text(encoding="utf-8") + self.assertIn("_collect_all_aliases(files, aliases)", source) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_doc_pages.py b/tests/test_doc_pages.py index 89e0ca04..025cde83 100644 --- a/tests/test_doc_pages.py +++ b/tests/test_doc_pages.py @@ -392,7 +392,8 @@ class ExitStatusTable(unittest.TestCase): section = _section(_page("installer.md"), "Exit status") documented = {int(row[0].strip("`")) for row in _table_rows(section)} raised = {int(code) for code in re.findall(r"sys\.exit\((\d+)\)", source)} - self.assertEqual(documented, raised | {2}) + # 0 is a run that returns, 2 the code argparse leaves with. + self.assertEqual(documented, raised | {0, 2}) self.assertIn("install.py: error:", section) for option in set(re.findall(r"(--[a-z][a-z-]+)", section)): self.assertIn(f'"{option}"', source, option) diff --git a/tests/test_file_consumers.py b/tests/test_file_consumers.py index 9e0f1661..50790d2f 100644 --- a/tests/test_file_consumers.py +++ b/tests/test_file_consumers.py @@ -173,6 +173,124 @@ class ReadersFollowTheDataTrees(unittest.TestCase): self.assertIn("dolphin", self._readers({})) +class TheDestinationBasenameComesLast(unittest.TestCase): + """melonDS Nightly reads dsi_nand.bin at dsi/nand.bin. With the DSi image + absent from the checkout and only its variant left, the destination's + basename let the Wii nand.bin outrank the entry's own name, and the site + named melonDS Nightly a reader of the Wii NAND.""" + + def setUp(self): + self._tree = tempfile.TemporaryDirectory() + root = Path(self._tree.name) + files = {} + by_name: dict[str, list[str]] = {} + for rel, payload in ( + ("bios/Nintendo/Wii/nand.bin", b"wii nand"), + ("bios/Nintendo/Nintendo DSi/.variants/dsi_nand.bin.8b79a73c", b"dsi nand"), + ): + path = root / rel + path.parent.mkdir(parents=True) + path.write_bytes(payload) + sha1 = hashlib.sha1(payload).hexdigest() + name = "dsi_nand.bin" if "dsi_nand" in rel else path.name + files[sha1] = {"name": name, "sha1": sha1, "path": str(path), + "md5": hashlib.md5(payload).hexdigest(), "size": len(payload)} + by_name.setdefault(name, []).append(sha1) + self.wii = hashlib.sha1(b"wii nand").hexdigest() + self.dsi = hashlib.sha1(b"dsi nand").hexdigest() + self.db = {"files": files, "indexes": { + "by_name": by_name, "by_md5": {}, "by_path_suffix": {}}} + self.entry = {"name": "dsi_nand.bin", "path": "dsi/nand.bin", "agnostic": True} + + def tearDown(self): + self._tree.cleanup() + + def test_the_resolver_keeps_the_entry_name(self): + from common import resolve_local_file + + path, status = resolve_local_file( + {**self.entry, "source_profile": "melonds-nightly"}, self.db, + dest_hint=self.entry["path"], + ) + self.assertEqual((path, status), (self.db["files"][self.dsi]["path"], "name_exact")) + + def test_the_wii_nand_has_no_ds_reader(self): + consumers = FileConsumers(self.db, data_dir_registry={}) + consumers.add_emulators({"melonds-nightly": {"type": "standalone", "files": [self.entry]}}) + self.assertEqual(consumers.emulators.get(self.wii), None) + self.assertEqual(consumers.emulators.get(self.dsi), {"melonds-nightly"}) + + def test_a_descriptive_name_still_reaches_the_basename(self): + """name: "MDA font ROM", path: "mda.rom" is the case the basename step serves.""" + from common import resolve_local_file + + path, _ = resolve_local_file( + {"name": "Wii NAND image", "path": "nand.bin"}, self.db, dest_hint="nand.bin", + ) + self.assertEqual(path, self.db["files"][self.wii]["path"]) + + +class EveryReaderIsTheEmulatorPackFile(unittest.TestCase): + """Each emulator FileConsumers credits with a file is one whose entry the + emulator pack resolves to that file: the same entry fields (archive + members, owner), destination hint, ZIP index and data trees. The pairing + omitted the archive members, and gngeopi and neo-emu were credited with + the MAME neogeo.zip while their pack carries the one holding the ROMs + they open.""" + + def test_pairings_agree_with_the_resolver(self): + import json + import os + + from common import ( + build_zip_contents_index, load_data_dir_registry, + load_emulator_profiles, resolve_local_file, + ) + from validation import with_archive_members + + db_path = REPO_ROOT / "database.json" + if not db_path.exists(): + self.skipTest("database.json absent") + previous = os.getcwd() + os.chdir(REPO_ROOT) + self.addCleanup(os.chdir, previous) + db = json.loads(db_path.read_text(encoding="utf-8")) + zips = build_zip_contents_index(db) + registry = load_data_dir_registry(str(REPO_ROOT / "platforms")) + profiles = load_emulator_profiles(str(REPO_ROOT / "emulators")) + consumers = FileConsumers(db, zips, registry) + consumers.add_emulators(profiles) + sha1_by_path = {e["path"]: s for s, e in db["files"].items()} + + expected: set[tuple[str, str]] = set() + from_trees: set[tuple[str, str]] = set() + for name, profile in profiles.items(): + if profile.get("type") == "alias": + continue + files = profile.get("files") or [] + for entry in files: + if not isinstance(entry, dict) or not entry.get("name"): + continue + members = consumers.directory_members(entry) + if members: + from_trees |= {(sha1, name) for sha1 in members.values()} + continue + path, status = resolve_local_file( + {**with_archive_members(entry, files), "source_profile": name}, + db, zips, dest_hint=entry.get("path") or "", + data_dir_registry=registry, + ) + if path and status not in ("not_found", "hash_mismatch"): + sha1 = sha1_by_path.get(path) + if sha1: + expected.add((sha1, name)) + credited = { + (sha1, name) for sha1, names in consumers.emulators.items() for name in names + } + self.assertEqual(sorted(expected - credited), []) + self.assertEqual(sorted(credited - expected - from_trees), []) + + def tearDownModule(): _TMP.cleanup() diff --git a/tests/test_install.py b/tests/test_install.py index 4bde3446..14f27fc4 100644 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -1784,7 +1784,7 @@ class TestDetectedPlatformPrompt(unittest.TestCase): def test_q_quits_and_the_menu_says_so(self): result, out = self._answer("q") self.assertIsInstance(result, SystemExit) - self.assertEqual(result.code, 0) + self.assertEqual(result.code, 130) self.assertIn("q) quit", out) def test_a_wrong_answer_names_the_choices(self): @@ -1808,6 +1808,16 @@ class TestManualPlatformPrompt(unittest.TestCase): chosen, [("retroarch", Path.home() / ".config" / "retroarch" / "system")] ) + def test_enter_takes_retroarch_as_the_dest_menu_does(self): + """The --dest menu offered `[Enter for RetroArch]` and this one, the + same list, had no default.""" + answers = iter(["", ""]) + out = io.StringIO() + with unittest.mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(out): + chosen = install._prompt_manual_platform("linux") + self.assertEqual(chosen[0][0], "retroarch") + def test_name_and_explicit_directory(self): answers = iter(["batocera", "~/my bios"]) with unittest.mock.patch("builtins.input", lambda _prompt="": next(answers)): @@ -1820,11 +1830,51 @@ class TestManualPlatformPrompt(unittest.TestCase): chosen = install._prompt_manual_platform("linux") self.assertEqual(chosen, [("batocera", install.DEFAULT_DESTS["batocera"])]) - def test_quit_exits_cleanly(self): + def test_quit_stops_like_ctrl_c(self): + """`install.sh && retroarch` went on to start RetroArch with no BIOS + after a q, which left with 0 where Ctrl+C leaves with 130.""" with unittest.mock.patch("builtins.input", lambda _prompt="": "q"): with self.assertRaises(SystemExit) as raised: install._prompt_manual_platform("linux") - self.assertEqual(raised.exception.code, 0) + self.assertEqual(raised.exception.code, 130) + + def test_quotes_around_a_typed_folder_are_dropped(self): + """Explorer's "Copy as path" quotes the folder: the files went into a + folder named `"` under the current directory, and the run said Done.""" + root = Path(_tempdir(self)) + for typed in (f'"{root}/My Card/bios"', f"'{root}/My Card/bios'", + f' "{root}/My Card/bios" '): + answers = iter(["1", typed]) + with self.subTest(typed=typed), \ + unittest.mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(io.StringIO()): + chosen = install._prompt_manual_platform("linux") + self.assertEqual(chosen, [("retroarch", root / "My Card" / "bios")]) + + def test_home_and_variables_are_expanded_on_every_system(self): + for os_type in ("linux", "windows", "darwin"): + answers = iter(["1", '"~/$RB_TEST_DIR/bios"']) + with self.subTest(os_type=os_type), \ + unittest.mock.patch.dict(os.environ, {"RB_TEST_DIR": "cards"}), \ + unittest.mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(io.StringIO()): + chosen = install._prompt_manual_platform(os_type) + self.assertEqual(chosen[0][1], Path.home() / "cards" / "bios") + + def test_a_default_folder_not_there_is_not_found(self): + """With nothing installed, Enter printed "Found RetroArch at" a + folder that did not exist.""" + root = Path(_tempdir(self)) + answers = iter(["1", ""]) + out = io.StringIO() + with unittest.mock.patch.object(install, "_default_dest", + return_value=root / "retroarch" / "system"), \ + unittest.mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(out): + install._prompt_manual_platform("linux") + self.assertIn("default BIOS folder", out.getvalue()) + self.assertIn("will be created", out.getvalue()) + self.assertNotIn("Found", out.getvalue()) def test_a_wrong_answer_says_what_to_type(self): answers = iter(["99", "1", ""]) @@ -3261,7 +3311,8 @@ class AChunkedCutIsADownloadFailure(unittest.TestCase): unittest.mock.patch.object(install, "_retry_delay", return_value=0): dest, ok, reason = install._download_one(entry, Path(_tempdir(self))) self.assertFalse(ok) - self.assertIn("IncompleteRead", reason) + self.assertEqual(reason, "the connection was cut") + self.assertIsInstance(reason, install.NetworkReason) @@ -3719,6 +3770,21 @@ class ATypoGetsTheClosestName(unittest.TestCase): self.assertEqual(install.normalize_platform("RetroArch "), "retroarch") self.assertEqual(install.normalize_platform("RetroDECK"), "retrodeck") + def test_a_system_name_stands_for_the_list_it_gets(self): + """--list-platforms printed `muOS: retroarch`, and --platform muos + answered "Unknown platform".""" + for typed, plat in (("muos", "retroarch"), ("muOS", "retroarch"), + ("ArkOS", "retroarch"), ("PAN4ELEC", "amberelec"), + ("JELOS", "retroarch")): + out = io.StringIO() + with self.subTest(typed=typed), contextlib.redirect_stdout(out): + self.assertEqual(install.normalize_platform(typed), plat) + self.assertIn(f"--platform {plat}", out.getvalue()) + + def test_a_system_that_gets_no_list_is_still_refused(self): + with contextlib.redirect_stderr(io.StringIO()), self.assertRaises(SystemExit): + install.normalize_platform("TrimUI") + def test_a_platform_typo_is_answered_with_one_name(self): err = io.StringIO() with contextlib.redirect_stderr(err), self.assertRaises(SystemExit) as raised: @@ -4672,8 +4738,28 @@ class HandheldSystemsByTheirOwnFiles(unittest.TestCase): {"/usr/trimui/": "", "/mnt/SDCARD/.system/res/": ""}) self.assertEqual(found, []) self.assertIn("MinUI found here", err) + self.assertIn("--platform minui", err) + self.assertIn("--dest", err) self.assertNotIn("TrimUI", err) + def test_a_minui_card_on_its_device_gets_its_file_list(self): + """--list-platforms said the MinUI layout was not written yet, while + --from-pack and --dest wrote it: on the device the card root is the + folder, and the card's version.txt names which of the three it is.""" + for release, plat, shown in (("MinUI-20251127-0", "minui", "MinUI"), + ("NextUI-20250601-1", "nextui", "NextUI"), + ("MyMinUI-20260809b-0", "myminui", "MyMinUI")): + with self.subTest(release=release): + root, found, name = self._one({ + "/usr/trimui/": "", "/mnt/SDCARD/.system/res/": "", + "/mnt/SDCARD/.system/version.txt": release + "\n"}) + self.assertEqual((found, name), ((plat, root / "mnt/SDCARD"), shown)) + + def test_the_listing_says_what_the_minui_family_gets(self): + line = next(line for line in install._system_lines() if line.startswith("MinUI:")) + self.assertNotIn("does not write", line) + self.assertIn("minui, nextui or myminui", line) + def test_two_unrelated_systems_are_refused(self): _root, found, names, _err = self._found( {"/mnt/SDCARD/Koriki/version.txt": "1\n"}, 'OS_NAME="JELOS"\n') @@ -4918,6 +5004,31 @@ def _events(proc: subprocess.CompletedProcess) -> list[dict]: return [json.loads(line) for line in proc.stdout.splitlines()] +class SystemEventsFollowTheChoice(unittest.TestCase): + """--system nintendo-gba wrote `system` events for nintendo-ds, gb and + gbc: SkyEmu's files carry four systems, and each was described by the + few of its files the choice kept.""" + + def test_only_the_chosen_systems_are_described(self): + files = [{"dest": "gba_bios.bin", "size": 1, "systems": ["nintendo-gba"]}, + {"dest": "SkyEmu/dmg.bin", "size": 1, + "systems": ["nintendo-gb", "nintendo-gba"]}] + stream = io.StringIO() + install.EVENTS.open(stream) + self.addCleanup(setattr, install.EVENTS, "stream", None) + install._emit_check("retroarch", {}, Path("/b"), files, [], [], 0, 0, + chosen=["nintendo-gba"]) + systems = [json.loads(line)["system"] for line in stream.getvalue().splitlines() + if json.loads(line)["event"] == "system"] + self.assertEqual(systems, ["nintendo-gba"]) + stream.seek(0) + stream.truncate() + install._emit_check("retroarch", {}, Path("/b"), files, [], [], 0, 0) + systems = [json.loads(line)["system"] for line in stream.getvalue().splitlines() + if json.loads(line)["event"] == "system"] + self.assertEqual(systems, ["nintendo-gb", "nintendo-gba"]) + + class EventsDescribeTheRun(unittest.TestCase, _SyntheticTree): """--events: the handheld port reads the run as JSON lines on stdout and never parses the text, which goes to stderr.""" @@ -5037,6 +5148,91 @@ class EventsDescribeTheRun(unittest.TestCase, _SyntheticTree): self.assertIn(f"`{key}`", row, f"{kind}.{key}") +class NetworkFailuresInPlainWords(unittest.TestCase): + """Offline, the run printed "[Errno -2] Name or service not known". A + beginner needs "no internet connection", and the raw text only under + --verbose.""" + + def _words(self, reason: BaseException, **kwargs) -> tuple[str, str]: + return install.network_words(urllib.error.URLError(reason), **kwargs) + + def test_the_common_failures(self): + import ssl # noqa: PLC0415 + + cases = ( + (socket.gaierror(-2, "Name or service not known"), "no internet connection"), + (socket.timeout("timed out"), "timed out"), + (ConnectionRefusedError(111, "Connection refused"), "refused the connection"), + (OSError(101, "Network is unreachable"), "no internet connection"), + (ssl.SSLCertVerificationError(1, "certificate verify failed"), + "certificate was rejected"), + ) + with unittest.mock.patch.object(install, "_ca_bundle_found", return_value=True): + for reason, words in cases: + with self.subTest(reason=reason): + code, text = self._words(reason) + self.assertEqual(code, "network") + self.assertIn(words, text) + self.assertNotIn("Errno", text) + + def test_verbose_keeps_the_raw_text(self): + _code, text = self._words(socket.gaierror(-2, "Name or service not known"), + verbose=True) + self.assertIn("Name or service not known", text) + + def test_a_clock_in_the_past_is_named(self): + """A handheld with no clock battery boots in 1980, and every + certificate then reads as not yet valid.""" + import datetime # noqa: PLC0415 + import ssl # noqa: PLC0415 + + error = ssl.SSLCertVerificationError(1, "certificate is not yet valid") + with unittest.mock.patch.object(install, "_ca_bundle_found", return_value=True): + code, text = self._words(error, today=datetime.date(1980, 1, 1)) + self.assertEqual(code, "clock") + self.assertIn("The clock reads 1980-01-01", text) + self.assertIn("set the date", text) + code, _text = self._words(error, today=install.CLOCK_FLOOR) + self.assertEqual(code, "network") + + def test_no_certificate_list_names_ssl_cert_file(self): + import ssl # noqa: PLC0415 + + error = ssl.SSLCertVerificationError(1, "unable to get local issuer certificate") + with unittest.mock.patch.object(install, "_ca_bundle_found", return_value=False): + code, text = self._words(error) + self.assertEqual(code, "no_ca") + self.assertIn("SSL_CERT_FILE", text) + + def test_a_certificate_list_is_looked_for_where_openssl_and_systems_keep_it(self): + root = Path(_tempdir(self)) + bundle = root / "cert.pem" + paths = SimpleNamespace(cafile=str(root / "none.pem"), capath=str(root / "none"), + openssl_cafile=str(root / "no.pem"), + openssl_capath=str(root / "no")) + with unittest.mock.patch("ssl.get_default_verify_paths", return_value=paths), \ + unittest.mock.patch.object(install, "CA_BUNDLES", ()), \ + unittest.mock.patch.dict(os.environ, {"SSL_CERT_FILE": "", "SSL_CERT_DIR": ""}): + self.assertFalse(install._ca_bundle_found()) + with unittest.mock.patch.object(install, "CA_BUNDLES", (str(bundle),)): + self.assertFalse(install._ca_bundle_found()) + bundle.write_text("x") + self.assertTrue(install._ca_bundle_found()) + + def test_a_file_list_out_of_reach_by_name_says_so(self): + env = {**os.environ, "RETROBIOS_BASE_URL": "https://retrobios-nohost.invalid", + "HOME": _tempdir(self)} + proc = subprocess.run( + [sys.executable, str(REPO_ROOT / "install.py"), "--platform", "retroarch", + "--dest", _tempdir(self), "--check"], + env=env, capture_output=True, text=True, timeout=120, check=False, + stdin=subprocess.DEVNULL, + ) + self.assertEqual(proc.returncode, 1) + self.assertIn("no internet connection", proc.stderr) + self.assertNotIn("Errno", proc.stderr) + + class AFileYouHadIsKept(unittest.TestCase): """A BIOS file whose contents differ was replaced and lost: a personal dump or another revision could not be brought back by deleting what the diff --git a/tests/test_install_experience.py b/tests/test_install_experience.py index f356a2f3..5f64b1e0 100644 --- a/tests/test_install_experience.py +++ b/tests/test_install_experience.py @@ -404,6 +404,169 @@ class ReviewCases(unittest.TestCase): progress.add(40) self.assertEqual(progress.transferred(), 40) +class _HeldHandler(http.server.BaseHTTPRequestHandler): + """Serves the manifest and first.bin at once, every other file once released.""" + + files: dict[str, bytes] = {} + manifest = b"" + release = threading.Event() + + def log_message(self, *args) -> None: # noqa: D102 + pass + + def do_GET(self) -> None: # noqa: N802, D102 + if self.path.endswith(".json"): + body = self.manifest + else: + name = self.path.rsplit("/", 1)[-1] + if name != "first.bin": + self.release.wait(30) + body = self.files[name] + self.send_response(200) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + +class AStoppedRunCountsWhatLanded(unittest.TestCase): + """Stopped at 8 of 118 files, the summary said "118 files installed": + every queued file was counted, written or not, and a user who read it + did not run the command again.""" + + @unittest.skipIf(os.name == "nt", "SIGINT is sent the POSIX way") + def test_only_the_written_file_is_counted(self): + import signal # noqa: PLC0415 + import time # noqa: PLC0415 + + files = {name: name.encode() * 64 for name in ("first.bin", "second.bin", "third.bin")} + manifest = {"manifest_version": 2, "platform": "retroarch", "files": [ + {"dest": name, "size": len(data), "sha1": hashlib.sha1(data).hexdigest(), + "repo_path": f"bios/{name}", "cores": None} + for name, data in files.items() + ]} + _HeldHandler.files, _HeldHandler.manifest = files, json.dumps(manifest).encode() + _HeldHandler.release = threading.Event() + httpd = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _HeldHandler) + threading.Thread(target=httpd.serve_forever, daemon=True).start() + self.addCleanup(httpd.server_close) + self.addCleanup(httpd.shutdown) + self.addCleanup(_HeldHandler.release.set) + with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp") as tmp: + dest = Path(tmp) / "bios" + env = dict(os.environ, + RETROBIOS_BASE_URL=f"http://127.0.0.1:{httpd.server_address[1]}") + log = Path(tmp) / "out.txt" + # The held files are released once the run says it is stopping, + # not after a fixed pause: under load the stop landed after the + # release, all three files arrived, and nothing was stopped. + with open(log, "w", encoding="utf-8") as out_file: + proc = subprocess.Popen( + [sys.executable, str(REPO_ROOT / "install.py"), "--platform", "retroarch", + "--dest", str(dest), "--no-input"], + env=env, stdin=subprocess.DEVNULL, stdout=out_file, + stderr=subprocess.STDOUT, text=True, + ) + deadline = time.monotonic() + 30 + while not (dest / "first.bin").exists() and time.monotonic() < deadline: + time.sleep(0.05) + time.sleep(0.2) + proc.send_signal(signal.SIGINT) + while ("Stopping." not in log.read_text(encoding="utf-8") + and time.monotonic() < deadline): + time.sleep(0.05) + _HeldHandler.release.set() + proc.wait(timeout=60) + out = err = log.read_text(encoding="utf-8") + written = sorted(p.name for p in dest.iterdir() if not p.name.startswith(".")) + self.assertEqual(proc.returncode, 130, out + err) + self.assertEqual(written, ["first.bin"]) + self.assertIn("Stopped. 1 file installed.", out) + + +class ARefusedFolderReportsEachFile(unittest.TestCase): + """A read-only folder ended the run on its first refusal, and --events + wrote one `downloaded` line for seven failed files, while the events + table promises one per finished file.""" + + @unittest.skipIf(os.name == "nt" or os.geteuid() == 0, + "a read-only folder is refused by POSIX permissions") + def test_one_event_per_file_with_the_reason(self): + with FakeRepository() as repo: + repo.dest.mkdir() + os.chmod(repo.dest, 0o555) + try: + proc = repo.run("--events") + finally: + os.chmod(repo.dest, 0o755) + events = [json.loads(line) for line in proc.stdout.splitlines()] + downloaded = [e for e in events if e["event"] == "downloaded"] + self.assertEqual(proc.returncode, 2, proc.stderr) + self.assertEqual(len(downloaded), len(FakeRepository.PAYLOADS)) + self.assertEqual({e["reason"] for e in downloaded}, {install.NOT_WRITABLE}) + self.assertEqual(sorted(e["files_done"] for e in downloaded), + list(range(1, len(downloaded) + 1))) + + +class _Tty(io.StringIO): + def isatty(self) -> bool: + return True + + +class ColourFollowsNoColorOrg(unittest.TestCase): + """no-color.org: only a NO_COLOR that is set and not empty turns colour + off. An empty one, as `NO_COLOR= cmd` leaves, turned it off too.""" + + def _colour(self, **env: str) -> bool: + clean = {k: v for k, v in os.environ.items() + if k not in ("NO_COLOR", "FORCE_COLOR", "CLICOLOR_FORCE", "TERM")} + with mock.patch.dict(os.environ, {**clean, **env}, clear=True), \ + mock.patch.object(install, "_enable_ansi", return_value=True): + return install.Terminal(_Tty()).colour + + def test_an_empty_no_color_leaves_colour_on(self): + self.assertTrue(self._colour()) + self.assertTrue(self._colour(NO_COLOR="")) + self.assertFalse(self._colour(NO_COLOR="1")) + + def test_force_color_paints_a_pipe(self): + with mock.patch.object(install, "_enable_ansi", return_value=True): + for env, expected in (({}, False), ({"FORCE_COLOR": "1"}, True), + ({"CLICOLOR_FORCE": "1"}, True), + ({"FORCE_COLOR": "0"}, False), + ({"FORCE_COLOR": "1", "NO_COLOR": "1"}, False)): + clean = {k: v for k, v in os.environ.items() + if k not in ("NO_COLOR", "FORCE_COLOR", "CLICOLOR_FORCE")} + with self.subTest(env=env), \ + mock.patch.dict(os.environ, {**clean, **env}, clear=True): + term = install.Terminal(io.StringIO()) + self.assertEqual(term.colour, expected) + self.assertFalse(term.live) + + +class SmallWordings(unittest.TestCase): + def test_check_asks_which_to_check(self): + """--check with several platforms asked "Install for:", and + installs nothing.""" + out = io.StringIO() + with mock.patch("builtins.input", lambda _prompt="": "1"), \ + contextlib.redirect_stdout(out): + install._prompt_platform_choice( + [("emudeck", Path("/e")), ("retroarch", Path("/r"))], "Check:") + self.assertIn("Check:", out.getvalue()) + self.assertNotIn("Install for:", out.getvalue()) + + def test_nothing_detected_is_said(self): + with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp") as home: + env = dict(os.environ, HOME=home, USERPROFILE=home, XDG_CONFIG_HOME=home, + RETROBIOS_OS="linux") + proc = subprocess.run( + [sys.executable, str(REPO_ROOT / "install.py"), "--list-platforms"], + env=env, capture_output=True, text=True, timeout=60, check=False, + ) + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertIn("Detected on this system: none", proc.stdout) + + class WindowsMandatoryLock(unittest.TestCase): """Issue 82: on Windows the partial copy's lock is mandatory, so hashing it by reopening its path failed with a sharing violation, and every file diff --git a/tests/test_install_offline.py b/tests/test_install_offline.py index 834e320a..7a614694 100644 --- a/tests/test_install_offline.py +++ b/tests/test_install_offline.py @@ -477,12 +477,33 @@ class TheSummaryNamesTheBulk(unittest.TestCase): _sized("mame/3do_m2.zip", 37 * MB, ["3do"], ["mame"]), ] lines = install.bulk_hint(files, {"system_cores": {"3do": ["mame", "opera"]}}, - systems_chosen=True, cores_chosen=False) + systems_chosen=True, cores_chosen=False, + accepted={"mame", "opera"}) self.assertEqual(lines, [ " mame pulls 337.0 MB of this 349.0 MB download for 3do. --core opera " "keeps 12.0 MB of it and saves 337.0 MB (96%)." ]) + def test_only_a_core_the_option_accepts_is_advised(self): + """`--core ares keeps 11.0 MB` was printed, and `--core ares` then + answered "unknown core": ares emulates the PlayStation and loads no + file of its own, and --core takes only the cores that do.""" + files = [ + _sized("scph5501.bin", 1 * MB, ["sony-playstation"]), + _sized("ps2_bios.bin", 300 * MB, ["sony-playstation"], ["duckstation"]), + _sized("pcsx/extra.bin", 2 * MB, ["sony-playstation"], ["pcsx_rearmed"]), + ] + manifest = {"system_cores": {"sony-playstation": ["ares", "duckstation", + "pcsx_rearmed"]}} + lines = install.bulk_hint(files, manifest, True, False, + accepted={"duckstation", "pcsx_rearmed"}) + self.assertEqual(len(lines), 1) + self.assertIn("--core pcsx_rearmed keeps 3.0 MB", lines[0]) + self.assertNotIn("ares", lines[0]) + self.assertEqual(install.bulk_hint(files, manifest, True, False, + accepted={"duckstation"}), []) + self.assertEqual(install.bulk_hint(files, manifest, True, False), []) + def test_a_system_pulling_most_of_the_download_is_named(self): files = [_sized("a.zip", 400 * MB, ["arcade"]), _sized("b.bin", 50 * MB, ["nes"]), _sized("c.bin", 10 * MB, ["gba"])] diff --git a/tests/test_install_selection.py b/tests/test_install_selection.py index b8169e69..667a8d21 100644 --- a/tests/test_install_selection.py +++ b/tests/test_install_selection.py @@ -9,10 +9,12 @@ to one answer. from __future__ import annotations +import contextlib import functools import hashlib import http.server import importlib.util +import io import json import os import random @@ -311,6 +313,24 @@ class CommandLineChoices(unittest.TestCase): self.assertIn("sega-saturn", str(ctx.exception)) self.assertIn("nintendo-gba", str(ctx.exception)) + def test_a_short_name_is_suggested_never_taken(self): + """`--system gba`, `psx` and `ps1` were refused on RetroArch with no + suggestion, though nintendo-gba holds the very letters.""" + known = [f"system-{i}" for i in range(40)] + [ + "nintendo-gb", "nintendo-gba", "nintendo-gbc", "sony-playstation", + "sony-playstation-2", "sega-mega-drive"] + for typed, meant in (("gba", "nintendo-gba"), ("psx", "sony-playstation"), + ("ps1", "sony-playstation"), ("PS2", "sony-playstation-2"), + ("genesis", "sega-mega-drive"), ("gb", "nintendo-gb")): + with self.subTest(typed=typed), self.assertRaises(ValueError) as ctx: + install.resolve_choices([typed], known, "system") + self.assertIn(f"Did you mean: {meant}", str(ctx.exception)) + + def test_a_short_name_for_a_system_the_list_lacks_is_not_suggested(self): + with self.assertRaises(ValueError) as ctx: + install.resolve_choices(["psx"], [f"system-{i}" for i in range(40)], "system") + self.assertNotIn("sony-playstation", str(ctx.exception)) + def test_an_empty_list_is_refused(self): with self.assertRaises(ValueError): install.resolve_regions([" , "]) @@ -334,6 +354,114 @@ class CommandLineChoices(unittest.TestCase): install.parse_selection(bad, 5) +class DecliningTheSizePointsAtTheChoice(unittest.TestCase): + """Saying no to `Download 8.4 GB?` printed "--system, --core and + --region install less (see --help)": a 91-line help for someone who had + just passed the c entry that does it.""" + + def _run(self, answers: list[str], *options: str) -> str: + replies = iter(answers) + out = io.StringIO() + with FakeRepository() as repo, \ + mock.patch.object(sys, "argv", ["install.py", "--platform", "retroarch", + "--dest", str(repo.dest), *options]), \ + mock.patch.object(install, "MANIFEST_URL", + repo.env()["RETROBIOS_BASE_URL"] + "/install/{platform}.json"), \ + mock.patch.object(install, "RAW_FILE_URL", + repo.env()["RETROBIOS_BASE_URL"] + "/{path}"), \ + mock.patch.object(install, "CONFIRM_FROM_BYTES", 1), \ + mock.patch("sys.stdin", mock.Mock(isatty=lambda: True)), \ + mock.patch("builtins.input", lambda _prompt="": next(replies)), \ + contextlib.redirect_stdout(out): + try: + install.main() + except SystemExit: + pass + self.assertEqual(repo.installed(), []) + return out.getvalue() + + def test_install_everything_then_no_names_the_c_entry(self): + out = self._run(["", "n"]) + self.assertIn("type c at the first question", out) + self.assertNotIn("see --help", out) + + def test_options_given_keep_the_option_advice(self): + out = self._run(["n"], "--system", "sony-playstation") + self.assertIn("--system, --core and --region install less", out) + + +class ACoreWithNoFileOfItsOwn(unittest.TestCase): + """pcsx_rearmed, swanstation and pcsx1 showed `0 files, 0 B` in the + cores step and in --list-cores, which reads as "this core gets nothing": + their files are the platform's own, which are always kept.""" + + FILES = [ + {"dest": "scph5501.bin", "size": 5, "cores": None, "systems": ["sony-playstation"], + "declared_choices": [], "slot_choices": [{"cores": ["pcsx_rearmed"]}]}, + {"dest": "ps2.bin", "size": 9, "cores": ["duckstation"], + "systems": ["sony-playstation"]}, + ] + + def _line(self, out: str, core: str) -> str: + return next(line for line in out.splitlines() if line.strip().startswith(core) + or f") {core}" in line) + + def test_the_listing_says_its_files_are_the_platforms(self): + out = io.StringIO() + with contextlib.redirect_stdout(out): + install._print_choices("retroarch", self.FILES, [], systems=False) + line = self._line(out.getvalue(), "pcsx_rearmed") + self.assertNotIn("0 files", line) + self.assertIn("always kept", line) + self.assertIn("1 file, 9 B", self._line(out.getvalue(), "duckstation")) + + def test_the_cores_step_says_so_too(self): + answers = iter(["c", "", ""]) + out = io.StringIO() + with mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(out): + install._prompt_custom_selection("retroarch", self.FILES, []) + line = self._line(out.getvalue(), "pcsx_rearmed") + self.assertNotIn("0 files", line) + self.assertIn("always kept", line) + + +class FilesSharedBySystemsAreCountedApart(unittest.TestCase): + """`3do 1704 files, 349.0 MB`: 1689 of them are MAME's hash and plugin + files, which six systems carry. Picking 3DO, one expects its BIOS.""" + + FILES = [ + {"dest": "panafz10.bin", "size": 4, "cores": None, "systems": ["3do"]}, + {"dest": "mame/hash/a.xml", "size": 100, "cores": None, + "systems": ["3do", "philips-cdi"]}, + {"dest": "mame/hash/b.xml", "size": 50, "cores": None, + "systems": ["3do", "philips-cdi"]}, + {"dest": "gba_bios.bin", "size": 8, "cores": None, "systems": ["nintendo-gba"]}, + ] + + def _listing(self) -> str: + out = io.StringIO() + with contextlib.redirect_stdout(out): + install._print_choices("retroarch", self.FILES, [], systems=True) + return out.getvalue() + + def test_the_listing(self): + lines = {line.split()[0]: line for line in self._listing().splitlines()} + self.assertIn("1 file, 4 B, and 2 files, 150 B shared with other systems", + lines["3do"]) + self.assertIn("2 files, 150 B, all shared with other systems", lines["philips-cdi"]) + self.assertTrue(lines["nintendo-gba"].endswith("1 file, 8 B")) + + def test_the_systems_step(self): + answers = iter(["c", ""]) + out = io.StringIO() + with mock.patch("builtins.input", lambda _prompt="": next(answers)), \ + contextlib.redirect_stdout(out): + install._prompt_custom_selection("retroarch", self.FILES, []) + self.assertIn("1 file, 4 B, and 2 files, 150 B shared with other systems", + out.getvalue()) + + class TheBoundaryChecksTheNewFields(unittest.TestCase): def _manifest(self, **extra): entry = {"dest": "a.bin", "sha1": "a" * 40, "size": 1, @@ -544,6 +672,74 @@ class TheOneLinerNarrows(unittest.TestCase): self.assertIn("--system sony-playstation --region north-america", out) self.assertEqual(repo.installed(), ["pcsx/extra.bin", "scph5501.bin"]) + @unittest.skipUnless(shutil.which("script"), "script(1) provides the terminal") + def test_a_quoted_folder_typed_at_the_prompt(self): + """The quotes "Copy as path" adds were kept: the files went into a + folder named `"` under the current directory, created without the + question --dest asks, and the run said Done.""" + with FakeRepository() as repo: + home = repo.root / "home" + home.mkdir() + # Read for the standalone emulator folders, of which there are none. + (repo.root / "install" / "emudeck.json").write_text(json.dumps( + {"manifest_version": 2, "platform": "emudeck", "files": []})) + card = repo.root / "My Card" / "bios" + env = dict(repo.env(), HOME=str(home), USERPROFILE=str(home), + XDG_CONFIG_HOME=str(home), RETROBIOS_OS="linux") + command = f"{shlex.quote(sys.executable)} {shlex.quote(str(REPO_ROOT / 'install.py'))}" + for answer, code in (("n", 2), ("y", 0)): + with self.subTest(answer=answer): + proc = subprocess.run( + ["script", "-qec", command, "/dev/null"], + input=f'1\n"{card}"\n{answer}\n\n', env=env, cwd=repo.root, + capture_output=True, text=True, timeout=60, check=False, + ) + self.assertEqual(proc.returncode, code, proc.stdout + proc.stderr) + self.assertIn(f"Create 2 folders under {repo.root}?", proc.stdout) + self.assertFalse((repo.root / '"').exists()) + self.assertEqual(len([p for p in card.rglob("*") if p.is_file()]), 5) + + def test_q_at_every_menu_stops_on_130(self): + """`install.sh && retroarch` started RetroArch after a q, which left + with 0 where Ctrl+C and Ctrl+D leave with 130.""" + files = [{"dest": "a.bin", "size": 1, "systems": ["nintendo-gba"]}] + menus = ( + lambda: install._choose_platform("Platform:"), + lambda: install._pick("Systems:", [("nintendo-gba", files)]), + lambda: install._prompt_custom_selection("retroarch", files, []), + ) + for menu in menus: + with self.subTest(menu=menu), \ + mock.patch("builtins.input", lambda _prompt="": "q"), \ + mock.patch("sys.stdout", new_callable=lambda: open(os.devnull, "w")), \ + self.assertRaises(SystemExit) as stop: + menu() + self.assertEqual(stop.exception.code, 130) + + @unittest.skipIf(os.name == "nt", "a pseudo-terminal is a POSIX one") + def test_ctrl_d_at_the_first_question_has_nothing_to_carry_on(self): + import pty # noqa: PLC0415 + + with FakeRepository() as repo: + home = repo.root / "home" + home.mkdir() + (repo.root / "install" / "emudeck.json").write_text(json.dumps( + {"manifest_version": 2, "platform": "emudeck", "files": []})) + env = dict(repo.env(), HOME=str(home), USERPROFILE=str(home), + XDG_CONFIG_HOME=str(home), RETROBIOS_OS="linux") + leader, follower = pty.openpty() + proc = subprocess.Popen( + [sys.executable, str(REPO_ROOT / "install.py")], stdin=follower, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, text=True, + ) + os.close(follower) + os.write(leader, b"\x04") + out, err = proc.communicate(timeout=60) + os.close(leader) + self.assertEqual(proc.returncode, 130, out + err) + self.assertIn("Stopped. Nothing was installed.", out) + self.assertNotIn("carry on", out) + @unittest.skipUnless(shutil.which("script"), "script(1) provides the terminal") def test_enter_installs_everything_at_a_terminal(self): with FakeRepository() as repo: diff --git a/tests/test_profile_sync.py b/tests/test_profile_sync.py index 901d74ee..d5644cd0 100644 --- a/tests/test_profile_sync.py +++ b/tests/test_profile_sync.py @@ -4163,6 +4163,40 @@ class TestRealignProse(unittest.TestCase): self.assertIn("(deep.c:14)", self.path.read_text()) +class TestRateLimitEndsOneProfile(unittest.TestCase): + """git.libretro.com answered 429 on cemu's tree and the pass over 647 + profiles stopped with a traceback and no report at all.""" + + def test_the_pass_goes_on_and_fails(self): + from unittest import mock + + def build(name, *_args, **_kwargs): + if name == "cemu": + raise profile_sync.upstream.RateLimitError( + "https://git.libretro.com/x: HTTP 429", "git.libretro.com" + ) + return ProfileReport(name=name, counts={"CHANGED": 1}) + + out, err = io.StringIO(), io.StringIO() + saved = sys.argv + try: + sys.argv = ["profile_sync.py", "--all", "--json"] + with mock.patch.object(profile_sync, "load_emulator_profiles", return_value={}), \ + mock.patch.object(profile_sync, "select_profiles", + return_value={"cemu": {}, "after": {}}), \ + mock.patch.object(profile_sync, "_check_quota"), \ + mock.patch.object(profile_sync, "build_report", side_effect=build), \ + contextlib.redirect_stdout(out), contextlib.redirect_stderr(err): + with self.assertRaises(SystemExit) as caught: + profile_sync.main() + finally: + sys.argv = saved + self.assertEqual(caught.exception.code, 1) + by_name = {r["name"]: r for r in json.loads(out.getvalue())} + self.assertEqual(by_name["cemu"]["skipped"], "rate limited: git.libretro.com") + self.assertEqual(by_name["after"]["needs_review"], 1) + + class TestOutputModesApplyTheirFlags(unittest.TestCase): """--changed-only narrows --json too. Extras are refused off the text report.""" diff --git a/tests/test_site_r3_collection.py b/tests/test_site_r3_collection.py index 9c9f7b5f..514667a4 100644 --- a/tests/test_site_r3_collection.py +++ b/tests/test_site_r3_collection.py @@ -4,11 +4,15 @@ A system section is named after the folder its files live in. Nintendo held DS and Nintendo DS, 64DD and Nintendo 64DD, Sega held Mega CD and Mega-CD, Sinclair ZX Spectrum and ZXSpectrum, VTech V.Smile and VSmile, Acorn BBC and BBC Micro: each console had two sections that hid each other on the site. -Reads the git index, which is what a clone checks out. +Reads the git index, which is what a clone checks out, and the database, +which also lists the release assets the index never holds: FBAlpha 2012 had +three samples committed under "FBAlpha 2012" and four release assets under +"fba2012", the folder the core reads. """ from __future__ import annotations +import json import re import subprocess import unittest @@ -19,7 +23,9 @@ REPO_ROOT = Path(__file__).resolve().parents[1] def console_key(name: str) -> str: - return re.sub(r"[\s.\-]", "", name).casefold() + """Spaces, dashes, dots and case folded, and "Alpha" read as its "A" + abbreviation, so "FBAlpha 2012" and "fba2012" are one core.""" + return re.sub(r"[\s.\-]", "", name).casefold().replace("alpha", "a") def twin_consoles(paths: list[str]) -> list[list[str]]: @@ -58,6 +64,39 @@ class OneFolderPerConsole(unittest.TestCase): [["Sega/Mega CD", "Sega/Mega-CD"], ["VTech/V.Smile", "VTech/VSmile"]], ) + def test_database_paths_name_each_console_once(self) -> None: + db_path = REPO_ROOT / "database.json" + if not db_path.is_file(): + self.skipTest("database.json not generated") + files = json.loads(db_path.read_text(encoding="utf-8"))["files"] + self.assertEqual(twin_consoles([f["path"] for f in files.values()]), []) + + def test_alpha_abbreviation_is_the_same_core(self) -> None: + self.assertEqual( + twin_consoles([ + "bios/Arcade/FBAlpha 2012/samples/dkong.zip", + "bios/Arcade/fba2012/samples/ghox.zip", + ]), + [["Arcade/FBAlpha 2012", "Arcade/fba2012"]], + ) + + def test_fbalpha2012_samples_sit_where_the_profile_reads(self) -> None: + db_path = REPO_ROOT / "database.json" + if not db_path.is_file(): + self.skipTest("database.json not generated") + files = json.loads(db_path.read_text(encoding="utf-8"))["files"] + samples = sorted( + f["path"] for f in files.values() + if f["path"].startswith("bios/Arcade/") + and "/samples/" in f["path"] and "fba" in f["path"].casefold() + ) + self.assertEqual( + samples, + [f"bios/Arcade/fba2012/samples/{name}.zip" for name in ( + "dkong", "dkongjr", "fireshrk", "galaga", "ghox", "tekipaki", "vimana", + )], + ) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_site_r3_p0.py b/tests/test_site_r3_p0.py index 7691ba77..dd5781ef 100644 --- a/tests/test_site_r3_p0.py +++ b/tests/test_site_r3_p0.py @@ -1,11 +1,14 @@ -"""Every system id with a section leads to it (round 3, package P0). +"""Every system id with a section leads to it (rounds 3 and 4, package P0). 260 of 636 system ids linked: a variant (WonderSwan Color, Neo Geo MVS) never matched a heading, twin folders (DS and Nintendo DS) made the exact name ambiguous, and every Arcade heading was refused. siterender now reads -a reviewed SYSTEM_PARENTS table after the id's own section, and accepts an -Arcade heading that reads the name exactly. An id whose files the -collection holds and that stays plain is named below, with the reason. +a reviewed SYSTEM_PARENTS table after the id's own section, accepts an +Arcade heading that reads the name exactly, and leads an arcade board +(NAOMI, ZN-1, PGM) to its own section. An id counts as holding files +through a set archive (``category: bios_zip``) its profile declares for it, +not only through a file's own hash. An id whose files the collection holds +and that stays plain is named below, with the reason. Reads the repository: skips when the database is absent. """ @@ -25,60 +28,33 @@ import siterender # noqa: E402 # Ids whose files the collection holds and that lead to no section. UNLINKED: dict[str, str] = { # Files only under a program's folder (Other/, Arcade/, - # Game Engines/, a top named after the program). The heading - # names the program, not the system. - "atari-system1": "Other > fbneo", - "bbc-master-128": "Other > beebem", - "bbc-master-et": "Other > beebem", + # Game Engines/, a top named after the program), a folder of + # several systems' files or not reviewed as the system's own. The + # heading names the program, not the system. "capcom-cps3": "Arcade > FBNeo", - "cave-story": "Other > NXEngine", "cps3": "Arcade > Arcade holds one CPS-3 set among every board's", "commanderx16": "Arcade > Arcade", "dark-forces-ii": "Game Engines > OpenJKDF2", - "deco-cassette": "Arcade > FBNeo", - "dos": "DOSBox, Roland and Other folders", "fpinball": "Other > future-pinball-fploader", "fruitmachine": "Other > mfme", - "igs-pgm": "Arcade > FBNeo", - "konami-bubsys": "Arcade > FBNeo", "microsoft-xbox-360": "Other > xenia-edge", - "midway-mcr": "Arcade > FBNeo", "mysteries-of-the-sith": "Game Engines > OpenJKDF2", - "mz2000": "Arcade > Arcade, not the Sharp MZ section", - "mz2500": "Arcade > Arcade, not the Sharp MZ section", - "mz800": "Arcade > Arcade, not the Sharp MZ section", "namco-na1": "Arcade > FBNeo", "namco-nb1": "Arcade > FBNeo", - "nmk16": "Arcade > FBNeo", "omicron": "Other > omicron", - "pegasus": "Arcade > MAME", "rpgmaker": "RPG Maker > easyrpg", - "scummvm": "Other > ScummVM", "sdlpal": "Other > sdlpal", - "sega-system16b": "Arcade > FBNeo", - "sinclair-zx-spectrum-next": "Other > cspect", + "sega-system16b": "Arcade > FBNeo, and isgsm.zip is also the ISG Selection Master's", "smbx": "Game Engines > TheXTech", - "solarus": "Game Engines > Solarus", - "sunplus-spmp8000": "Other > spmp8000emu", - "super-kaneko-nova": "Arcade > FBNeo", - "taito-cchip": "Arcade > FBNeo", "thomson-mo6": "Other > Clock Signal", - "tomb-raider-1": "Game Engines > TRX", - "vgmplay": "Arcade > Arcade and MAME", - "vm-labs-nuon": "Other > nuance", - "vpinball": "Arcade > PinMAME", - "xrick": "Other > xrick", - "zc210": "ZC > ZC210, the emulator's folder", + "vgmplay": "qsound.zip, ym2413.zip, ym2608.zip: sound chips, no board", # Files filed with another machine: a link would name the wrong one. - "atom": "atom.zip is filed with the BBC Micro", "commodore-c64-supercpu": "VICE's tree under the C128", "emerson-arcadia-2001": "ar_bios.zip is filed with the Saturn", - "naomi2": "naomi2.zip is filed with the Dreamcast", - "neogeo64": "the platform declares the Neo Geo's neogeo.zip", - "sega-dreamcast-arcade": "naomi.zip and awbios.zip, Arcade and Dreamcast", + "sega-dreamcast-arcade": "NAOMI, NAOMI 2 and Atomiswave sets, three boards", "spectravideo": "the SVI ROMs are filed with the MSX", + "taito-type-x": "mame2010 files taitogn.zip, the G-NET BIOS, under this id", "vvvvvv": "SDL's controller database", - "ym2608": "an FBNeo sound ROM, also filed with the NES", # Files of distinct machines or games, one section each. "catacomb-adventure": "three games, three sections", "sinclair-zx80-81": "ZX 80 and ZX 81 sections", @@ -97,6 +73,25 @@ def _accepts(fe: dict, local: str | None, status: str) -> bool: return bool(path) and local.endswith("/" + str(path)) +def _archives_held(fe: dict, db: dict) -> set[str]: + """The copies of a set archive (``category: bios_zip``) the collection + holds: by its name, kept when it holds one CRC32 its ``contents:`` + lists. MAME hashes the members, never the archive, so the entry has no + hash of its own and a name match is the only way to it.""" + from ziptools import zip_member_crcs + + crcs = {str(m["crc32"]).lower() for m in fe.get("contents") or [] + if isinstance(m, dict) and m.get("crc32")} + names = {str(fe.get("name", ""))} | {str(a) for a in fe.get("aliases") or []} + held: set[str] = set() + for name in names: + for sha1 in db["indexes"]["by_name"].get(name.rsplit("/", 1)[-1], []): + members = zip_member_crcs(str(REPO_ROOT / db["files"][sha1]["path"])) + if not crcs or not members or members & crcs: + held.add(sha1) + return held + + @unittest.skipUnless((REPO_ROOT / "database.json").exists(), "database.json is not built") class SystemLinks(unittest.TestCase): @@ -119,6 +114,12 @@ class SystemLinks(unittest.TestCase): profiles = load_emulator_profiles("emulators", skip_aliases=False) siterender.set_console_sections( cls.manufacturers, siterender.program_names(profiles)) + # The system pages give every arcade board a section of its own + # (round 4, 6.4) and record it. The built pages are checked by + # the round 4 gate. + siterender.reset_console_pages() + for board in siterender.arcade_boards(): + siterender.record_board_section(board) platforms = [ load_platform_config(name, "platforms") for name in list_registered_platforms("platforms", include_archived=True) @@ -148,6 +149,10 @@ class SystemLinks(unittest.TestCase): for sys_id in cls.ids: sections: set[tuple[str, str]] = set() for fe in entries.get(sys_id, []): + if fe.get("category") == "bios_zip": + for sha1 in _archives_held(fe, db): + sections.update((m, c) for m, c, _ in places.get(sha1, set())) + continue local, status = resolve_local_file(fe, db) if not _accepts(fe, local, status): continue @@ -159,11 +164,16 @@ class SystemLinks(unittest.TestCase): finally: os.chdir(previous) + @classmethod + def tearDownClass(cls) -> None: + siterender.reset_console_pages() + def test_every_id_with_files_links(self) -> None: linked, total = siterender.link_coverage(self.ids) with_files = set(self.held) print(f"\n {linked} of {total} system ids linked, " - f"{len(with_files - set(UNLINKED))} of {len(with_files)} with files") + f"{len(with_files - set(UNLINKED))} of {len(with_files)} with files, " + f"{len(self.ids - with_files)} with no file") plain = sorted( sys_id for sys_id in with_files - set(UNLINKED) if siterender.system_section(sys_id) is None @@ -240,15 +250,19 @@ class SystemLinks(unittest.TestCase): def test_arcade_heading_by_exact_name(self) -> None: self.assertEqual( siterender.system_section("namco-system246"), ("arcade", "Namco System 246")) - # No heading reads NAOMI: its sets are cards of the general section. - self.assertIsNone(siterender.system_section("sega-naomi")) - # Never a folder of copies a core loads. - self.assertIsNone(siterender.system_section("igs-pgm")) + # A board leads to its own section, never a folder of copies a core + # loads (Arcade > FBNeo). + self.assertEqual(siterender.system_section("sega-naomi"), ("arcade", "Sega NAOMI")) + self.assertEqual( + siterender.system_section("igs-pgm"), ("arcade", "IGS PolyGame Master")) def test_folder_votes_stay_out(self) -> None: + """A copy filed with another machine names no section: the Arcadia + stays plain, NAOMI 2 goes to its board, never to the Dreamcast.""" + self.assertIsNone(siterender.system_section("emerson-arcadia-2001")) + self.assertEqual(siterender.system_section("naomi2"), ("arcade", "Sega NAOMI 2")) for sys_id in ("emerson-arcadia-2001", "naomi2"): with self.subTest(sys_id=sys_id): - self.assertIsNone(siterender.system_section(sys_id)) self.assertNotIn(sys_id, siterender.SYSTEM_PARENTS) def test_emulator_rows_link_the_variant(self) -> None: diff --git a/tests/test_site_r4_p0.py b/tests/test_site_r4_p0.py new file mode 100644 index 00000000..866c9bb6 --- /dev/null +++ b/tests/test_site_r4_p0.py @@ -0,0 +1,324 @@ +"""Arcade boards and the ids that hold files (round 4, package P0). + +The Arcade pages were cut by storage folder, so NAOMI, ZN-1, PGM and the +other boards had no section and stayed plain on 987 emulator rows. +siterender.arcade_board() names the board each set archive is the BIOS of, +read from the profiles, and system_section() leads every id of that board +to ``systems/arcade-/#``, the section the system +pages write. The 28 ids that systems.json gave files and no page either +link or carry their reason below. +""" + +from __future__ import annotations + +import json +import tempfile +import unittest +import zipfile +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] + +import sys # noqa: E402 + +sys.path.insert(0, str(REPO_ROOT / "scripts")) + +import siterender # noqa: E402 +from sitestarlight import toc_slug # noqa: E402 + +# The boards the audit found with no section (N1, T-F3), by an id each. +NAMED_BOARDS = { + "sega-naomi": "Sega NAOMI", + "sega-naomi2": "Sega NAOMI 2", + "sammy-atomiswave": "Sammy Atomiswave", + "capcom-zn1": "Capcom ZN-1", + "capcom-zn2": "Capcom ZN-2", + "igs-pgm": "IGS PolyGame Master", + "nintendo-playch10": "Nintendo PlayChoice-10", + "nintendo-nss": "Nintendo Super System", + "konami-gv": "Konami GV", + "deco-cassette": "Data East DECO Cassette System", + "super-kaneko-nova": "Kaneko Super Nova System", + "hyper-neogeo64": "SNK Hyper Neo Geo 64", + "sega-megatech": "Sega Mega-Tech", + "sega-megaplay": "Sega Mega Play", +} + +# The ids api/v1/systems.json listed with files and no url (D P2-7). +# Each one links, or stays plain for the reason given. +SYSTEMS_JSON_GAPS = ( + "atom", "bbc-master-128", "bbc-master-et", "cave-story", "dos", + "emerson-arcadia-2001", "fpinball", "mz2000", "mz2500", "mz800", "naomi2", + "neogeo64", "pegasus", "pv1000", "scummvm", "sega-dreamcast-arcade", + "sinclair-zx-spectrum-next", "solarus", "spectravideo", "sunplus-spmp8000", + "tomb-raider-1", "tyrian", "vc4000", "vgmplay", "vm-labs-nuon", "vvvvvv", + "xrick", "zc210", +) +STAYS_PLAIN = { + "emerson-arcadia-2001": "ar_bios.zip is the Arcadia Systems board's, filed with the Saturn", + "fpinball": "scripten.exe, filed with Windows", + "pv1000": "only MAME's software list pv1000.xml", + "vc4000": "only MAME's software list vc4000.xml", + "sega-dreamcast-arcade": "NAOMI, NAOMI 2 and Atomiswave sets, three boards", + "spectravideo": "the SVI ROMs are filed with the MSX", + "vgmplay": "sound chip sets, no board", + "vvvvvv": "SDL's controller database", +} + + +def _reset() -> None: + """Back to the repository's sections and boards, none written.""" + siterender._arcade_source[0] = None + siterender._boards_built[0] = False + siterender._sections_installed[0] = False + siterender.reset_console_pages() + + +def _write_every_board() -> None: + """What the system pages do once they give each board a section.""" + for board in siterender.arcade_boards(): + siterender.record_board_section(board) + + +@unittest.skipUnless((REPO_ROOT / "database.json").exists(), "database.json is not built") +class Boards(unittest.TestCase): + + @classmethod + def setUpClass(cls) -> None: + _reset() + with open(REPO_ROOT / "database.json", encoding="utf-8") as handle: + cls.db = json.load(handle) + _write_every_board() + + @classmethod + def tearDownClass(cls) -> None: + _reset() + + def _copies(self, name: str) -> list[str]: + return self.db["indexes"]["by_name"][name] + + def test_named_boards_exist(self) -> None: + boards = siterender.arcade_boards() + names = set(boards.values()) + for sys_id, name in NAMED_BOARDS.items(): + with self.subTest(sys_id=sys_id): + self.assertEqual(siterender.system_name(sys_id), name) + self.assertIn(name, names) + + def test_every_copy_names_its_board(self) -> None: + """Every copy of a board's set, wherever it is filed: naomi.zip + under Sega > Dreamcast is still NAOMI's.""" + expect = { + "naomi.zip": "sega-naomi", + "awbios.zip": "sammy-atomiswave", + "cpzn1.zip": "capcom-zn1", + "pgm.zip": "igs-pgm", + "playch10.zip": "nintendo-playch10", + "hng64.zip": "hyper-neogeo64", + "taitofx1.zip": "taito-fx1", + } + for name, board in expect.items(): + for sha1 in self._copies(name): + with self.subTest(name=name, path=self.db["files"][sha1]["path"]): + self.assertEqual(siterender.arcade_board(sha1), board) + + def test_no_board(self) -> None: + """neogeo.zip and cd32.zip are the BIOS of machines with a section of + their own. mie.zip and jvs13551.zip are shared device sets.""" + for name in ("neogeo.zip", "cd32.zip", "mie.zip", "jvs13551.zip"): + for sha1 in self._copies(name): + with self.subTest(name=name, path=self.db["files"][sha1]["path"]): + self.assertIsNone(siterender.arcade_board(sha1)) + + def test_slug_contract(self) -> None: + boards = siterender.arcade_boards() + slugs = {siterender.board_slug(board) for board in boards} + self.assertEqual(len(slugs), len(boards), "two boards share a slug") + for board, name in boards.items(): + with self.subTest(board=board): + slug = siterender.board_slug(board) + self.assertTrue(slug) + self.assertEqual(slug, toc_slug(name)) + self.assertEqual( + siterender.console_href(*siterender.system_section(board)), + f"systems/arcade-{slug}.md#{slug}") + + def test_aliases_share_a_board(self) -> None: + """Every id of one board's name leads to one section.""" + pairs = ( + ("sega-atomiswave", "sammy-atomiswave"), + ("zn1-capcom", "capcom-zn1"), + ("naomi2", "sega-naomi2"), + ("neogeo64", "hyper-neogeo64"), + ("zn1-taito", "taito-fx1"), + ("zn1-tecmo", "tecmo-tps"), + ) + for alias, board in pairs: + with self.subTest(alias=alias): + self.assertEqual(siterender.board_slug(alias), siterender.board_slug(board)) + self.assertEqual( + siterender.system_section(alias), siterender.system_section(board)) + + def test_machines_keep_their_section(self) -> None: + self.assertEqual(siterender.system_section("snk-neogeo-mvs"), ("snk", "Neo Geo")) + self.assertEqual(siterender.system_section("sega-hikaru"), ("sega", "Hikaru")) + self.assertEqual(siterender.system_section("arcade"), ("arcade", "Arcade")) + + def test_systems_json_gaps(self) -> None: + plain = sorted(i for i in SYSTEMS_JSON_GAPS if siterender.system_section(i) is None) + self.assertEqual(plain, sorted(STAYS_PLAIN)) + + def test_parents_named_by_the_plan(self) -> None: + expect = { + "dos": ("dos", "DOSBox"), + "scummvm": ("other", "ScummVM"), + "tyrian": ("other", "opentyrian"), + "bbc-master-128": ("other", "beebem"), + } + for sys_id, section in expect.items(): + with self.subTest(sys_id=sys_id): + self.assertEqual(siterender.system_section(sys_id), section) + + +@unittest.skipUnless((REPO_ROOT / "database.json").exists(), "database.json is not built") +class LinksWaitForTheSection(unittest.TestCase): + """A board links once the system pages wrote its section, never to a + page nobody wrote: the build's link check stops on those.""" + + def setUp(self) -> None: + _reset() + self.addCleanup(_reset) + + def test_unwritten_board_stays_plain(self) -> None: + self.assertIsNone(siterender.system_section("igs-pgm")) + self.assertIsNone(siterender.system_section("naomi2")) + self.assertEqual(siterender.console_href("arcade", "IGS PolyGame Master"), + "systems/arcade.md#igs-polygame-master") + + def test_written_board_links_and_takes_its_cards(self) -> None: + siterender.record_board_section("igs-pgm") + self.assertEqual(siterender.system_section("igs-pgm"), + ("arcade", "IGS PolyGame Master")) + self.assertIsNone(siterender.system_section("sega-naomi")) + sha1 = next(s for s, e in json.loads( + (REPO_ROOT / "database.json").read_text(encoding="utf-8"))["files"].items() + if e["path"] == "bios/Arcade/Arcade/pgm.zip") + self.assertEqual(siterender.card_page("bios/Arcade/Arcade/pgm.zip", sha1), + "arcade-igs-polygame-master") + siterender.reset_console_pages() + self.assertIsNone(siterender.system_section("igs-pgm")) + + def test_an_alias_records_its_board(self) -> None: + siterender.record_board_section("sega-atomiswave") + self.assertEqual(siterender.system_section("sammy-atomiswave"), + ("arcade", "Sammy Atomiswave")) + + def test_no_board_refused(self) -> None: + with self.assertRaises(KeyError): + siterender.record_board_section("sony-playstation") + + +class BoardRules(unittest.TestCase): + """The rules on a fixture: the folder decides nothing, a tie is no + board, a machine's own set is no board, contents: rejects a homonym.""" + + def setUp(self) -> None: + tmp_root = REPO_ROOT / "tmp" + tmp_root.mkdir(exist_ok=True) + self._tmp = tempfile.TemporaryDirectory(dir=tmp_root) + self.root = Path(self._tmp.name) + siterender.set_console_sections({("Arcade", "MAME"), ("SNK", "Neo Geo")}) + + def tearDown(self) -> None: + self._tmp.cleanup() + _reset() + + def _zip(self, name: str, crc_member: bytes) -> str: + path = self.root / name + with zipfile.ZipFile(path, "w") as archive: + archive.writestr("rom.bin", crc_member) + return str(path) + + def _install(self, entries: dict[str, list[dict]], files: dict[str, str]) -> None: + """``files``: sha1 -> path. Names are the paths' base names.""" + db = { + "files": {sha1: {"path": path, "name": Path(path).name} for sha1, path in files.items()}, + "indexes": {"by_name": {}, "by_path_suffix": {}}, + } + for sha1, path in files.items(): + db["indexes"]["by_name"].setdefault(Path(path).name, []).append(sha1) + profiles = {key: {"systems": [], "files": rows} for key, rows in entries.items()} + siterender.set_arcade_boards(profiles, db) + + def test_folder_decides_nothing(self) -> None: + self._install( + {"core": [{"name": "pgm.zip", "category": "bios_zip", "system": "igs-pgm"}]}, + {"a" * 40: "bios/Arcade/MAME/pgm.zip", "b" * 40: "bios/Other/x/pgm.zip"}, + ) + self.assertEqual(siterender.arcade_board("a" * 40), "igs-pgm") + self.assertEqual(siterender.arcade_board("b" * 40), "igs-pgm") + + def test_tie_is_no_board(self) -> None: + self._install( + { + "one": [{"name": "dev.zip", "category": "bios_zip", "system": "igs-pgm"}], + "two": [{"name": "dev.zip", "category": "bios_zip", "system": "konami-gv"}], + }, + {"c" * 40: "bios/Arcade/MAME/dev.zip"}, + ) + self.assertIsNone(siterender.arcade_board("c" * 40)) + + def test_majority_wins(self) -> None: + self._install( + { + "one": [{"name": "dev.zip", "category": "bios_zip", "system": "igs-pgm"}], + "two": [{"name": "dev.zip", "category": "bios_zip", "system": "igs-pgm"}], + "three": [{"name": "dev.zip", "category": "bios_zip", "system": "konami-gv"}], + }, + {"c" * 40: "bios/Arcade/MAME/dev.zip"}, + ) + self.assertEqual(siterender.arcade_board("c" * 40), "igs-pgm") + + def test_machine_set_is_no_board(self) -> None: + self._install( + { + "one": [{"name": "neogeo.zip", "category": "bios_zip", "system": "snk-neogeo-mvs"}], + "two": [{"name": "neogeo.zip", "category": "bios_zip", "system": "igs-pgm"}], + }, + {"d" * 40: "bios/Arcade/MAME/neogeo.zip"}, + ) + self.assertIsNone(siterender.arcade_board("d" * 40)) + + def test_contents_reject_a_homonym(self) -> None: + good = self._zip("good.zip", b"good") + other = self.root / "other" + other.mkdir() + bad = str(other / "good.zip") + with zipfile.ZipFile(bad, "w") as archive: + archive.writestr("rom.bin", b"something else") + crc = f"{zipfile.ZipFile(good).getinfo('rom.bin').CRC:08x}" + self._install( + {"core": [{"name": "good.zip", "category": "bios_zip", "system": "igs-pgm", + "contents": [{"name": "rom.bin", "crc32": crc}]}]}, + {"e" * 40: good, "f" * 40: bad}, + ) + # Both copies filed under Arcade, as by_path_suffix records it. + db = siterender._arcade_source[0][1] + db["indexes"]["by_path_suffix"] = { + "Arcade/MAME/good.zip": ["e" * 40], "Arcade/FBNeo/good.zip": ["f" * 40]} + self.assertEqual(siterender.arcade_board("e" * 40), "igs-pgm") + self.assertIsNone(siterender.arcade_board("f" * 40)) + + def test_no_copy_under_arcade_no_section(self) -> None: + """A board with no set under Arcade has no section there to lead to.""" + self._install( + {"core": [{"name": "pgm.zip", "category": "bios_zip", "system": "igs-pgm"}]}, + {"a" * 40: "bios/IGS/PGM/pgm.zip"}, + ) + self.assertIsNone(siterender.arcade_board("a" * 40)) + with self.assertRaises(KeyError): + siterender.record_board_section("igs-pgm") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_source_ref_targets.py b/tests/test_source_ref_targets.py new file mode 100644 index 00000000..53e4f973 --- /dev/null +++ b/tests/test_source_ref_targets.py @@ -0,0 +1,125 @@ +"""Each cited path is one a declared repository holds at its pin. + +Seven profiles cited paths their repositories do not hold. trident wraps +the Panda3DS fork vendored as a submodule, so 3dsTrident holds none of the +emulator sources it cites. pce-emu, uqm and stonesoup wrote their paths from +a subdirectory of the repository (PCE.emu/, sc2/, crawl-ref/), and nesoid +named two Java files without their directory. future-pinball-fploader and +nesoid continue a binary citation with a bare address or library name, +which the pages took for a path of the source repository. The Ryujinx +mirror pages its tree, and read as one page it could not confirm a path. +""" + +from __future__ import annotations + +import sys +import unittest +from pathlib import Path +from unittest import mock + +REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO_ROOT / "scripts")) + +import sitesources # noqa: E402 +import upstream # noqa: E402 +from common import load_emulator_profiles # noqa: E402 +from sourceref import ref_role, source_ref_values, split_source_ref # noqa: E402 + +PROFILES = ("trident", "future-pinball-fploader", "pce-emu", "uqm", "nesoid", + "ryujinx", "stonesoup") + + +class BinaryContinuationsAreNotLinked(unittest.TestCase): + PROFILE = { + "emulator": "future-pinball-fploader", "type": "standalone", + "source": "https://github.com/ravarcade/BAM_FPloader", + "source_commit": "e" * 40, + } + + def tearDown(self): + sitesources._tree_paths.cache_clear() + + def _render(self, value: str) -> str: + original = sitesources._tree_paths + sitesources._tree_paths = lambda repo, pin: None # type: ignore[assignment] + try: + return sitesources._source_ref_markdown(self.PROFILE, value) + finally: + sitesources._tree_paths = original + + def test_an_address_continuing_a_binary_range(self): + text = self._render("BAM.dll 1.5-408 .text:0x100ae843-0x100ae8a7, 0x10037130-0x100371de") + self.assertNotIn("](https://", text) + self.assertIn("`0x10037130-0x100371de`", text) + + def test_a_bare_library_name(self): + text = self._render("DesktopKinect.dll, Kinect.dll import directories") + self.assertNotIn("](https://", text) + + def test_a_source_path_is_still_linked(self): + text = self._render("FPLoader.cpp:259-305") + self.assertIn("](https://github.com/ravarcade/BAM_FPloader/blob/", text) + + +class ForgejoTreesArePaged(unittest.TestCase): + """git.ngram.ca returns 1000 entries a page and the total.""" + + def test_every_page_is_read(self): + repo = upstream.parse_repo("https://git.ngram.ca/mirrors/Ryujinx") + pages = { + 1: [{"type": "blob", "path": f"a/{i}.cs"} for i in range(1000)], + 2: [{"type": "blob", "path": "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs"}, + {"type": "tree", "path": "src"}], + } + + def fake_api(url, cache_dir, offline, *args, **kwargs): + page = int(url.rsplit("&page=", 1)[1]) if "&page=" in url else 1 + return {"tree": pages.get(page, []), "truncated": True, "total_count": 1002} + + with mock.patch.object(upstream, "_api", side_effect=fake_api): + paths, truncated = upstream.list_tree(repo, "7" * 40, "unused") + self.assertFalse(truncated) + self.assertEqual(len(paths), 1001) + self.assertIn("src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs", paths) + + def test_a_github_truncation_stays_final(self): + repo = upstream.parse_repo("https://github.com/o/r") + payload = {"tree": [{"type": "blob", "path": "x"}], "truncated": True} + with mock.patch.object(upstream, "_api", return_value=payload) as api: + paths, truncated = upstream.list_tree(repo, "7" * 40, "unused") + self.assertTrue(truncated) + self.assertEqual(api.call_count, 1) + + +class TheSevenProfilesCiteHeldPaths(unittest.TestCase): + """Read against the cached tree listings, skipped where none is cached.""" + + def test_every_cited_path_is_held(self): + profiles = load_emulator_profiles(str(REPO_ROOT / "emulators"), skip_aliases=False) + missing, checked = [], 0 + for key in PROFILES: + profile = profiles[key] + candidates = sitesources._forge_sources(profile) + values = [e["source_ref"] for e in profile.get("files") or [] + if isinstance(e, dict) and e.get("source_ref")] + values += [d["source_ref"] for d in profile.get("data_directories") or [] + if isinstance(d, dict) and d.get("source_ref")] + for value in values: + for _label, refs in source_ref_values(value): + for part in split_source_ref(refs): + _role, path = ref_role(part.path) + if " " in path or sitesources.is_binary_citation(path): + continue + verdicts = [sitesources.tree_holds(r, p, path) for r, p in candidates] + if None in verdicts: + continue + checked += 1 + if not any(verdicts): + missing.append((key, path)) + if not checked: + raise unittest.SkipTest("no cached tree listings") + self.assertEqual(missing, []) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_upstream.py b/tests/test_upstream.py index f4c5f536..faebdf4c 100644 --- a/tests/test_upstream.py +++ b/tests/test_upstream.py @@ -237,9 +237,11 @@ class TestFetchRetry(unittest.TestCase): self._orig = (urllib.request.urlopen, upstream._sleep) self.slept: list[float] = [] upstream._sleep = self.slept.append + upstream._exhausted_hosts.clear() def tearDown(self): urllib.request.urlopen, upstream._sleep = self._orig + upstream._exhausted_hosts.clear() def _serve(self, outcomes): self.calls = 0 @@ -283,11 +285,50 @@ class TestFetchRetry(unittest.TestCase): self.assertIsNone(upstream._fetch("https://host/x")) self.assertEqual(self.calls, 1) - def test_rate_limit_is_not_retried(self): - self._serve([_http_error(429)]) + @staticmethod + def _limited(retry_after: str | None = None) -> urllib.error.HTTPError: + import email.message # noqa: PLC0415 + + headers = email.message.Message() + if retry_after is not None: + headers["Retry-After"] = retry_after + return _http_error(429, headers) + + def test_rate_limit_is_waited_out(self): + # git.libretro.com answered 429 on cemu's tree a few hundred + # requests into a pass, and the whole pass stopped. + self._serve([self._limited("7"), self._limited(), b"payload"]) + self.assertEqual(upstream._fetch("https://host/x"), b"payload") + self.assertEqual(self.slept, [7.0, upstream.RATE_LIMIT_WAITS[1]]) + + def test_lasting_rate_limit_mutes_the_host_only(self): + self._serve([self._limited()]) + with self.assertRaises(upstream.RateLimitError) as caught: + upstream._fetch("https://host/x") + self.assertEqual(caught.exception.host, "host") + self.assertEqual(self.calls, len(upstream.RATE_LIMIT_WAITS) + 1) + # The same host is not asked again, another one still is. + with self.assertRaises(upstream.RateLimitError): + upstream._fetch("https://host/y") + self.assertEqual(self.calls, len(upstream.RATE_LIMIT_WAITS) + 1) + self._serve([b"other"]) + self.assertEqual(upstream._fetch("https://other/x"), b"other") + + def test_long_retry_after_is_not_waited(self): + self._serve([self._limited(str(int(upstream.RATE_LIMIT_WAIT_CAP) + 1))]) with self.assertRaises(upstream.RateLimitError): upstream._fetch("https://host/x") - self.assertEqual(self.calls, 1) + self.assertEqual((self.calls, self.slept), (1, [])) + + def test_exhausted_github_quota_is_not_waited(self): + import email.message # noqa: PLC0415 + + headers = email.message.Message() + headers["X-RateLimit-Remaining"] = "0" + self._serve([_http_error(403, headers)]) + with self.assertRaises(upstream.RateLimitError): + upstream._fetch("https://host/x") + self.assertEqual((self.calls, self.slept), (1, [])) class TestGoneUpstream(unittest.TestCase): diff --git a/wiki/first-install.md b/wiki/first-install.md index 9b5381b3..f6a62a28 100644 --- a/wiki/first-install.md +++ b/wiki/first-install.md @@ -76,8 +76,13 @@ It shows your setup and its BIOS folder: ``` - **Right folder?** Go on. -- **Wrong folder?** Press Ctrl+C. Run the command again with `--dest` and your - folder. +- **Wrong folder?** Press Ctrl+C. Run the command again with your folder + after `--dest`: + + +```sh +curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --dest ~/path/to/bios +``` ## 3. Choose what to install @@ -115,7 +120,13 @@ Add `--check` to the same command. It changes nothing. curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --check ``` -All good when you see `0 wrong hash`. +All good when every file is present and none is wrong: + +``` + 109/109 present (109 verified, 0 wrong hash) +``` + +An empty folder also shows `0 wrong hash`, with `0/109 present`. ## Undo @@ -127,7 +138,8 @@ BIOS folder. The end of the run prints the line that puts them back. ### No supported platform detected. At a terminal, a menu follows. Pick your setup by its number, then type its -BIOS folder. +BIOS folder, or press Enter for the usual one. A folder pasted with quotes +around it is fine. With `--no-input`, or without a terminal, it stops and prints the command to use. diff --git a/wiki/installer.md b/wiki/installer.md index 5c3b1899..c300b81d 100644 --- a/wiki/installer.md +++ b/wiki/installer.md @@ -544,19 +544,19 @@ what the options name, everything by default. | Option | Effect | |--------|--------| -| `--platform NAME` | Install for this platform instead of the detected one. Unknown names are refused with the available list | +| `--platform NAME` | Install for this platform instead of the detected one. A system `--list-platforms` names under its own files (`muos`, `arkos`) stands for the file list it gets, and the run says which. Unknown names are refused with the closest ones | | `--dest PATH` | Destination directory, overriding detection. Without `--platform`, the file list is the platform detected here: at a terminal the installer asks, Enter taking the one found, and otherwise it uses the one found, RetroArch's when nothing is found, and refuses when several are. The run prints whose list it is. A folder that does not exist is named with the nearest one that does, then created. When more than its last level is missing (a mistyped path), a run at a terminal asks first, and the answer defaults to no | | `--target NAME` | Keep only the files the cores of that hardware target need, and the systems they emulate. An unknown target is refused rather than ignored, since carrying on would install everything. On Batocera, Recalbox, ROCKNIX and Lakka the board is read from the system (`batocera.arch`, `recalbox.arch`, `HW_DEVICE`, `LIBREELEC_DEVICE` or `LIBREELEC_PROJECT`) and applied when no `--target` is given | | `--every-board` | Install the files of every board instead of the one the system names, for a card that moves between devices | | `--installed-cores` | Keep only what the cores already installed read (RetroArch, Lakka, RetroPie). See [Installed cores](#installed-cores) | | `--cores-dir PATH` | The folder RetroArch loads its cores from, for `--installed-cores` when it is not found. Implies `--installed-cores` | | `--save-dir PATH` | The frontend's save directory (RetroArch's `savefile_directory`), for the files some cores read there, when the run cannot find it. The core's own folder is still added below it when the frontend sorts saves by core | -| `--system NAMES` | Install only these systems. Comma-separated or repeated. `--list-systems` prints the names, `other` included | +| `--system NAMES` | Install only these systems. Comma-separated or repeated. `--list-systems` prints the names, `other` included. A short name the platform does not use (`gba`, `psx`) is refused with the ids it may stand for, never taken in their place | | `--core NAMES` | Keep the platform's own list and only the extra files these cores load. `--list-cores` prints the names | | `--emulator NAMES` | Install what these emulators read on the detected platform, and nothing else: their own files and the platform's files of the systems they run. Each emulator page on the site gives this command. `--list-emulators` prints the names, buildbot names such as `mednafen_psx` included | | `--region LIST` | Preferred regions, best first (`us,eu,jp`): keep one BIOS per region where a system has several. Accepts the names and aliases of `generate_pack.py --region` | | `--no-game-data` | Leave out game data (a game's own files, not firmware) and install the firmware only. What it leaves out is named. See [Firmware without game data](#firmware-without-game-data) | -| `--list-systems` | Print a platform's systems with the files and size each holds | +| `--list-systems` | Print a platform's systems with the files and size each holds, the files other systems share too counted apart | | `--list-cores` | Print the cores whose extra files a platform installs | | `--list-emulators` | Print every name `--emulator` accepts, each buildbot name beside the emulator it stands for | | `--romm-firmware TEMPLATE` | RomM: where each platform's firmware goes in the library, as `filesystem.structure.firmware` in RomM's `config.yml` says (`{platform}/bios` for a library laid out as `{platform}/roms`). Read from `config.yml` beside the library when it is there. See [RomM firmware layout](#romm-firmware-layout) | @@ -634,7 +634,7 @@ rewrites both to `/roms2/bios`: a second card is followed through them. | `/mnt/plumos-user` | plumOS | RetroArch | `/mnt/plumos-user/bios`, which its launcher appends to every RetroArch run | | `/etc/os-release` `ID=plumos` without the folder above | plumOS | none | its builds choose a folder per launch: named, not installed to | | `/usr/trimui` | TrimUI | none | no published source names the stock firmware's folder: named, not installed to | -| `/mnt/SDCARD/.system/res` or `/mnt/sdcard/.system/res` | MinUI | none | MinUI, MyMinUI and NextUI give each core its own `Bios//`, a layout not written yet: named, not installed to | +| `/mnt/SDCARD/.system/res` or `/mnt/sdcard/.system/res` | MinUI, NextUI or MyMinUI, as the first line of the card's `.system/version.txt` names it | MinUI, NextUI or MyMinUI | the card root, below which the list writes `Bios//`. Without `version.txt` the three cannot be told apart: named, not installed to, and the message gives `--platform` and `--dest` to use | | `/mnt/vendor/bin/dmenu.bin` | Anbernic stock firmware | RetroArch | `/mnt/mmc/bios` | AmberELEC, EmuELEC and KNULLI install the BIOS list they publish themselves. TheRA is not detected: no @@ -745,9 +745,9 @@ for EmuDeck (`C:\Emulation\bios` on Windows), `/storage/roms/bios` for ROCKNIX, directory for RetroArch. BizHawk has no such folder: it reads `Firmware` beside its executable wherever the archive was extracted, so a forced `--platform bizhawk` that finds no install stops and asks for `--dest`. MinUI, -NextUI and MyMinUI keep their files on the SD card, which the installer reads -from a computer it is mounted on: a forced `--platform minui` stops and asks -for the card's root as `--dest`, and a `--dest` that is a folder inside such a +NextUI and MyMinUI keep their files on the SD card. Run on the device, the +installer finds the card root. From a computer the card is mounted on, a +forced `--platform minui` stops and asks for the card's root as `--dest`, and a `--dest` that is a folder inside such a card (its `Bios/`) is refused with the root to name instead. On Android a forced `--platform retroarch` falls back to `/RetroArch/system` instead, a home directory there belonging to Termux rather than to the frontend. Pass `--dest` to say where instead of @@ -879,9 +879,10 @@ are PortMaster's own, so the port carries no graphics code. - From PortMaster's catalog, once the port is accepted there: open PortMaster, find RetroBIOS under the Other genre, install. -- `RetroBIOS.zip`, attached to each [release](https://github.com/Abdess/retrobios/releases/latest) - cut since the port was added, copied into PortMaster's - autoinstall folder. Starting PortMaster then installs it, with or without a +- `RetroBIOS.zip`, copied into PortMaster's autoinstall folder. The release + process attaches it to each [release](https://github.com/Abdess/retrobios/releases/latest) + cut after the port was added. Releases cut before carry none: when the + latest one lists no `RetroBIOS.zip`, build it from a clone (below). Starting PortMaster then installs it, with or without a network connection. PortMaster's FAQ names the folder: `/roms/ports/PortMaster/autoinstall/` on AmberELEC and ROCKNIX, `/roms/tools/PortMaster/autoinstall/` on ArkOS, `/mmc/MUOS/PortMaster/autoinstall/` on muOS, @@ -1065,8 +1066,8 @@ fields, the installer refuses to narrow rather than install everything. |------|---------| | `0` | everything asked for is installed or already up to date | | `1` | a failure: the one-liner could not download or verify `install.py`, or found no Python 3.8 (nothing was run), an unusable base URL, an unknown platform or target, `--installed-cores` with no core found, a manifest that fails validation, a fetch that never succeeded, no platform to install for in a non-interactive run, some files failed while others installed, `--check` found files to fetch, a `--from-pack` pack that cannot be read, lacks a part or is for another platform, or `--restore` could not put a file back | -| `2` | nothing was installed: every file the run tried failed (a BIOS folder that cannot be written, for one), the drive has too little free space for the download (checked before any folder is created), or the question about a `--dest` folder that does not exist was answered no. Also an option the installer refused before any download: an unknown option, `--jobs` outside 1 to 32, `--target` with `--every-board` or `--from-pack`. The message then starts with `install.py: error:`. With `--restore`, a folder that is not a dated folder inside `retrobios-backup` | -| `130` | stopped with Ctrl+C, or with Ctrl+C or Ctrl+D at a question. Run the same command again to carry on | +| `2` | nothing was installed: every file the run tried failed (a BIOS folder that cannot be written, for one), the drive has too little free space for the download (checked before any folder is created), or the question about a folder that does not exist, named with `--dest` or typed at the folder question, was answered no. Also an option the installer refused before any download: an unknown option, `--jobs` outside 1 to 32, `--target` with `--every-board` or `--from-pack`. The message then starts with `install.py: error:`. With `--restore`, a folder that is not a dated folder inside `retrobios-backup` | +| `130` | stopped with Ctrl+C, or with `q`, Ctrl+C or Ctrl+D at a question. Run the same command again to carry on | | `141` | the output was piped to a reader that closed early (`--list-platforms \| head`) | `install.ps1` passes the installer's code on unchanged: run as a file it exits @@ -1097,9 +1098,9 @@ kind, and each kind has exactly the keys below, in this order. The schema is |------|------|------| | `start` | `schema`, `installer`, `mode` | First line. `schema` is 1, `installer` the identity `--version` prints, `mode` one of `install`, `check`, `dry-run`, `list` | | `detect` | `os`, `os_name`, `platforms` | Once the platforms are known. `os_name` comes from `/etc/os-release`. `platforms` lists `{platform, name, bios_dir}`, and is empty when nothing supported was found | -| `error` | `stage`, `reason`, `platform`, `message` | The file list could not be read (`stage` is `manifest`). `reason` is `network`, `not_found` or `invalid` | +| `error` | `stage`, `reason`, `platform`, `message` | The file list could not be read (`stage` is `manifest`). `reason` is `network`, `not_found` or `invalid`, `clock` when the server's certificate was refused and the system clock reads a date before the installer was written, or `no_ca` when the machine holds no list of trusted certificates (`SSL_CERT_FILE` names one). `message` says it in words | | `file` | `platform`, `dest`, `systems`, `size`, `state` | Each file of the list after the check. `state` is `present` (hash verified), `wrong_hash` or `missing` | -| `system` | `platform`, `system`, `name`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed` | Each system, sorted by id. Files with no system count under `other`. `name` is the platform's own name for it | +| `system` | `platform`, `system`, `name`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed` | Each system, sorted by id, and with `--system` only the systems named. Files with no system count under `other`. `name` is the platform's own name for it | | `check` | `platform`, `name`, `bios_dir`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed`, `data_missing`, `not_installable` | The platform's totals. `data_missing` counts data-tree files to fetch, `not_installable` the files the collection cannot supply | | `download` | `platform`, `files`, `bytes` | Before the downloads start | | `progress` | `files_done`, `files_total`, `bytes_done`, `bytes_total` | At most every half second while bytes arrive | @@ -1121,7 +1122,9 @@ no event at all. A program reads a missing `end` as that case. | `RETROBIOS_INSTALL_URL` | Where the bootstrap fetches `install.py`. HTTPS only | | `RETROBIOS_INSTALL_SHA256` | The SHA-256 the bootstrap requires of that installer, 64 hex characters. When either of these two is set and the fingerprint does not match, the error names the variable instead of suggesting a retry | | `RETROBIOS_BOOTSTRAP` | Set by `install.sh` (`sh`) and `install.ps1` (`ps1`) for the temporary installer they run, so that its hints give back the one-line command rather than `python3 install.py` | -| `NO_COLOR` | Plain text, no colour, even at a terminal. `TERM=dumb` also turns the live progress line off | +| `NO_COLOR` | Plain text, no colour, even at a terminal, when set to any value but an empty one. `TERM=dumb` also turns the live progress line off | +| `FORCE_COLOR`, `CLICOLOR_FORCE` | Colour even when the output is a pipe or a file, set to any value but `0` or an empty one. `NO_COLOR` wins over both, and the progress line stays one line per file | +| `SSL_CERT_FILE`, `SSL_CERT_DIR` | The trusted certificates to check servers with, for a Python that finds none of its own | | `RETROBIOS_PLAIN`, `ACCESSIBLE` | Set to anything but `0`: the questions come line by line, as with `--plain`, instead of the full-screen interface | | `HTTPS_PROXY`, `NO_PROXY` | Honoured for every download through the standard library's default proxy handling: one names the proxy, the other the hosts to reach directly | @@ -1138,6 +1141,19 @@ The installer fetches its manifest, then downloads only the repository or environment. A file that fails three attempts is counted and reported at the end, and the next run fetches only what is still missing. +The reason is said in words: no internet connection or a name that could not +be looked up, a connection that timed out, was refused or was cut, a +certificate that was rejected. `--verbose` adds the text Python gave. Two +causes are not the network and are not retried: + +- `The clock reads 1980-01-01`: a device without a clock battery starts on an + old date, and every certificate then looks not yet valid. Connect to Wi-Fi + and let the time sync, or set the date, then run again. +- `This system has no list of trusted certificates`: install the + `ca-certificates` package, or name a certificate bundle with `SSL_CERT_FILE`. + When the system keeps one where this Python does not look, the message names + it. Certificate checks are never turned off. + ### Permission denied The installer needs to write to the BIOS folder. On Linux and macOS, check who diff --git a/wiki/testing-guide.md b/wiki/testing-guide.md index b8e268ee..82df9eca 100644 --- a/wiki/testing-guide.md +++ b/wiki/testing-guide.md @@ -50,14 +50,14 @@ Every module in `tests/`, by the area it guards. |------|----------|---------| | Core regression suites | synthetic | `test_e2e`, `test_audit_regressions`, `test_tool_messages` | | File resolution and identity | synthetic + collection | `test_adler32_resolution`, `test_agnostic_scan`, `test_agnostic_scan_mode`, `test_agnostic_scope`, `test_agnostic_substitute`, `test_archive_choice`, `test_archive_recipes`, `test_bios_companions`, `test_bundled_identity`, `test_casefold_cache`, `test_db_aliases`, `test_declared_names`, `test_derivations`, `test_directory_entries`, `test_extra_identity`, `test_foreign_tree`, `test_foreign_tree_names`, `test_frontend_digest`, `test_game_data_homonyms`, `test_hashing`, `test_identity`, `test_md5_pack_context`, `test_name_tiebreak`, `test_nec_filing`, `test_owner_resolution`, `test_path_suffix`, `test_resolution_evidence`, `test_sega_filing`, `test_shipped_content`, `test_twin_declarations`, `test_validated_choice`, `test_variant_choice`, `test_variant_identity`, `test_zipped_member` | -| Verification, cross-reference and profile checks | synthetic + profiles | `test_cache_independent_counts`, `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_core_size_refusal`, `test_cross_reference_sources`, `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_entry_categories`, `test_file_consumers`, `test_fileless_audit`, `test_flycast_layout`, `test_gap_settlement`, `test_hidden_extras`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_profile_repositories`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_links`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice`, `test_verify_release_asset` | +| Verification, cross-reference and profile checks | synthetic + profiles | `test_bios_layout`, `test_cache_independent_counts`, `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_core_size_refusal`, `test_cross_reference_sources`, `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_entry_categories`, `test_file_consumers`, `test_fileless_audit`, `test_flycast_layout`, `test_gap_settlement`, `test_hidden_extras`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_profile_repositories`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_links`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice`, `test_verify_release_asset` | | Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_minui_platform`, `test_no_game_data`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_required_only_archives`, `test_required_only_twins`, `test_save_root`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` | | Slots and regions | synthetic + profiles | `test_region`, `test_region_agnostic_scan`, `test_region_groups`, `test_region_held`, `test_region_platform_index`, `test_region_required_only`, `test_slot`, `test_slots`, `test_slots_shipped_file` | | Hardware targets and systems | synthetic + target files | `test_extract_targets`, `test_lakka_targets`, `test_libretro_slugs`, `test_system_ids`, `test_system_selection`, `test_target_names`, `test_target_scrapers`, `test_target_systems`, `test_target_verify` | | Installer and downloads | loopback server | `test_check_release`, `test_download`, `test_install`, `test_install_cores`, `test_install_experience`, `test_install_offline`, `test_install_selection`, `test_install_tui` | | Handheld port | stubbed PortMaster dialogs, fake installer | `test_port` | | Truth and native export | synthetic + cached originals | `test_export_counts`, `test_export_native_layer`, `test_export_report`, `test_exporters`, `test_truth_data_dir_readers`, `test_truth_diff`, `test_truth_layout` | -| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_availability`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_emulator_page`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_picker`, `test_site_platform_hashes`, `test_site_r2_components`, `test_site_r2_css`, `test_site_r2_emulators`, `test_site_r2_entry`, `test_site_r2_gate`, `test_site_r2_nav`, `test_site_r2_p0`, `test_site_r2_reference`, `test_site_r2_systems`, `test_site_r2_wiki`, `test_site_r3_collection`, `test_site_r3_components`, `test_site_r3_css`, `test_site_r3_emulators`, `test_site_r3_entry`, `test_site_r3_nav`, `test_site_r3_p0`, `test_site_r3_reference`, `test_site_r3_systems`, `test_site_r3_wiki`, `test_site_render`, `test_site_system_links`, `test_site_validation`, `test_site_weight`, `test_site_write`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_workflow_paths` | +| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_availability`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_emulator_page`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_picker`, `test_site_platform_hashes`, `test_site_r2_components`, `test_site_r2_css`, `test_site_r2_emulators`, `test_site_r2_entry`, `test_site_r2_gate`, `test_site_r2_nav`, `test_site_r2_p0`, `test_site_r2_reference`, `test_site_r2_systems`, `test_site_r2_wiki`, `test_site_r3_collection`, `test_site_r3_components`, `test_site_r3_css`, `test_site_r3_emulators`, `test_site_r3_entry`, `test_site_r3_nav`, `test_site_r3_p0`, `test_site_r4_p0`, `test_site_r3_reference`, `test_site_r3_systems`, `test_site_r3_wiki`, `test_site_render`, `test_site_system_links`, `test_site_validation`, `test_site_weight`, `test_site_write`, `test_source_ref_targets`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_workflow_paths` | ## Test architecture diff --git a/wiki/troubleshooting.md b/wiki/troubleshooting.md index 14f4ff73..fdbfaeb7 100644 --- a/wiki/troubleshooting.md +++ b/wiki/troubleshooting.md @@ -67,6 +67,8 @@ version. ## If the command fails { #installation-script-fails } - **Network error:** try again once github.com opens. +- **`The clock reads ...`:** the date is wrong. Let it sync over Wi-Fi, or set + it, then run again. - **Permission denied:** do what the message says. It names what to run. - **No setup found:** name it and its folder: