Platinum - 0x0201D30C routine (Great Marsh) study -------------------------- ARM7 code : 0201:D30C LDR R1, [PC, #4] | Load the value PC+4 into R1 0201:D30E MUL R1, R0 | R1 = R1*R0 0201:D310 ADD R0, R1, #1 | R0 = R1 + 1 0201:D312 BX LR | Branch to adress in LR and LR[0] indicates the operating mode (ARM or Thumb) 0201:D314 LDRH R5, [R4, #A] | Load register from memory (halfword) 0201:D316 LDR R7, [R0, #40] | Load register from memory 0201:D318 PUSH {R4-R5} | Push in stack 0201:D31A LDR R1, [PC, #30] | Load register from memory 0201:D31C MOV R4, #27 | Move register or constant 0201:D31E STR R0, [R1, #8] | Store register to memory 0201:D320 LDR R1, [PC, #2C] | Load register from memory 0201:D322 MOV R0, #1 | Move register or constant 0201:D324 STR R0, [R1, #0] | Store register to memory 0201:D326 LDR R1, [PC, #2C] | Load register from memory 0201:D328 LDR R3, [PC, #2C] | Load register from memory 0201:D32A LSL R4, R4, #4 | Logical shift left 0201:D32C SUB R2, R1, #4 | Subtract 0201:D32E LDR R5, [R2, #0] | Load register from memory 0201:D330 LSR R2, R5, #1E | Logical shift right 0201:D332 EOR R2, R5 | Exclusive OR 0201:D334 ADD R5, R2, #0 | Add 0201:D336 MUL R5, R3 | Multiply 0201:D338 ADD R2, R0, R5 | Add 0201:D33A ADD R0, R0, #1 | Add 0201:D33C STMIA R1!, {R2} | Store multiple, increment after 0201:D33E CMP R0, R4 | Compare 0201:D340 BLT #0201D32C | Branch lower than 0201:D342 LDR R1, [PC, #C] | Load register from memory 0201:D344 STR R0, [R1, #0] | Store register to memory 0201:D346 POP {R4-R5} | Pop from stack 0201:D348 BX LR Registers (before) : R0 = 00000E0B R4 = 00000000 R8 = 0000FFFF R12 = 038008CF R1 = 03806BF0 R5 = 00000070 R9 = 00000002 SP = 0380F944 R2 = 027FFC3C R6 = 00000002 R10 = 00000000 LR = 037F8434 R3 = 04000004 R7 = 0380F954 R11 = 00000000 PC = 037F8484 Registers (after) : R0 = 00000E0C R4 = 00000000 R8 = 0000FFFF R12 = 038008CF R1 = 03806BF0 R5 = 00000070 R9 = 00000002 SP = 0380F944 R2 = 027FFC3C R6 = 00000002 R10 = 00000000 LR = 037F8434 R3 = 04000004 R7 = 0380F954 R11 = 00000000 PC = 037F8484