Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        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();
                }
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }