Admin Panel
# emu_test.py
# test the musashi binding
import emu
import m68k
def run():
print "create CPU, Memory, Traps"
# 68k with 128 KiB mem
cpu = emu.CPU(m68k.M68K_CPU_TYPE_68000)
memory = emu.Memory(128)
traps = emu.Traps()
# get a special range
spec_addr = memory.reserve_special_range()
print "special range: %06x" % spec_addr
def invalid(mode, width, addr):
print "MY INVALID: %s(%d): %06x" % (chr(mode), width, addr)
def trace(mode, width, addr, value):
print "TRACE: %s(%d): %06x: %x" % (chr(mode), width, addr, value)
return 0
memory.set_invalid_func(invalid)
memory.set_trace_func(trace)
memory.set_trace_mode(True)
def pc_changed(addr):
print "pc %06x" % (addr)
def reset_handler():
print "RESET"
def instr_hook():
print "INSTR HOOK"
cpu.set_pc_changed_callback(pc_changed)
cpu.set_reset_instr_callback(reset_handler)
cpu.set_instr_hook_callback(instr_hook)
print "resetting cpu..."
cpu.pulse_reset()
# write mem
print "write mem..."
memory.w16(0x1000, 0x4e70) # RESET
val = memory.r16(0x1000)
print "RESET op=%04x" % val
# block write
print memory.r_block(0,4)
memory.w_block(0,"woah")
print memory.r_block(0,4)
# string
memory.clear_block(0,100,11)
memory.w_cstr(0,"hello, world!")
s = memory.r_cstr(0)
print s,type(s)
# string
memory.clear_block(0,100,11)
memory.w_bstr(0,"hello, world!")
s = memory.r_bstr(0)
print s,type(s)
# copy block
memory.w_bstr(0,"hello, world!")
memory.copy_block(0, 100, 100)
txt = memory.r_bstr(100)
print txt
# valid range
print "executing..."
cpu.w_reg(m68k.M68K_REG_PC,0x1000)
print cpu.execute(2)
# invalid range
print "executing invalid..."
cpu.w_reg(m68k.M68K_REG_PC,spec_addr)
print cpu.execute(2)
# test traps
print "--- traps ---"
def my_trap(op, pc):
print "MY TRAP: %04x @ %08x" % (op, pc)
tid = traps.setup(my_trap, auto_rts=True)
print "trap id=",tid
# call trap
memory.w16(0x2000, 0xa000 + tid)
cpu.w_reg(m68k.M68K_REG_PC,0x2000)
print "call trap"
print cpu.execute(4)
# free trap
traps.free(tid)
# special read
print "special read..."
def my_r16(addr):
print "MY RANGE: %06x" % addr
return 0xdead;
memory.set_special_range_read_func(spec_addr, 1, my_r16)
v = memory.r16(spec_addr)
print "special=%0x" % v
# check if mem is in end mode?
is_end = memory.is_end()
print "mem is_end:",is_end
print "get/set register"
print "%08x" % cpu.r_reg(m68k.M68K_REG_D0)
cpu.w_reg(m68k.M68K_REG_D0,0xdeadbeef)
print "%08x" % cpu.r_reg(m68k.M68K_REG_D0)
# disassemble
print "disassemble"
print cpu.disassemble(0x1000)
print "done"
if __name__ == '__main__':
run()