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()