public void SavePalette() { if (mainentry > 0xFF && mainentry < 0x26C) { int palBank; // Compute palBank palBank = mainentry - 0xFF; // Compute palSubBank rom.Seek(ROMInfo.palInfoAddress + (mainentry * 12)); // Compute palAddress palAddress = ROMInfo.palStartAddress + rom.ReadWord( ROMInfo.palStartAddress + 4 + (palBank << 2)); } else { palAddress = ROMInfo.palStartAddress + rom.ReadWord( ROMInfo.palStartAddress + 4) + (palSubBank * 32); } // Write the colours rom.Seek(palAddress); for (int i = 0; i < 16; i++) { rom.WriteColor(_pal[i]); } }
private void cmdSwap_Click(object sender, EventArgs e) { int e1 = cboEntry1.SelectedIndex; int e2 = cboEntry2.SelectedIndex; if (e1 == e2) { btnCancel_Click(null, null); return; } // Swap the sprite info pointers int pointer1 = rom.ReadWord( ROMInfo.sprStartAddress[cboBank1.SelectedIndex] + 4 + (e1 * 4)); int pointer2 = rom.ReadWord( ROMInfo.sprStartAddress[cboBank2.SelectedIndex] + 4 + (e2 * 4)); rom.WriteWord( ROMInfo.sprStartAddress[cboBank1.SelectedIndex] + 4 + (e1 * 4), pointer2); rom.WriteWord( ROMInfo.sprStartAddress[cboBank2.SelectedIndex] + 4 + (e2 * 4), pointer1); // Swap the graphics pointers pointer1 = rom.ReadWord( ROMInfo.gfxStartAddress[cboBank1.SelectedIndex] + 4 + (e1 * 4)); pointer2 = rom.ReadWord( ROMInfo.gfxStartAddress[cboBank2.SelectedIndex] + 4 + (e2 * 4)); rom.WriteWord( ROMInfo.gfxStartAddress[cboBank1.SelectedIndex] + 4 + (e1 * 4), pointer2); rom.WriteWord( ROMInfo.gfxStartAddress[cboBank2.SelectedIndex] + 4 + (e2 * 4), pointer1); // Swap the palette numbers byte b1 = (byte)rom.ReadByte(ROMInfo.palInfoAddress + (e1 * 12)); byte b2 = (byte)rom.ReadByte(ROMInfo.palInfoAddress + (e2 * 12)); rom.WriteByte(ROMInfo.palInfoAddress + (e1 * 12), (byte)((b1 & 0xF0) | (b2 & 0xF))); rom.WriteByte(ROMInfo.palInfoAddress + (e2 * 12), (byte)((b2 & 0xF0) | (b1 & 0xF))); this.Close(); }
public Tileset(ROMHandler romFile, int bank, int mainEntry) { rom = romFile; // Compute startPointer startPointer = ROMInfo.gfxStartAddress[bank] + rom.ReadWord( ROMInfo.gfxStartAddress[bank] + 4 + (4 * mainEntry)); // Instantiate the cache tileCache = new Dictionary <int, byte[, ]>(); //counter++; }
public Palette(ROMHandler romFile, int bank, int mainEntry, Color?transparentColor) { // Bank is irrelevant? Requires ROM research; check if the // [0x100, 0x26B] custom range is applicable beyond bank 0 int palBank; //int palAddress; rom = romFile; mainentry = mainEntry; // Compute palBank palBank = ((mainEntry > 0xFF) && (mainEntry < 0x26C)) ? mainEntry - 0xFF : 0; // Compute palSubBank rom.Seek(ROMInfo.palInfoAddress + (mainEntry * 12)); palSubBank = ((mainEntry > 0xFF) && (mainEntry < 0x26C)) ? 0 : (romFile.ReadByte() & 0xF); // Compute palAddress palAddress = ROMInfo.palStartAddress + rom.ReadWord( ROMInfo.palStartAddress + 4 + (palBank * 4)) + (palSubBank * 32); // Parse the palette data rom.Seek(palAddress); for (int i = 0; i < 16; i++) { if (i == 0 && transparentColor != null) { _pal[i] = (Color)transparentColor; } else { _pal[i] = rom.ReadColor(); } } }
public Sprite(ROMHandler ROMFile, int Bank, int MainEntry, int SpriteEntry) { int infoAddress; int entryCounter = 0; romFile = ROMFile; bank = Bank; mainEntry = MainEntry; spriteEntry = SpriteEntry; // Instantiate the tileset and palette tSet = new Tileset(romFile, bank, mainEntry); pal = new Palette(romFile, bank, mainEntry); // Parse the sub sprite information infoAddress = ROMInfo.sprStartAddress[bank] + romFile.ReadWord( ROMInfo.sprStartAddress[bank] + 4 + (mainEntry * 4)) + 8; NumSprites = romFile.ReadHWord(infoAddress); infoAddress += 2; while (spriteEntry > entryCounter) { infoAddress += (romFile.ReadHWord(infoAddress) + 1) * 4; entryCounter++; } romFile.Seek(infoAddress); NumSubSprites = romFile.ReadHWord(); SubSprite retVal; subSprites = new List <SubSprite>(); int tmp; for (int i = 0; i < NumSubSprites; i++) { retVal = new SubSprite(); retVal.romAddress = (int)romFile.Address; retVal.romFile = romFile; retVal.OffsetY = romFile.ReadByte(); retVal.OffsetX = romFile.ReadByte(); if (retVal.OffsetY >= 0x80) { retVal.OffsetY -= 0x100; // Sign the offsets } if (retVal.OffsetX >= 0x80) { retVal.OffsetX -= 0x100; } tmp = romFile.ReadHWord(); retVal.Tile = (tmp & 0x3FF); retVal.FlipX = (((tmp >> 10) & 1) == 1); retVal.FlipY = (((tmp >> 11) & 1) == 1); retVal.Width = sprWidthConst[(tmp >> 14) & 3, (tmp >> 12) & 3]; retVal.Height = sprHeightConst[(tmp >> 14) & 3, (tmp >> 12) & 3]; retVal.Size = (tmp >> 12) & 3; retVal.Shape = (tmp >> 14) & 3; retVal.tileSet = tSet; retVal.pal = pal; subSprites.Add(retVal); } }