in atari_py/ale_interface/src/emucore/TIA.cxx [917:1019]
void TIA::computePlayerMaskTable()
{
// First, calculate masks for alignment 0
Int32 x, enable, mode;
// Set the player mask table to all zeros
for(enable = 0; enable < 2; ++enable)
for(mode = 0; mode < 8; ++mode)
for(x = 0; x < 160; ++x)
ourPlayerMaskTable[0][enable][mode][x] = 0x00;
// Now, compute the player mask table
for(enable = 0; enable < 2; ++enable)
{
for(mode = 0; mode < 8; ++mode)
{
for(x = 0; x < 160 + 72; ++x)
{
if(mode == 0x00)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
}
else if(mode == 0x01)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
else if(((x - 16) >= 0) && ((x - 16) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 16);
}
else if(mode == 0x02)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
else if(((x - 32) >= 0) && ((x - 32) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 32);
}
else if(mode == 0x03)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
else if(((x - 16) >= 0) && ((x - 16) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 16);
else if(((x - 32) >= 0) && ((x - 32) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 32);
}
else if(mode == 0x04)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
else if(((x - 64) >= 0) && ((x - 64) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 64);
}
else if(mode == 0x05)
{
// For some reason in double size mode the player's output
// is delayed by one pixel thus we use > instead of >=
if((enable == 0) && (x > 0) && (x <= 16))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> ((x - 1)/2);
}
else if(mode == 0x06)
{
if((enable == 0) && (x >= 0) && (x < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> x;
else if(((x - 32) >= 0) && ((x - 32) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 32);
else if(((x - 64) >= 0) && ((x - 64) < 8))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> (x - 64);
}
else if(mode == 0x07)
{
// For some reason in quad size mode the player's output
// is delayed by one pixel thus we use > instead of >=
if((enable == 0) && (x > 0) && (x <= 32))
ourPlayerMaskTable[0][enable][mode][x % 160] = 0x80 >> ((x - 1)/4);
}
}
// Copy data into wrap-around area
for(x = 0; x < 160; ++x)
{
ourPlayerMaskTable[0][enable][mode][x + 160] =
ourPlayerMaskTable[0][enable][mode][x];
}
}
}
// Now, copy data for alignments of 1, 2 and 3
for(uInt32 align = 1; align < 4; ++align)
{
for(enable = 0; enable < 2; ++enable)
{
for(mode = 0; mode < 8; ++mode)
{
for(x = 0; x < 320; ++x)
{
ourPlayerMaskTable[align][enable][mode][x] =
ourPlayerMaskTable[0][enable][mode][(x + 320 - align) % 320];
}
}
}
}
}