aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_emu/test/test_alu.py
diff options
context:
space:
mode:
Diffstat (limited to 'atk16_emu/test/test_alu.py')
-rw-r--r--atk16_emu/test/test_alu.py344
1 files changed, 344 insertions, 0 deletions
diff --git a/atk16_emu/test/test_alu.py b/atk16_emu/test/test_alu.py
new file mode 100644
index 0000000..dfae609
--- /dev/null
+++ b/atk16_emu/test/test_alu.py
@@ -0,0 +1,344 @@
+from atk16_emu import Machine
+from test.utils import make_rom
+
+def test_alr_add_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 == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_add_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 == True
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_add_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 == True
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == True
+ assert machine.fr.sign == False
+
+def test_alr_add_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 == False
+ assert machine.fr.overflow == True
+ assert machine.fr.zero == False
+ assert machine.fr.sign == True
+
+def test_alr_sub_small_unsigned():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_001]) # ALR target=RC left=RA right=RB alu_code=1
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 10
+ machine.rb.value = 20
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0xFFF6 # -10
+ assert machine.fr.carry == True
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == True
+
+def test_alr_sub_large_unsigned():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_001]) # ALR target=RC left=RA right=RB alu_code=1
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0xFFFF
+ machine.rb.value = 0xFFFF
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0x0000
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == True
+ assert machine.fr.sign == False
+
+def test_alr_sub_small_signed():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_001]) # ALR target=RC left=RA right=RB alu_code=1
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0x0001 # 1
+ machine.rb.value = 0xFFFF # -1
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0x0002
+ assert machine.fr.carry == True
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_sub_large_signed():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_001]) # ALR target=RC left=RA right=RB alu_code=1
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0x7FFF # 32767
+ machine.rb.value = 0xFFFF # -1
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0x8000 # -32768
+ assert machine.fr.carry == True
+ assert machine.fr.overflow == True
+ assert machine.fr.zero == False
+ assert machine.fr.sign == True
+
+def test_alr_and():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_010]) # ALR target=RC left=RA right=RB alu_code=2
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b1100
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b1000
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_or():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_011]) # ALR target=RC left=RA right=RB alu_code=3
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b1100
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b1110
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_xor():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_100]) # ALR target=RC left=RA right=RB alu_code=4
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b1100
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b0110
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_slr_small():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_101]) # ALR target=RC left=RA right=RB alu_code=5
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b0001
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b0101
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_slr_large():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_101]) # ALR target=RC left=RA right=RB alu_code=5
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0xFFFF
+ machine.rb.value = 0x1
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0x7FFF
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_sar_small():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_110]) # ALR target=RC left=RA right=RB alu_code=6
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b0001
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b0101
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_sar_large():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_110]) # ALR target=RC left=RA right=RB alu_code=6
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0xFFFF
+ machine.rb.value = 0x1
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0xFFFF
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == True
+
+
+def test_alr_sll_small():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_111]) # ALR target=RC left=RA right=RB alu_code=7
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0b1010
+ machine.rb.value = 0b0001
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0b10100
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False
+
+def test_alr_sll_large():
+ machine = Machine()
+
+ rom_image = make_rom([0b0000_010_000_001_111]) # ALR target=RC left=RA right=RB alu_code=7
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 0xFFFF
+ machine.rb.value = 0x1
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 0xFFFE
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == True
+
+def test_ali_add_small_unsigned():
+ machine = Machine()
+
+ rom_image = make_rom([0b0001_010_000_001_000]) # ALI target=RC left=RA imm=0x000A alu_code=0
+ machine.load_rom_image(rom_image)
+ machine.reset()
+
+ machine.ra.value = 10
+
+ machine.run()
+ machine.step()
+
+ assert machine.rc.value == 11
+ assert machine.fr.carry == False
+ assert machine.fr.overflow == False
+ assert machine.fr.zero == False
+ assert machine.fr.sign == False