Changed calls to the sound object so that the current CPU cycle is

passed when a TIA register is modified.  Also added code to stop a frame
once it reaches the maximum number of scanlines for the current TV
mode (i.e., PAL or NTSC).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@257 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
bwmott 2004-06-13 04:53:04 +00:00
parent 6af61c8b79
commit f7d5d44594
2 changed files with 25 additions and 16 deletions

View File

@ -8,12 +8,12 @@
// SS SS tt ee ll ll aa aa // SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa // SSSS ttt eeeee llll llll aaaaa
// //
// Copyright (c) 1995-2002 by Bradford W. Mott // Copyright (c) 1995-2004 by Bradford W. Mott
// //
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TIA.cxx,v 1.32 2004-04-27 00:50:51 stephena Exp $ // $Id: TIA.cxx,v 1.33 2004-06-13 04:53:04 bwmott Exp $
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
@ -41,7 +41,8 @@ TIA::TIA(const Console& console, Sound& sound)
myCOLUBK(myColor[0]), myCOLUBK(myColor[0]),
myCOLUPF(myColor[1]), myCOLUPF(myColor[1]),
myCOLUP0(myColor[2]), myCOLUP0(myColor[2]),
myCOLUP1(myColor[3]) myCOLUP1(myColor[3]),
myMaximumNumberOfScanlines(262)
{ {
// Allocate buffers for two frame buffers // Allocate buffers for two frame buffers
myCurrentFrameBuffer = new uInt8[160 * 300]; myCurrentFrameBuffer = new uInt8[160 * 300];
@ -222,10 +223,12 @@ void TIA::reset()
if(myConsole.properties().get("Display.Format") == "PAL") if(myConsole.properties().get("Display.Format") == "PAL")
{ {
myColorLossEnabled = true; myColorLossEnabled = true;
myMaximumNumberOfScanlines = 342;
} }
else else
{ {
myColorLossEnabled = false; myColorLossEnabled = false;
myMaximumNumberOfScanlines = 290;
} }
} }
@ -236,7 +239,7 @@ void TIA::systemCyclesReset()
uInt32 cycles = mySystem->cycles(); uInt32 cycles = mySystem->cycles();
// Adjust the sound cycle indicator // Adjust the sound cycle indicator
mySound.setCycles(-cycles); mySound.adjustCycleCounter(-cycles);
// Adjust the dump cycle // Adjust the dump cycle
myDumpDisabledCycle -= cycles; myDumpDisabledCycle -= cycles;
@ -1632,9 +1635,6 @@ inline void TIA::updateFrameScanline(uInt32 clocksToUpdate, uInt32 hpos)
} }
} }
myFramePointer = ending; myFramePointer = ending;
// Add sound bytes to the sound queue every scanline
mySound.update();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -1963,6 +1963,12 @@ void TIA::poke(uInt16 addr, uInt8 value)
// Update frame to current CPU cycle before we make any changes! // Update frame to current CPU cycle before we make any changes!
updateFrame(clock + delay); updateFrame(clock + delay);
// If a VSYNC hasn't been generated in time go ahead and end the frame
if(((clock - myClockWhenFrameStarted) / 228) > myMaximumNumberOfScanlines)
{
mySystem->m6502().stop();
}
switch(addr) switch(addr)
{ {
case 0x00: // Vertical sync set-clear case 0x00: // Vertical sync set-clear
@ -2341,37 +2347,37 @@ void TIA::poke(uInt16 addr, uInt8 value)
case 0x15: // Audio control 0 case 0x15: // Audio control 0
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }
case 0x16: // Audio control 1 case 0x16: // Audio control 1
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }
case 0x17: // Audio frequency 0 case 0x17: // Audio frequency 0
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }
case 0x18: // Audio frequency 1 case 0x18: // Audio frequency 1
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }
case 0x19: // Audio volume 0 case 0x19: // Audio volume 0
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }
case 0x1A: // Audio volume 1 case 0x1A: // Audio volume 1
{ {
mySound.set(addr, value); mySound.set(addr, value, mySystem->cycles());
break; break;
} }

View File

@ -8,12 +8,12 @@
// SS SS tt ee ll ll aa aa // SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa // SSSS ttt eeeee llll llll aaaaa
// //
// Copyright (c) 1995-2002 by Bradford W. Mott // Copyright (c) 1995-2004 by Bradford W. Mott
// //
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TIA.hxx,v 1.13 2004-04-26 17:27:31 stephena Exp $ // $Id: TIA.hxx,v 1.14 2004-06-13 04:53:04 bwmott Exp $
//============================================================================ //============================================================================
#ifndef TIA_HXX #ifndef TIA_HXX
@ -43,7 +43,7 @@ class Deserializer;
be displayed on screen. be displayed on screen.
@author Bradford W. Mott @author Bradford W. Mott
@version $Id: TIA.hxx,v 1.13 2004-04-26 17:27:31 stephena Exp $ @version $Id: TIA.hxx,v 1.14 2004-06-13 04:53:04 bwmott Exp $
*/ */
class TIA : public Device , public MediaSource class TIA : public Device , public MediaSource
{ {
@ -266,6 +266,9 @@ class TIA : public Device , public MediaSource
// Indicates the total number of scanlines generated by the last frame // Indicates the total number of scanlines generated by the last frame
Int32 myScanlineCountForLastFrame; Int32 myScanlineCountForLastFrame;
// Indicates the maximum number of scanlines to be generated for a frame
Int32 myMaximumNumberOfScanlines;
private: private:
// Color clock when VSYNC ending causes a new frame to be started // Color clock when VSYNC ending causes a new frame to be started
Int32 myVSYNCFinishClock; Int32 myVSYNCFinishClock;