private int GetOffsetFromPTable() { var pScreen = Owner.Pointers[Index]; if (Level.Format.Uses24bitScreenPointers) { var bank = Owner.Pointers.GetBank(Index); return((int)Mmc3.GetBankOffset(bank) + ((int)pScreen & 0x1FFF)); //(int)Level.Rom.Banks[bank].ToOffset(pScreen); } else { return(Owner.DataBank.ToOffset(pScreen)); } }
void ILevelDataSerializer.SerializeRoomTable(ref int offset) { if (Format.Uses24bitScreenPointers) { for (int i = 0; i < screens.Count; i++) { var oScreenData = screens[i].Offset; // Get bank/address int screenBank = Mmc3.GetBank((pRom)oScreenData); var pScreenData = 0xA000 | (int)Mmc3.GetAddress8000((pRom)oScreenData); Debug.WriteLine(screenBank.ToString("x2") + ":" + pScreenData.ToString("x4")); if (screenBank == 0xe) { } rom.data[offset] = (byte)screenBank; offset++; rom.WritePointer((pRom)offset, (pCpu)pScreenData); offset += 2; } // FF FF FF terminator rom.data[offset] = 0; rom.data[offset + 1] = 0; rom.data[offset + 2] = 0; offset += 3; } else { for (int i = 0; i < screens.Count; i++) { var oScreenData = screens[i].Offset; var pScreenData = screens.DataBank.ToPtr((pRom)oScreenData); rom.WritePointer((pRom)offset, pScreenData); offset += 2; } // Enhanced ROMs require FFFF terminator for room pointers if (rom.RomFormat == RomFormats.Enhanco) { rom.WritePointer((pRom)offset, new pCpu(0xFFFF)); offset += 2; } } }