#!/usr/bin/env python

from __future__ import print_function

from hashlib import md5
from os.path import isfile
from collections import OrderedDict
import sys
import zipfile
import xml.etree.ElementTree as elementTree

systems = {

    # ---------- Atari ---------- #
    # https://docs.libretro.com/library/atari800/#bios
    "atari800": { "name": "Atari 800", "biosFiles": [ { "md5": "eb1f32f5d9f382db1bbfb8d7f9cb343a", "file": "bios/ATARIOSA.ROM"},
                                                      { "md5": "4177f386a3bac989a981d3fe3388cb6c", "file": "bios/ATARIOSB.ROM"},
                                                      { "md5": "06daac977823773a3eea3422fd26a703", "file": "bios/ATARIXL.ROM" },
                                                      # The BASIC cart came with all Atari computers. On the XL and XE, it was built-in, so it's required by those models.
                                                      { "md5": "0bac0c6a50104045d902df4503a4c30b", "file": "bios/ATARIBAS.ROM"} ] },

    "atari5200": { "name": "Atari 5200", "biosFiles": [ { "md5": "281f20ea4320404ec820fb7ec0693b38", "file": "bios/5200.rom"    } ] },

    # https://github.com/libretro/libretro-super/blob/master/dist/info/hatari_libretro.info
    "atarist": { "name": "Atari ST", "biosFiles": [ { "md5": "c1c57ce48e8ee4135885cee9e63a68a2", "file": "bios/tos.img"}, # TOS 1.02 US
                            # Atari ST / STf / STfm
                            { "md5": "25789a649faff0a1176dc7d9b98105c0", "file": "bios/tos100fr.img"},
                            { "md5": "c87a52c277f7952b41c639fc7bf0a43b", "file": "bios/tos100uk.img"},
                            { "md5": "d0f682ee6237497004339fb02172638b", "file": "bios/tos100us.img"},

                            { "md5": "a622cc35d8d78703905592dfaa4d2ccb", "file": "bios/tos102de.img"},
                            { "md5": "d6521785627d20c51edc566808a6bf28", "file": "bios/tos102fr.img"},
                            { "md5": "b2a8570de2e850c5acf81cb80512d9f6", "file": "bios/tos102uk.img"},
                            #{ "md5": "c1c57ce48e8ee4135885cee9e63a68a2", "file": "bios/tos102us.img"},

                            { "md5": "41b7dae4e24735f330b63ad923a0bfbc", "file": "bios/tos104de.img"},
                            { "md5": "143343f7b8e0b1162af206fe8f46b002", "file": "bios/tos104es.img"},
                            { "md5": "0087e2707c57efa2106a0aa7576655c0", "file": "bios/tos104fr.img"},
                            #{ "md5": "52248cc70ae48b3050e197e270917130", "file": "bios/tos104nl.img"},
                            #{ "md5": "7c040857bdcfcd7d748ca82205463efa", "file": "bios/tos104se.img"},
                            { "md5": "036c5ae4f885cbf62c9bed651c6c58a8", "file": "bios/tos104uk.img"},
                            { "md5": "736adb2dc835df4d323191fdc8926cc9", "file": "bios/tos104us.img"},

                            # Atari STe
                            { "md5": "992bac38e01633a529121a2a65f0779e", "file": "bios/tos106de.img"},
                            { "md5": "30f69d70fe7c210300ed83f991b12de9", "file": "bios/tos106es.img"},
                            { "md5": "bc7b224d0dc3f0cc14c8897db89c5787", "file": "bios/tos106fr.img"},
                            { "md5": "6033f2b9364edfed321c6931a8181fd2", "file": "bios/tos106uk.img"},
                            { "md5": "a0982e760f9807d82667ff5a69e78f6b", "file": "bios/tos106us.img"},

                            { "md5": "94a75c1c65408d9f974b0463e15a3b11", "file": "bios/tos162de.img"},
                            { "md5": "ed5fbaabe0219092df74c6c14cea3f8e", "file": "bios/tos162fr.img"},
                            #{ "md5": "6f9471098a521214fad1e2c6f2dd3d08", "file": "bios/tos162se.img"},
                            { "md5": "1cbc4f55295e469fc8cd72b7efdea1da", "file": "bios/tos162uk.img"},
                            { "md5": "febb00ba8784798293a7ae709a1dafcb", "file": "bios/tos162us.img"},

                            # Atari Mega STe
                            { "md5": "7aeabdc25f8134590e25643a405210ca", "file": "bios/tos205de.img"},
                            { "md5": "7449b131681f1dfe62ebed1392847057", "file": "bios/tos205es.img"},
                            { "md5": "61b620ad951815a25cb37895c81a947c", "file": "bios/tos205fr.img"},
                            { "md5": "7e87d8fe7e24e0b4c55ad1b7955beae3", "file": "bios/tos205it.img"},
                            #{ "md5": "1c92855316a33faee602b8007f22d2cb", "file": "bios/tos205se.img"},
                            { "md5": "7cdd45b6aac66a21bfb357d9334e46db", "file": "bios/tos205us.img"},

                            { "md5": "0604dbb85928f0598d04144a8b554bbe", "file": "bios/tos206de.img"},
                            { "md5": "b2873004a408b8db36321f98daafa251", "file": "bios/tos206fr.img"},
                            { "md5": "4a0d4f282c3f2a0196681adf88862dd4", "file": "bios/tos206.img"},
                            #{ "md5": "332fe3803a7e20cd625b27a69f07ae69", "file": "bios/tos206ru.img"},
                            #{ "md5": "a7dc40dc5c1086bce1a8f3d44fd29051", "file": "bios/tos206se.img"},
                            { "md5": "e690bec90d902024beed549d22150755", "file": "bios/tos206uk.img"},
                            { "md5": "c9093f27159e7d13ac0d1501a95e53d4", "file": "bios/tos206us.img"},

                            # Atari TT
                            { "md5": "066f39a7ea5789d5afd59dd7b3104fa6", "file": "bios/tos306de.img"},
                            { "md5": "dd1010ec566efbd71047d6c4919feba5", "file": "bios/tos306uk.img"},

                            # Atari Falcon
                            { "md5": "ed2647936ce4bd283c4d7dfd7ae09d1c", "file": "bios/tos400.img"},
                            { "md5": "9e880168d0a004f7f5e852be758f39e4", "file": "bios/tos402.img"},
                            { "md5": "e5ea0f216fb446f1c4a4f476bc5f03d4", "file": "bios/tos404.img"} ] },

    # https://docs.libretro.com/library/beetle_handy/#bios
    "lynx": { "name": "Lynx", "biosFiles": [ { "md5": "fcd403db69f54290b51035d82f835e7b", "file": "bios/lynxboot.img"} ] },

    # ---------- Magnavox and Philips ---------- #
    # https://docs.libretro.com/library/o2em/#bios
    "o2em": { "name": "Odyssey 2", "biosFiles": [ { "md5": "562d5ebf9e030a40d6fabfc2f33139fd", "file": "bios/o2rom.bin" },
                                                  { "md5": "f1071cdb0b6b10dde94d3bc8a6146387", "file": "bios/c52.bin"   } ] },

    "videopacplus": { "name": "Videopac+ G7400", "biosFiles": [ { "md5": "c500ff71236068e0dc0d0603d265ae76", "file": "bios/g7400.bin" },
                                                                { "md5": "279008e4a0db2dc5f1c048853b033828", "file": "bios/jopac.bin" } ] },

    # ---------- Mattel ---------- #
    # https://docs.libretro.com/library/freeintv/#bios
    "intellivision": { "name": "Mattel Intellivision", "biosFiles": [   { "md5": "62e761035cb657903761800f4437b8af", "file": "bios/exec.bin"   },
                                                                        { "md5": "0cd5946c6473e42e8e4c2137785e427f", "file": "bios/grom.bin"   } ] },

    # ---------- NEC ---------- #
    # https://docs.libretro.com/library/beetle_pce_fast/#bios
    "pcengine":   { "name": "PC Engine", "biosFiles":  [ { "md5": "38179df8f4ac870017db21ebcbf53114", "file": "bios/syscard3.pce" } ] },

    # https://docs.libretro.com/library/beetle_pc_fx/#bios
    "pcfx":       { "name": "PC-FX", "biosFiles":      [ { "md5": "08e36edbea28a017f79f8d4f7ff9b6d7", "file": "bios/pcfx.rom"     } ] },

    # https://docs.libretro.com/library/beetle_pce_fast/#bios
    "supergrafx": { "name": "Supergrafx", "biosFiles": [ { "md5": "38179df8f4ac870017db21ebcbf53114", "file": "bios/syscard3.pce" } ] },

    # ---------- SNK ----------#
    "neogeo":   { "name": "NeoGeo", "biosFiles":    [  { "md5": "dffb72f116d36d025068b23970a4f6df", "file": "bios/neogeo.zip" } ] },
    "neogeocd":  { "name": "NeoGeo CD", "biosFiles": [ { "md5": "8834880c33164ccbe6476b559f3e37de", "file": "bios/neocd/neocd_f.rom" },
                                                       { "md5": "043d76d5f0ef836500700c34faef774d", "file": "bios/neocd/neocd_sf.rom" },
                                                       { "md5": "de3cf45d227ad44645b22aa83b49f450", "file": "bios/neocd/neocd_t.rom" },
                                                       { "md5": "f6325a33c6d63ea4b9162a3fa8c32727", "file": "bios/neocd/neocd_st.rom" },
                                                       { "md5": "11526d58d4c524daef7d5d677dc6b004", "file": "bios/neocd/neocd_z.rom" },
                                                       { "md5": "971ee8a36fb72da57aed01758f0a37f5", "file": "bios/neocd/neocd_sz.rom" },
                                                       { "md5": "5c2366f25ff92d71788468ca492ebeca", "file": "bios/neocd/front-sp1.bin" },
                                                       { "md5": "122aee210324c72e8a11116e6ef9c0d0", "file": "bios/neocd/top-sp1.bin" },
                                                       { "md5": "f39572af7584cb5b3f70ae8cc848aba2", "file": "bios/neocd/neocd.bin"},
                                                       { "md5": "08ca8b2dba6662e8024f9e789711c6fc", "file": "bios/neocd/uni-bioscd.rom"} ] },

    # ---------- Sharp ---------- #
    # https://github.com/libretro/libretro-super/blob/master/dist/info/px68k_libretro.info
    "x68000": { "name": "Sharp x68000", "biosFiles": [  { "md5": "7fd4caabac1d9169e289f0f7bbf71d8e", "file": "bios/keropi/iplrom.dat" },
                                                        { "md5": "cb0a5cfcf7247a7eab74bb2716260269", "file": "bios/keropi/cgrom.dat"  } ] },

    # ---------- Panasonic, Sanyo and Goldstar ---------- #
    # https://github.com/libretro/libretro-super/blob/master/dist/info/opera_libretro.info
    "3do":  { "name": "3DO", "biosFiles": [ { "md5": "f47264dd47fe30f73ab3c010015c155b", "file": "bios/panafz1.bin" },
                                            { "md5": "51f2f43ae2f3508a14d9f56597e2d3ce", "file": "bios/panafz10.bin"},
                                            { "md5": "8639fd5e549bd6238cfee79e3e749114", "file": "bios/goldstar.bin"} ] },

    # ---------- Sega ---------- #
    # https://docs.libretro.com/library/flycast/#bios
    "dreamcast":    { "name": "Dreamcast", "biosFiles":   [ { "md5": "e10c53c2f8b90bab96ead2d368858623", "file": "bios/dc_boot.bin"  },
                                                            { "md5": "0a93f7940c455905bea6e392dfde92a4", "file": "bios/dc_flash.bin" } ] },

    # https://github.com/libretro/libretro-super/blob/master/dist/info/flycast_libretro.info
    "naomi":        { "name": "Naomi", "biosFiles":       [ { "md5": "eb4099aeb42ef089cfe94f8fe95e51f6", "file": "bios/dc/naomi.zip"   } ] },

    "atomiswave":   { "name": "Atomiswave", "biosFiles":  [ { "md5": "85254fbe320ca82a768ec2c26bb08def", "file": "bios/dc/awbios.zip"  } ] },

    "segacd":       { "name": "Sega CD", "biosFiles":     [ { "md5": "e66fa1dc5820d254611fdcdba0662372", "file": "bios/bios_CD_E.bin"   },
                                                            { "md5": "854b9150240a198070150e4566ae1290", "file": "bios/bios_CD_U.bin"   },
                                                            { "md5": "278a9397d192149e84e820ac621a8edd", "file": "bios/bios_CD_J.bin"   } ] },

    # https://docs.libretro.com/library/genesis_plus_gx/#bios
    "msu-md":       { "name": "MSU-MD", "biosFiles":      [ { "md5": "e66fa1dc5820d254611fdcdba0662372", "file": "bios/bios_CD_E.bin"   },
                                                            { "md5": "854b9150240a198070150e4566ae1290", "file": "bios/bios_CD_U.bin"   },
                                                            { "md5": "278a9397d192149e84e820ac621a8edd", "file": "bios/bios_CD_J.bin"   } ] },

    # https://docs.libretro.com/library/beetle_saturn/#bios
    # https://github.com/libretro/libretro-super/blob/master/dist/info/yabasanshiro_libretro.info
    "saturn":       { "name": "Sega Saturn", "biosFiles": [ { "md5": "85ec9ca47d8f6807718151cbcca8b964", "file": "bios/sega_101.bin"     },
                                                            { "md5": "3240872c70984b6cbfda1586cab68dbe", "file": "bios/mpr-17933.bin"    },
                                                            { "md5": "255113ba943c92a54facd25a10fd780c", "file": "bios/mpr-18811-mx.ic1" },
                                                            { "md5": "1cd19988d1d72a3e7caa0b73234c96b4", "file": "bios/mpr-19367-mx.ic1" },
                                                            { "md5": "af5828fdff51384f99b3c4926be27762", "file": "bios/saturn_bios.bin" } ] },

    # ---------- Sony Computer Entertainment ---------- #
    # https://docs.libretro.com/library/pcsx_rearmed/#bios
    "psx": { "name": "PSX", "biosFiles": [  { "md5": "c53ca5908936d412331790f4426c6c33", "file": "bios/psxonpsp660.bin" },
                                            { "md5": "6e3735ff4c7dc899ee98981385f6f3d0", "file": "bios/scph101.bin"     },
                                            { "md5": "dc2b9bf8da62ec93e868cfd29f0d067d", "file": "bios/scph1001.bin"    },
                                            { "md5": "8dd7d5296a650fac7319bce665a6a53c", "file": "bios/scph5500.bin"    },
                                            { "md5": "490f666e1afb15b7362b406ed1cea246", "file": "bios/scph5501.bin"    },
                                            { "md5": "32736f17079d0b2b7024407c39bd3050", "file": "bios/scph5502.bin"    },
                                            { "md5": "1e68c231d0896b7eadcad1d7d8e76129", "file": "bios/scph7001.bin"    } ] },

    # https://pcsx2.net/config-guide/official-english-pcsx2-configuration-guide.html#Bios
    # use the last USA bios which can run NTSC and PAL games
    "ps2": { "name": "PS2", "biosFiles": [  { "md5": "21038400dc633070a78ad53090c53017", "file": "bios/ps2/ps2-0230a-20080220.bin" } ] },

    # https://www.playstation.com/en-us/support/system-updates/ps3/
    "ps3": { "name": "PS3", "biosFiles": [  { "md5": "05fe32f5dc8c78acbcd84d36ee7fdc5b", "file": "bios/PS3UPDAT.PUP" } ] },

    # ---------- Nintendo ---------- #
    # https://docs.libretro.com/library/fceumm/#bios
    "fds":         { "name": "Nintendo Family Computer Disk System", "biosFiles": [ { "md5": "ca30b50f880eb660a320674ed365ef7a", "file": "bios/disksys.rom" } ] },

    # https://docs.libretro.com/library/melonds/#bios
    "nds": { "name": "Nintendo DS", "biosFiles": [  { "md5": "", "file": "bios/firmware.bin" }, # ideally - 94bc5094607c5e6598d50472c52f27f2
                                            { "md5": "df692a80a5b1bc90728bc3dfc76cd948", "file": "bios/bios7.bin" },
                                            { "md5": "a392174eb3e572fed6447e956bde4b25", "file": "bios/bios9.bin" },
                                            { "md5": "559dae4ea78eb9d67702c56c1d791e81", "file": "bios/dsi_bios7.bin" },
                                            { "md5": "87b665fce118f76251271c3732532777", "file": "bios/dsi_bios9.bin" },
                                            { "md5": "", "file": "bios/dsi_firmware.bin" }, # ideally - 74f23348012d7b3e1cc216c47192ffeb
                                            { "md5": "", "file": "bios/dsi_nand.bin" } # ideally - d71edf897ddd06bf335feeb68edeb272
                                            ] },

    # https://docs.libretro.com/library/mgba/#bios
    "gba": { "name": "Nintendo Gameboy Advance", "biosFiles": [  { "md5": "a860e8c0b6d573d191e4ec7db1b1e4f6", "file": "bios/gba_bios.bin" },
                                            { "md5": "32fbbd84168d3482956eb3c5051637f5", "file": "bios/gb_bios.bin" }, # Optional
                                            { "md5": "dbfce9db9deaa2567f6a84fde55f9680", "file": "bios/gbc_bios.bin" }, # Optional
                                            { "md5": "d574d4f9c12f305074798f54c091a8b4", "file": "bios/sgb_bios.bin" } ] }, # Optional

    # https://docs.libretro.com/library/snes9x/#bios
    "satellaview": { "name": "Satellaview", "biosFiles": [ { "md5": "96cf17bf589fcbfa6f8de2dc84f19fa2", "file": "bios/BS-X.bin"   } ] },
    "sufami":      { "name": "Sufami", "biosFiles":      [ { "md5": "d3a44ba7d42a74d3ac58cb9c14c6a5ca", "file": "bios/STBIOS.bin" } ] },

    # https://docs.libretro.com/library/mesen-s/#bios
    "sgb": { "name": "Super Game Boy", "biosFiles": [ { "md5": "d574d4f9c12f305074798f54c091a8b4", "file": "bios/sgb_boot.bin" },
                                            { "md5": "e0430bca9925fb9882148fd2dc2418c1", "file": "bios/sgb2_boot.bin" },
                                            { "md5": "b15ddb15721c657d82c5bab6db982ee9", "file": "bios/SGB1.sfc" },
                                            { "md5": "8ecd73eb4edf7ed7e81aef1be80031d5", "file": "bios/SGB2.sfc" } ] },
    # ---------- Microsoft ---------- #
    # https://docs.libretro.com/library/fmsx/#bios
    "msx": { "name": "MSX", "biosFiles": [  { "md5": "364a1a579fe5cb8dba54519bcfcdac0d", "file": "bios/MSX.ROM"      } ] },

    "msx2": { "name": "MSX2", "biosFiles": [ { "md5": "ec3a01c91f24fbddcbcab0ad301bc9ef", "file": "bios/MSX2.ROM"     },
                                            { "md5": "2183c2aff17cf4297bdb496de78c2e8a", "file": "bios/MSX2EXT.ROM"  } ] },

    "msx2+": { "name": "MSX2+", "biosFiles": [ { "md5": "847cc025ffae665487940ff2639540e5", "file": "bios/MSX2P.ROM"    },
                                               { "md5": "7c8243c71d8f143b2531f01afa6a05dc", "file": "bios/MSX2PEXT.ROM" } ] },

    "xbox": { "name": "Xbox", "biosFiles": [{ "md5": "d49c52a4102f6df7bcf8d0617ac475ed", "file": "bios/mcpx_1.0.bin" },
                                            { "md5": "39cee882148a87f93cb440b99dde3ceb", "file": "bios/Complex_4627.bin" }] },

    # ---------- Commodore ---------- #
    # https://github.com/libretro/libretro-super/blob/master/dist/info/puae_libretro.info
    # https://github.com/midwan/amiberry/wiki/Kickstart-ROMs-(BIOS)
    # https://fs-uae.net/docs/kickstarts
    "amiga500": { "name": "Amiga 500",     "biosFiles": [  { "md5": "85ad74194e87c08904327de1a9443b7a", "file": "bios/amiga/kick33180.A500"      },
                                                           { "md5": "dc10d7bdd1b6f450773dfb558477c230", "file": "bios/amiga/kick37175.A500"      },
                                                           { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/amiga/kick34005.A500"      },
                                                           # Amiga 600 kickstart. Not really needed but maybe someone out there will want to switch their model to Amiga 600.
                                                           { "md5": "465646c9b6729f77eea5314d1f057951", "file": "bios/amiga/kick37350.A600"      },
                                                           { "md5": "e40a5dfb3d017ba8779faba30cbd1c8e", "file": "bios/amiga/kick40063.A600"      },
                                                           # The Amiga Forever equivalents. Really are these actually needed? Just so people don't have to rename their stuff?
                                                           { "md5": "85ad74194e87c08904327de1a9443b7a", "file": "bios/amiga/amiga-os-120.rom"    },
                                                           { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/amiga/amiga-os-130.rom"    },
                                                           { "md5": "dc10d7bdd1b6f450773dfb558477c230", "file": "bios/amiga/amiga-os-204.rom"    },
                                                           { "md5": "465646c9b6729f77eea5314d1f057951", "file": "bios/amiga/amiga-os-205.rom"    },
                                                           { "md5": "e40a5dfb3d017ba8779faba30cbd1c8e", "file": "bios/amiga/amiga-os-310-a600.rom" }] },

    "amigacdtv": { "name": "Amiga CDTV",   "biosFiles": [  { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/amiga/kick34005.A500"          },
                                                           { "md5": "89da1838a24460e4b93f4f0c5d92d48d", "file": "bios/amiga/kick34005.CDTV"          },
                                                           # CDTV requires both the Amiga 500 kickstart and its own extended kickstart.
                                                           { "md5": "82a21c1890cae844b3df741f2762d48d", "file": "bios/amiga/amiga-os-130.rom"        },
                                                           { "md5": "89da1838a24460e4b93f4f0c5d92d48d", "file": "bios/amiga/amiga-ext-130-cdtv.rom"  }] },

    "amiga1200": { "name": "Amiga 1200",   "biosFiles": [  { "md5": "b7cc148386aa631136f510cd29e42fc3", "file": "bios/amiga/kick39106.A1200"         },
                                                           { "md5": "646773759326fbac3b2311fd8c8793ee", "file": "bios/amiga/kick40068.A1200"         },
                                                           { "md5": "9bdedde6a4f33555b4a270c8ca53297d", "file": "bios/amiga/kick40068.A4000"         },
                                                           # The Amiga Forever equivalents. a3000 seems to not have a kickstart equivalent. amiga-os-310.rom doesn't match libretro's docs.
                                                           { "md5": "b7cc148386aa631136f510cd29e42fc3", "file": "bios/amiga/amiga-os-300-a1200.rom"  },
                                                           { "md5": "646773759326fbac3b2311fd8c8793ee", "file": "bios/amiga/amiga-os-310-a1200.rom"  },
                                                           { "md5": "413590e50098a056cfec418d3df0212d", "file": "bios/amiga/amiga-os-310-a3000.rom"  },
                                                           { "md5": "9bdedde6a4f33555b4a270c8ca53297d", "file": "bios/amiga/amiga-os-310-a4000.rom"  },
                                                           { "md5": "730888fb1bd9a3606d51f772ed136528", "file": "bios/amiga/amiga-os-310.rom"        }] },

    "amigacd32": { "name": "Amiga CD32",   "biosFiles": [  { "md5": "5f8924d013dd57a89cf349f4cdedc6b1", "file": "bios/amiga/kick40060.CD32"          },
                                                           { "md5": "bb72565701b1b6faece07d68ea5da639", "file": "bios/amiga/kick40060.CD32.ext"      },
                                                           # Unlike the CDTV, CD32 does not need the Amiga 1200 kickstart.
                                                           # But, it has its own unique "base" anyway, which is required in addition to its extended.
                                                           { "md5": "5f8924d013dd57a89cf349f4cdedc6b1", "file": "bios/amiga/amiga-os-310-cd32.rom"   },
                                                           { "md5": "bb72565701b1b6faece07d68ea5da639", "file": "bios/amiga/amiga-ext-310-cd32.rom"  }] },

    # ---------- NEC PC-8800 ---------- #
    # https://github.com/RetroPie/RetroPie-Setup/wiki/PC-8800
    "pc88":       { "name": "NEC PC-8800", "biosFiles": [   { "md5": "4f984e04a99d56c4cfe36115415d6eb8", "file": "bios/quasi88/N88.ROM"     },
                                                            { "md5": "793f86784e5608352a5d7f03f03e0858", "file": "bios/quasi88/N88SUB.ROM"  },
                                                            { "md5": "2ff07b8769367321128e03924af668a0", "file": "bios/quasi88/N88N.ROM"    },
                                                            { "md5": "d81c6d5d7ad1a4bbbd6ae22a01257603", "file": "bios/quasi88/N88KNJ1.ROM"    },
                                                            { "md5": "d675a2ca186c6efcd6277b835de4c7e5", "file": "bios/quasi88/N88EXT0.ROM" },
                                                            { "md5": "e844534dfe5744b381444dbe61ef1b66", "file": "bios/quasi88/N88EXT1.ROM" },
                                                            { "md5": "6548fa45061274dee1ea8ae1e9e93910", "file": "bios/quasi88/N88EXT2.ROM" },
                                                            { "md5": "fc4b76a402ba501e6ba6de4b3e8b4273", "file": "bios/quasi88/N88EXT3.ROM" } ] },

    # ---------- NEC PC-9800 ---------- #
    # https://github.com/RetroPie/RetroPie-Setup/wiki/PC-9800#bios
    "pc98":       { "name": "NEC PC-9800", "biosFiles": [   { "md5": "e246140dec5124c5e404869a84caefce", "file": "bios/np2kai/BIOS.ROM" },
                                                            { "md5": "2af6179d7de4893ea0b705c00e9a98d6", "file": "bios/np2kai/FONT.ROM" },
                                                            { "md5": "caf90f22197aed6f14c471c21e64658d", "file": "bios/np2kai/SOUND.ROM"},
                                                            { "md5": "e9fc3890963b12cf15d0a2eea5815b72", "file": "bios/np2kai/ITF.ROM"  },
                                                            { "md5": "7da1e5b7c482d4108d22a5b09631d967", "file": "bios/np2kai/font.bmp" } ] },
    # ---------- Fairchild ChannelF ---------- #
    # https://github.com/libretro/FreeChaF/blob/master/README.md#bios
    "channelf":  { "name": "Fairchild ChannelF", "biosFiles": [   { "md5": "ac9804d4c0e9d07e33472e3726ed15c3", "file": "bios/sl31253.bin" },
                                                                   { "md5": "da98f4bb3242ab80d76629021bb27585", "file": "bios/sl31254.bin" },
                                                                   { "md5": "95d339631d867c8f1d15a5f2ec26069d", "file": "bios/sl90025.bin" } ] },
    # ---------- Sharp X1 ---------- #
    # https://github.com/libretro/xmil-libretro/blob/master/README.MD
    "x1":  { "name": "Sharp X1", "biosFiles": [   { "md5": "eeeea1cd29c6e0e8b094790ae969bfa7", "file": "bios/xmil/IPLROM.X1" },
                                                  { "md5": "56c28adcf1f3a2f87cf3d57c378013f5", "file": "bios/xmil/iplrom.x1t" } ] },

    # ---------- Fujistu FM-Towns ---------- #
    # https://github.com/captainys/TOWNSEMU
    "fmtowns":  { "name": "Fujistu FM-Towns", "biosFiles": [  { "md5": "8fa4e553f28cfc0c30a0a1e589799942", "file": "bios/fmtowns/FMT_DIC.ROM" },
                                  { "md5": "0585b19930d4a7f4c71bcc8a33746588", "file": "bios/fmtowns/FMT_DOS.ROM" },
                                  { "md5": "ac0c7021e9bf48ca84b51ab651169a88", "file": "bios/fmtowns/FMT_F20.ROM" },
                                  { "md5": "b91300e55b70227ce98b59c5f02fa8dd", "file": "bios/fmtowns/FMT_FNT.ROM" },
                                  { "md5": "86fb6f7280689259f0ca839dd3dd6cde", "file": "bios/fmtowns/FMT_SYS.ROM" },
                                  { "md5": "", "file": "bios/fmtmarty.zip" },
                                  { "md5": "6618519b2c104cf9b7e71a48381b44a9", "zippedFile": "mrom.m36", "file": "bios/fmtmarty.zip"},
                                  { "md5": "75a5c7afb4bc8221bab8cf24db417950", "zippedFile": "mrom.m37", "file": "bios/fmtmarty.zip"},
                                  { "md5": "", "file": "bios/fmtowns.zip" },
                                  { "md5": "34847786d7de94b5d1133c956ab1d75d", "zippedFile": "fmt_dic.rom", "file": "bios/fmtowns.zip"},
                                  { "md5": "0585b19930d4a7f4c71bcc8a33746588", "zippedFile": "fmt_dos.rom", "file": "bios/fmtowns.zip"},
                                  { "md5": "eb44f2093f51eb7159f03e170b13af76", "zippedFile": "fmt_fnt.rom", "file": "bios/fmtowns.zip"},
                                  { "md5": "feaf8c5675151e00cfe3ad27673bff29", "zippedFile": "fmt_sys.rom", "file": "bios/fmtowns.zip"},
                                  { "md5": "", "file": "bios/fmtownsux.zip" },
                                  { "md5": "8fa4e553f28cfc0c30a0a1e589799942", "zippedFile": "fmt_dic.rom", "file": "bios/fmtownsux.zip"},
                                  { "md5": "03c8fac9a5f5f5f35fb5de5a5d0d018f", "zippedFile": "fmt_dos_a.rom", "file": "bios/fmtownsux.zip"},
                                  { "md5": "b91300e55b70227ce98b59c5f02fa8dd", "zippedFile": "fmt_fnt.rom", "file": "bios/fmtownsux.zip"},
                                  { "md5": "90b5e01d42aaa93e8f4503a5e94e120b", "zippedFile": "fmt_sys_a.rom", "file": "bios/fmtownsux.zip"},
                                  { "md5": "1a15f6c1b58ec7e5f850118610a787a7", "zippedFile": "mytownsux.rom", "file": "bios/fmtownsux.zip"} ] },

    # ---------- GamePark GP32 ---------- #
    "gp32":  { "name": "GamePark GP32", "biosFiles": [  { "md5": "", "file": "bios/gp32.zip" },
                                  { "md5": "e64ad881b5e1d86547f2edc3034946d9", "zippedFile": "x2c32.jed", "file": "bios/gp32.zip"},
                                  { "md5": "f78092f15f6ffe15975901ee4e92c680", "zippedFile": "gp32166m.bin", "file": "bios/gp32.zip"},
                                  { "md5": "19021cc891119c0872d46e87fc0ffe35", "zippedFile": "gp32157e.bin", "file": "bios/gp32.zip"},
                                  { "md5": "1e4d3216719acea231b81dfcf6069aef", "zippedFile": "gp32156k.bin", "file": "bios/gp32.zip"},
                                  { "md5": "cac4b56c0db80922cae75403faef40af", "zippedFile": "gp32100k.bin", "file": "bios/gp32.zip"},
                                  { "md5": "d4af2bc352bdaf4972ea40902feda114", "zippedFile": "gp32mfv2.bin", "file": "bios/gp32.zip"} ] },

    # ---------- VTech Laser 310 ---------- #
    "laser310":  { "name": "VTech Laser 310", "biosFiles": [  { "md5": "", "file": "bios/laser310.zip" },
                                  { "md5": "42c8f9e6c2133ae0e953b89ccbbdb7e2", "zippedFile": "vtechv20.u12", "file": "bios/laser310.zip"},
                                  { "md5": "f7e5d9a3eb2b57bf5f4e2a4565318a8f", "zippedFile": "vtechv21.u12", "file": "bios/laser310.zip"} ] },


    # ---------- Future Pinball ---------- #
    "fpinball":   { "name": "Future Pinball", "biosFiles":  [ { "md5": "65a8ebf870420316a939ac44fd4c731d", "file": "bios/wsh57/scripten.exe"  } ] },

    # ---------- Super Cassette Vision ---------- #
    "scv":   { "name": "Super Cassette Vision", "biosFiles":  [ { "md5": "635a978fd40db9a18ee44eff449fc126", "file": "bios/upd7801g.s01"  } ] },

    # ---------- Apple 2 GS ---------- #
    "gsplus":   { "name": "Apple 2 GS", "biosFiles":  [ { "md5": "20a0334c447cb069a040ae5be1d938df", "file": "bios/ROM1"  } ] },

    # ---------- Zelda Classic ---------- #
    "zc210":   { "name": "Zelda Classic", "biosFiles":  [ { "md5": "033d7392985841027909c4c32b9f2076", "file": "bios/zc210/zcdata.dat"  },
                                                          { "md5": "39e5bc84ce9aac3a2d297d8aeb2a0d05", "file": "bios/zc210/sf2/default.sf2" },
                                                          { "md5": "e0ba7a8634b12cfee4b6760a6f89051a", "file": "bios/zc210/sf2/custom0.sf2" },
                                                          { "md5": "c1dc781c34cff8f9a023c0192754dc6c", "file": "bios/zc210/sf2/custom1.sf2" },
                                                          { "md5": "144fcdbb6a30f1f916f6963006c2da97", "file": "bios/zc210/sf2/custom2.sf2" },
                                                          { "md5": "134d217fb99c3be1e89cfaf8f28280d8", "file": "bios/zc210/sf2/custom3.sf2" },
                                                          { "md5": "b37366199c6df9ee5316f031755aa821", "file": "bios/zc210/sf2/custom4.sf2" },
                                                          { "md5": "64068b84eb88dc85b75148bbe9b393fb", "file": "bios/zc210/sf2/custom5.sf2" },
                                                          { "md5": "1241986de5b1d00b02d34f1e6651a1d1", "file": "bios/zc210/sf2/custom6.sf2" },
                                                          { "md5": "386db0d538f372a9f1af622d1e934abf", "file": "bios/zc210/sf2/custom7.sf2" },
                                                          { "md5": "6f68e4baf89c8ee4623c19617319184b", "file": "bios/zc210/sf2/custom8.sf2" },
                                                          { "md5": "2010e5b85f9e1d60685ccb3d84a17115", "file": "bios/zc210/sf2/custom9.sf2" },
                                                          { "md5": "e0ba7a8634b12cfee4b6760a6f89051a", "file": "bios/zcsf.sf2" } ] },
    # ---------- Apple Mac ---------- #
    "macintosh":   { "name": "Apple Macintosh", "biosFiles":  [ { "md5": "66223be1497460f1e60885eeb35e03cc", "file": "bios/MacII.ROM", "emulator": "libretro", "core": "minivmac" },
                                                  { "md5": "2a8a4c7f2a38e0ab0771f59a9a0f1ee4", "file": "bios/MacIIx.ROM", "emulator": "libretro", "core": "minivmac" },
                                                  { "md5": "", "file": "bios/mac128k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "bc04a4252ee96826c1f41f927c145225", "zippedFile": "342-0220-a.u6d", "file": "bios/mac128k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "409d8b9a04db15b7bfbbd5fcb931bf2e", "zippedFile": "342-0221-a.u8d", "file": "bios/mac128k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mackbd_m0110.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "9d09a9a51c9ef3ea5719e19db22e7901", "zippedFile": "ip8021h_2173.bin", "file": "bios/mackbd_m0110.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mackbd_m0120.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "9d09a9a51c9ef3ea5719e19db22e7901", "zippedFile": "ip8021h_2173.bin", "file": "bios/mackbd_m0120.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mac512k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "b4118b89fa68a913a225f0cf9a751fae", "zippedFile": "342-0220-b.u6d", "file": "bios/mac512k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "ab4e461833e98ef7106f24455a07769d", "zippedFile": "342-0221-b.u8d", "file": "bios/mac512k.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "1467a42dee57ac265d063b3f351189fc", "zippedFile": "342-0341-a.u6d", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "25b1bf85b3b072d957499cef4d7e313f", "zippedFile": "342-0341-b.u6d", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "cf7c3259844245a8967556fa40d81243", "zippedFile": "342-0341-c.u6d", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "d5584762b43a9b1cb24a981f9b9b4198", "zippedFile": "342-0342-a.u8d", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "f83069fd7ff1fb011958f819cbff4c88", "zippedFile": "342-0342-b.u8d", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "875919e2544644cd628f44b5c11db036", "zippedFile": "modplus-harp2.bin", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "efcefe8f11c10541a503d48a07878201", "zippedFile": "rominator-20150225-hi.bin", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "f4b06da98500df0747a764dfbf1862b9", "zippedFile": "rominator-20150225-lo.bin", "file": "bios/macplus.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macse.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "9fb38bdcc0d53d9d380897ee53dc1322", "zippedFile": "macse.rom", "file": "bios/macse.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macclasc.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "c229bb677cb41b84b780c9e38a09173e", "zippedFile": "341-0813__=c=1983-90_apple__japan__910d_d.27c4096_be.ue1", "file": "bios/macclasc.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mac2fdhd.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "2a8a4c7f2a38e0ab0771f59a9a0f1ee4", "zippedFile": "97221136.rom", "file": "bios/mac2fdhd.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/nb_mdc824.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "7500a6a958247ee6e092f08715f2fff8", "zippedFile": "3410868.bin", "file": "bios/nb_mdc824.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/maciix.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "2a8a4c7f2a38e0ab0771f59a9a0f1ee4", "zippedFile": "97221136.rom", "file": "bios/maciix.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/maclc3.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "fa16d49527c4e6e9c0d9e46904133d39", "zippedFile": "ecbbc41c.rom", "file": "bios/maclc3.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mackbd_m0110a.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "9e8ea1552153c5e0f895e247e7d3ec1c", "zippedFile": "341-0332-a.bin", "file": "bios/mackbd_m0110a.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/nb_image.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "93155ac7bad0fec36837252bb1e408f2", "zippedFile": "nb_fake.bin", "file": "bios/nb_image.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/egret.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "96665499f5cf2bb5b4aae6fdaf0a9fb5", "zippedFile": "341s0850.bin", "file": "bios/egret.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "b955ecbdf6d2f979f3683dd1d6884643", "zippedFile": "341s0851.bin", "file": "bios/egret.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "5035d321c5d5fa1eab5ce6bf986676e4", "zippedFile": "344s0100.bin", "file": "bios/egret.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/adbmodem.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "862b8598cecdbc934658c4cb599a8142", "zippedFile": "342s0440-b.bin", "file": "bios/adbmodem.zip", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macos3.img", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macos608.img", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macos701.img", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/macos75.img", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mac608.chd", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mac701.chd", "emulator": "libretro", "core": "mame" },
                                                  { "md5": "", "file": "bios/mac755.chd", "emulator": "libretro", "core": "mame" } ] },

    # ---------- Tandy Color Conputer ---------- #
    "coco":   { "name": "Tandy Color Computer", "biosFiles":  [ { "md5": "", "file": "bios/coco.zip"  },
                                                { "md5": "a74f3d95b395dad7cdca19d560eeea74", "zippedFile": "bas10.rom", "file": "bios/coco.zip"},
                                                { "md5": "", "file": "bios/coco2.zip" },
                                                { "md5": "c933316c7d939532a13648850c1c2aa6", "zippedFile": "bas12.rom", "file": "bios/coco2.zip"},
                                                { "md5": "21070aa0496142b886c562bf76d7c113", "zippedFile": "extbas11.rom", "file": "bios/coco2.zip"},
                                                { "md5": "", "file": "bios/coco2b.zip"  },
                                                { "md5": "c2fc43556eb6b7b25bdf5955bd9df825", "zippedFile": "bas13.rom", "file": "bios/coco2b.zip"},
                                                { "md5": "21070aa0496142b886c562bf76d7c113", "zippedFile": "extbas11.rom", "file": "bios/coco2.zip"},
                                                { "md5": "", "file": "bios/coco3.zip"  },
                                                { "md5": "7233c6c429f3ce1c7392f28a933e0b6f", "zippedFile": "coco3.rom", "file": "bios/coco3.zip"},
                                                { "md5": "", "file": "bios/coco3p.zip"  },
                                                { "md5": "4ae57e5a8e7494e5485446fefedb580b", "zippedFile": "coco3p.rom", "file": "bios/coco3p.zip"},
                                                { "md5": "", "file": "bios/coco_fdc_v11.zip"  },
                                                { "md5": "8cab28f4b7311b8df63c07bb3b59bfd5", "zippedFile": "disk11.rom", "file": "bios/coco_fdc_v11.zip"} ] },

    # ---------- Tomy Tutor ---------- #
    "tutor":   { "name": "Tomy Tutor", "biosFiles":  [ { "md5": "", "file": "bios/tutor.zip"  },
                                                { "md5": "196ba41dd1184fe754390534cc273116", "zippedFile": "tutor1.bin", "file": "bios/tutor.zip"},
                                                { "md5": "5770834c10946ac2c3617504ba530884", "zippedFile": "tutor2.bin", "file": "bios/tutor.zip"} ] },

    # ---------- TI-99 ---------- #
    "ti99":   { "name": "Texas Instruments TI-99", "biosFiles":  [ { "md5": "", "file": "bios/ti99_4a.zip"  },
                                                { "md5": "9bb51dfab49b9a7cf832cc1fb6f203e6", "zippedFile": "994a_grom0.u500", "file": "bios/ti99_4a.zip"},
                                                { "md5": "7f1864c3dac31c86e2ae6ce43ccead07", "zippedFile": "994a_grom1.u501", "file": "bios/ti99_4a.zip"},
                                                { "md5": "a1f77a07243a334e13509a89bff944f2", "zippedFile": "994a_grom2.u502", "file": "bios/ti99_4a.zip"},
                                                { "md5": "6f495eef767b3f2821a2ec32d0047891", "zippedFile": "994a_rom_hb.u610", "file": "bios/ti99_4a.zip"},
                                                { "md5": "0dcb961cf84c69b2171a565427c7c6c7", "zippedFile": "994a_rom_lb.u611", "file": "bios/ti99_4a.zip"},
                                                { "md5": "", "file": "bios/ti99_speech.zip"  },
                                                { "md5": "491c1195f6345cb6b725096b69d81ec9", "zippedFile": "cd2325a.u2a", "file": "bios/ti99_speech.zip"},
                                                { "md5": "206daf498ac5d0141de1d47d38afd899", "zippedFile": "cd2326a.u2b", "file": "bios/ti99_speech.zip"} ] },

    # ---------- Bally Astrocade ---------- #
    "astrocde":   { "name": "Bally Astrocade", "biosFiles":  [ { "md5": "", "file": "bios/astrocde.zip"  },
                                                { "md5": "7d25a26e5c4841b364cfe6b1735eaf03", "zippedFile": "astro.bin", "file": "bios/astrocde.zip"}, ] },

    # ---------- Game Master ---------- #
    "gmaster":   { "name": "Hartung Game Master", "biosFiles":  [ { "md5": "", "file": "bios/gmaster.zip"  },
                                                { "md5": "6bff08b5e5f96de405cd56d5f04a08f8", "zippedFile": "d78c11agf_e19.u1", "file": "bios/gmaster.zip"}, ] },

    # ---------- Coleco Adam ---------- #
    "adam":   { "name": "Coleco Adam", "biosFiles":  [ { "md5": "", "file": "bios/adam.zip"  },
                                                { "md5": "01bba3bcd46d8a586dd6ec555accc133", "zippedFile": "alf @1 rev 57 e3d5.u8", "file": "bios/adam.zip"},
                                                { "md5": "feabe33e8f2dab88da1458b4d27f3faa", "zippedFile": "alf @2 rev 57 ae6a.u20", "file": "bios/adam.zip"},
                                                { "md5": "a720bc872a772ed471fac14e36ec8bcb", "zippedFile": "alf @3 rev 57 8534.u21", "file": "bios/adam.zip"},
                                                { "md5": "cf10b154f2e006a9740d7653cfc47cab", "zippedFile": "eos 6 rev 57 08dd.u22", "file": "bios/adam.zip"},
                                                { "md5": "7916bb9635d502366326ec39aea5fc89", "zippedFile": "master rev a 174b.u6", "file": "bios/adam.zip"},
                                                { "md5": "2c66f5911e5b42b8ebe113403548eee7", "zippedFile": "os7.u2", "file": "bios/adam.zip"},
                                                { "md5": "4fe4f6800076ea3d897d4285653447bd", "zippedFile": "wp_r80.rom", "file": "bios/adam.zip"},
                                                { "md5": "", "file": "bios/adam_ddp.zip" },
                                                { "md5": "0423e9e9bf5036aa1e9d656b6a1f842c", "zippedFile": "tape rev a 8865.u24", "file": "bios/adam_ddp.zip"},
                                                { "md5": "", "file": "bios/adam_fdc.zip" },
                                                { "md5": "ae12d0b83832b059cb6cb43029bbfdb3", "zippedFile": "1440k micro innovations hd-dd.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "4c38a7df1e645c8d9f417bf7165c46d0", "zippedFile": "320ta.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "afea14c826f3cfbc89b76725a4a41951", "zippedFile": "a720dipi 7607 mmsg =c= 1988.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "976d2a7d85319d9104bc9ec176fbfa9c", "zippedFile": "adam disk u10 ad 31 rev a 09-27-84.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "29569dc029e95e48907b3c81d636987f", "zippedFile": "dbl2-4.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "a121855c20a638429bbfcf0448349515", "zippedFile": "doug.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "e05ababa16e2d5cb92b678cb6e6e2004", "zippedFile": "fastpack 720a,t.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "a1a2a353dea4b8769a2da733822abfdc", "zippedFile": "pmhdfdc.u10", "file": "bios/adam_fdc.zip"},
                                                { "md5": "", "file": "bios/adam_kb.zip" },
                                                { "md5": "d81e0b2bb6b98999541c5f40b489e88f", "zippedFile": "keyboard.u2", "file": "bios/adam_kb.zip"},
                                                { "md5": "", "file": "bios/adam_prn.zip" },
                                                { "md5": "3cdf2fe48ac4224b56f26c03f6c68982", "zippedFile": "printer.u2", "file": "bios/adam_prn.zip"}, ] },

     # ---------- BBC Micro ---------- #
    "bbc":   { "name": "BBC Micro", "biosFiles":  [ { "md5": "", "file": "bios/bbcb.zip"  },
                                                { "md5": "521a197d3623682825f1042c1350feb4", "zippedFile": "basic1.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "2cc67be4624df4dc66617742571a8e3d", "zippedFile": "basic2.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "0cad3d0cf0d111aca2b158b9b605913f", "zippedFile": "os01.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "46f920a170e88bab7faa96cf80b84324", "zippedFile": "os092.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "0199bac73f1dbca291582834a3e61122", "zippedFile": "os10.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "0a59a5ba15fe8557b5f7fee32bbd393a", "zippedFile": "os12.rom", "file": "bios/bbcb.zip"},
                                                { "md5": "35e9ab10bcf016bd24b4c716add009b9", "zippedFile": "phroma.bin", "file": "bios/bbcb.zip"},
                                                { "md5": "", "file": "bios/bbc_acorn8271.zip"  },
                                                { "md5": "803530149c274994fabc6d28cbe03679", "zippedFile": "dfs090.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "5a3ddfae96178e025f27bf1f69bfa629", "zippedFile": "dfs098.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "d636ffb7a80fc29b133d32e4250fbab6", "zippedFile": "dnfs100.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "5daed103918277e2065dd7e8d23e57a5", "zippedFile": "dnfs120.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "79b31feacab0b1ccddf358be5dfb6241", "zippedFile": "wedfs130.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "24458ace9566a01d255bca16b46a960d", "zippedFile": "wedfs141.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "6e9356d0a5e7fbabb386824ec370d6f3", "zippedFile": "wedfs142.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "990b8a9755af25452c85f23ceb344be4", "zippedFile": "wedfs143.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "1d250b0242e447e9106e8bfd1f27ea84", "zippedFile": "wedfs144.rom", "file": "bios/bbc_acorn8271.zip"},
                                                { "md5": "", "file": "bios/saa5050.zip"  },
                                                { "md5": "8b3c10a2317808ed94d6c6073b5b3327", "zippedFile": "saa5050", "file": "bios/saa5050.zip"},
                                                { "md5": "", "file": "bios/bbc_tube_80186.zip"  },
                                                { "md5": "33d097349f12526584fcac21eccf3012", "zippedFile": "m512_hi_ic32.rom", "file": "bios/bbc_tube_80186.zip"},
                                                { "md5": "e6e84221c29b5d31d07055039583c8e7", "zippedFile": "m512_lo_ic31.rom", "file": "bios/bbc_tube_80186.zip"},
                                                { "md5": "", "file": "bios/bbcm.zip"  },
                                                { "md5": "b159012f9f301bab33316fd3bf55db79", "zippedFile": "mos320.cmos", "file": "bios/bbcm.zip"},
                                                { "md5": "fed079c5e2c595b354529a8ea703b5fb", "zippedFile": "mos320.ic24", "file": "bios/bbcm.zip"},
                                                { "md5": "ca0527f13f83bc95ef4b6833ee440afa", "zippedFile": "mos329.ic24", "file": "bios/bbcm.zip"},
                                                { "md5": "ee9fc46252b7d7fe341b9c7f92575099", "zippedFile": "mos350.cmos", "file": "bios/bbcm.zip"},
                                                { "md5": "3f3dd4614db30f6e383794731272076a", "zippedFile": "mos350.ic24", "file": "bios/bbcm.zip"},
                                                { "md5": "", "file": "bios/bbcmc.zip"  },
                                                { "md5": "55586a88477505d8fd28edfae646e2e3", "zippedFile": "mos500.ic49", "file": "bios/bbcmc.zip"},
                                                { "md5": "956bf71da840943050836ade2474ef7b", "zippedFile": "mos510.ic49", "file": "bios/bbcmc.zip"},
                                                { "md5": "", "file": "bios/bbc_bitstik1.zip"  },
                                                { "md5": "baf5cb5564ff6e6b4400243e7612f323", "zippedFile": "bitstik1.rom", "file": "bios/bbc_bitstik1.zip"},
                                                { "md5": "", "file": "bios/bbc_bitstik2.zip"  },
                                                { "md5": "c196c145b3de630f85f625ca762e5504", "zippedFile": "bitstik2.rom", "file": "bios/bbc_bitstik2.zip"},
                                                { "md5": "", "file": "bios/mame/samples/bbc.zip"  },
                                                { "md5": "", "zippedFile": "motoroff.wav", "file": "bios/mame/samples/bbc.zip"},
                                                { "md5": "", "zippedFile": "motoron.wav", "file": "bios/mame/samples/bbc.zip"} ] },

    # ---------- APF M-1000 ---------- #
    "apfm1000":   { "name": "APF M-1000", "biosFiles":  [ { "md5": "", "file": "bios/apfm1000.zip"  },
                                                { "md5": "1f4a976350202ee1e32c2b0477c3fc1b", "zippedFile": "apf_4000.rom", "file": "bios/apfm1000.zip"},
                                                { "md5": "b325543b36d37edf3fc20761f00c7a37", "zippedFile": "mod_bios.bin", "file": "bios/apfm1000.zip"},
                                                { "md5": "89a7cfa5469ce24773721d65b28f8544", "zippedFile": "trash-ii.bin", "file": "bios/apfm1000.zip"} ] },

    # ---------- Fujitsu FM-7 ---------- #
    "fm7":   { "name": "Fujitsu FM-7", "biosFiles":  [ { "md5": "", "file": "bios/fm7.zip"  },
                                                { "md5": "9f9b7d5615ecdbde2cd26e9306ffef13", "zippedFile": "boot_bas.rom", "file": "bios/fm7.zip"},
                                                { "md5": "18a461ccaf7ef4e8ecad58cecd3a24b3", "zippedFile": "boot_dos_a.rom", "file": "bios/fm7.zip"},
                                                { "md5": "6a5da0404b7ee338df9002cdcabc3068", "zippedFile": "fbasic300.rom", "file": "bios/fm7.zip"},
                                                { "md5": "a330817f8f7ced752a7bcc8dfba8fd2e", "zippedFile": "kanji.rom", "file": "bios/fm7.zip"},
                                                { "md5": "d19ed5923aaae2ec43dffe7a0daa80cb", "zippedFile": "subsys_c.rom", "file": "bios/fm7.zip"},
                                                { "md5": "", "file": "bios/fm77av.zip" },
                                                { "md5": "71c96a45b78e88a39cb94c1aabd23d8a", "zippedFile": "fbasic30.rom", "file": "bios/fm77av.zip"},
                                                { "md5": "e0f4c0ebee60aee83e863826e59ae1de", "zippedFile": "initiate.rom", "file": "bios/fm77av.zip"},
                                                { "md5": "ae945a6dfb642b0a5d0529737e8ee5cd", "zippedFile": "subsys_a.rom", "file": "bios/fm77av.zip"},
                                                { "md5": "fb83a1a9725c8432acef0c3ce89492e3", "zippedFile": "subsys_b.rom", "file": "bios/fm77av.zip"},
                                                { "md5": "7db27dede3e358017d518101850bccfa", "zippedFile": "subsyscg.rom", "file": "bios/fm77av.zip"} ] },

    # ---------- Acorn Archimedes ---------- #
    "archimedes":   { "name": "Acorn Archimedes", "biosFiles":  [ { "md5": "", "file": "bios/aa310.zip"  },
                                                { "md5": "374e4bcaa04cb98aad3b64a1555c3930", "zippedFile": "0270,251-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "b0b6a83029b6f85bb044bfc46bf3f0f6", "zippedFile": "0270,252-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "bf35bb799aa0278b7ee7719dd32f26bc", "zippedFile": "0270,253-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "e41af081535aae930d68ee4cbd672513", "zippedFile": "0270,254-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "7ecdccd760557ab0711edb37773faeb6", "zippedFile": "0270,601-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "c43bad04862ea03146ff5bf7441a1a24", "zippedFile": "0270,602-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "454c1977ad70a206f4f3a0bdca294d85", "zippedFile": "0270,603-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "6850da7a70b198eaf6fde5be503fa5cd", "zippedFile": "0270,604-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "84d305e248dab48a3a110af161dfb005", "zippedFile": "0276,146-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "64d7f085e6afb149ebc2e7f919429a19", "zippedFile": "0276,147-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "f7d0a9a4d1dae8eee057aa626b87715f", "zippedFile": "0276,148-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "763b015d85c7d9d17e06d5babc0a9d32", "zippedFile": "0276,149-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "b8fcd63c6a28d0c7034af2e6c5aff9a8", "zippedFile": "0276,322-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "6265551c5d6336f7ddd9f3fc78ceba93", "zippedFile": "0276,323-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "ca4379aeab4f7c7640c8ad34b27a9db6", "zippedFile": "0276,324-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "358d3c9d2685c076f6a141c26d45520c", "zippedFile": "0276,325-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "4ae429fbf23f8aa64ce2002cfb14c527", "zippedFile": "0277,022-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "83d0f0738468fdf9f23c13eef22dbeea", "zippedFile": "0277,023-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "636e4072c392916d2bf00865fee40984", "zippedFile": "0277,024-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "252b1993fdb66cac522a0edbeffc3407", "zippedFile": "0277,025-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "591f3bdd0f20a0a3d03c8748f2f75754", "zippedFile": "0283,022-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "f77f4a409c78c8495fc3876cd4e7d97c", "zippedFile": "0283,023-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "57d3a349407916f55129d6c8c0f56395", "zippedFile": "0283,024-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "ee4aa1ea0eebf88c5f6cae6315ed11a1", "zippedFile": "0283,025-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "a057124502e533ccd8865dc970cf7017", "zippedFile": "0296,041-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "3c40d2821595a7334a46ea3b46a5421d", "zippedFile": "0296,041-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "d1d51b8f603bba476d1f63bc5980040e", "zippedFile": "0296,042-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "7b096a93cc5ada80bcfb5249bca33768", "zippedFile": "0296,042-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "744e80abe4c6a845412f63a0f0b14e48", "zippedFile": "0296,043-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "9dac78cba6034c427d00f78fa94ab63d", "zippedFile": "0296,043-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "4c0b2e1fb29c8acd84e94d25c953173c", "zippedFile": "0296,044-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "f6bf5f8908a19a9aacf733633b1cd5cf", "zippedFile": "0296,044-02.rom", "file": "bios/aa310.zip"},
                                                { "md5": "eec46f5bd4cdb456b760b3cddf16a33c", "zippedFile": "0296,241-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "980e3be0c851a59d0f4602f4a94b2eef", "zippedFile": "0296,242-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "971a49d5c2dbb3fc01c17d1d5615781a", "zippedFile": "0296,243-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "9ce06a4d2a8331bc5b7fadb967d74f4f", "zippedFile": "0296,244-01.rom", "file": "bios/aa310.zip"},
                                                { "md5": "c74763f720c98e16dc3c6c421db21485", "zippedFile": "cmos_arthur.bin", "file": "bios/aa310.zip"},
                                                { "md5": "6f564c8917f04594bda7385f6de61061", "zippedFile": "cmos_riscos2.bin", "file": "bios/aa310.zip"},
                                                { "md5": "232a302efe19278d9df6ecbc8ea3dc6c", "zippedFile": "cmos_riscos3.bin", "file": "bios/aa310.zip"},
                                                { "md5": "", "file": "bios/archimedes_keyboard.zip" },
                                                { "md5": "1a8617c1abe3e0729d20ce844e1e12a8", "zippedFile": "acorn_0280,022-01_philips_8051ah-2.bin", "file": "bios/archimedes_keyboard.zip"} ] },

    # ---------- Acorn Atom ---------- #
    "atom":   { "name": "Acorn Atom", "biosFiles":  [ { "md5": "", "file": "bios/atom.zip"  },
                                                { "md5": "b7b7f8a608339fa39d44a3bcfa2cc3f0", "zippedFile": "abasic.ic20", "file": "bios/atom.zip"},
                                                { "md5": "baa26f458acf5745388177ffc7368124", "zippedFile": "afloat.ic21", "file": "bios/atom.zip"},
                                                { "md5": "9627dfb5f8302db8dd5702dbf7c09f72", "zippedFile": "dosrom.u15", "file": "bios/atom.zip"} ] },

    # ---------- Acorn Electron ---------- #
    "electron":   { "name": "Acorn Electron", "biosFiles":  [ { "md5": "", "file": "bios/electron.zip"  },
                                                { "md5": "4688a93aa298b9431c1788c9b90378c8", "zippedFile": "os_basic.ic2", "file": "bios/electron.zip"},
                                                { "md5": "", "file": "bios/electron64.zip"  },
                                                { "md5": "2cc67be4624df4dc66617742571a8e3d", "zippedFile": "basic.rom", "file": "bios/electron64.zip"},
                                                { "md5": "df01cfe5894276de96bbd1c45b7e834c", "zippedFile": "os_300.rom", "file": "bios/electron64.zip"},
                                                { "md5": "", "file": "bios/electron_plus1.zip"  },
                                                { "md5": "f3a39227b401a2ce8cdc7e4b7a860aaf", "zippedFile": "plus1.rom", "file": "bios/electron_plus1.zip"},
                                                { "md5": "", "file": "bios/electron_plus3.zip"  },
                                                { "md5": "9aa334b4e8f6d7565e6323e0f77110de", "zippedFile": "acp_dfs1770_200.rom", "file": "bios/electron_plus3.zip"},
                                                { "md5": "83e15ca501899b0d5b2ce3f5ef696069", "zippedFile": "acp_dfs1770_210.rom", "file": "bios/electron_plus3.zip"},
                                                { "md5": "b60ee811f4b805638478acd5297b16e0", "zippedFile": "adfs.rom", "file": "bios/electron_plus3.zip"},
                                                { "md5": "62f5e1d3dae3a68d8fe4406a6f603dc3", "zippedFile": "pres_adfs_113.rom", "file": "bios/electron_plus3.zip"},
                                                { "md5": "5c39baa89fe8a40a5167a53cc5ae7791", "zippedFile": "pres_adfs_115.rom", "file": "bios/electron_plus3.zip"} ] },

    # ---------- Apple ][ ---------- #
    "apple2":   { "name": "Apple II", "emulator": "libretro", "core": "mame", "biosFiles":  [ { "md5": "", "file": "bios/apple2e.zip"  },
                                                { "md5": "4431aea380185e3f509285540d7cb418", "zippedFile": "342-0132-c.e12", "file": "bios/apple2e.zip"},
                                                { "md5": "e6d453d8738e6df4f73df8c8051df3e8", "zippedFile": "342-0133-a.chr", "file": "bios/apple2e.zip"},
                                                { "md5": "72924019cf1719765e4fde35e59c1c7d", "zippedFile": "342-0134-a.64", "file": "bios/apple2e.zip"},
                                                { "md5": "0b150f4bfa090770a866cc5d214703f4", "zippedFile": "342-0135-b.64", "file": "bios/apple2e.zip"},
                                                { "md5": "", "file": "bios/apple2ee.zip" },
                                                { "md5": "b956c537e7b6b85ffa5c3493b1490d8a", "zippedFile": "341-0132-d.e12", "file": "bios/apple2ee.zip"},
                                                { "md5": "9123fff3442c0e688cc6816be88dd4ab", "zippedFile": "342-0265-a.chr", "file": "bios/apple2ee.zip"},
                                                { "md5": "6ac9338f6972eea01604f90d9a581f18", "zippedFile": "342-0303-a.e8", "file": "bios/apple2ee.zip"},
                                                { "md5": "6b11018a14668a7e3904319d2097dddc", "zippedFile": "342-0304-a.e10", "file": "bios/apple2ee.zip"},
                                                { "md5": "", "file": "bios/apple2p.zip" },
                                                { "md5": "89ca5cd551ffad9a557652a97dcb6627", "zippedFile": "341-0011.d0", "file": "bios/apple2p.zip"},
                                                { "md5": "42333f24cd6e70696b212b042f3166aa", "zippedFile": "341-0012.d8", "file": "bios/apple2p.zip"},
                                                { "md5": "5de50bebc41e59ae4eb27be4c24b6814", "zippedFile": "341-0013.e0", "file": "bios/apple2p.zip"},
                                                { "md5": "56d9bb6730735a3b2bbcc75d1da7a8de", "zippedFile": "341-0014.e8", "file": "bios/apple2p.zip"},
                                                { "md5": "cb63c41c5e72b5fda54feb5490efdefb", "zippedFile": "341-0015.f0", "file": "bios/apple2p.zip"},
                                                { "md5": "8925b695ae0177dd3919dbea2f2f202b", "zippedFile": "341-0020-00.f8", "file": "bios/apple2p.zip"},
                                                { "md5": "9ac0dc8c4d0002eb45b0b84be0bde5ec", "zippedFile": "341-0036.chr", "file": "bios/apple2p.zip"},
                                                { "md5": "", "file": "bios/a2diskiing.zip" },
                                                { "md5": "2020aa1413ff77fe29353f3ee72dc295", "zippedFile": "341-0027-a.p5", "file": "bios/a2diskiing.zip"},
                                                { "md5": "", "file": "bios/a2cffa02.zip" },
                                                { "md5": "80adbc2d79f347ec63f4b771ea32984d", "zippedFile": "cffa20ee02.bin", "file": "bios/a2cffa02.zip"},
                                                { "md5": "", "file": "bios/votrsc01.zip" },
                                                { "md5": "8ccf35a06f5e9a2131b0f42380ee5c15", "zippedFile": "sc01.bin", "file": "bios/votrsc01.zip"},
                                                { "md5": "", "file": "bios/votrsc01a.zip" },
                                                { "md5": "95b91e4a2fe7d6f13d353ba1827d37f9", "zippedFile": "sc01a.bin", "file": "bios/votrsc01a.zip"},
                                                { "md5": "", "file": "bios/d2fdc.zip" },
                                                { "md5": "5f1be0c1cdff26f5956eef9643911886", "zippedFile": "341-0028-a.rom", "file": "bios/d2fdc.zip"} ] },

    # ---------- Apple IIgs ---------- #
    "apple2gs":   { "name": "Apple IIgs", "biosFiles":  [ { "md5": "", "file": "bios/apple2gs.zip"  },
                                                { "md5": "b956c537e7b6b85ffa5c3493b1490d8a", "zippedFile": "341-0132-d.e12", "file": "bios/apple2gs.zip"},
                                                { "md5": "b9f94f5d1be27dafcb8fe619ca3f4d15", "zippedFile": "341-0728", "file": "bios/apple2gs.zip"},
                                                { "md5": "e8e632aa592a61ef373b38af10ed54e1", "zippedFile": "341-0748", "file": "bios/apple2gs.zip"},
                                                { "md5": "c9e0e059faec0393fc429131a3af4ee9", "zippedFile": "341s0632-2.bin", "file": "bios/apple2gs.zip"},
                                                { "md5": "68ff96a624237d233e8d4c701f660dd1", "zippedFile": "apple2gs.chr", "file": "bios/apple2gs.zip"} ] },

    # ---------- Camputers Lynx ---------- #
    "camplynx":   { "name": "Camputers Lynx", "biosFiles":  [ { "md5": "", "file": "bios/lynx48k.zip"  },
                                                { "md5": "b0ad5bf3070aea27b637e1998c81fa8c", "zippedFile": "lynx48-1.ic46", "file": "bios/lynx48k.zip"},
                                                { "md5": "b665e10211bbdbfaf2defb32d5580892", "zippedFile": "lynx48-2.ic45", "file": "bios/lynx48k.zip"},
                                                { "md5": "bc0760d8bf61c9683270266d259cd2ae", "zippedFile": "lynx4811.ic46", "file": "bios/lynx48k.zip"},
                                                { "md5": "dde90a794e5324002a9fd7f79cec3172", "zippedFile": "lynx4812.ic45", "file": "bios/lynx48k.zip"},
                                                { "md5": "", "file": "bios/lynx96k.zip" },
                                                { "md5": "a0a8f136f69b5891d33993627a185697", "zippedFile": "danish96k3.ic44", "file": "bios/lynx96k.zip"},
                                                { "md5": "fcb706b3ba2ba61f6f7af1c28f420f94", "zippedFile": "dosrom.rom", "file": "bios/lynx96k.zip"},
                                                { "md5": "815afa653b61cbe70936b01aff700912", "zippedFile": "lynx9644.ic44", "file": "bios/lynx96k.zip"},
                                                { "md5": "3ccdb9dfe6018892383fcbb1a9167d76", "zippedFile": "lynx9645.ic45", "file": "bios/lynx96k.zip"},
                                                { "md5": "01a9770efdab17f089bbbbe53f5d69fa", "zippedFile": "lynx9646.ic46", "file": "bios/lynx96k.zip"},
                                                { "md5": "89ba52f683cd79638646874e965476b6", "zippedFile": "skorprom.ic44", "file": "bios/lynx96k.zip"},
                                                { "md5": "", "file": "bios/lynx128k.zip" },
                                                { "md5": "fcb706b3ba2ba61f6f7af1c28f420f94", "zippedFile": "dosrom.rom", "file": "bios/lynx128k.zip"},
                                                { "md5": "5017fe3a2ea47038ae61e2aeb4f43d65", "zippedFile": "lynx128-1.ic1", "file": "bios/lynx128k.zip"},
                                                { "md5": "bf69d9538192f65571dbed43dc4a99bb", "zippedFile": "lynx128-2.ic2", "file": "bios/lynx128k.zip"},
                                                { "md5": "f9f54913cdedb22bb8f0c549ad121379", "zippedFile": "lynx128-3.ic3", "file": "bios/lynx128k.zip"} ] },

    # ---------- Video Game Music Player ---------- #
    "vgmplay":   { "name": "Video Game Music Player", "biosFiles":  [ { "md5": "", "file": "bios/qsound.zip"  },
                                                { "md5": "108b113a596e800a02fece73f784eeb0", "zippedFile": "dl-1425.bin", "file": "bios/qsound.zip"},
                                                { "md5": "", "file": "bios/ym2413.zip" },
                                                { "md5": "96c11a92992bdff7f7e9d98a52621e1f", "zippedFile": "ym2413_instruments.bin", "file": "bios/ym2413.zip"},
                                                { "md5": "", "file": "bios/ym2608.zip" },
                                                { "md5": "8740932cda05e518a9955f1d08d6786f", "zippedFile": "ym2608_adpcm_rom.bin", "file": "bios/ym2608.zip"} ] },

    # ---------- Epoch Game Pocket Computer ---------- #
    "gamepock":   { "name": "Epoch Game Pocket Computer", "biosFiles":  [ { "md5": "", "file": "bios/gamepock.zip"  },
                                                { "md5": "a0dd595eafb407a6a4b4ed800005a394", "zippedFile": "egpcboot.bin", "file": "bios/gamepock.zip"} ] },

    # ---------- Tiger Game.com ---------- #
    "gamecom":   { "name": "Tiger Game.com", "biosFiles":  [ { "md5": "", "file": "bios/gamecom.zip"  },
                                                { "md5": "813364d4863b1d7b7b8fd6a97a416bcf", "zippedFile": "external.bin", "file": "bios/gamecom.zip"},
                                                { "md5": "f7bcefb6daf923c8e5ea2eb69f619efe", "zippedFile": "internal.bin", "file": "bios/gamecom.zip"} ] },

    # ---------- Atari XEGS ---------- #
    "xegs":   { "name": "Atari XE Game System", "biosFiles":  [ { "md5": "", "file": "bios/xegs.zip"  },
                                                { "md5": "42cbd989802c17d0ac3731d33270d835", "zippedFile": "c101687.rom", "file": "bios/xegs.zip"} ] },

    # ---------- VTech CreatiVision ---------- #
    "crvision":   { "name": "VTech CreatiVision", "biosFiles":  [ { "md5": "", "file": "bios/crvision.zip"  },
                                                { "md5": "3b1ef759d8e3fb4071582efd33dd05f9", "zippedFile": "crvision.u20", "file": "bios/crvision.zip"} ] },

    # ---------- VTech V.Smile ---------- #
    "vsmile":   { "name": "VTech V.Smile", "biosFiles":  [ { "md5": "", "file": "bios/vsmile.zip"  },
                                                { "md5": "851ff77a89ec3f4f2793eb4aede30e5f", "zippedFile": "vsmile_v100.bin", "file": "bios/vsmile.zip"},
                                                { "md5": "f41fcc19ebe1e90fa359cd0df6293fab", "zippedFile": "vsmile_v102.bin", "file": "bios/vsmile.zip"},
                                                { "md5": "11e59253c578c8f16ea2375ec398e4e9", "zippedFile": "vsmile_v103.bin", "file": "bios/vsmile.zip"} ] },

    # ---------- VTech Socrates ---------- #
    "socrates":   { "name": "VTech Socrates", "biosFiles":  [ { "md5": "", "file": "bios/socrates.zip"  },
                                                { "md5": "0efac0c2cc168c0d495e1c4e04ea9f5a", "zippedFile": "27-00817-000-000.u1", "file": "bios/socrates.zip"},
                                                { "md5": "99af124aa300ecd44f5dc9d5a2599778", "zippedFile": "speech_eng_internal.bin", "file": "bios/socrates.zip"},
                                                { "md5": "7046c2b27f51c9a5d33b4d6103f29acf", "zippedFile": "speech_eng_vsm1.bin", "file": "bios/socrates.zip"},
                                                { "md5": "6878302c362321eeee7e40d285cf7d30", "zippedFile": "speech_eng_vsm2.bin", "file": "bios/socrates.zip"},
                                                { "md5": "31c29c57e3d3e6788ba5817eaaa8b17a", "zippedFile": "speech_eng_vsm3.bin", "file": "bios/socrates.zip"} ] },

    # ---------- Entex Aventure Vision ---------- #
    "advision":   { "name": "Entex Adventure Vision", "biosFiles":  [ { "md5": "", "file": "bios/advision.zip"  },
                                                { "md5": "5729638bd856c475678467a353bd921c", "zippedFile": "b225__ins8048-11kdp_n.u5", "file": "bios/advision.zip"},
                                                { "md5": "fc5e71445e4947a9d00eedbc66b13a8f", "zippedFile": "b8223__cop411l-kcn_n.u8", "file": "bios/advision.zip"} ] },

    # ---------- Bitcorp Gamate ---------- #
    "gamate":   { "name": "Bitcorp Gamate", "biosFiles":  [ { "md5": "", "file": "bios/gamate.zip"  },
                                                { "md5": "b411167df6dd563111729296f4c547f6", "zippedFile": "gamate_bios_bit.bin", "file": "bios/gamate.zip"},
                                                { "md5": "ef67993a94503c4b7798b5901c7dda52", "zippedFile": "gamate_bios_umc.bin", "file": "bios/gamate.zip"} ] },

    # ---------- Phillips CD-i ---------- #
    "cdi":   { "name": "Phillips CD-i", "biosFiles":  [ { "md5": "", "file": "bios/cdimono1.zip"  },
                                                { "md5": "2969341396aa61e0143dc2351aaa6ef6", "zippedFile": "cdi200.rom", "file": "bios/cdimono1.zip"},
                                                { "md5": "ac80a92c988ce07fbd6a8f21ded34cf1", "zippedFile": "cdi220.rom", "file": "bios/cdimono1.zip"},
                                                { "md5": "ac0d468be366779c9df633be98da250a", "zippedFile": "cdi220b.rom", "file": "bios/cdimono1.zip"},
                                                { "md5": "3e59b8a9a423d3ecd612a32fe4e2d748", "zippedFile": "zx405037p__cdi_servo_2.1__b43t__llek9215.mc68hc705c8a_withtestrom.7201", "file": "bios/cdimono1.zip"},
                                                { "md5": "3d20cf7550f1b723158b42a1fd5bac62", "zippedFile": "zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206", "file": "bios/cdimono1.zip"} ] },

    # ---------- Naomi 2 ---------- #
    "naomi2":   { "name": "Naomi 2", "biosFiles":  [ { "md5": "", "file": "bios/dc/naomi2.zip"  },
                                                { "md5": "728bfe038ce280872057e365ebfc0fee", "zippedFile": "315-6146.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "baf83367044924067e09856ba164aa6f", "zippedFile": "315-6215.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "6f8ad6e3ab04c8ae1cbcaa652b91cf4e", "zippedFile": "epr-23605.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "f3f39513484df216d9979f6ae7577942", "zippedFile": "epr-23605a.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "ab046e62c51d67fb89eade2b8d5f6a8d", "zippedFile": "epr-23605b.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "096a5217ff6e6c6cafe65a03336760ab", "zippedFile": "epr-23605c.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "659d579ba9aef5b025d87323044e83f4", "zippedFile": "epr-23605c_multi.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "cbe0984d03d73869c23da5a3dd2ce207", "zippedFile": "epr-23607.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "b624ec7b3b90fdf3be103cdfb1679d1d", "zippedFile": "epr-23607b.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "a9d82db14b823a5a57885bea1a998eb7", "zippedFile": "epr-23607c.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "3b1315be24dc8d17f4fa18f3bfc5fe5c", "zippedFile": "epr-23608.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "0143cf852cb2a8a41f217bc688f62105", "zippedFile": "epr-23608a.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "8b88c1f5a06e9b560e887c3b9f879237", "zippedFile": "epr-23608b.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "b49702e4fadb3b5f9143a3d20afd04b5", "zippedFile": "epr-23608c.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "ecadb008179ca1e6f4fe3fa091ab5df2", "zippedFile": "epr-23609b.ic27", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "edeed38a9795e062a9af28c3eba22040", "zippedFile": "main_eeprom.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "14e6bffff0d4dff6a5a547e7c43680ff", "zippedFile": "sp5001.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "689d2228b00fb59781f82af6e8ecdb78", "zippedFile": "sp5001-a.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "8373a11106c1c2fc21ac839f75ea488f", "zippedFile": "sp5001-b.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "7eecfb8e8f82b47ffab92a0c5528100e", "zippedFile": "sp5002-a.bin", "file": "bios/dc/naomi2.zip"},
                                                { "md5": "960ece0dc22a7c5ff81c812a2993e7cc", "zippedFile": "x76f100_eeprom.bin", "file": "bios/dc/naomi2.zip"} ] },

    # ---------- Hikaru ---------- #
    "hikaru":   { "name": "Hikaru", "biosFiles":  [ { "md5": "aac601811a25d7b31a3d5f3f1f82f338", "file": "bios/hikaru.zip" },
                                                { "md5": "e95415b161121bef35ade12367138c63", "file": "bios/mie.zip"} ] },

    # ---------- Playstation Vita ---------- #
    # https://www.playstation.com/en-us/support/hardware/psvita/system-software/
    # http://dus01.psp2.update.playstation.net/update/psp2/image/2022_0209/sd_59dcf059d3328fb67be7e51f8aa33418/PSP2UPDAT.PUP?dest=us
    "psvita":   { "name": "PS Vita", "biosFiles":  [ { "md5": "59dcf059d3328fb67be7e51f8aa33418", "file": "bios/psvita/PSP2UPDAT.PUP" },
                                                { "md5": "f2c7b12fe85496ec88a0391b514d6e3b", "file": "bios/psvita/PSVUPDAT.PUP"} ] },

    # ---------- GCE Vectrex ---------- #
    # Not required for libretro-vecx, the default emulator
    "vectrex":   { "name": "GCE Vectrex", "emulator": "libretro", "core": "mame", "biosFiles":  [ { "md5": "", "file": "bios/vectrex.zip"  },
                                                { "md5": "ab082fa8c8e632dd68589a8c7741388f", "zippedFile": "exec_rom.bin", "file": "bios/vectrex.zip"},
                                                { "md5": "a9c238473229912eb757ff3dfe6f4631", "zippedFile": "exec_rom_intl_284001-1.bin", "file": "bios/vectrex.zip"} ] },

    # ---------- ScummVM ---------- #
    "scummvm":   { "name": "ScummVM", "biosFiles":  [ { "md5": "89e42e386e82e0cacb4a2704a03706ca", "file": "bios/scummvm/extra/MT32_PCM.ROM" },
                                                      { "md5": "5626206284b22c2734f3e9efefcd2675", "file": "bios/scummvm/extra/MT32_CONTROL.ROM" } ] },

    # ---------- MSX1/MSX2 ---------- #
    #https://github.com/openMSX/openMSX/blob/master/share/machines/Boosted_MSX2_EN.txt
    "msx1":   { "name": "MSX1/MS2", "biosFiles":  [ { "md5": "01dd1d72ed9bb6afe8a9b441c198a1cd", "file": "bios/openmsx/nms8250_disk.rom" },
                                                    { "md5": "ec3a01c91f24fbddcbcab0ad301bc9ef", "file": "bios/openmsx/nms8250_basic-bios2.rom" },
                                                    { "md5": "2183c2aff17cf4297bdb496de78c2e8a", "file": "bios/openmsx/nms8250_msx2sub.rom" },
                                                    { "md5": "6f69cc8b5ed761b03afd78000dfb0e19", "file": "bios/openmsx/fmpac.rom" },
                                                    { "md5": "2ce20986da024e9a0e271961c6bc9f01", "file": "bios/openmsx/phc-70fd2_basickun.rom" },
                                                    { "md5": "42af93619160ef2116416f74a6cb12f2", "file": "bios/openmsx/yrw801.rom" } ] },

    # ---------- MSX LaserDisc ---------- #
    #https://github.com/openMSX/openMSX/blob/master/share/machines/Pioneer_PX-7.xml
    "msx1":   { "name": "MSX LaserDisc", "biosFiles":  [ { "md5": "281809cafe63437fc4bffb3033fbd0db", "file": "bios/openmsx/px-7_pbasic.rom" },
                                                         { "md5": "9218f6dd89f7ba01e3090d44721b4260", "file": "bios/openmsx/px-7_basic-bios1.rom" } ] },

    # ---------- MSX2+  ---------- #
    #https://github.com/openMSX/openMSX/blob/master/share/machines/Boosted_MSX2+_JP.txt
    "msx2+":   { "name": "MSX2+", "biosFiles":  [ { "md5": "acf53887c2d2783dc059a9b442c86b90", "file": "bios/openmsx/fs-a1wsx_kanjifont.rom" },
                                                  { "md5": "c5c26c3e8bc6c485424818057f0507b9", "file": "bios/openmsx/fs-a1wsx_basic-bios2p.rom" },
                                                  { "md5": "0c40e7db1c1fcc2405e4d0cdd215adb4", "file": "bios/openmsx/fs-a1wsx_fmbasic.rom" },
                                                  { "md5": "7c8243c71d8f143b2531f01afa6a05dc", "file": "bios/openmsx/fs-a1wsx_msx2psub.rom" },
                                                  { "md5": "9dfdebfaa6b547222a40aab8bb2e29f8", "file": "bios/openmsx/fs-a1wsx_kanjibasic.rom" },
                                                  { "md5": "00aa02b6077de40a0b51d71a3c3e1d5f", "file": "bios/openmsx/fs-a1wsx_disk.rom" },
                                                  { "md5": "fa8e7d4b999af058fe2864a5f2e014ec", "file": "bios/openmsx/fs-a1wsx_firmware.rom" },
                                                  { "md5": "2ce20986da024e9a0e271961c6bc9f01", "file": "bios/openmsx/phc-70fd2_basickun.rom" },
                                                  { "md5": "42af93619160ef2116416f74a6cb12f2", "file": "bios/openmsx/yrw801.rom" } ] },

    # ---------- MSX-Turbo  ---------- #
    #https://github.com/openMSX/openMSX/blob/master/share/machines/Panasonic_FS-A1GT.xml
    "msxturbor":   { "name": "MSX-Turbo", "biosFiles":  [ { "md5": "af17a344bcc177b97a4888c4c559f3ae", "file": "bios/openmsx/fs-a1gt_firmware.rom" },
                                                          { "md5": "acf53887c2d2783dc059a9b442c86b90", "file": "bios/openmsx/fs-a1gt_kanjifont.rom" },
                                                          { "md5": "afa4b5f2944334f84971af814a24bd5a", "file": "bios/openmsx/ide250.zip" },
                                                          { "md5": "2ce20986da024e9a0e271961c6bc9f01", "file": "bios/openmsx/phc-70fd2_basickun.rom" },
                                                          { "md5": "42af93619160ef2116416f74a6cb12f2", "file": "bios/openmsx/yrw801.rom" } ] },
    
    # ---------- Supr'A'can  ---------- #
    "supracan":   { "name": "Supr'A'can", "biosFiles":  [ { "md5": "", "file": "bios/supracan.zip"  },
                                    { "md5": "53c4343e062bb3b337370bbb58e64d16", "zippedFile": "internal_68k.bin", "file": "bios/supracan.zip" } ] },

    # ---------- Tandy VIS ---------- #
    "vis":  { "name": "Tandy Video Information System", "biosFiles": [  { "md5": "", "file": "bios/vis.zip" },
                                  { "md5": "ebf432d3b09f694db1c62018eb2ab471", "zippedFile": "p513bk0b.bin", "file": "bios/vis.zip"},
                                  { "md5": "758f8fec271fbf526bb22b36e88f154b", "zippedFile": "p513bk1b.bin", "file": "bios/vis.zip"} ] },
    
    # ---------- GameCube ---------- #
    "n64dd":   { "name": "Nintendo 64DD", "biosFiles":  [ { "md5": "8d3d9f294b6e174bc7b1d2fd1c727530", "file": "bios/64DD_IPL.bin" } ] },

    # ---------- GameCube ---------- #
    "gamecube":   { "name": "Nintendo GameCube", "biosFiles":  [ { "md5": "db92574caab77a7ec99d4605fd6f2450", "file": "bios/GC/EUR/IPL.bin" },
                                                                 { "md5": "b17148254a5799684c7d783206504926", "file": "bios/GC/JAP/IPL.bin" },
                                                                 { "md5": "b17148254a5799684c7d783206504926", "file": "bios/GC/USA/IPL.bin" } ] },
    
    # ---------- Sega Chihiro ---------- #
    "chihiro": { "name": "Sega Chihiro", "biosFiles": [{ "md5": "d49c52a4102f6df7bcf8d0617ac475ed", "file": "bios/mcpx_1.0.bin" },
                                                       { "md5": "f23d7e00ae8fbf88908ed1f9165f35eb", "file": "bios/cerbios.bin" }] },
}

class BiosStatus:
    MISSING = "MISSING"
    UNTESTED = "UNTESTED"

def md5sum(filename, blocksize=65536):
    hash = md5()
    with open(filename, "rb") as f:
        for block in iter(lambda: f.read(blocksize), b""):
            hash.update(block)
    return hash.hexdigest()

def checkInsideZip(container, fileName, md5sum):
    # Check inside Zip files
    try:
        archive = zipfile.ZipFile(container)
    except Exception as e:
        print ('Error opening file {}: {}.'.format(container, e))
        return False
    blocksize = 1024**2  #1M chunks
    for fname in archive.namelist():
        # Only check if the file matches
        if fname.casefold() == fileName.casefold():
            if md5sum == "":
                return True
            archive = zipfile.ZipFile(container)
            blocksize = 1024**2  #1M chunks
            for fname in archive.namelist():
                if fname == fileName:
                    entry = archive.open(fname)
                    zippedHash = md5()
                    while True:
                        block = entry.read(blocksize)
                        if not block:
                            break
                        zippedHash.update(block)
                    if zippedHash.hexdigest() == md5sum:
                        return True
                    else:
                        print('Mismatch inside .zip: File {} in {} has MD5 {} (expected {})'.format(fileName, container, zippedHash.hexdigest(), md5sum))
                        return False
    # File was not found in zip.
    print('Missing file inside .zip: File {} not found in {}'.format(fileName, container))
    return False

def coreExists(checkMe, emuDict):
    if "emulator" in checkMe:
        if checkMe["emulator"] in emuDict.keys():
            hasEmu = True
        else:
            hasEmu = False
    else:
        # Emulator not defined, check BIOS
        hasEmu = True
    if hasEmu and "core" in checkMe:
        if checkMe["core"] in emuDict[checkMe["emulator"]]:
            hasCore = True
        else:
            hasCore = False
    else:
        # Either core is undefined or emulator is not installed.
        # Set core presence to emulator presence, we'll assume there's only one core or it applies to all.
        hasCore = hasEmu
    return hasCore

def checkBios(systems, prefix, filterROMs):
    systemDict = {}
    emuDict = {}
    systemName = ""
    configFile = "/storage/.config/emulationstation/es_systems.cfg"
    configData = elementTree.parse(configFile)
    configRoot = configData.getroot()

    if filterROMs:
        # Load systems & emulators from es_systems.cfg
        # System full name stored but not currently used, may be useful for the readme function.
        for activeSystem in configRoot:
            for systemTag in activeSystem:
                if systemTag.tag == "fullname":
                    systemName = systemTag.text
                elif systemTag.tag == "name":
                    systemDict[systemTag.text] = systemName
                    systemName = ""
                elif systemTag.tag == "emulators":
                    for emulatorTag in systemTag:
                        emulatorName = emulatorTag.attrib['name']
                        for coreTag in emulatorTag[0]:
                            if emulatorName in emuDict.keys():
                                if not coreTag.text in emuDict[emulatorName]:
                                    emuDict[emulatorName].append(coreTag.text)
                            else:
                                emuDict[emulatorName] = [coreTag.text]
    else:
        for system in systems.keys():
            systemDict[system] = systems[system]['name']

    missingBios = {}
    for system in systems.keys():
        if system in systemDict.keys():
            if coreExists(systems[system], emuDict) or filterROMs == False:
                for file in systems[system]["biosFiles"]:
                    if coreExists(file, emuDict) or filterROMs == False:
                        filepath = prefix + "/" + file["file"]
                        if isfile(filepath):
                            if not "zippedFile" in file:
                                md5 = md5sum(filepath)
                                if md5 != file["md5"] and file["md5"] != "":
                                    if system not in missingBios:
                                        missingBios[system] = {}
                                    missingBios[system][file["file"]] = { "status": BiosStatus.UNTESTED, "md5": file["md5"], "file": file["file"] }
                            else:
                                if 'altmd5' in file:
                                    if not checkInsideZip(filepath, file["zippedFile"], file["md5"], file["altmd5"]):
                                        if system not in missingBios:
                                            missingBios[system] = {}
                                        missingBios[system][file["file"]] = { "status": BiosStatus.UNTESTED, "md5": file["md5"], "file": file["file"] }
                                else:
                                    if not checkInsideZip(filepath, file["zippedFile"], file["md5"]):
                                        if system not in missingBios:
                                            missingBios[system] = {}
                                        missingBios[system][file["file"]] = { "status": BiosStatus.UNTESTED, "md5": file["md5"], "file": file["file"] }
                        else:
                            if system not in missingBios:
                                missingBios[system] = {}
                            missingBios[system][file["file"]] = { "status": BiosStatus.MISSING, "md5": file["md5"], "file": file["file"] }
    return missingBios

def displayMissingBios(systems, missingBios):
    sortedMissingBios = OrderedDict(sorted(missingBios.items()))
    if sortedMissingBios:
        for system in sortedMissingBios:
            print("> {}".format(system))
            for file in sortedMissingBios[system].keys():
                md5str = "-"
                if sortedMissingBios[system][file]["md5"] != "":
                    md5str = sortedMissingBios[system][file]["md5"]
                print("{} {} {}".format(sortedMissingBios[system][file]["status"], md5str, sortedMissingBios[system][file]["file"]))
    else:
        print("No missing bios")

def createReadme(systems):
    for system in sorted(systems):
        print("{}:".format(systems[system]["name"]))
        for bios in systems[system]["biosFiles"]:
            print("{} {}".format(bios["md5"], bios["file"]))
        print("")

if __name__ == '__main__':
    if len(sys.argv) == 1:
        prefix = "/storage/roms"
        displayMissingBios(systems, checkBios(systems, prefix, True))
    elif sys.argv[1] == "--noFilter":
        prefix = "/storage/roms"
        displayMissingBios(systems, checkBios(systems, prefix, False))
    elif sys.argv[1] == "--createReadme":
        createReadme(systems)
    elif len(sys.argv) == 3 and sys.argv[1] == "--filter":
        prefix = "/storage/roms"
        lowered_name = sys.argv[2].lower()

        filtered_systems = {}
        for system in systems:
            if lowered_name in system.lower() or lowered_name in systems[system]['name'].lower():
                filtered_systems[system] = systems[system]

        if len(filtered_systems) == 0:
            print("No system named {} found".format(sys.argv[2]))
            exit(1)

        displayMissingBios(filtered_systems, checkBios(filtered_systems, prefix, True))
