in atari_py/ale_interface/src/emucore/TIA.cxx [1972:2130]
uInt8 TIA::peek(uInt16 addr)
{
// Update frame to current color clock before we look at anything!
updateFrame(mySystem->cycles() * 3);
uInt8 noise = mySystem->getDataBusState() & 0x3F;
switch(addr & 0x000f)
{
case 0x00: // CXM0P
return ((myCollision & 0x0001) ? 0x80 : 0x00) |
((myCollision & 0x0002) ? 0x40 : 0x00) | noise;
case 0x01: // CXM1P
return ((myCollision & 0x0004) ? 0x80 : 0x00) |
((myCollision & 0x0008) ? 0x40 : 0x00) | noise;
case 0x02: // CXP0FB
return ((myCollision & 0x0010) ? 0x80 : 0x00) |
((myCollision & 0x0020) ? 0x40 : 0x00) | noise;
case 0x03: // CXP1FB
return ((myCollision & 0x0040) ? 0x80 : 0x00) |
((myCollision & 0x0080) ? 0x40 : 0x00) | noise;
case 0x04: // CXM0FB
return ((myCollision & 0x0100) ? 0x80 : 0x00) |
((myCollision & 0x0200) ? 0x40 : 0x00) | noise;
case 0x05: // CXM1FB
return ((myCollision & 0x0400) ? 0x80 : 0x00) |
((myCollision & 0x0800) ? 0x40 : 0x00) | noise;
case 0x06: // CXBLPF
return ((myCollision & 0x1000) ? 0x80 : 0x00) | noise;
case 0x07: // CXPPMM
return ((myCollision & 0x2000) ? 0x80 : 0x00) |
((myCollision & 0x4000) ? 0x40 : 0x00) | noise;
case 0x08: // INPT0
{
Int32 r = myConsole.controller(Controller::Left).read(Controller::Nine);
if(r == Controller::minimumResistance)
{
return 0x80 | noise;
}
else if((r == Controller::maximumResistance) || myDumpEnabled)
{
return noise;
}
else
{
double t = (1.6 * r * 0.01E-6);
uInt32 needed = (uInt32)(t * 1.19E6);
if(mySystem->cycles() > (myDumpDisabledCycle + needed))
{
return 0x80 | noise;
}
else
{
return noise;
}
}
}
case 0x09: // INPT1
{
Int32 r = myConsole.controller(Controller::Left).read(Controller::Five);
if(r == Controller::minimumResistance)
{
return 0x80 | noise;
}
else if((r == Controller::maximumResistance) || myDumpEnabled)
{
return noise;
}
else
{
double t = (1.6 * r * 0.01E-6);
uInt32 needed = (uInt32)(t * 1.19E6);
if(mySystem->cycles() > (myDumpDisabledCycle + needed))
{
return 0x80 | noise;
}
else
{
return noise;
}
}
}
case 0x0A: // INPT2
{
Int32 r = myConsole.controller(Controller::Right).read(Controller::Nine);
if(r == Controller::minimumResistance)
{
return 0x80 | noise;
}
else if((r == Controller::maximumResistance) || myDumpEnabled)
{
return noise;
}
else
{
double t = (1.6 * r * 0.01E-6);
uInt32 needed = (uInt32)(t * 1.19E6);
if(mySystem->cycles() > (myDumpDisabledCycle + needed))
{
return 0x80 | noise;
}
else
{
return noise;
}
}
}
case 0x0B: // INPT3
{
Int32 r = myConsole.controller(Controller::Right).read(Controller::Five);
if(r == Controller::minimumResistance)
{
return 0x80 | noise;
}
else if((r == Controller::maximumResistance) || myDumpEnabled)
{
return noise;
}
else
{
double t = (1.6 * r * 0.01E-6);
uInt32 needed = (uInt32)(t * 1.19E6);
if(mySystem->cycles() > (myDumpDisabledCycle + needed))
{
return 0x80 | noise;
}
else
{
return noise;
}
}
}
case 0x0C: // INPT4
return myConsole.controller(Controller::Left).read(Controller::Six) ?
(0x80 | noise) : noise;
case 0x0D: // INPT5
return myConsole.controller(Controller::Right).read(Controller::Six) ?
(0x80 | noise) : noise;
case 0x0e:
return noise;
default:
return noise;
}
}