diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-21 12:02:14 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-21 12:02:14 +0200 |
| commit | a0b4a1a6107e4dc905b21858d8ac76c47293cfb4 (patch) | |
| tree | f7ec4d592a6ee7bf6f1e61ef805643c83fedf740 /atk16_emu/test | |
| parent | 549901c85044b6ccd912688d6be007c2fdacc6c6 (diff) | |
Add emu
Diffstat (limited to 'atk16_emu/test')
| -rw-r--r-- | atk16_emu/test/__init__.py | 0 | ||||
| -rw-r--r-- | atk16_emu/test/test_opcode_alr.py | 78 | ||||
| -rw-r--r-- | atk16_emu/test/test_opcode_hlt.py | 18 | ||||
| -rw-r--r-- | atk16_emu/test/utils.py | 25 |
4 files changed, 121 insertions, 0 deletions
diff --git a/atk16_emu/test/__init__.py b/atk16_emu/test/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/atk16_emu/test/__init__.py diff --git a/atk16_emu/test/test_opcode_alr.py b/atk16_emu/test/test_opcode_alr.py new file mode 100644 index 0000000..c54d70e --- /dev/null +++ b/atk16_emu/test/test_opcode_alr.py @@ -0,0 +1,78 @@ +from atk16_emu.emu import Machine +from atk16_emu.test.utils import make_rom + +def test_alr_s0_small_unsigned(): + machine = Machine() + + rom_image = make_rom([0b0000_010_000_001_000]) # ALR target=RC left=RA right=RB alu_code=0 + machine.load_rom_image(rom_image) + machine.reset() + + machine.ra.value = 10 + machine.rb.value = 20 + + machine.run() + machine.step() + + assert machine.rc.value == 30 + assert machine.fr.carry == 0 + assert machine.fr.overflow == 0 + assert machine.fr.zero == 0 + assert machine.fr.sign == 0 + +def test_alr_s0_large_unsigned(): + machine = Machine() + + rom_image = make_rom([0b0000_010_000_001_000]) # ALR target=RC left=RA right=RB alu_code=0 + machine.load_rom_image(rom_image) + machine.reset() + + machine.ra.value = 0xFFFF + machine.rb.value = 20 + + machine.run() + machine.step() + + assert machine.rc.value == 19 + assert machine.fr.carry == 1 + assert machine.fr.overflow == 0 + assert machine.fr.zero == 0 + assert machine.fr.sign == 0 + +def test_alr_s0_small_signed(): + machine = Machine() + + rom_image = make_rom([0b0000_010_000_001_000]) # ALR target=RC left=RA right=RB alu_code=0 + machine.load_rom_image(rom_image) + machine.reset() + + machine.ra.value = 0xFFFF # -1 + machine.rb.value = 0x0001 # 1 + + machine.run() + machine.step() + + assert machine.rc.value == 0 + assert machine.fr.carry == 1 + assert machine.fr.overflow == 0 + assert machine.fr.zero == 1 + assert machine.fr.sign == 0 + +def test_alr_s0_large_signed(): + machine = Machine() + + rom_image = make_rom([0b0000_010_000_001_000]) # ALR target=RC left=RA right=RB alu_code=0 + machine.load_rom_image(rom_image) + machine.reset() + + machine.ra.value = 0x7FFF # 32767 + machine.rb.value = 0x0001 # 1 + + machine.run() + machine.step() + + assert machine.rc.value == 0x8000 # -32768 + assert machine.fr.carry == 0 + assert machine.fr.overflow == 1 + assert machine.fr.zero == 0 + assert machine.fr.sign == 1
\ No newline at end of file diff --git a/atk16_emu/test/test_opcode_hlt.py b/atk16_emu/test/test_opcode_hlt.py new file mode 100644 index 0000000..5cae888 --- /dev/null +++ b/atk16_emu/test/test_opcode_hlt.py @@ -0,0 +1,18 @@ +from atk16_emu.emu import Machine +from atk16_emu.test.utils import make_rom + +def test_hlt(): + machine = Machine() + + rom_image = make_rom([0b1111_0000_0000_0000]) # HLT + machine.load_rom_image(rom_image) + machine.reset() + machine.run() + + assert machine.pc.value == 0 + assert machine.running == True + + machine.step() + + assert machine.pc.value == 1 + assert machine.running == False diff --git a/atk16_emu/test/utils.py b/atk16_emu/test/utils.py new file mode 100644 index 0000000..0d40d54 --- /dev/null +++ b/atk16_emu/test/utils.py @@ -0,0 +1,25 @@ +def pad_bytearray(to_length: int, ba: bytearray) -> bytearray: + """ + Pads a bytearray with zeros until it reaches a specified length. + + :param to_length: Target length in bytes. + :param ba: The bytearray to be padded. + :return: The padded bytearray. + """ + padding_size = to_length - len(ba) + if padding_size > 0: + ba.extend(b'\x00' * padding_size) + return ba + +def make_rom(words: list[int]) -> bytearray: + """ + Constructs a ROM image from a list of 16-bit words. + + :param words: The list of 16-bit words. + :return: The ROM image as a bytearray. + """ + bytes = [] + for word in words: + bytes.append((word >> 8) & 0xFF) + bytes.append(word & 0xFF) + return pad_bytearray(64 * 1024, bytearray(bytes))
\ No newline at end of file |
