From c4f6f3dabe6acc663fec416ddbfc511d2f0724d0 Mon Sep 17 00:00:00 2001 From: Harrison <53527582+HTV04@users.noreply.github.com> Date: Mon, 22 Feb 2021 21:26:08 -0500 Subject: [PATCH] open_agb_firm gba_db.bin Builder v2.0 and other changes open_agb_firm gba_db.bin Builder: * Updated to v2.0 * No-Intro DAT support * Additional entry support * Entries added/skipped are now output * Other optimizations Other changes: * Remove most overrides in `open_agb_firm.c` to prepare for gba_db.bin * Add `resources/gba.dat` entry to gitignore --- .gitignore | 1 + resources/gba_db.bin | Bin 686508 -> 674882 bytes resources/gba_db_builder.py | 114 +++++++++++++++++++++++------------ source/arm11/open_agb_firm.c | 13 +--- 4 files changed, 77 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index e7e07d9..3d7709e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ arm9/open_agb_firm9.bin arm11/open_agb_firm11.bin arm9/open_agb_firm9.elf arm11/open_agb_firm11.elf +resources/gba.dat resources/gba.xml open_agb_firm.firm open_agb_firm*.7z diff --git a/resources/gba_db.bin b/resources/gba_db.bin index e534ab232bd652ec8d7867e6997d466572ac2129..d3b292613ca5711a94d43df6311c6412828a1afb 100644 GIT binary patch delta 61666 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 QV&L1!mwJJ+DwW9p0|oL8tN;K2 delta 49344 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

{5AnSTD-L)1FlUTpsA#DMh#-A|;6HHVuU`5DBQ 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

