summaryrefslogtreecommitdiff
path: root/label_pointers.py
blob: 765479840f5abe1925c029924415bb928188774e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import os
import re

path = 'data'

asm_filenames = []
labels = {}
baseroms = []
new_baseroms = {}

# get data asm filenames
for (dirpath, dirnames, filenames) in os.walk(path):
    for filename in filenames:
        ext = os.path.splitext(filename)[1]
        if ext == '.s' or ext == '.inc':
            asm_filenames.append(os.path.join(dirpath, filename))

# get existing labels
with open('pokeemerald.map') as map_file:
    for line in map_file:
        m = re.match(r'^ +0x([0-9a-f]{8,8}) +([A-Za-z_][A-Za-z_0-9]*)$', line)
        if m:
            addr = int(m.group(1), 16)
            sym = m.group(2)
            labels[addr] = sym
            if addr >= 0x8000000 and addr < 0x81DB67C:
                labels[addr+1] = sym

# get baseroms
for filename in asm_filenames:
    with open(filename,encoding='utf8') as asm_file:
        for line in asm_file:
            m = re.match(r'^\s*\.incbin\s+"baserom.gba"\s*,\s*(0x[0-9a-fA-F]+|[0-9]+)\s*,\s*(0x[0-9a-fA-F]+|[0-9]+)', line)
            if m:
                file_offset = int(m.group(1), 0)
                size = int(m.group(2), 0)
                baseroms.append((file_offset, size))

# replace addresses with labels
for filename in asm_filenames:
    with open(filename,encoding='utf8') as asm_file:
        lines = asm_file.readlines()
    with open(filename,'w',encoding='utf8',newline='\n') as asm_file:
        for line in lines:
            label = ''
            m = re.match(r'^\s*.4byte\s+0x([0-9a-fA-F]+)\s*$', line)
            if m:
                addr = int(m.group(1), 16)
                if addr in labels:
                    label = labels[addr]
                else:
                    for (file_offset, size) in baseroms:
                        begin = 0x8000000 + file_offset
                        end = begin + size
                        if addr >= begin and addr < end:
                            label = 'gUnknown_{:08X}'.format(addr)
                            if file_offset not in new_baseroms:
                                new_baseroms[file_offset] = [file_offset]
                            new_file_offset = addr - 0x8000000
                            if new_file_offset not in new_baseroms[file_offset]:
                                new_baseroms[file_offset].append(new_file_offset)
                            break
            if label != '':
                asm_file.write('\t.4byte {}\n'.format(label))
            else:
                asm_file.write(line)

# split baseroms
for filename in asm_filenames:
    with open(filename,encoding='utf8') as asm_file:
        lines = asm_file.readlines()
    with open(filename,'w',encoding='utf8',newline='\n') as asm_file:
        for line in lines:
                m = re.match(r'^\s*\.incbin\s+"baserom.gba"\s*,\s*(0x[0-9a-fA-F]+|[0-9]+)\s*,\s*(0x[0-9a-fA-F]+|[0-9]+)', line)
                if m:
                    file_offset = int(m.group(1), 0)
                    size = int(m.group(2), 0)
                    end = file_offset + size
                    if file_offset in new_baseroms:
                        new_offsets = new_baseroms[file_offset]
                        new_offsets.sort()
                        for index, offset in enumerate(new_offsets[:-1]):
                            next_offset = new_offsets[index + 1]
                            cur_size = next_offset - offset
                            asm_file.write('gUnknown_{0:08X}:: @ {0:X}\n'.format(0x8000000 + offset))
                            asm_file.write('\t.incbin "baserom.gba", 0x{:x}, 0x{:x}\n\n'.format(offset, cur_size))
                        last_offset = new_offsets[-1]
                        asm_file.write('gUnknown_{0:08X}:: @ {0:X}\n'.format(0x8000000 + last_offset))
                        asm_file.write('\t.incbin "baserom.gba", 0x{:x}, 0x{:x}\n\n'.format(last_offset, end - last_offset))
                    else:
                        asm_file.write(line)
                else:
                    asm_file.write(line)