void TIATables::buildPxPosResetWhenTable()

in cores/atari2600/stella/src/emucore/TIATables.cxx [420:557]


void TIATables::buildPxPosResetWhenTable()
{
  uInt32 nusiz, oldx, newx;

  // Loop through all player nusizs, all old player positions, and all new
  // player positions and determine where the new position is located:
  // 1 means the new position is within the display of an old copy of the
  // player, -1 means the new position is within the delay portion of an
  // old copy of the player, and 0 means it's neither of these two
  for(nusiz = 0; nusiz < 8; ++nusiz)
  {
    for(oldx = 0; oldx < 160; ++oldx)
    {
      // Set everything to 0 for non-delay/non-display section
      for(newx = 0; newx < 160; ++newx)
        PxPosResetWhen[nusiz][oldx][newx] = 0;

      // Now, we'll set the entries for non-delay/non-display section
      for(newx = 0; newx < 160 + 72 + 5; ++newx)
      {
        // nusiz:
        // 0: one copy
        // 1: two copies-close
        // 2: two copies-med
        // 3: three copies-close
        // 4: two copies-wide
        // 5: double size player
        // 6: 3 copies medium
        // 7: quad sized player
        switch(nusiz)
        {
          case 0x00:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x01:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 16)) && (newx < (oldx + 16 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 16 + 4) && (newx < (oldx + 16 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x02:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 32)) && (newx < (oldx + 32 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 32 + 4) && (newx < (oldx + 32 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x03:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 16)) && (newx < (oldx + 16 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 32)) && (newx < (oldx + 32 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 16 + 4) && (newx < (oldx + 16 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 32 + 4) && (newx < (oldx + 32 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x04:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 64)) && (newx < (oldx + 64 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 64 + 4) && (newx < (oldx + 64 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x05:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 16)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x06:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 32)) && (newx < (oldx + 32 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;
            else if((newx >= (oldx + 64)) && (newx < (oldx + 64 + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 32 + 4) && (newx < (oldx + 32 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            else if((newx >= oldx + 64 + 4) && (newx < (oldx + 64 + 4 + 8)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;

          case 0x07:
            if((newx >= oldx) && (newx < (oldx + 4)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = -1;

            else if((newx >= oldx + 4) && (newx < (oldx + 4 + 32)))
              PxPosResetWhen[nusiz][oldx][newx % 160] = 1;
            break;
        }
      }

      // Let's do a sanity check on table entries
      uInt32 s1 = 0, s2 = 0;
      for(newx = 0; newx < 160; ++newx)
      {
        if(PxPosResetWhen[nusiz][oldx][newx] == -1)
          ++s1;
        if(PxPosResetWhen[nusiz][oldx][newx] == 1)
          ++s2;
      }
      assert((s1 % 4 == 0) && (s2 % 8 == 0));
    }
  }
}