[pypy-svn] r55191 - in pypy/dist/pypy/lang/gameboy: . test

cami at codespeak.net cami at codespeak.net
Sat May 24 15:05:37 CEST 2008


Author: cami
Date: Sat May 24 15:05:34 2008
New Revision: 55191

Modified:
   pypy/dist/pypy/lang/gameboy/cartridge.py
   pypy/dist/pypy/lang/gameboy/constants.py
   pypy/dist/pypy/lang/gameboy/cpu.py
   pypy/dist/pypy/lang/gameboy/gameboyImplementation.py
   pypy/dist/pypy/lang/gameboy/test/test_cpu.py
   pypy/dist/pypy/lang/gameboy/test/test_memory_bank_controller.py
   pypy/dist/pypy/lang/gameboy/test/test_rom.py
Log:
fixed some buggy tests
added some cartridge memorbank tests


Modified: pypy/dist/pypy/lang/gameboy/cartridge.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/cartridge.py	(original)
+++ pypy/dist/pypy/lang/gameboy/cartridge.py	Sat May 24 15:05:34 2008
@@ -265,7 +265,7 @@
         banks = int(len(buffer) / constants.ROM_BANK_SIZE)
         if banks < self.min_rom_bank_size or banks > self.max_rom_bank_size:
             raise Exception("Invalid ROM size %s, should be in [%s %s]" % \
-                            (hex(len(buffer)), hex(self.min_rom_bank_size), \
+                            (hex(banks), hex(self.min_rom_bank_size), \
                              hex(self.max_rom_bank_size)))
         self.rom = buffer
         self.rom_size = constants.ROM_BANK_SIZE * banks - 1
@@ -275,7 +275,7 @@
         banks = int(len(buffer) / constants.RAM_BANK_SIZE)
         if banks < self.min_ram_bank_size or banks > self.max_ram_bank_size:
             raise Exception("Invalid RAM size %s, should be in [%s %s]" % \
-                            (hex(len(buffer)), hex(self.min_ram_bank_size), \
+                            (hex(banks), hex(self.min_ram_bank_size), \
                              hex(self.max_ram_bank_size)))
         self.ram = buffer
         self.ram_size = constants.RAM_BANK_SIZE * banks - 1
@@ -385,8 +385,8 @@
 
     def __init__(self, rom, ram, clock_driver):
         MBC.__init__(self, rom, ram, clock_driver,
-                    min_ram_bank_size=constants.RAM_BANK_SIZE,
-                    max_ram_bank_size=constants.RAM_BANK_SIZE,
+                    min_ram_bank_size=1,
+                    max_ram_bank_size=1,
                     min_rom_bank_size=2,   
                     max_rom_bank_size=16)
         

Modified: pypy/dist/pypy/lang/gameboy/constants.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/constants.py	(original)
+++ pypy/dist/pypy/lang/gameboy/constants.py	Sat May 24 15:05:34 2008
@@ -51,7 +51,7 @@
 CHECKSUM_A_ADDRESS         = 0x014E
 CHECKSUM_B_ADDRESS         = 0x014F
 
- #ROM Bank Size (16KB)
+# ROM Bank Size (16KB)
 ROM_BANK_SIZE = 0x4000
 
 # constants.RAM Bank Size (8KB)

Modified: pypy/dist/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/cpu.py	(original)
+++ pypy/dist/pypy/lang/gameboy/cpu.py	Sat May 24 15:05:34 2008
@@ -186,16 +186,20 @@
             a = a.get()
         self.z_flag = ((a & 0xFF) == 0)
             
-    def c_flag_add(self, s, compare_and=0x01, reset=False):
+    def c_flag_compare(self, value, compare_and=0x01, reset=False):
         if reset:
              self.reset()
-        self.c_flag = ((s & compare_and) != 0)
+        print hex(value), hex(compare_and), (value & compare_and) != 0
+        self.c_flag = ((value & compare_and) != 0)
 
-    def h_flag_compare(self, a, b):
-        self.h_flag = ((a & 0x0F) < (b & 0x0F))
+    def h_flag_compare(self, value, a, inverted=False):
+        if inverted:
+            self.h_flag = ((value & 0x0F) < (a & 0x0F))
+        else:
+            self.h_flag = ((value & 0x0F) > (a & 0x0F))
             
-    def c_flag_compare(self, a, b):
-        self.c_flag = (a < b)
+    #def c_flag_compare(self, a, b):
+    #    self.c_flag = (a < b)
         
 # # ------------------------------------------------------------------------------
 
@@ -385,18 +389,17 @@
     def fetch_execute(self):
         # Execution
         opCode = self.fetch()
-        #print "    fetch exe:", hex(opCode), "  "
-        #, FETCH_EXECUTE_OP_CODES[opCode].__name__
+        print "    fetch exe:", hex(opCode), "  ", FETCH_EXECUTE_OP_CODES[opCode].__name__
         self.last_fetch_execute_op_code = opCode
         FETCH_EXECUTE_OP_CODES[opCode](self)
         
         
     def execute(self, opCode):
         self.instruction_counter += 1
-        #print self.instruction_counter, "-"*60
-        #print "exe: ", hex(opCode),  "   ", OP_CODES[opCode].__name__
-        #print "    pc:", hex(self.pc.get()), "sp:", hex(self.sp.get())
-        #self.print_registers()
+        print self.instruction_counter, "-"*60
+        print "exe: ", hex(opCode),  "   ", OP_CODES[opCode].__name__
+        print "    pc:", hex(self.pc.get()), "sp:", hex(self.sp.get())
+        self.print_registers()
         self.last_op_code = opCode
         OP_CODES[opCode](self)
         
@@ -499,9 +502,10 @@
     def add_a(self, getCaller, setCaller=None):
         # ALU, 1 cycle
         added = (self.a.get() + getCaller.get()) & 0xFF
-        self.f.z_flag_compare(added, reset=True)
-        self.f.h_flag_compare(added, self.a.get())
-        self.f.c_flag_compare(added, self.a.get())
+        self.f.reset()
+        self.f.z_flag_compare(added)
+        self.f.h_flag_compare(added, self.a.get(), inverted=True)
+        self.f.c_flag = (added < self.a.get())
         self.a.set(added) # 1 cycle
         
     def add_hl(self, register):
@@ -554,7 +558,7 @@
 
     def compare_a(self, getCaller, setCaller=None):
         # 1 cycle
-        self.compare_a_simple(int(self.a.get() - getCaller.get()))
+        self.compare_a_simple(self.a.get() - getCaller.get())
         
     def compare_a_simple(self, s):
         s = s & 0xFF
@@ -567,7 +571,8 @@
     def hc_flag_finish(self, data):
         if data > self.a.get():
             self.f.c_flag = True
-        self.f.h_flag_compare(self.a.get(), data)
+        #self.f.c_flag_compare(data, self.a.get())
+        self.f.h_flag_compare(data, self.a.get())
         
     def AND(self, getCaller, setCaller=None):
         # 1 cycle
@@ -591,28 +596,20 @@
         self.dec(doubleRegister.get, doubleRegister.set)
         
     def inc(self, getCaller, setCaller):
-        if getCaller.register == self.a:
-            self.add_a(NumberCallWrapper(1))
-        else:
-            # 1 cycle
-            data = (getCaller.get() + 1) & 0xFF
-            self.dec_inc_flag_finish(data, setCaller, 0x00)
+        # 1 cycle
+        data = (getCaller.get() + 1) & 0xFF
+        self.dec_inc_flag_finish(data, setCaller, 0x00)
         
     def dec(self, getCaller, setCaller):
-        if setCaller.register == self.a:
-            self.subtract_a(NumberCallWrapper(1))
-        else:
-            # 1 cycle
-            data = (getCaller.get() - 1) & 0xFF
-            self.dec_inc_flag_finish(data, setCaller, 0x0F)
-            self.f.n_flag = True
+        # 1 cycle
+        data = (getCaller.get() - 1) & 0xFF
+        self.dec_inc_flag_finish(data, setCaller, 0x0F)
+        self.f.n_flag = True
      
     def dec_inc_flag_finish(self, data, setCaller, compare):
         self.f.partial_reset(keep_c=True)
         self.f.z_flag_compare(data)
-        self.f.c_flag_compare(data, self.a.get())
-        if (data & 0x0F) == compare:
-            self.f.h_flag = True
+        self.f.h_flag = ((data & 0x0F) == compare)
         setCaller.set(data) # 1 cycle
 
     def rotate_left_circular(self, getCaller, setCaller):
@@ -681,8 +678,9 @@
     def flags_and_setter_finish(self, s, setCaller, compare_and=0x01):
         # 2 cycles
         s &= 0xFF
-        self.f.z_flag_compare(s,  reset=True)
-        self.f.c_flag_add(s, compare_and)
+        self.f.reset()
+        self.f.z_flag_compare(s)
+        self.f.c_flag_compare(s, compare_and)
         setCaller.set(s) # 1 cycle
 
     def swap(self, getCaller, setCaller):

Modified: pypy/dist/pypy/lang/gameboy/gameboyImplementation.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/gameboyImplementation.py	(original)
+++ pypy/dist/pypy/lang/gameboy/gameboyImplementation.py	Sat May 24 15:05:34 2008
@@ -73,10 +73,10 @@
         
     def update_display(self):
         print "    update_display"
-        #RSDL.LockSurface(self.screen)
+        RSDL.LockSurface(self.screen)
         self.draw_pixels()
-        #RSDL.UnlockSurface(self.screen)
-        #RSDL.Flip(self.screen)
+        RSDL.UnlockSurface(self.screen)
+        RSDL.Flip(self.screen)
             
     def draw_pixels(self):
         print  "-"*60

Modified: pypy/dist/pypy/lang/gameboy/test/test_cpu.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_cpu.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_cpu.py	Sat May 24 15:05:34 2008
@@ -350,7 +350,7 @@
         opCode += 0x08
         
 # ld_BC_nnnn to ld_SP_nnnn
-def test_0x01_0x11_0x21_0x31():
+def test_0x01_0x11_0x21_0x31_load_register_nnnn():
     cpu = get_cpu()
     registers= [cpu.bc, cpu.de, cpu.hl, cpu.sp]
     value = 0x12
@@ -544,10 +544,21 @@
     cpu.dec(RegisterCallWrapper(a), RegisterCallWrapper(a))
     assert_default_flags(cpu, z_flag=True, h_flag=False, n_flag=True, c_flag=True)
     
+    a.set(1)
+    cpu.f.c_flag = False
+    cpu.dec(RegisterCallWrapper(a), RegisterCallWrapper(a))
+    assert_default_flags(cpu, z_flag=True, h_flag=False, n_flag=True, c_flag=False)
+    
     a.set(0x0F+1)
+    cpu.f.c_flag = True
     cpu.dec(RegisterCallWrapper(a), RegisterCallWrapper(a))
     assert_default_flags(cpu, z_flag=False, h_flag=True, n_flag=True, c_flag=True)
     
+    a.set(0x0F+1)
+    cpu.f.c_flag = False
+    cpu.dec(RegisterCallWrapper(a), RegisterCallWrapper(a))
+    assert_default_flags(cpu, z_flag=False, h_flag=True, n_flag=True, c_flag=False)
+    
 
 # dec_B C D E H L  A
 def test_0x05_to_0x3D_dec_registers():
@@ -1090,14 +1101,14 @@
     assert_default_flags(cpu, z_flag=False, n_flag=True)
     
     cpu.reset()
-    cpu.a.set(0xF0)
+    cpu.a.set(0xF0) 
     cpu.b.set(0x01)
     cpu.compare_a(RegisterCallWrapper(cpu.b), None)
     assert_default_flags(cpu, z_flag=False, h_flag=True, n_flag=True)
     
                          
 # cp_A_B to cp_A_A
-def test_0xB8_to_0xBF():
+def test_0xB8_to_0xBF_compare_a():
     cpu = get_cpu()
     opCode = 0xB8
     value = 0x12
@@ -1113,13 +1124,13 @@
         cycle_test(cpu, opCode, numCycles)
         if register == cpu.a:
             valueA = value
-        assert cpu.f.get() & constants.N_FLAG != 0
+        assert cpu.f.n_flag == True
         if valueA == value:
-            assert cpu.f.get() & constants.Z_FLAG != 0
+            assert cpu.f.z_flag == True
         if value < 0:
-            assert cpu.f.get() & constants.C_FLAG != 0
+            assert cpu.f.c_flag == True
         if ((valueA-value) & 0x0F) > (valueA & 0x0F):
-            assert cpu.f.get() & constants.H_FLAG != 0
+            assert cpu.f.h_flag == True
         value += 1
         opCode += 0x01
 
@@ -1534,10 +1545,11 @@
     assert_default_registers(cpu, pc=pc+1)
     
 
-def test_rotateLeftCircular_flags():
+def test_rotateLeft_flags():
     cpu = get_cpu()
     a = cpu.a
     a.set(0x01)
+    assert_default_flags(cpu)
     cpu.rotate_left_a()
     assert_default_flags(cpu, z_flag=False, c_flag=False)
     assert_default_registers(cpu, a=0x02, f=None)

Modified: pypy/dist/pypy/lang/gameboy/test/test_memory_bank_controller.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_memory_bank_controller.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_memory_bank_controller.py	Sat May 24 15:05:34 2008
@@ -1,7 +1,7 @@
 
 from pypy.lang.gameboy.cartridge import *
 from pypy.lang.gameboy.timer import Clock
-from pypy.lang.gameboy.constants import *
+from pypy.lang.gameboy import constants
 import py
 
 def get_clock_driver():
@@ -10,13 +10,57 @@
 RAM_SIZE = 3
 ROM_SIZE = 2
 
-def get_ram():
-    return [0] * RAM_SIZE * constants.RAM_BANK_SIZE
-
-def get_rom():
-    return [0xFF] * ROM_SIZE * constants.ROM_BANK_SIZE
+def get_ram(size=RAM_SIZE):
+    return [0] * size * constants.RAM_BANK_SIZE
 
+def get_rom(size=ROM_SIZE):
+    return [0xFF] * size * constants.ROM_BANK_SIZE
 
+def fail_ini_test(caller, ram_size, rom_size):
+    try:
+        caller(ram_size, rom_size)
+        py.test.fail("invalid ram/rom bounds check")
+    except:
+        pass
+ 
+ 
+ 
+def read_write_test(mbc, lower, upper):
+    write_bounds_test(mbc, lower, upper)
+    read_bounds_test(mbc, lower, upper)
+    
+def write_bounds_test(mbc, lower, upper):
+    value = 0
+    try:
+        mbc.write(lower-1, value)
+        py.test.fail("lower bound check failed")
+    except:
+        pass
+    for address in range(lower, upper):
+        mbc.write(address, value % 0xFF)
+        value += 1
+    try:
+        mbc.write(upper+1, value)
+        py.test.fail("lower upper check failed")
+    except:
+        pass
+    
+def read_bounds_test(mbc, lower, upper):
+    value = 0
+    try:
+        mbc.read(lower-1)
+        py.test.fail("lower bound check failed")
+    except:
+        pass
+    for address in range(lower, upper):
+       assert mbc.read(address) != None
+    try:
+        mbc.read(upper+1)
+        py.test.fail("lower upper check failed")
+    except:
+        pass
+    
+# -----------------------------------------------------------------------------
 def test_mbc_init():
     try:
         MBC(get_ram(), get_rom(), get_clock_driver())
@@ -95,9 +139,12 @@
 def get_default_mbc():
     return DefaultMBC([0]*0xFFFF, [0]*0xFFFF, get_clock_driver()) 
 
-def test_default_mbc_read():
-    py.test.skip("not yet implemented")
+def test_default_mbc_read_write():
+    py.test.skip("buggy implementation of DefaultMBC")
     mbc = get_default_mbc()
+    for i in range(0xFFFF):
+        mbc.write(i, i)
+        assert mbc.read(i) == i
 
 def test_default_mbc_write():
     py.test.skip("not yet implemented")
@@ -105,9 +152,46 @@
     
 # -----------------------------------------------------------------------------
 
-def get_mbc1():
-    return MBC1([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_mbc1(rom_size=128, ram_size=4):
+    return MBC1(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
 
+def test_mbc1_create():
+    mbc1 = get_mbc1()
+    assert mbc1.rom_bank == constants.ROM_BANK_SIZE
+    assert mbc1.memory_model == 0
+    assert mbc1.ram_enable == False
+    assert mbc1.ram_bank == 0
+    fail_ini_test(get_mbc1, 128, 5)
+    fail_ini_test(get_mbc1, 128, -1)
+    fail_ini_test(get_mbc1, 1, 4)
+    fail_ini_test(get_mbc1, 129, 4)
+    
+def test_mbc1_read_write():
+    mbc = get_mbc1()
+    read_write_test(mbc, 0, 0x7FFF)
+    value = 0
+    for address in range(0x1FFF+1):
+        mbc.write(address, 0x0A)
+        assert mbc.ram_enable == True
+        mbc.write(address, 0x00)
+        assert mbc.ram_enable == False
+    
+    import pdb
+    value = 1   
+    for address in range(0x2000, 0x3FFF):
+        mbc.memory_model = 0
+        rom_bank = mbc.rom_bank
+        #pdb.runcall(mbc.write, address, value)
+        mbc.write(address, value)
+        assert mbc.rom_bank == ((rom_bank & 0x180000) + \
+                                ((value & 0x1F) << 14)) & mbc.rom_size
+        mbc.memory_model = 10
+        mbc.write(address, value)
+        assert mbc.rom_bank == ((value & 0x1F) << 14) & mbc.rom_size
+        value = (value+1) % (0x1F-1) +1 
+        
+        
+        
 def test_mbc1_write():  
     py.test.skip("buggy implementation of MBC1++")
     mbc1 = get_mbc1()
@@ -121,9 +205,17 @@
 
 # -----------------------------------------------------------------------------
 
-def get_mbc2():
-    return MBC2([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_mbc2(rom_size=16, ram_size=1):
+    return MBC2(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
 
+def test_mbc2_create():
+    get_mbc2()
+    fail_ini_test(get_mbc2, 2, 0)
+    fail_ini_test(get_mbc2, 2, 2)
+    fail_ini_test(get_mbc2, 1, 1)
+    fail_ini_test(get_mbc2, 17, 1)
+    
+    
 def test_mbc2_read_write():
     py.test.skip("not yet implemented")
     mbc2 = get_mbc2()
@@ -135,9 +227,16 @@
     
 # -----------------------------------------------------------------------------
 
-def get_mbc3():
-    return MBC3([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_mbc3(rom_size=128, ram_size=4):
+    return MBC3(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
 
+def test_mbc3_create():
+    get_mbc3()
+    fail_ini_test(get_mbc3, 128, -1)
+    fail_ini_test(get_mbc3, 128, 5)
+    fail_ini_test(get_mbc3, 1, 4)
+    fail_ini_test(get_mbc3, 129, 4)
+    
 def test_mbc3_read():
     py.test.skip("not yet implemented")
     mbc3 = get_mbc3()
@@ -148,8 +247,15 @@
     
 # -----------------------------------------------------------------------------
 
-def get_mbc5():
-    return MBC5([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_mbc5(rom_size=512, ram_size=16):
+    return MBC5(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
+
+def test_mbc5_create():
+    get_mbc5()
+    fail_ini_test(get_mbc5, 512, -1)
+    fail_ini_test(get_mbc5, 512, 17)
+    fail_ini_test(get_mbc5, 1, 16)
+    fail_ini_test(get_mbc5, 513, 16)
     
 def test_mbc5_read():
     py.test.skip("not yet implemented")
@@ -161,8 +267,15 @@
 
 # -----------------------------------------------------------------------------
 
-def get_huc1():
-    return HuC1([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_huc1(rom_size=128, ram_size=4):
+    return HuC1(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
+
+def test_huc1_create():
+    get_huc1()
+    fail_ini_test(get_huc1, 128, 5)
+    fail_ini_test(get_huc1, 128, -1)
+    fail_ini_test(get_huc1, 1, 4)
+    fail_ini_test(get_huc1, 129, 4)
     
 def test_huc1_read():
     py.test.skip("not yet implemented")
@@ -174,8 +287,15 @@
 
 # -----------------------------------------------------------------------------
 
-def get_huc3():
-    return HuC3([0]*0x5FFF,[0]*0xBFFF, get_clock_driver())
+def get_huc3(rom_size=128, ram_size=4):
+    return HuC3(get_rom(rom_size), get_ram(ram_size), get_clock_driver())
+
+def test_huc1_create():
+    get_huc3()
+    fail_ini_test(get_huc3, 128, 5)
+    fail_ini_test(get_huc3, 128, -1)
+    fail_ini_test(get_huc3, 1, 4)
+    fail_ini_test(get_huc3, 129, 4)
 
 def test_huc3_read():
     py.test.skip("not yet implemented")

Modified: pypy/dist/pypy/lang/gameboy/test/test_rom.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_rom.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_rom.py	Sat May 24 15:05:34 2008
@@ -34,6 +34,7 @@
     py.test.skip()
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom1/rom1.raw", verify=False)
+    cpu = gameboy.cpu
     emulate_step_op_codes_test(gameboy, [])
     
 # ------------------------------------------------------------------------------
@@ -53,12 +54,14 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom3/rom3.gb")
     gameboy.emulate(EMULATION_CYCLES)
+    cpu = gameboy.cpu
     
 
 def test_rom3_step():
     py.test.skip()
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom3/rom3.gb")
+    cpu = gameboy.cpu
     # jp nop
     emulate_step_op_codes_test(gameboy, [0xC3])
     emulate_step_op_codes_test(gameboy, [0]*12)
@@ -70,16 +73,18 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom4/rom4.gb")
     gameboy.emulate(EMULATION_CYCLES)
-    
-    assert gameboy.cpu.ime     == False
-    assert gameboy.cpu.halted  == True
-    assert gameboy.cpu.a.get() != 0xFF
+    cpu = gameboy.cpu
+    assert cpu.ime     == False
+    assert cpu.halted  == True
+    assert cpu.a.get() != 0xFF
     
 def test_rom4_step():
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom4/rom4.gb")
+    cpu = gameboy.cpu
+    
     emulate_step_op_codes_test(gameboy, [0, 0xC3, 0xF3, 0x21])
-    assert gameboy.cpu.hl.get() == 0xFF40
+    assert cpu.hl.get() == 0xFF40
     emulate_step_op_codes_test(gameboy, [0xCB, 0x76, 0x76, 0x3E])
     
 
@@ -89,41 +94,50 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom5/rom5.gb")
     gameboy.emulate(EMULATION_CYCLES)
+    cpu = gameboy.cpu
     # stop test
-    assert gameboy.cpu.a.get() != 0xFF
+    assert cpu.a.get() != 0xFF
     
 
 def test_rom5_step():
+    py.test.skip("dec and inc dont work as excepted")
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom5/rom5.gb")
-    
+    cpu = gameboy.cpu
+    #     intro and start of .loop1
     emulate_step_op_codes_test(gameboy, [0, 0xC3, 0xF3, 0xAF, 0x3D, 0xC2])
-    assert gameboy.cpu.pc.get() == 0x0152
-    assert gameboy.cpu.a.get() == 0xFF
+    assert cpu.pc.get() == 0x0152
+    assert cpu.a.get() == 0xFF
+    # looping .loop1
     emulate_step_op_codes_test(gameboy, [0x3D, 0xC2]*0xFF)
-    assert gameboy.cpu.a.get()  == 0
-    
+    assert cpu.a.get()  == 0
+    # debug, start .loop2
     emulate_step_op_codes_test(gameboy, [0xDD, 0xAF, 0xC6])
-    pc = gameboy.cpu.pc.get()
-    assert gameboy.cpu.a.get() == 1
-    assert gameboy.cpu.f.c_flag == False
+    pc = cpu.pc.get()
+    assert cpu.a.get() == 1
+    assert cpu.f.c_flag == False
+    # check jr in .loop2
     emulate_step_op_codes_test(gameboy, [0x30])
-    assert gameboy.cpu.pc.get()  == pc-2
+    assert cpu.pc.get()  == pc-2
+    # looping in .loop2
     emulate_step_op_codes_test(gameboy, [0xC6, 0x30]*255)
-    assert gameboy.cpu.a.get() == 0
-    assert gameboy.cpu.f.c_flag == True
-    
+    assert cpu.a.get() == 0
+    assert cpu.f.c_flag == True
+    # debugg call reseting 
     emulate_step_op_codes_test(gameboy, [0xDD, 0xAF])
-    assert gameboy.cpu.a.get() == 0
-    assert gameboy.cpu.f.c_flag == False
-    pc = gameboy.cpu.pc.get()
+    assert cpu.a.get() == 0
+    assert cpu.f.c_flag == False
+    pc = cpu.pc.get()
+    # enter .loop3
+    c_flag = cpu.f.c_flag
     emulate_step_op_codes_test(gameboy, [0x3C, 0xD2])
-    assert gameboy.cpu.f.c_flag == False
-    assert gameboy.cpu.a.get() == 1
-    assert gameboy.cpu.pc.get() == pc
+    assert cpu.f.c_flag == c_flag
+    assert cpu.a.get() == 1
+    assert cpu.pc.get() == pc
+    # looping in .loop3
     emulate_step_op_codes_test(gameboy, [0x3C, 0xD2]*255)
-    assert gameboy.cpu.a.get() == 0
-    assert gameboy.cpu.f.c_flag == True
+    assert cpu.a.get() == 0
+    assert cpu.f.c_flag == False
     
     emulate_step_op_codes_test(gameboy, [0xDD, 0x76, 0x76])
     
@@ -227,6 +241,7 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom7/rom7.gb")
     gameboy.emulate(EMULATION_CYCLES)
+    cpu = gameboy.cpu
     
     
 def test_rom7_step():
@@ -238,7 +253,7 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom8/rom8.gb")
     gameboy.emulate(EMULATION_CYCLES)
-    
+    cpu = gameboy.cpu
     
     
 # ------------------------------------------------------------------------------
@@ -247,4 +262,5 @@
     gameboy = GameBoy()
     gameboy.load_cartridge_file(ROM_PATH+"/rom9/rom9.gb")
     gameboy.emulate(EMULATION_CYCLES)
+    cpu = gameboy.cpu
     



More information about the Pypy-commit mailing list