summaryrefslogtreecommitdiff
path: root/extras/pretty_trainer_headers.py
blob: 5bfc2be9176cddb0ac0d4ea081522ecafafd4277 (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#author: Bryan Bishop <kanzure@gmail.com>
#date: 2012-01-24
from optparse import OptionParser
from gbz80disasm import load_labels, find_label
from extract_maps import calculate_pointer
import sys
spacing = "\t"
rom = None

def pretty_print_trainer_header(address, label=None):
    """make pretty text for a trainer header"""
    global rom
    output = ""
    bank_id = 0
    if address > 0x4000:
        bank_id = address / 0x4000
    
    #convert address to an integer if necessary
    if type(address) == str:
        if "$" in address: address = address.replace("$", "0x")
        address = int(address, 16)

    #label this section of asm
    if label == None:
        output += "TrainerHeader_" + hex(address)[2:] + ": ; 0x" + hex(address)[2:] + "\n"
    else:
        output += label + ": ; 0x" + hex(address)[2:] + "\n"
    
    #flag's bit
    output += spacing + "db $" + hex(ord(rom[address]))[2:] + " ; flag's bit\n"
    
    #trainer's view range
    view_range = ord(rom[address+1]) >> 4
    output += spacing + "db ($" + hex(view_range)[2:] + " << 4) ; trainer's view range\n"

    #flag's byte
    pointer_byte1 = ord(rom[address+2])
    pointer_byte2 = ord(rom[address+3])
    partial_pointer = (pointer_byte1 + (pointer_byte2 << 8))
    partial_pointer = "$%.2x" % partial_pointer
    output += spacing + "dw " + partial_pointer + " ; flag's byte\n"

    #TextBeforeBattle
    pointer_byte1 = ord(rom[address+4])
    pointer_byte2 = ord(rom[address+5])
    partial_pointer = (pointer_byte1 + (pointer_byte2 << 8))
    label = find_label(partial_pointer, bank_id)
    if label == None:
        print "label not found for (TextBeforeBattle) " + hex(calculate_pointer(partial_pointer, bank_id))
        print ""
        label = "$" + hex(partial_pointer)[2:]
        #sys.exit(0)

    output += spacing + "dw " + label + " ; " + hex(partial_pointer) + " TextBeforeBattle\n"

    #TextAfterBattle
    pointer_byte1 = ord(rom[address+6])
    pointer_byte2 = ord(rom[address+7])
    partial_pointer = (pointer_byte1 + (pointer_byte2 << 8))
    label = find_label(partial_pointer, bank_id)
    if label == None:
        print "label not found for (TextAfterBattle) " + hex(calculate_pointer(partial_pointer, bank_id))
        print ""
        label = "$" + hex(partial_pointer)[2:]
        #sys.exit(0)

    output += spacing + "dw " + label + " ; " + hex(partial_pointer) + " TextAfterBattle\n"

    #TextEndBattle
    pointer_byte1 = ord(rom[address+8])
    pointer_byte2 = ord(rom[address+9])
    partial_pointer = (pointer_byte1 + (pointer_byte2 << 8))
    label = find_label(partial_pointer, bank_id)
    if label == None:
        print "label not found for (TextEndBattle) " + hex(calculate_pointer(partial_pointer, bank_id))
        print ""
        label = "$" + hex(partial_pointer)[2:]
        #sys.exit(0)

    output += spacing + "dw " + label + " ; " + hex(partial_pointer) + " TextEndBattle\n"

    #TextEndBattle
    pointer_byte1 = ord(rom[address+10])
    pointer_byte2 = ord(rom[address+11])
    partial_pointer = (pointer_byte1 + (pointer_byte2 << 8))
    label = find_label(partial_pointer, bank_id)
    if label == None:
        print "label not found for (TextEndBattle) " + hex(calculate_pointer(partial_pointer, bank_id))
        print ""
        label = "$" + hex(partial_pointer)[2:]
        #sys.exit(0)

    output += spacing + "dw " + label + " ; " + hex(partial_pointer) + " TextEndBattle\n"

    output += "; " + hex(address+12) + "\n"

    return output

def all_trainer_headers_at(address):
    i = 0
    while ord(rom[address + (i*12)]) != 0xff:
        print pretty_print_trainer_header(address + (i*12))
        i += 1

def main():
    load_labels()

    usage = "usage: %prog address"
    parser = OptionParser(usage)
    (options, args) = parser.parse_args()
    if len(args) == 1:
        print "usage: python pretty_trainer_headers.py address label\n"
        args.append("TrainerHeader_" + (args[0].replace("0x", "")))
    elif len(args) != 2:
        parser.error("we need both an address and a label")
    address = int(args[0], 16)
    label = args[1]

    global rom
    rom = open("../baserom.gbc", "r").read()

    #print pretty_print_trainer_header(address, label)
    print all_trainer_headers_at(address)

if __name__ == "__main__":
    main()