public void compressStates() {
    StateHistory.compressTimestampHistory(lcdc, true);
    StateHistory.compressTimestampHistory(wy);
    StateHistory.compressTimestampHistory(wx);
    StateHistory.compressTimestampHistory(scy);
    StateHistory.compressTimestampHistory(scx);
    for (int i = 0; i < 0x800; i++)
      if (bgMaps[i] != null)
        StateHistory.compressTimestampHistory(bgMaps[i]);
    for (int vramBank = 0; vramBank < 2; vramBank++) 
      for (int address = 0; address < 0x180; address++)
        StateHistory.compressTimestampHistory(tileHistory[vramBank][address]);
    for (int address = 0; address < 8; address++)
      StateHistory.compressTimestampHistory(bgPaletteHistory[address]);
    for (int address = 0; address < 8; address++)
      StateHistory.compressTimestampHistory(objPaletteHistory[address]);
    for (int pos = 0; pos < 40; pos++)
      StateHistory.compressTimestampHistory(oamHistory[pos]);
    
    outputAssemblyStats();
    outputTileStats();
    outputPaletteStats(bgPaletteHistory, numBgPaletteOverrides);
    outputPaletteStats(objPaletteHistory, numObjPaletteOverrides);
    outputOamStats();
  }