public static void SaveBlocksToRom(Rom rom, int course) { //grab all levels data at once byte[][] allTiles = new byte[0x2B][]; for (int i = 0; i < 0x2B; i++) { rom.SetBank(0xC); int headerposition = rom.ReadWord(0x4560 + i * 2); int tilebank = rom.ReadByte(headerposition + 9); int tilesubbank = rom.ReadByte(headerposition + 10); rom.SetBank(tilebank); int tilePosition = rom.ReadWord(0x4000 + tilesubbank * 2); byte[] tileData = RLEDecompressTiles(rom, tilePosition); allTiles[i] = tileData; } Array.Copy(levelData, allTiles[course], 0x3000); //write them back to ROM byte bank = 0x20; byte subbank = 0; int writePosition = 0x4040; //first 64 bytes are reserved for level pointers for (int i = 0; i < 0x2B; i++) { byte[] tileData = RLECompressTiles(allTiles[i]).ToArray(); if ((writePosition + tileData.Length) >= 0x8000 || subbank >= 32) { //no more space, switch to another bank bank++; subbank = 0; writePosition = 0x4040; } //write data to bank rom.SetBank(bank); rom.WriteWord(0x4000 + subbank * 2, (ushort)writePosition); rom.WriteBytes(writePosition, tileData); //update level header rom.SetBank(0xC); int headerposition = rom.ReadWord(0x4560 + i * 2); rom.WriteByte(headerposition + 9, bank); rom.WriteByte(headerposition + 10, subbank); subbank++; writePosition += tileData.Length; } }
public static void SaveBlocksToRom(Rom rom, int course) { //grab all levels data at once byte[][] allTiles = new byte[0x2B][]; for(int i = 0 ; i < 0x2B ; i++) { rom.SetBank(0xC); int headerposition = rom.ReadWord(0x4560 + i * 2); int tilebank = rom.ReadByte(headerposition + 9); int tilesubbank = rom.ReadByte(headerposition + 10); rom.SetBank(tilebank); int tilePosition = rom.ReadWord(0x4000 + tilesubbank * 2); byte[] tileData = RLEDecompressTiles(rom, tilePosition).Take(0x3000).ToArray(); allTiles[i] = tileData; } Array.Copy(levelData, allTiles[course], 0x3000); //write them back to ROM byte bank = 0x20; byte subbank = 0; int writePosition = 0x4040; //first 64 bytes are reserved for level pointers for(int i = 0 ; i < 0x2B ; i++) { byte[] tileData = RLECompressTiles(allTiles[i]).ToArray(); if((writePosition + tileData.Length) >= 0x8000 || subbank >= 32) { //no more space, switch to another bank bank++; subbank = 0; writePosition = 0x4040; } //write data to bank rom.SetBank(bank); rom.WriteWord(0x4000 + subbank * 2, (ushort)writePosition); rom.WriteBytes(writePosition, tileData); //update level header rom.SetBank(0xC); int headerposition = rom.ReadWord(0x4560 + i * 2); rom.WriteByte(headerposition + 9, bank); rom.WriteByte(headerposition + 10, subbank); subbank++; writePosition += tileData.Length; } }