in cores/atari2600/stella/src/emucore/TIATables.cxx [192:336]
void TIATables::buildMxMaskTable()
{
Int32 x, size, number;
// Clear the missle table to start with
for(number = 0; number < 8; ++number)
for(size = 0; size < 5; ++size)
for(x = 0; x < 160; ++x)
MxMask[number][size][x] = false;
for(number = 0; number < 8; ++number)
{
for(size = 0; size < 5; ++size)
{
for(x = 0; x < 160 + 72; ++x)
{
// For the following, size index = 4 is almost exactly the same as
// index = 2; that is, 1 << 2, or 4 colour clocks wide
// To simulate the weirdness in the Cosmic Ark starfield effect,
// each group of 4 pixels has its 3rd pixel blanked
switch(number)
{
// Only one copy of the missle
case 0x00:
case 0x05:
case 0x07:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
// Two copies - close
case 0x01:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 16) >= 0) && ((x - 16) < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 16) >= 0) && ((x - 16) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
// Two copies - medium
case 0x02:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 32) >= 0) && ((x - 32) < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 32) >= 0) && ((x - 32) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
// Three copies - close
case 0x03:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 16) >= 0) && ((x - 16) < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 32) >= 0) && ((x - 32) < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 16) >= 0) && ((x - 16) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 32) >= 0) && ((x - 32) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
// Two copies - wide
case 0x04:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 64) >= 0) && ((x - 64) < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 64) >= 0) && ((x - 64) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
// Three copies - medium
case 0x06:
if(size != 4)
{
if((x >= 0) && (x < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 32) >= 0) && ((x - 32) < (1 << size)))
MxMask[number][size][x % 160] = true;
else if(((x - 64) >= 0) && ((x - 64) < (1 << size)))
MxMask[number][size][x % 160] = true;
}
else
{
if((x >= 0) && (x < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 32) >= 0) && ((x - 32) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
else if(((x - 64) >= 0) && ((x - 64) < (1 << 2)))
MxMask[number][4][x % 160] = ((x - 2) % 4 == 0 ? false : true);
}
break;
}
}
// Copy data into wrap-around area
for(x = 0; x < 160; ++x)
MxMask[number][size][x + 160] =
MxMask[number][size][x];
}
}
}