vba - call arbitrary functions from jython

This commit is contained in:
Bryan Bishop 2013-03-01 02:43:55 -06:00
parent b543827ee4
commit caa1dc10dd

View File

@ -73,6 +73,7 @@ import sys
import re import re
from array import array from array import array
import string import string
from copy import copy
# for converting bytes to readable text # for converting bytes to readable text
from chars import chars from chars import chars
@ -480,12 +481,12 @@ class Registers:
return get_registers() return get_registers()
def _get_register(id): def _get_register(id):
def constructed_func(self): def constructed_func(self, id=copy(id)):
return get_registers()[id] return get_registers()[id]
return constructed_func return constructed_func
def _set_register(id): def _set_register(id):
def constructed_func(self, value): def constructed_func(self, value, id=copy(id)):
current_registers = get_registers() current_registers = get_registers()
current_registers[id] = value current_registers[id] = value
set_registers(current_registers) set_registers(current_registers)
@ -524,13 +525,54 @@ class Registers:
def __repr__(self): def __repr__(self):
spacing = "\t" spacing = "\t"
output = "Registers:\n" output = "Registers:\n"
for each in self.order: for (id, each) in enumerate(self.order):
output += spacing + each + " = " + hex(self[each]) output += spacing + each + " = " + hex(get_registers()[id])
#hex(self[each])
output += "\n" output += "\n"
return output return output
registers = Registers() registers = Registers()
def call(bank, address):
"""
Jumps into a function at a certain address.
Go into the start menu, pause the game and try call(1, 0x1078) to see a
string printed to the screen.
"""
push = [
registers.pc,
registers.hl,
registers.de,
registers.bc,
registers.af,
0x3bb7,
]
for value in push:
registers.sp -= 2
set_memory_at(registers.sp + 1, value >> 8)
set_memory_at(registers.sp, value & 0xFF)
if get_memory_range(registers.sp, 2) != [value & 0xFF, value >> 8]:
print "desired memory values: " + str([value & 0xFF, value >> 8] )
print "actual memory values: " + str(get_memory_range(registers.sp , 2))
print "wrong value at " + hex(registers.sp) + " expected " + hex(value) + " but got " + hex(get_memory_at(registers.sp))
#registers.af = (bank << 8) | (registers.af & 0xff)
#registers.hl = address
#registers.pc = 0x2d63 # FarJump
#registers2 = get_registers()
#registers2[5] = 0xc4a0
#registers2[4] = 0x1276
#registers2[0] = address
#set_registers(registers2)
registers["hl"] = 0xc4a0
registers["de"] = 0x1276
registers["pc"] = address
#print "registers.pc is: " + hex(registers.pc)
class crystal: class crystal:
""" """
Just a simple namespace to store a bunch of functions for Pokémon Crystal. Just a simple namespace to store a bunch of functions for Pokémon Crystal.
@ -570,7 +612,7 @@ class crystal:
""" """
for step_counter in range(0, steplimit): for step_counter in range(0, steplimit):
crystal.walk_through_walls() crystal.walk_through_walls()
#crystal.set_enemy_level(1) #call(0x1, 0x1078)
step() step()
@staticmethod @staticmethod