예제 #1
0
    def test_data_past_ram_end_raises_indexerror(self, ram_size, location):
        vm = VM(memory_size=ram_size)

        # 1 after end of RAM
        data_len = 1 + ram_size - location

        with pytest.raises(IndexError):
            vm.load_to_memory(b"a" * data_len, location)
예제 #2
0
def load_rom_to_vm(path: PathOrStr,
                   vm: VM = None,
                   location: int = 0x200) -> VM:
    """
    Utility function to load a rom to a VM's memory space.

    If the VM isn't provided, one is created.

    Raises an error if it's too big for the allotted VM.
    """
    path = clean_path(path)

    vm = vm or VM()

    with open(path, "rb") as rom_file:
        rom_data = rom_file.read()
        rom_size = len(rom_data)
        mem_size = len(vm.memory)

        if rom_size > mem_size - vm.program_counter:
            raise IndexError(f"Rom file too big!"
                             f"{rom_size} > {mem_size - vm.program_counter}")
    vm.load_to_memory(rom_data, location)
    return vm
예제 #3
0
 def test_bad_type_on_data_causes_typerror(self):
     vm = VM()
     with pytest.raises(TypeError):
         vm.load_to_memory("bad", 0x200)
예제 #4
0
 def test_good_values_sets_data(self, data):
     vm = VM()
     vm.load_to_memory(data, 0x200)
     assert vm.memory[0x200:0x204] == data
예제 #5
0
 def test_negative_location_causes_indexerror(self):
     vm = VM()
     with pytest.raises(IndexError):
         vm.load_to_memory(b"aaa", -5)