951 lines
18 KiB
NASM
951 lines
18 KiB
NASM
//==============================================================================
|
|
c980c_custom_codes:
|
|
push {r1-r2,lr}
|
|
mov r1,r7
|
|
mov r2,r5
|
|
bl customcodes_parse
|
|
ldr r1,[r6]
|
|
|
|
// If 0, return [r6]+2; otherwise, return [r6]+r0
|
|
beq @@next
|
|
add r0,r0,r1
|
|
pop {r1-r2,pc}
|
|
@@next:
|
|
add r0,r1,2
|
|
pop {r1-r2,pc}
|
|
|
|
//==============================================================================
|
|
c980c_weld_entry:
|
|
push {r0-r1,lr}
|
|
mov r0,r5
|
|
mov r1,r7
|
|
bl weld_entry
|
|
pop {r0-r1,pc}
|
|
|
|
//==============================================================================
|
|
c8ffc_custom_codes:
|
|
push {r2,r5,lr}
|
|
ldrb r0,[r2]
|
|
mov r5,r0
|
|
mov r1,r2
|
|
mov r2,r4
|
|
bl customcodes_parse
|
|
cmp r0,0
|
|
beq @@next
|
|
mov r2,r12
|
|
add r0,r0,r2
|
|
strh r0,[r4,0x14]
|
|
pop {r2,r5}
|
|
add sp,4
|
|
ldr r1,=0x80C904D
|
|
bx r1
|
|
@@next:
|
|
mov r0,r5
|
|
cmp r0,1
|
|
pop {r2,r5,pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
c8ffc_weld_entry:
|
|
push {r0-r1,lr}
|
|
mov r0,r4
|
|
mov r1,r2
|
|
bl weld_entry
|
|
pop {r0-r1,pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx:
|
|
push {r1,lr}
|
|
mov r1,0
|
|
strh r1,[r0,2]
|
|
pop {r1}
|
|
bl 0x80C87D0
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_newline:
|
|
push {lr}
|
|
strh r0,[r5,0x2C]
|
|
strh r4,[r5,0x2A]
|
|
strh r4,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_scroll:
|
|
push {lr}
|
|
strh r0,[r5,0x2C]
|
|
strh r1,[r5,0x2A]
|
|
strh r1,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_other:
|
|
push {lr}
|
|
strh r0,[r5,0x2C]
|
|
strh r2,[r5,0x2A]
|
|
strh r2,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_other2:
|
|
push {lr}
|
|
mov r2,0
|
|
strh r2,[r5,0x2A]
|
|
strh r2,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_other3:
|
|
push {lr}
|
|
mov r1,0
|
|
strh r1,[r5,0x2A]
|
|
strh r1,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c980c_resetx_other4:
|
|
push {lr}
|
|
strh r0,[r5,0x2C]
|
|
strh r6,[r5,0x2A]
|
|
strh r6,[r5,2]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
c87d0_clear_entry:
|
|
push {lr}
|
|
|
|
// Reset X
|
|
mov r1,0
|
|
strh r1,[r0,2]
|
|
|
|
// Clear window
|
|
mov r1,4
|
|
bl clear_window
|
|
|
|
// Clobbered code
|
|
ldr r4,=0x3005270
|
|
mov r1,0x24
|
|
pop {pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
c9634_resetx:
|
|
push {lr}
|
|
mov r4,0
|
|
strh r4,[r6,2]
|
|
|
|
// Clobbered code
|
|
strh r5,[r1]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Only render the (None) strings in the equip window if there's nothing equipped
|
|
c4b2c_skip_nones:
|
|
push {r7,lr}
|
|
add sp,-4
|
|
mov r7,0
|
|
|
|
// Get the (none) pointer
|
|
mov r0,r4
|
|
mov r1,r10
|
|
mov r2,0x2A
|
|
bl 0x80BE260
|
|
mov r5,r0
|
|
|
|
// Check each equip slot
|
|
ldr r6,=0x3001D40
|
|
ldr r3,=0x3005264
|
|
ldrh r0,[r3] // active party character
|
|
mov r1,0x6C
|
|
mul r0,r1
|
|
add r6,r0,r6
|
|
add r6,0x75
|
|
ldrb r0,[r6]
|
|
cmp r0,0
|
|
bne @@next
|
|
|
|
// Weapon
|
|
mov r0,r8
|
|
mov r1,r5
|
|
mov r2,0x6
|
|
mov r3,0
|
|
str r7,[sp]
|
|
bl 0x80C9634
|
|
|
|
@@next:
|
|
ldrb r0,[r6,1]
|
|
cmp r0,0
|
|
bne @@next2
|
|
|
|
// Body
|
|
mov r0,r8
|
|
mov r1,r5
|
|
mov r2,0x6
|
|
mov r3,1
|
|
str r7,[sp]
|
|
bl 0x80C9634
|
|
|
|
@@next2:
|
|
ldrb r0,[r6,2]
|
|
cmp r0,0
|
|
bne @@next3
|
|
|
|
// Arms
|
|
mov r0,r8
|
|
mov r1,r5
|
|
mov r2,0x6
|
|
mov r3,2
|
|
str r7,[sp]
|
|
bl 0x80C9634
|
|
|
|
@@next3:
|
|
ldrb r0,[r6,3]
|
|
cmp r0,0
|
|
bne @@next4
|
|
|
|
// Other
|
|
mov r0,r8
|
|
mov r1,r5
|
|
mov r2,0x6
|
|
mov r3,3
|
|
str r7,[sp]
|
|
bl 0x80C9634
|
|
|
|
@@next4:
|
|
mov r0,0
|
|
mov r10,r0
|
|
add sp,4
|
|
pop {r7,pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
// Clears the equipment portion of the equip window
|
|
// r0 = window pointer
|
|
clear_equipment:
|
|
push {r0-r2,lr}
|
|
add sp,-16
|
|
mov r1,r0
|
|
mov r0,sp
|
|
|
|
ldrh r2,[r1,0x22] // window X
|
|
add r2,6 // horizontal offset
|
|
strh r2,[r0]
|
|
ldrh r2,[r1,0x24] // window Y
|
|
strh r2,[r0,2]
|
|
ldrh r2,[r1,0x26] // window width
|
|
sub r2,6
|
|
strh r2,[r0,0xC]
|
|
ldrh r2,[r1,0x28] // window height
|
|
strh r2,[r0,0xE]
|
|
|
|
ldr r2,=0x44444444
|
|
str r2,[r0,4]
|
|
ldr r2,=0x30051EC
|
|
ldrh r2,[r2]
|
|
strh r2,[r0,8]
|
|
|
|
bl clear_rect
|
|
|
|
add sp,16
|
|
pop {r0-r2,pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
// Clear equipment and offense/defense when moving left/right on equip screen
|
|
// r6 = window pointer
|
|
c4b2c_clear_left:
|
|
mov r0,r6
|
|
bl clear_equipment
|
|
|
|
// Clear offense/defense
|
|
push {r0-r2}
|
|
mov r0,8
|
|
mov r2,r0
|
|
mov r1,0xB
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
pop {r0-r2}
|
|
|
|
// Clobbered code
|
|
strh r1,[r3]
|
|
ldr r0,=0x80C4F3B
|
|
bx r0
|
|
|
|
c4b2c_clear_right:
|
|
mov r0,r6
|
|
bl clear_equipment
|
|
|
|
// Clear offense/defense
|
|
push {r0-r2}
|
|
mov r0,8
|
|
mov r2,r0
|
|
mov r1,0xB
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
pop {r0-r2}
|
|
|
|
// Clobbered code
|
|
strh r1,[r3]
|
|
ldr r0,=0x80C4EFF
|
|
bx r0
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
// Clear PSI target window when moving left/right on PSI screen
|
|
c438c_moveright:
|
|
push {r0-r1,lr}
|
|
ldr r1,=0x3005230
|
|
ldr r0,[r1,0x24] // PSI target window pointer
|
|
mov r1,4
|
|
bl clear_window
|
|
pop {r0-r1}
|
|
|
|
// Clobbered code
|
|
add r0,1
|
|
strh r0,[r5,0x34]
|
|
pop {pc}
|
|
|
|
c438c_moveleft:
|
|
push {r0-r1,lr}
|
|
ldr r1,=0x3005230
|
|
ldr r0,[r1,0x24] // PSI target window pointer
|
|
mov r1,4
|
|
bl clear_window
|
|
pop {r0-r1}
|
|
|
|
// Clobbered code
|
|
sub r0,1
|
|
strh r0,[r5,0x34]
|
|
pop {pc}
|
|
|
|
c438c_moveup:
|
|
push {r0-r1,lr}
|
|
ldr r1,=0x3005230
|
|
ldr r0,[r1,0x24] // PSI target window pointer
|
|
mov r1,4
|
|
bl clear_window
|
|
pop {r0-r1}
|
|
|
|
// Clobbered code
|
|
sub r0,1
|
|
strh r0,[r5,0x36]
|
|
pop {pc}
|
|
|
|
c438c_movedown:
|
|
push {r0-r1,lr}
|
|
ldr r1,=0x3005230
|
|
ldr r0,[r1,0x24] // PSI target window pointer
|
|
mov r1,4
|
|
bl clear_window
|
|
pop {r0-r1}
|
|
|
|
// Clobbered code
|
|
add r0,1
|
|
strh r0,[r5,0x36]
|
|
pop {pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
// Prints a string in the status window
|
|
c0a5c_printstr:
|
|
push {r0-r2,lr}
|
|
mov r0,r1
|
|
mov r1,r2
|
|
mov r2,r3
|
|
bl print_string
|
|
pop {r0-r2,pc}
|
|
|
|
//==============================================================================
|
|
// Prints an empty space instead of the "Press A for PSI info" string
|
|
c0a5c_psi_info_blank:
|
|
push {lr}
|
|
mov r0,5
|
|
mov r1,0xF
|
|
mov r2,0x14
|
|
bl print_blankstr
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Redraws the status window (when exiting the PSI submenu, etc.)
|
|
bac18_redraw_status:
|
|
push {r4,lr}
|
|
|
|
ldr r4,=0x3005230
|
|
ldr r4,[r4,0x18]
|
|
|
|
// Get the address of the status text
|
|
ldr r0,=0x8B17EE4
|
|
ldr r1,=0x8B17424
|
|
mov r2,0x11
|
|
bl 0x80BE260
|
|
|
|
// Prepare the window for parsing
|
|
mov r1,r0
|
|
mov r0,r4
|
|
mov r2,0
|
|
bl 0x80BE458
|
|
|
|
// Render text
|
|
mov r0,r4
|
|
bl 0x80C8FFC
|
|
|
|
// Render numbers
|
|
mov r0,r4
|
|
mov r1,0
|
|
bl 0x80C0A5C
|
|
|
|
pop {r4,pc}
|
|
.pool
|
|
|
|
|
|
//==============================================================================
|
|
// Clears the PSI window when switching classes
|
|
// r5 = 0x3005230
|
|
bac18_clear_psi:
|
|
push {r0,lr}
|
|
ldr r0,[r5,0x20] // PSI class window pointer
|
|
ldrb r0,[r0]
|
|
mov r1,0x10
|
|
and r0,r1
|
|
cmp r0,0
|
|
beq @@next
|
|
|
|
// If flag 0x10 is set, clear the PSI window
|
|
ldr r0,[r5,0x1C] // PSI window
|
|
mov r1,4
|
|
bl clear_window
|
|
|
|
@@next:
|
|
// Clobbered code
|
|
pop {r0}
|
|
lsl r0,r0,0x10
|
|
asr r4,r0,0x10
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Only clear+redraw the PSI help if a button has been pressed
|
|
bac18_check_button:
|
|
push {lr}
|
|
ldr r0,=0x3002500
|
|
ldrh r0,[r0]
|
|
cmp r0,0
|
|
beq @@next
|
|
|
|
// Clear window
|
|
ldr r0,[r5,0x28]
|
|
mov r1,r2
|
|
mov r2,0
|
|
bl 0x80BE458
|
|
|
|
// Render window
|
|
ldr r0,[r5,0x28]
|
|
bl 0x80C8BE4
|
|
|
|
@@next:
|
|
pop {pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Clear offense/defense changes when switching in equip select window
|
|
c5500_clear_up:
|
|
push {r1-r2,lr}
|
|
mov r0,0xD
|
|
mov r1,0xB
|
|
mov r2,0x3
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
|
|
// Clobbered code
|
|
sub r0,r3,1
|
|
strh r0,[r7,0x36]
|
|
pop {r1-r2,pc}
|
|
|
|
c5500_clear_down:
|
|
push {r0-r2,lr}
|
|
mov r0,0xD
|
|
mov r1,0xB
|
|
mov r2,0x3
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
|
|
// Clobbered code
|
|
pop {r0-r2}
|
|
add r0,1
|
|
strh r0,[r7,0x36]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Clear offense/defense when re-equipping (or un-equipping) something
|
|
baef8_reequip_erase:
|
|
push {r1,lr}
|
|
mov r0,8
|
|
mov r1,0xB
|
|
mov r2,4
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
|
|
// Clobbered code
|
|
pop {r1}
|
|
mov r0,2
|
|
strh r0,[r1]
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Redraw main menu when exiting PSI target window
|
|
b8bbc_redraw_menu_2to1:
|
|
push {r1-r4,lr}
|
|
add sp,-4
|
|
|
|
// Copied from 80B7A74
|
|
mov r0,0
|
|
str r0,[sp]
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0] // main menu window pointer
|
|
ldr r1,[r0,4] // text pointer
|
|
mov r2,5
|
|
mov r3,2
|
|
mov r4,r0
|
|
bl 0x80BE4C8
|
|
mov r0,r4
|
|
bl 0x80C8BE4
|
|
|
|
// Clobbered code (restore the window borders, etc.)
|
|
mov r0,1
|
|
bl 0x80BD7AC
|
|
|
|
add sp,4
|
|
pop {r1-r4,pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Redraw main menu when entering PSI target window
|
|
b8bbc_redraw_menu_13to2:
|
|
push {r1-r4,lr}
|
|
add sp,-4
|
|
|
|
// Copied from 80B7A74
|
|
mov r0,0
|
|
str r0,[sp]
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0] // main menu window pointer
|
|
ldr r1,[r0,4] // text pointer
|
|
mov r2,5
|
|
mov r3,2
|
|
mov r4,r0
|
|
bl 0x80BE4C8
|
|
mov r0,r4
|
|
bl 0x80C8BE4
|
|
|
|
// Clobbered code (restore the window borders, etc.)
|
|
mov r0,1
|
|
bl 0x80BD7F8
|
|
|
|
add sp,4
|
|
pop {r1-r4,pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Print a space before the Greek letter
|
|
d3934_print_space:
|
|
push {lr}
|
|
mov r0,r4
|
|
bl print_space
|
|
|
|
// Clobbered code
|
|
ldrb r1,[r3,1]
|
|
lsl r0,r1,1
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Copy a tile up one line
|
|
// r4: (x << 16) (relative)
|
|
// r5: dest tilemap
|
|
// r6: window
|
|
// r7: source tilemap
|
|
// r8: y (dest, relative)
|
|
// r10: 3005270
|
|
ca4bc_copy_tile_up:
|
|
push {r4-r7,lr}
|
|
|
|
// Four cases:
|
|
// 1) copy blank to blank
|
|
// 2) copy blank to non-blank
|
|
// 3) copy non-blank to blank
|
|
// 4) copy non-blank to non-blank
|
|
|
|
// 1) we don't have to do anything: pixels are blank for source and dest,
|
|
// and the tilemap won't change either
|
|
// 2) we have to erase dest pixels and set dest tilemap to 0xE2FF
|
|
// 3) we have to copy source pixels to dest pixels and set dest tilemap
|
|
// to the proper tile index
|
|
// 4) we only have to copy the source pixels to dest pixels
|
|
|
|
// Check blank by comparing tilemap with 0xE2FF
|
|
// 0xE2FF is already stored to [sp+(# of regs pushed * 4)]
|
|
ldr r0,[sp,20]
|
|
ldrh r1,[r7]
|
|
ldrh r2,[r5]
|
|
|
|
cmp r1,r0
|
|
bne @@next
|
|
cmp r2,r0
|
|
bne @@blank_to_nonblank
|
|
|
|
// Case 1: blank to blank
|
|
b @@end
|
|
|
|
@@next:
|
|
cmp r2,r0
|
|
bne @@nonblank_to_nonblank
|
|
|
|
// Case 3: non-blank to blank
|
|
@@nonblank_to_blank:
|
|
|
|
// Copy pixels up
|
|
ldrh r0,[r6,0x22]
|
|
lsl r0,r0,16
|
|
add r0,r0,r4
|
|
lsr r0,r0,16 // x
|
|
ldrh r1,[r6,0x24]
|
|
add r1,r8 // dest y
|
|
mov r4,r1
|
|
add r1,2 // source y
|
|
bl copy_tile_up
|
|
|
|
// Set proper tilemap
|
|
mov r1,r4 // dest y
|
|
bl get_tile_number
|
|
ldr r1,=0x30051EC
|
|
ldrh r2,[r1]
|
|
add r0,r0,r2 // dest tile number
|
|
ldrh r1,[r1,0x3C] // 0xE000
|
|
orr r0,r1
|
|
strh r0,[r5]
|
|
b @@end
|
|
|
|
// Case 2: blank to non-blank
|
|
@@blank_to_nonblank:
|
|
|
|
// Set dest tilemap to 0xE2FF
|
|
strh r0,[r5]
|
|
|
|
// Case 4: non-blank to non-blank
|
|
@@nonblank_to_nonblank:
|
|
|
|
// Copy pixels up
|
|
ldrh r0,[r6,0x22]
|
|
lsl r0,r0,16
|
|
add r0,r0,r4
|
|
lsr r0,r0,16 // x
|
|
ldrh r1,[r6,0x24]
|
|
add r1,r8 // dest y
|
|
add r1,2 // source y
|
|
bl copy_tile_up
|
|
b @@end
|
|
|
|
@@end:
|
|
pop {r4-r7,pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Erase tile (for short windows)
|
|
// r2: 100
|
|
// r4: (x << 16) (relative)
|
|
// r5: dest tilemap
|
|
// r6: window
|
|
// r8: y (dest, relative)
|
|
ca4bc_erase_tile_short:
|
|
push {lr}
|
|
add sp,-12
|
|
|
|
// Clobbered code
|
|
orr r0,r1 // 0xE2FF
|
|
strh r0,[r5] // dest tilemap
|
|
|
|
// We need to erase the pixels
|
|
ca4bc_erase_tile_common:
|
|
mov r0,sp
|
|
strh r2,[r0,8] // tile offset
|
|
ldr r2,=0x44444444
|
|
str r2,[r0,4] // empty row of pixels
|
|
ldrh r2,[r6,0x22]
|
|
lsl r2,r2,16
|
|
add r2,r2,r4
|
|
lsr r2,r2,16 // x
|
|
ldrh r1,[r6,0x24]
|
|
add r1,r8 // y
|
|
strh r2,[r0]
|
|
strh r1,[r0,2]
|
|
bl clear_tile_internal
|
|
|
|
add sp,12
|
|
pop {pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Erase tile
|
|
ca4bc_erase_tile:
|
|
push {lr}
|
|
add sp,-12
|
|
|
|
// Clobbered code
|
|
ldrh r1,[r1]
|
|
strh r1,[r5]
|
|
|
|
// We need to erase the pixels
|
|
ldr r2,=0x30051EC
|
|
ldrh r2,[r2]
|
|
b ca4bc_erase_tile_common
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Clear PSI window when scrolling through classes
|
|
e06ec_clear_window:
|
|
push {r0-r1,lr}
|
|
ldr r0,=0x3002500
|
|
ldrh r0,[r0]
|
|
cmp r0,0
|
|
beq @@next
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0,0x1C]
|
|
mov r1,4
|
|
bl clear_window
|
|
|
|
@@next:
|
|
pop {r0-r1}
|
|
|
|
// Clobbered code
|
|
lsl r0,r0,0x10
|
|
asr r4,r0,0x10
|
|
pop {pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Redraw PSI command when exiting PSI subwindow
|
|
e06ec_redraw_psi:
|
|
push {r0-r3,lr}
|
|
|
|
// Clear old tiles
|
|
mov r0,2
|
|
mov r1,3
|
|
mov r2,1
|
|
bl print_blankstr
|
|
|
|
// Render PSI string
|
|
add sp,-4
|
|
ldr r0,=0x80DC1EC // address of PSI string pointer
|
|
ldr r1,[r0] // PSI string pointer
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0] // window pointer
|
|
mov r2,1 // highlight
|
|
str r2,[sp]
|
|
mov r2,1
|
|
mov r3,1
|
|
bl 0x80C96F0 // render string
|
|
add sp,4
|
|
|
|
// Clobbered code
|
|
pop {r0-r3}
|
|
bl 0x80BD7F8 // restore tilemaps
|
|
pop {pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Redraw Bash/Do Nothing and PSI commands when exiting PSI ally target subwindow
|
|
e06ec_redraw_bash_psi:
|
|
push {r0-r3,lr}
|
|
add sp,-4
|
|
|
|
// Clear old tiles
|
|
mov r0,2
|
|
mov r1,1
|
|
mov r2,1
|
|
bl print_blankstr
|
|
add r1,2
|
|
bl print_blankstr
|
|
|
|
// We need to figure out whether to draw Bash or Do Nothing
|
|
// If [0x2025122] == 2, draw Do Nothing; else, draw Bash
|
|
// We'll never draw Shoot because Jeff doesn't use PSI
|
|
ldr r0,=0x2025122
|
|
ldrh r0,[r0]
|
|
cmp r0,2
|
|
beq @@donothing
|
|
ldr r0,=0x80DBFB0
|
|
b @@next
|
|
@@donothing:
|
|
ldr r0,=0x80DC108
|
|
@@next:
|
|
ldr r1,[r0]
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0] // window pointer
|
|
mov r2,0 // no highlight
|
|
str r2,[sp]
|
|
mov r2,1
|
|
mov r3,0
|
|
bl 0x80C96F0 // render string
|
|
|
|
// Render PSI string
|
|
ldr r0,=0x80DC1EC // address of PSI string pointer
|
|
ldr r1,[r0] // PSI string pointer
|
|
ldr r0,=0x3005230
|
|
ldr r0,[r0] // window pointer
|
|
mov r2,1 // highlight
|
|
str r2,[sp]
|
|
mov r2,1
|
|
mov r3,1
|
|
bl 0x80C96F0 // render string
|
|
add sp,4
|
|
|
|
// Clobbered code
|
|
pop {r0-r3}
|
|
bl 0x80BD7F8 // restore tilemaps
|
|
pop {pc}
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Print "PSI "
|
|
c239c_print_psi:
|
|
push {lr}
|
|
add sp,-4
|
|
mov r2,0
|
|
str r2,[sp]
|
|
mov r2,r4
|
|
lsl r3,r3,3 // tiles-to-pixels
|
|
bl print_string_hlight_pixels
|
|
add sp,4
|
|
pop {pc}
|
|
|
|
//==============================================================================
|
|
// Use new pointer for user/target strings
|
|
ebfd4_user_pointer:
|
|
push {lr}
|
|
mov r4,0x4C
|
|
lsl r4,r4,4
|
|
add r0,r0,r4
|
|
mov r5,r0
|
|
lsl r4,r1,0x10
|
|
asr r4,r4,0x10
|
|
mov r1,r2
|
|
mov r2,r4
|
|
bl 0x80F4C78
|
|
add r0,r4,r5
|
|
mov r1,0
|
|
strb r1,[r0]
|
|
mov r1,0xFF
|
|
strb r1,[r0,1]
|
|
pop {pc}
|
|
|
|
ec004_user_pointer:
|
|
push {r1}
|
|
ldr r1,[sp,4]
|
|
mov lr,r1
|
|
pop {r1}
|
|
add sp,4
|
|
ldr r0,=0x3005220
|
|
ldr r0,[r0]
|
|
mov r1,0x4C
|
|
lsl r1,r1,4
|
|
add r0,r0,r1
|
|
bx lr
|
|
|
|
ec010_target_pointer:
|
|
push {lr}
|
|
mov r4,0x50
|
|
lsl r4,r4,4
|
|
add r0,r0,r4
|
|
mov r5,r0
|
|
lsl r4,r1,0x10
|
|
asr r4,r4,0x10
|
|
mov r1,r2
|
|
mov r2,r4
|
|
bl 0x80F4C78
|
|
add r0,r4,r5
|
|
mov r1,0
|
|
strb r1,[r0]
|
|
mov r1,0xFF
|
|
strb r1,[r0,1]
|
|
pop {pc}
|
|
|
|
ec046_target_pointer:
|
|
push {r1}
|
|
ldr r1,[sp,4]
|
|
mov lr,r1
|
|
pop {r1}
|
|
add sp,4
|
|
ldr r0,[r0]
|
|
mov r1,0x50
|
|
lsl r1,r1,4
|
|
add r0,r0,r1
|
|
bx lr
|
|
|
|
c980c_user_pointer:
|
|
ldr r1,[r0]
|
|
mov r0,0x4C
|
|
lsl r0,r0,4
|
|
add r1,r0,r1
|
|
ldr r0,[r5,0x1C]
|
|
bx lr
|
|
|
|
c980c_target_pointer:
|
|
ldr r0,[r0]
|
|
mov r7,0x50
|
|
lsl r7,r7,4
|
|
add r0,r0,r7
|
|
bx lr
|
|
.pool
|
|
|
|
//==============================================================================
|
|
// Add a space between enemy name and letter in multi-enemy fights
|
|
dcd00_enemy_letter:
|
|
sub r0,0x90
|
|
strb r0,[r5,1]
|
|
mov r0,0x50
|
|
strb r0,[r5]
|
|
bx lr
|
|
|
|
dae00_enemy_letter:
|
|
sub r0,0x90
|
|
strb r0,[r4,1]
|
|
mov r0,0x50
|
|
strb r0,[r4]
|
|
bx lr
|
|
|
|
//==============================================================================
|
|
// "The" flag checks
|
|
db04c_theflag:
|
|
push {r4,lr}
|
|
|
|
// Clobbered code: get enemy string pointer
|
|
lsl r4,r2,1
|
|
bl 0x80BE260
|
|
mov r1,r0
|
|
mov r0,sp
|
|
add r0,8
|
|
|
|
// Check for "The" flag
|
|
ldr r3,=m2_enemy_attributes
|
|
ldrb r3,[r3,r4] // "The" flag
|
|
cmp r3,0
|
|
beq @@next
|
|
|
|
// Write "The " before the enemy name
|
|
ldr r2,=0x50959884
|
|
str r2,[r0]
|
|
add r0,4
|
|
|
|
@@next:
|
|
pop {r4,pc}
|
|
.pool
|