from cpu6502 import *
import os.path
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_x(self, val, neg, zero, carry):
       self.assertEqual(self.cpu.reg_x, val)
       self.check_flags(neg, zero, carry)

   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_irq(self):
       # Interrupt aktivieren
       self.cpu.flag_i = False
       self.cpu.mem[0xfffe] = 0x10
       self.cpu.mem[0xffff] = 0x70
       # Interrupt-Ausloeser
       fp = open(self.cpu.irq_file, 'w')
       fp.close()
       # Assembler-Programm
       self.cpu.addcmd('lda #', 0x80)
       # Interrupt-Routine wird ausgefuehrt
       self.cpu.addcmd('ldx #', 0x10)
       self.cpu.addcmd('brk')
       # Interrupt-Routine
       self.cpu.pc = 0x7010
       self.cpu.addcmd('sta aa', 0xf0)
       self.cpu.addcmd('inc aa', 0xf0)
       self.cpu.addcmd('rti')
       self.run_test()
       self.assertEqual(0x81, self.cpu.mem[0xf0])
       self.check_x(0x10, False, False, False)
       self.assertFalse(os.path.exists(self.cpu.irq_file))



if __name__ == '__main__':
   unittest.main()