diff --git a/deltachunkmatcher b/deltachunkmatcher new file mode 100755 index 0000000..0f5e9e8 --- /dev/null +++ b/deltachunkmatcher @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 + +from sys import argv +from itertools import cycle, islice +from subprocess import run + + +run(['sh', '-c', 'rm -f dcm*']) + + +def roundrobin(*iterables): + "roundrobin('ABC', 'D', 'EF') --> A D E B F C" + # Recipe credited to George Sakkis + num_active = len(iterables) + nexts = cycle(iter(it).__next__ for it in iterables) + while num_active: + try: + for next in nexts: + yield next() + except StopIteration: + # Remove the iterator we just exhausted from the cycle. + num_active -= 1 + nexts = cycle(islice(nexts, num_active)) + + +filenames = argv[1:] + + +roms = [None] * len(filenames) +for i, f in enumerate(filenames): + with open(f, 'rb') as fd: + roms[i] = fd.read() + + +path_offset_stop_tuples = [] + +with open(filenames[0] + '-info.txt') as f: + for l in f: + if '\t' not in l: continue + label, directive, *misc = l.split() + if directive.lower() != 'file': continue + + file_offset = int(label, 16) + file_path, _, _ = misc[0].partition(',') + + for l in f: + if '\t' not in l: continue + label, directive, *_ = l.split() + if directive.lower() != 'endf': continue + + file_len = int(label, 16) + + path_offset_stop_tuples.append((file_path, file_offset, file_len)) + break + +# for p, o, l in path_offset_stop_tuples: +# print(p, hex(o), hex(l)) + + +path_offset_bin_tuples = [] + +for p, o, s in path_offset_stop_tuples: + b = roms[0][o:s] + path_offset_bin_tuples.append((p,o,b)) + +skippery = 128 + + +single_letters = iter('bcdefg') + + +for n, r in zip(filenames[1:], roms[1:]): + print('Comparing %s against original %s' % (n, filenames[0])) + + sl = next(single_letters) + + for objpath, objoffset, objbin in path_offset_bin_tuples: + _, _, objname = objpath.rpartition('/') + + earlier = reversed(range(0, objoffset, 16)) + later = range(objoffset, len(r)-len(objbin)+16, 16) + bothways = roundrobin(later, earlier) + + for tryoffset in bothways: + # print(hex(tryoffset), end='=', flush=True) + objbincmp = r[tryoffset:tryoffset+len(objbin)] + + a = objbin[0:len(objbin):skippery] + b = objbincmp[0:len(objbin):skippery] + + maxmatches = len(a) + matches = sum(ax == bx for (ax, bx) in zip(a, b)) + # print(str(int(matches*100/len(objbin))) + '%', end= ' ', flush=True) + if matches * 3 >= maxmatches: + print('Found %s at %X (moved from %X)' % (objname, tryoffset, objoffset)) + + with open('dcm-a-%05X-%s' % (objoffset, objname), 'wb') as f: + f.write(objbin) + with open('dcm-%s-%05X-%s-%05X' % (sl, objoffset, objname, tryoffset), 'wb') as f: + f.write(objbincmp) + + print('\tvbindiff dcm*%s*' % objname) + + break + + else: + print('Did not find %s' % objname) diff --git a/romc b/romc new file mode 100644 index 0000000..ba5d148 Binary files /dev/null and b/romc differ diff --git a/romc-info.txt b/romc-info.txt new file mode 100644 index 0000000..2bc2b83 --- /dev/null +++ b/romc-info.txt @@ -0,0 +1,51 @@ +0 ISLANDGUESS HIDE + +01000 FILE BuildResults/RISC/Obj/StartInterstix.c.o, WRITEOUT, MODGUESS, REFGUESS, ISLANDGUESS +1000 MOD INTERC_11E0_C2PSTRCPY +1050 MOD INTERC_1230 +1100 MOD INTERC_12E0_CODEPREPARE +1300 MOD INTERC_14E0 +13E0 MOD INTERC_15C0_CODEPREPARE2 +14B0 MOD INTERC_1690_CODEREGISTER +1570 MOD INTERC_1910_USBFAMILYEXPERTLIB +15E0 MOD INTERC_1980_DRIVERS +1900 MOD INTERC_2090_POWERMGR +19A0 MOD INTERC_2130_CARDBUS +1AC0 MOD INTERC_2250 +1B90 MOD INTERC_2320 +1BF0 MOD INTERC_2380 +1C50 MOD INTERC_23E0 +1CB0 MOD INTERC_2440 +1D30 MOD INTERC_24C0 +1DD0 ENDF + +1DD0 FILE boot1.o, WRITEOUT, REFGUESS +1E6A MOD ActualBoot1 +1FBA ENDF + +; all these names are bullshit -- fix! +5470 FILE BuildResults/RISC/Lib/IoPrimitives.lib, WRITEOUT, MODGUESS, REFGUESS +5470 ENTRY NWADBTABLE +5470 ENTRY CPUSPEEDJAWS +5470 ENTRY IOPR_ADB +5470 ENTRY NWCLOCKPRAM ; ??? +5470 ENTRY SNDCNTNEWWORLD ; ??? +5980 ENDF + +5d40 FILE BuildResults/RISC/Obj/BCScreenRelated.o, WRITEOUT, MODGUESS, REFGUESS +5d52 ENTRY INITBCSCREEN +61a0 ENDF + +18450 MOD SCSIMGR_1A8C0 +184A0 MOD SCSIMGR_1A910 +18620 MOD SCSIMGR_1AB60 +7EAB0 MOD ATAMGR_5DF30 +7EB30 MOD ATAMGR_5DFB0 +814B0 MOD DEVICEMGR_608E0 +C9280 MOD GETPTRSIZE +C9290 MOD GETHANDLESIZE +C9AC0 MOD c2pstr +C9BC0 MOD strcat +C9BE0 MOD strcmp +C9C10 MOD strcpy +C9C60 MOD strlen diff --git a/romc68 b/romc68 new file mode 100644 index 0000000..19657dc Binary files /dev/null and b/romc68 differ