mirror of
https://github.com/sylverb/game-and-watch-retro-go.git
synced 2026-01-12 08:29:29 +01:00
334 lines
11 KiB
Python
334 lines
11 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import sys
|
|
import hashlib
|
|
import xml.dom.minidom
|
|
|
|
ROM_UNKNOWN = 0
|
|
ROM_STANDARD = 1
|
|
ROM_MSXDOS2 = 2
|
|
ROM_KONAMI5 = 3
|
|
ROM_KONAMI4 = 4
|
|
ROM_ASCII8 = 5
|
|
ROM_ASCII16 = 6
|
|
ROM_GAMEMASTER2 = 7
|
|
ROM_ASCII8SRAM = 8
|
|
ROM_ASCII16SRAM = 9
|
|
ROM_RTYPE = 10
|
|
ROM_CROSSBLAIM = 11
|
|
ROM_HARRYFOX = 12
|
|
ROM_KOREAN80 = 13
|
|
ROM_KOREAN126 = 14
|
|
ROM_SCCEXTENDED = 15
|
|
ROM_FMPAC = 16
|
|
ROM_KONAMI4NF = 17
|
|
ROM_ASCII16NF = 18
|
|
ROM_PLAIN = 19
|
|
ROM_NORMAL = 20
|
|
ROM_DISKPATCH = 21
|
|
RAM_MAPPER = 22
|
|
RAM_NORMAL = 23
|
|
ROM_KANJI = 24
|
|
ROM_HOLYQURAN = 25
|
|
SRAM_MATSUCHITA = 26
|
|
ROM_PANASONIC16 = 27
|
|
ROM_BUNSETU = 28
|
|
ROM_JISYO = 29
|
|
ROM_KANJI12 = 30
|
|
ROM_NATIONAL = 31
|
|
SRAM_S1985 = 32
|
|
ROM_F4DEVICE = 33
|
|
ROM_F4INVERTED = 34
|
|
ROM_KOEI = 38
|
|
ROM_BASIC = 39
|
|
ROM_HALNOTE = 40
|
|
ROM_LODERUNNER = 41
|
|
ROM_0x4000 = 42
|
|
ROM_PAC = 43
|
|
ROM_MEGARAM = 44
|
|
ROM_MEGARAM128 = 45
|
|
ROM_MEGARAM256 = 46
|
|
ROM_MEGARAM512 = 47
|
|
ROM_MEGARAM768 = 48
|
|
ROM_MEGARAM2M = 49
|
|
ROM_MSXAUDIO = 50
|
|
ROM_KOREAN90 = 51
|
|
ROM_SNATCHER = 52
|
|
ROM_SDSNATCHER = 53
|
|
ROM_SCCMIRRORED = 54
|
|
ROM_SCC = 55
|
|
ROM_SCCPLUS = 56
|
|
ROM_TC8566AF = 57
|
|
ROM_S1990 = 58
|
|
ROM_TURBORTIMER = 59
|
|
ROM_TURBORPCM = 60
|
|
ROM_KONAMISYNTH = 61
|
|
ROM_MAJUTSUSHI = 62
|
|
ROM_MICROSOL = 63
|
|
ROM_NATIONALFDC = 64
|
|
ROM_PHILIPSFDC = 65
|
|
ROM_CASPATCH = 66
|
|
ROM_SVI738FDC = 67
|
|
ROM_PANASONIC32 = 68
|
|
ROM_EXTRAM = 69
|
|
ROM_EXTRAM512KB = 70
|
|
ROM_EXTRAM1MB = 71
|
|
ROM_EXTRAM2MB = 72
|
|
ROM_EXTRAM4MB = 73
|
|
ROM_SVI328CART = 74
|
|
ROM_SVI328FDC = 75
|
|
ROM_COLECO = 76
|
|
ROM_SONYHBI55 = 77
|
|
ROM_MSXMUSIC = 78
|
|
ROM_MOONSOUND = 79
|
|
ROM_MSXAUDIODEV = 80
|
|
ROM_V9958 = 81
|
|
ROM_SVI328COL80 = 82
|
|
ROM_SVI328PRN = 83
|
|
ROM_MSXPRN = 84
|
|
ROM_SVI328RS232 = 85
|
|
ROM_0xC000 = 86
|
|
ROM_FMPAK = 87
|
|
ROM_MSXMIDI = 88
|
|
ROM_MSXRS232 = 89
|
|
ROM_TURBORIO = 90
|
|
ROM_KONAMKBDMAS = 91
|
|
ROM_GAMEREADER = 92
|
|
RAM_1KB_MIRRORED= 93
|
|
ROM_SG1000 = 94
|
|
ROM_SG1000CASTLE= 95
|
|
ROM_SUNRISEIDE = 96
|
|
ROM_GIDE = 97
|
|
ROM_BEERIDE = 98
|
|
ROM_KONWORDPRO = 99
|
|
ROM_MICROSOL80 = 100
|
|
ROM_NMS8280DIGI = 101
|
|
ROM_SONYHBIV1 = 102
|
|
ROM_SVI727COL80 = 103
|
|
ROM_FMDAS = 104
|
|
ROM_YAMAHASFG05 = 105
|
|
ROM_YAMAHASFG01 = 106
|
|
ROM_SF7000IPL = 107
|
|
ROM_SC3000 = 108
|
|
ROM_PLAYBALL = 109
|
|
ROM_OBSONET = 110
|
|
RAM_2KB_MIRRORED= 111
|
|
ROM_SEGABASIC = 112
|
|
ROM_CVMEGACART = 113
|
|
ROM_DUMAS = 114
|
|
SRAM_MEGASCSI = 115
|
|
SRAM_MEGASCSI128= 116
|
|
SRAM_MEGASCSI256= 117
|
|
SRAM_MEGASCSI512= 118
|
|
SRAM_MEGASCSI1MB= 119
|
|
SRAM_ESERAM = 120
|
|
SRAM_ESERAM128 = 121
|
|
SRAM_ESERAM256 = 122
|
|
SRAM_ESERAM512 = 123
|
|
SRAM_ESERAM1MB = 124
|
|
SRAM_ESESCC = 125
|
|
SRAM_ESESCC128 = 126
|
|
SRAM_ESESCC256 = 127
|
|
SRAM_ESESCC512 = 128
|
|
SRAM_WAVESCSI = 129
|
|
SRAM_WAVESCSI128= 130
|
|
SRAM_WAVESCSI256= 131
|
|
SRAM_WAVESCSI512= 132
|
|
SRAM_WAVESCSI1MB= 133
|
|
ROM_NOWIND = 134
|
|
ROM_GOUDASCSI = 135
|
|
ROM_MANBOW2 = 136
|
|
ROM_MEGAFLSHSCC = 137
|
|
ROM_FORTEII = 138
|
|
ROM_PANASONIC8 = 139
|
|
ROM_FSA1FMMODEM = 140
|
|
ROM_DRAM = 141
|
|
ROM_PANASONICWX16=142
|
|
ROM_TC8566AF_TR = 143
|
|
ROM_MATRAINK = 144
|
|
ROM_NETTOUYAKYUU= 145
|
|
ROM_YAMAHANET = 146
|
|
ROM_JOYREXPSG = 147
|
|
ROM_OPCODEPSG = 148
|
|
ROM_EXTRAM16KB = 149
|
|
ROM_EXTRAM32KB = 150
|
|
ROM_EXTRAM48KB = 151
|
|
ROM_EXTRAM64KB = 152
|
|
ROM_NMS1210 = 153
|
|
ROM_ARC = 154
|
|
ROM_OPCODEBIOS = 155
|
|
ROM_OPCODESLOT = 156
|
|
ROM_OPCODESAVE = 157
|
|
ROM_OPCODEMEGA = 158
|
|
SRAM_MATSUCHITA_INV = 159
|
|
ROM_SVI328RSIDE = 160
|
|
ROM_ACTIVISIONPCB_2K = 161
|
|
ROM_SVI707FDC = 162
|
|
ROM_MANBOW2_V2 = 163
|
|
ROM_HAMARAJANIGHT = 164
|
|
ROM_MEGAFLSHSCCPLUS = 165
|
|
ROM_DOOLY = 166
|
|
ROM_SG1000_RAMEXPANDER_A = 167
|
|
ROM_SG1000_RAMEXPANDER_B = 168
|
|
ROM_MSXMIDI_EXTERNAL = 169
|
|
ROM_MUPACK = 170
|
|
ROM_ACTIVISIONPCB_256K = 171
|
|
ROM_ACTIVISIONPCB = 172
|
|
ROM_ACTIVISIONPCB_16K = 173
|
|
ROM_MAXROMID = 173
|
|
|
|
def getMapperValue(name):
|
|
if (name == "ASCII16"): return ROM_ASCII16
|
|
if (name == "ASCII16SRAM2"): return ROM_ASCII16SRAM
|
|
if (name == "ASCII8"): return ROM_ASCII8
|
|
if (name == "ASCII8SRAM8"): return ROM_ASCII8SRAM
|
|
if (name == "KoeiSRAM8"): return ROM_KOEI
|
|
if (name == "KoeiSRAM32"): return ROM_KOEI
|
|
if (name == "Konami"): return ROM_KONAMI4
|
|
if (name == "KonamiSCC"): return ROM_KONAMI5
|
|
if (name == "MuPack"): return ROM_MUPACK
|
|
if (name == "Manbow2"): return ROM_MANBOW2
|
|
if (name == "Manbow2v2"): return ROM_MANBOW2_V2
|
|
if (name == "HamarajaNight"): return ROM_HAMARAJANIGHT
|
|
if (name == "MegaFlashRomScc"): return ROM_MEGAFLSHSCC
|
|
if (name == "MegaFlashRomSccPlus"): return ROM_MEGAFLSHSCCPLUS
|
|
if (name == "Halnote"): return ROM_HALNOTE
|
|
if (name == "HarryFox"): return ROM_HARRYFOX
|
|
if (name == "Playball"): return ROM_PLAYBALL
|
|
if (name == "Dooly"): return ROM_DOOLY
|
|
if (name == "HolyQuran"): return ROM_HOLYQURAN
|
|
if (name == "CrossBlaim"): return ROM_CROSSBLAIM
|
|
if (name == "Zemina80in1"): return ROM_KOREAN80
|
|
if (name == "Zemina90in1"): return ROM_KOREAN90
|
|
if (name == "Zemina126in1"): return ROM_KOREAN126
|
|
if (name == "Wizardry"): return ROM_ASCII8SRAM
|
|
if (name == "GameMaster2"): return ROM_GAMEMASTER2
|
|
if (name == "SuperLodeRunner"): return ROM_LODERUNNER
|
|
if (name == "R-Type"): return ROM_RTYPE
|
|
if (name == "Majutsushi"): return ROM_MAJUTSUSHI
|
|
if (name == "Synthesizer"): return ROM_KONAMISYNTH
|
|
if (name == "KeyboardMaster"): return ROM_KONAMKBDMAS
|
|
if (name == "GenericKonami"): return ROM_KONAMI4NF
|
|
if (name == "SuperPierrot"): return ROM_ASCII16NF
|
|
if (name == "WordPro"): return ROM_KONWORDPRO
|
|
if (name == "Normal"): return ROM_STANDARD
|
|
if (name == "MatraInk"): return ROM_MATRAINK
|
|
if (name == "NettouYakyuu"): return ROM_NETTOUYAKYUU
|
|
if (name == "0x4000"): return ROM_0x4000
|
|
if (name == "0xC000"): return ROM_0xC000
|
|
if (name == "auto"): return ROM_PLAIN
|
|
if (name == "basic"): return ROM_BASIC
|
|
if (name == "mirrored"): return ROM_PLAIN
|
|
if (name == "forteII"): return ROM_FORTEII
|
|
if (name == "msxdos2"): return ROM_MSXDOS2
|
|
if (name == "konami5"): return ROM_KONAMI5
|
|
if (name == "MuPack"): return ROM_MUPACK
|
|
if (name == "konami4"): return ROM_KONAMI4
|
|
if (name == "ascii8"): return ROM_ASCII8
|
|
if (name == "halnote"): return ROM_HALNOTE
|
|
if (name == "konamisynth"): return ROM_KONAMISYNTH
|
|
if (name == "kbdmaster"): return ROM_KONAMKBDMAS
|
|
if (name == "majutsushi"): return ROM_MAJUTSUSHI
|
|
if (name == "ascii16"): return ROM_ASCII16
|
|
if (name == "gamemaster2"): return ROM_GAMEMASTER2
|
|
if (name == "ascii8sram"): return ROM_ASCII8SRAM
|
|
if (name == "koei"): return ROM_KOEI
|
|
if (name == "ascii16sram"): return ROM_ASCII16SRAM
|
|
if (name == "konami4nf"): return ROM_KONAMI4NF
|
|
if (name == "ascii16nf"): return ROM_ASCII16NF
|
|
if (name == "snatcher"): return ROM_SNATCHER
|
|
if (name == "sdsnatcher"): return ROM_SDSNATCHER
|
|
if (name == "sccmirrored"): return ROM_SCCMIRRORED
|
|
if (name == "sccexpanded"): return ROM_SCCEXTENDED
|
|
if (name == "scc"): return ROM_SCC
|
|
if (name == "sccplus"): return ROM_SCCPLUS
|
|
if (name == "scc-i"): return ROM_SCCPLUS
|
|
if (name == "scc+"): return ROM_SCCPLUS
|
|
if (name == "pac"): return ROM_PAC
|
|
if (name == "fmpac"): return ROM_FMPAC
|
|
if (name == "fmpak"): return ROM_FMPAK
|
|
if (name == "rtype"): return ROM_RTYPE
|
|
if (name == "crossblaim"): return ROM_CROSSBLAIM
|
|
if (name == "harryfox"): return ROM_HARRYFOX
|
|
if (name == "loderunner"): return ROM_LODERUNNER
|
|
if (name == "korean80"): return ROM_KOREAN80
|
|
if (name == "korean90"): return ROM_KOREAN90
|
|
if (name == "korean126"): return ROM_KOREAN126
|
|
if (name == "holyquran"): return ROM_HOLYQURAN
|
|
if (name == "opcodesave"): return ROM_OPCODESAVE
|
|
if (name == "opcodebios"): return ROM_OPCODEBIOS
|
|
if (name == "opcodeslot"): return ROM_OPCODESLOT
|
|
if (name == "opcodeega"): return ROM_OPCODEMEGA
|
|
if (name == "coleco"): return ROM_COLECO
|
|
return ROM_UNKNOWN
|
|
|
|
def getRomMapper(collection,sha1):
|
|
for software in collection.getElementsByTagName("software"):
|
|
system = software.getElementsByTagName('system')[0]
|
|
for dump in software.getElementsByTagName('dump'):
|
|
for rom in dump.getElementsByTagName('rom'):
|
|
hash = rom.getElementsByTagName('hash')[0].childNodes[0].data
|
|
mapper = ROM_PLAIN
|
|
if (hash == sha1string):
|
|
if (rom.getElementsByTagName('type')):
|
|
mapper = getMapperValue(rom.getElementsByTagName('type')[0].childNodes[0].data)
|
|
if (mapper == ROM_STANDARD):
|
|
if rom.getElementsByTagName('start') :
|
|
start = rom.getElementsByTagName('start')[0].childNodes[0].data
|
|
if (start == "0x4000"):
|
|
mapper = ROM_0x4000
|
|
elif (start == "0x8000"):
|
|
mapper = ROM_BASIC
|
|
elif (start == "0xC000"):
|
|
mapper = ROM_0xC000
|
|
return mapper
|
|
for megarom in dump.getElementsByTagName('megarom'):
|
|
hash = megarom.getElementsByTagName('hash')[0].childNodes[0].data
|
|
if sha1string == hash:
|
|
type = megarom.getElementsByTagName('type')[0].childNodes[0].data
|
|
return getMapperValue(type)
|
|
return ROM_UNKNOWN
|
|
|
|
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
|
|
|
|
n = len(sys.argv)
|
|
|
|
if n < 2:
|
|
print("Usage :\nrfindBlueMsxMapper.py database.xml file.rom \n")
|
|
sys.exit(0)
|
|
|
|
# Open file
|
|
#print("Opening "+sys.argv[2])
|
|
sha1 = hashlib.sha1()
|
|
|
|
with open(sys.argv[2], 'rb') as f:
|
|
while True:
|
|
data = f.read(BUF_SIZE)
|
|
if not data:
|
|
break
|
|
sha1.update(data)
|
|
|
|
sha1string = sha1.hexdigest()
|
|
#print("Rom SHA1: %s" % sha1string)
|
|
|
|
DOMTree = xml.dom.minidom.parse(sys.argv[1])
|
|
collection = DOMTree.documentElement
|
|
|
|
print(getRomMapper(collection,sha1string))
|
|
sys.exit(0)
|
|
|
|
#tree = ElementTree.parse(sys.argv[1])
|
|
#root = tree.getroot()
|
|
|
|
#def print_subtree(subtree):
|
|
# for y in subtree:
|
|
# print ("\t", y.tag, ":", y.text)
|
|
|
|
#for x in root.findall('.//software'):
|
|
# print (x.tag)
|
|
# for dump in x.getchildren().findall('.//dump'):
|
|
# print (dump.tag)
|
|
# print_subtree(x.getchildren())
|
|
|
|
#for p in root.findall('.//software'):
|
|
# print("%s | %s" % (p.find('Name').text, p.find('Value').text)) |