mirror of
https://github.com/notwa/mm
synced 2025-02-05 13:23:23 -08:00
knock off TODOs
This commit is contained in:
parent
6e9a37d8a0
commit
5c33550a0c
2 changed files with 37 additions and 8 deletions
17
n64.py
17
n64.py
|
@ -1,5 +1,9 @@
|
||||||
# Based on uCON64's N64 checksum algorithm by Andreas Sterbenz
|
# Based on uCON64's N64 checksum algorithm by Andreas Sterbenz
|
||||||
|
|
||||||
|
from zlib import crc32
|
||||||
|
|
||||||
|
MAX32 = 0xFFFFFFFF
|
||||||
|
|
||||||
crc_seeds = {
|
crc_seeds = {
|
||||||
6101: 0xF8CA4DDC,
|
6101: 0xF8CA4DDC,
|
||||||
6102: 0xF8CA4DDC,
|
6102: 0xF8CA4DDC,
|
||||||
|
@ -8,7 +12,13 @@ crc_seeds = {
|
||||||
6106: 0x1FEA617A,
|
6106: 0x1FEA617A,
|
||||||
}
|
}
|
||||||
|
|
||||||
MAX32 = 0xFFFFFFFF
|
bootcode_crcs = {
|
||||||
|
0x6170A4A1: 6101,
|
||||||
|
0x90BB6CB5: 6102,
|
||||||
|
0x0B050EE0: 6103,
|
||||||
|
0x98BC2C86: 6105,
|
||||||
|
0xACC8580A: 6106,
|
||||||
|
}
|
||||||
|
|
||||||
def ROL(i, b):
|
def ROL(i, b):
|
||||||
return ((i << b) | (i >> (32 - b))) & MAX32
|
return ((i << b) | (i >> (32 - b))) & MAX32
|
||||||
|
@ -67,3 +77,8 @@ def crc(f, bootcode=6105):
|
||||||
crc1 = t6 ^ t4 ^ t3
|
crc1 = t6 ^ t4 ^ t3
|
||||||
crc2 = t5 ^ t2 ^ t1
|
crc2 = t5 ^ t2 ^ t1
|
||||||
return crc1 & MAX32, crc2 & MAX32
|
return crc1 & MAX32, crc2 & MAX32
|
||||||
|
|
||||||
|
def bootcode_version(f):
|
||||||
|
f.seek(0x40)
|
||||||
|
return bootcode_crcs[crc32(f.read(0x1000 - 0x40)) & MAX32]
|
||||||
|
|
||||||
|
|
28
z64dump.py
28
z64dump.py
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
import os, os.path
|
import os, os.path
|
||||||
import sys
|
import sys
|
||||||
import struct
|
import io
|
||||||
|
import struct, array
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
import n64
|
import n64
|
||||||
|
@ -105,15 +106,28 @@ def z_dump(f):
|
||||||
while z_dump_file(f, '{:05} '.format(i)):
|
while z_dump_file(f, '{:05} '.format(i)):
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
def swap_order(f, size='H'):
|
||||||
|
f.seek(0)
|
||||||
|
a = array.array(size, f.read())
|
||||||
|
a.byteswap()
|
||||||
|
f.seek(0)
|
||||||
|
f.write(a.tobytes())
|
||||||
|
|
||||||
def dump_rom(fn):
|
def dump_rom(fn):
|
||||||
with open(fn, 'rb') as f:
|
with open(fn, 'rb') as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
|
|
||||||
if data[:4] != b'\x80\x37\x12\x40':
|
with io.BytesIO(data) as f:
|
||||||
# TODO: check if it's a .n64 (2 byte swap) and convert
|
start = f.read(4)
|
||||||
|
if start == b'\x37\x80\x40\x12':
|
||||||
|
swap_order(f)
|
||||||
|
elif start != b'\x80\x37\x12\x40':
|
||||||
lament('not a .z64:', fn)
|
lament('not a .z64:', fn)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
f.seek(0)
|
||||||
|
data = f.read()
|
||||||
|
|
||||||
outdir = hashlib.sha1(data).hexdigest()
|
outdir = hashlib.sha1(data).hexdigest()
|
||||||
del data
|
del data
|
||||||
|
|
||||||
|
@ -123,8 +137,7 @@ def dump_rom(fn):
|
||||||
|
|
||||||
def z_read_file(path, fn=None):
|
def z_read_file(path, fn=None):
|
||||||
if fn == None:
|
if fn == None:
|
||||||
# TODO: infer from path
|
fn = os.path.basename(path)
|
||||||
return False
|
|
||||||
if len(fn) < 37:
|
if len(fn) < 37:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -196,8 +209,9 @@ def create_rom(d):
|
||||||
assert(f.tell() <= (pe or ve))
|
assert(f.tell() <= (pe or ve))
|
||||||
|
|
||||||
# fix makerom (n64 header)
|
# fix makerom (n64 header)
|
||||||
# TODO: don't assume bootcode is 6105
|
bootcode = n64.bootcode_version(f)
|
||||||
crc1, crc2 = n64.crc(f)
|
lament('bootcode:', bootcode)
|
||||||
|
crc1, crc2 = n64.crc(f, bootcode)
|
||||||
lament('crcs: {:08X} {:08X}'.format(crc1, crc2))
|
lament('crcs: {:08X} {:08X}'.format(crc1, crc2))
|
||||||
f.seek(0x10)
|
f.seek(0x10)
|
||||||
f.write(W4(crc1))
|
f.write(W4(crc1))
|
||||||
|
|
Loading…
Add table
Reference in a new issue