diff options
author | Bryan Bishop <kanzure@gmail.com> | 2013-08-27 10:53:17 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2013-08-27 10:53:17 -0500 |
commit | 5e66419093bee938c4b58b87da2ddfb00361fe7a (patch) | |
tree | 88438f9731bc440f7cff2b680c2b647de9561bbc | |
parent | 967de1cf3c16eb7806a745acc65ceb222ad5d6dc (diff) | |
parent | f0ef450967fa00377fb8d39211741e7d7a596396 (diff) |
Merge branch 'from-yenatch' into master
These commits (roughly) represent the changes made against extras/ by
yenatch. These are not cherrypicked and this isn't repeatable, sorry.
-rw-r--r-- | pokemontools/chars.py | 1 | ||||
-rw-r--r-- | pokemontools/crystal.py | 12 | ||||
-rw-r--r-- | pokemontools/pksv.py | 24 | ||||
-rw-r--r-- | pokemontools/sym.py | 116 |
4 files changed, 105 insertions, 48 deletions
diff --git a/pokemontools/chars.py b/pokemontools/chars.py index fc69fc5..f27bc90 100644 --- a/pokemontools/chars.py +++ b/pokemontools/chars.py @@ -270,6 +270,7 @@ jap_chars.update({ 0xE1: "ゅ", 0xE2: "ょ", 0xE3: "ー", + 0xE9: "ァ", }) #some of the japanese characters can probably fit into the english table diff --git a/pokemontools/crystal.py b/pokemontools/crystal.py index dcd95d9..2630991 100644 --- a/pokemontools/crystal.py +++ b/pokemontools/crystal.py @@ -1993,7 +1993,7 @@ movement_command_bases = { 0x45: "accelerate_last", 0x46: ["step_sleep", ["duration", DecimalParam]], 0x47: "step_end", - 0x49: "hide_person", + 0x49: "remove_person", # do these next two have any params ?? 0x4C: "teleport_from", @@ -2811,7 +2811,7 @@ pksv_crystal_more = { 0x8F: ["ptpriorityjump", ["pointer", ScriptPointerLabelParam]], 0x90: ["return"], 0x91: ["end"], - 0x92: ["reloadandreturn"], + 0x92: ["reloadandreturn", ["which_method", SingleByteParam]], 0x93: ["resetfuncs"], 0x94: ["pokemart", ["dialog_id", SingleByteParam], ["mart_id", MultiByteParam]], # maybe it should be a pokemark constant id/label? 0x95: ["elevator", ["floor_list_pointer", PointerLabelParam]], @@ -7360,13 +7360,17 @@ def write_all_labels(all_labels, filename="labels.json"): from wram import wram_labels def get_ram_label(address): - """returns a label assigned to a particular ram address""" + """ + returns a label assigned to a particular ram address + """ if address in wram_labels.keys(): return wram_labels[address][-1] return None def get_label_for(address): - """returns a label assigned to a particular rom address""" + """ + returns a label assigned to a particular address + """ global all_labels if address == None: diff --git a/pokemontools/pksv.py b/pokemontools/pksv.py index 2f02ec0..ef3f425 100644 --- a/pokemontools/pksv.py +++ b/pokemontools/pksv.py @@ -293,13 +293,23 @@ pksv_crystal = { } #these cause the script to end; used in create_command_classes -pksv_crystal_more_enders = [0x03, 0x04, 0x05, 0x0C, 0x51, 0x52, - 0x53, 0x8D, 0x8F, 0x90, 0x91, 0x92, - 0x9B, - 0xB2, #maybe? - 0xCC, #maybe? - 0x9A, # describedecoration - ] +pksv_crystal_more_enders = [ + 0x03, # 2jump + 0x04, + 0x05, + 0x0C, + 0x51, + 0x52, + 0x53, + 0x65, + 0x8D, # priorityjump + 0x8F, # ptpriorityjump + 0x90, # return + 0x91, # end + 0x92, # reloadandreturn + 0x9A, # describedecoration + 0x9B, # fruittree +] # these have no pksv names as of pksv 2.1.1 pksv_crystal_unknowns = [ diff --git a/pokemontools/sym.py b/pokemontools/sym.py index f78b9af..ebd8532 100644 --- a/pokemontools/sym.py +++ b/pokemontools/sym.py @@ -1,54 +1,96 @@ -# -*- coding: utf-8 -*- +# coding: utf-8 +import os +import sys import json -# from crystal import load_rom -# from gbz80disasm import load_labels - - def make_sym_from_json(filename = '../pokecrystal.sym', j = 'labels.json'): - # todo: delete and remake labels.json at runtime + output = '' + labels = json.load(open(j)) + for label in labels: + output += '{0:x}:{1:x} {2}\n'.format(label['bank'], label['address'], label['label']) with open(filename, 'w') as sym: - for label in json.load(open(j)): - sym.write('{0:x}:{1:x} {2}\n'.format(label['bank'], label['address']%0x4000 + (0x4000 if label['bank'] else 0), label['label'])) + sym.write(output) + +def make_json_from_mapfile(filename='labels.json', mapfile='../pokecrystal.map'): + output = [] + labels = filter_wram_addresses(read_mapfile(mapfile)) + with open(filename, 'w') as out: + out.write(json.dumps(labels)) + +def read_mapfile(filename='../pokecrystal.map'): + """ + Scrape label addresses from an rgbds mapfile. + """ + + labels = [] + + with open(filename, 'r') as mapfile: + lines = mapfile.readlines() + + for line in lines: + # bank # + if 'Bank #' in line: + cur_bank = int(line.lstrip('Bank #').strip(';\n').strip(' (HOME)')) + # label definition + elif '=' in line: + address, label = line.split('=') + address = int(address.lstrip().replace('$', '0x'), 16) + label = label.strip() + + # rgbds doesn't support ram banks yet + bank = cur_bank + offset = address + + ranges = [ + 0x8000 <= address < 0xa000, + 0xa000 <= address < 0xc000, + 0xc000 <= address < 0xd000, + 0xd000 <= address < 0xe000, + ] + + if any(ranges): + bank = 0 + else: + offset += (bank * 0x4000 - 0x4000) if bank > 0 else 0 + + labels += [{ + 'label': label, + 'bank': bank, + 'address': offset, + 'offset': offset, + 'local_address': address, + }] + + return labels + +def filter_wram_addresses(labels): + filtered_labels = [] + for label in labels: + if label['local_address'] < 0x8000: + filtered_labels += [label] + return filtered_labels def make_sym_from_mapfile(filename = '../pokecrystal.sym', mapfile = '../mapfile.txt'): # todo: sort label definitions by address output = '' - # get label definitions - with open(mapfile,'r') as map: - lines = map.readlines() - for line in lines: - # bank # - if 'Bank #' in line: - cur_bank = int(line.lstrip('Bank #').strip(':\n').strip(' (HOME)')) - - # label definition - elif '=' in line: - thing = line.split('=') - spacing = ' ' * 11 # arbitrary - addr = int(thing[0].lstrip(spacing)[1:5],16) - - # rgbds doesn't support wram banks yet, - # so this hack is applied instead - if addr > 0xbfff: # 0xc000+ (wram only) - cur_bank = 0 - if addr > 0xcfff: # 0xd000+ (wram only) - cur_bank = 1 - - # convert to sym format (bank:addr label) - label = thing[1].strip('\n') - output += hex(cur_bank)[2:] + ':' + hex(addr)[2:] + ' ' + label + '\n' + labels = read_mapfile() + + # convert to sym format (bank:addr label) + for label in labels: + output += '%.2x:%.4x %s\n' % (label['bank'], label['address'], label['label']) # dump contents to symfile with open(filename, 'w') as sym: sym.write(output) - if __name__ == "__main__": - # default behavior: generate sym file from rgbds mapfile - try: make_sym_from_mapfile() - # if no mapfile exists, generate from labels.json - except: make_sym_from_json() + #if os.path.exists('../pokecrystal.sym'): + # sys.exit() + #elif os.path.exists('../pokecrystal.map'): + # make_sym_from_mapfile() + #elif os.path.exists('labels.json'): + # make_sym_from_json() + make_json_from_mapfile() |