public void loadTilesObjects(bool floor = true) { //adddress of the room objects int objectPointer = (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer") + 2] << 16) + (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer") + 1] << 8) + (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer")]); objectPointer = Addresses.snestopc(objectPointer); int room_address = objectPointer + (index * 3); int tile_address = (ROM.DATA[room_address + 2] << 16) + (ROM.DATA[room_address + 1] << 8) + ROM.DATA[room_address]; int objects_location = Addresses.snestopc(tile_address); if (floor) { floor1 = (byte)(ROM.DATA[objects_location] & 0x0F); floor2 = (byte)((ROM.DATA[objects_location] >> 4) & 0x0F); } layout = (byte)((ROM.DATA[objects_location + 1] >> 2) & 0x07); List <ChestData> chests_in_room = new List <ChestData>(); loadChests(ref chests_in_room); int pos = objects_location + 2; byte b1 = 0; byte b2 = 0; byte b3 = 0; byte posX = 0; byte posY = 0; byte sizeX = 0; byte sizeY = 0; byte sizeXY = 0; short oid = 0; int layer = 0; bool door = false; bool endRead = false; while (endRead == false) { b1 = ROM.DATA[pos]; b2 = ROM.DATA[pos + 1]; if (b1 == 0xFF && b2 == 0xFF) { pos += 2; //we jump to layer2 layer++; door = false; if (layer == 3) { endRead = true; break; } continue; } if (b1 == 0xF0 && b2 == 0xFF) { pos += 2; //we jump to layer2 door = true; continue; } b3 = ROM.DATA[pos + 2]; if (door) { pos += 2; } else { pos += 3; } if (door == false) { if (b3 >= 0xF8) { oid = (short)((b3 << 4) | 0x80 + (((b2 & 0x03) << 2) + ((b1 & 0x03)))); posX = (byte)((b1 & 0xFC) >> 2); posY = (byte)((b2 & 0xFC) >> 2); sizeXY = (byte)((((b1 & 0x03) << 2) + (b2 & 0x03))); } else //subtype1 { oid = b3; posX = (byte)((b1 & 0xFC) >> 2); posY = (byte)((b2 & 0xFC) >> 2); sizeX = (byte)((b1 & 0x03)); sizeY = (byte)((b2 & 0x03)); sizeXY = (byte)(((sizeX << 2) + sizeY)); } if (b1 >= 0xFC) //subtype2 (not scalable? ) { oid = (short)((b3 & 0x3F) + 0x100); posX = (byte)(((b2 & 0xF0) >> 4) + ((b1 & 0x3) << 4)); posY = (byte)(((b2 & 0x0F) << 2) + ((b3 & 0xC0) >> 6)); sizeXY = 0; } tilesObjects.Add(new Room_Object(oid, posX, posY, sizeXY, (byte)layer)); //IF Object is a chest loaded and there's object in the list chest if (oid == 0xF99) { if (chests_in_room.Count > 0) { chest_list.Add(new ChestData(chests_in_room[0].itemIn, false)); chests_in_room.RemoveAt(0); } } else if (oid == 0xFB1) { if (chests_in_room.Count > 0) { chest_list.Add(new ChestData(chests_in_room[0].itemIn, true)); chests_in_room.RemoveAt(0); } } } else { doors.Add(new DoorSave((short)((b2 << 8) + b1))); continue; } } }
public void LoadOverworldSprites() { Room_Sprite[][] all_spritesOW = new Room_Sprite[3][]; all_spritesOW[0] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//Beginning Sprites.json")); all_spritesOW[1] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//ZeldaRescued Sprites.json")); all_spritesOW[2] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//AgahnimDefeated Sprites.json")); //Restore sprites by room //64, 143 for (int i = 0; i < 64; i++) { roomSpritesBeginning[i] = new List <Room_Sprite>(); for (int j = 0; j < all_spritesOW[0].Length; j++) { if (all_spritesOW[0][j].roomMapId == i) { roomSpritesBeginning[i].Add(all_spritesOW[0][j]); } } } for (int i = 0; i < 143; i++) { roomSpritesZelda[i] = new List <Room_Sprite>(); roomSpritesAgahnim[i] = new List <Room_Sprite>(); for (int j = 0; j < all_spritesOW[1].Length; j++) { if (all_spritesOW[1][j].roomMapId == i) { roomSpritesZelda[i].Add(all_spritesOW[1][j]); } } for (int j = 0; j < all_spritesOW[2].Length; j++) { if (all_spritesOW[2][j].roomMapId == i) { roomSpritesAgahnim[i].Add(all_spritesOW[2][j]); } } } //data location range spritedata = AED length : 2797 //0x4CB41 starting data location (1st is just a FF for empty pointers) //real starting location = 0x4CB42 //ROM.DATA[0x4CB41] = 0xFF;//Ensure the first data is a return so maps with no sprites can use that ROM.DATA[(0x1F0001 + DataOffset)] = 0xFF; ROM.DATA[(0x1F0000 + DataOffset)] = 0xFF; int emptyPointer = 0x0000; int dataPos = (0x1F0002 + DataOffset); //int dataPos = 0x4CB42; int beginningPointers = ConstantsReader.GetAddress("overworldSpritesBegining"); int zeldaPointers = ConstantsReader.GetAddress("overworldSpritesZelda"); int agahnimPointers = ConstantsReader.GetAddress("overworldSpritesAgahnim"); for (int i = 0; i < 64; i++) { if (roomSpritesBeginning[i].Count != 0) { int snesaddr = Addresses.pctosnes(dataPos); ROM.DATA[beginningPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[beginningPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); foreach (Room_Sprite spr in roomSpritesBeginning[i]) { byte b1 = spr.y; byte b2 = spr.x; byte b3 = spr.id; ROM.DATA[dataPos++] = b1; ROM.DATA[dataPos++] = b2; ROM.DATA[dataPos++] = b3; } //add FF to end the room ROM.DATA[dataPos++] = 0xFF; if (dataPos >= ((0x1F1200 + DataOffset))) { Console.WriteLine("Too many Overworld sprites !"); break; } } else { int snesaddr = Addresses.pctosnes(emptyPointer); ROM.DATA[beginningPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[beginningPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); } } for (int i = 0; i < 143; i++) { if (roomSpritesZelda[i].Count != 0) { int snesaddr = Addresses.pctosnes(dataPos); ROM.DATA[zeldaPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[zeldaPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); foreach (Room_Sprite spr in roomSpritesZelda[i]) { byte b1 = spr.y; byte b2 = spr.x; byte b3 = spr.id; ROM.DATA[dataPos++] = b1; ROM.DATA[dataPos++] = b2; ROM.DATA[dataPos++] = b3; } //add FF to end the room ROM.DATA[dataPos++] = 0xFF; if (dataPos >= (0x1F1200 + DataOffset)) { Console.WriteLine("Too many Overworld sprites ! (Zelda)"); break; } } else { int snesaddr = Addresses.pctosnes(emptyPointer); ROM.DATA[zeldaPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[zeldaPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); } } for (int i = 0; i < 143; i++) { if (roomSpritesAgahnim[i].Count != 0) { int snesaddr = Addresses.pctosnes(dataPos); ROM.DATA[agahnimPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[agahnimPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); foreach (Room_Sprite spr in roomSpritesAgahnim[i]) { byte b1 = spr.y; byte b2 = spr.x; byte b3 = spr.id; ROM.DATA[dataPos++] = b1; ROM.DATA[dataPos++] = b2; ROM.DATA[dataPos++] = b3; } //add FF to end the room ROM.DATA[dataPos++] = 0xFF; if (dataPos >= (0x1F1200 + DataOffset)) { Console.WriteLine("Too many Overworld sprites ! (Agah) room : " + i); break; } } else { int snesaddr = Addresses.pctosnes(emptyPointer); ROM.DATA[agahnimPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[agahnimPointers + (i * 2)] = (byte)((snesaddr) & 0xFF); } } }
public static void readAllText() { int maxMessage = 0; int pos = 0xE0000; int msgid = 0; while (true) { messages.Add(""); messagesPos[msgid] = pos; messages[msgid] = ""; byte byteRead = ROM.DATA[pos]; if (byteRead == 0xFF) { break; } while (byteRead != 0x7F) //7F = end of string { if (byteRead == 0x80) { pos = 0x75F40; byteRead = ROM.DATA[pos]; } if (getTextCharacter(byteRead, msgid)) { pos++; } //Commands else if (byteRead == 0x67) // $67[NextPic] command { messages[msgid] += "[PIC]"; pos++; } else if (byteRead == 0x68) //$68[Choose] command { messages[msgid] += "[CHS]"; pos++; } else if (byteRead == 0x69) //$69[Item] command(for waterfall of wishing) { messages[msgid] += "[ITM]"; pos++; } else if (byteRead == 0x6A) //$6A[Name] command(insert's player's name) { messages[msgid] += "[NAM]"; pos++; } else if (byteRead == 0x6B) //$6B[Window XX] command(takes next byte as argument) { messages[msgid] += "[WND="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x6C) // $6C[Number XX] command(takes next byte as argument) { messages[msgid] += "[NBR="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x6D) // $6D[Position XX] command(takes next byte as argument) { messages[msgid] += "[POS="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x6E) //$6E[ScrollSpd XX] command(takes next byte as argument) { messages[msgid] += "[SSP="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x6F) //$6F[SelChng] command { messages[msgid] += "[SCH]"; pos++; } else if (byteRead == 0x70) //$70 (Crash) { messages[msgid] += "[REM]"; pos++; } else if (byteRead == 0x71) //$71[Choose2] command { messages[msgid] += "[CH1]"; pos++; } else if (byteRead == 0x72) //$71[Choose3] command { messages[msgid] += "[CH2]"; pos++; } else if (byteRead == 0x73) //$73[SCROLL] command { messages[msgid] += "[SCL]"; pos++; } else if (byteRead == 0x74) //$74[1] command(aka[Line1]) { messages[msgid] += "[LN1]"; pos++; } else if (byteRead == 0x75) //$75[1] command(aka[Line2]) { messages[msgid] += "[LN2]"; pos++; } else if (byteRead == 0x76) //$76[1] command(aka[Line3]) { messages[msgid] += "[LN3]"; pos++; } else if (byteRead == 0x77) //$77[Color XX] command(takes next byte as argument) { messages[msgid] += "[COL="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x78) //$78[Wait XX] command(takes next byte as argument) { messages[msgid] += "[WAI="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x79) //$79[Sound XX] command(takes next byte as argument) { messages[msgid] += "[SND="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x7A) //$7A[Speed XX] command(takes next byte as argument) { messages[msgid] += "[SPD="; pos++; byteRead = ROM.DATA[pos]; messages[msgid] += byteRead.ToString("X2") + "]"; pos++; } else if (byteRead == 0x7E) //$7A[Speed XX] command(takes next byte as argument) { messages[msgid] += "[WFK]"; pos++; } else if (byteRead == 0x80) { pos++; break; } else if (byteRead >= 0x88 && byteRead <= 0xF9) { //Dictionary byte dictionaryIndex = (byte)(byteRead - 0x88); byte a0 = 0x0E; byte a1 = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 1]; byte a2 = ROM.DATA[0x74703 + (dictionaryIndex * 2)]; int dictionaryPos = Addresses.snestopc(((a0 << 16) | (a1 << 8) | (a2))); a0 = 0x0E; a1 = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 3]; a2 = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 2]; int dictionaryNextPos = Addresses.snestopc(((a0 << 16) | (a1 << 8) | (a2))); byte length = (byte)(dictionaryNextPos - dictionaryPos); for (int i = 0; i < length; i++) { getTextCharacter(ROM.DATA[dictionaryPos + i], msgid); } pos++; } else { //Console.WriteLine(byteRead.ToString("X2")); break; } byteRead = ROM.DATA[pos]; if (pos >= 0xE8000) { maxMessage = msgid; break; } continue; } if (pos >= 0xE8000) { maxMessage = msgid; break; } pos++; msgid++; byteRead = ROM.DATA[pos]; } }
public void LoadOverworldItems() { roomPotSave[] items = JsonConvert.DeserializeObject <roomPotSave[]>(File.ReadAllText(path + @"//Overworld//Items//Items.json")); List <roomPotSave>[] roomItems = new List <roomPotSave> [128]; for (int i = 0; i < 128; i++) { roomItems[i] = new List <roomPotSave>(); for (int j = 0; j < items.Length; j++) { if (i == items[j].roomMapId) { roomItems[i].Add(items[j]); } } } ROM.DATA[(0x1F1201 + DataOffset)] = 0xFF; ROM.DATA[(0x1F1202 + DataOffset)] = 0xFF; short emptyPointer = 0x1201; int dataPos = (0x1F1203 + DataOffset); int pointeraddr = ConstantsReader.GetAddress("overworldItemsPointers"); for (int i = 0; i < 128; i++) { if (roomItems[i].Count != 0) { int snesaddr = Addresses.pctosnes(dataPos); ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF); foreach (roomPotSave item in roomItems[i]) { //Console.WriteLine(item.x); short mapPos = (short)(((item.y << 6) + item.x) << 1); byte b1 = (byte)((mapPos >> 8)); //1111 1111 0000 0000 byte b2 = (byte)(mapPos & 0xFF); //0000 0000 1111 1111 byte b3 = (byte)(item.id); ROM.DATA[dataPos++] = b2; ROM.DATA[dataPos++] = b1; ROM.DATA[dataPos++] = b3; } ROM.DATA[dataPos++] = 0xFF; ROM.DATA[dataPos] = 0xFF; if (dataPos >= (0x1F2800 + DataOffset)) { Console.WriteLine("Too many Overworld items !"); break; } dataPos++; } else { int snesaddr = Addresses.pctosnes(emptyPointer); ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF); //Save Empty Pointer } } }
public void loadOverworldOverlays() { //first one == 0xFF 0xFF for the empty int dataPos = ConstantsReader.GetAddress("overlayNewCode"); //empty pointer = overlayNewCode int emptyPos = ConstantsReader.GetAddress("overlayNewCode");; ROM.DATA[dataPos++] = 0xFF; ROM.DATA[dataPos++] = 0xFF; List <OverlayData>[] overlaysData = JsonConvert.DeserializeObject <List <OverlayData>[]>(File.ReadAllText(path + @"//Overworld//Overlays.json")); int pointeraddr = ConstantsReader.GetAddress("overlayPointers"); for (int i = 0; i < 128; i++) { if (vanillaOverlays[i] == true) { int snesaddr = Addresses.pctosnes(dataPos); ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF); // Format: iiiipppp pppppppp iiiiiiii - p = position, i = tile id foreach (OverlayData od in overlaysData[i]) { short pos = (short)((((od.y * 64) + od.x)) << 1); byte b1 = (byte)((pos & 0xFF00) >> 8); byte b2 = (byte)((pos & 0x00FF)); byte b3 = (byte)((od.tileId & 0xFF00) >> 8); byte b4 = (byte)(od.tileId & 0xFF); ROM.DATA[dataPos++] = b2; ROM.DATA[dataPos++] = b1; ROM.DATA[dataPos++] = b4; ROM.DATA[dataPos++] = b3; } ROM.DATA[dataPos++] = 0xFF; ROM.DATA[dataPos++] = 0xFF; } else { int snesaddr = Addresses.pctosnes(emptyPos); ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF); } } /*ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF); * ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF); * foreach (roomPotSave item in roomItems[i]) * { * * //Console.WriteLine(item.x); * * short mapPos = (short)(((item.y << 6) + item.x) << 1); * * byte b1 = (byte)((mapPos >> 8));//1111 1111 0000 0000 * byte b2 = (byte)(mapPos & 0xFF);//0000 0000 1111 1111 * byte b3 = (byte)(item.id); * * ROM.DATA[dataPos++] = b2; * ROM.DATA[dataPos++] = b1; * ROM.DATA[dataPos++] = b3; * } * ROM.DATA[dataPos++] = 0xFF; * ROM.DATA[dataPos] = 0xFF; * if (dataPos >= (0x1F2800 + DataOffset)) * { * Console.WriteLine("Too many Overworld items !"); * break; * } * dataPos++; * * } * else * { * int snesaddr = Addresses.pctosnes(emptyPointer); * ROM.DATA[pointeraddr + (i * 2) + 1] = (byte) ((snesaddr >> 8) & 0xFF); * ROM.DATA[pointeraddr + (i * 2)] = (byte) ((snesaddr) & 0xFF); * //Save Empty Pointer * }*/ }
public int getLongPointerSnestoPc(int pos) { int p = (ROM.DATA[pos + 2] << 16) + (ROM.DATA[pos + 1] << 8) + (ROM.DATA[pos]); return(Addresses.snestopc(p)); }
public void writeOverworldSprites(string path) { if (!Directory.Exists(path + "Overworld//Sprites")) { Directory.CreateDirectory(path + "Overworld//Sprites"); } List <Room_Sprite> sprites = new List <Room_Sprite>(); int spritesAddress = ConstantsReader.GetAddress("overworldSpritesBegining"); //09 bank ? Need to check if HM change that for (int i = 0; i < 64; i++) { if (all_maps[i].largeMap == true) { if (mapParent[i] != (byte)i) { continue; } } int sprite_address_snes = (09 << 16) + (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) + ROM.DATA[spritesAddress + (i * 2)]; int sprite_address = Addresses.snestopc(sprite_address_snes); while (true) { byte b1 = ROM.DATA[sprite_address]; byte b2 = ROM.DATA[sprite_address + 1]; byte b3 = ROM.DATA[sprite_address + 2]; if (b1 == 0xFF) { break; } sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0)); sprite_address += 3; } } File.WriteAllText(path + "Overworld//Sprites//Beginning Sprites.json", JsonConvert.SerializeObject(sprites)); sprites.Clear(); spritesAddress = ConstantsReader.GetAddress("overworldSpritesZelda"); for (int i = 0; i < 143; i++) { if (all_maps[i].largeMap == true) { if (mapParent[i] != (byte)i) { continue; } } int sprite_address_snes = (09 << 16) + (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) + ROM.DATA[spritesAddress + (i * 2)]; int sprite_address = Addresses.snestopc(sprite_address_snes); while (true) { byte b1 = ROM.DATA[sprite_address]; byte b2 = ROM.DATA[sprite_address + 1]; byte b3 = ROM.DATA[sprite_address + 2]; if (b1 == 0xFF) { break; } sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0)); sprite_address += 3; } } File.WriteAllText(path + "Overworld//Sprites//ZeldaRescued Sprites.json", JsonConvert.SerializeObject(sprites)); sprites.Clear(); spritesAddress = ConstantsReader.GetAddress("overworldSpritesAgahnim"); for (int i = 0; i < 143; i++) { if (all_maps[i].largeMap == true) { if (mapParent[i] != (byte)i) { continue; } } int sprite_address_snes = (09 << 16) + (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) + ROM.DATA[spritesAddress + (i * 2)]; int sprite_address = Addresses.snestopc(sprite_address_snes); while (true) { byte b1 = ROM.DATA[sprite_address]; byte b2 = ROM.DATA[sprite_address + 1]; byte b3 = ROM.DATA[sprite_address + 2]; if (b1 == 0xFF) { break; } sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0)); sprite_address += 3; } } File.WriteAllText(path + "Overworld//Sprites//AgahnimDefeated Sprites.json", JsonConvert.SerializeObject(sprites)); }
public void writeOverlays(string path) { for (int index = 0; index < 128; index++) { overlaysDatas[index] = new List <OverlayData>(); //overlayPointers int addr = (ConstantsReader.GetAddress("overlayPointersBank") << 16) + (ROM.DATA[ConstantsReader.GetAddress("overlayPointers") + (index * 2) + 1] << 8) + ROM.DATA[ConstantsReader.GetAddress("overlayPointers") + (index * 2)]; addr = Addresses.snestopc(addr); int a = 0; int x = 0; int sta = 0; //16-bit mode : //A9 (LDA #$) //A2 (LDX #$) //8D (STA $xxxx) //9D (STA $xxxx ,x) //8F (STA $xxxxxx) //1A (INC A) //4C (JMP) //60 (END) byte b = 0; while (b != 0x60) { b = ROM.DATA[addr]; if (b == 0xFF) { break; } else if (b == 0xA9) //LDA #$xxxx (Increase addr+3) { a = (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; addr += 3; continue; } else if (b == 0xA2) //LDX #$xxxx (Increase addr+3) { x = (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; addr += 3; continue; } else if (b == 0x8D) //STA $xxxx (Increase addr+3) { sta = (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; //draw tile at sta position //Console.WriteLine("Draw Tile" + a + " at " + sta.ToString("X4")); //64 sta = sta & 0x1FFF; int yp = ((sta / 2) / 0x40); int xp = (sta / 2) - (yp * 0x40); overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a)); addr += 3; continue; } else if (b == 0x9D) //STA $xxxx, x (Increase addr+3) { sta = (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; //draw tile at sta,X position //Console.WriteLine("Draw Tile" + a + " at " + (sta + x).ToString("X4")); int stax = (sta & 0x1FFF) + x; int yp = ((stax / 2) / 0x40); int xp = (stax / 2) - (yp * 0x40); overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a)); addr += 3; continue; } else if (b == 0x8F) //STA $xxxxxx (Increase addr+4) { sta = (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; //draw tile at sta,X position //Console.WriteLine("Draw Tile" + a + " at " + (sta + x).ToString("X4")); int stax = (sta & 0x1FFF) + x; int yp = ((stax / 2) / 0x40); int xp = (stax / 2) - (yp * 0x40); overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a)); addr += 4; continue; } else if (b == 0x1A) //INC A (Increase addr+1) { a += 1; addr += 1; continue; } else if (b == 0x4C) //JMP $xxxx (move addr to the new address) { addr = (ConstantsReader.GetAddress("overlayPointersBank") << 16) + (ROM.DATA[addr + 2] << 8) + ROM.DATA[addr + 1]; addr = Addresses.snestopc(addr); continue; } else if (b == 0x60) //RTS { break; //just to be sure } } } File.WriteAllText(path + "Overworld//Overlays.json", JsonConvert.SerializeObject(overlaysDatas)); }