mirror of https://github.com/stella-emu/stella.git
Implemented TIA::scanlines(), which now shows the proper scanline count in
the info window in the upper-left of the screen. Still TODO is tie it to the framerate, so that when the scanline count changes, it also auto-calculates the framerate. Some formatting cleanups in various classes.
This commit is contained in:
parent
a8a4545222
commit
b34514e7f4
|
@ -543,7 +543,6 @@ void Console::changeHeight(int direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
AbstractTIA* Console::createTIA()
|
AbstractTIA* Console::createTIA()
|
||||||
{
|
{
|
||||||
string coreType = "default";
|
string coreType = "default";
|
||||||
|
@ -568,6 +567,7 @@ AbstractTIA* Console::createTIA()
|
||||||
throw new runtime_error(buffer.str());
|
throw new runtime_error(buffer.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Console::setTIAProperties()
|
void Console::setTIAProperties()
|
||||||
{
|
{
|
||||||
// TODO - query these values directly from the TIA if value is 'AUTO'
|
// TODO - query these values directly from the TIA if value is 'AUTO'
|
||||||
|
|
|
@ -61,7 +61,7 @@ void FrameManager::setHandlers(
|
||||||
void FrameManager::reset()
|
void FrameManager::reset()
|
||||||
{
|
{
|
||||||
myState = State::waitForVsyncStart;
|
myState = State::waitForVsyncStart;
|
||||||
myCurrentFrameTotalLines = 0;
|
myCurrentFrameTotalLines = myCurrentFrameFinalLines = 0;
|
||||||
myLineInState = 0;
|
myLineInState = 0;
|
||||||
myLinesWithoutVsync = 0;
|
myLinesWithoutVsync = 0;
|
||||||
myWaitForVsync = true;
|
myWaitForVsync = true;
|
||||||
|
@ -182,6 +182,12 @@ uInt32 FrameManager::currentLine() const
|
||||||
return myState == State::frame ? myLineInState : 0;
|
return myState == State::frame ? myLineInState : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
uInt32 FrameManager::scanlines() const
|
||||||
|
{
|
||||||
|
return myState == State::frame ? myLineInState : myCurrentFrameFinalLines;
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void FrameManager::setTvMode(TvMode mode)
|
void FrameManager::setTvMode(TvMode mode)
|
||||||
{
|
{
|
||||||
|
@ -237,6 +243,7 @@ void FrameManager::finalizeFrame()
|
||||||
myOnFrameComplete();
|
myOnFrameComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myCurrentFrameFinalLines = myCurrentFrameTotalLines;
|
||||||
myCurrentFrameTotalLines = 0;
|
myCurrentFrameTotalLines = 0;
|
||||||
setState(State::overscan);
|
setState(State::overscan);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@ class FrameManager : public Serializable
|
||||||
|
|
||||||
uInt32 currentLine() const;
|
uInt32 currentLine() const;
|
||||||
|
|
||||||
|
uInt32 scanlines() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Serializable methods (see that class for more information).
|
Serializable methods (see that class for more information).
|
||||||
*/
|
*/
|
||||||
|
@ -95,6 +97,7 @@ class FrameManager : public Serializable
|
||||||
uInt32 myLineInState;
|
uInt32 myLineInState;
|
||||||
uInt32 myLinesWithoutVsync;
|
uInt32 myLinesWithoutVsync;
|
||||||
uInt32 myCurrentFrameTotalLines;
|
uInt32 myCurrentFrameTotalLines;
|
||||||
|
uInt32 myCurrentFrameFinalLines;
|
||||||
|
|
||||||
bool myVsync;
|
bool myVsync;
|
||||||
bool myVblank;
|
bool myVblank;
|
||||||
|
|
|
@ -100,10 +100,10 @@ void PaddleReader::update(double value, double timestamp, TvMode tvMode)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PaddleReader::setTvMode(TvMode mode)
|
void PaddleReader::setTvMode(TvMode mode)
|
||||||
{
|
{
|
||||||
myTvMode = mode;
|
myTvMode = mode;
|
||||||
|
|
||||||
myClockFreq = myTvMode == TvMode::ntsc ? 60 * 228 * 262 : 50 * 228 * 312;
|
myClockFreq = myTvMode == TvMode::ntsc ? 60 * 228 * 262 : 50 * 228 * 312;
|
||||||
myUThresh = USUPP * (1. - exp(-TRIPPOINT_LINES * 228 / myClockFreq / (RPOT + R0) / C));
|
myUThresh = USUPP * (1. - exp(-TRIPPOINT_LINES * 228 / myClockFreq / (RPOT + R0) / C));
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -117,4 +117,4 @@ void PaddleReader::updateCharge(double timestamp)
|
||||||
myTimestamp = timestamp;
|
myTimestamp = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace TIA6502tsCore
|
} // namespace TIA6502tsCore
|
||||||
|
|
|
@ -24,12 +24,12 @@
|
||||||
#include "Types.hxx"
|
#include "Types.hxx"
|
||||||
|
|
||||||
enum CollisionMask: uInt32 {
|
enum CollisionMask: uInt32 {
|
||||||
player0 = 0b0111110000000000,
|
player0 = 0b0111110000000000,
|
||||||
player1 = 0b0100001111000000,
|
player1 = 0b0100001111000000,
|
||||||
missile0 = 0b0010001000111000,
|
missile0 = 0b0010001000111000,
|
||||||
missile1 = 0b0001000100100110,
|
missile1 = 0b0001000100100110,
|
||||||
ball = 0b0000100010010101,
|
ball = 0b0000100010010101,
|
||||||
playfield = 0b0000010001001011
|
playfield = 0b0000010001001011
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Delay: uInt8 {
|
enum Delay: uInt8 {
|
||||||
|
@ -119,6 +119,16 @@ void TIA::reset()
|
||||||
mySound.reset();
|
mySound.reset();
|
||||||
myDelayQueue.reset();
|
myDelayQueue.reset();
|
||||||
myFrameManager.reset();
|
myFrameManager.reset();
|
||||||
|
frameReset(); // Recalculate the size of the display
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TIA::frameReset()
|
||||||
|
{
|
||||||
|
// Clear frame buffers
|
||||||
|
clearBuffers();
|
||||||
|
|
||||||
|
// TODO - make use of ystart and height
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -151,6 +161,13 @@ void TIA::installDelegate(System& system, Device& device)
|
||||||
mySystem->setPageAccess(i >> System::PAGE_SHIFT, access);
|
mySystem->setPageAccess(i >> System::PAGE_SHIFT, access);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TIA::clearBuffers()
|
||||||
|
{
|
||||||
|
memset(myCurrentFrameBuffer.get(), 0, 160 * 320);
|
||||||
|
memset(myPreviousFrameBuffer.get(), 0, 160 * 320);
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool TIA::save(Serializer& out) const
|
bool TIA::save(Serializer& out) const
|
||||||
{
|
{
|
||||||
|
@ -531,12 +548,6 @@ bool TIA::poke(uInt16 address, uInt8 value)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
// TODO: stub
|
|
||||||
void TIA::frameReset()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// TODO: stub
|
// TODO: stub
|
||||||
bool TIA::saveDisplay(Serializer& out) const
|
bool TIA::saveDisplay(Serializer& out) const
|
||||||
|
@ -558,26 +569,14 @@ void TIA::update()
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// TODO: add yoffset
|
// TODO: stub
|
||||||
uInt8* TIA::currentFrameBuffer() const
|
|
||||||
{
|
|
||||||
return myCurrentFrameBuffer.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
// TODO: add yoffset
|
|
||||||
uInt8* TIA::previousFrameBuffer() const
|
|
||||||
{
|
|
||||||
return myPreviousFrameBuffer.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt32 TIA::height() const
|
uInt32 TIA::height() const
|
||||||
{
|
{
|
||||||
return myFrameManager.height();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
// TODO: stub
|
||||||
uInt32 TIA::ystart() const
|
uInt32 TIA::ystart() const
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -621,14 +620,12 @@ uInt32 TIA::clocksThisLine() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// TODO: stub
|
|
||||||
uInt32 TIA::scanlines() const
|
uInt32 TIA::scanlines() const
|
||||||
{
|
{
|
||||||
return 0;
|
return myFrameManager.scanlines();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// TODO: stub
|
|
||||||
bool TIA::partialFrame() const
|
bool TIA::partialFrame() const
|
||||||
{
|
{
|
||||||
return myFrameManager.isRendering();
|
return myFrameManager.isRendering();
|
||||||
|
@ -858,9 +855,11 @@ void TIA::tickHframe()
|
||||||
|
|
||||||
tickSprites();
|
tickSprites();
|
||||||
|
|
||||||
if (myFrameManager.isRendering()) renderPixel(x, y, lineNotCached);
|
if (myFrameManager.isRendering())
|
||||||
|
renderPixel(x, y, lineNotCached);
|
||||||
|
|
||||||
if (++myHctr >= 228) nextLine();
|
if (++myHctr >= 228)
|
||||||
|
nextLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -38,9 +38,30 @@ class Console;
|
||||||
|
|
||||||
namespace TIA6502tsCore {
|
namespace TIA6502tsCore {
|
||||||
|
|
||||||
|
/**
|
||||||
|
This class is a device that emulates the Television Interface Adaptor
|
||||||
|
found in the Atari 2600 and 7800 consoles. The Television Interface
|
||||||
|
Adaptor is an integrated circuit designed to interface between an
|
||||||
|
eight bit microprocessor and a television video modulator. It converts
|
||||||
|
eight bit parallel data into serial outputs for the color, luminosity,
|
||||||
|
and composite sync required by a video modulator.
|
||||||
|
|
||||||
|
This class outputs the serial data into a frame buffer which can then
|
||||||
|
be displayed on screen.
|
||||||
|
|
||||||
|
@author Christian Speckner (DirtyHairy) and Stephen Anthony
|
||||||
|
@version $Id$
|
||||||
|
*/
|
||||||
class TIA : public AbstractTIA
|
class TIA : public AbstractTIA
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
Create a new TIA for the specified console
|
||||||
|
|
||||||
|
@param console The console the TIA is associated with
|
||||||
|
@param sound The sound object the TIA is associated with
|
||||||
|
@param settings The settings object for this TIA device
|
||||||
|
*/
|
||||||
TIA(Console& console, Sound& sound, Settings& settings);
|
TIA(Console& console, Sound& sound, Settings& settings);
|
||||||
virtual ~TIA() = default;
|
virtual ~TIA() = default;
|
||||||
|
|
||||||
|
@ -48,6 +69,11 @@ class TIA : public AbstractTIA
|
||||||
|
|
||||||
void reset() override;
|
void reset() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Reset frame to current YStart/Height properties
|
||||||
|
*/
|
||||||
|
void frameReset() override;
|
||||||
|
|
||||||
void systemCyclesReset() override;
|
void systemCyclesReset() override;
|
||||||
|
|
||||||
void install(System& system) override;
|
void install(System& system) override;
|
||||||
|
@ -58,17 +84,21 @@ class TIA : public AbstractTIA
|
||||||
|
|
||||||
void installDelegate(System& system, Device& device) override;
|
void installDelegate(System& system, Device& device) override;
|
||||||
|
|
||||||
void frameReset() override;
|
|
||||||
|
|
||||||
bool saveDisplay(Serializer& out) const override;
|
bool saveDisplay(Serializer& out) const override;
|
||||||
|
|
||||||
bool loadDisplay(Serializer& in) override;
|
bool loadDisplay(Serializer& in) override;
|
||||||
|
|
||||||
void update() override;
|
void update() override;
|
||||||
|
|
||||||
uInt8* currentFrameBuffer() const override;
|
/**
|
||||||
|
Answers the current and previous frame buffer pointers
|
||||||
uInt8* previousFrameBuffer() const override;
|
*/
|
||||||
|
uInt8* currentFrameBuffer() const override {
|
||||||
|
return myCurrentFrameBuffer.get();
|
||||||
|
}
|
||||||
|
uInt8* previousFrameBuffer() const override {
|
||||||
|
return myPreviousFrameBuffer.get();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Answers vertical info about the framebuffer (height and starting line)
|
Answers vertical info about the framebuffer (height and starting line)
|
||||||
|
@ -118,6 +148,9 @@ class TIA : public AbstractTIA
|
||||||
|
|
||||||
void setJitterRecoveryFactor(Int32 f) override;
|
void setJitterRecoveryFactor(Int32 f) override;
|
||||||
|
|
||||||
|
// Clear both internal TIA buffers to black (palette color 0)
|
||||||
|
void clearBuffers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Save the current state of this device to the given Serializer.
|
Save the current state of this device to the given Serializer.
|
||||||
|
|
||||||
|
@ -142,9 +175,7 @@ class TIA : public AbstractTIA
|
||||||
string name() const override { return "TIA"; }
|
string name() const override { return "TIA"; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
enum HState {blank, frame};
|
enum HState {blank, frame};
|
||||||
|
|
||||||
enum Priority {pfp, score, normal};
|
enum Priority {pfp, score, normal};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -217,6 +248,7 @@ class TIA : public AbstractTIA
|
||||||
|
|
||||||
double myTimestamp;
|
double myTimestamp;
|
||||||
|
|
||||||
|
// Pointer to the current and previous frame buffers
|
||||||
BytePtr myCurrentFrameBuffer;
|
BytePtr myCurrentFrameBuffer;
|
||||||
BytePtr myPreviousFrameBuffer;
|
BytePtr myPreviousFrameBuffer;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue