diff --git a/BuildMiniVmac.sh b/BuildMiniVmac.sh new file mode 100755 index 0000000..0809291 --- /dev/null +++ b/BuildMiniVmac.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +ROMFILE="$(find ~/Documents/mac/MacROMan/TestImages -name '*9779D2C4*.ROM' | head -n1)" + +set -e -u -o pipefail + +cd $1 + +echo '#define kMaintainerName "Elliot build box"' >setup/CONFIGUR.i + +gcc setup/tool.c -o setup_t +./setup_t -t mc64 -m II -speed a -bg 1 -as 0 >setup_buildbox.bash + +chmod +x setup_buildbox.bash +./setup_buildbox.bash +make + +mkdir -p ~/Documents/buildmac +rm -rf ~/Documents/buildmac/{minivmac,MacII.ROM} +cp -R minivmac.app ~/Documents/buildmac/ +cp "$ROMFILE" ~/Documents/buildmac/MacII.ROM diff --git a/CCompilerPatcher.py b/CCompilerPatcher.py new file mode 100755 index 0000000..00d79c4 --- /dev/null +++ b/CCompilerPatcher.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 + +# Patch the Apple C Compiler to output symbol-laden files unconditionally... without messing up the codegen! + +from collections import Counter + + +def do_everything(): + # Essential Patches + + # Sets the "version" of the output file (to 3) + force_value(2, 0x5048, 'OPENOBJECTFILE', 'move.b #gSymOn,d0') + + # Places Filename records + force_value(1, 0x842, 'OPENNEWFILE', 'move.b #gSymOn,d0') + + # Apparently we crash without this + force_value(26, 0x118, 'INITIALIZE', 'move.b #gSymOn,d0') + + # Inits something called the "file pos array" + force_value(25, 0x63e6, 'INITPROC', 'move.b #gSymOn,d0') + + # Ooooh boy... + # force_value(10, 0x4576, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + force_value(10, 0x47e6, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x4afe, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x4c62, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x4d8e, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x5116, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x51b8, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x52e6, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x5544, 'FUNCTIONDECL', 'move.b #gSymOn,d0') + # force_value(10, 0x4e3c, 'FUNCTIONDECL', 'move.b #gSymVars,d0') + # force_value(10, 0x4f56, 'FUNCTIONDECL', 'move.b #gSymVars,d0') + # force_value(10, 0x5142, 'FUNCTIONDECL', 'move.b #gSymVars,d0') + # force_value(10, 0x521a, 'FUNCTIONDECL', 'move.b #gSymVars,d0') + # force_value(10, 0x538a, 'FUNCTIONDECL', 'move.b #gSymVars,d0') + + + # One of these seems to annotate which files have been opened... + # force_value(1, 0x48, 'SETSCANFILE', 'move.b #gSymOn,d0') + + # One of these is required for the first "ModuleBegin"... can safely skip, apparently! + # force_value(1, 0x3fa2, 'PROG', 'move.b #gSymOn,d0') + # force_value(1, 0x40fe, 'PROG', 'move.b #gSymOn,d0') + # force_value(1, 0x4170, 'PROG', 'move.b #gSymVars,d0') + # force_value(1, 0x4250, 'PROG', 'move.b #gSymVars,d0') + # force_value(1, 0x486e, 'PROG', 'move.b #gSymOn,d0') + + + # force_value(6, 0x258a, 'EXPANDMACRO', 'and.b #gSymOn,d0') + # force_value(6, 0x441a, 'MACROLINE', 'move.b #gSymOn,d0') + # force_value(6, 0x508a, 'LOADFILE', 'cmp.b #gSymOn,d0') + # force_value(6, 0x5174, 'LOADFILE', 'move.b #gSymOn,d0') + # force_value(6, 0x6416, 'DUMPFILE', 'move.b #gSymOn,-$2190(a6)') + # force_value(6, 0x6720, 'DUMPFILE', 'move.b #gSymOn,d0') + # force_value(7, 0x7d4, 'PROTOPARMLIST', 'move.b #gSymVars,d0') + # force_value(7, 0x89a, 'PROTOPARMLIST', 'move.b #gSymOn,d0') + # force_value(7, 0xa80, 'PROTOPARMLIST', 'move.b #gSymVars,d0') + # force_value(7, 0xb16, 'PROTOPARMLIST', 'move.b #gSymOn,d0') + + + # Not required... + # force_value(7, 0x19f6, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x1d6e, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x1dec, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x2180, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x2296, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x2314, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x267a, 'DECLARATION', 'move.b #gSymOn,d0') + # force_value(7, 0x27c8, 'DECLARATION', 'move.b #gSymOn,d0') + + #... skipped some because bored! + + + # skipped some tedious "dumpfunction" symbols here! + + # force_value(25, 0x53d0, 'FORMATCODE', 'move.b #gSymOn,d0') + # force_value(25, 0x53d8, 'FORMATCODE', 'move.b #gSymLines,d0') + + + +def gappy_compare(actual_str, search_str): + if len(actual_str) != len(search_str): return False + + for actual_el, search_el in zip(actual_str, search_str): + if actual_el != search_el and search_el != 0x99: return False + + return True + + + +def scan_back(cursor, binary, *search_strs): + if cursor is None: cursor = len(binary) + + while cursor > 0: + cursor -= 1 + + for which, ss in enumerate(search_strs): + if gappy_compare(binary[cursor:cursor+len(ss)], ss): + return cursor, which + + return cursor, None + + + +def bool_global_a5_offset_from_SETSYMDEBUGOPTION(code): + # Count all the below opcodes, and the most common is accessing our desired global + most_common = Counter() + i = None + while True: + i, which = scan_back(i, code, b'\x1B\x7C\x00\x01\x99\x99') # MOVE.B #1,????(A5) + if which != 0: break + + a5 = bytes(code[i+4:i+6]) + most_common[a5] += 1 + + if most_common: + most_common, freq = most_common.most_common(1)[0] + return most_common + + +def patch_global_access_by_function(code, my_global): + global_access = b'\x10\x2d' + my_global # MOVE.B my_global(A5),D0 + + num_patches = 0 + i = None + while True: + if b'FUNCTIONDECL\0' in code: + i, which = scan_back(i, code, b'\x3f\x3c\x00\x04\x2f\x2d\x99\x99\x4e\x99\x99\x99') # MOVE.W #4,-(SP); MOVE.L ????(A5),-(SP); JSR ??????) + if which != 0: break + + i, which = scan_back(i, code, global_access) + if which != 0: break + + code[i:i+4] = b'\x10\x3c\x00\x01' # MOVE.B #1,D0 + num_patches += 1 + + return num_patches + + +def find_functions(segment): + offset = 0 + biglist = [] + while offset < len(segment): + next_offset = segment.find(b'NV', offset + 1) + if next_offset == -1: next_offset = len(segment) + biglist.append((offset, segment[offset:next_offset])) + offset = next_offset + return biglist + + +def do_better(all_resources): + segments = [r for r in all_resources if r.type == b'CODE' and r.id > 0] + + print('Patching C compiler to force some SADE symbols (selectively, without changing codegen)') + + a5glob = None + for segment in segments: + for offset, function in find_functions(segment): + if b'SETSYMDEBUGOPTION\0' in function: + a5glob = bool_global_a5_offset_from_SETSYMDEBUGOPTION(function) + + if a5glob is None: + print(' Could not find the -sym global. Stopping.') + return + + print(f' Found the -sym global: {hex(struct.unpack(">h", a5glob)[0])}(A5)') + + for segment in segments: + for offset, function in find_functions(segment): + for fname in ['OPENOBJECTFILE', 'OPENNEWFILE', 'INITIALIZE', 'INITPROC', 'FUNCTIONDECL']: + if fname.encode('ascii') + b'\0' in function: + num_patches = patch_global_access_by_function(function, a5glob) + if num_patches: + print(f' Hardcoded to true: {fname} (seg {segment.id} {repr(segment.name)} + {hex(offset)}) x{num_patches}') + segment[offset:offset+len(function)] = function + + + + + + + +import macresources +import re +import struct + +target = '/Users/elliotnunn/Documents/mac/supermario/worktree/cube-e/Tools/C.rdump' + +resources = list(macresources.parse_rez_code(open(target, 'rb').read())) + +def force_value(in_segment, at_offset, in_func_name, code): + known_globals = {'gSymLines': -0x1082, 'gSymTypes': -0x1081, 'gSymVars': -0x1080, 'gSymOn': -0x107f} + + for r in resources: + if r.id == in_segment and r.type == b'CODE': break + else: + raise ValueError('bad segment %r' % in_segment) + + m = re.match(r'move.b #(\w+),d0', code) + if not m: + print('Could not match %r' % code) + return + + if struct.unpack_from('>h', r, at_offset + 2)[0] != known_globals[m.group(1)]: + print('Bad code %r %r %r %r' % (in_segment, at_offset, in_func_name, code)) + return + + struct.pack_into('>HH', r, at_offset, 0x103C, 1) # WE ARE FORCING THINGS ON! + +# do_everything() + +# find_a5_offset_of_boolean_global(resources) +do_better(resources) + +open(target, 'wb').write(macresources.make_rez_code(resources, ascii_clean=True)) diff --git a/CategorizeRoms.py b/CategorizeRoms.py new file mode 100755 index 0000000..b6fb363 --- /dev/null +++ b/CategorizeRoms.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 + +import sys +import struct +from os import path + +biglist = [] + + +def could_be_rom(lb): + if not lb: return False + if lb == 0x300000: return True # special supermario case! + + while not (lb & 1): + lb >>= 1 + if lb != 1: return False + + return True + + +for rompath in sys.argv[1:]: + try: + if not could_be_rom(path.getsize(rompath)): continue + rom = open(rompath, 'rb').read() + except IsADirectoryError: + continue + + info = [] + + a, = struct.unpack_from('>H', rom, 8) + b, = struct.unpack_from('>H', rom, 18) + + + order = a << 64 + + + if a == 0x69: + info.append('Original') + elif a == 0x75: + info.append('Plus') + elif a == 0x178: + info.append('II') + elif a == 0x276: + info.append('SE') + elif a == 0x37a: + info.append('Portable') + elif a == 0x67c: + info.append('IIci') + if rom[18] == 0x15: + order += 1 << 63 + info.append('TERROR') + elif rom[18] == 0x17: + order += 2 << 63 + info.append('Zydeco') + elif rom[20] & 1: + order += 3 << 63 + info.append('Horror') + + elif a == 0x77d: + info.append('SuperMario') + else: + order = 0 + info.append('?-%X' % a) + + if a >= 0x300: + info.append('Rel-%04x' % b) + order += b << 32 + + if a == 0x77d: # SuperMario + info.append('SubVer-%x' % struct.unpack_from('>H', rom, 0x4c)) + order += struct.unpack_from('>H', rom, 0x4c)[0] + + + if a == 0x67c: + if b >= 0x12f1: info.append("EricksonSndMgr") + if b == 0x12f1: info.append("EricksonMistake") + + + biglist.append((order, ' '.join(info), rompath)) + +biglist.sort() +wid = max(len(s) for _, s, *_ in biglist) +for o, s, p in biglist: + print(s.ljust(wid + 4), p) diff --git a/NewestCKID.py b/NewestCKID.py index 42712d4..e46d783 100755 --- a/NewestCKID.py +++ b/NewestCKID.py @@ -33,7 +33,7 @@ # Byte = 0; import argparse -from macresources.do_what_i_mean import read +import macresources import os from os import path import struct @@ -62,7 +62,7 @@ for base, dirs, files in os.walk(args.src): files[:] = [f for f in files if f.endswith('.rdump')] for f in files: - resources = read(path.join(base, f)) + resources = list(macresources.parse_rez_code(open(path.join(base, f), 'rb').read())) for r in resources: if r.type == b'ckid': diff --git a/System7InSS.sh b/System7InSS.sh new file mode 100755 index 0000000..49f1ec2 --- /dev/null +++ b/System7InSS.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -euo pipefail + +rm -rf /tmp/SheepShaver7 +mkdir /tmp/SheepShaver7 +cp ~/Documents/mac/supermario/worktree/cube-e/BuildResults/System/System* /tmp/SheepShaver7/ +cp ~/Downloads/MacsBug\ 6.2.2/* /tmp/SheepShaver7/ +cp ~/Documents/mac/slow/sev-fun/Finder* /tmp/SheepShaver7/ + +MakeHFS -n SheepShaver7 -i /tmp/SheepShaver7 -s 20m -d now /tmp/SheepShaver7.dsk diff --git a/alias2ln.sh b/alias2ln.sh new file mode 100755 index 0000000..980c133 --- /dev/null +++ b/alias2ln.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +# http://hints.macworld.com/article.php?story=20021024064107356 + +if [ $# -eq 0 ]; then + echo "Usage: alias2ln alias1 alias2 alias3..." + echo " where alias1, alias2, etc are alias files." + echo " Each alias file will be converted into a symlink." +fi + +while [ $# -gt 0 ]; do + if [ -f "$1" -a ! -L "$1" ]; then + item_name=`basename "$1"` + item_parent=`dirname "$1"` + # Next two rows should be entered as one row # + item_parent="`cd \"${item_parent}\" 2>/dev/null && pwd || echo \"${item_parent}\"`" + item_path="${item_parent}/${item_name}" + line_1='tell application "Finder"' + line_2='set theItem to (POSIX file "'${item_path}'") as alias' + line_3='if the kind of theItem is "alias" then' + line_4='get the posix path of (original item of theItem as text)' + line_5='end if' + line_6='end tell' + # Next two rows should be entered as one row # + linksource=`osascript -e "$line_1" -e "$line_2" -e "$line_3" -e "$line_4" -e "$line_5" -e "$line_6"` + if [ $? -eq 0 ]; then + if [ ! -z "$linksource" ]; then + rm "$item_path" + ln -s "${linksource}" "${item_path}" + echo "\"${1}\" -> \"${linksource}\"" + fi + fi + shift + fi +done diff --git a/bloodbath b/bloodbath new file mode 100755 index 0000000..7d2f895 --- /dev/null +++ b/bloodbath @@ -0,0 +1,50 @@ +#!/bin/bash + +custer=custer +system=cube-e + +cd ~/Documents/mac + +sh -c "cd supermario/worktree/$custer && ./.build RISC" > /tmp/result-$custer & +sh -c "cd supermario/worktree/$system && ./.build System" > /tmp/result-$system & + +rm -rf /tmp/bbathrom* +cp MacROMan/TestImages/New*/*"Mac OS ROM 9.8.1.rom" /tmp/bbathrom +tbxi dump /tmp/bbathrom + +wait # for the builds above to complete + +echo ---------------------------------------------------------------- +echo $custer... +cat /tmp/result-$custer +echo ---------------------------------------------------------------- +echo $system... +cat /tmp/result-$system +echo ---------------------------------------------------------------- + +threemeg=`find /tmp/bbathrom.src -iname mac68krom` +cp supermario/worktree/$custer/BuildResults/RISC/Image/RomMondo $threemeg; rm -rf $threemeg.src +tbxi build /tmp/bbathrom.src -o /tmp/newrom.hqx +insertees="$insertees /tmp/newrom.hqx" + +Rhqx supermario/worktree/$system/BuildResults/System/System +mv supermario/worktree/$system/BuildResults/System/System.hqx /tmp/newsys.hqx +insertees="$insertees /tmp/newsys.hqx" + +cd ~/Documents/qemu + +insertees="$insertees ./newmxbg.hqx" + +cp test-template.img /tmp/test-boot.img +hmount /tmp/test-boot.img +for x in $insertees; do hcopy $x 'QEMU HD:System Folder:'; done +hrename 'QEMU HD:System Folder:Extensions' 'QEMU HD:Disabled Extensions' +humount + + +./qemu-system-ppc -L pc-bios -boot c -M mac99 -m 128 -prom-env 'auto-boot?=true' -prom-env 'aapl,debug=2000000' \ +-drive file=/tmp/test-boot.img,format=raw,media=disk \ +-prom-env 'vga-ndrv?=true' -device usb-mouse -device usb-kbd \ +-netdev user,id=network01 -device sungem,netdev=network01 + +rm -f /tmp/test-boot.img diff --git a/cmpscod.sh b/cmpscod.sh new file mode 100755 index 0000000..f3ba322 --- /dev/null +++ b/cmpscod.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +n=$1 +shift +o=$n +if [ "$#" != "0" ]; then o=$1; fi +Rez -o /tmp/ascod ~/MacSrc/Sys710.rdump 2>/dev/null +zcp /tmp/ascod//scod/$n /tmp/ascod$n +#zcp ~/MacFiles/System711//scod/$n /tmp/ascod$n +Rez -o /tmp/bscod BuildResults/System/Rsrc/System.rsrc.rdump +zcp /tmp/bscod//scod/$o /tmp/bscod$o + +exec vbindiff /tmp/ascod$n /tmp/bscod$o + +# NB: These truly are the sources to System 7.1, plus a tiny bit of sugar. \ No newline at end of file diff --git a/comparelp.sh b/comparelp.sh new file mode 100755 index 0000000..f6f1903 --- /dev/null +++ b/comparelp.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -m + +~/Documents/mac/slow/lpch/patch_rip.py ~/Documents/mac/supermario/worktree/cube-e/BuildResults/System/System.rdump -pj -w 64 -sh ~/Documents/mac/supermario/worktree/cube-e/BuildResults/System/Text/LinkPatchJumpTbl >/tmp/elliot && ~/Documents/mac/slow/lpch/patch_rip.py ~/Documents/mac/primary/Sys710x.rdump -pj -w 64 -sh ~/Documents/mac/supermario/worktree/cube-e/BuildResults/System/Text/LinkPatchJumpTbl >/tmp/apple && git diff --no-index -U999999999 /tmp/elliot /tmp/apple >/tmp/lpch.patch diff --git a/dump b/dump new file mode 100755 index 0000000..569299d --- /dev/null +++ b/dump @@ -0,0 +1,3 @@ +#!/bin/sh + +for x in "$@"; do SetFile -t 'OBJ ' -c 'MPS ' "$x"; mpw DumpObj "$x"; done diff --git a/dumpall b/dumpall new file mode 100755 index 0000000..6a9e018 --- /dev/null +++ b/dumpall @@ -0,0 +1,8 @@ +#!/bin/bash + +find "$1" -iname '*.o' -type f | while read -r x; do + if [ ! -e "$x.dmp" ] || [ "$x" -nt "$x.dmp" ]; then + echo "$x" + ~/MacSrc/dump "$x" > "$x.dmp" + fi +done diff --git a/fdump b/fdump new file mode 100755 index 0000000..89a876d --- /dev/null +++ b/fdump @@ -0,0 +1,9 @@ +#!/bin/bash + +t="`mktemp`" +for x in "$@"; do + touch "$t" + SimpleRez -o "$t"/..namedfork/rsrc <(echo "data 'xxxx' (0) {"; xxd -p "$x" | sed 's/^/$"/' | sed 's/$/"/'; echo "};") + mpw DumpCode -rt xxxx=0 "$t" +done +rm -f "$t" diff --git a/fsnek b/fsnek new file mode 100755 index 0000000..dee2107 --- /dev/null +++ b/fsnek @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 + +import sys +from os import path +import hashlib +import textwrap + + +# Thanks user25148: https://stackoverflow.com/questions/1131220/get-md5-hash-of-big-files-in-python +def generate_file_md5(filename, blocksize=2**20): + m = hashlib.md5() + with open(filename, 'rb') as f: + while True: + buf = f.read(blocksize) + if not buf: + break + m.update(buf) + return m.hexdigest() + + +def split_args_by_delim(xx): + retval = [[]] + for el in xx: + if el in ('', '--'): + retval.append([]) + else: + retval[-1].append(el) + return retval + + +def group_to_dict(group): + retval = {} + for filename in group: + key = path.basename(filename) + if key in retval: + raise ValueError('duplicate filename in same group: %r' % filename) + value = generate_file_md5(filename) + retval[key] = value + return retval + + +def indices(container, searchfor): + retval = [] + for i, el in enumerate(container): + if el == searchfor: + retval.append(i) + return retval + + +def where_do_snakes_go(hash_list): + hash_do_list = list(set(hash_list)) + hash_do_list.sort(key=hash_list.index) + + hash_y_dict = {} + occupied_points = set() + + # Next, try to cram everything else onto other lines... + for the_hash in hash_do_list: + if the_hash is None or hash_list.count(the_hash) == 1: + hash_y_dict[the_hash] = 0 + + else: + first_x = hash_list.index(the_hash) + last_x = len(hash_list) - list(reversed(hash_list)).index(the_hash) - 1 + + y = 1 + while any((x, y) in occupied_points for x in range(first_x, last_x + 1)): + y += 1 + + hash_y_dict[the_hash] = y + + for x in range(first_x, last_x + 1): + occupied_points.add((x, y)) + + return hash_y_dict + + +def one_snake(hash_list, col_width): + col_x = [i * col_width + (col_width + 1) // 2 for i in range(len(hash_list))] + + locs = where_do_snakes_go(hash_list) + + num_lines = max(locs.values()) + + lines = [] + for this_hash, hash_y in locs.items(): + if this_hash is None: continue + + while len(lines) <= hash_y: + lines.append([' '] * (col_width * len(hash_list))) + + which = indices(hash_list, this_hash) + which_x = [col_x[col] for col in which] + + for x in range(col_x[which[0]], col_x[which[-1]] + 1): + if x == col_x[which[0]]: + the_char = '\u2514' # '\' + elif x == col_x[which[-1]]: + the_char = '\u2518' # '/' + elif x in which_x: + the_char = '\u2534' # inv 'T' + else: + the_char = '\u2500' # '-' + + lines[hash_y][x] = the_char + + for ind in which: + lines[0][col_x[ind]] = '\u25CF' # '*' + + for ind in which: + x = col_x[ind] + for y in range(1, hash_y): + lines[y][x] = '\u2502' # '|' + + return '\n'.join(''.join(l).rstrip() for l in lines).rstrip('\n') + + +# uniques_by_name is a list of (name, [hash, ...]) +def snake_table(uniques_by_name, headings=None): + if headings: + col_width = max(len(h) for h in headings) + 1 + col_width = max(col_width, 5) + while col_width % 2 == 0: col_width += 1 + else: + col_width = 5 + + gutter_width = max(len(n) for n, uu in uniques_by_name) + + lines = [] + + for i, (name, uniques) in enumerate(uniques_by_name): + if lines: lines.append('') + + if i % 20 == 0 and headings: + lines.append((' ' * gutter_width) + ' ' + ''.join(h.center(col_width) for h in headings).rstrip()) + lines.append('') + + gutter = name + for line in one_snake(uniques, col_width).split('\n'): + lines.append(gutter.rjust(gutter_width) + ' ' + line) + gutter = '' + + return '\n'.join(lines) + + +# Cheeky experiment +if __name__ == '__main__' and sys.argv[1:2] == ['-r']: + import macresources + + files = sys.argv[2:] + resfiles = [list(macresources.parse_rez_code(open(p, 'rb').read())) for p in files] + headings = [path.basename(p) for p in files] + headings = [h[:-6] if h.endswith('.rdump') else h for h in headings] + + every_typeid = list(set((r.type, r.id) for rf in resfiles for r in rf)) + every_typeid.sort(key=lambda rtypeid: (rtypeid[0].decode('mac_roman').upper(), rtypeid[0].decode('mac_roman'), rtypeid[1])) + + by_typeid = {typeid: [None] * len(resfiles) for typeid in every_typeid} + + for i, rf in enumerate(resfiles): + for r in rf: + by_typeid[(r.type, r.id)][i] = hash(bytes(r)) + + uniques_by_name = [] + for rtype, rid in every_typeid: + leftcol = rtype.decode('mac_roman') + str(rid).rjust(7) + uniques_by_name.append((leftcol, by_typeid[(rtype, rid)])) + + print(snake_table(uniques_by_name, headings=headings)) + exit() + + +if __name__ == '__main__': + group_lists = split_args_by_delim(sys.argv[1:]) + + every_filename = sorted(set(path.basename(p) for g in group_lists for p in g)) + + headings = [path.commonprefix([path.abspath(p) for p in group]) for group in group_lists] + heading_strip = path.commonprefix(headings) + headings = [h[len(heading_strip):].lstrip(path.sep) for h in headings] + + uniques_by_name = {fn: [None] * len(group_lists) for fn in every_filename} + for i, group in enumerate(group_lists): + for p in group: + uniques_by_name[path.basename(p)][i] = generate_file_md5(p) + + uniques_by_name = list(uniques_by_name.items()) + + print(snake_table(uniques_by_name, headings=headings)) diff --git a/mpwobject.py b/mpwobject.py new file mode 100644 index 0000000..560e42b --- /dev/null +++ b/mpwobject.py @@ -0,0 +1,51 @@ +# The only clever thing that we do, is strip out "pad" and "last" records +# To make editing less tedious + + +def split(mpwobj): + """Split the binary object into a list of "chunks" + """ + + biglist = [] + + ofs = 0 + while ofs < len(mpwobj): + rectype = mpwobj[ofs] + + if not (rectype <= 20 or rectype == 25): + raise ValueError(f'bad record type {rectype} at {hex(offset)}') + + if rectype == 1: # First + reclen = 4 + elif rectype == 2: # Last + reclen = 2 + elif rectype == 5: # Module + reclen = 6 + elif rectype == 6: # EntryPoint + reclen = 8 + elif rectype == 7: # Size + reclen = 6 + elif rectype == 11: # Filename + reclen = 8 + elif rectype == 14: # ModuleEnd + reclen = 8 + elif rectype == 16: # BlockEnd + reclen = 12 + elif rectype == 25: # XData + reclen = 8 + else: + reclen = 256 * mpwobj[ofs+2] + mpwobj[ofs+3] + + biglist.append(mpwobj[ofs:ofs+reclen]) + ofs += reclen + + return biglist + + +def join(chunks): + newlist = [] + for c in chunks: + newlist.append(c) + if len(c) & 1: + newlist.append(b'\0') + return newlist diff --git a/process-mgr-seg-lister b/process-mgr-seg-lister new file mode 100644 index 0000000..0a0056c --- /dev/null +++ b/process-mgr-seg-lister @@ -0,0 +1,781 @@ +lines = """ + + seg INIT 1 +MYGESTALT INIT $1,$0 +main INIT $1,$16 @22 +InitializeEnvironment INIT $1,$176 @2A +InitializeScheduler INIT $1,$22C +InitConfig INIT $1,$438 +InitExceptions INIT $1,$510 +VNInit INIT $1,$580 +InitHeapRoutines INIT $1,$58E +InitHeaps INIT $1,$5C4 +InitAppleMenuList INIT $1,$692 +InitSystemMenus INIT $1,$6A0 +InstallPatches INIT $1,$748 +PuppetStringsInit INIT $1,$7DA +LaunchFacelessTasks INIT $1,$7FA +GetSwitchTab INIT $1,$90A + size INIT $962 + + seg %GlobalData 0 +connectionQ %GlobalData $0,$0 C +ppcWriteBQ %GlobalData $0,$1A C +ppcReadBQ %GlobalData $0,$34 C +ppcInformBQ %GlobalData $0,$4E C +eppcBQ %GlobalData $0,$68 C +MacOSPortTypepStr %GlobalData $0,$82 +MacOSPortNamepStr %GlobalData $0,$86 +SSSPromptpStr %GlobalData $0,$8A +lastmouse %GlobalData $0,$8E +mousebox %GlobalData $0,$92 +VolumeNotificationList %GlobalData $0,$96 +newProcessMgrZone %GlobalData $0,$9A +oldProcessMgrZone %GlobalData $0,$9E +oldSysGZProc %GlobalData $0,$A2 # +hAppleItemShare %GlobalData $0,$A6 +globalPrTypeString %GlobalData $0,$AA +blockTrapAddr %GlobalData $0,$CA +myRoverPtr %GlobalData $0,$CE #C +inLauncheesWorld %GlobalData $0,$D2 C +timeoutButtonDown %GlobalData $0,$D4 +timeoutMaskYield %GlobalData $0,$D6 +forcedPupStrMenuSelection %GlobalData $0,$D8 +buttonUpPt %GlobalData $0,$DC +defaultPuppetStringHdl %GlobalData $0,$E0 +list %GlobalData $0,$E4 +clickDAWindTimeout %GlobalData $0,$E8 # +eatMouseTimeout %GlobalData $0,$EA # +resume_message %GlobalData $0,$EC # +qd %GlobalData $0,$F0 E +randSeed %GlobalData $0,$13C E +screenBits %GlobalData $0,$140 E +arrow %GlobalData $0,$14E E +dkGray %GlobalData $0,$192 E +ltGray %GlobalData $0,$19A E +gray %GlobalData $0,$1A2 E +black %GlobalData $0,$1AA E +white %GlobalData $0,$1B2 E +thePort %GlobalData $0,$1BA E +QUICKDRAW %GlobalData $0,$1BE E +OSDispatchTable %GlobalData $0,$1BE C +patchtraps %GlobalData $0,$446 C +skiaExists %GlobalData $0,$6DA +routeEvent %GlobalData $0,$6DC +tsmLayerOwner %GlobalData $0,$6DE +dontGetFakeKey %GlobalData $0,$6E2 +fakeKeyHandle %GlobalData $0,$6E4 +fakeKeyCount %GlobalData $0,$6E8 +MachineHasMacPlusKbd %GlobalData $0,$6EA +MachineHasFPU %GlobalData $0,$6EC +Colorized %GlobalData $0,$6EE +allocateGMBlkInSysHeap %GlobalData $0,$6F0 +pSystemQuitAllMsg %GlobalData $0,$6F2 +ppcInitErr %GlobalData $0,$6F6 +debugKeyTryCount %GlobalData $0,$6F8 +debugControlKeyCode %GlobalData $0,$6FA +debugToAppRoutine %GlobalData $0,$6FC +debugExitRoutine %GlobalData $0,$700 +debugEntryRoutine %GlobalData $0,$704 +oldExceptionVectors %GlobalData $0,$708 +IsOldDebugger %GlobalData $0,$7C0 +initCurStackBase %GlobalData $0,$7C2 +initFSQueueHook %GlobalData $0,$7C6 +initMemTop %GlobalData $0,$7CA +initLocationZero %GlobalData $0,$7CE +kernelbusy %GlobalData $0,$7D2 +kernelstackbase %GlobalData $0,$7D4 +kernelstack %GlobalData $0,$7D8 +kernelMode %GlobalData $0,$7DC +SystemTempMemHList %GlobalData $0,$7DE +vrGetProcessMgrHiMaxBlock %GlobalData $0,$7E2 +vrGetSystemHiFreeBytes %GlobalData $0,$7E6 +vrZoneMPBlockPtr %GlobalData $0,$7EA +vrChipOffRelocFromFree %GlobalData $0,$7EE +vrFreeTop %GlobalData $0,$7F2 +vrGetTopBlockSize %GlobalData $0,$7F6 +vrGetHighestLargeFreeBlock %GlobalData $0,$7FA +vrGetLockPtr %GlobalData $0,$7FE +vrShrinkProcessMgrZone %GlobalData $0,$802 +vrMoveZone %GlobalData $0,$806 +vrExtendZone %GlobalData $0,$80A +vrGetProcessMgrLoFreeBytes %GlobalData $0,$80E +In32BitMode %GlobalData $0,$812 +ProcessMgrZone %GlobalData $0,$814 +ApplicationMenuHdl %GlobalData $0,$818 +hGenericDAIconSuite %GlobalData $0,$81C +hGenericAppIconSuite %GlobalData $0,$820 +FirstAppleItem %GlobalData $0,$824 +pStrListCopyNamePrefix %GlobalData $0,$828 +hHideCurrent %GlobalData $0,$82C +standardMenuDefProcRsrc %GlobalData $0,$830 +nullTimeout %GlobalData $0,$834 +srcMyScrapInfo %GlobalData $0,$836 +napOver %GlobalData $0,$848 +dont_switch %GlobalData $0,$84A +coercionState %GlobalData $0,$84C +cutCopyCount %GlobalData $0,$84E +lmemToolDataSize %GlobalData $0,$850 +switchTabPtr %GlobalData $0,$854 +nextswitch %GlobalData $0,$858 +lastswitch %GlobalData $0,$85C +desklayerowner %GlobalData $0,$860 +desklayer %GlobalData $0,$864 +IMLayer %GlobalData $0,$868 +MFLayer %GlobalData $0,$86C +ShellWasFinderType %GlobalData $0,$870 +pDyingStateList %GlobalData $0,$872 +pSleepingStateList %GlobalData $0,$876 +pDebugProcess %GlobalData $0,$87A +pShellProcess %GlobalData $0,$87E +pLastBGProcess %GlobalData $0,$882 +pFrontProcessQueue %GlobalData $0,$886 +pNewFrontProcess %GlobalData $0,$88A +pFrontProcess %GlobalData $0,$88E +pCurrentProcess %GlobalData $0,$892 +initialProcessSR %GlobalData $0,$896 +remnulls %GlobalData $0,$898 +nbacks %GlobalData $0,$89A +ProcessIDSource %GlobalData $0,$89C +ProcessNumberSource %GlobalData $0,$89E +NullProcess %GlobalData $0,$8A2 + size %GlobalData $A00 + + seg Main 2 +#0001 Main $2,$0 # +buserr Main $2,$52 @32 E +addrerr Main $2,$54 @3A E +ilglerr Main $2,$56 @42 E +zeroerr Main $2,$58 @4A E +chkerr Main $2,$5A @52 E +trapverr Main $2,$5C @5A E +priverr Main $2,$5E @62 E +traceerr Main $2,$60 @6A E +line1111err Main $2,$64 @72 E +unass Main $2,$66 @7A E +spurint Main $2,$66 @82 E +uniniterr Main $2,$66 @8A E +fmterr Main $2,$66 E +coprocerr Main $2,$68 @92 E +trap5err Main $2,$6C @9A E +trap6err Main $2,$6E @A2 E +a_syserror Main $2,$10A @AA +IsNonFatalSysErr Main $2,$1CE +BeginKernelStack Main $2,$200 @B2 +EndKernelStack Main $2,$23A +a_osdispatch Main $2,$256 @BA +SETTRAPADDRESS_GLUE Main $2,$2EE +OverlayRecoverHandle Main $2,$2FC @C2 +PROCESSMGR_GZPROC_GLUE Main $2,$322 @CA +a_settrapaddress Main $2,$358 @D2 +a_newhandle Main $2,$36A @DA +a_handlezone Main $2,$3E6 @E2 +a_recoverhandle Main $2,$41C @EA +a_reallochandle Main $2,$446 @F2 +#0001 Main $2,$4BC # +a_disposhandle Main $2,$4BC @FA E +a_handtohand Main $2,$4F8 @102 +a_open Main $2,$51E @10A +GetMapHdlFromRefNum Main $2,$5A0 @112 +a_openrf Main $2,$5CE @11A +a_close Main $2,$644 @122 +#0002 Main $2,$68E # +a_getvol Main $2,$68E @12A E +a_getvolinfo Main $2,$694 @132 E +a_hfsdispatch Main $2,$69A @13A E +#0003 Main $2,$6E8 # +a_mountvol Main $2,$726 @142 E +a_offline Main $2,$770 @14A E +a_eject Main $2,$77E @152 E +a_unmountvol Main $2,$7C2 @15A E +a_getscrap Main $2,$806 @162 +#0004 Main $2,$828 # +a_zeroscrap Main $2,$828 @16A E +a_putscrap Main $2,$82E @172 E +a_pack3 Main $2,$84E @17A +a_drawmenubar Main $2,$8B4 @182 +a_postevent Main $2,$8DC @18A +a_launch Main $2,$986 @192 +a_osreserved Main $2,$992 @19A +a_wakeup Main $2,$994 @1A2 +MyPrefixRelString Main $2,$99E @1AA +MyRelString Main $2,$9B4 @1B2 +a_checkload Main $2,$9C8 @1BA +SetOldCheckLoad Main $2,$9F6 @1C2 E +a_updateresfile Main $2,$A00 @1CA +a_getresattrs Main $2,$A16 @1D2 +a_releaseresource Main $2,$A32 @1DA +a_getnamedresource Main $2,$A48 @1E2 +a_sizersrc Main $2,$A68 @1EA +a_getresource Main $2,$A84 @1F2 +a_setgrowzone Main $2,$B0A @1FA +#0005 Main $2,$B22 # +MyNewGestalt Main $2,$B40 @202 E +ZOOMRECT Main $2,$B56 @20A +FloatMainUp Main $2,$C5A @212 +GetDrvrResourceAndInfo Main $2,$C62 @21A +CheckUnitTableEntry Main $2,$CC6 @222 +CORELAUNCHDESKACCESSORY Main $2,$D06 +C_OPENDESKACC Main $2,$EF0 @22A +C_LAUNCHDESKACCESSORY Main $2,$F62 @232 +C_SYSEDIT Main $2,$F90 @23A +C_SYSTEMMENU Main $2,$FFE @242 +C_SYSTEMCLICK Main $2,$10EE @24A +C_SYSTEMEVENT Main $2,$1132 @252 +OVERLAYSYSTEMEVENT Main $2,$12A0 @25A +SetOverlaySystemEvent Main $2,$12EC +LimitFrontSleepForDriversSake Main $2,$130A +LimitBackSleepForDriversSake Main $2,$13AE +GiveLocalDriversTime Main $2,$147A +C_SYSTEMTASK Main $2,$1536 @262 +IsMacJmpDebugger Main $2,$15AE +SysErrRecover Main $2,$15CC +C_WAITNEXTEVENT Main $2,$1640 @26A +C_GETNEXTEVENT Main $2,$1706 @272 +C_EVENTAVAIL Main $2,$172A @27A +event_common Main $2,$174E +GetNextDeskUpdateEvent Main $2,$1D30 +pollmouse Main $2,$1D94 @282 +GetNextPseudoEvent Main $2,$1E02 +PostPseudoEvent Main $2,$1E74 @28A +imLayerKeyDown Main $2,$1F0A +GetFakeKeyEvent Main $2,$1F76 +C_POSTFAKEKEYDOWN Main $2,$2000 @292 +C_POSTTEXT Main $2,$20B4 @29A +OSEventAvailForFront Main $2,$2170 +C_STILLDOWN Main $2,$2184 @2A2 +C_WAITMOUSEUP Main $2,$21CE @2AA +C_REQUESTVOLUMENOTIFICATION Main $2,$2208 @2B2 +C_DECLINEVOLUMENOTIFICATION Main $2,$2274 @2BA +VNKill Main $2,$2318 @2C2 +ResetStandardFileVol Main $2,$237C +NotifyVolumeAction Main $2,$23D2 +NotifyVolumeGoodbye Main $2,$2452 +DecomposeWD Main $2,$24D2 @2CA +CHECKIFBACKINGWD Main $2,$252C +C_TEMPMAXMEM Main $2,$2562 @2D2 +C_TEMPFREEMEM Main $2,$2598 @2DA +C_TEMPTOPMEM Main $2,$25F0 @2E2 +C_SYSZONEFLOATSIZES Main $2,$2616 @2EA +GMBlk Main $2,$2664 @2F2 +ProcessMgrNewHandle Main $2,$26CA +C_TEMPNEWHANDLE Main $2,$270A @2FA +LikelyTempMemHList Main $2,$278A +InCurrTempMem Main $2,$27D4 +RemoveCurrTempMem Main $2,$282A +RecoverCurrTempHdl Main $2,$288A +C_TEMPHLOCK Main $2,$28E2 @302 +C_TEMPHUNLOCK Main $2,$28FC @30A +C_TEMPDISPOSEHANDLE Main $2,$2916 @312 +MYGROWZONE Main $2,$2930 @31A +SafeSetGrowZone Main $2,$29F8 +StraddleBlockSize Main $2,$2A56 @322 +ProcessMgrMaxBlock Main $2,$2AAE +IsEnabledItem Main $2,$2B04 +MYIUTEXTORDER Main $2,$2B44 @32A +MenuItemAddress Main $2,$2B92 @332 +MenuSelectionGivenName Main $2,$2BDE @33A +ApplyToAllAppleMenus Main $2,$2C48 @342 +C_ADDRESMENU Main $2,$2C7C @34A +CheckItemNameAndCharForCutCopy Main $2,$2E2A +C_MENUSELECT Main $2,$2EA8 @352 +C_MENUKEY Main $2,$2F3A @35A +C_SETCURSOR Main $2,$2F90 @362 +ItemNumFromItemPtr Main $2,$2FD2 +StringToAppleItemHdl Main $2,$301C @36A +C_GETAUXMENUITEM Main $2,$306E @372 +FLUSHICON Main $2,$31E4 @37A +GETPROCESSICON Main $2,$3212 @382 +ChangeIconicTitle Main $2,$32D6 +AdjustApplicationMenu Main $2,$32FC @38A +GetProcessIconCache Main $2,$3430 @392 +MakeHidingString Main $2,$34C6 @39A +InsertAppInApplicationMenu Main $2,$3508 +DeleteAppFromApplicationMenu Main $2,$35CA @3A2 +PEntryFromApplicationMenuItem Main $2,$361E +ApplicationMenuItemFromPEntry Main $2,$3646 @3AA +GetApplicationMenuLeftCoord Main $2,$3670 @3B2 +RemoveFromAppleMenuList Main $2,$36C2 +InTypeList Main $2,$36E8 +AcceptedByFileFilter Main $2,$3726 +CopyWDToCurProc Main $2,$379E +IsForcedOpen Main $2,$37F4 +C_GETPROCESSTRAPADDRESS Main $2,$39E4 @3BA +C_SETPROCESSTRAPADDRESS Main $2,$3AAA @3C2 +c_settrapaddress Main $2,$3B3E +GetApplPatch Main $2,$3C0E +UpdatePatchRegistry Main $2,$3C5A +AddApplPatch Main $2,$3D7E +GetRealTrapAddr Main $2,$3DEC +save_or_restore_dispatch Main $2,$3E4C @3CA +kill_dispatch Main $2,$3ED2 @3D2 +InitApplPatchTable Main $2,$3F06 @3DA +InitPuppets Main $2,$3F48 @3E2 +PuppetKill Main $2,$3F96 @3EA +CoreRequestScratchSwitchTask Main $2,$3FA4 @3F2 +DOREQUESTSCRATCHSWITCHTASK Main $2,$4026 @3FA +DOGETACTIVETASKINFO Main $2,$4094 @402 +DOGETSWITCHINFO Main $2,$4114 @40A +DOCANCELSWITCH Main $2,$4146 @412 +CancelSwitchWithError Main $2,$41EE +AddInstrsHdl Main $2,$4220 +PushInstrsHdl Main $2,$4282 @41A +DumpFirstInstr Main $2,$4324 +GetActiveInstrsHdl Main $2,$436A +GetNextPuppetEvent Main $2,$4392 +Get1MenuStrings Main $2,$496E +GetMenuStrings Main $2,$49BC +CheckLocalPt Main $2,$4A0A +SetMousePosition Main $2,$4AB2 +PuppetForceButtonDown Main $2,$4AE6 +generate_mousedown_in_menubar Main $2,$4B18 +q_push Main $2,$4B40 @422 +q_pop Main $2,$4B6C @42A +llsetMatch Main $2,$4B84 @432 +llcheck Main $2,$4B96 @43A +llsetlist Main $2,$4BE0 @442 +llsetsize Main $2,$4BEE @44A +llinit Main $2,$4C00 +llhead Main $2,$4C56 @452 +lltail Main $2,$4C68 @45A +llnext Main $2,$4C7C @462 +llprevious Main $2,$4CA6 @46A +llretrieve Main $2,$4CD4 @472 +lladd Main $2,$4CEC @47A +lladdhead Main $2,$4D5A +lldelete Main $2,$4DB4 @482 +ll_length Main $2,$4E8E @48A +ApplyToAllRefEntries Main $2,$4E9E +ClearSharingBitFromEntry Main $2,$4F12 @492 +ClearSharingBits Main $2,$4F30 +ResetSharedBitForEntry Main $2,$4FAA @49A +C_UPDATERESFILE Main $2,$4FD4 +C_RELEASERESOURCE Main $2,$5034 +C_GETRESATTRS Main $2,$50DE +GetMapHdlInOtherChainFromRefNum Main $2,$5128 +C_GETNAMEDRESOURCE Main $2,$5172 +C_SIZERSRC Main $2,$51EA +AddToFrontProcessQueue Main $2,$523E @4A2 +PopFrontProcessQueue Main $2,$528A @4AA +RemoveFromFrontProcessQueue Main $2,$52AE @4B2 +OrphanScrapIntoPartition Main $2,$5302 @4BA +DisposeOrphanedScrap Main $2,$53AC @4C2 +src_scrap_setup Main $2,$53D0 @4CA +StartForegroundSwitch Main $2,$5424 +SetThirdSrcCoercionState Main $2,$54CA @4D2 +SetFirstDstCoercionState Main $2,$552E @4DA +CheckForCutCopySysEditCmd Main $2,$55BC +CheckForCutCopyMenuKey Main $2,$55F0 +FindCutCopyItems Main $2,$5644 @4E2 +SyncSIZEInfo Main $2,$56B0 +GetSizeInfo Main $2,$571A @4EA +StandardLaunch Main $2,$57C2 @4F2 +C_LAUNCH Main $2,$59AA +PutOnSleepQueue Main $2,$5BDC +C_SLEEPPROCESS Main $2,$5C58 @4FA +clkint Main $2,$5CAA @502 +PushOnStateList Main $2,$5CF0 @50A +RemoveFromStateList Main $2,$5D20 @512 +RoustSleepers Main $2,$5D66 +CancelSleep Main $2,$5DC2 @51A +switch_task Main $2,$5DEE @522 +C_INITWINDOWS Main $2,$5EFE @52A +PortListKill Main $2,$6002 +QDKill Main $2,$606A @532 +INITZONE Main $2,$6082 @53A +GETHANDLESIZE Main $2,$608E @542 +NGETTRAPADDRESS Main $2,$609C @54A +NSETTRAPADDRESS Main $2,$60B0 @552 +PBCLOSE Main $2,$60C4 @55A +PBREAD Main $2,$60D6 @562 +PBWRITE Main $2,$60E8 @56A +PBCONTROL Main $2,$60FA @572 +GETVOL Main $2,$610C +SETVOL Main $2,$612E @57A +PBOPENWD Main $2,$614E @582 +PBCLOSEWD Main $2,$6164 +PBGETWDINFO Main $2,$617A +PBGETFCBINFO Main $2,$6190 @58A +PBGETCATINFO Main $2,$61A6 @592 +PBHGETFINFO Main $2,$61BC @59A +PBOPENDF Main $2,$61CE @5A2 +HANDTOHAND Main $2,$61E4 @5AA +PTRTOHAND Main $2,$61FA @5B2 +PPCOPEN Main $2,$6216 @5BA +PPCINFORM Main $2,$622A @5C2 +PPCACCEPT Main $2,$623E @5CA +PPCREJECT Main $2,$6252 @5D2 +PPCWRITE Main $2,$6266 @5DA +PPCREAD Main $2,$627A @5E2 +PPCEND Main $2,$628E @5EA +PPCCLOSE Main $2,$62A2 @5F2 +IPCLISTPORTS Main $2,$62B6 @5FA +DELETEUSERIDENTITY Main $2,$62CA @602 +STARTSECURESESSION Main $2,$62D8 @60A +LDIVTS Main $2,$62E8 +LDIVT Main $2,$62F0 @612 E +ULDIVTS Main $2,$62F8 +ULDIVT Main $2,$6300 @61A E +LMODTS Main $2,$6308 +LMODT Main $2,$6310 E +ULMODTS Main $2,$6336 +ULMODT Main $2,$633E E + size Main $638E + + seg kernel_segment 3 +a_exittoshell kernel_segment $3,$0 @622 +InitializeProcess kernel_segment $3,$16 @62A +FPInit kernel_segment $3,$1C +SwitchAllRegs kernel_segment $3,$24 @632 +SwitchCPURegs kernel_segment $3,$60 @63A +disable kernel_segment $3,$80 @642 +spl kernel_segment $3,$90 @64A +AtomicVBLSave kernel_segment $3,$A2 +dummyvbl kernel_segment $3,$114 +save_lmemtab kernel_segment $3,$11C +restore_lmemtab kernel_segment $3,$152 +FloatKernelUp kernel_segment $3,$188 @652 +FindKeywordParameter kernel_segment $3,$190 +ExamineDocList kernel_segment $3,$1E2 +NextListParam kernel_segment $3,$25E @65A +SendInstructions kernel_segment $3,$286 +SendGenericInstruction kernel_segment $3,$2F4 +AppFileAndDocList kernel_segment $3,$35C +FileIDToAppFile kernel_segment $3,$424 @662 +SendFileInstruction kernel_segment $3,$4F2 +TranslateAppleEvent kernel_segment $3,$5C0 @66A +postTranslationResult kernel_segment $3,$680 @672 +AEParmToAppParmHandle kernel_segment $3,$6A0 +AppParmHandleToAEParm kernel_segment $3,$816 +SendSystemQuit kernel_segment $3,$938 +ContinueQuitAll kernel_segment $3,$9C2 +CancelQuitAll kernel_segment $3,$A82 @67A +HandleSystemQuit kernel_segment $3,$AC0 +AnswerWasFromQuitAll kernel_segment $3,$AF6 +HandleFeedback kernel_segment $3,$B84 +HandleSystemMessage kernel_segment $3,$C64 @682 +postResult kernel_segment $3,$D2E +C_REGISTERDEBUGGER kernel_segment $3,$E4E @68A +C_READWRITEPROCESSMEMORY kernel_segment $3,$EDC @692 +C_READWRITEPROCESSFPUREGS kernel_segment $3,$F88 @69A +AddToHList kernel_segment $3,$FDA @6A2 +InHList kernel_segment $3,$103C @6AA +RecoverHListElem kernel_segment $3,$1084 @6B2 +RemoveFromHList kernel_segment $3,$10D6 @6BA +GetFirstHListElem kernel_segment $3,$113C @6C2 +ApplyToHListElems kernel_segment $3,$1168 @6CA +DestroyHList kernel_segment $3,$11A6 +C_GETLAYER kernel_segment $3,$11EC @6D2 +C_LAYERINSERT kernel_segment $3,$1216 @6DA +C_LAYERDELETE kernel_segment $3,$1226 @6E2 +C_LNEWWINDOW kernel_segment $3,$123A @6EA +C_LCLOSEWINDOW kernel_segment $3,$1248 @6F2 +C_LCALCVIS kernel_segment $3,$1256 @6FA +C_LCVBEHIND kernel_segment $3,$1266 @702 +C_LPAINTONE kernel_segment $3,$1278 @70A +C_LPAINTBEHIND kernel_segment $3,$128A @712 +C_LSHOWHIDE kernel_segment $3,$129C @71A +C_LCLIPABOVE kernel_segment $3,$12AC @722 +C_MAKETOPLAYER kernel_segment $3,$12D8 @72A +C_LAYERCLOSE kernel_segment $3,$1354 @732 +C_LAYERINIT kernel_segment $3,$1380 @73A +C_LGETNEXTLAYER kernel_segment $3,$13DC @742 +C_LAYERFIND kernel_segment $3,$143E @74A +C_LGETAUXWIN kernel_segment $3,$1494 @752 +C_LCOLORINVALRECT kernel_segment $3,$14D4 @75A +HIDELAYER kernel_segment $3,$1500 @762 +ShowHideOthers kernel_segment $3,$15F6 @76A +FindAppBaseLayer kernel_segment $3,$1628 @772 +CANCELUPDATEACTION kernel_segment $3,$1664 @77A +CancelPendingUpdates kernel_segment $3,$1680 @782 +C_NEWFLOATLAYER kernel_segment $3,$16A8 @78A +C_DISPOSEFLOATLAYER kernel_segment $3,$175A @792 +InsertCustomItem kernel_segment $3,$17A0 @79A +InsertCustomItemSorted kernel_segment $3,$180A @7A2 +C_ADDAPPLEMENUITEM kernel_segment $3,$194E @7AA +DeleteCustomItemFromMenu kernel_segment $3,$1B16 @7B2 +DeleteCustomItem kernel_segment $3,$1BA4 +DeleteAppleItem kernel_segment $3,$1C18 +C_DELETEAPPLEMENUITEM kernel_segment $3,$1CF0 @7BA +SendAppleMenuSelectMsg kernel_segment $3,$1D26 @7C2 +AppleMenuCleanup kernel_segment $3,$1DD6 +C_KERNELLAUNCH kernel_segment $3,$1E1C @7CA +C_TWFGSWITCH kernel_segment $3,$1E4E @7D2 +C_KILLPROCESS kernel_segment $3,$1E92 @7DA +C_TWGETPID kernel_segment $3,$1EF6 @7E2 +C_TWGETPROCINFO kernel_segment $3,$1F2E @7EA +C_GETCURRENTPROCESS kernel_segment $3,$2060 @7F2 +C_GETSYSTEMCLIENTPROCESS kernel_segment $3,$20A4 @7FA +C_GETNEXTPROCESS kernel_segment $3,$20FA @802 +C_GETPROCESSFROMLAYER kernel_segment $3,$21AE @80A +C_SAMEPROCESS kernel_segment $3,$223C @812 +C_GETPROCESSINFORMATION kernel_segment $3,$22D4 @81A +C_SETFRONTPROCESS kernel_segment $3,$2424 @822 +c_Wakeup kernel_segment $3,$24B8 @82A +C_WAKEUPPROCESS kernel_segment $3,$24EE @832 +C_BEGINSYSTEMMODE kernel_segment $3,$253A @83A +C_ENDSYSTEMMODE kernel_segment $3,$2566 @842 +C_NEWDESKTOPLAYEROWNER kernel_segment $3,$259C @84A +C_PENTRYFROMPROCESSSERIALNUMBER kernel_segment $3,$25DC @852 +C_DISABLESWITCHING kernel_segment $3,$2640 @85A +C_ENABLESWITCHING kernel_segment $3,$2662 @862 +C_GETPRTYPESTRINGS kernel_segment $3,$268A @86A +C_SETPRTYPESTRINGS kernel_segment $3,$271E @872 +C_TWPOSTALLPSEUDOEVENT kernel_segment $3,$2786 @87A +C_TWPOSTPSEUDOEVENT kernel_segment $3,$279C @882 +C_SETSTDFILEDIR kernel_segment $3,$27AC @88A +C_BACKGROUNDNOTIFY kernel_segment $3,$27BC @892 +C_INLINEAWARE kernel_segment $3,$27CA @89A +C_NEWTSMLAYEROWNER kernel_segment $3,$2824 @8A2 +C_ROUTEEVENTTOSWM kernel_segment $3,$2860 @8AA +NewProcessEntryClear kernel_segment $3,$2890 +DisposeProcessEntry kernel_segment $3,$2918 +NewProcess kernel_segment $3,$292A +userret kernel_segment $3,$2CFC @8B2 +CreateProcess kernel_segment $3,$2D06 +InitHeapZone kernel_segment $3,$3018 +InitLowMemory kernel_segment $3,$30AC +GetCeilingPtr kernel_segment $3,$317A +GetProcessMemory kernel_segment $3,$321C +GetFinderInfoForFile kernel_segment $3,$3348 +HandleShellDeath kernel_segment $3,$33DA +DisposeProcessMemory kernel_segment $3,$34DE +MenuKill kernel_segment $3,$3588 +NMKill kernel_segment $3,$35C8 +FMKill kernel_segment $3,$363E @8BA +MakeSynStrikesPurgeable kernel_segment $3,$3714 @8C2 +SendDeathNotice kernel_segment $3,$3764 +C_EXITTOSHELL kernel_segment $3,$3842 +PEntryFromPID kernel_segment $3,$3B7A @8CA +EqualPSN kernel_segment $3,$3BB2 @8D2 +PEntryFromPSN kernel_segment $3,$3BE2 @8DA +PEntryFromFileSpec kernel_segment $3,$3C3E @8E2 +BringProcessToFront kernel_segment $3,$3CD6 @8EA +imLayerMouseDown kernel_segment $3,$3D62 +SendEventToSWMDriver kernel_segment $3,$3E18 @8F2 +fg_resched kernel_segment $3,$3E56 @8FA +cpu_resched kernel_segment $3,$409A @902 +nexttask kernel_segment $3,$40DC +nextback kernel_segment $3,$4214 +PrepareForUpdate kernel_segment $3,$425A +ActivateTopWindow kernel_segment $3,$4288 +PutUpFakeWindow kernel_segment $3,$42FC @90A +TakeDownFakeWindow kernel_segment $3,$4352 @912 +MoveScrap kernel_segment $3,$437A +IsScrapOwnedByCurrentProcess kernel_segment $3,$443E @91A +ScrapIO kernel_segment $3,$4474 +Coercion_State_Engine kernel_segment $3,$4508 @922 +NewAppParmHandle kernel_segment $3,$4992 +SizeOfThisAppFile kernel_segment $3,$49BC +NextAppFile kernel_segment $3,$49E6 +CopyAppParmHandle kernel_segment $3,$4A08 +SetAppParameters kernel_segment $3,$4AE4 +OpenAppWDs kernel_segment $3,$4BC0 +BeginApplication kernel_segment $3,$4CD2 +C_RDRVRINSTALL kernel_segment $3,$4D02 @92A +save_state kernel_segment $3,$4D12 @932 +restore_state kernel_segment $3,$4D56 @93A +kill_state kernel_segment $3,$4DC6 +save_lomem kernel_segment $3,$4DFE +restore_lomem kernel_segment $3,$4ED6 +save_vbl kernel_segment $3,$4FDA +restore_vbl kernel_segment $3,$500C +kill_vbl kernel_segment $3,$506A +save_dce kernel_segment $3,$50B4 +restore_dce kernel_segment $3,$51FC +kill_dce kernel_segment $3,$5248 +GiveGoodByeKiss kernel_segment $3,$5358 +save_hooks kernel_segment $3,$539A +restore_hooks kernel_segment $3,$53C6 +kill_hooks kernel_segment $3,$53EE +SetOverlayRecoverHandle kernel_segment $3,$5406 @942 +GetOverlayRecoverHandleOldTrap kernel_segment $3,$5424 @94A +MemClear kernel_segment $3,$5452 @952 +StripLeadingNulls kernel_segment $3,$5472 @95A +NewMungedString kernel_segment $3,$54AC @962 +StrInStrList kernel_segment $3,$5522 @96A +GetRsrcHdlMatchingFirstLongword kernel_segment $3,$5564 +GetIconIDFromBundle kernel_segment $3,$55B0 @972 +OptionKeyIsDown kernel_segment $3,$563A @97A + size kernel_segment $565E + + seg eppc_segment 4 +FloatEppcUp eppc_segment $4,$0 @982 +ePPCInit eppc_segment $4,$8 @98A +C_GETPORTNAMEFROMPSN eppc_segment $4,$6C @992 +C_GETPSNFROMPORTNAME eppc_segment $4,$B0 @99A +C_GETSPECIFICHIGHLEVELEVENT eppc_segment $4,$F4 @9A2 +copyMsg eppc_segment $4,$46C +C_ACCEPTHIGHLEVELEVENT eppc_segment $4,$4D4 @9AA +getSessionRecord eppc_segment $4,$5C2 +FlushHLEQueue eppc_segment $4,$698 +flushMsg eppc_segment $4,$748 @9B2 +fetchMsgData eppc_segment $4,$78A +postReturnReceipt eppc_segment $4,$852 @9BA +C_POSTHIGHLEVELEVENT eppc_segment $4,$8BA @9C2 +CreateMsgQ eppc_segment $4,$A4E @9CA +makePortName eppc_segment $4,$B32 +openPPCPort eppc_segment $4,$C58 +doDuplicateNameOpen eppc_segment $4,$CE6 +GetNextPortName eppc_segment $4,$D26 +closePPCPort eppc_segment $4,$D68 +DestroyMsgQ eppc_segment $4,$DBE @9D2 +breakConnections eppc_segment $4,$E6E +DeleteBQEntries eppc_segment $4,$F32 +GetMsgEventBuffer eppc_segment $4,$101C +RelMsgEventBuffer eppc_segment $4,$10A2 @9DA +postMsg eppc_segment $4,$10C6 @9E2 +postMsgToPPC eppc_segment $4,$1120 +C_GETNEXTHIGHLEVELEVENT eppc_segment $4,$11AA @9EA +scanInformBQ eppc_segment $4,$1282 +scanWriteBQ eppc_segment $4,$143E +scanReadBQ eppc_segment $4,$1584 +endSessionAfterAReadError eppc_segment $4,$1784 +GetConnectionType eppc_segment $4,$1802 +validateSessionID eppc_segment $4,$1B04 +comparePortNames eppc_segment $4,$1B90 +comparePortLocation eppc_segment $4,$1C52 +PortNameAndLocationAreEqual eppc_segment $4,$1D1C +getTIDfromEppcBlk eppc_segment $4,$1D72 +findSessionRecord eppc_segment $4,$1DAE +findFreeSessionRecord eppc_segment $4,$1E0A +getSessionID eppc_segment $4,$1E3A +restartPPCRead eppc_segment $4,$214A +startPPCRead eppc_segment $4,$2188 +guestAllowed eppc_segment $4,$21C6 +findElement eppc_segment $4,$2250 @9F2 +byPSN eppc_segment $4,$226C @9FA +byPortName eppc_segment $4,$2288 @A02 +bySignature eppc_segment $4,$22AE @A0A +bySessionID eppc_segment $4,$22CC @A12 +byportID eppc_segment $4,$22E6 @A1A +PSNFromName eppc_segment $4,$2300 +NameFromPSN eppc_segment $4,$2380 +PSNFromSignature eppc_segment $4,$23F0 +EPPCBlkFromPSN eppc_segment $4,$2470 +releasePPCpb eppc_segment $4,$24B0 +getPPCInformPB eppc_segment $4,$24D0 +getPPCReadPB eppc_segment $4,$254C +qPPCPb eppc_segment $4,$25C0 +KnockKnock eppc_segment $4,$25E6 @A22 + size eppc_segment $26C4 + + seg Debugger 5 +CoreRegisterDebugger Debugger $5,$0 @A2A +swap_state Debugger $5,$AE +CoreReadWriteProcessMemory Debugger $5,$E6 @A32 +CoreReadWriteProcessFPURegs Debugger $5,$15A @A3A +InitDebuggerExceptions Debugger $5,$23A +UnplugDebuggerExceptions Debugger $5,$300 +CallDebugger Debugger $5,$358 @A42 + size Debugger $444 + + seg zone24_tools 6 +ZoneMPBlockPtr24 zone24_tools $6,$0 @A4A +MakeNonRelocatable24 zone24_tools $6,$10 @A52 +GetProcessMgrLoFreeBytes24 zone24_tools $6,$32 @A5A +GetSystemHiFreeBytes24 zone24_tools $6,$CC @A62 +ExtendZone24 zone24_tools $6,$142 @A6A +MoveZone24 zone24_tools $6,$198 @A72 +ShrinkProcessMgrZone24 zone24_tools $6,$2CA @A7A +GetLockPtr24 zone24_tools $6,$33C @A82 +GetProcessMgrHiMaxBlock24 zone24_tools $6,$3E8 @A8A +GetHighestLargeFreeBlock24 zone24_tools $6,$4A8 @A92 +GetTopBlockSize24 zone24_tools $6,$504 @A9A +FreeTop24 zone24_tools $6,$538 @AA2 +ChipOffRelocFromFree24 zone24_tools $6,$580 @AAA +InitVectorTable24 zone24_tools $6,$618 @AB2 + size zone24_tools $698 + + seg zone32_tools 7 +ZoneMPBlockPtr32 zone32_tools $7,$0 @ABA +MakeNonRelocatable32 zone32_tools $7,$10 @AC2 +GetProcessMgrLoFreeBytes32 zone32_tools $7,$40 @ACA +GetSystemHiFreeBytes32 zone32_tools $7,$BC @AD2 +ExtendZone32 zone32_tools $7,$11E @ADA +MoveZone32 zone32_tools $7,$160 @AE2 +ShrinkProcessMgrZone32 zone32_tools $7,$25C @AEA +GetLockPtr32 zone32_tools $7,$2CA @AF2 +GetProcessMgrHiMaxBlock32 zone32_tools $7,$2D4 @AFA +GetHighestLargeFreeBlock32 zone32_tools $7,$37C @B02 +GetTopBlockSize32 zone32_tools $7,$3CA @B0A +FreeTop32 zone32_tools $7,$3FA @B12 +ChipOffRelocFromFree32 zone32_tools $7,$434 @B1A +InitVectorTable32 zone32_tools $7,$4A2 @B22 + size zone32_tools $522 + + seg zone_tools 8 +InitMPBlock zone_tools $8,$0 @B2A +PROCESSMGRSYSGZPROC zone_tools $8,$5A @B32 +ShrinkSysHeap zone_tools $8,$FA +LowerProcessMgrZoneBottom zone_tools $8,$1C6 +PROCESSMGRGZPROC zone_tools $8,$20C @B3A +ReclaimSpaceIfSysHeapLow zone_tools $8,$280 @B42 +ProcessMgrHiNewHandle zone_tools $8,$33A @B4A +ProcessMgrHMakeMoreMasters zone_tools $8,$4A6 @B52 + size zone_tools $4FA + + seg %A5Init 9 +_DATAINIT %A5Init $9,$0 +_DataInit %A5Init $9,$0 @B5A E +uncompress_world %A5Init $9,$5A # +get_rl %A5Init $9,$B6 # +relocate_world %A5Init $9,$10A # +ZEROBUFFER %A5Init $9,$166 # +#0001 %A5Init $9,$1A8 # +_A5Init3 %A5Init $9,$1AA E + size %A5Init $1AA +""".split('\n') + +fnames = """BuildResults/Sys/Obj/MenuMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/ResourceMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/Data.c.o.pmdmp +BuildResults/Sys/Obj/MemoryMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/Processes.c.o.pmdmp +BuildResults/Sys/Obj/Debugger.c.o.pmdmp +BuildResults/Sys/Obj/Startup.c.o.pmdmp +BuildResults/Sys/Obj/AppleEventExtensions.c.o.pmdmp +BuildResults/Sys/Obj/MemoryMgr24Patches.c.o.pmdmp +BuildResults/Sys/Obj/FileSystem.c.o.pmdmp +BuildResults/Sys/Obj/Schedule.c.o.pmdmp +BuildResults/Sys/Obj/LayerMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/ProcessMgrMisc.a.o.pmdmp +BuildResults/Sys/Obj/Utilities.c.o.pmdmp +BuildResults/Sys/Obj/HList.c.o.pmdmp +BuildResults/Sys/Obj/Puppet.c.o.pmdmp +BuildResults/Sys/Obj/PackageMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/Error.a.o.pmdmp +BuildResults/Sys/Obj/DeskMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/SegmentLoaderPatches.c.o.pmdmp +BuildResults/Sys/Obj/Queue.c.o.pmdmp +BuildResults/Sys/Obj/OSDispatch.a.o.pmdmp +BuildResults/Sys/Obj/ZoomRect.a.o.pmdmp +BuildResults/Sys/Obj/Switch.a.o.pmdmp +BuildResults/Sys/Obj/EventMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/MemoryMgr32Patches.c.o.pmdmp +BuildResults/Sys/Obj/Patches.c.o.pmdmp +BuildResults/Sys/Obj/WindowMgrPatches.c.o.pmdmp +BuildResults/Sys/Obj/Sleep.c.o.pmdmp +BuildResults/Sys/Obj/Switch.c.o.pmdmp +BuildResults/Sys/Obj/OSDispatch.c.o.pmdmp +BuildResults/Sys/Obj/Eppc.c.o.pmdmp +BuildResults/Sys/Obj/ScrapCoercion.c.o.pmdmp +BuildResults/Sys/Obj/Memory.c.o.pmdmp +BuildResults/Sys/Obj/Error.c.o.pmdmp""".split() + +def srippify(nam): + return nam.split('/')[-1][:-8] + +fconts = [] +for f in fnames: + fconts.append(open(f, 'rb').read()) + +for line in lines: + if '\t' in line and line[0] not in ' \t': + a, b, c = line.partition('\t') + searchfor = b'Module="%s"' % a.encode('ascii') + for i in range(len(fnames)): + if searchfor in fconts[i]: + line = srippify(fnames[i]) + ':' + line + + print(line)