def machine_emu_mem_bstr_test():
    mem = emu.Memory(16)
    data = "hello, world"
    mem.w_bstr(0, data)
    assert mem.r_bstr(0) == data
    empty = ""
    mem.w_bstr(100, empty)
    assert mem.r_bstr(100) == empty
def machine_emu_mem_cpu_rws_test():
    mem = emu.Memory(16)

    mem.cpu_w8s(0x100, 42)
    assert mem.cpu_r8s(0x100) == 42
    mem.cpu_w8s(0x100, -23)
    assert mem.cpu_r8s(0x100) == -23

    mem.cpu_w16s(0x200, 0x7EAD)
    assert mem.cpu_r16s(0x200) == 0x7EAD
    mem.cpu_w16s(0x200, -0x1000)
    assert mem.cpu_r16s(0x200) == -0x1000

    mem.cpu_w32s(0x300, 0x1AFEBABE)
    assert mem.cpu_r32s(0x300) == 0x1AFEBABE
    mem.cpu_w32s(0x300, -0xAFEBABE)
    assert mem.cpu_r32s(0x300) == -0xAFEBABE

    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w8s(0x100, 0x80)
    with pytest.raises(OverflowError):
        mem.cpu_w8s(0x100, -0x81)
    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w16s(0x100, 0x8000)
    with pytest.raises(OverflowError):
        mem.cpu_w16s(0x100, -0x8001)
    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w32s(0x100, 0x80000000)
    with pytest.raises(OverflowError):
        mem.cpu_w32s(0x100, -0x80000001)
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w8s(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w16s(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w32s(0x100, "hello")

    # out of range
    with InvalidMemAccess(mem, "W", 0, 0x10000):
        mem.cpu_w8s(0x10000, 0)
    with InvalidMemAccess(mem, "W", 1, 0x10000):
        mem.cpu_w16s(0x10000, 0)
    with InvalidMemAccess(mem, "W", 2, 0x10000):
        mem.cpu_w32s(0x10000, 0)
    with InvalidMemAccess(mem, "R", 0, 0x10000):
        mem.cpu_r8s(0x10000)
    with InvalidMemAccess(mem, "R", 1, 0x10000):
        mem.cpu_r16s(0x10000)
    with InvalidMemAccess(mem, "R", 2, 0x10000):
        mem.cpu_r32s(0x10000)
def machine_emu_mem_invalid_access_error_test():
    mem = emu.Memory(16)

    def invalid_func(mode, width, addr):
        raise ValueError("bonk!")

    mem.set_invalid_func(invalid_func)
    with pytest.raises(ValueError):
        mem.cpu_r8(0x100000)
    with pytest.raises(ValueError):
        mem.cpu_w8(0x100000, 0)
    mem.set_invalid_func(None)
def machine_emu_mem_block_test():
    mem = emu.Memory(16)
    data = b"hello, world!"
    mem.w_block(0, data)
    assert mem.r_block(0, len(data)) == data
    bdata = bytearray(data)
    mem.w_block(0x100, bdata)
    assert mem.r_block(0x100, len(bdata)) == bdata
    mem.clear_block(0x200, 100, 42)
    assert mem.r_block(0x200, 100) == bytes([42] * 100)
    mem.copy_block(0x200, 0x300, 20)
    assert mem.r_block(0x300, 21) == bytes([42] * 20) + b"\0"
def machine_emu_mem_cpu_rw_test():
    mem = emu.Memory(16)
    assert mem.get_ram_size_kib() == 16

    mem.cpu_w8(0x100, 42)
    assert mem.cpu_r8(0x100) == 42

    mem.cpu_w16(0x200, 0xDEAD)
    assert mem.cpu_r16(0x200) == 0xDEAD

    mem.cpu_w32(0x300, 0xCAFEBABE)
    assert mem.cpu_r32(0x300) == 0xCAFEBABE

    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w8(0x100, 0x100)
    with pytest.raises(OverflowError):
        mem.cpu_w8(0x100, -1)
    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w16(0x100, 0x10000)
    with pytest.raises(OverflowError):
        mem.cpu_w16(0x100, -2)
    # invalid values
    with pytest.raises(OverflowError):
        mem.cpu_w32(0x100, 0x100000000)
    with pytest.raises(OverflowError):
        mem.cpu_w32(0x100, -3)
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w8(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w16(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.cpu_w32(0x100, "hello")

    # out of range
    with InvalidMemAccess(mem, "W", 0, 0x10000):
        mem.cpu_w8(0x10000, 0)
    with InvalidMemAccess(mem, "W", 1, 0x10000):
        mem.cpu_w16(0x10000, 0)
    with InvalidMemAccess(mem, "W", 2, 0x10000):
        mem.cpu_w32(0x10000, 0)
    with InvalidMemAccess(mem, "R", 0, 0x10000):
        mem.cpu_r8(0x10000)
    with InvalidMemAccess(mem, "R", 1, 0x10000):
        mem.cpu_r16(0x10000)
    with InvalidMemAccess(mem, "R", 2, 0x10000):
        mem.cpu_r32(0x10000)
def machine_emu_mem_trace_error_test():
    mem = emu.Memory(16)

    def trace_func(mode, width, addr, value):
        raise ValueError("bonk!")

    mem.set_trace_mode(True)
    mem.set_trace_func(trace_func)
    with pytest.raises(ValueError):
        mem.cpu_r8(0x100)
    with pytest.raises(ValueError):
        mem.cpu_w8(0x100, 0)
    mem.set_trace_mode(False)
    mem.set_trace_func(None)
def machine_emu_mem_trace_test():
    mem = emu.Memory(16)
    with TraceAssert(mem, "R", 0, 0x100, 0):
        mem.cpu_r8(0x100)
    with TraceAssert(mem, "R", 1, 0x100, 0):
        mem.cpu_r16(0x100)
    with TraceAssert(mem, "R", 2, 0x100, 0):
        mem.cpu_r32(0x100)
    with TraceAssert(mem, "W", 0, 0x100, 0x42):
        mem.cpu_w8(0x100, 0x42)
    with TraceAssert(mem, "W", 1, 0x100, 0xDEAD):
        mem.cpu_w16(0x100, 0xDEAD)
    with TraceAssert(mem, "W", 2, 0x100, 0xCAFEBABE):
        mem.cpu_w32(0x100, 0xCAFEBABE)
def machine_emu_mem_special_rw_error_test():
    mem = emu.Memory(16)

    def read(addr):
        raise ValueError("blonk!")

    def write(addr, val):
        raise ValueError("blonk!")

    mem.set_special_range_read_funcs(0xBF0000, 1, read, None, None)
    mem.set_special_range_write_funcs(0xBF0000, 1, write, None, None)
    with pytest.raises(ValueError):
        mem.cpu_r8(0xBF0000)
    with pytest.raises(ValueError):
        mem.cpu_w8(0xBF0000, 42)
Exemple #9
0
 def __init__(
     self,
     cpu_type=M68K_CPU_TYPE_68000,
     ram_size_kib=1024,
     use_labels=True,
     raise_on_main_run=True,
     cycles_per_run=1000,
     max_cycles=0,
     cpu_name=None,
 ):
     if cpu_name is None:
         cpu_name = self._get_cpu_name(cpu_type)
     # setup musashi components
     self.cpu_type = cpu_type
     self.cpu_name = cpu_name
     self.cpu = emu.CPU(cpu_type)
     self.mem = emu.Memory(ram_size_kib)
     self.traps = emu.Traps()
     # internal state
     if use_labels:
         self.label_mgr = LabelManager()
     else:
         self.label_mgr = None
     self.raise_on_main_run = raise_on_main_run
     self.ram_total = ram_size_kib * 1024
     self.ram_bytes = self.ram_total - self.ram_begin
     self.error_reporter = ErrorReporter(self)
     self.run_states = []
     self.instr_hook = None
     self.cycles_per_run = cycles_per_run
     self.max_cycles = max_cycles
     self.bail_out = False
     # call init
     self._setup_handler()
     self._setup_quick_traps()
     self._init_cpu()
     self._init_base_mem()
Exemple #10
0
def machine_emu_mem_rws_test():
    mem = emu.Memory(16)

    mem.w8s(0x100, 42)
    assert mem.r8s(0x100) == 42
    mem.w8s(0x100, -23)
    assert mem.r8s(0x100) == -23

    mem.w16s(0x200, 0x7EAD)
    assert mem.r16s(0x200) == 0x7EAD
    mem.w16s(0x200, -0x1000)
    assert mem.r16s(0x200) == -0x1000

    mem.w32s(0x300, 0x1AFEBABE)
    assert mem.r32s(0x300) == 0x1AFEBABE
    mem.w32s(0x300, -0xAFEBABE)
    assert mem.r32s(0x300) == -0xAFEBABE

    mem.writes(0, 0x101, -43)
    assert mem.reads(0, 0x101) == -43
    mem.writes(1, 0x202, -0x1234)
    assert mem.reads(1, 0x202) == -0x1234
    mem.writes(2, 0x304, -0x11223344)
    assert mem.reads(2, 0x304) == -0x11223344

    # invalid values
    with pytest.raises(OverflowError):
        mem.w8s(0x100, 0x80)
    with pytest.raises(OverflowError):
        mem.w8s(0x100, -0x81)
    # invalid values
    with pytest.raises(OverflowError):
        mem.w16s(0x100, 0x8000)
    with pytest.raises(OverflowError):
        mem.w16s(0x100, -0x8001)
    # invalid values
    with pytest.raises(OverflowError):
        mem.w32s(0x100, 0x80000000)
    with pytest.raises(OverflowError):
        mem.w32s(0x100, -0x80000001)
    # invalid type
    with pytest.raises(TypeError):
        mem.w8s(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.w16s(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.w32s(0x100, "hello")
    # invalid width
    with pytest.raises(ValueError):
        mem.writes(7, 0x202, 12)
    with pytest.raises(ValueError):
        mem.reads(7, 0x202)

    # out of range
    with pytest.raises(emu.MemoryError):
        mem.w8s(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.w16s(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.w32s(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.writes(0, 0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.r8s(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.r16s(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.r32s(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.reads(0, 0x10000)
Exemple #11
0
def machine_emu_mem_rw_test():
    mem = emu.Memory(16)
    assert mem.get_ram_size_kib() == 16

    mem.w8(0x100, 42)
    assert mem.r8(0x100) == 42

    mem.w16(0x200, 0xDEAD)
    assert mem.r16(0x200) == 0xDEAD

    mem.w32(0x300, 0xCAFEBABE)
    assert mem.r32(0x300) == 0xCAFEBABE

    mem.write(0, 0x101, 43)
    assert mem.read(0, 0x101) == 43

    mem.write(1, 0x202, 0x1234)
    assert mem.read(1, 0x202) == 0x1234

    mem.write(2, 0x304, 0x11223344)
    assert mem.read(2, 0x304) == 0x11223344

    # invalid values
    with pytest.raises(OverflowError):
        mem.w8(0x100, 0x100)
    with pytest.raises(OverflowError):
        mem.w8(0x100, -1)
    # invalid values
    with pytest.raises(OverflowError):
        mem.w16(0x100, 0x10000)
    with pytest.raises(OverflowError):
        mem.w16(0x100, -2)
    # invalid values
    with pytest.raises(OverflowError):
        mem.w32(0x100, 0x100000000)
    with pytest.raises(OverflowError):
        mem.w32(0x100, -3)
    # invalid type
    with pytest.raises(TypeError):
        mem.w8(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.w16(0x100, "hello")
    # invalid type
    with pytest.raises(TypeError):
        mem.w32(0x100, "hello")
    # invalid width
    with pytest.raises(ValueError):
        mem.write(7, 0x202, 12)
    with pytest.raises(ValueError):
        mem.read(7, 0x202)

    # out of range
    with pytest.raises(emu.MemoryError):
        mem.w8(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.w16(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.w32(0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.write(0, 0x10000, 0)
    with pytest.raises(emu.MemoryError):
        mem.r8(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.r16(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.r32(0x10000)
    with pytest.raises(emu.MemoryError):
        mem.read(0, 0x10000)