• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

[ASM & Hex] Free RAM Locations

82
Posts
6
Years
  • Where can i find documentation on free RAM locations?

    I am currently trying to add new abilities. Here is one i am trying to add.

    Code:
    [CODE].text
    .align 2
    .thumb
    .thumb_func
    .global TurnOrderLoader
    .org 0x14CD8
    
    Main:
    	push {r4-r7, lr}
    	mov r7, r10
    	mov r6, r9
    	mov r5, r8
    	push {r5-r7}
    	add sp, #0x04
    	lsl r0, r0, #0x18
    	lsr r0, r0, #0x18
    	mov r9, r0
    	lsl r1, r1, #0x18
    	lsr r1, r1, #0x18
    	mov r10, r1
    	mov r0, #0x0
    	str r0, [sp, #0x0]
    
    #r9=UserBank
    #r10=TargetBank
    
    CheckTurn:
    	cmp r2, #0x0
    	bne BracketCalc
    PriorityCalc:
    	mov r0, r9
    	bl PriorityBL
    	lsl r0, r0, #0x18
    	asr r3, r0, #0x18
    	mov r8, r3
    	mov r0, r10
    	bl PriorityBL
    	lsl r0, r0, #0x18
    	asr r4, r0, #0x18
    	mov r3, r8
    	cmp r3, r4
    	beq BracketCalc
    	cmp r3, r4
    	bge Exit @FirstBankGoesFirst
    	mov r2, #0x1
    	str r2, [sp, #0x0]
    	b Exit @SecondBankGoesFirst
    BracketCalc:
    	mov r0, r9
    	bl BracketBL
    	mov r8, r0
    	mov r0, r10
    	bl BracketBL
    	mov r4, r0
    	mov r3, r8
    	cmp r3, r4
    	beq SpeedCalc
    	cmp r3, r4
    	bge Exit @FirstBankGoesFirst
    	mov r2, #0x1
    	str r2, [sp, #0x0]
    	b Exit @SecondBankGoesFirst
    SpeedCalc:
    	mov r0, r9
    	bl SpeedBL
    	mov r8, r0
    	mov r0, r10
    	bl SpeedBL
    	mov r4, r0
    	mov r3, r8
    	cmp r3, r4
    	bne TrickRoomCheck
    	bl 0x044EC8
    	mov r1, #0x1
    	and r0, r1
    	cmp r0,	#0x0
    	bne Exit
    	mov r2, #0x2 @SpeedTie
    	str r2, [sp, #0x0]
    	b Exit
    TrickRoomCheck:
    	ldr r0, .TrickRoomLoc
    	ldrb r0, [r0]
    	cmp r0, #0x0
    	beq SpeedCheck
    TrickRoom:
    	mov r8, r3
    	mov r3, r4
    	mov r4, r8
    SpeedCheck:
    	cmp r3, r4
    	bcs Exit @FirstBankGoesFirst
    	mov r2, #0x1
    	str r2, [sp, #0x0]
    Exit:
    	ldr r0, [sp, #0x0]
    	add sp, #0x4
    	pop {r3-r5}
    	mov r8, r3
    	mov r9, r4
    	mov r10, r5
    	pop {r4-r7}
    	pop {r1}
    	bx r1
    
    .align 2
    .TrickRoomLoc: .word 0x02TRTRTR
    
    .align 2
    
    PriorityBL:
    	mov r3, r0
    LoadMenuChoice:
    	ldr r0, .MenuChoiceLoc
    	add r1, r3, r0
    	mov r0, #0x0
    	ldrb r1, [r1]
    	cmp r1, #0x0
    	bne Return
    FightOptionChosen:
    	ldr r0, .ProtectStructure
    	lsl r1, r3, #0x4
    	add r1, r1, r0
    	ldrb r0, [r1]
    	lsl r0, r0, #0x1D
    	cmp r0, #0x0
    	bge LoadMoveIndex
    Struggle:
    	mov r4, #0xA5
    	b BufferMoveData
    LoadMoveIndex:
    	ldr r0, .Pointer
    	ldr r0, [r0, #0x0]
    	add r0, r3
    	add r0, #0x80
    	ldrb r0, [r0] @MoveSlotChosen
    	lsl r0, r0, #0x1
    	mov r1, #0x58
    	mul r1, r3
    	add r0, r0, r1
    	ldr r1, .BattleData
    	add r0, r0, r1
    	ldrh r4, [r0, #0xC]
    BufferMoveData:
    	ldr r2, .MoveData
    	lsl r0, r4, #0x1
    	add r0, r0, r4
    	lsl r0, r0, #0x2
    	add r4, r0, r2
    BufferBattleData:
    	ldr r0, .BattleData
    	add r0, #0x20
    	mov r1, #0x58
    	mul r1, r3
    	add r0, r0, r1
    	ldrb r1, [r0]
    	mov r0, #0x0
    PranksterCheck:
    	cmp r1, #0x9F
    	bne GaleWingsCheck
    Prankster:
    	ldrb r1, [r4, #0xA]
    	cmp r1, #0x2
    	bne LoadMovePriority
    	mov r0, #0x1
    	b LoadMovePriority
    GaleWingsCheck:
    	cmp r1, #0xB2
    	bne LoadMovePriority
    Galewings:
    	ldrb r1, [r4, #0x2]
    	cmp r1, #0x2
    	bne LoadMovePriority
    	mov r0, #0x1
    LoadMovePriority:
    	ldrb r1, [r4, #0x7]
    	add r0, r0, r1
    Return:
    	bx lr
    
    .align 2
    .MenuChoiceLoc: .word 0x02023D7C
    .ProtectStructure: .word 0x02023E8C
    .Pointer: .word 0x02023FE8
    .BattleData: .word 0x02023BE4
    .MoveData: .word 0x08250C04
    
    .align 2
    
    BracketBL:
    	push {lr}
    	mov r3, r0
    	mov r1, #0x58
    	ldr r0, .BattleDataItem
    	mul r1, r3
    	add r4, r0, r1
    CheckItem:
    	ldrh r0, [r4, #0xE]
    	cmp r0, #0xAF
    	bne LoadItemEffect
    EngimaBerry:
    	ldr r1, .EnigmaRamLoc
    	lsl r0, r3, #0x3
    	sub r0, r0, r3
    	lsl r0, r0, #0x2
    	add r0, r0, r1
    	ldrb r6, [r0, #0x7]
    	ldrb r5, [r0, #0x1A]
    	b QuickClawCheck
    LoadItemEffect:
    	bl 0x9A924
    	lsl r0, r0, #0x18
    	lsl r6, r0, #0x18
    	ldrh r0, [r4, #0xE]
    	bl 0x9A948
    	lsl r0, r0, #0x18
    	lsl r5, r0, #0x18
    QuickClawCheck:
    	cmp r6, #0x1A
    	bne CustapBerryCheck
    QuickClawActivationCalc:
    	ldr r0, .RandomLoc
    	ldrh r7, [r0]
    	lsl r0, r5, #0x10
    	sub r0, r0, r5
    	mov r1, #0x64
    	bl 0x1E4018
    	cmp r7, r0
    	bge StallCheck
    	mov r7, #0x1
    	b StoreBracket
    CustapBerryCheck:
    	cmp r6, #0x4D
    	bne LaggingTailCheck
    CustapBerry:
    CheckHP:
    	ldrh r0, [r4, #0x8]
    	ldrh r1, [r4, #0xC]
    	lsl r1, r1, #0x2
    	cmp r0, r1
    	bgt StallCheck
    SetRamLoc:
    	mov r7, #0x1
    	ldr r0, .CustapBerryLoc
    	strb r7, [r0]
    	b StoreBracket
    LaggingTailCheck:
    	cmp r6, #0x4A
    	bne StallCheck
    LaggingTail:
    	mov r0, #0x2
    	neg r7, r0
    	b StoreBracket
    StallCheck:
    	mov r7, #0x0
    	ldrb r0, [r4]
    	cmp r0, #0x65
    	bne StoreBracket
    Stall:
    	mov r0, #0x1
    	neg r7, r0
    StoreBracket:
    	mov r0, r7
    PopRegister:
    	pop {r1}
    	bx r1
    	
    .align 2
    .BattleDataItem: .word 0x2023C04
    .EnigmaRamLoc: .word 0x2023F54
    .RandomLoc: .word 0x2023E80
    .CustapBerryLoc: .word 0x02CCCCCC
    
    .align 2
    
    SpeedBL:
    	push {lr}
    	add sp, #-0x4
    	mov r7, r0
    	mov r5, #0x58
    	ldr r6, .BattleData2
    	mul r5, r7
    	add r6, r5, r6
    	mov r5, #0x1
    	str r0, [sp, #0x0]
    ApplyStatBoost:
    	ldrh r5, [r6, #0x6]
    	ldr r2, .StatModTable
    	ldrb r1, [r6, #0x1B]
    	lsl r1, r1, #0x1
    	add r2, r1, r2
    	ldrb r0, [r2]
    	mul r0, r5
    	ldrb r1, [r2, #0x1]
    	bl 0x1E4018
    	mov r5, r0
    CloudNineCheck:
    	mov r0, #0x13
    	mov r1, #0x0
    	mov r2, #0xD
    	mov r3, #0x0
    	bl 0x19F18
    	lsl r0, r0, #0x18
    	cmp r0, #0x0
    	bne NoWeather
    AirLockCheck:
    	mov r0, #0x0
    	str r0, [sp, #0x0] 
    	mov r0, #0x13
    	mov r1, #0x0
    	mov r2, #0x4D
    	mov r3, #0x0
    	bl 0x19F18
    	lsl r0, r0, #0x18
    	cmp r0, #0x0
    	bne NoWeather
    LoadWeather:
    	ldr r4, .WeatherLoc
    	ldrh r4, [r4]
    	add r2, r2, r6
    	add r2, #0x20
    	ldrb r2, [r2]
    RainCheck:
    	mov r0, #0x7
    	and r0, r4
    	cmp r0, #0x0
    	beq SunCheck
    SwiftSwimCheck:
    	cmp r2, #0x21
    	beq WeatherBoost
    SunCheck:
    	mov r0, #0x60
    	and r0, r4
    	cmp r0, #0x0
    	beq SandstormCheck
    ChlorophyllCheck:
    	cmp r2, #0x22
    	beq WeatherBoost
    SandstormCheck:
    	mov r0, #0x18
    	and r0, r4
    	cmp r0, #0x0
    	beq NoWeather
    SandRushCheck:
    	cmp r2, #0x93
    	bne NoWeather
    WeatherBoost:
    	lsl r5, r5, #0x1
    NoWeather:
    	mov r2, r6
    	add r2, #0x20
    	ldrb r2, [r2]
    SlowStartCheck:
    	cmp r2, #0x71
    	bne TailwindCheck
    	ldr r0, .SlowStartLoc
    	add r0, r0, r7
    CheckTurnCounter:
    	ldrb r0, [r0, #0x0]
    	cmp r0, #0x0
    	beq TailwindCheck
    	lsr r5, r5, #0x1
    TailwindCheck:
    	ldr r0, .TailwindAddr
    	cmp r7, #0x1
    	beq EnemyTailwind
    	cmp r7, #0x3
    	beq EnemyTailwind
    PlayerTailwind:
    	b CheckFlag 
    EnemyTailwind:
    	add r0, #0x1
    CheckFlag:
    	ldrb r0, [r0, #0x0]
    	cmp r0, #0x0
    	beq CheckItem2
    	lsl r5, r5, #0x1
    CheckItem2:
    	ldrh r0, [r6, #0x2e]
    	cmp r0, #0xAF
    	bne LoadItemEffect2
    EnigmaBerry2:
    	ldr r1, .EnigmaRamLoc2
    	lsl r0, r7, #0x3
    	sub r0, r0, r3
    	lsl r0, r0, #0x2
    	add r0, r0, r1
    	ldrb r0, [r0, #0x7]
    	b MachoBraceCheck
    LoadItemEffect2:
    	bl 0x9A924
    	lsl r0, r0, #0x18
    	lsr r0, r0, #0x18
    MachoBraceCheck: 
    	cmp r0, #0x18 
    	bne IronBallCheck
    	lsr r5, r5, #0x1
    IronBallCheck:
    	cmp r0, #0x47
    	bne QuickPowderCheck
    	lsr r5, r5, #0x1
    QuickPowderCheck:
    	cmp r0, #0x48
    	bne ChoiceScarfCheck
    	ldrh r0, [r6]
    	cmp r0, #0x84
    	bne ChoiceScarfCheck
    	lsr r1, r5, #0x1
    	add r5, r1, r5
    ChoiceScarfCheck:
    	cmp r0, #0x1D
    	bne BadgeCheck
    	bl 0x9A948
    	lsl r0, r0, #0x18
    	lsl r0, r0, #0x18
    	cmp r0, #0x2
    	bne BadgeCheck
    	lsr r0, r5, #0x1
    	add r5, r0, r5
    BadgeCheck:
    	ldr r0, .BadgeLoc
    	ldr r0, [r0]
    	mov r1, #0x2
    	and r0, r1
    	cmp r0, #0x0
    	bne StatusCheck
    	ldr r0, .Flag
    	bl 0x6E6D0
    	lsl r0, r0, #0x18
    	cmp r0, #0x0
    	beq StatusCheck
    	mov r0, r7
    	bl 0x751C4
    	lsl r0, r0, #0x18
    	cmp r0, #0x0
    	bne StatusCheck
    	mov r0, #0x6E
    	mul r0, r5
    	mov r1, #0x64
    	bl 0x1E460C
    	mov r5, r0
    StatusCheck:
    	ldr r0, [r6, #0x4c]
    	add r6, #0x20
    	ldrb r1, [r6, #0x0]
    	cmp r1, #0x9B
    	bne ParalysisCheck
    QuickFeetCheck:
    	cmp r0, #0x0
    	beq ReturnSpeed
    	lsl r5, r5, #0x1
    	b ReturnSpeed
    ParalysisCheck:
    	mov r1, #0x40
    	and r0, r1
    	cmp r0, #0x0
    	beq ReturnSpeed
    	lsr r5, r5, #0x2
    ReturnSpeed:
    	mov r0, r5
    	add sp, #0x4
    	pop {r1}
    	bx r1
    
    .align 2
    .BattleData2: .word 0x02023BE4
    .StatModTable: .word 0x0825DEAD
    .WeatherLoc: .word 0x02023F1C
    .SlowStartLoc: .word 0x02SSSSSS
    .TailwindAddr: .word 0x02TTTTTT
    .EnigmaRamLoc2: .word 0x02023F54
    .BadgeLoc: .word 0x02022B4C
    .Flag: .word 0x00000822
    This routine replaces the entire Turn Order calculation to make it more efficient and to work with Gyro Ball and Electro Ball. The locations for Trick Room, Custap Berry, Slow Start and Tailwind refer to free ram locations that you allocate yourself. The one for Slow Start must be the same as the other routines for the ability.[/CODE]
     
    31
    Posts
    6
    Years
  • I think he meant free rom locations. They are locations filled with FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ...

    You'll find in the end of the rom's hex code, most of the times.
     
    Last edited:
    88
    Posts
    7
    Years
    • Seen Jan 16, 2020
    Where can i find documentation on free RAM locations?

    For those reading this post who might not know, free RAM refers to any RAM locations that are unused by the game itself (typically in the 0x02xxxxxx range). RAM is referred to as read-access memory, meaning you can manipulate the data structures during the game (eg. the variable LASTRESULT), whereas you cannot alter the read-only memory (ROM) data during game-play.

    Depending on the patches you are using, there should be 4096 bytes of free RAM starting at 0x0203E000.

    I also believe there is free RAM between 0x0203C000 and 0x0203CEC4. You can use JPANs save block routine to include this RAM in .sav files, as well.
     

    Attachments

    • FR - JPAN Saveblock Hack.ips
      329 bytes · Views: 7
    82
    Posts
    6
    Years
  • For those reading this post who might not know, free RAM refers to any RAM locations that are unused by the game itself (typically in the 0x02xxxxxx range). RAM is referred to as read-access memory, meaning you can manipulate the data structures during the game (eg. the variable LASTRESULT), whereas you cannot alter the read-only memory (ROM) data during game-play.

    Depending on the patches you are using, there should be 4096 bytes of free RAM starting at 0x0203E000.

    I also believe there is free RAM between 0x0203C000 and 0x0203CEC4. You can use JPANs save block routine to include this RAM in .sav files, as well.

    You are amazing, good sir! Thank you very much! This is exactly what i was looking for!
     
    Back
    Top