[pypy-svn] r54174 - pypy/branch/gameboy-emulator/pypy/lang/gameboy

cami at codespeak.net cami at codespeak.net
Mon Apr 28 16:02:52 CEST 2008


Author: cami
Date: Mon Apr 28 16:02:50 2008
New Revision: 54174

Modified:
   pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py
   pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py
   pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
Log:
more refactoring


Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py	(original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py	Mon Apr 28 16:02:50 2008
@@ -8,17 +8,16 @@
     
 class Channel(object):
 
-    # Audio Channel 1 int
-    nr0 = 0
-    nr1 = 0
-    nr2 = 0
-    nr3 = 0
-    nr4 = 0
     audioIndex = 0
     audioLength = 0
     audioFrequency = 0
     
     def __init__(self):
+        
+        self.audioLength=0
+        self.audioEnvelope=0
+        self.audioFrequency=0
+        self.audioPlayback=0
         self.nr0 = 0
         self.nr1 = 0
         self.nr2 = 0
@@ -32,42 +31,40 @@
         self.audioIndex = 0
         
     
+    def getAudioLength(self):
+        return self.audioLength
+
+    def getAudioEnvelope(self):
+        return self.audioEnvelope
+
+    def getAudioFrequency(self):
+        return self.audioFrequency
+
+    def getAudioPlayback(self):
+        return self.audioPlayback
+        
+
+    
 # ------------------------------------------------------------------------------
 
 #SquareWaveGenerator
 class Channel1(Channel):
         # Audio Channel 1 int
     audioSweep=0
-    audioLength=0
-    audioEnvelope=0
-    audioFrequency=0
-    audioPlayback=0
     audio1Index=0
     audio1Length=0
-    audio1Volume=0
+    audioVolume=0
     audio1EnvelopeLength=0
-    audio1SweepLength=0
+    audioSweepLength=0
     audio1Frequency=0
     
      # Audio Channel 1
     def getAudioSweep(self):
         return self.audioSweep
 
-    def getAudioLength(self):
-        return self.audioLength
-
-    def getAudioEnvelope(self):
-        return self.audioEnvelope
-
-    def getAudioFrequency(self):
-        return self.audioFrequency
-
-    def getAudioPlayback(self):
-        return self.audioPlayback
-
     def setAudioSweep(self, data):
         self.audioSweep = data
-        self.audio1SweepLength = (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
+        self.audioSweepLength = (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
 
     def setAudioLength(self, data):
         self.audioLength = data
@@ -78,11 +75,11 @@
         if ((self.audioPlayback & 0x40) != 0):
             return
         if ((self.audioEnvelope >> 4) == 0):
-            self.audio1Volume = 0
+            self.audioVolume = 0
         elif (self.audio1EnvelopeLength == 0 and (self.audioEnvelope & 0x07) == 0):
-            self.audio1Volume = (self.audio1Volume + 1) & 0x0F
+            self.audioVolume = (self.audioVolume + 1) & 0x0F
         else:
-            self.audio1Volume = (self.audio1Volume + 2) & 0x0F
+            self.audioVolume = (self.audioVolume + 2) & 0x0F
 
     def setAudioFrequency(self, data):
         self.audioFrequency = data
@@ -96,8 +93,8 @@
             self.outputEnable |= 0x01
             if ((self.audioPlayback & 0x40) != 0 and self.audio1Length == 0):
                 self.audio1Length = (constants.SOUND_CLOCK / 256) * (64 - (self.audioLength & 0x3F))
-            self.audio1SweepLength = (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
-            self.audio1Volume = self.audioEnvelope >> 4
+            self.audioSweepLength = (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
+            self.audioVolume = self.audioEnvelope >> 4
             self.audio1EnvelopeLength = (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
 
     def updateAudio(self):
@@ -109,14 +106,14 @@
             self.audio1EnvelopeLength-=1
             if (self.audio1EnvelopeLength <= 0):
                 if ((self.audioEnvelope & 0x08) != 0):
-                    if (self.audio1Volume < 15):
-                        self.audio1Volume+=1
-                elif (self.audio1Volume > 0):
-                    self.audio1Volume-=1
+                    if (self.audioVolume < 15):
+                        self.audioVolume+=1
+                elif (self.audioVolume > 0):
+                    self.audioVolume-=1
                 self.audio1EnvelopeLength += (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
-        if (self.audio1SweepLength > 0):
-            self.audio1SweepLength-=1
-            if (self.audio1SweepLength <= 0):
+        if (self.audioSweepLength > 0):
+            self.audioSweepLength-=1
+            if (self.audioSweepLength <= 0):
                 sweepSteps = (self.audioSweep & 0x07)
                 if (sweepSteps != 0):
                     frequency = ((self.audioPlayback & 0x07) << 8) + self.audioFrequency
@@ -132,9 +129,10 @@
                         self.audio1Frequency = 0
                         self.outputEnable &= ~0x01
             
-                self.audio1SweepLength += (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
+                self.audioSweepLength += (constants.SOUND_CLOCK / 128) * ((self.audioSweep >> 4) & 0x07)
 
     def mixAudio(self, buffer, length):
+        
         wavePattern = 0x18
         if (self.audioLength & 0xC0) == 0x00:
             wavePattern = 0x04
@@ -147,42 +145,28 @@
             self.audio1Index += self.audio1Frequency
             if ((self.audio1Index & (0x1F << 22)) >= wavePattern):
                 if ((self.outputTerminal & 0x10) != 0):
-                    buffer[index + 0] -= self.audio1Volume
+                    buffer[index + 0] -= self.audioVolume
                 if ((self.outputTerminal & 0x01) != 0):
-                    buffer[index + 1] -= self.audio1Volume
+                    buffer[index + 1] -= self.audioVolume
             else:
                 if ((self.outputTerminal & 0x10) != 0):
-                    buffer[index + 0] += self.audio1Volume
+                    buffer[index + 0] += self.audioVolume
                 if ((self.outputTerminal & 0x01) != 0):
-                    buffer[index + 1] += self.audio1Volume
-      
+                    buffer[index + 1] += self.audioVolume
+                    
+    
 
 #SquareWaveGenerator
 class Channel2(Channel):
         # Audio Channel 2 int
-    audioLength=0
-    audioEnvelope=0
-    audioFrequency=0
-    audioPlayback=0
     audio2Index=0
     audio2Length=0
-    audio2Volume=0
+    audioVolume=0
     audio2EnvelopeLength=0
     audio2Frequency=0
     
       
      # Audio Channel 2
-    def getAudioLength(self):
-        return self.audioLength
-
-    def getAudioEnvelope(self):
-        return self.audioEnvelope
-
-    def getAudioFrequency(self):
-        return self.audioFrequency
-
-    def getAudioPlayback(self):
-        return self.audioPlayback
 
     def setAudioLength(self, data):
         self.audioLength = data
@@ -192,11 +176,11 @@
         self.audioEnvelope = data
         if ((self.audioPlayback & 0x40) == 0):
             if ((self.audioEnvelope >> 4) == 0):
-                self.audio2Volume = 0
+                self.audioVolume = 0
             elif (self.audio2EnvelopeLength == 0 and (self.audioEnvelope & 0x07) == 0):
-                self.audio2Volume = (self.audio2Volume + 1) & 0x0F
+                self.audioVolume = (self.audioVolume + 1) & 0x0F
             else:
-                self.audio2Volume = (self.audio2Volume + 2) & 0x0F
+                self.audioVolume = (self.audioVolume + 2) & 0x0F
 
     def setAudioFrequency(self, data):
         self.audioFrequency = data
@@ -211,7 +195,7 @@
             self.outputEnable |= 0x02
             if ((self.audioPlayback & 0x40) != 0 and self.audio2Length == 0):
                 self.audio2Length = (constants.SOUND_CLOCK / 256) * (64 - (self.audioLength & 0x3F))
-            self.audio2Volume = self.audioEnvelope >> 4
+            self.audioVolume = self.audioEnvelope >> 4
             self.audio2EnvelopeLength = (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
     
     def updateAudio(self):
@@ -224,10 +208,10 @@
 
             if (self.audio2EnvelopeLength <= 0):
                 if ((self.audioEnvelope & 0x08) != 0):
-                    if (self.audio2Volume < 15):
-                        self.audio2Volume+=1
-                elif (self.audio2Volume > 0):
-                    self.audio2Volume-=1
+                    if (self.audioVolume < 15):
+                        self.audioVolume+=1
+                elif (self.audioVolume > 0):
+                    self.audioVolume-=1
                 self.audio2EnvelopeLength += (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
         
     def mixAudio(self, buffer, length):
@@ -243,14 +227,14 @@
             self.audio2Index += self.audio2Frequency
             if ((self.audio2Index & (0x1F << 22)) >= wavePattern):
                 if ((self.outputTerminal & 0x20) != 0):
-                    buffer[index + 0] -= self.audio2Volume
+                    buffer[index + 0] -= self.audioVolume
                 if ((self.outputTerminal & 0x02) != 0):
-                    buffer[index + 1] -= self.audio2Volume
+                    buffer[index + 1] -= self.audioVolume
             else:
                 if ((self.outputTerminal & 0x20) != 0):
-                    buffer[index + 0] += self.audio2Volume
+                    buffer[index + 0] += self.audioVolume
                 if ((self.outputTerminal & 0x02) != 0):
-                    buffer[index + 1] += self.audio2Volume
+                    buffer[index + 1] += self.audioVolume
 
 
 
@@ -260,10 +244,7 @@
 class Channel3(Channel):  
         # Audio Channel 3 int
     audioEnable=0
-    audioLength=0
     audioLevel=0
-    audioFrequency=0
-    audioPlayback=0
     audio3Index=0
     audio3Length=0
     audio3Frequency=0
@@ -274,9 +255,6 @@
     def getAudioEnable(self):
         return self.audioEnable
 
-    def getAudioLength(self):
-        return self.audioLength
-
     def getAudioLevel(self):
         return self.audioLevel
     
@@ -284,9 +262,6 @@
     def getAudio4Frequency(self):
         return self.audioFrequency
 
-    def getAudioPlayback(self):
-        return self.audioPlayback
-
     def setAudioEnable(self, data):
         self.audioEnable = data & 0x80
         if ((self.audioEnable & 0x80) == 0):
@@ -331,7 +306,6 @@
             wavePattern = 0
         elif (self.audioLevel & 0x60) == 0x80:
             wavePattern = 1
-
         for index in range(0, length, 2):
             self.audio3Index += self.audio3Frequency
             sample = self.audio3WavePattern[(self.audio3Index >> 23) & 0x0F]
@@ -342,23 +316,20 @@
 
             sample = ((sample - 8) << 1) >> level
 
-            if ((self.outputTerminal & 0x40) != 0):
+            if (self.outputTerminal & 0x40) != 0:
                 buffer[index + 0] += sample
-            if ((self.outputTerminal & 0x04) != 0):
+            if (self.outputTerminal & 0x04) != 0:
                 buffer[index + 1] += sample
     
     
     
-    
 class NoiseGenerator(Channel):
         # Audio Channel 4 int
     audioLength=0
-    audioEnvelope=0
     audioPolynomial=0
-    audioPlayback=0
     audio4Index=0
     audio4Length=0
-    audio4Volume=0
+    audioVolume=0
     audio4EnvelopeLength=0
     audio4Frequency=0
     
@@ -375,8 +346,8 @@
         sampleRate = self.driver.getSampleRate()
          # frequency = (4194304 / 32) / (2048 - period) Hz
         for period in range(0, 2048):
-            skip = (((constants.GAMEBOY_CLOCK << 10) / sampleRate) << (22 - 8)) / (2048 - period)
-            if (skip >= (32 << 22)):
+            skip = (((constants.GAMEBOY_CLOCK << 10) / sampleRate) << 16) / (2048 - period)
+            if skip >= (32 << 22):
                 self.frequencyTable[period] = 0
             else:
                 self.frequencyTable[period] = skip
@@ -396,14 +367,14 @@
         #  7 steps
         for  index in range(0, 0x7F):
             polynomial = (((polynomial << 6) ^ (polynomial << 5)) & 0x40) | (polynomial >> 1)
-            if ((index & 31) == 0):
+            if (index & 31) == 0:
                 self.noiseStep7Table[index >> 5] = 0
             self.noiseStep7Table[index >> 5] |= (polynomial & 1) << (index & 31)
         #  15 steps&
         polynomial = 0x7FFF
         for index in range(0, 0x7FFF):
             polynomial = (((polynomial << 14) ^ (polynomial << 13)) & 0x4000) | (polynomial >> 1)
-            if ((index & 31) == 0):
+            if (index & 31) == 0:
                 self.noiseStep15Table[index >> 5] = 0
             self.noiseStep15Table[index >> 5] |= (polynomial & 1) << (index & 31)
     
@@ -411,9 +382,6 @@
     def getAudioLength(self):
         return self.audioLength
 
-    def getAudioEnvelope(self):
-        return self.audioEnvelope
-
     def getAudioPolynomial(self):
         return self.audioPolynomial
 
@@ -426,51 +394,51 @@
 
     def setAudioEnvelope(self, data):
         self.audioEnvelope = data
-        if ((self.audioPlayback & 0x40) == 0):
-            if ((self.audioEnvelope >> 4) == 0):
-                self.audio4Volume = 0
-            elif (self.audio4EnvelopeLength == 0 and (self.audioEnvelope & 0x07) == 0):
-                self.audio4Volume = (self.audio4Volume + 1) & 0x0F
+        if (self.audioPlayback & 0x40) == 0:
+            if (self.audioEnvelope >> 4) == 0:
+                self.audioVolume = 0
+            elif self.audio4EnvelopeLength == 0 and (self.audioEnvelope & 0x07) == 0:
+                self.audioVolume = (self.audioVolume + 1) & 0x0F
             else:
-                self.audio4Volume = (self.audio4Volume + 2) & 0x0F
+                self.audioVolume = (self.audioVolume + 2) & 0x0F
 
     def setAudioPolynomial(self, data):
         self.audioPolynomial = data
-        if ((self.audioPolynomial >> 4) <= 12):
+        if (self.audioPolynomial >> 4) <= 12:
             self.audio4Frequency = self.noiseFreqRatioTable[self.audioPolynomial & 0x07] >> ((self.audioPolynomial >> 4) + 1)
         else:
             self.audio4Frequency = 0
 
     def setAudioPlayback(self, data):
         self.audioPlayback = data
-        if ((self.audioPlayback & 0x80) != 0):
+        if (self.audioPlayback & 0x80) != 0:
             self.outputEnable |= 0x08
-            if ((self.audioPlayback & 0x40) != 0 and self.audio4Length == 0):
+            if (self.audioPlayback & 0x40) != 0 and self.audio4Length == 0:
                 self.audio4Length = (constants.SOUND_CLOCK / 256) * (64 - (self.audioLength & 0x3F))
-            self.audio4Volume = self.audioEnvelope >> 4
+            self.audioVolume = self.audioEnvelope >> 4
             self.audio4EnvelopeLength = (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
             self.audio4Index = 0
 
     def updateAudio(self):
-        if ((self.audioPlayback & 0x40) != 0 and self.audio4Length > 0):
+        if (self.audioPlayback & 0x40) != 0 and self.audio4Length > 0:
             self.audio4Length-=1
-            if (self.audio4Length <= 0):
+            if self.audio4Length <= 0:
                 self.outputEnable &= ~0x08
-        if (self.audio4EnvelopeLength > 0):
+        if self.audio4EnvelopeLength > 0:
             self.audio4EnvelopeLength-=1
-            if (self.audio4EnvelopeLength <= 0):
-                if ((self.audioEnvelope & 0x08) != 0):
-                    if (self.audio4Volume < 15):
-                        self.audio4Volume+=1
-                elif (self.audio4Volume > 0):
-                    self.audio4Volume-=1
+            if self.audio4EnvelopeLength <= 0:
+                if (self.audioEnvelope & 0x08) != 0:
+                    if self.audioVolume < 15:
+                        self.audioVolume+=1
+                elif self.audioVolume > 0:
+                    self.audioVolume-=1
                 self.audio4EnvelopeLength += (constants.SOUND_CLOCK / 64) * (self.audioEnvelope & 0x07)
     
     def mixAudio(self, buffer, length):
         for index in range(0, length, 2):
             self.audio4Index += self.audio4Frequency
             polynomial
-            if ((self.audioPolynomial & 0x08) != 0):
+            if (self.audioPolynomial & 0x08) != 0:
                 #  7 steps
                 self.audio4Index &= 0x7FFFFF
                 polynomial = self.noiseStep7Table[self.audio4Index >> 21] >> ((self.audio4Index >> 16) & 31)
@@ -478,16 +446,16 @@
                 #  15 steps
                 self.audio4Index &= 0x7FFFFFFF
                 polynomial = self.noiseStep15Table[self.audio4Index >> 21] >> ((self.audio4Index >> 16) & 31)
-            if ((polynomial & 1) != 0):
-                if ((self.outputTerminal & 0x80) != 0):
-                    buffer[index + 0] -= self.audio4Volume
-                if ((self.outputTerminal & 0x08) != 0):
-                    buffer[index + 1] -= self.audio4Volume
+            if (polynomial & 1) != 0:
+                if (self.outputTerminal & 0x80) != 0:
+                    buffer[index + 0] -= self.audioVolume
+                if (self.outputTerminal & 0x08) != 0:
+                    buffer[index + 1] -= self.audioVolume
             else:
-                if ((self.outputTerminal & 0x80) != 0):
-                    buffer[index + 0] += self.audio4Volume
-                if ((self.outputTerminal & 0x08) != 0):
-                    buffer[index + 1] += self.audio4Volume
+                if (self.outputTerminal & 0x80) != 0:
+                    buffer[index + 0] += self.audioVolume
+                if (self.outputTerminal & 0x08) != 0:
+                    buffer[index + 1] += self.audioVolume
 
     
     

Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py	(original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py	Mon Apr 28 16:02:50 2008
@@ -102,7 +102,7 @@
         
 # CLOCK DRIVER -----------------------------------------------------------------
 
-class ClockDriver(object):
+class Clock(object):
     
     def __init__(self):
         pass

Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py	(original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py	Mon Apr 28 16:02:50 2008
@@ -202,16 +202,17 @@
 
     def setLYCompare(self, data):
         self.lineYCompare = data
-        if ((self.control & 0x80) != 0):
-            if (self.lineY == self.lineYCompare):
-                # NOTE: raise interrupt once per line (Prehistorik Man, The Jetsons, Muhammad Ali)
-                if ((self.stat & 0x04) == 0):
-                    # constants.LYC=LY interrupt
-                    self.stat |= 0x04
-                    if ((self.stat & 0x40) != 0):
-                        self.interrupt.raiseInterrupt(constants.LCD)
-            else:
-                self.stat &= 0xFB
+        if (self.control & 0x80) == 0:
+            return
+        if (self.lineY == self.lineYCompare):
+            # NOTE: raise interrupt once per line
+            if (self.stat & 0x04) == 0:
+                # constants.LYC=LY interrupt
+                self.stat |= 0x04
+#                if (self.stat & 0x40) != 0:
+                self.interrupt.raiseInterrupt(constants.LCD)
+        else:
+            self.stat &= 0xFB
                 
     def getDMA(self):
         return self.dma
@@ -279,70 +280,88 @@
 
     def emulateHBlank(self):
         self.lineY+=1
-        if (self.lineY == self.lineYCompare):
+        self.emulateHBlankLineYCompare()
+        if self.lineY < 144:
+            self.emulateHBlankPart1()
+        else:
+            self.emulateHBlankPart2()
+            
+    def emulateHBlankLineYCompare(self):
+        if self.lineY == self.lineYCompare:
             # constants.LYC=LY interrupt
             self.stat |= 0x04
-            if ((self.stat & 0x40) != 0):
+            if (self.stat & 0x40) != 0:
                 self.interrupt.raiseInterrupt(constants.LCD)
         else:
             self.stat &= 0xFB
             
-        if (self.lineY < 144):
-            self.stat = (self.stat & 0xFC) | 0x02
-            self.cycles += constants.MODE_2_TICKS
-            # constants.OAM interrupt
-            if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
-                self.interrupt.raiseInterrupt(constants.LCD)
+    def emulateHBlankPart1(self):
+        self.stat = (self.stat & 0xFC) | 0x02
+        self.cycles += constants.MODE_2_TICKS
+        # constants.OAM interrupt
+        if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
+            self.interrupt.raiseInterrupt(constants.LCD)
+        
+    def emulateHBlankPart2(self):
+        if self.display:
+            self.drawFrame()
+        self.frames += 1
+        if self.frames >= self.frameSkip:
+            self.display = True
+            self.frames = 0
         else:
-            if (self.display):
-                self.drawFrame()
-            self.frames += 1
-            if (self.frames >= self.frameSkip):
-                self.display = True
-                self.frames = 0
-            else:
-                self.display = False
-
-            self.stat = (self.stat & 0xFC) | 0x01
-            self.cycles += constants.MODE_1_BEGIN_TICKS
-            self.vblank = True
+            self.display = False
 
+        self.stat = (self.stat & 0xFC) | 0x01
+        self.cycles += constants.MODE_1_BEGIN_TICKS
+        self.vblank = True
+        
+        
     def emulateVBlank(self):
-        if (self.vblank):
-            self.vblank = False
+        if self.vblank:
+            self.emulateVBlankVBlank()
+        elif self.lineY == 0:
+            self.emulateVBlankFirstYLine()
+        else:
+            self.emulateVBlankOther()
+
+    def emulateVBlankVBlank(self):
+        self.vblank = False
+        self.stat = (self.stat & 0xFC) | 0x01
+        self.cycles += constants.MODE_1_TICKS - constants.MODE_1_BEGIN_TICKS
+        # V-Blank interrupt
+        if ((self.stat & 0x10) != 0):
+            self.interrupt.raiseInterrupt(constants.LCD)
+        # V-Blank interrupt
+        self.interrupt.raiseInterrupt(constants.VBLANK)
+        
+    def emulateVBlankFirstYLine(self):
+        self.stat = (self.stat & 0xFC) | 0x02
+        self.cycles += constants.MODE_2_TICKS
+        # constants.OAM interrupt
+        if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
+            self.interrupt.raiseInterrupt(constants.LCD)
+            
+    def emulateVBlankOther(self):
+        if (self.lineY < 153):
+            self.lineY+=1
             self.stat = (self.stat & 0xFC) | 0x01
-            self.cycles += constants.MODE_1_TICKS - constants.MODE_1_BEGIN_TICKS
-            # V-Blank interrupt
-            if ((self.stat & 0x10) != 0):
-                self.interrupt.raiseInterrupt(constants.LCD)
-            # V-Blank interrupt
-            self.interrupt.raiseInterrupt(constants.VBLANK)
-        elif (self.lineY == 0):
-            self.stat = (self.stat & 0xFC) | 0x02
-            self.cycles += constants.MODE_2_TICKS
-            # constants.OAM interrupt
-            if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
+            if (self.lineY == 153):
+                self.cycles += constants.MODE_1_END_TICKS
+            else:
+                self.cycles += constants.MODE_1_TICKS
+        else:
+            self.lineY = self.wlineY = 0
+            self.stat = (self.stat & 0xFC) | 0x01
+            self.cycles += constants.MODE_1_TICKS - constants.MODE_1_END_TICKS
+        if (self.lineY == self.lineYCompare):
+            # constants.LYC=LY interrupt
+            self.stat |= 0x04
+            if ((self.stat & 0x40) != 0):
                 self.interrupt.raiseInterrupt(constants.LCD)
         else:
-            if (self.lineY < 153):
-                self.lineY+=1
-                self.stat = (self.stat & 0xFC) | 0x01
-                if (self.lineY == 153):
-                    self.cycles += constants.MODE_1_END_TICKS
-                else:
-                    self.cycles += constants.MODE_1_TICKS
-            else:
-                self.lineY = self.wlineY = 0
-                self.stat = (self.stat & 0xFC) | 0x01
-                self.cycles += constants.MODE_1_TICKS - constants.MODE_1_END_TICKS
-            if (self.lineY == self.lineYCompare):
-                # constants.LYC=LY interrupt
-                self.stat |= 0x04
-                if ((self.stat & 0x40) != 0):
-                    self.interrupt.raiseInterrupt(constants.LCD)
-            else:
-                self.stat &= 0xFB
-
+            self.stat &= 0xFB
+    
     def drawFrame(self):
         self.driver.updateDisplay()
 
@@ -351,13 +370,13 @@
         self.driver.updateDisplay()
 
     def drawLine(self):
-        if ((self.control & 0x01) != 0):
+        if (self.control & 0x01) != 0:
             self.drawBackground()
         else:
             self.drawCleanBackground()
-        if ((self.control & 0x20) != 0):
+        if (self.control & 0x20) != 0:
             self.drawWindow()
-        if ((self.control & 0x02) != 0):
+        if (self.control & 0x02) != 0:
             self.drawObjects()
         self.drawPixels()
 
@@ -374,22 +393,23 @@
         tileData = constants.VRAM_DATA_B
         if (self.control & 0x10) != 0:
             tileData = constants.VRAM_DATA_A
-        tileMap += ((y >> 3) << 5) + (x >> 3)
+        tileMap  += ((y >> 3) << 5) + (x >> 3)
         tileData += (y & 7) << 1
         self.drawTiles(8 - (x & 7), tileMap, tileData)
 
     def drawWindow(self):
-        if (self.lineY >= self.windowY and self.windowX < 167 and self.wlineY < 144):
-            tileMap = constants.VRAM_MAP_A
-            if (self.control & 0x40) != 0:
-                tileMap =  constants.VRAM_MAP_B
-            tileData = constants.VRAM_DATA_B
-            if (self.control & 0x10) != 0:
-                tileData = constants.VRAM_DATA_A
-            tileMap += (self.wlineY >> 3) << 5
-            tileData += (self.wlineY & 7) << 1
-            self.drawTiles(self.windowX + 1, tileMap, tileData)
-            self.wlineY+=1
+        if (self.lineY < self.windowY or self.windowX >= 167 or self.wlineY >= 144):
+            return
+        tileMap = constants.VRAM_MAP_A
+        if (self.control & 0x40) != 0:
+            tileMap =  constants.VRAM_MAP_B
+        tileData = constants.VRAM_DATA_B
+        if (self.control & 0x10) != 0:
+            tileData = constants.VRAM_DATA_A
+        tileMap += (self.wlineY >> 3) << 5
+        tileData += (self.wlineY & 7) << 1
+        self.drawTiles(self.windowX + 1, tileMap, tileData)
+        self.wlineY+=1
 
     def drawObjects(self):
         count = self.scanObjects()
@@ -445,9 +465,9 @@
         for index in range(0, count):
             rightmost = index
             for number in range(index+1, count):
-                if ((self.objects[number] >> 20) > (self.objects[rightmost] >> 20)):
+                if (self.objects[number] >> 20) > (self.objects[rightmost] >> 20):
                     rightmost = number
-            if (rightmost != index):
+            if rightmost != index:
                 data = self.objects[index]
                 self.objects[index] = self.objects[rightmost]
                 self.objects[rightmost] = data
@@ -461,79 +481,62 @@
             self.drawTile(x, tileData + (tile << 4))
             tileMap = (tileMap & 0x1FE0) + ((tileMap + 1) & 0x001F)
             x += 8
-
-    def drawTile(self, x, address):
-        pattern = (self.vram[address] & 0xFF) + ((self.vram[address + 1] & 0xFF) << 8)
-        for i in range(0, 8):
-            self.line[x + i] = (pattern >> (7-i)) & 0x0101
-
-    def drawObjectTile(self, x, address, flags):
-        pattern = (self.vram[address] & 0xFF) + ((self.vram[address + 1] & 0xFF) << 8)
-        mask = 0
+            
+    def getPattern(self, address):
+        pattern = self.vram[address]      & 0xFF
+        pattern +=(self.vram[address + 1] & 0xFF) << 8
+        return pattern
+
+    def drawObject(self, setter):
+        pattern = self.getPattern(address)
+        self.mask = 0
         # priority
         if (flags & 0x80) != 0:
-            mask |= 0x0008
+            self.mask |= 0x0008
         # palette
         if (flags & 0x10) != 0:
-            mask |= 0x0004
-        # X flip
+            self.mask |= 0x0004
         if (flags & 0x20) != 0:
-            self.drawObjectTileXFlipped(x, pattern, mask)
+            self.drawObjectNormal(x, pattern, mask, setter)
         else:
-            self.drawObjectTileNormal(x, pattern, mask)
-                    
-    def drawObjectTileNormal(self, x, pattern, mask):
-            for i in range(0, 7):
-                color = (pattern >> (6-i))
-                if ((color & 0x0202) != 0):
-                    self.line[x + i] |= color | mask
-            color = (pattern << 1)
-            if ((color & 0x0202) != 0):
-                self.line[x + 7] |= color | mask
+            self.drawObjectFlipped(x, pattern, mask, setter)
             
-    def drawObjectTileXFlipped(self, x, pattern, mask):
-            color = (pattern << 1)
-            if ((color & 0x0202) != 0):
-                self.line[x + 0] |= color | mask
-            for i in range(0, 7):
-                color = (pattern >> i)
-                if ((color & 0x0202) != 0):
-                    self.line[x + i + 1] |= color | mask
+    def drawObjectNormal(self, x, pattern, mask, setter):
+        for i in range(0, 7):
+            color = pattern >> (6-i)
+            if (color & 0x0202) != 0:
+                setter(self, x+1, color, mask)
+        color = pattern << 1
+        if (color & 0x0202) != 0:
+            setter(self, x+7, color,  mask)
+        
+    def drawObjectFlipped(self, x, pattern, mask, setter):
+        color = pattern << 1
+        if (color & 0x0202) != 0:
+            setter(self, x, color | mask)
+        for i in range(0, 7):
+            color = pattern >> i
+            if (color & 0x0202) != 0:
+                setter(self, x + i + 1, color | mask)
+            
+    def drawTile(self, x, address):
+        pattern =  self.getPattern(address)
+        for i in range(0, 8):
+            self.line[x + i] = (pattern >> (7-i)) & 0x0101
 
+    def drawObjectTile(self, x, address, flags):
+        pattern = self.getPattern(address)
+        self.drawObject(self.setTileLine)
+        
+    def setTileLine(self, pos, color, mask):
+        self.line[pos] |= color | mask
 
     def drawOverlappedObjectTile(self, x, address, flags):
-        pattern = (self.vram[address] & 0xFF) + ((self.vram[address + 1] & 0xFF) << 8)
-        mask = 0
-        # priority
-        if ((flags & 0x80) != 0):
-            mask |= 0x0008
-        # palette
-        if ((flags & 0x10) != 0):
-            mask |= 0x0004
-        # X flip
-        if ((flags & 0x20) != 0):
-            self.drawOverlappedObjectTileXFlipped(x, pattern, mask)
-        else:
-            self.drawOverlappedObjectTileNormal(x, pattern, mask)
+        self.drawObject(self.setOverlappedObjectLine)
+        
+    def setOverlappedObjectLine(self, pos, color, mask):
+        self.line[pos] = (self.line[pos] & 0x0101) | color | mask
             
-    def drawOverlappedObjectTileNormal(self, x, pattern, mask):
-            for i in range(0,7):
-                color = (pattern >> (6-i))
-                if ((color & 0x0202) != 0):
-                    self.line[x + i] = (self.line[x + i] & 0x0101) | color | mask
-            color = (pattern << 1)
-            if ((color & 0x0202) != 0):
-                self.line[x + 7] = (self.line[x + 7] & 0x0101) | color | mask
-                
-    def drawOverlappedObjectTileXFlipped(self, x, pattern, mask):
-            color = (pattern << 1)
-            if ((color & 0x0202) != 0):
-                self.line[x + 0] = (self.line[x + 0] & 0x0101) | color | mask
-            #TODO maybe a bug in the java implementetation [0,1,2,3,4,6,5]
-            for i in range(0,7):
-                color = (pattern >> i)
-                if ((color & 0x0202) != 0):
-                    self.line[x + i + 1] = (self.line[x + i +1] & 0x0101) | color | mask
 
     def drawPixels(self):
         self.updatePalette()
@@ -546,9 +549,7 @@
             offset += 4
 
     def clearPixels(self):
-        pixels = self.driver.getPixels()
-        for offset in range(0, len(pixels)):
-            pixels[offset] = constants.COLOR_MAP[0]
+        self.driver.clearPixels()
 
     def updatePalette(self):
         if not self.dirty:
@@ -576,8 +577,11 @@
     def __init__(self, width, height):
         self.width = width
         self.height = height
-        self.pixels = [0]*width*height
+        self.clearPixels()
         
+    def clearPixels():
+        self.pixels = [0] * self.width * self.height
+            
     def getWidth(self):
         return self.width
     



More information about the Pypy-commit mailing list