protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // --- Update Table Addr --- stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801cca98), SeekOrigin.Begin); // mulli r0,r3,0x38 -> mulli r0,r3,0x04 stream.Write(PowerPcAsm.mulli(0, 3, 0x04)); // r3 <- 0x80428e50 -> r3 <- tableAddr stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); stream.Seek(0x4, SeekOrigin.Current); // lwz r3,0x10(r3) -> lwz r3,0x0(r3) stream.Write(PowerPcAsm.lwz(3, 0, 3)); // --- ASM hack: Use the rule set from map instead of from global setting --- var ruleSetFromMapRoutine = allocate(writeRuleSetFromMapRoutine(addressMapper, (VAVAddr)0), "writeRuleSetFromMapRoutine"); stream.Seek(addressMapper.toFileAddress(ruleSetFromMapRoutine), SeekOrigin.Begin); stream.Write(writeRuleSetFromMapRoutine(addressMapper, ruleSetFromMapRoutine)); // re-write the routine again since now we know where it is located in the main dol var virtualPos = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8007e13c); stream.Seek(addressMapper.toFileAddress(virtualPos), SeekOrigin.Begin); // lha r3,0x3c(r30) -> bl ruleSetFromMapRoutine stream.Write(PowerPcAsm.bl(virtualPos, ruleSetFromMapRoutine)); // cmpwi r23,0x0 -> lha r3,0x3c(r30) stream.Write(PowerPcAsm.lha(3, 0x3c, 30)); // lha r0,0x28(r30) -> cmpwi r23,0x0 stream.Write(PowerPcAsm.cmpwi(23, 0x0)); // stw r25,0x53f4(r29) -> lha r0,0x28(r30) stream.Write(PowerPcAsm.lha(0, 0x28, 30)); }
protected override bool readIsVanilla(EndianBinaryReader stream, AddressMapper addressMapper) { stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801cca50), SeekOrigin.Begin); var opcode = stream.ReadUInt32(); // mulli r0,r3,0x38 return(opcode == PowerPcAsm.mulli(0, 3, 0x38)); }
protected override bool readIsVanilla(EndianBinaryReader stream, AddressMapper addressMapper) { stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021210c), SeekOrigin.Begin); var opcode = stream.ReadUInt32(); // mulli r4,r0,0x24 return(opcode == PowerPcAsm.mulli(4, 0, 0x24)); }
private List <UInt32> writeGetDescriptionForCustomSquareRoutine(AddressMapper addressMapper, VAVAddr routineStartAddress) { var asm = new List <UInt32>(); var gameUiTextGetString = addressMapper.toVersionAgnosticAddress((BSVAddr)0x800f78dc); var gameUiTextGetCardMsg = addressMapper.toVersionAgnosticAddress((BSVAddr)0x800f837c); var gameBoard = PowerPcAsm.make16bitValuePair((UInt32)addressMapper.toVersionAgnosticAddress((BSVAddr)0x8054d018)); asm.Add(PowerPcAsm.lis(7, gameBoard.upper16Bit)); // asm.Add(PowerPcAsm.addi(7, 7, gameBoard.lower16Bit)); // r7 <- start of gameboard table containing all squares asm.Add(PowerPcAsm.mulli(8, 24, 0x54)); // r8 <- squareId * 0x54 (the size of each square) asm.Add(PowerPcAsm.add(6, 7, 8)); // r6 <- the current square asm.Add(PowerPcAsm.lbz(8, 0x4d, 6)); // r8 <- square.squareType asm.Add(PowerPcAsm.cmpwi(8, 0x2e)); // if(square.squareType == 0x2e) asm.Add(PowerPcAsm.bne(3)); // { asm.Add(PowerPcAsm.lbz(4, 0x18, 6)); // r4 <- square.district_color asm.Add(PowerPcAsm.b(routineStartAddress, asm.Count, gameUiTextGetCardMsg)); // goto Game::uitext::get_card_message(r4) // } asm.Add(PowerPcAsm.li(6, 0x0)); // \ asm.Add(PowerPcAsm.li(7, 0x0)); // | No message arguments asm.Add(PowerPcAsm.li(8, 0x0)); // / asm.Add(PowerPcAsm.b(routineStartAddress, asm.Count, gameUiTextGetString)); // goto Game::uitext::get_string(r4, 0, 0, 0) return(asm); }
/// <summary> /// Hijack the LoadBoard() routine. Intercept the moment when the (now compressed) ventureCardTable is passed on to the InitChanceBoard() routine. /// Call the decompressVentureCardTable routine and pass the resulting decompressed ventureCardTable (located at ventureCardDecompressedTableAddr) to the InitChanceBoard() routine instead. /// </summary> protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var ventureCardCompressedTableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)ventureCardCompressedTableAddr); // Allocate working memory space for a single uncompressed venture card table which is passed on for the game to use. We will use it to store the result of decompressing a compressed venture card table var ventureCardDecompressedTableAddr = allocate(new byte[130], "VentureCardReservedMemoryForDecompressedTable"); var ventureCardDecompressTableRoutine = allocate(writeSubroutine(ventureCardDecompressedTableAddr), "DecompressVentureCardSubroutine"); // cmplwi r24,0x29 -> cmplwi r24,ventureCardTableCount-1 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8007e104), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmplwi(24, (UInt16)(tableRowCount - 1))); // mulli r0,r24,0x82 -> mulli r0,r24,0x10 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8007e11c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 24, 0x10)); // r4 <- 0x80410648 -> r4 <- ventureCardCompressedTableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8007e120), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Seek(4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // li r5,0x0 -> bl ventureCardDecompressTableRoutine stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8007e130), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl((UInt32)addressMapper.toVersionAgnosticAddress((BSVAddr)0x8007e130), (UInt32)ventureCardDecompressTableRoutine)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // subi r30,r30,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d0dc), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r30,0x12 -> cmpwi r30,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d0e8), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(30, (short)(tableRowCount))); // li r0,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d160), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r0,r0,0x24 -> mulli r0,r0,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d16c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 0, 0x04)); // r4 <- 804363c8 -> r4 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d170), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // mulli r3,r30,0x24 -> mulli r3,r30,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d178), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(3, 30, 0x04)); // subi r31,r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211c04), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r31,0x12 -> cmpwi r31,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211c10), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, (short)(tableRowCount))); // li r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211c88), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r0,r3,0x24 -> mulli r0,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211c94), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 3, 0x04)); // r4 <- 804363c8 -> r4 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211c98), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // mulli r3,r31,0x24 -> mulli r3,r31,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211ca0), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(3, 31, 0x04)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var mapIcons = writeIconStrings(mapDescriptors); Dictionary <string, VAVAddr> iconTableMap; VAVAddr iconTableAddr = writeIconTable(mapIcons, out iconTableMap); VAVAddr mapIconPointerTable = writeMapIconPointerTable(mapDescriptors, iconTableMap); ushort iconCount = (ushort)iconTableMap.Count; short tableRowCount = (short)mapDescriptors.Count; PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)iconTableAddr); PowerPcAsm.Pair16Bit w = PowerPcAsm.make16bitValuePair((UInt32)mapIconPointerTable); // note: To add custom icons, the following files need to be editted as well: // - ui_menu_19_00a.brlyt within game_sequence.arc and within game_sequence_wifi.arc // - ui_menu_19_00a_Tag_*.brlan within game_sequence.arc and within game_sequence_wifi.arc // custom map icon hack (change it that way that it will call the GetMapDifficulty routine instead of the GetMapOrigin routine // the GetMapDifficulty routine is mostly unused by the game and we repurpose it to return the pointer to the pointer of the string of the map icon instead // then we go through all map icon pointer pointers and check if it is the same as the one retrieved. If it is then we make it visible, otherwise we set the visibility to false. var GetMapDifficulty = addressMapper.toVersionAgnosticAddress((BSVAddr)0x80211da4); // bl GetMapOrigin -> bl GetMapDifficulty var offset = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e77c); stream.Seek(addressMapper.toFileAddress(offset), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl(offset, GetMapDifficulty)); // cmpw r28,r30 -> cmpw r29,r30 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e790), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpw(29, 30)); // cmplwi r28,0x12 -> cmplwi r28,iconCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e7c0), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmplwi(28, iconCount)); // bl GetMapOrigin -> bl GetMapDifficulty offset = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e8a4); stream.Seek(addressMapper.toFileAddress(offset), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl(offset, GetMapDifficulty)); // cmpw r29,r28 -> cmpw r30,r28 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e8b8), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpw(30, 28)); // cmplwi r29,0x12 -> cmplwi r29,iconCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e8e8), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmplwi(29, iconCount)); // bl GetMapOrigin -> bl GetMapDifficulty offset = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e824); stream.Seek(addressMapper.toFileAddress(offset), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl(offset, GetMapDifficulty)); // cmplwi r28,0x12 -> cmplwi r28,iconCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e84c), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmplwi(28, iconCount)); // r29 <- 0x8047f5c0 -> r29 <- iconTableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e780), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(29, v.upper16Bit)); stream.Seek(4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(29, 29, v.lower16Bit)); // r30 <- 0x8047f5c0 -> r30 <- iconTableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e8a8), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(30, v.upper16Bit)); stream.Seek(4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(30, 30, v.lower16Bit)); // r30 <- 0x8047f5c0 -> r30 <- iconTableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e828), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(30, v.upper16Bit)); stream.Seek(4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(30, 30, v.lower16Bit)); // mr r3,r28 -> mr r3,r26 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e94c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mr(3, 26)); // mr r3,r28 -> mr r3,r26 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021e968), SeekOrigin.Begin); stream.Write(PowerPcAsm.mr(3, 26)); // Modify the GetMapDifficulty routine to retrieve the current map icon addr addr // subi r31,r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211dc8), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r31,0x12 -> cmpwi r31,tableRowCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211dd4), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, tableRowCount)); // li r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211e4c), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r4,r3,0x24 -> mulli r4,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211e58), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(4, 3, 0x04)); // r3 <- 804363c8 -> r3 <- mapIconPointerTable stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211e5c), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, w.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, w.lower16Bit)); // mulli r0,r31,0x24 -> mulli r0,r31,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211e64), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 31, 0x04)); // lwz r3,0x1c(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211e78), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); // --- Hack to make icons invisible which do not have a map --- // -- Init Maps in the map array with -1 -- var subroutineInitMapIdsForMapIcons = allocate(writeSubroutineInitMapIdsForMapIcons(addressMapper, VAVAddr.NullAddress), "SubroutineInitMapIdsForMapIcons"); stream.Seek(addressMapper.toFileAddress(subroutineInitMapIdsForMapIcons), SeekOrigin.Begin); stream.Write(writeSubroutineInitMapIdsForMapIcons(addressMapper, subroutineInitMapIdsForMapIcons)); // re-write the routine again since now we know where it is located in the main dol // increase the array size // rlwinm r3,r16,0x2,0x0,0x1d -> r3,r16,0x3,0x0,0x1d stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80187794), SeekOrigin.Begin); stream.Write(PowerPcAsm.rlwinm(3, 16, 0x3, 0x0, 0x1d)); var hijackAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8018779c); // cmpwi r3,0x0 -> bl subroutineInitMapIdsForMapIcons stream.Seek(addressMapper.toFileAddress(hijackAddr), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl(hijackAddr, subroutineInitMapIdsForMapIcons)); // mr r24,r3 -> cmpwi r3,0x0 stream.Write(PowerPcAsm.cmpwi(3, 0)); // increase the array size // rlwinm r3,r16,0x2,0x0,0x1d -> r3,r16,0x3,0x0,0x1d stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80187aa4), SeekOrigin.Begin); stream.Write(PowerPcAsm.rlwinm(3, 16, 0x3, 0x0, 0x1d)); hijackAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x80187aac); // cmpwi r3,0x0 -> bl subroutineInitMapIdsForMapIcons stream.Seek(addressMapper.toFileAddress(hijackAddr), SeekOrigin.Begin); stream.Write(PowerPcAsm.bl(hijackAddr, subroutineInitMapIdsForMapIcons)); // mr r24,r3 -> cmpwi r3,0x0 stream.Write(PowerPcAsm.cmpwi(3, 0)); // -- if a map id is -1, make the map icon invisible -- hijackAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e73c); var returnContinueAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e740); var returnMakeInvisibleAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e808); var subroutineMakeNoneMapIconsInvisible = allocate(writeSubroutineMakeNoneMapIconsInvisible(addressMapper, VAVAddr.NullAddress, returnContinueAddr, returnMakeInvisibleAddr), "SubroutineMakeNoneMapIconsInvisibleMultiplayer"); stream.Seek(addressMapper.toFileAddress(subroutineMakeNoneMapIconsInvisible), SeekOrigin.Begin); stream.Write(writeSubroutineMakeNoneMapIconsInvisible(addressMapper, subroutineMakeNoneMapIconsInvisible, returnContinueAddr, returnMakeInvisibleAddr)); // re-write the routine again since now we know where it is located in the main dol // lwz r0,0x184(r3) -> b subroutineMakeNoneMapIconsInvisible stream.Seek(addressMapper.toFileAddress(hijackAddr), SeekOrigin.Begin); stream.Write(PowerPcAsm.b(hijackAddr, subroutineMakeNoneMapIconsInvisible)); // -- if the map id is -1, do not check if it has been unlocked or not --- hijackAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e570); returnContinueAddr = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e574); var returnSkipMapUnlockedCheck = addressMapper.toVersionAgnosticAddress((BSVAddr)0x8021e5a8); var subroutineWriteSubroutineSkipMapUnlockCheck = allocate(writeSubroutineSkipMapUnlockCheck(addressMapper, VAVAddr.NullAddress, returnContinueAddr, returnSkipMapUnlockedCheck), "SubroutineWriteSubroutineSkipMapUnlockCheck"); stream.Seek(addressMapper.toFileAddress(subroutineWriteSubroutineSkipMapUnlockCheck), SeekOrigin.Begin); stream.Write(writeSubroutineSkipMapUnlockCheck(addressMapper, subroutineWriteSubroutineSkipMapUnlockCheck, returnContinueAddr, returnSkipMapUnlockedCheck)); // re-write the routine again since now we know where it is located in the main dol // or r3,r26,r26 -> b subroutineWriteSubroutineSkipMapUnlockCheck stream.Seek(addressMapper.toFileAddress(hijackAddr), SeekOrigin.Begin); stream.Write(PowerPcAsm.b(hijackAddr, subroutineWriteSubroutineSkipMapUnlockCheck)); // --- Various Map UI Fixes --- // -- if the map index is over the map array size, do not loop around to the first map index again -- // ble 0x80187e1c -> b 0x80187e1c stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80187dfc), SeekOrigin.Begin); stream.Write(PowerPcAsm.b(8)); // -- fix map selection going out of bounds in tour mode -- // bne 0x80188258 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80188230), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // --- Update Table Addr --- // mulli r0,r3,0x38 -> mulli r0,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801cca50), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 3, 0x04)); // r3 <- 0x80428e50 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801cca54), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // lwz r3,0x4(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801cca64), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // --- IsMapClear(int mapId,int normalMode,UserIndex userIndex) --- /* * // subi r31,r3,0x15 -> nop * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80210434), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); * // cmpwi r31,0x12 -> cmpwi r31,tableElementsCount * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80210440), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, (short)(tableRowCount))); * // subi r29,r31,0x15 -> nop * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80210504), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); * // cmpwi r29,0x12 -> cmpwi r29,tableElementsCount * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80210510), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(29, (short)(tableRowCount))); * // li r0,0x15 -> nop * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80210598), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); */ // mulli r0,r0,0x24 -> mulli r0,r0,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x802105a4), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 0, 0x04)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x802105a8), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r0,r29,0x24 -> mulli r0,r29,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x802105c4), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 29, 0x04)); // lwz r4,0x18(r3) -> lwz r4,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x802105d8), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(4, 0x0, 3)); // --- GetMapClearRank(int mapId,int normalMode) --- /* * // subi r31,r3,0x15 -> nop * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212074), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); * // cmpwi r31,0x12 -> cmpwi r31,tableElementsCount * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212080), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, (short)(tableRowCount))); * // li r0,0x15 -> nop * stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212100), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); */ // mulli r4,r0,0x24 -> mulli r4,r0,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021210c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(4, 0, 0x04)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212110), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r0,r31,0x24 -> mulli r0,r31,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212118), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 31, 0x04)); // lwz r3,0x18(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021212c), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // subi r30,r30,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d2b0), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r30,0x12 -> cmpwi r30,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d2bc), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(30, (short)(tableRowCount))); // li r0,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d334), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r5,r0,0x24 -> mulli r5,r0,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d340), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(5, 0, 0x04)); // r4 <- 804363c8 -> r4 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d344), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // mulli r0,r30,0x24 -> mulli r0,r30,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d350), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 30, 0x04)); // lwz r0,0x4(r4) -> lwz r0,0x4(r4) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d35c), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x0, 4)); // subi r31,r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211f90), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r31,0x12 -> cmpwi r31,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211f9c), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, (short)(tableRowCount))); // li r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212014), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r4,r3,0x24 -> mulli r4,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212020), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(4, 3, 0x04)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212024), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r0,r31,0x24 -> mulli r0,r31,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8021202c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 31, 0x04)); // lwz r3,0x4(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80212040), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // --- Game::GetMapFrbName --- // mulli r3,r3,0x38 -> mulli r3,r3,0x10 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccab0), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(3, 3, 0x10)); // r5 <- 0x80428e50 -> r5 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccab4), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(5, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(5, 5, v.lower16Bit)); // lwz r3,0x18(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccac8), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); // --- Game::GetMapMapNum --- // mulli r0,r3,0x38 -> mulli r0,r3,0x10 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccad0), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 3, 0x10)); // r4 <- 0x80428e50 -> r4 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccad4), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // lwz r0,0x18(r4) -> lwz r0,0x0(r4) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccae4), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x0, 4)); // lwz r0,0x1c(r4) -> lwz r0,0x4(r4) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccaf0), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x4, 4)); // lwz r0,0x20(r4) -> lwz r0,0x8(r4) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccb00), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x8, 4)); // lwz r0,0x24(r4) -> lwz r0,0xc(r4) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccb10), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0xc, 4)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { // hardcoded virtual address for the parameter table on how the Miis are being animated to play baseball in the background var bgSequenceMarioStadium = addressMapper.toVersionAgnosticAddress((BSVAddr)0x80428968); var tableAddr = writeTable(mapDescriptors, bgSequenceMarioStadium); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // --- Update Table Addr --- // mulli r0,r3,0x38 -> mulli r0,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccb70), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 3, 0x04)); // r3 <- 0x80428e50 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccb74), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // lwz r3,0x34(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x801ccb80), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // subi r30,r30,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d1c4), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r30,0x12 -> cmpwi r30,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d1d0), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(30, (short)(tableRowCount))); // li r0,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d248), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r4,r0,0x24 -> mulli r4,r0,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d254), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(4, 0, 0x04)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d258), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r0,r30,0x24 -> mulli r0,r30,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d260), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 30, 0x04)); // lwz r0,0x8(r3) -> lwz r0,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020d26c), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x0, 3)); // subi r31,r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211ce4), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r31,0x12 -> cmpwi r31,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211cf0), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(31, (short)(tableRowCount))); // li r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211d68), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r4,r3,0x24 -> mulli r4,r3,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211d74), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(4, 3, 0x04)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211d78), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r0,r31,0x24 -> mulli r0,r31,0x04 stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211d80), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 31, 0x04)); // lwz r3,0x8(r3) -> lwz r3,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211d94), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(3, 0x0, 3)); }
protected override void writeAsm(EndianBinaryWriter stream, AddressMapper addressMapper, List <MapDescriptor> mapDescriptors) { var tableRowCount = mapDescriptors.Count; var tableAddr = writeTable(mapDescriptors); PowerPcAsm.Pair16Bit v = PowerPcAsm.make16bitValuePair((UInt32)tableAddr); // subi r3,r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cec8), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r3,0x12 -> cmpwi r3,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020ced4), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(3, (short)(tableRowCount))); // li r0,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cf68), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r0,r3,0x24 -> mulli r0,r3,0x0c stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cee0), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 3, 0x0c)); // r3 <- 804363c8 -> r3 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cee4), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(3, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(3, 3, v.lower16Bit)); // mulli r3,r0,0x24 -> mulli r3,r0,0x0c stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cf74), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(3, 0, 0x0c)); // lwz r0,0xc(r3) -> lwz r0,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x8020cf8c), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x0, 3)); // subi r4,r4,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211af4), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // cmpwi r4,0x12 -> cmpwi r4,tableElementsCount stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211b00), SeekOrigin.Begin); stream.Write(PowerPcAsm.cmpwi(4, (short)(tableRowCount))); // li r3,0x15 -> nop stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211b94), SeekOrigin.Begin); stream.Write(PowerPcAsm.nop()); // mulli r0,r4,0x24 -> mulli r0,r4,0x0c stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211b0c), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(0, 4, 0x0c)); // r4 <- 804363c8 -> r4 <- tableAddr stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211b10), SeekOrigin.Begin); stream.Write(PowerPcAsm.lis(4, v.upper16Bit)); stream.Seek(0x4, SeekOrigin.Current); stream.Write(PowerPcAsm.addi(4, 4, v.lower16Bit)); // mulli r3,r3,0x24 -> mulli r3,r3,0x0c stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211ba0), SeekOrigin.Begin); stream.Write(PowerPcAsm.mulli(3, 3, 0x0c)); // lwz r0,0xc(r3) -> lwz r0,0x0(r3) stream.Seek(addressMapper.toFileAddress((BSVAddr)0x80211bb8), SeekOrigin.Begin); stream.Write(PowerPcAsm.lwz(0, 0x0, 3)); }