private List <UInt32> writeRuleSetFromMapRoutine(AddressMapper addressMapper, VAVAddr routineStartAddress) { var Game_GetRuleFlag = addressMapper.toVersionAgnosticAddress((BSVAddr)0x801cca98); // precondition: r24 is mapId // precondition: r25 is global rule set which we are gonna use to store the linkreturn var asm = new List <UInt32>(); asm.Add(PowerPcAsm.mflr(25)); asm.Add(PowerPcAsm.mr(3, 24)); // r3 <- r24 asm.Add(PowerPcAsm.bl(routineStartAddress, asm.Count, Game_GetRuleFlag)); // r3 <- bl Game_GetRuleFlag(r3) asm.Add(PowerPcAsm.stw(3, 0x53f4, 29)); // gameRule <- r3 asm.Add(PowerPcAsm.mtlr(25)); asm.Add(PowerPcAsm.blr()); // return return(asm); }
private List <UInt32> writeSubroutineInitMapIdsForMapIcons(AddressMapper addressMapper, VAVAddr entryAddr) { var JUtility_memset = addressMapper.toVersionAgnosticAddress((BSVAddr)0x80004714); // precondition: r3 is newly created map icon array // r16 is the amount of map ids in the array (size / 4) // r24 is unused // postcondition: r24 is the map icon array var asm = new List <UInt32>(); asm.Add(PowerPcAsm.mflr(24)); // save the link register asm.Add(PowerPcAsm.li(4, -1)); // fill with 0xff asm.Add(PowerPcAsm.rlwinm(5, 16, 0x3, 0x0, 0x1d)); // get the size of the array asm.Add(PowerPcAsm.bl(entryAddr, asm.Count, JUtility_memset)); // call JUtility_memset(array*, 0xff, array.size) asm.Add(PowerPcAsm.mtlr(24)); // restore the link register asm.Add(PowerPcAsm.mr(24, 3)); // move array* to r24 asm.Add(PowerPcAsm.blr()); // return return(asm); }