A2600: update ball emulation
A7800: update m6532 to match 2600
This commit is contained in:
parent
f058933342
commit
76df4758db
|
@ -1297,6 +1297,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
|||
}
|
||||
else if (maskedAddr == 0x14) // RESBL
|
||||
{
|
||||
_ball.Resp_check();
|
||||
|
||||
if (!_hmove.LateHBlankReset)
|
||||
{
|
||||
_ball.HPosCnt = (byte)(_hsyncCnt < 68 ? 160 - 2 : 160 - 4);
|
||||
|
|
|
@ -14,20 +14,33 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
|||
public byte HPosCnt;
|
||||
public byte Collisions;
|
||||
|
||||
// Resp commands do not trigger start signals for main copies. We need to model this
|
||||
private int _drawTo;
|
||||
private byte _scanCnt;
|
||||
private bool _scanCntInit;
|
||||
private int _startSignal;
|
||||
private int _signalReached;
|
||||
public bool _draw_signaled;
|
||||
|
||||
public bool Tick()
|
||||
{
|
||||
bool result = false;
|
||||
if (HPosCnt < (1 << Size))
|
||||
|
||||
|
||||
if (_scanCntInit)
|
||||
{
|
||||
if (!Delay && Enabled)
|
||||
if (HPosCnt < (1 << Size))
|
||||
{
|
||||
// Draw the ball!
|
||||
result = true;
|
||||
}
|
||||
else if (Delay && Denabled)
|
||||
{
|
||||
// Draw the ball!
|
||||
result = true;
|
||||
if (!Delay && Enabled)
|
||||
{
|
||||
// Draw the ball!
|
||||
result = true;
|
||||
}
|
||||
else if (Delay && Denabled)
|
||||
{
|
||||
// Draw the ball!
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,9 +50,41 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
|||
// Counter loops at 160
|
||||
HPosCnt %= 160;
|
||||
|
||||
if (_startSignal == 160)
|
||||
{
|
||||
_scanCnt = 0;
|
||||
_startSignal++;
|
||||
_scanCntInit = true;
|
||||
}
|
||||
|
||||
// our goal here is to send a start signal 4 clocks before drawing begins. The properly emulates
|
||||
// drawing on a real TIA
|
||||
if (HPosCnt == 156)
|
||||
{
|
||||
_startSignal = HPosCnt;
|
||||
_signalReached = HPosCnt + 5;
|
||||
_draw_signaled = true;
|
||||
}
|
||||
|
||||
if (_startSignal < _signalReached)
|
||||
{
|
||||
_startSignal++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void Resp_check()
|
||||
{
|
||||
if (_draw_signaled)
|
||||
{
|
||||
if (_startSignal < 161)
|
||||
{
|
||||
_startSignal -= _startSignal - 156;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SyncState(Serializer ser)
|
||||
{
|
||||
ser.BeginSection("Ball");
|
||||
|
@ -50,6 +95,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
|||
ser.Sync(nameof(HM), ref HM);
|
||||
ser.Sync("hPosCnt", ref HPosCnt);
|
||||
ser.Sync("collisions", ref Collisions);
|
||||
|
||||
ser.Sync("start_signal", ref _startSignal);
|
||||
ser.Sync("signal_reached", ref _signalReached);
|
||||
ser.Sync("draw_to", ref _drawTo);
|
||||
ser.Sync("scanCnt", ref _scanCnt);
|
||||
ser.Sync("scanCntInit", ref _scanCntInit);
|
||||
ser.Sync("_draw_signaled", ref _draw_signaled);
|
||||
ser.EndSection();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,6 +80,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
Timer.InterruptFlag = false;
|
||||
}
|
||||
|
||||
if (Timer.Overflowed)
|
||||
{
|
||||
Timer.Overflowed = false;
|
||||
}
|
||||
|
||||
return Timer.Value;
|
||||
}
|
||||
|
||||
|
@ -122,7 +127,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
// Write to Timer/1
|
||||
Timer.PrescalerShift = 0;
|
||||
Timer.Value = value;
|
||||
Timer.PrescalerCount = 0; // 1 << Timer.PrescalerShift;
|
||||
Timer.PrescalerCount = 1; // << Timer.PrescalerShift;
|
||||
Timer.InterruptFlag = false;
|
||||
}
|
||||
else if (registerAddr == 0x05)
|
||||
|
@ -130,7 +135,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
// Write to Timer/8
|
||||
Timer.PrescalerShift = 3;
|
||||
Timer.Value = value;
|
||||
Timer.PrescalerCount = 0; // 1 << Timer.PrescalerShift;
|
||||
Timer.PrescalerCount = 1; // << Timer.PrescalerShift;
|
||||
Timer.InterruptFlag = false;
|
||||
}
|
||||
else if (registerAddr == 0x06)
|
||||
|
@ -138,7 +143,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
// Write to Timer/64
|
||||
Timer.PrescalerShift = 6;
|
||||
Timer.Value = value;
|
||||
Timer.PrescalerCount = 0; // 1 << Timer.PrescalerShift;
|
||||
Timer.PrescalerCount = 1; // << Timer.PrescalerShift;
|
||||
Timer.InterruptFlag = false;
|
||||
}
|
||||
else if (registerAddr == 0x07)
|
||||
|
@ -146,7 +151,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
// Write to Timer/1024
|
||||
Timer.PrescalerShift = 10;
|
||||
Timer.Value = value;
|
||||
Timer.PrescalerCount = 0; // 1 << Timer.PrescalerShift;
|
||||
Timer.PrescalerCount = 1; // << Timer.PrescalerShift;
|
||||
Timer.InterruptFlag = false;
|
||||
}
|
||||
}
|
||||
|
@ -214,22 +219,25 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
|
||||
public bool InterruptEnabled;
|
||||
public bool InterruptFlag;
|
||||
public bool Overflowed;
|
||||
|
||||
public void Tick()
|
||||
{
|
||||
if (PrescalerCount == 0)
|
||||
PrescalerCount--;
|
||||
|
||||
if ((PrescalerCount == 0) || Overflowed)
|
||||
{
|
||||
Value--;
|
||||
PrescalerCount = 1 << PrescalerShift;
|
||||
}
|
||||
|
||||
PrescalerCount--;
|
||||
if (PrescalerCount == 0)
|
||||
{
|
||||
if (Value == 0)
|
||||
if (Value == 0xFF)
|
||||
{
|
||||
Overflowed = true;
|
||||
InterruptFlag = true;
|
||||
PrescalerShift = 0;
|
||||
}
|
||||
|
||||
if (PrescalerCount == 0)
|
||||
{
|
||||
PrescalerCount = 1 << PrescalerShift;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -241,6 +249,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
|||
ser.Sync("value", ref Value);
|
||||
ser.Sync("interruptEnabled", ref InterruptEnabled);
|
||||
ser.Sync("interruptFlag", ref InterruptFlag);
|
||||
ser.Sync("Overflowed", ref Overflowed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue