Wrote script to fix checksums

This commit is contained in:
David Benepe
2021-06-11 01:14:18 -05:00
parent 3cf8c10588
commit f16317428e
6 changed files with 94 additions and 2 deletions
+2
View File
@@ -140,6 +140,7 @@ LOADER_FLAGS = -vwf
FixPath = $(subst /,,$1)
N64CRC = $(TOOLS_DIR)/n64crc
FIXCHECKSUMS = python3 $(TOOLS_DIR)/python/calc_func_checksums.py $(VERSION)
TEXBUILDER = $(TOOLS_DIR)/dkr_texbuilder
COMPRESS = $(TOOLS_DIR)/dkr_decompressor -c
@@ -442,6 +443,7 @@ $(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf | $(ALL_ASSETS_BUILT)
$(BUILD_DIR)/$(TARGET).z64: $(BUILD_DIR)/$(TARGET).bin | $(ALL_ASSETS_BUILT)
cp $< $@
$(FIXCHECKSUMS)
$(N64CRC) $@
sha1sum -c sha1/dkr.$(VERSION).sha1
+2 -1
View File
@@ -136,7 +136,8 @@ void audio_init(u32 arg0){
u32 tmp2;
audioMgrConfig audConfig;
//*((s32*)0x803FFFFC) = 0xDEADBEEF;
// Uncomment this to test shiftibilty!
// *((s32*)0x803FFFFC) = 0xDEADBEEF;
seq_max_len = 0;
alHeapInit(&gALHeap, gBssSectionStart, 0x00029D88);
+1
View File
@@ -99,6 +99,7 @@ s16 D_800DCDB0[16] = {
0x02FA, 0x02FE, 0x08F8, 0x03FD
};
// Checksum count for func_8003B4BC
s32 D_800DCDD0 = 42391;
s16 D_800DCDD4[4] = {
+75
View File
@@ -0,0 +1,75 @@
import re
import os
import sys
from file_util import FileUtil
VERSION = sys.argv[1]
BUILD_DIR = 'build/' + VERSION
MAP_FILEPATH = BUILD_DIR + '/dkr.map'
ROM_FILEPATH = BUILD_DIR + '/dkr.z64'
FUNCTIONS_TO_CALC = [
('func_8003B4BC', 'D_800DCDD0'),
('func_80068158', 'D_800DD320'),
('D_80024D54', 'D_800DCEA0')
]
def getMatches(string, regex):
out = []
matches = re.finditer(regex, string, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
start = match.start()
end = match.end()
out.append((string[start:end], match.groups(), (start, end)))
return out
rom = FileUtil.get_bytes_from_file(ROM_FILEPATH)
mapFile = {}
RAM_TO_ROM = None
def write_checksum_to_rom(romOffset, value):
global rom
rom[romOffset + 0] = (value >> 24) & 0xFF
rom[romOffset + 1] = (value >> 16) & 0xFF
rom[romOffset + 2] = (value >> 8) & 0xFF
rom[romOffset + 3] = value & 0xFF
def calculate_checksum_for_function(funcLabel, varLabel):
if funcLabel not in mapFile:
raise Exception('Label "' + funcLabel + '" does not exist in the map file!')
if varLabel not in mapFile:
raise Exception('Label "' + varLabel + '" does not exist in the map file!')
funcEntry = mapFile[funcLabel]
funcAddress = funcEntry['value']
funcLength = funcEntry['length']
funcRomOffset = funcAddress - RAM_TO_ROM
count = 0
for i in range(0, funcLength):
count += rom[funcRomOffset + i]
varEntry = mapFile[varLabel]
varAddress = varEntry['value']
varRomOffset = varAddress - RAM_TO_ROM
write_checksum_to_rom(varRomOffset, count)
# print('The checksum count for "' + funcLabel + '" is: ' + hex(count))
def calculate_matches():
global mapFile, RAM_TO_ROM
REGEX_MAP_GET_LABEL = r"[ ]*0x[0-9A-Fa-f]{8}([0-9A-Fa-f]{8})[ ]*([_A-Za-z0-9]+)"
mapMatches = getMatches(FileUtil.get_text_from_file(MAP_FILEPATH), REGEX_MAP_GET_LABEL)
for i in range(0, len(mapMatches) - 1):
match = mapMatches[i]
labelValue = match[1]
value = int(labelValue[0], 16)
length = int(mapMatches[i + 1][1][0], 16) - value
mapFile[labelValue[1]] = { "value": value, "length": length }
RAM_TO_ROM = mapFile['__RAM_TO_ROM']['value']
def main():
calculate_matches()
for entry in FUNCTIONS_TO_CALC:
calculate_checksum_for_function(entry[0], entry[1])
FileUtil.write_bytes_to_file(ROM_FILEPATH, rom)
main()
+10
View File
@@ -49,11 +49,21 @@ class FileUtil:
with open(filename, 'r') as inFile:
return inFile.read()
@staticmethod
def get_bytes_from_file(filename):
with open(filename, 'rb') as inFile:
return list(inFile.read())
@staticmethod
def write_text_to_file(filename, text):
with open(filename, 'w') as outFile:
outFile.write(text)
@staticmethod
def write_bytes_to_file(filename, binary):
with open(filename, 'wb') as outFile:
outFile.write(bytearray(binary))
@staticmethod
def delete_file(filename):
remove(filename)
+4 -1
View File
@@ -53,6 +53,9 @@ class GenerateLD:
self.gen_open_block()
self.gen_line('romPos = 0x0;')
self.gen_boot_section()
self.gen_line('__RAM_START = 0x80000400;')
self.gen_line('__RAM_TO_ROM = __RAM_START - romPos;')
self.gen_newline()
self.gen_main_section()
self.gen_ucode_text_section()
self.gen_data_section()
@@ -75,7 +78,7 @@ class GenerateLD:
self.gen_newline()
def gen_main_section(self):
self.gen_line('.main 0x80000400 : AT(romPos) SUBALIGN(16)')
self.gen_line('.main __RAM_START : AT(romPos) SUBALIGN(16)')
self.gen_open_block()
for file in self.files:
self.gen_line(file[0] + '(.text);')