Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ROM:080419A8 ; =============== S U B R O U T I N E =======================================
- ROM:080419A8
- ROM:080419A8 ; Attributes: bp-based frame
- ROM:080419A8
- ROM:080419A8 ; void __fastcall inheritance(void *magicNums, void *pEggBase)
- ROM:080419A8 inheritance ; CODE XREF: sub_8041FC4+28p
- ROM:080419A8
- ROM:080419A8 var_8 = -8
- ROM:080419A8 var_s4 = 4
- ROM:080419A8
- ROM:080419A8 PUSH {R4-R7,LR}
- ROM:080419AA MOV R7, R9
- ROM:080419AC MOV R6, R8
- ROM:080419AE PUSH {R6,R7}
- ROM:080419B0 SUB SP, SP, #0x14
- ROM:080419B2 MOV R9, R0
- ROM:080419B4 MOV R8, R1 ; r8 = eggBase
- ROM:080419B6 MOVS R5, #0 ; int i = 0
- ROM:080419B8 ADD R1, SP, #4 ; make pointer/local array for iv set (u8* (malloc(IV_SET))) ivArray
- ROM:080419BA ADD R7, SP, #0xC ; make pointer/local array for parents to inherit (u8* (malloc(IV_INHERIT)) parentArray
- ROM:080419BC ADDS R2, R1, #0 ; move current array pointer to r2(iv set array)
- ROM:080419BE
- ROM:080419BE fillIVArray ; CODE XREF: inheritance+22j
- ROM:080419BE ADDS R0, R2, R5 ; iv_array_pos = &ivArray + i, seek to desired pos
- ROM:080419C0 STRB R5, [R0] ; ivArray[i] = i
- ROM:080419C2 ADDS R0, R5, #1 ; for(i = 0; i < 6; ++i), increment here
- ROM:080419C4 LSLS R0, R0, #0x18 ; dumb typecasting
- ROM:080419C6 LSRS R5, R0, #0x18 ; dumb typecasting
- ROM:080419C8 CMP R5, #5 ; i < 6
- ROM:080419CA BLS fillIVArray ; this past for loop fills the local declared ivArray with u8 ivArray = {00, 01, 02, 03, 04, 05}
- ROM:080419CC MOVS R5, #0 ; i = 0
- ROM:080419CE ADDS R6, R1, #0 ; move current array pointer to r2(iv set array)
- ROM:080419D0
- ROM:080419D0 pickIVInherit ; CODE XREF: inheritance+52j
- ROM:080419D0 BL rand
- ROM:080419D4 MOV R1, SP ; save array base
- ROM:080419D6 ADDS R4, R1, R5 ; save the current position of the array
- ROM:080419D8 LSLS R0, R0, #0x10 ; dumb typecasting
- ROM:080419DA LSRS R0, R0, #0x10 ; dumb typecasting
- ROM:080419DC MOVS R1, #6 ; IV_SET
- ROM:080419DE SUBS R1, R1, R5 ; IV_SET - i
- ROM:080419E0 BL mod ; rand() % (IV_SET - i)
- ROM:080419E4 ADDS R0, R6, R0 ; &temp_iv_array + (rand() % (IV_SET - i)), seek to specific pos in u8 array
- ROM:080419E6 LDRB R0, [R0] ; grab that byte from the array pos
- ROM:080419E8 STRB R0, [R4] ; store that byte to the new array, in order(3 runs, r4 = r1 + r5, new_array = array_base + i)
- ROM:080419EA LDRB R1, [R4] ; set byte from current array pos as a2, basically pass the byte number of the inherited iv.(0-5)
- ROM:080419EC MOVS R0, R6 ; pointer to array base as a1
- ROM:080419EE BL doInheritanceCheck
- ROM:080419F2 ADDS R0, R5, #1 ; ++i
- ROM:080419F4 LSLS R0, R0, #0x18 ; i is apparently a u8? wtf gamefreak?
- ROM:080419F6 LSRS R5, R0, #0x18 ; gamefreak might actually be retarded
- ROM:080419F8 CMP R5, #2 ; i < 3
- ROM:080419FA BLS pickIVInherit
- ROM:080419FC MOVS R5, #0 ; i = 0
- ROM:080419FE MOVS R4, #1
- ROM:08041A00
- ROM:08041A00 pickParentInherit ; CODE XREF: inheritance+6Ej
- ROM:08041A00 BL rand
- ROM:08041A04 ADDS R1, R7, R5 ; parentArray[i]
- ROM:08041A06 LSLS R0, R0, #0x10 ; dumb typecasting
- ROM:08041A08 LSRS R0, R0, #0x10 ; dumb typecasting
- ROM:08041A0A ANDS R0, R4 ; rand() & 1
- ROM:08041A0C STRB R0, [R1] ; store 0/1(to represent parent to pull iv from) to current array pos
- ROM:08041A0E ADDS R0, R5, #1 ; ++i
- ROM:08041A10 LSLS R0, R0, #0x18 ; i is apparently a u8. wtf.
- ROM:08041A12 LSRS R5, R0, #0x18
- ROM:08041A14 CMP R5, #2 ; i < 3
- ROM:08041A16 BLS pickParentInherit
- ROM:08041A18 MOVS R5, #0 ; i = 0
- ROM:08041A1A
- ROM:08041A1A writeBackInheritance ; CODE XREF: inheritance+162j
- ROM:08041A1A MOV R1, SP ; base of array with ivs to inherit
- ROM:08041A1C ADDS R0, R1, R5 ; ivArray[i]
- ROM:08041A1E LDRB R0, [R0] ; *ivArray[i]
- ROM:08041A20 CMP R0, #5 ; if i is 0-5, do iv write. if greater, there's an error. return.
- ROM:08041A22 BHI return ; jumptable 08041A2C default case
- ROM:08041A24 LSLS R0, R0, #2 ; align for switch based on iv number
- ROM:08041A26 LDR R1, =jpt_8041A2C
- ROM:08041A28 ADDS R0, R0, R1
- ROM:08041A2A LDR R0, [R0] ; get pc to jump to
- ROM:08041A2C MOV PC, R0 ; switch 6 cases
- ROM:08041A2C ; ---------------------------------------------------------------------------
- ROM:08041A2E DCW 0
- ROM:08041A30 off_8041A30 DCD jpt_8041A2C ; DATA XREF: inheritance+7Er
- ROM:08041A34 jpt_8041A2C DCD HP_IV ; DATA XREF: inheritance+7Eo
- ROM:08041A34 ; inheritance:off_8041A30o
- ROM:08041A34 DCD ATK_IV ; jump table for switch statement
- ROM:08041A34 DCD DEF_IV
- ROM:08041A34 DCD SPA_IV
- ROM:08041A34 DCD SPD_IV
- ROM:08041A34 DCD SPE_IV
- ROM:08041A4C ; ---------------------------------------------------------------------------
- ROM:08041A4C
- ROM:08041A4C HP_IV ; CODE XREF: inheritance+84j
- ROM:08041A4C ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041A4C ADDS R0, R7, R5 ; jumptable 08041A2C case 0
- ROM:08041A4E LDRB R1, [R0]
- ROM:08041A50 LSLS R0, R1, #2
- ROM:08041A52 ADDS R0, R0, R1
- ROM:08041A54 LSLS R0, R0, #4
- ROM:08041A56 ADD R0, R8
- ROM:08041A58 MOVS R1, #0x27
- ROM:08041A5A BL getPKMStat
- ROM:08041A5E ADD R2, SP, #0x10
- ROM:08041A60 STRB R0, [R2]
- ROM:08041A62 MOV R0, R9
- ROM:08041A64 MOVS R1, #0x27
- ROM:08041A66 BL writeIVToEgg
- ROM:08041A6A B return ; jumptable 08041A2C default case
- ROM:08041A6C ; ---------------------------------------------------------------------------
- ROM:08041A6C
- ROM:08041A6C ATK_IV ; CODE XREF: inheritance+84j
- ROM:08041A6C ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041A6C ADD R4, SP, #0x10
- ROM:08041A6E ADDS R0, R7, R5
- ROM:08041A70 LDRB R1, [R0]
- ROM:08041A72 LSLS R0, R1, #2
- ROM:08041A74 ADDS R0, R0, R1
- ROM:08041A76 LSLS R0, R0, #4
- ROM:08041A78 ADD R0, R8
- ROM:08041A7A MOVS R1, #0x28
- ROM:08041A7C BL getPKMStat
- ROM:08041A80 STRB R0, [R4]
- ROM:08041A82 MOV R0, R9
- ROM:08041A84 MOVS R1, #0x28
- ROM:08041A86 B IV_WRITE
- ROM:08041A88 ; ---------------------------------------------------------------------------
- ROM:08041A88
- ROM:08041A88 DEF_IV ; CODE XREF: inheritance+84j
- ROM:08041A88 ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041A88 ADD R4, SP, #0x10 ; jumptable 08041A2C case 2
- ROM:08041A8A ADDS R0, R7, R5 ; parentArray[i]
- ROM:08041A8C LDRB R1, [R0] ; *parentArray[i]
- ROM:08041A8E LSLS R0, R1, #2 ; 0 * 4 or 1 * 4 depending on which parent
- ROM:08041A90 ADDS R0, R0, R1 ; 4 or 5
- ROM:08041A92 LSLS R0, R0, #4
- ROM:08041A94 ADD R0, R8 ; eggBase + parentIV
- ROM:08041A96 MOVS R1, #0x29 ; pkm field to write
- ROM:08041A98 BL getPKMStat
- ROM:08041A9C STRB R0, [R4]
- ROM:08041A9E MOV R0, R9
- ROM:08041AA0 MOVS R1, #0x29
- ROM:08041AA2 B IV_WRITE
- ROM:08041AA4 ; ---------------------------------------------------------------------------
- ROM:08041AA4
- ROM:08041AA4 SPA_IV ; CODE XREF: inheritance+84j
- ROM:08041AA4 ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041AA4 ADD R4, SP, #0x10 ; jumptable 08041A2C case 3
- ROM:08041AA6 ADDS R0, R7, R5
- ROM:08041AA8 LDRB R1, [R0]
- ROM:08041AAA LSLS R0, R1, #2
- ROM:08041AAC ADDS R0, R0, R1
- ROM:08041AAE LSLS R0, R0, #4
- ROM:08041AB0 ADD R0, R8
- ROM:08041AB2 MOVS R1, #0x2A
- ROM:08041AB4 BL getPKMStat
- ROM:08041AB8 STRB R0, [R4]
- ROM:08041ABA MOV R0, R9
- ROM:08041ABC MOVS R1, #0x2A
- ROM:08041ABE B IV_WRITE
- ROM:08041AC0 ; ---------------------------------------------------------------------------
- ROM:08041AC0
- ROM:08041AC0 SPD_IV ; CODE XREF: inheritance+84j
- ROM:08041AC0 ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041AC0 ADD R4, SP, #0x10 ; jumptable 08041A2C case 4
- ROM:08041AC2 ADDS R0, R7, R5
- ROM:08041AC4 LDRB R1, [R0]
- ROM:08041AC6 LSLS R0, R1, #2
- ROM:08041AC8 ADDS R0, R0, R1
- ROM:08041ACA LSLS R0, R0, #4
- ROM:08041ACC ADD R0, R8
- ROM:08041ACE MOVS R1, #0x2B
- ROM:08041AD0 BL getPKMStat
- ROM:08041AD4 STRB R0, [R4]
- ROM:08041AD6 MOV R0, R9
- ROM:08041AD8 MOVS R1, #0x2B
- ROM:08041ADA
- ROM:08041ADA IV_WRITE ; CODE XREF: inheritance+DEj
- ROM:08041ADA ; inheritance+FAj ...
- ROM:08041ADA MOVS R2, R4
- ROM:08041ADC BL writeIVToEgg
- ROM:08041AE0 B return ; jumptable 08041A2C default case
- ROM:08041AE2 ; ---------------------------------------------------------------------------
- ROM:08041AE2
- ROM:08041AE2 SPE_IV ; CODE XREF: inheritance+84j
- ROM:08041AE2 ; DATA XREF: inheritance:jpt_8041A2Co
- ROM:08041AE2 ADD R4, SP, #0x10 ; jumptable 08041A2C case 5
- ROM:08041AE4 ADDS R0, R7, R5
- ROM:08041AE6 LDRB R1, [R0]
- ROM:08041AE8 LSLS R0, R1, #2
- ROM:08041AEA ADDS R0, R0, R1
- ROM:08041AEC LSLS R0, R0, #4
- ROM:08041AEE ADD R0, R8
- ROM:08041AF0 MOVS R1, #0x2C
- ROM:08041AF2 BL getPKMStat
- ROM:08041AF6 STRB R0, [R4]
- ROM:08041AF8 MOV R0, R9
- ROM:08041AFA MOVS R1, #0x2C
- ROM:08041AFC MOVS R2, R4
- ROM:08041AFE BL writeIVToEgg
- ROM:08041B02
- ROM:08041B02 return ; CODE XREF: inheritance+7Aj
- ROM:08041B02 ; inheritance+C2j ...
- ROM:08041B02 ADDS R0, R5, #1 ; ++i
- ROM:08041B04 LSLS R0, R0, #0x18
- ROM:08041B06 LSRS R5, R0, #0x18
- ROM:08041B08 CMP R5, #2 ; i < 3
- ROM:08041B0A BLS writeBackInheritance
- ROM:08041B0C ADD SP, SP, #0x14
- ROM:08041B0E POP {R3,R4}
- ROM:08041B10 MOV R8, R3
- ROM:08041B12 MOV R9, R4
- ROM:08041B14 POP {R4-R7}
- ROM:08041B16 POP {R0}
- ROM:08041B18 BX R0
- ROM:08041B18 ; End of function inheritance
Advertisement