[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