from cpu6502 import *
import unittest
class TestCPU6502(unittest.TestCase):
def setUp(self):
self.cpu = CPU6502()
self.cpu.pc = 0x7000
self.cpu.start = self.cpu.pc
self.debug = False
print("")
print("---------------------------")
print("test method: %s" % self._testMethodName)
def check_flags(self, neg, zero, carry):
self.assertEqual(self.cpu.flag_n, neg)
self.assertEqual(self.cpu.flag_z, zero)
self.assertEqual(self.cpu.flag_c, carry)
def check_a(self, val, neg, zero, carry):
self.assertEqual(self.cpu.reg_a, val)
self.check_flags(neg, zero, carry)
def check_x(self, val, neg, zero, carry):
self.assertEqual(self.cpu.reg_x, val)
self.check_flags(neg, zero, carry)
def check_y(self, val, neg, zero, carry):
self.assertEqual(self.cpu.reg_y, val)
self.check_flags(neg, zero, carry)
def check_mem(self, adr, val, neg, zero):
self.assertEqual(self.cpu.mem[adr], val)
self.assertEqual(self.cpu.flag_n, neg)
self.assertEqual(self.cpu.flag_z, zero)
def listing(self):
self.cpu.end = self.cpu.pc
self.cpu.disass()
def run_test(self, debug=False):
self.cpu.resetcyc()
if self.debug:
self.listing()
self.cpu.run()
if self.debug:
self.cpu.registers()
print("")
print("Cycles: %d" % (self.cpu.cycles))
print("")
self.assertEqual(0xff, self.cpu.sp)
def test_adc_imm_1(self):
# 15 + 21 = 36
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('adc #', 21)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(36, False, False, False)
def test_adc_imm_2(self):
# 15 + 21 + Carry = 37
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sec')
self.cpu.addcmd('adc #', 21)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(37, False, False, False)
def test_adc_imm_3(self):
# 100 + 28 = 128 und Neg gesetzt
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd('adc #', 28)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_adc_imm_4(self):
# 100 + 156 = $0100 = 0 (lowbyte) und Carry gesetzt
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd('adc #', 156)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_adc_zp_1(self):
# [aa] = 21; 15 + [aa] = 36
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('adc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(36, False, False, False)
def test_adc_zp_2(self):
# [aa] = 21; 15 + [aa] + Carry = 37
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sec')
self.cpu.addcmd('adc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(37, False, False, False)
def test_adc_zp_3(self):
# [aa] = 28; 100 + [aa] = 128 und Neg gesetzt
self.cpu.addcmd('ldx #', 28)
self.cpu.addcmd2('stx aa', 0xc6)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_adc_zp_4(self):
# [aa] = 156; 100 + [aa] = $0100 = 0 (lowbyte) und Carry gesetzt
self.cpu.addcmd('ldx #', 156)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd('adc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_adc_abs_1(self):
# [aaaa] = 21; 15 + [aaaa] = 36
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('adc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(36, False, False, False)
def test_adc_abs_2(self):
# [aaaa] = 21; 15 + [aaaa] + Carry = 37
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sec')
self.cpu.addcmd2('adc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(37, False, False, False)
def test_adc_abs_3(self):
# [aaaa] = 28; 100 + [aaaa] = 128 und Neg gesetzt
self.cpu.addcmd('ldx #', 28)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_adc_abs_4(self):
# [aaaa] = 156; 100 + [aaaa] = $0100 = 0 (lowbyte) und Carry gesetzt
self.cpu.addcmd('ldx #', 156)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_adc_abs_x_1(self):
# [aaaa,x] = 21; 15 + [aaaa,x] = 36
self.cpu.addcmd('ldy #', 21)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('adc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(36, False, False, False)
def test_adc_abs_x_2(self):
# [aaaa,x] = 21; 15 + [aaaa,x] + Carry = 37
self.cpu.addcmd('ldy #', 21)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sec')
self.cpu.addcmd2('adc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(37, False, False, False)
def test_adc_abs_x_3(self):
# [aaaa,x] = 28; 100 + [aaaa,x] = 128 und Neg gesetzt
self.cpu.addcmd('ldy #', 28)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_adc_abs_x_4(self):
# [aaaa,x] = 156; 100 + [aaaa,x] = $0100 = 0 (lowbyte) und Carry gesetzt
self.cpu.addcmd('ldy #', 156)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_adc_abs_y_1(self):
# [aaaa,y] = 21; 15 + [aaaa,y] = 36
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('adc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(36, False, False, False)
def test_adc_abs_y_2(self):
# [aaaa,y] = 21; 15 + [aaaa,y] + Carry = 37
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sec')
self.cpu.addcmd2('adc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(37, False, False, False)
def test_adc_abs_y_3(self):
# [aaaa,y] = 28; 100 + [aaaa,y] = 128 und Neg gesetzt
self.cpu.addcmd('ldx #', 28)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_adc_abs_y_4(self):
# [aaaa,y] = 156; 100 + [aaaa,y] = $0100 = 0 (lowbyte) und Carry gesetzt
self.cpu.addcmd('ldx #', 156)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('clc')
self.cpu.addcmd2('adc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_asl_1(self):
# 1010 1010 170
# << 0101 0100 84 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('asl A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(84, False, False, True)
def test_asl_2(self):
# 0101 0100 84
# << 1010 1000 168
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('asl A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(168, True, False, False)
def test_asl_zp_1(self):
# 1010 1010 170
# << 0101 0100 84 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('asl aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 84, False, False)
self.assertTrue(self.cpu.flag_c)
def test_asl_zp_2(self):
# 0101 0100 84
# << 1010 1000 168
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('asl aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 168, True, False)
self.assertFalse(self.cpu.flag_c)
def test_and_imm_1(self):
# 1110 0100 228
# & 0101 0101 85
# = 0100 0100 68
self.cpu.addcmd('lda #', 228)
self.cpu.addcmd('and #', 85)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(68, False, False, False)
def test_and_imm_2(self):
# 1111 1111
# & 0000 0000
# = 0000 0000
self.cpu.addcmd('lda #', 255)
self.cpu.addcmd('and #', 0)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, False)
def test_and_imm_3(self):
# 1111 1111
# & 1000 0000
# = 1000 0000
self.cpu.addcmd('lda #', 255)
self.cpu.addcmd('and #', 128)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_bcc_1(self):
# kein Sprung: X = 0, C = 1 -> X = 1, C = 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('sec')
self.cpu.addcmd('bcc aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(1, False, False, True)
def test_bcc_2(self):
# Vorwaertssprung: X = 0, C = 0 -> X = 0, C = 0
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('clc')
self.cpu.addcmd('bcc aa', 0x01)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_bcc_3(self):
# Schleife mit Rueckwaertssprung (16 Durchlaeufe)
# A = $00, $10, $20, ... , $e0
# -> A = $10, $20, $30, ... , $f0; C = 0, Y = 1..15
# -> A = $00, C = 1, Y = 16
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('clc')
self.cpu.addcmd('adc #', 0x10)
self.cpu.addcmd('bcc aa', 0xfa)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
# Flags nicht pruefen wg. adc #
self.assertEqual(self.cpu.reg_y, 16)
def test_bcs_1(self):
# kein Sprung: X = 0, C = 0 -> X = 1, C = 0
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('clc')
self.cpu.addcmd('bcs aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(1, False, False, False)
def test_bcs_2(self):
# Vorwaertssprung: X = 0, C = 1 -> X = 0, C = 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('sec')
self.cpu.addcmd('bcs aa', 0x01)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, True)
def test_bcs_3(self):
# Schleife mit Rueckwaertssprung (16 Durchlaeufe)
# A = $ff, $ef, $df, ... , $1f
# -> A = $ef, $df, $cf, ... , $0f; C = 1, Y = 1..15
# -> A = $ff, C = 0, Y = 16
self.cpu.addcmd('lda #', 0xff)
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('sec')
self.cpu.addcmd('sbc #', 0x10)
self.cpu.addcmd('bcs aa', 0xfa)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(255, True, False, False)
# Flags nicht pruefen wg. sbc #
self.assertEqual(self.cpu.reg_y, 16)
def test_beq_1(self):
# kein Sprung -> X = 2
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd('beq aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(2, False, False, False)
def test_beq_2(self):
# Vorwaertssprung -> X = 0
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('beq aa', 0x01)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_beq_3(self):
# Schleife X=1..0 mit Rueckwaertssprung (2 Durchlaeufe)
# -> X = 255; Y = 2
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('dex')
self.cpu.addcmd('beq aa', 0xfc)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(255, True, False, False)
# Flags nicht pruefen wg dex
self.assertEqual(self.cpu.reg_y, 2)
def test_bne_1(self):
# kein Sprung -> X = 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('bne aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(1, False, False, False)
def test_bne_2(self):
# Vorwaertssprung -> X = 1
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd('bne aa', 0x01)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(1, False, False, False)
def test_bne_3(self):
# Schleife X=10..1 mit Rueckwaertssprung (10 Durchlaeufe)
# -> X = 0; Y = 10
self.cpu.addcmd('ldx #', 10)
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('dex')
self.cpu.addcmd('bne aa', 0xfc)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
# Flags nicht pruefen wg. dex
self.assertEqual(self.cpu.reg_y, 10)
def test_bpl_1(self):
# kein Sprung -> X = 0
self.cpu.addcmd('ldx #', 0xff)
self.cpu.addcmd('bpl aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_bpl_2(self):
# Vorwaertssprung -> X = 127
self.cpu.addcmd('ldx #', 0x7f)
self.cpu.addcmd('bpl aa', 0x01)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(127, False, False, False)
def test_bpl_3(self):
# Schleife X=10..0 mit Rueckwaertssprung (11 Durchlaeufe)
# -> X = 255; Y = 11
self.cpu.addcmd('ldx #', 10)
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('dex')
self.cpu.addcmd('bpl aa', 0xfc)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(255, True, False, False)
# Flags nicht pruefen wg. dex
self.assertEqual(self.cpu.reg_y, 11)
def compare_eql(self):
""" Testet die Flags fuer A == B """
self.assertFalse(self.cpu.flag_n)
self.assertTrue(self.cpu.flag_z)
self.assertTrue(self.cpu.flag_c)
def compare_gtr(self):
""" Testet die Flags fuer A > B """
self.assertFalse(self.cpu.flag_n)
self.assertFalse(self.cpu.flag_z)
self.assertTrue(self.cpu.flag_c)
def compare_lss(self):
""" Testet die Flags fuer A < B """
self.assertTrue(self.cpu.flag_n)
self.assertFalse(self.cpu.flag_z)
self.assertFalse(self.cpu.flag_c)
def test_cmp_imm_1(self):
# A == val
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('cmp #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cmp_imm_2(self):
# A > val
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('cmp #', 15)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cmp_imm_3(self):
# A < val
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('cmp #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cmp_zp_1(self):
# A == [aa]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('cmp aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cmp_zp_2(self):
# A > [aa]
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('cmp aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cmp_zp_3(self):
# A < [aa]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('cmp aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cmp_abs_1(self):
# A == [aaaa]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('cmp aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cmp_abs_2(self):
# A > [aaaa]
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('cmp aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cmp_abs_3(self):
# A < [aaaa]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('cmp aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cmp_abs_x_1(self):
# X = 4; A == [aaaa,x]
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('cmp aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cmp_abs_x_2(self):
# X = 4; A > [aaaa,x]
self.cpu.addcmd('ldy #', 15)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd2('cmp aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cmp_abs_x_3(self):
# X = 4; A < [aaaa,x]
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd2('cmp aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cmp_abs_y_1(self):
# Y = 4; A == [aaaa,y]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('cmp aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cmp_abs_y_2(self):
# Y = 4; A > [aaaa,y]
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd2('cmp aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cmp_abs_y_3(self):
# Y = 4; A < [aaaa,y]
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd2('cmp aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpx_imm_1(self):
# X == val
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('cpx #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpx_imm_2(self):
# X > val
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('cpx #', 15)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpx_imm_3(self):
# X < val
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd('cpx #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpx_zp_1(self):
# X == [aa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('cpx aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpx_zp_2(self):
# X > [aa]
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('cpx aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpx_zp_3(self):
# X < [aa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd('cpx aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpx_abs_1(self):
# X == [aaaa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('cpx aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpx_abs_2(self):
# X > [aaaa]
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd2('cpx aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpx_abs_3(self):
# X < [aaaa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldx #', 15)
self.cpu.addcmd2('cpx aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpy_imm_1(self):
# Y == val
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd('cpy #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpy_imm_2(self):
# Y > val
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd('cpy #', 15)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpy_imm_3(self):
# Y < val
self.cpu.addcmd('ldy #', 15)
self.cpu.addcmd('cpy #', 16)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpy_zp_1(self):
# Y == [aa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd('cpy aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpy_zp_2(self):
# Y > [aa]
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd('cpy aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpy_zp_3(self):
# Y < [aa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ldy #', 15)
self.cpu.addcmd('cpy aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_cpy_abs_1(self):
# Y == [aaaa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd2('cpy aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_eql()
def test_cpy_abs_2(self):
# Y > [aaaa]
self.cpu.addcmd('lda #', 15)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd2('cpy aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_gtr()
def test_cpy_abs_3(self):
# Y < [aaaa]
self.cpu.addcmd('lda #', 16)
self.cpu.addcmd2('sta aaaa', 0x2000)
self.cpu.addcmd('ldy #', 15)
self.cpu.addcmd2('cpy aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.compare_lss()
def test_dec_zp_1(self):
# 1 -> $c6, DEC -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('dec aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 0, False, True)
def test_dec_zp_2(self):
# 0 -> $c6, DEC -> 255, N-Flag
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('dec aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 255, True, False)
def test_dec_zp_3(self):
# 128 -> $c6, DEC -> 127
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('dec aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 127, False, False)
def test_dec_abs_1(self):
# 1 -> $07e8, DEC -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('dec aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 0, False, True)
def test_dec_abs_2(self):
# 0 -> $07e8, DEC -> 255, N-Flag
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('dec aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 255, True, False)
def test_dec_abs_3(self):
# 128 -> $07e8, DEC -> 127
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('dec aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 127, False, False)
def test_dex_1(self):
# 1 - 1 -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 1)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_dex_2(self):
# 0 - 1 -> 255, N-Flag
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(255, True, False, False)
def test_dex_3(self):
# 128 - 1 -> 127
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('dex')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(127, False, False, False)
def test_dey_1(self):
# 1 - 1 -> 0, Zero-Flag
self.cpu.addcmd('ldy #', 1)
self.cpu.addcmd('dey')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(0, False, True, False)
def test_dey_2(self):
# 0 - 1 -> 255, N-Flag
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('dey')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(255, True, False, False)
def test_dey_3(self):
# 128 -1 -> 127
self.cpu.addcmd('ldy #', 128)
self.cpu.addcmd('dey')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(127, False, False, False)
def test_inc_zp_1(self):
# 254 -> $c6, INC -> 255, Neg-Flag
self.cpu.addcmd('ldx #', 254)
self.cpu.addcmd('lda #', 1) # Neg-Flag loeschen
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('inc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 255, True, False)
def test_inc_zp_2(self):
# 255 -> $c6, INC -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 255)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('inc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 0, False, True)
def test_inc_zp_3(self):
# 0 -> $c6, INC -> 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('inc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 1, False, False)
def test_inc_abs_1(self):
# 254 -> $07e8, INC -> 255, Neg-Flag
self.cpu.addcmd('ldx #', 254)
self.cpu.addcmd('lda #', 1) # Neg-Flag loeschen
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('inc aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 255, True, False)
def test_inc_abs_2(self):
# 255 -> $07e8, INC -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 255)
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('inc aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 0, False, True)
def test_inc_abs_3(self):
# 0 -> $07e8, INC -> 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd2('stx aaaa', 0x07e8)
self.cpu.addcmd2('inc aaaa', 0x07e8)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0x07e8, 1, False, False)
def test_eor_imm_1(self):
# 1000 1000 136
# ^ 0101 1010 90
# = 1101 0010 210
self.cpu.addcmd('lda #', 136)
self.cpu.addcmd('eor #', 90)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(210, True, False, False)
def test_eor_imm_2(self):
# 1111 0000 240
# | 1111 1111 15
# = 0000 1111 255
self.cpu.addcmd('lda #', 240)
self.cpu.addcmd('eor #', 255)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, False)
def test_inx_1(self):
# 254 + 1 -> 255, Neg-Flag
self.cpu.addcmd('ldx #', 254)
self.cpu.addcmd('lda #', 1) # Neg-Flag loeschen
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(255, True, False, False)
def test_inx_2(self):
# 255 + 1 -> 0, Zero-Flag
self.cpu.addcmd('ldx #', 255)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_inx_3(self):
# 0 + 1 -> 1
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('inx')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(1, False, False, False)
def test_iny_1(self):
# 254 + 1 -> 255, Neg-Flag
self.cpu.addcmd('ldy #', 254)
self.cpu.addcmd('lda #', 1) # Neg-Flag loeschen
self.cpu.addcmd('iny')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(255, True, False, False)
def test_iny_2(self):
# 255 + 1 -> 0, Zero-Flag
self.cpu.addcmd('ldy #', 255)
self.cpu.addcmd('iny')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(0, False, True, False)
def test_iny_3(self):
# 0 + 1 -> 1
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('iny')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(1, False, False, False)
def test_jmp_abs(self):
# PC -> $7010
self.cpu.addcmd2('jmp aaaa', 0x7010)
self.run_test()
# PC steht auf $7011, da der brk-Befehl noch
# ausgefuehrt wird
self.assertEqual(self.cpu.pc, 0x7011)
def test_jmp_ind(self):
# $8010/$8011 = $7010; PC -> ($8010)
self.cpu.addcmd('lda #', 0x10)
self.cpu.addcmd2('sta aaaa', 0x8010)
self.cpu.addcmd('lda #', 0x70)
self.cpu.addcmd2('sta aaaa', 0x8011)
self.cpu.addcmd2('jmp (aaaa)', 0x8010)
self.run_test()
# PC steht auf $7011, da der brk-Befehl noch
# ausgefuehrt wird
self.assertEqual(self.cpu.pc, 0x7011)
def test_jsr_rts(self):
# $7005 -> PC, 80 -> A, $7003 -> PC
self.cpu.addcmd2('jsr aaaa', 0x7005)
self.cpu.addcmd('brk')
self.cpu.addcmd('brk')
self.cpu.addcmd('lda #', 80)
self.cpu.addcmd('rts')
self.run_test()
self.check_a(80, False, False, False)
# $7004 wegen brk
self.assertEqual(self.cpu.pc, 0x7004)
def test_jsr_alt(self):
# Alternativer Handler bei $6000;
# 128 -> A, Neg. gesetzt, $7005 -> PC
def handler():
self.cpu.reg_a = 128
self.cpu._a_set_nz_flags()
# Handler setzen
self.cpu.addhandler('test', 0x6000, handler)
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd2('jsr aaaa', 0x6000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
# $7006 wegen brk
self.assertEqual(self.cpu.pc, 0x7006)
def test_lda_imm_1(self):
# 0 -> A, Zero-Flag
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, False)
def test_lda_imm_2(self):
# 100 -> A
self.cpu.addcmd('lda #', 100)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(100, False, False, False)
def test_lda_imm_3(self):
# 128 -> A, Neg-Flag
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_lda_zp(self):
# 192 -> $61 -> A
self.cpu.addcmd('ldx #', 192)
self.cpu.addcmd('stx aa', 97)
self.cpu.addcmd('lda aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(192, True, False, False)
def test_lda_zp_x(self):
# 128 -> $c6; X=4; $c6,X -> A
self.cpu.addcmd('ldy #', 128)
self.cpu.addcmd('sty aa', 0xca)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda aa,x', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_lda_abs(self):
# 128 -> $0424 -> A
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('stx aaaa', 36, 4)
self.cpu.addcmd('lda aaaa', 36, 4)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_lda_abs_x(self):
# 128 -> $0424; X=4; $0424,X -> A
self.cpu.addcmd('ldy #', 128)
self.cpu.addcmd2('sty aaaa', 0x0428)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd2('lda aaaa,x', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_lda_abs_y(self):
# 128 -> $0424; Y=4; $0424,Y -> A
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd2('stx aaaa', 0x0428)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd2('lda aaaa,y', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_lda_ind_y(self):
# 128 -> $0428; $0424 -> $61/62; Y=4; ($61/62),Y -> A
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('stx aaaa', 40, 4)
self.cpu.addcmd('ldx #', 0x24)
self.cpu.addcmd('stx aa', 97)
self.cpu.addcmd('ldx #', 0x04)
self.cpu.addcmd('stx aa', 98)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('lda (aa),y', 97)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_ldx_imm_1(self):
# 0 -> X, Zero-Flag
self.cpu.addcmd('ldx #', 0)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(0, False, True, False)
def test_ldx_imm_2(self):
# 100 -> X
self.cpu.addcmd('ldx #', 100)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(100, False, False, False)
def test_ldx_imm_3(self):
# 128 -> X, Neg-Flag
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(128, True, False, False)
def test_ldx_zp(self):
# 192 -> $61 -> X
self.cpu.addcmd('lda #', 192)
self.cpu.addcmd('sta aa', 97)
self.cpu.addcmd('ldx aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(192, True, False, False)
def test_ldx_abs(self):
# 128 -> $0424 -> X
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd2('sta aaaa', 0x0424)
self.cpu.addcmd2('ldx aaaa', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.check_x(128, True, False, False)
def test_ldy_imm_1(self):
# 0 -> Y, Zero-Flag
self.cpu.addcmd('ldy #', 0)
self.cpu.addcmd('brk')
self.run_test()
self.check_y(0, False, True, False)
def test_ldy_imm_2(self):
# 100 -> Y
self.cpu.addcmd('ldy #', 100)
self.cpu.addcmd('brk')
self.run_test()
self.check_y(100, False, False, False)
def test_ldy_imm_3(self):
# 128 -> Y, Neg-Flag
self.cpu.addcmd('ldy #', 128)
self.cpu.addcmd('brk')
self.run_test()
self.check_y(128, True, False, False)
def test_ldy_zp(self):
# 192 -> $61 -> Y
self.cpu.addcmd('lda #', 192)
self.cpu.addcmd('sta aa', 97)
self.cpu.addcmd('ldy aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.check_y(192, True, False, False)
def test_ldy_abs(self):
# 128 -> $0424 -> Y
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd2('sta aaaa', 0x0424)
self.cpu.addcmd2('ldy aaaa', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.check_y(128, True, False, False)
def test_lsr_1(self):
# 0101 0101 85
# >> 0010 1010 42 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('lsr A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(42, False, False, True)
def test_lsr_2(self):
# 0010 1010 42
# >> 0001 0101 21
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('lsr A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(21, False, False, False)
def test_lsr_zp_1(self):
# 0101 0101 85
# >> 0010 1010 42 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('lsr aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 42, False, False)
self.assertTrue(self.cpu.flag_c)
def test_lsr_zp_2(self):
# 0010 1010 42
# >> 0001 0101 21
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('lsr aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 21, False, False)
self.assertFalse(self.cpu.flag_c)
def test_nop(self):
self.cpu.addcmd('lda #', 1)
for i in range(5):
self.cpu.addcmd('nop')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(1, False, False, False)
def test_ora_imm_1(self):
# 1000 1000 136
# | 0101 1010 90
# = 1101 1010 218
self.cpu.addcmd('lda #', 136)
self.cpu.addcmd('ora #', 90)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(218, True, False, False)
def test_ora_imm_2(self):
# 1111 0000 240
# | 0000 1111 15
# = 1111 1111 255
self.cpu.addcmd('lda #', 240)
self.cpu.addcmd('ora #', 15)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(255, True, False, False)
def test_pha_pla(self):
# 128 -> ST -> A, Neg-Flag
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd('pha')
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd('pla')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
self.assertEqual(self.cpu.sp, 255)
def test_php_plp_1(self):
# 128 -> Neg-Flag -> ST -> Neg-Flag
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd('php')
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd('plp')
self.cpu.addcmd('brk')
self.run_test()
self.assertTrue(self.cpu.flag_n)
self.assertEqual(self.cpu.sp, 255)
def test_php_plp_2(self):
# 0 -> Zero-Flag -> ST -> Zero-Flag
self.cpu.addcmd('lda #', 0)
self.cpu.addcmd('php')
self.cpu.addcmd('lda #', 1)
self.cpu.addcmd('plp')
self.cpu.addcmd('brk')
self.run_test()
self.assertTrue(self.cpu.flag_z)
self.assertEqual(self.cpu.sp, 255)
def test_php_plp_3(self):
# Carry-Flag -> ST -> Carry-Flag
self.cpu.addcmd('sec')
self.cpu.addcmd('php')
self.cpu.addcmd('clc')
self.cpu.addcmd('plp')
self.cpu.addcmd('brk')
self.run_test()
self.assertTrue(self.cpu.flag_c)
self.assertEqual(self.cpu.sp, 255)
def test_php_plp_4(self):
# Interrupt-Flag -> ST -> Interrupt-Flag
self.cpu.addcmd('sei') # eigentlich nicht noetig
self.cpu.addcmd('php')
self.cpu.addcmd('cli')
self.cpu.addcmd('plp')
self.cpu.addcmd('brk')
self.run_test()
self.assertTrue(self.cpu.flag_i)
self.assertEqual(self.cpu.sp, 255)
def test_rol_1(self):
# 1010 1010 170
# << 0101 0100 84 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('clc')
self.cpu.addcmd('rol A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(84, False, False, True)
def test_rol_2(self):
# 0101 0100 84
# << 1010 1000 168
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('clc')
self.cpu.addcmd('rol A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(168, True, False, False)
def test_rol_3(self):
# 1010 1010 170 + Carry
# << 0101 0101 85 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('sec')
self.cpu.addcmd('rol A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(85, False, False, True)
def test_rol_4(self):
# 0101 0100 84 + Carry
# << 1010 1001 169
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('sec')
self.cpu.addcmd('rol A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(169, True, False, False)
def test_rol_zp_1(self):
# 1010 1010 170
# << 0101 0100 84 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('clc')
self.cpu.addcmd('rol aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 84, False, False)
self.assertTrue(self.cpu.flag_c)
def test_rol_zp_2(self):
# 0101 0100 84
# << 1010 1000 168
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('clc')
self.cpu.addcmd('rol aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 168, True, False)
self.assertFalse(self.cpu.flag_c)
def test_rol_zp_3(self):
# 1010 1010 170 + Carry
# << 0101 0100 85 und Carry gesetzt
self.cpu.addcmd('lda #', 170)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('sec')
self.cpu.addcmd('rol aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 85, False, False)
self.assertTrue(self.cpu.flag_c)
def test_rol_zp_4(self):
# 0101 0100 84 + Carry
# << 1010 1000 169
self.cpu.addcmd('lda #', 84)
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('sec')
self.cpu.addcmd('rol aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 169, True, False)
self.assertFalse(self.cpu.flag_c)
def test_ror_1(self):
# 0101 0101 85
# >> 0010 1010 42 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('clc')
self.cpu.addcmd('ror A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(42, False, False, True)
def test_ror_2(self):
# 0010 1010 42
# >> 0001 0101 21
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('clc')
self.cpu.addcmd('ror A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(21, False, False, False)
def test_ror_3(self):
# 0101 0101 85 + Carry
# >> 1010 1010 170 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('sec')
self.cpu.addcmd('ror A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(170, True, False, True)
def test_ror_4(self):
# 0010 1010 42 + Carry
# >> 1001 0101 149
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('sec')
self.cpu.addcmd('ror A')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(149, True, False, False)
def test_ror_zp_1(self):
# 0101 0101 85
# >> 0010 1010 42 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('clc')
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ror aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 42, False, False)
self.assertTrue(self.cpu.flag_c)
def test_ror_zp_2(self):
# 0010 1010 42
# >> 0001 0101 21
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('clc')
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ror aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 21, False, False)
self.assertFalse(self.cpu.flag_c)
def test_ror_zp_3(self):
# 0101 0101 85 + Carry
# >> 1010 1010 170 und Carry gesetzt
self.cpu.addcmd('lda #', 85)
self.cpu.addcmd('sec')
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ror aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 170, True, False)
self.assertTrue(self.cpu.flag_c)
def test_ror_zp_4(self):
# 0010 1010 42 + Carry
# >> 1001 0101 149
self.cpu.addcmd('lda #', 42)
self.cpu.addcmd('sec')
self.cpu.addcmd('sta aa', 0xc6)
self.cpu.addcmd('ror aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_mem(0xc6, 149, True, False)
self.assertFalse(self.cpu.flag_c)
def test_sta_zp(self):
# 80 -> $61
self.cpu.addcmd('lda #', 80)
self.cpu.addcmd('sta aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[97], 80)
def test_sbc_imm_1(self):
# 36 - 21 = 15 und Carry gesetzt
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc #', 21)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, True)
def test_sbc_imm_2(self):
# 36 - 21 - Carry = 14 und Carry gesetzt
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc #', 21)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(14, False, False, True)
def test_sbc_imm_3(self):
# 36 - 36 = 0 und Carry und Zero gesetzt
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc #', 36)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_sbc_imm_4(self):
# 36 - 37 = -1 = $ff und Carry geloescht, Neg gesetzt
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc #', 37)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0xff, True, False, False)
def test_sbc_zp_1(self):
# [aa] = 21; 36 - [aa] = 15 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, True)
def test_sbc_zp_2(self):
# [aa] = 21; 36 - [aa] - Carry = 14 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(14, False, False, True)
def test_sbc_zp_3(self):
# [aa] = 36; 36 - [aa] = 0 und Carry und Zero gesetzt
self.cpu.addcmd('ldx #', 36)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_sbc_zp_4(self):
# [aa] = 37; 36 - [aa] = -1 = $ff und Carry geloescht, Neg gesetzt
self.cpu.addcmd('ldx #', 37)
self.cpu.addcmd('stx aa', 0xc6)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd('sbc aa', 0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0xff, True, False, False)
def test_sbc_abs_1(self):
# [aaaa] = 21; 36 - [aaaa] = 15 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, True)
def test_sbc_abs_2(self):
# [aaaa] = 21; 36 - [aaaa] - Carry = 14 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(14, False, False, True)
def test_sbc_abs_3(self):
# [aaaa] = 36; 36 - [aaaa] = 0 und Carry und Zero gesetzt
self.cpu.addcmd('ldx #', 36)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_sbc_abs_4(self):
# [aaaa] = 37; 36 - [aaaa] = -1 = $ff und Carry geloescht, Neg gesetzt
self.cpu.addcmd('ldx #', 37)
self.cpu.addcmd2('stx aaaa', 0x2000)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0xff, True, False, False)
def test_sbc_abs_x_1(self):
# [aaaa,x] = 21; 36 - [aaaa,x] = 15 und Carry gesetzt
self.cpu.addcmd('ldy #', 21)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, True)
def test_sbc_abs_x_2(self):
# [aaaa,x] = 21; 36 - [aaaa,x] - Carry = 14 und Carry gesetzt
self.cpu.addcmd('ldy #', 21)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(14, False, False, True)
def test_sbc_abs_x_3(self):
# [aaaa,x] = 36; 36 - [aaaa,x] = 0 und Carry und Zero gesetzt
self.cpu.addcmd('ldy #', 36)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_sbc_abs_x_4(self):
# [aaaa,x] = 37; 36 - [aaaa,x] = -1 = $ff und Carry geloescht, Neg gesetzt
self.cpu.addcmd('ldy #', 37)
self.cpu.addcmd2('sty aaaa', 0x2004)
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,x', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0xff, True, False, False)
def test_sbc_abs_y_1(self):
# [aaaa,y] = 21; 36 - [aaaa,y] = 15 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(15, False, False, True)
def test_sbc_abs_y_2(self):
# [aaaa,y] = 21; 36 - [aaaa,y] - Carry = 14 und Carry gesetzt
self.cpu.addcmd('ldx #', 21)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('clc')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(14, False, False, True)
def test_sbc_abs_y_3(self):
# [aaaa,y] = 36; 36 - [aaaa,y] = 0 und Carry und Zero gesetzt
self.cpu.addcmd('ldx #', 36)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0, False, True, True)
def test_sbc_abs_y_4(self):
# [aaaa,y] = 37; 36 - [aaaa,y] = -1 = $ff und Carry geloescht, Neg gesetzt
self.cpu.addcmd('ldx #', 37)
self.cpu.addcmd2('stx aaaa', 0x2004)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('sec')
self.cpu.addcmd('lda #', 36)
self.cpu.addcmd2('sbc aaaa,y', 0x2000)
self.cpu.addcmd('brk')
self.run_test()
self.check_a(0xff, True, False, False)
def test_sta_zp_x(self):
# X=4; 65 -> $c6,X
self.cpu.addcmd('ldx #', 4)
self.cpu.addcmd('lda #', 65)
self.cpu.addcmd('sta aa,x',0xc6)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0xca], 65)
def test_sta_abs(self):
# 65 -> $0424
self.cpu.addcmd('lda #', 65)
self.cpu.addcmd2('sta aaaa', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0424], 65)
def test_sta_abs_x(self):
# X=16; 65 -> $0424,X
self.cpu.addcmd('ldx #', 16)
self.cpu.addcmd('lda #', 65)
self.cpu.addcmd2('sta aaaa,x', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0434], 65)
def test_sta_abs_y(self):
# Y=16; 65 -> $0424,Y
self.cpu.addcmd('ldy #', 16)
self.cpu.addcmd('lda #', 65)
self.cpu.addcmd2('sta aaaa,y',0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0434], 65)
def test_sta_ind_y(self):
# $0424 -> $61/62; Y=4; 65 -> ($61/62),Y
self.cpu.addcmd('ldx #', 0x24)
self.cpu.addcmd('stx aa', 97)
self.cpu.addcmd('ldx #', 0x04)
self.cpu.addcmd('stx aa', 98)
self.cpu.addcmd('lda #', 65)
self.cpu.addcmd('ldy #', 4)
self.cpu.addcmd('sta (aa),y', 97)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0428], 65)
def test_stx_zp(self):
# 80 -> $61
self.cpu.addcmd('ldx #', 80)
self.cpu.addcmd('stx aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[97], 80)
def test_stx_abs(self):
# 65 -> $0424
self.cpu.addcmd('ldx #', 65)
self.cpu.addcmd2('stx aaaa', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0424], 65)
def test_sty_zp(self):
# 80 -> $61
self.cpu.addcmd('ldy #', 80)
self.cpu.addcmd('sty aa', 97)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[97], 80)
def test_sty_abs(self):
# 65 -> $0424
self.cpu.addcmd('ldy #', 65)
self.cpu.addcmd2('sty aaaa', 0x0424)
self.cpu.addcmd('brk')
self.run_test()
self.assertEqual(self.cpu.mem[0x0424], 65)
def test_tax(self):
# A -> X
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd('tax')
self.cpu.addcmd('brk')
self.run_test()
self.check_x(128, True, False, False)
def test_tay(self):
# A -> Y
self.cpu.addcmd('lda #', 128)
self.cpu.addcmd('tay')
self.cpu.addcmd('brk')
self.run_test()
self.check_y(128, True, False, False)
def test_txa(self):
# X -> A
self.cpu.addcmd('ldx #', 128)
self.cpu.addcmd('txa')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
def test_tya(self):
# Y -> A
self.cpu.addcmd('ldy #', 128)
self.cpu.addcmd('tya')
self.cpu.addcmd('brk')
self.run_test()
self.check_a(128, True, False, False)
if __name__ == '__main__':
unittest.main()