mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-09-09 09:51:34 -07:00
better debugging for recursive scripts
This commit is contained in:
parent
69f541f541
commit
8188cf07dc
@ -1,7 +1,4 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#author: Bryan Bishop <kanzure@gmail.com>
|
|
||||||
#date: 2012-03-04
|
|
||||||
#utilities to help disassemble pokémon crystal
|
#utilities to help disassemble pokémon crystal
|
||||||
import sys
|
import sys
|
||||||
from copy import copy
|
from copy import copy
|
||||||
@ -1195,15 +1192,27 @@ pksv_crystal_unknowns = [
|
|||||||
#use this to keep track of commands without pksv names
|
#use this to keep track of commands without pksv names
|
||||||
pksv_no_names = {}
|
pksv_no_names = {}
|
||||||
def pretty_print_pksv_no_names():
|
def pretty_print_pksv_no_names():
|
||||||
"""just some nice debugging output"""
|
"""just some nice debugging output
|
||||||
|
use this to keep track of commands without pksv names
|
||||||
|
pksv_no_names is created in parse_script_engine_script_at"""
|
||||||
for (command_byte, addresses) in pksv_no_names.items():
|
for (command_byte, addresses) in pksv_no_names.items():
|
||||||
if command_byte in pksv_crystal_unknowns: continue
|
if command_byte in pksv_crystal_unknowns: continue
|
||||||
print hex(command_byte) + " appearing in these scripts: "
|
print hex(command_byte) + " appearing in these scripts: "
|
||||||
for address in addresses:
|
for address in addresses:
|
||||||
print " " + hex(address)
|
print " " + hex(address)
|
||||||
|
|
||||||
|
|
||||||
|
recursive_scripts = []
|
||||||
|
def rec_parse_script_engine_script_at(address, origin=None):
|
||||||
|
"""this is called in parse_script_engine_script_at for recursion
|
||||||
|
when this works it should be flipped back to using the regular
|
||||||
|
parser."""
|
||||||
|
recursive_scripts.append([address, origin])
|
||||||
|
return {}
|
||||||
|
|
||||||
def parse_script_engine_script_at(address, map_group=None, map_id=None, force=False):
|
def parse_script_engine_script_at(address, map_group=None, map_id=None, force=False):
|
||||||
"""parses a script-engine script"""
|
"""parses a script-engine script
|
||||||
|
force=True if you want to re-parse and get the debug information"""
|
||||||
global rom
|
global rom
|
||||||
if rom == None:
|
if rom == None:
|
||||||
load_rom()
|
load_rom()
|
||||||
@ -1243,8 +1252,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
size = 3
|
size = 3
|
||||||
start_address = offset
|
start_address = offset
|
||||||
last_byte_address = offset + size - 1
|
last_byte_address = offset + size - 1
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
pointer = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
#XXX should we also parse this target script?
|
command["pointer"] = pointer
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x01: #Pointer code [3b+ret]
|
elif command_byte == 0x01: #Pointer code [3b+ret]
|
||||||
pksv_name = "3call"
|
pksv_name = "3call"
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
@ -1254,7 +1265,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=True)
|
pointer = calculate_pointer_from_bytes_at(start_address+1, bank=True)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x02: #Pointer code [2b+3b+ret]
|
elif command_byte == 0x02: #Pointer code [2b+3b+ret]
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1262,7 +1276,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
[Code][resp. pointer(2byte or 3byte)]
|
[Code][resp. pointer(2byte or 3byte)]
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
pointer = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x03: #Pointer code [2b]
|
elif command_byte == 0x03: #Pointer code [2b]
|
||||||
#XXX what does "new script is part of main script" mean?
|
#XXX what does "new script is part of main script" mean?
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
@ -1271,7 +1288,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
[Code][resp. pointer(2byte or 3byte)]
|
[Code][resp. pointer(2byte or 3byte)]
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
pointer = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
end = True #according to pksv
|
end = True #according to pksv
|
||||||
elif command_byte == 0x04: #Pointer code [3b]
|
elif command_byte == 0x04: #Pointer code [3b]
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
@ -1280,7 +1300,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
[Code][resp. pointer(2byte or 3byte)]
|
[Code][resp. pointer(2byte or 3byte)]
|
||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=True)
|
pointer = calculate_pointer_from_bytes_at(start_address+1, bank=True)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
end = True #according to pksv
|
end = True #according to pksv
|
||||||
elif command_byte == 0x05: #Pointer code [2b+3b]
|
elif command_byte == 0x05: #Pointer code [2b+3b]
|
||||||
info = "pointer code"
|
info = "pointer code"
|
||||||
@ -1290,6 +1313,9 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
|
command["target_pointer"] = calculate_pointer_from_bytes_at(command["pointer"], bank=True)
|
||||||
|
script = rec_parse_script_engine_script_at(command["target_pointer"], original_start_address)
|
||||||
|
command["script"] = script
|
||||||
end = True #according to pksv
|
end = True #according to pksv
|
||||||
elif command_byte == 0x06: #RAM check [=byte]
|
elif command_byte == 0x06: #RAM check [=byte]
|
||||||
info = "RAM check [=byte]"
|
info = "RAM check [=byte]"
|
||||||
@ -1299,7 +1325,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
command["byte"] = ord(rom[start_address+1])
|
command["byte"] = ord(rom[start_address+1])
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+2)
|
pointer = calculate_pointer_from_bytes_at(start_address+2)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x07: #RAM check [<>byte]
|
elif command_byte == 0x07: #RAM check [<>byte]
|
||||||
info = "RAM check [<>byte]"
|
info = "RAM check [<>byte]"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1308,7 +1337,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
command["byte"] = ord(rom[start_address+1])
|
command["byte"] = ord(rom[start_address+1])
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+2)
|
pointer = calculate_pointer_from_bytes_at(start_address+2)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x08: #RAM check [=0]
|
elif command_byte == 0x08: #RAM check [=0]
|
||||||
info = "RAM check [=0]"
|
info = "RAM check [=0]"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1316,7 +1348,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
.. then go to pointed script, else resume interpreting after the pointer
|
.. then go to pointed script, else resume interpreting after the pointer
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
pointer = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x09: #RAM check [<>0]
|
elif command_byte == 0x09: #RAM check [<>0]
|
||||||
info = "RAM check [<>0]"
|
info = "RAM check [<>0]"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1324,7 +1359,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
.. then go to pointed script, else resume interpreting after the pointer
|
.. then go to pointed script, else resume interpreting after the pointer
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1)
|
pointer = calculate_pointer_from_bytes_at(start_address+1)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x0A: #RAM check [<byte]
|
elif command_byte == 0x0A: #RAM check [<byte]
|
||||||
info = "RAM check [<byte]"
|
info = "RAM check [<byte]"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1333,7 +1371,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
command["byte"] = ord(rom[start_address+1])
|
command["byte"] = ord(rom[start_address+1])
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+2)
|
pointer = calculate_pointer_from_bytes_at(start_address+2)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x0B: #RAM check [>byte]
|
elif command_byte == 0x0B: #RAM check [>byte]
|
||||||
info = "RAM check [>byte]"
|
info = "RAM check [>byte]"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1342,7 +1383,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
"""
|
"""
|
||||||
size = 4
|
size = 4
|
||||||
command["byte"] = ord(rom[start_address+1])
|
command["byte"] = ord(rom[start_address+1])
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+2)
|
pointer = calculate_pointer_from_bytes_at(start_address+2)
|
||||||
|
script = rec_parse_script_engine_script_at(pointer, original_start_address)
|
||||||
|
command["pointer"] = pointer
|
||||||
|
command["script"] = script
|
||||||
elif command_byte == 0x0C: #0C codes [xxyy]
|
elif command_byte == 0x0C: #0C codes [xxyy]
|
||||||
info = "call predefined script then end"
|
info = "call predefined script then end"
|
||||||
long_info = """
|
long_info = """
|
||||||
@ -1475,6 +1519,7 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
#[19][2-byte RAM address]
|
#[19][2-byte RAM address]
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
|
#XXX maybe a pointer is a bad idea?
|
||||||
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
command["pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
||||||
elif command_byte == 0x1A: #Copy variable code2 [xxyy]
|
elif command_byte == 0x1A: #Copy variable code2 [xxyy]
|
||||||
info = "Write variable from script RAM variable to actual RAM address [xxyy]"
|
info = "Write variable from script RAM variable to actual RAM address [xxyy]"
|
||||||
@ -2623,7 +2668,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
#[8C][2byte pointer to script]
|
#[8C][2byte pointer to script]
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["script_pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
script_pointer = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
||||||
|
script = rec_parse_script_engine_script_at(script_pointer, original_start_address)
|
||||||
|
command["script_pointer"] = script_pointer
|
||||||
|
command["script"] = script
|
||||||
end = True #according to pksv
|
end = True #according to pksv
|
||||||
elif command_byte == 0x8E: #Warp check
|
elif command_byte == 0x8E: #Warp check
|
||||||
info = "Reactive all engine checks if player is warping"
|
info = "Reactive all engine checks if player is warping"
|
||||||
@ -2640,7 +2688,10 @@ def parse_script_engine_script_at(address, map_group=None, map_id=None, force=Fa
|
|||||||
#[8E][2byte pointer to script]
|
#[8E][2byte pointer to script]
|
||||||
"""
|
"""
|
||||||
size = 3
|
size = 3
|
||||||
command["script_pointer"] = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
script_pointer = calculate_pointer_from_bytes_at(start_address+1, bank=False)
|
||||||
|
script = rec_parse_script_engine_script_at(script_pointer, original_start_address)
|
||||||
|
command["script_pointer"] = script_pointer
|
||||||
|
command["script"] = script
|
||||||
end = True #according to pksv
|
end = True #according to pksv
|
||||||
elif command_byte == 0x90: #Return code1
|
elif command_byte == 0x90: #Return code1
|
||||||
info = "Return code 1"
|
info = "Return code 1"
|
||||||
|
Loading…
Reference in New Issue
Block a user