public static void Init()
        {
            for (int i = 0; i < 4; i++)
            {
                Entries[i]     = Rom.ReadInt(Address[i]);
                InfoEntries[i] = new SpriteInfo[Entries[i]];

                for (int j = 0; j < Entries[i]; j++)
                {
                    int a = GetPointer(i, j);
                    if (a == -1)
                    {
                        continue;
                    }

                    var ie = new SpriteInfo();
                    ie.bank  = i;
                    ie.index = j;

                    Rom.Seek(a);
                    Rom.SeekAdd(8);

                    ie.SpriteCount = Rom.ReadUShort();
                    ie.Sprites     = new Sprite[ie.SpriteCount];
                    for (int k = 0; k < ie.SpriteCount; k++)
                    {
                        var s = new Sprite();
                        s.index = k;

                        s.SpriteCount = Rom.ReadUShort();
                        s.Sprites     = new OamSprite[s.SpriteCount];
                        for (int m = 0; m < s.SpriteCount; m++)
                        {
                            var o = new OamSprite();

                            o.CoordY = Rom.ReadSByte();
                            o.CoordX = (short)Rom.ReadSByte();

                            ushort ch = Rom.ReadUShort();
                            o.Tile     = (ushort)(ch & 0x3FF);
                            o.FlipH    = (ch & 0x400) != 0;
                            o.FlipV    = (ch & 0x800) != 0;
                            o.ObjSize  = (byte)((ch >> 12) & 3);
                            o.ObjShape = (byte)((ch >> 14) & 3);

                            s.Sprites[m] = o;
                        }
                        Rom.SeekAdd(2);

                        ie.Sprites[k] = s;
                    }

                    InfoEntries[i][j] = ie;
                }
            }
        }
        public static void Init()
        {
            for (int i = 0; i < 4; i++)
            {
                Entries[i] = Rom.ReadInt(Address[i]);
                InfoEntries[i] = new SpriteInfo[Entries[i]];

                for (int j = 0; j < Entries[i]; j++)
                {
                    int a = GetPointer(i, j);
                    if (a == -1) continue;

                    var ie = new SpriteInfo();
                    ie.bank = i;
                    ie.index = j;

                    Rom.Seek(a);
                    Rom.SeekAdd(8);

                    ie.SpriteCount = Rom.ReadUShort();
                    ie.Sprites = new Sprite[ie.SpriteCount];
                    for (int k = 0; k < ie.SpriteCount; k++)
                    {
                        var s = new Sprite();
                        s.index = k;

                        s.SpriteCount = Rom.ReadUShort();
                        s.Sprites = new OamSprite[s.SpriteCount];
                        for (int m = 0; m < s.SpriteCount; m++)
                        {
                            var o = new OamSprite();

                            o.CoordY = Rom.ReadSByte();
                            o.CoordX = (short)Rom.ReadSByte();

                            ushort ch = Rom.ReadUShort();
                            o.Tile = (ushort)(ch & 0x3FF);
                            o.FlipH = (ch & 0x400) != 0;
                            o.FlipV = (ch & 0x800) != 0;
                            o.ObjSize = (byte)((ch >> 12) & 3);
                            o.ObjShape = (byte)((ch >> 14) & 3);

                            s.Sprites[m] = o;
                        }
                        Rom.SeekAdd(2);

                        ie.Sprites[k] = s;
                    }

                    InfoEntries[i][j] = ie;
                }
            }
        }
 public static void Init()
 {
     SpriteGfx.Init();
     SpritePalettes.Init();
     SpriteInfo.Init();
 }