Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .align 2
- .thumb
- /*This code is meant to create a small box, based on the multichoice
- box code, that can be used to input numeric values in-game.
- This box will receive as input the largest possible number in variable
- 0x8008 and 0x8009 as a 32 bit number, and returns 0x8008 and 0x8009 as
- the 32 bit input number, and 0x800D as either the digit A was pressed on
- or 0x7f if B was pressed to cancel the box input.*/
- .mainline box
- #function make_box{
- push {r4-r7, lr}
- mov r0, #0x12 /*X position of box, in characters*/
- mov r1, #0xA /*Y position of box, in characters*/
- mov r2, #0xA /*size of box, in characters*/
- mov r3, #0x2
- bl draw_interior
- add r6, r0, #0x0
- mov r1, #0x0
- bl draw_border
- mov r0, #0x0
- mov r1, #0x0
- add r2, r6, #0x0
- bl create_and_print_string
- sub SP, SP, #0xc
- mov r0, #0x10
- str r0, [SP]
- mov r0, #0x1
- str r0, [SP, #0x4]
- mov r0, #0x0
- str r0, [SP, #0x8]
- add r0, r6, #0x0
- mov r1, #0x2
- mov r2, #0x0
- mov r3, #0x2
- bl func_10f7d8
- add SP, SP, #0xC
- mov r0, #0x0
- mov r1, #0x1
- add r2, r6, #0x0
- mov r3, #0xff
- bl set_update_function
- mov r0, 0x0
- bl set_ab58
- pop {r4-r7, pc}
- }
- #function draw_interior{
- ldr r4, addr
- bx r4
- addr: .word 0x809D655
- }
- #function draw_border{
- ldr r2, addr
- bx r2
- addr: .word 0x080F7751
- }
- #function print_string{
- ldr r4, addr
- bx r4
- addr: .word 0x08002c49
- }
- #function func_10f7d8{
- ldr r4, addr
- bx r4
- addr: .word 0x0810f7d9
- }
- #function set_ab58{
- ldr r1, addr
- bx r1
- addr: .word 0x080f67a5
- }
- /*This function creates the string representation of the
- number box and places it on str_buffer 1. The number contains
- an arrow pointing at the currently selected digit, the number
- to be printed and some padding zeros if the number has less
- digits than the max value set at 0x8008/9 variables.
- params
- r0 = num to display
- r1 = digit with arrow*/
- #function create_string{
- push {r4-r7, lr}
- add r6, r0, #0x0
- add r5, r1, #0x0
- bl get_max_digit
- add r4, r0, #0x0
- ldr r0, str_buffer
- add r1, r6, #0x0
- mov r2, #0x0
- add r3, r4, #0x0
- push {r4}
- bl number_to_string
- pop {r4}
- ldr r0, str_buffer
- bl strlen
- add r1, r4, #0x0
- ldr r2, str_buffer
- add r3, r5, #0x0
- bl copy_and_pad_string
- pop {r4-r7, pc}
- str_buffer: .word 0x02021CD0
- }
- #function get_max_digit{
- ldr r3, var_8008
- ldr r2, [r3]
- cmp r2, #0x0
- bne set_count_digits
- ldr r2, digit_loc
- mov r0, #0x9
- lsl r1, r0, #0x2
- add r1, r1, r2
- ldr r1, [r1]
- sub r1, #0x1
- str r1, [r3]
- mov pc, lr
- set_count_digits:
- mov r0, #0x9
- ldr r3, digit_loc
- count_digit_loop:
- lsl r1, r0, #0x2
- add r1, r3, r1
- ldr r1, [r1]
- cmp r1, r2
- bhi count_digit_loop_cont
- add r0, #0x1
- mov pc, lr
- count_digit_loop_cont:
- sub r0, #0x1
- b count_digit_loop
- var_8008: .word 0x020370C8
- digit_loc: .word 0x08231E3C
- }
- #function copy_and_pad_string{
- push {r4-r7, lr}
- add r7, r2, #0x0
- add r6, r3, #0x0
- add r5, r1, #0x1
- sub r4, r0, #0x1
- mov r0, #0xff
- strb r0, [r7, r5]
- sub r5, #0x1
- str_build_loop:
- cmp r6, #0x0
- beq add_arrow
- cmp r4, #0x0
- blt padd_with_zero
- ldrb r0, [r7, r4]
- strb r0, [r7, r5]
- b str_build_loop_dec
- add_arrow:
- mov r0, #0x7B
- strb r0, [r7, r5]
- add r4, #0x1
- b str_build_loop_dec
- padd_with_zero:
- mov r0, #0xA1
- strb r0, [r7, r5]
- str_build_loop_dec:
- sub r6, #0x1
- sub r4, #0x1
- sub r5, #0x1
- cmp r5, #0x0
- bge str_build_loop
- pop {r4-r7, pc}
- }
- /*receives
- r0 as string location
- r1 as number to print
- r2 seem to be the Display now byte
- r3 as the number of digits*/
- #function number_to_string{
- ldr r4, addr
- bx r4
- addr: .word 0x08008E79
- }
- #function strlen{
- ldr r1, addr
- bx r1
- addr: .word 0x08008E09
- }
- #function set_update_function{
- push {r4-r7, lr}
- add r4, r0, #0x0
- add r5, r1, #0x0
- add r6, r2, #0x0
- add r7, r3, #0x0
- ldr r0, update_addr
- mov r1, #0x50
- bl store_function
- add r3, r0, #0x0
- lsl r0,r0, #0x2
- add r0, r0, r3
- lsl r0, r0, #0x3
- ldr r1, IRAM_Function_queue
- add r1, r0, r1
- strb r4, [r1, #0x10]
- strb r5, [r1, #0x11]
- strb r6, [r1, #0x12]
- strb r7, [r1, #0x13]
- mov r0, #0x0
- str r0, [r1, #0x14]
- bl get_max_digit
- ldr r1, RAM_menu_addr
- strb r0, [r1, #0x4]
- mov r0, #0x0
- strb r0, [r1, #0x2]
- pop {r4-r7, pc}
- /* ldr r4, addr
- bx r4
- addr: .word 0x0809CC19*/
- update_addr: .word update_box__addr_t
- IRAM_Function_queue: .word 0x03005090
- RAM_menu_addr: .word 0x0203ADE4
- }
- #function store_function{
- ldr r2, addr
- bx r2
- addr: .word 0x0807741d
- }
- /*r0 = function index in queue
- function params
- 0x12 (byte) = box id
- 0x14 (word) = number counter*/
- #function update_box{
- push {r4-r6,lr}
- add r6, r0, #0x0
- ldr r5, IRAM_Function_queue
- lsl r0, r6, #0x2
- add r0, r0, r6
- lsl r0, r0, #0x3
- add r5, r0, r5
- ldr r4, RAM_menu_addr
- ldr r0, thread_list_start
- ldrh r3, [r0, #0x2e]
- mov r0, #0x1
- and r0, r3
- cmp r0, #0x0
- bne pressed_a
- mov r0, #0x2
- and r0, r3
- cmp r0, #0x0
- bne pressed_b
- mov r0, #0x10
- and r0, r3
- cmp r0, #0x0
- bne pressed_right
- mov r0, #0x20
- and r0, r3
- cmp r0, #0x0
- bne pressed_left
- mov r0, #0x40
- and r0, r3
- cmp r0, #0x0
- bne pressed_up
- mov r0, #0x80
- and r0, r3
- cmp r0, #0x0
- bne pressed_down
- pop {r4-r6,pc}
- pressed_a: ldr r1, var_8008
- ldr r0, [r5, #0x14]
- str r0, [r1]
- ldr r1, var_800d
- ldrb r0, [r4, #0x2]
- strh r0, [r1]
- b update_clean_function
- pressed_b: ldr r1, var_800d
- mov r0, #0x7f
- strh r0, [r1]
- update_clean_function:
- ldr r1, clean_addr
- ldrb r0, [r5, #0x12]
- mov pc, r1
- IRAM_Function_queue: .word 0x03005090
- thread_list_start: .word 0x030030F0
- RAM_menu_addr: .word 0x0203ADE4
- var_800d: .word 0x020370d0
- clean_addr: .word 0x0809CD2E
- pressed_left: ldrb r0, [r4, #0x2]
- add r0, #0x1
- ldrb r1, [r4, #0x4]
- cmp r0, r1
- blt set_direction
- mov r0, #0x0
- b set_direction
- pressed_right: ldrb r0, [r4, #0x2]
- sub r0, #0x1
- cmp r0, #0x0
- bge set_direction
- ldrb r0, [r4, #0x4]
- sub r0, #0x1
- set_direction: strb r0, [r4, #0x2]
- add r1, r0, #0x0
- ldr r0, [r5, #0x14]
- ldrb r2, [r5, #0x12]
- bl create_and_print_string
- pop {r4-r6,pc}
- pressed_up: ldr r1, decimal_table
- ldrb r0, [r4, #0x2]
- lsl r0, r0, #0x2
- add r1, r0, r1
- ldr r1, [r1]
- ldr r0, [r5, #0x14]
- add r0, r1, r0
- b check_min
- pressed_down: ldr r1, decimal_table
- ldrb r0, [r4, #0x2]
- lsl r0, r0, #0x2
- add r1, r0, r1
- ldr r1, [r1]
- ldr r0, [r5, #0x14]
- sub r0, r0, r1
- check_min: cmp r0, #0x0
- bge check_max
- mov r0, #0x0
- check_max: ldr r1, var_8008
- ldr r1, [r1]
- cmp r0, r1
- ble set_number
- add r0, r1, #0x0
- set_number: str r0, [r5, #0x14]
- ldrb r1, [r4, #0x2]
- ldrb r2, [r5, 0x12]
- bl create_and_print_string
- pop {r4-r6,pc}
- var_8008: .word 0x020370C8
- decimal_table: .word 0x08231E3C
- }
- #function create_and_print_string{
- push {lr}
- push {r2}
- bl create_string
- pop {r0}
- sub SP, SP, #0xC
- mov r2, #0x2
- str r2, [SP]
- mov r2, #0x0
- str r2, [sp, #0x4]
- mov r2, #0x0
- str r2, [sp, #0x8]
- mov r1, #0x2
- ldr r2, disp_string
- mov r3, #0x8
- bl print_string
- add SP, SP, #0xC
- pop {pc}
- disp_string: .word /*str_display__addr*/0x02021CD0
- }
- /*str_display: .byte 0xA1,0xA1,0xA1,0xA1, 0xA1,0xA1,0xA1,0xA1,0xA1,0x7b, 0xff*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement