diff --git a/AddOffsets b/AddOffsets new file mode 100755 index 0000000..cca16e8 --- /dev/null +++ b/AddOffsets @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +from sys import argv + +offset = int(argv[1][2:], 16) + +f = open(argv[2]) + +for l in f: + print('%s\t\t\t\t\t\t\t\t\t\t\t\t; 0x%06x' % (l.rstrip(), offset)) + offset += 4 diff --git a/DataForkToRez b/DataForkToRez new file mode 100755 index 0000000..53da70f --- /dev/null +++ b/DataForkToRez @@ -0,0 +1,10 @@ +#!/bin/sh + +if [[ $# -lt 4 || $# -gt 5 ]]; then + echo "Usage: $0 IN OUT TYPE ID" + exit 1 +fi + +echo "data '$3' ($4, \"$5\") {" >> "$2" +xxd -p "$1" | sed s/^/\$\"/ | sed s/$/\"/ >> "$2" +echo "};" >> "$2" diff --git a/DumpAsmStrings b/DumpAsmStrings new file mode 100755 index 0000000..9becffe --- /dev/null +++ b/DumpAsmStrings @@ -0,0 +1,66 @@ +#!/usr/bin/python3 + +from sys import argv, stderr + +st = '\t' +tl = 4 +ll = 80-tl +pl = ll-8 + +with open(argv[1], 'rb') as f: + bin = f.read() + +start = 0 + +print("\tSTRING AsIs", end='\r') +print("\t", end='\r') + +nl = True + +while start < len(bin): + end = bin.find(b'\0', start) + if end == -1: + end = len(bin) + else: + end += 1 + + raw = [bin[start:end]] + + while True: + itm = raw[-1] + if len(itm) == 1: break + idx = None + for test in [b'\0', b'\x0d']: + found = itm.find(test) + if found != -1: + if idx is not None: + idx = min(idx, found) + else: + idx = found + + if idx is None: break + + ins = [itm[:idx], itm[idx:idx+1], itm[idx+1:]] + if not ins[-1]: ins = ins[:-1] + if not ins[0]: ins = ins[1:] + raw[-1:] = ins + + raw = ', '.join("0" if s==b'\0' else '0x0d' if s==b'\x0d' else "'%s'" % s.decode('ascii').replace("'", "''").replace('\\', '\\\\') for s in raw) + + srep = "DC.B " + raw + cmt = '; 0x%04x' % (start + int(argv[2])) + + if len(srep) + len(cmt) > ll: + if not nl: + print(st, end='\r') + + print(st + srep, end='\r') + print(st + st * ((pl+3)//tl) + cmt, end='\r') + + print(st, end='\r') + nl = True + else: + print(st + srep + st * ((pl-len(srep)+3)//tl) + cmt, end='\r') + nl = False + + start = end diff --git a/GetDeclRom b/GetDeclRom new file mode 100755 index 0000000..7794219 --- /dev/null +++ b/GetDeclRom @@ -0,0 +1,16 @@ +#!/usr/bin/python + +import sys +import struct + +f = open(sys.argv[1], 'rb') +rom = f.read() +f.close() + +top, = struct.unpack('>L', rom[0x40:0x44]) + +declrom = rom[rom.rindex('kckckckc', 0, top) + 8 : top] + +f = open(sys.argv[2], 'wb') +f.write(declrom) +f.close diff --git a/GetMainCode b/GetMainCode new file mode 100755 index 0000000..ae2fd69 --- /dev/null +++ b/GetMainCode @@ -0,0 +1,12 @@ +#!/bin/sh + +if [[ $# -ne 2 ]]; then + echo "Usage: $0 RomMondo RomImageL" + exit 1 +fi + +dd if="$1" of="$2" count=1 bs=$((0x`xxd -p -s $((0x1a)) -l 4 "$1"`)) &> /dev/null +dd if=/dev/zero of="$2" bs=1 seek=$((0x0)) count=$((0x4)) conv=notrunc &> /dev/null +dd if=/dev/zero of="$2" bs=1 seek=$((0x1a)) count=$((0x4)) conv=notrunc &> /dev/null +dd if=/dev/zero of="$2" bs=1 seek=$((0x30)) count=$((0x10)) conv=notrunc &> /dev/null +dd if=/dev/zero of="$2" bs=1 seek=$((0x40)) count=$((0x4)) conv=notrunc &> /dev/null diff --git a/GetRomResources b/GetRomResources new file mode 100755 index 0000000..7585f17 --- /dev/null +++ b/GetRomResources @@ -0,0 +1,570 @@ +#!/usr/bin/python +# coding=macroman + +import struct +from sys import argv +import os +from os import path + + + +plainchars = '.............................. !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~.' + chr(0xf0) + '' +print len(plainchars) + + + +if len(argv) == 3: + rezdest = argv[2] +elif len(argv) == 2: + rezdest = None +else: + print 'Usage: %s ROM PREBUILT_DIR' % argv[0] + exit + +f = open(argv[1], 'rb') +rom_bin = f.read() +f.close() + + +rrsrcs = [] # populated by dump_rrsc() +makerules = [] +allconds = [] + +align_offset = lambda offset, align: (offset + align - 1) & ~(align - 1) +pad_offset = lambda offset, align: (offset + align - 1) & ~(align - 1) + +COMBO_FIELDS = { + 0x40: 'AppleTalk1', + 0x20: 'AppleTalk2', + 0x30: 'AppleTalk2_NetBoot_FPU', + 0x08: 'AppleTalk2_NetBoot_NoFPU', + 0x10: 'NetBoot', + 0x78: 'AllCombos', +} + + +def rezname(rsrcname): + rezfile = rsrcname.split(':')[-1] + if rezfile.lower().endswith('.rsrc'): rezfile = rezfile[:-5] + rezfile = rezfile + '.r' + return rezfile + +def dump_rrsc(r, rrsc=999, name='', file=(), cond='kUniversal'): + if not r: return '' + + if not cond in allconds: allconds.append(cond) + + tab = '\t' + ls = [] + + ls.append('resource \'rrsc\' (%d, "%s") {' % (rrsc, name)) + ls.append(tab + cond + ',') + ls.append(tab + r[0].combo_field + ',') + for el in file: + if not el.startswith('{'): el = '"' + el + '"' + ls.append(tab + el + ',') + ls.append('') + ls.append(tab + '{') + + typelist = [] + + for res in r: + if not typelist or typelist[-1][0] != res.type: + typelist.append((res.type, [])) + + typelist[-1][1].append(res) + + for t, reses in typelist: + ls.append(tab + tab + "'" + t + "',") + nums = ", ".join([str(res.id) + ('',' /*'+res.name+'*/')[bool(res.name)] for res in reses]) + ls.append(tab + tab + "{ " + nums + " };") + + ls.append(tab + '}') + ls.append('};') + + rrsrcs.append('\n'.join(ls)) + + if rezdest != None: + # now pick a rez file to dump this sucker to + rezfile = rezdest + '/' + rezname(file[-1]) + + # and I guess I'll need to make it... + if not file in makerules: makerules.append(file) + + f = open(rezfile, 'a') + for res in r: + f.write(str(res)) + f.close() + + +class Rsrc: + def __init__(self, rom_bin, my_offset): + #print 'ref at 0x%08x' % my_offset + rsrc_s_fmt = '> B 7x L L 4s h c 256p' # Struct actually padded to 16b to fit pstring + rsrc_s_len = struct.calcsize(rsrc_s_fmt) + rsrc_s = rom_bin[my_offset : my_offset + rsrc_s_len] + rsrc_s_tuple = struct.unpack(rsrc_s_fmt, rsrc_s) + + (self.combo_field, + self.next_offset, data_offset, + self.type, self.id, + attrs, self.name) = rsrc_s_tuple + + self.combo_field = COMBO_FIELDS[self.combo_field] + + rsrc_s_len_actual = pad_offset(rsrc_s_len - 256 + len(self.name), 16) + + #print 'res at 0x%08x' % data_offset + mm_header_fmt = '> L L L' + mm_header_len = struct.calcsize(mm_header_fmt) + mm_header = rom_bin[data_offset - mm_header_len : data_offset] + mm_header_tuple = struct.unpack(mm_header_fmt, mm_header) + + (mm_attrs, block_len, mm_bogus_ptr_ptr) = mm_header_tuple + #print '0x%08x 0x%08x %s %s %s' % (block_len, mm_bogus_ptr_ptr, self.type, str(self.id).rjust(6), self.name) + + #print ('0x%08x' % mm_attrs) + #if mm_attrs != 0xc0a00000: print "Wrong Memory Manager attributes" + + self.data = rom_bin[data_offset : data_offset + block_len - mm_header_len] + + def __str__(self): + + if self.name: + firstline = 'data \'%s\' (%d, "%s") {' % (self.type, self.id, self.name) + else: + firstline = 'data \'%s\' (%d) {' % (self.type, self.id) + + a = [firstline] + + # This is now horribly horribly slow, but it round-trips with Rez/DeRez *perfectly* + for l in range(0, len(self.data), 16): + dat = self.data[l:l+16] + + hex = ' '.join([dat[m:m+2].encode('hex') for m in range(0, len(dat), 2)]).upper() + cmt = ''.join([plainchars[ord(x)] for x in dat]).replace('*/','*.') + ln = ('\t$"%s"' % hex).ljust(55) + ln = '%s/* %s */' % (ln, cmt) + a.append(ln) + + a.append('};') + a.append('') + a.append('') + return '\r'.join(a) + + +(map_offset,) = struct.unpack('>L', rom_bin[0x1A : 0x1A + 4]) + +map_s_fmt = '>Lbbhh' +map_s_len = struct.calcsize(map_s_fmt) +map_s = rom_bin[map_offset:map_offset + map_s_len] +(offsetToFirst, maxValidIndex, comboFieldSize, comboVersion, headerSize) = struct.unpack(map_s_fmt, map_s) + +print 'maxValidIndex = %d, comboFieldSize = %d, comboVersion = %d, headerSize = %d' % (maxValidIndex, comboFieldSize, comboVersion, headerSize) + +res = [] + +next_offset = offsetToFirst +while next_offset != 0: + r = Rsrc(rom_bin, next_offset) + res.append(r) + fname = '/tmp/%s.%d' % (r.type, r.id) + r.tmpname = fname + #print 'Tools/DataForkToRez "%s" "%s" "%s" "%d" "%s";' % (fname, 'RomDump.r', r.type, r.id, r.name) + f = open(fname, 'wb') + f.write(r.data) + f.close() + + next_offset = r.next_offset + +res.reverse() + +#for r in res: +# print '%s %s %sb %s' % (r.type, str(r.id).ljust(6), str(len(r.data)).rjust(6), r.name) + + +# now try to dump these intelligently + + + + +# These will probably need more work before they're good for an OldWorld ROM + +# Boot beep resources.... + +cur = [] +while res and (res[0].type, res[0].id) in [('beep',0)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=105, name='TNT Boot beep (delete me!)', file=('{MiscDir}','BootBeep.rsrc'), cond='hasGrandCentral') + +cur = [] +while res and (res[0].type, res[0].id) in [('beep',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=110, name='TNT error beep (delete me!)', file=('{MiscDir}','ErrorBeep.rsrc'), cond='hasGrandCentral') + +cur = [] +while res and (res[0].type, res[0].id) in [('beep',2)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=110, name='Spartacus boot beep (delete me!)', file=('{MiscDir}','BootBeep.rsrc'), cond='hasGrandCentral') + +cur = [] +while res and (res[0].type, res[0].id) in [('snd ',-32256)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=106, name='STP Boot beep (delete me!)', file=('{MiscDir}','BootBeep.rsrc'), cond='STP') + +cur = [] +while res and (res[0].type, res[0].id) in [('snd ',-32255)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=111, name='STP error beep (delete me!)', file=('{MiscDir}','ErrorBeep.rsrc'), cond='STP') + +# end of fixed-position resources + + + +cur = [] +while res and res[0].type in 'boot rovm rov#': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=10, name='Gibbly Guts', file=('{RsrcDir}','Gibbly.rsrc')) + +cur = [] +while res and res[0].type in 'boot rovm': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=12, name='Gibbly Rsrc', file=('{RsrcDir}','Gibbly.rsrc'), cond='hasROMGibbly') + +cur = [] +while res and res[0].type in 'CURS FONT FOND snd ': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=20, name='ROMFonts', file=('{RsrcDir}','ROMFonts.rsrc')) + +cur = [] +while res and res[0].type in 'KCHR vadb KMAP KCAP': cur.append(res.pop(0)) +dump_rrsc([r for r in cur if not 6 <= r.id <= 7], rrsc=30, name='kbd', file=('{RsrcDir}','kbd.rsrc')) +dump_rrsc([r for r in cur if 6 <= r.id <= 7], rrsc=35, name='Portable kbd', file=('{RsrcDir}','kbd.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('CDEF',0),('CDEF',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=40, name='ControlMgr', file=('{RsrcDir}','ControlMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('MBDF',0),('MDEF',0)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=50, name='MenuMgr', file=('{RsrcDir}','MenuMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and res[0].type in 'accl pslt(??) icl4 icl8 ICN# ics# ics4 ics8 cicn clut ppat pixs': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=60, name='MiscROMRsrcs', file=('{RsrcDir}','MiscROMRsrcs.rsrc')) + +cur = [] +while res and res[0].type in 'PICT': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=61, name='MiscROMRsrcs', file=('{RsrcDir}','MiscROMRsrcs.rsrc'), cond='hasSCSIDiskModeFeature') + +cur = [] +while res and 'EDisk' in res[0].name: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=70, name='EDisk', file=('{RsrcDir}','EDisk.rsrc'), cond="hasEDisk") + +cur = [] +while res and res[0].type in 'DRVR nlib Libr CD33 CD34': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=75, name='BlueBox', file=('{RsrcDir}','BlueBox.rsrc'), cond="Classic") + +cur = [] +while res and res[0].type in 'clut gama mitq': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=80, name='CQD', file=('{RsrcDir}','CQD.rsrc')) + +cur = [] +while res and res[0].type in 'WDEF wctb cctb': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=90, name='WindowMgr', file=('{RsrcDir}','WindowMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',0),('LDEF',0),('LDEF',19)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=100, name='ListMgr', file=('{RsrcDir}','ListMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',3)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=110, name='StandardFile', file=('{RsrcDir}','StandardFile.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and res[0].type == 'DRVR': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=550, name='BlueBox2', file=('{RsrcDir}','BlueBox.rsrc'), cond="Classic") + +cur = [] +while res and res[0].type == 'PACK' and 4 <= res[0].id <= 5 and res[0].combo_field == 'AppleTalk2_NetBoot_FPU': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=120, name='InSane', file=('{RsrcDir}','InSane.rsrc'), cond='has040MMU') + +cur = [] +while res and res[0].type == 'PACK' and 4 <= res[0].id <= 5: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=130, name='Sane1', file=('{RsrcDir}','InSaneNFPU.rsrc')) + +cur = [] +while res and res[0].type == 'PACK' and res[0].id == 7: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=140, name='Sane2', file=('{RsrcDir}','Sane.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',8)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=150, name='AppleEventMgr', file=('{RsrcDir}','AppleEventMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',9),('ppcc',-5856)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=160, name='PPC', file=('{RsrcDir}','PPC.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',11)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=170, name='EditionMgr', file=('{RsrcDir}','EditionMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('wedg',-5760),('wedg',-5759),('PACK',12)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=180, name='ColorPicker', file=('{RsrcDir}','ColorPicker.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and res[0].type in 'cmtb proc snd LDEF': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=190, name='CommToolBox', file=('{RsrcDir}','CommToolbox.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',13),('proc',-5728),('proc',-5727)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=200, name='DataAccessMgr', file=('{RsrcDir}','DataAccessMgr.rsrc'), cond='hasDataAccessPACK') + +cur = [] +while res and (res[0].type, res[0].id) in [('dimg',-16385)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=500, name='DictionaryMgr', file=('{RsrcDir}','DictionaryMgr.rsrc'), cond='!NewWorld') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',14),('WDEF',126)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=210, name='HelpMgr', file=('{RsrcDir}','HelpMgr.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and (res[0].type, res[0].id) in [('PACK',15)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=220, name='PictUtilities', file=('{RsrcDir}','PictUtilities.rsrc'), cond='hasSysSevenResources') + +cur = [] +while res and 'Sony' in res[0].name: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=230, name='Sony', file=('{RsrcDir}','Sony.rsrc'), cond='!NewWorld') + +cur = [] +while res and (res[0].type, res[0].id) in [('iopc',0)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=240, name='SCCIOP', file=('{RsrcDir}','SCCIOP.rsrc'), cond='hasIopScc') + +cur = [] +while res and (res[0].type, res[0].id) in [('SERD',0)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=250, name='Serial', file=('{RsrcDir}','Serial.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('SERD',60),('SERD',61)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=260, name='SerialIOP', file=('{RsrcDir}','Serial.rsrc'), cond='hasIopScc') + +# PDM has SERD, TNT and later have nsrd +cur = [] +while res and (res[0].type, res[0].id) in [('SERD',1),('nsrd',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=270, name='SerialDMA', file=('{RsrcDir}','SerialDMA.rsrc'), cond="hasPSC || hasAMIC") + +cur = [] +while res and (res[0].type, res[0].id) in [('shal',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=281, name='SerialHALPSC', file=('{RsrcDir}','SerialDMA.rsrc'), cond="hasPSC") + +cur = [] +while res and (res[0].type, res[0].id) in [('shal',2)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=282, name='SerialHALAMIC', file=('{RsrcDir}','SerialDMA.rsrc'), cond="hasAMIC") + +cur = [] +while res and (res[0].type, res[0].id) in [('iopc',2)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=290, name='SWIMIOP', file=('{RsrcDir}','SWIMIOP.RSRC'), cond="hasIopSwim") + +cur = [] +while res and (res[0].type in 'lmgr drvr atlk ltlk iopc' or (res[0].type == 'DRVR' and res[0].id in (9, 10, 40, 125, 126, 127))): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=300, name='AppleTalk', file=('{RsrcDir}','AppleTalk.ROM.RSRC'), cond="hasAppleTalkInROM") + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',60)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=320, name='ATBoot', file=('{RsrcDir}','ATBoot.RSRC'), cond="hasNetBoot") + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',49)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=330, name='NetBoot', file=('{RsrcDir}','NetBoot.RSRC'), cond="hasNetBoot") + +cur = [] +while res and (res[0].type, res[0].id) in [('dfrg',-20722),('icns',-20722),('STR ',-20722)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=335, name='LANDisk', file=('{RsrcDir}','LANDisk.rsrc'), cond='NewWorld') + +# Possibly this should go a bit lower? +cur = [] +while res and (res[0].type, res[0].id) in [('attx',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=340, name='AppleIIFonts', file=('{RsrcDir}','ROMApple2Fonts.RSRC'), cond="hasApple2Fonts") + +cur = [] +while res and res[0].id == -16515: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=435, name='Native BCScreen', file=('{RsrcDir}','BCScreen.rsrc'), cond='NewWorld') + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',4)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=350, name='NewAge', file=('{RsrcDir}','NewAge.RSRC'), cond='hasNewAge') + +cur = [] +while res and (res[0].type, res[0].id) in [('rtmr',0)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=360, name='RealTimeMgr', file=('{RsrcDir}','RTMgr.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',51),('3210',0),('3210',1),('3210',2),('3210',3),('3210',4)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=361, name='RTDrvr', file=('{RsrcDir}','RTDrvr.rsrc'), cond='hasDSP') + + +# be suspicious of these... + +cur = [] +while res and (res[0].type, res[0].id) in [('dspf',128)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=370, name='StdSndInput', file=('{RsrcDir}','StdSndInput.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('dspf',128)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=380, name='StdSndMidput', file=('{RsrcDir}','StdSndMidput.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('dspf',128)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=390, name='StdSndOutput', file=('{RsrcDir}','StdSndOutput.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('dspf',128)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=401, name='StdSndPlayer', file=('{RsrcDir}','StdSndPlayer.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('rtmr',1)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=410, name='RTSnd', file=('{RsrcDir}','RTSnd.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('dspf',128)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=420, name='ZoundBlueInputAdaptor', file=('{RsrcDir}','ZoundBlueInputAdaptor.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',-16565)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=430, name='RTSndIn', file=('{RsrcDir}','RTSndIn.rsrc'), cond='hasDSP') + +cur = [] +while res and (res[0].type, res[0].id) in [('thng',-16727)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=440, name='VDigT', file=('{RsrcDir}','VDigT.rsrc'), cond='hasVideoIn') + +cur = [] +while res and (res[0].type, res[0].id) in [('code',-16729)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=445, name='VDigC', file=('{RsrcDir}','VDigC.rsrc'), cond='hasVideoIn') + +cur = [] +while res and (res[0].type, res[0].id) in [('thng',-16728)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=450, name='I2CT', file=('{RsrcDir}','I2CT.rsrc'), cond='hasVideoIn') + +cur = [] +while res and (res[0].type, res[0].id) in [('code',-16730)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=455, name='I2CC', file=('{RsrcDir}','I2CC.rsrc'), cond='hasVideoIn') + +cur = [] +xx = [('DRVR',127)] +xx += [('enet',id) for id in [8, 46, 78, 79]] +xx += [('ecfg',id) for id in [19, 20, 22, 26, 27, 30, 35, 36, 41, 42, 52, 86, 89, 90, 93, 94, 95,104,116,117,118,119,120,121,122,123]] +xx += [('ecf2',id) for id in [-4,-3,-2,-1]] +while res and (res[0].type, res[0].id) in xx: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=460, name='Ethernet', file=('{RsrcDir}','Ethernet.RSRC'), cond='!NewWorld') + +cur = [] +while res and (res[0].type == 'ecfg' and res[0].id in (43, 60, 78, 79)): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=461, name='Ethernet2', file=('{RsrcDir}','MACEecfg.rsrc'), cond='hasMace') + +cur = [] +while res and (res[0].type, res[0].id) in [('ptch',42)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=470, name='VM', file=('{RsrcDir}','VM.RSRC'), cond='hasVMinROM') + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',-16511),('ndrv',-16511)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=480, name='Backlight', file=('{RsrcDir}','Backlight.RSRC'), cond='hasLCDScreen') + +cur = [] +while res and res[0].type in 'CDEF DRVR proc sift nift nsnd adio thng ICON slib nlib STR ': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=490, name='Sound', file=('{RsrcDir}','SoundMgr.rsrc'), cond='!NewWorld') + +cur = [] +while res and res[0].type == 'GARY': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=501, name='EmulatorAccelerations', file=('{MiscDir}','EmulatorAccelerations.rsrc'), cond='hasMixedMode') + +cur = [] +while res and (res[0].type, res[0].id) in [('ncod',2),('nlib',3)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=599, name='Multiprocessing', file=('{RsrcDir}','Multiprocessing.rsrc'), cond='hasMixedMode && NewWorld') + +cur = [] +while res and res[0].type in 'ncod nlib ntrb cfrf': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=502, name='GoNative', file=('{MiscDir}','GoNativeResources'), cond='hasMixedMode') + +cur = [] +while res and 'BCScreen' in res[0].name: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=435, name='BCScreen', file=('{RsrcDir}','BCScreen.rsrc'), cond='TNTPlus') + +# scod resources are CODEs that don't confuse the Process manager +cur = [] +while res and res[0].type == 'scod': cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=600, name='Mystery scods', file=('{RsrcDir}','MysteryCode.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('DRVR',53),('DRVR',-20175)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=605, name='ATA DRVRs', file=('{RsrcDir}','ATA.rsrc')) + +cur = [] +while res and (res[0].type == 'ndrv' and 99 <= res[0].id < 110): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=606, name='Display and sound drivers', file=('{RsrcDir}','MachineSpecificVideoSound.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('ncod',50)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=607, name='NativeNub -- for MacsBug?', file=('{RsrcDir}','MysteryCode.rsrc')) + +cur = [] +while res and (res[0].type.startswith('lib') or res[0].type.startswith('sl0')): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=608, name='Weird OpenTxpt stuff', file=('{RsrcDir}','OpenTxptRom.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('nitt',43),('gcko',43)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=610, name='Native -- unsure?', file=('{RsrcDir}','MysteryCode.rsrc')) + +cur = [] +while res and res[0].id == -16600: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=615, name='Audio???', file=('{RsrcDir}','MysteryAudio.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('ndrv',-20166),('ndrv',-20181)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=620, name='PCCard/CardBus', file=('{RsrcDir}','PCCard.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('ndrv',-20164),('code',-20164)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=630, name='MediaBay', file=('{RsrcDir}','MediaBay.rsrc')) + +cur = [] +while res and sum([c in res[0].name.lower() for c in ('ata','ide')]): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=640, name='Real ATA Drivers', file=('{RsrcDir}','ATA.rsrc')) + +cur = [] +while res and (res[0].type, res[0].id) in [('ndrv',-20190),('ndrv',-20196)]: cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=645, name='Legacy', file=('{RsrcDir}','LegacyDrivers.rsrc')) + +cur = [] +while res and ('usb' in res[0].type or res[0].id == -20776 or 'USB' in res[0].name): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=650, name='USB', file=('{RsrcDir}','USB.rsrc')) + +cur = [] +while res and (res[0].id in [-21143,-21142,-21141,-21140,1207,-20994]): cur.append(res.pop(0)) +dump_rrsc(cur, rrsc=660, name='FireWire', file=('{RsrcDir}','FireWire.rsrc')) + +dump_rrsc(res, rrsc=999, name='EverythingElse', file=('{RsrcDir}','EverythingElse')) + + +# Our attempt at a RomResources.r +print '### Try to merge this into RomResources.r ###' +print '\n\n'.join(rrsrcs) + +print '\n\n\n' + +print '### Here is a list of all the link-time conditionals used above. ###' +print '\n'.join(['\t\t\t\t\t' + ltc.ljust(40) + u'' for ltc in allconds]).encode('macroman') + +print '\n\n\n' + +print '### Here is a list of all the rsrc files used above. ###' +print '\n'.join(['\t\t\t\t\t' + ('"' + ''.join(mr) + '"').ljust(40) + u'' for mr in makerules]).encode('macroman') + + + + + + + + + + + + + + + + + diff --git a/GetXcoffTbl b/GetXcoffTbl new file mode 100755 index 0000000..e69de29