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.
This commit is contained in:
Bryan Bishop 2013-08-27 10:53:17 -05:00
commit 5e66419093
4 changed files with 104 additions and 47 deletions

View File

@ -270,6 +270,7 @@ jap_chars.update({
0xE1: "",
0xE2: "",
0xE3: "",
0xE9: "",
})
#some of the japanese characters can probably fit into the english table

View File

@ -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:

View File

@ -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 = [

View File

@ -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)'))
labels = read_mapfile()
# 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'
# 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()