2@j1}kr(8L_z%*=V!eF?1pN|MjgJ8!OChx=X zpQ(&yu!D*wHcb76cYgl~ zRr1iRg{X(T@a>1x6-D6n5d4Ub<&8&3i8#%1_>~t7_!UVcPACG2r2@CdC=lU+SPneCMMQI^&?^{v>2Zp_0E;eysPug5^uK@3jd4j2QJI?ko_BV$9F9M z4cFnQ-)RrFwnD;G&L+5u5&xj-%GT5j&_3loO?WD?;j_Tu58fme_(9Zul`YG7S^wsAt0Sz zvtHm_^lX!`LFn3QBy`2w?-~iQtow8bF&0>TD>K1gJ{jHz7ZbU#lQ|~BOTyev3aKjv zm8o(UB20zOtf2+asFdQlV}hBZWr94)c2?c^LLhlE9-nMl(yw{u%NS4XB`w+@j6p&1b2B3iXqWj@UXz)aEK;Pr3HJf zgpN#!$MbLwv=K%zIkp(w+wsSv+X-&0i*;bxUT|yuXeV~F7@FGi+V&j;j(RGBiyhb- zmD&m#Rso>SmcQXGR)EF_bfU211*h!<19)MsX;^$fG|ac>UwnoW&TW5Z{MTSFwUY)D zJMxb7w+?p{mavZ!=^(tYuk>{)9E926<*0vhx}(667x7@}By?-J9rmoS$%DJOZCB(d>~CZ7E7Lxl%l0Ovgf**1ncfw@rVDLCWOuJ+XJLFVk5(M^b9ld}S%yad@! zU?B#03m75~Gb`Vq=IGkNXPlMu;w~fWjU^9+z9ELx#UFi(jTfOn{Ka zFAE?zP*}$=hk`?pkj^jPf@eX3EI!`sDP;0eB(%XeACf>?(+f#}1oAHKEnH^-FY@{b zK_%V3+5-t%!CR-M=>j2r1)av#rJvw~Hi|rd-@uY%AMXX#Ytruk-yZyT<7GDO`+nG8KsPmxCodf!c(Wz~c@z7fAXMOC$J60qh|z9%BTQ+b1B49}{LFY=xR6Xg z1lK`A0R9e5p9zw-&>Muof}*5{rolotC~Ty-RRiH-xZuT9&{D%i(Q2q0f-i;0%7aio zl+S`uM-k>k2tJ0@OkrZApjZhYe3&3B#Jz?K_Ev*3Q_)>H32p5y^n8w9X{+}Kn{64H zEbjf#Z`h9hT_%Mcyul?VvJy~j&IC!%l>*X{IA5(KjqD-o&)ymO>{k46#1sB{{oY?W`gxlHiqFT z81a|Cqz{wwGg7BB*J>u{56^qy-B3NAk&=`0lD_aQ-y6K@KT}sd>wj+S;XVJEmS*EQ z;gf)K?yLtLB#%S*2F1V7=1b;l(Gj{%1Y#!X85)6tT(gqr!xscDD? zOiyFFi5J`Y$MKa6ttwrf7%<%9^yPu`=Z%lj?zebeWzJjWL{)au#IOD8A+C?v;>KxuMoBM5%#>q0tB)HgIQ~F z(?}(+T)d_B`xd>?_`|4}13Q*2@p$W(0lU0*^x>Zsio8rZvCy2a8r8}kpMPGqzbWYQ zH~p3tQld>6KX>E(y=+um%xje$D`E`K@Ab;JeS7Ya@xCYTe0pucuzN+Fx)l8Kb%bRv z7uN3R^qJX7Y*nL4Co^L*rn$ysX6ytFOPTo=i-j1;oSHDMPAEET49-hKG}`EN59OI* z$}>4>`AM4TDFsuKb2T|x*-3dR$?0i%m^{lPKUb6HrzuF!oc`~3B<_;n31mmC`CYHP z8;27I6y96+{i>55L+`OM$NP-n0}joe&TJP*UPiDlrSXjSnV!P-cZ+HM`)!Y%EVQp$ bz3b$J2cI3>qn-6*V#4A!$wNZgu}=OENyjXi diff --git a/resources/gba_db_builder.py b/resources/gba_db_builder.py index 12e8607..7f8ca36 100644 --- a/resources/gba_db_builder.py +++ b/resources/gba_db_builder.py @@ -1,69 +1,78 @@ -# open_agb_firm gba_db.bin Builder v1.2 +# open_agb_firm gba_db.bin Builder v2.0 # By HTV04 - +# # This script parses MAME's gba.xml (found here: https://github.com/mamedev/mame/blob/master/hash/gba.xml) and converts it to a gba_db.bin file for open_agb_firm. -# This script should work with any updates to MAME's gba.xml, unless something this script expects is changed. +# No-Intro's GBA DAT is also used for filtering and naming (found here: https://datomatic.no-intro.org/). The DAT should be renamed to "gba.dat". +# +# This script should work with any updates to MAME's gba.xml and the No-Intro DAT, unless something this script expects is changed. import math import xml.etree.ElementTree as ET -# Use title, title ID, SHA-1, size, and save type to generate gba_db entry as binary string -def gbadbentry(title, titleid, sha, size, savetype): +# Use title, serial, SHA-1, size, and save type to generate gba_db entry as binary string +def gbadbentry(title, serial, sha, size, savetype): entry = b'' - entry += title.encode().ljust(200, b'\x00') # Pad to 200 bytes with null bytes - entry += titleid.encode() - entry += bytes.fromhex(sha) + entry += title.encode().ljust(200, b'\x00') + entry += serial.encode().ljust(4, b'\x00') + entry += bytes.fromhex(sha).ljust(20, b'\x00') entry += (int(math.log(size, 2)) << 27 | savetype).to_bytes(4, 'little') # Save type is stored weirdly - return entry # Entry size is 228 bytes in length + return entry # Entry size is 228 bytes total if __name__ == '__main__': - root = ET.parse('gba.xml').getroot() - gbadb = b'' + skipcount = 0 + count = 0 + addcount = 0 - for software in root.findall('software'): - # Obtain title - title = software.find('description').text - - # Obtain title ID - titleid = '\x00\x00\x00\x00' # If a title ID can't be found, default to null bytes - for info in software.findall('info'): - if info.get('name') == 'serial': - for i in info.get('value').split('-'): # Hacky script that checks for the first part of the serial that has 4 characters, since serials vary - s = i.strip() - if len(s) == 4: - titleid = s + gba = ET.parse('gba.xml').getroot() # MAME gba.xml + nointro = ET.parse('gba.dat').getroot() # No-Intro GBA DAT + + addentries = False # Determine whether to include additional entries + + # Start adding entries + for software in gba.findall('software'): + for part in software.findall('part'): + if part.get('name') == 'cart': + # Obtain CRC32 for No-Intro DAT matching + for dataarea in part.findall('dataarea'): + if dataarea.get('name') == 'rom': + crc = dataarea.find('rom').get('crc') break - break - - for part in software.findall('part'): - if part.get('name') == 'cart': - # Obtain SHA-1 - for dataarea in part.findall('dataarea'): - if dataarea.get('name') == 'rom': - size = int(dataarea.get('size'), 0) # Base 0 so int can decide whether string is decimal or hex - - sha = dataarea.find('rom').get('sha1') - - break + # Obtain title, serial, SHA-1, and size from No-Intro DAT + matchfound = False + for game in nointro.findall('game'): + for rom in game.findall('rom'): + if rom.get('crc') == crc.upper(): + matchfound = True + + title = game.get('name') + serial = rom.get('serial') + if serial in (None, 'N/A'): + serial = '\x00\x00\x00\x00' # If a serial can't be found, default to null bytes + sha = rom.get('sha1') + size = int(rom.get('size')) + + # If not in No-Intro DAT, skip entry + if matchfound == False: + break # Obtain save type savetype = 15 # If a save type can't be found or is unknown, set to "SAVE_TYPE_NONE" for feature in part.findall('feature'): if feature.get('name') == 'slot': slottype = feature.get('value') - if slottype == 'gba_eeprom_4k': + if slottype in ('gba_eeprom', 'gba_eeprom_4k'): savetype = 0 # SAVE_TYPE_EEPROM_8k - if size > 16777216: # If greater than 16 MB, change save type + if size > 0x1000000: # If greater than 16 MB, change save type savetype += 1 # SAVE_TYPE_EEPROM_8k_2 elif slottype == 'gba_eeprom_64k': savetype = 2 # SAVE_TYPE_EEPROM_64k - if size > 16777216: # If greater than 16 MB, change save type + if size > 0x1000000: # If greater than 16 MB, change save type savetype += 1 # SAVE_TYPE_EEPROM_64k_2 elif slottype == 'gba_flash_rtc': savetype = 8 # SAVE_TYPE_FLASH_512k_PSC_RTC @@ -78,9 +87,36 @@ if __name__ == '__main__': break + # If not in No-Intro DAT, skip entry + if matchfound == False: + print ('Skipped "' + software.find('description').text + '"') + skipcount += 1 + + continue + # Expand gba_db with entry - gbadb += gbadbentry(title, titleid, sha, size, savetype) + gbadb += gbadbentry(title, serial, sha, size, savetype) + + print('Added entry "' + software.find('description').text + '"') + count += 1 + + # Add additional entries + if addentries == True: + gbadbentries = ([['Example Game', 'WIP', '', 0x1000000, 14]]) + + print() + + for title, serial, sha, size, savetype in gbadbentries: + gbadb += gbadbentry(title, serial, sha, size, savetype) + + print('Added additional entry "' + title + '"') + addcount += 1 # Create and write to gba_db.bin with open('gba_db.bin', 'wb') as f: f.write(gbadb) + +if addentries == True: + print('\n' + str(count) + ' entries added, ' + str(addcount) + ' additional entries added, ' + str(skipcount) + ' entries skipped') +else: + print('\n' + str(count) + ' entries added, ' + str(skipcount) + ' entries skipped') diff --git a/source/arm11/open_agb_firm.c b/source/arm11/open_agb_firm.c index 4b03d5a..025c40b 100644 --- a/source/arm11/open_agb_firm.c +++ b/source/arm11/open_agb_firm.c @@ -216,19 +216,8 @@ static u16 checkSaveOverride(u32 gameCode) // Generalizations {"\0\0\0\0", SAVE_TYPE_SRAM_256k}, // Homebrew (TODO: Set WAITCNT to 0x4014?) - // Games - {"BTA\0", SAVE_TYPE_EEPROM_64k}, // Astro Boy - Omega Factor - {"B2D\0", SAVE_TYPE_EEPROM_64k}, // Donkey Kong Country 2 - {"AZL\0", SAVE_TYPE_EEPROM_64k}, // Legend of Zelda, The - A Link to the Past & Four Swords - {"A88\0", SAVE_TYPE_EEPROM_64k}, // Mario & Luigi - Superstar Saga - {"B8M\0", SAVE_TYPE_EEPROM_64k}, // Mario Party Advance - {"A6M\0", SAVE_TYPE_EEPROM_64k}, // Mega Man & Bass - {"BIJE", SAVE_TYPE_EEPROM_64k}, // Sonic The Hedgehog - Genesis - {"AA2\0", SAVE_TYPE_EEPROM_64k}, // Super Mario Advance 2 - {"A3A\0", SAVE_TYPE_EEPROM_64k}, // Super Mario Advance 3 - // Homebrew - {"GMB\0", SAVE_TYPE_SRAM_256k}, // Goomba Color (Homebrew) + {"GMB\0", SAVE_TYPE_SRAM_256k}, // Goomba Color }; for(u32 i = 0; i < sizeof(overrideLut) / sizeof(*overrideLut); i++)