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 byte[,] GetTile(int tileNum) { // Check if it's already in the cache if (tileCache.ContainsKey(tileNum)) { return(tileCache[tileNum]); } byte[,] pixels = new byte[8, 8]; //counter++; // Get the address of the tile int address = startPointer + (tileNum << 5); // Parse the tile byte tmp = 0; rom.Seek(address); for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x += 2) { tmp = (byte)rom.ReadByte(); pixels[y, x] = (byte)(tmp & 0xF); pixels[y, x + 1] = (byte)((tmp >> 4) & 0xF); } } tileCache.Add(tileNum, pixels); return(pixels); }
public static void SetPalette(ROMHandler romFile, int entry, byte pal) { if (entry <= 0xFF || entry >= 0x26C) { int address = ROMInfo.palInfoAddress + (entry * 12); byte palSubBank = (byte) (romFile.ReadByte(address) & 0xF0); palSubBank |= (byte)(pal & 0xF); romFile.WriteByte(address, palSubBank); } }
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); } }