Advertisement
BlackWhiteRobin

JPAN's Number Box Input

Sep 18th, 2015
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.32 KB | None | 0 0
  1. .align 2
  2. .thumb
  3.  
  4.  
  5. /*This code is meant to create a small box, based on the multichoice
  6. box code, that can be used to input numeric values in-game.
  7.  
  8. This box will receive as input the largest possible number in variable
  9. 0x8008 and 0x8009 as a 32 bit number, and returns 0x8008 and 0x8009 as
  10. the 32 bit input number, and 0x800D as either the digit A was pressed on
  11. or 0x7f if B was pressed to cancel the box input.*/
  12. .mainline box
  13. #function make_box{
  14. push {r4-r7, lr}
  15. mov r0, #0x12 /*X position of box, in characters*/
  16. mov r1, #0xA /*Y position of box, in characters*/
  17. mov r2, #0xA /*size of box, in characters*/
  18. mov r3, #0x2
  19. bl draw_interior
  20. add r6, r0, #0x0
  21. mov r1, #0x0
  22. bl draw_border
  23.  
  24. mov r0, #0x0
  25. mov r1, #0x0
  26. add r2, r6, #0x0
  27. bl create_and_print_string
  28.  
  29. sub SP, SP, #0xc
  30. mov r0, #0x10
  31. str r0, [SP]
  32. mov r0, #0x1
  33. str r0, [SP, #0x4]
  34. mov r0, #0x0
  35. str r0, [SP, #0x8]
  36. add r0, r6, #0x0
  37. mov r1, #0x2
  38. mov r2, #0x0
  39. mov r3, #0x2
  40. bl func_10f7d8
  41. add SP, SP, #0xC
  42.  
  43. mov r0, #0x0
  44. mov r1, #0x1
  45. add r2, r6, #0x0
  46. mov r3, #0xff
  47. bl set_update_function
  48.  
  49. mov r0, 0x0
  50. bl set_ab58
  51.  
  52.  
  53. pop {r4-r7, pc}
  54. }
  55.  
  56. #function draw_interior{
  57. ldr r4, addr
  58. bx r4
  59. addr: .word 0x809D655
  60. }
  61.  
  62. #function draw_border{
  63. ldr r2, addr
  64. bx r2
  65. addr: .word 0x080F7751
  66. }
  67.  
  68. #function print_string{
  69. ldr r4, addr
  70. bx r4
  71. addr: .word 0x08002c49
  72. }
  73.  
  74. #function func_10f7d8{
  75. ldr r4, addr
  76. bx r4
  77. addr: .word 0x0810f7d9
  78. }
  79.  
  80. #function set_ab58{
  81. ldr r1, addr
  82. bx r1
  83. addr: .word 0x080f67a5
  84. }
  85.  
  86. /*This function creates the string representation of the
  87. number box and places it on str_buffer 1. The number contains
  88. an arrow pointing at the currently selected digit, the number
  89. to be printed and some padding zeros if the number has less
  90. digits than the max value set at 0x8008/9 variables.
  91. params
  92. r0 = num to display
  93. r1 = digit with arrow*/
  94. #function create_string{
  95. push {r4-r7, lr}
  96. add r6, r0, #0x0
  97. add r5, r1, #0x0
  98. bl get_max_digit
  99. add r4, r0, #0x0
  100.  
  101. ldr r0, str_buffer
  102. add r1, r6, #0x0
  103. mov r2, #0x0
  104. add r3, r4, #0x0
  105. push {r4}
  106. bl number_to_string
  107. pop {r4}
  108. ldr r0, str_buffer
  109. bl strlen
  110.  
  111. add r1, r4, #0x0
  112. ldr r2, str_buffer
  113. add r3, r5, #0x0
  114. bl copy_and_pad_string
  115. pop {r4-r7, pc}
  116.  
  117. str_buffer: .word 0x02021CD0
  118. }
  119.  
  120. #function get_max_digit{
  121. ldr r3, var_8008
  122. ldr r2, [r3]
  123. cmp r2, #0x0
  124. bne set_count_digits
  125. ldr r2, digit_loc
  126. mov r0, #0x9
  127. lsl r1, r0, #0x2
  128. add r1, r1, r2
  129. ldr r1, [r1]
  130. sub r1, #0x1
  131. str r1, [r3]
  132. mov pc, lr
  133.  
  134.  
  135. set_count_digits:
  136. mov r0, #0x9
  137. ldr r3, digit_loc
  138. count_digit_loop:
  139. lsl r1, r0, #0x2
  140. add r1, r3, r1
  141. ldr r1, [r1]
  142. cmp r1, r2
  143. bhi count_digit_loop_cont
  144. add r0, #0x1
  145. mov pc, lr
  146. count_digit_loop_cont:
  147. sub r0, #0x1
  148. b count_digit_loop
  149.  
  150. var_8008: .word 0x020370C8
  151. digit_loc: .word 0x08231E3C
  152. }
  153.  
  154. #function copy_and_pad_string{
  155. push {r4-r7, lr}
  156. add r7, r2, #0x0
  157. add r6, r3, #0x0
  158. add r5, r1, #0x1
  159. sub r4, r0, #0x1
  160.  
  161. mov r0, #0xff
  162. strb r0, [r7, r5]
  163. sub r5, #0x1
  164.  
  165. str_build_loop:
  166. cmp r6, #0x0
  167. beq add_arrow
  168. cmp r4, #0x0
  169. blt padd_with_zero
  170.  
  171. ldrb r0, [r7, r4]
  172. strb r0, [r7, r5]
  173.  
  174. b str_build_loop_dec
  175. add_arrow:
  176. mov r0, #0x7B
  177. strb r0, [r7, r5]
  178. add r4, #0x1
  179. b str_build_loop_dec
  180.  
  181. padd_with_zero:
  182. mov r0, #0xA1
  183. strb r0, [r7, r5]
  184.  
  185.  
  186. str_build_loop_dec:
  187. sub r6, #0x1
  188. sub r4, #0x1
  189. sub r5, #0x1
  190. cmp r5, #0x0
  191. bge str_build_loop
  192. pop {r4-r7, pc}
  193.  
  194. }
  195.  
  196.  
  197. /*receives
  198. r0 as string location
  199. r1 as number to print
  200. r2 seem to be the Display now byte
  201. r3 as the number of digits*/
  202. #function number_to_string{
  203. ldr r4, addr
  204. bx r4
  205.  
  206. addr: .word 0x08008E79
  207. }
  208.  
  209. #function strlen{
  210. ldr r1, addr
  211. bx r1
  212. addr: .word 0x08008E09
  213. }
  214.  
  215. #function set_update_function{
  216. push {r4-r7, lr}
  217. add r4, r0, #0x0
  218. add r5, r1, #0x0
  219. add r6, r2, #0x0
  220. add r7, r3, #0x0
  221. ldr r0, update_addr
  222. mov r1, #0x50
  223. bl store_function
  224. add r3, r0, #0x0
  225. lsl r0,r0, #0x2
  226. add r0, r0, r3
  227. lsl r0, r0, #0x3
  228. ldr r1, IRAM_Function_queue
  229. add r1, r0, r1
  230. strb r4, [r1, #0x10]
  231. strb r5, [r1, #0x11]
  232. strb r6, [r1, #0x12]
  233. strb r7, [r1, #0x13]
  234. mov r0, #0x0
  235. str r0, [r1, #0x14]
  236. bl get_max_digit
  237. ldr r1, RAM_menu_addr
  238. strb r0, [r1, #0x4]
  239. mov r0, #0x0
  240. strb r0, [r1, #0x2]
  241.  
  242.  
  243. pop {r4-r7, pc}
  244. /* ldr r4, addr
  245. bx r4
  246. addr: .word 0x0809CC19*/
  247. update_addr: .word update_box__addr_t
  248. IRAM_Function_queue: .word 0x03005090
  249. RAM_menu_addr: .word 0x0203ADE4
  250.  
  251. }
  252.  
  253. #function store_function{
  254. ldr r2, addr
  255. bx r2
  256. addr: .word 0x0807741d
  257. }
  258.  
  259. /*r0 = function index in queue
  260. function params
  261. 0x12 (byte) = box id
  262. 0x14 (word) = number counter*/
  263. #function update_box{
  264. push {r4-r6,lr}
  265. add r6, r0, #0x0
  266. ldr r5, IRAM_Function_queue
  267. lsl r0, r6, #0x2
  268. add r0, r0, r6
  269. lsl r0, r0, #0x3
  270. add r5, r0, r5
  271. ldr r4, RAM_menu_addr
  272.  
  273. ldr r0, thread_list_start
  274. ldrh r3, [r0, #0x2e]
  275.  
  276. mov r0, #0x1
  277. and r0, r3
  278. cmp r0, #0x0
  279. bne pressed_a
  280.  
  281. mov r0, #0x2
  282. and r0, r3
  283. cmp r0, #0x0
  284. bne pressed_b
  285.  
  286. mov r0, #0x10
  287. and r0, r3
  288. cmp r0, #0x0
  289. bne pressed_right
  290.  
  291. mov r0, #0x20
  292. and r0, r3
  293. cmp r0, #0x0
  294. bne pressed_left
  295.  
  296. mov r0, #0x40
  297. and r0, r3
  298. cmp r0, #0x0
  299. bne pressed_up
  300.  
  301. mov r0, #0x80
  302. and r0, r3
  303. cmp r0, #0x0
  304. bne pressed_down
  305.  
  306. pop {r4-r6,pc}
  307.  
  308.  
  309. pressed_a: ldr r1, var_8008
  310. ldr r0, [r5, #0x14]
  311. str r0, [r1]
  312. ldr r1, var_800d
  313. ldrb r0, [r4, #0x2]
  314. strh r0, [r1]
  315. b update_clean_function
  316.  
  317. pressed_b: ldr r1, var_800d
  318. mov r0, #0x7f
  319. strh r0, [r1]
  320.  
  321. update_clean_function:
  322. ldr r1, clean_addr
  323. ldrb r0, [r5, #0x12]
  324. mov pc, r1
  325.  
  326. IRAM_Function_queue: .word 0x03005090
  327. thread_list_start: .word 0x030030F0
  328. RAM_menu_addr: .word 0x0203ADE4
  329. var_800d: .word 0x020370d0
  330. clean_addr: .word 0x0809CD2E
  331.  
  332. pressed_left: ldrb r0, [r4, #0x2]
  333. add r0, #0x1
  334. ldrb r1, [r4, #0x4]
  335. cmp r0, r1
  336. blt set_direction
  337. mov r0, #0x0
  338. b set_direction
  339.  
  340. pressed_right: ldrb r0, [r4, #0x2]
  341. sub r0, #0x1
  342. cmp r0, #0x0
  343. bge set_direction
  344. ldrb r0, [r4, #0x4]
  345. sub r0, #0x1
  346.  
  347. set_direction: strb r0, [r4, #0x2]
  348. add r1, r0, #0x0
  349. ldr r0, [r5, #0x14]
  350. ldrb r2, [r5, #0x12]
  351. bl create_and_print_string
  352. pop {r4-r6,pc}
  353.  
  354.  
  355. pressed_up: ldr r1, decimal_table
  356. ldrb r0, [r4, #0x2]
  357. lsl r0, r0, #0x2
  358. add r1, r0, r1
  359. ldr r1, [r1]
  360. ldr r0, [r5, #0x14]
  361. add r0, r1, r0
  362. b check_min
  363. pressed_down: ldr r1, decimal_table
  364. ldrb r0, [r4, #0x2]
  365. lsl r0, r0, #0x2
  366. add r1, r0, r1
  367. ldr r1, [r1]
  368. ldr r0, [r5, #0x14]
  369. sub r0, r0, r1
  370.  
  371. check_min: cmp r0, #0x0
  372. bge check_max
  373. mov r0, #0x0
  374. check_max: ldr r1, var_8008
  375. ldr r1, [r1]
  376. cmp r0, r1
  377. ble set_number
  378. add r0, r1, #0x0
  379.  
  380. set_number: str r0, [r5, #0x14]
  381. ldrb r1, [r4, #0x2]
  382. ldrb r2, [r5, 0x12]
  383. bl create_and_print_string
  384. pop {r4-r6,pc}
  385.  
  386. var_8008: .word 0x020370C8
  387. decimal_table: .word 0x08231E3C
  388. }
  389.  
  390. #function create_and_print_string{
  391. push {lr}
  392. push {r2}
  393. bl create_string
  394.  
  395. pop {r0}
  396. sub SP, SP, #0xC
  397. mov r2, #0x2
  398. str r2, [SP]
  399. mov r2, #0x0
  400. str r2, [sp, #0x4]
  401. mov r2, #0x0
  402. str r2, [sp, #0x8]
  403. mov r1, #0x2
  404. ldr r2, disp_string
  405. mov r3, #0x8
  406. bl print_string
  407. add SP, SP, #0xC
  408. pop {pc}
  409.  
  410. disp_string: .word /*str_display__addr*/0x02021CD0
  411. }
  412.  
  413. /*str_display: .byte 0xA1,0xA1,0xA1,0xA1, 0xA1,0xA1,0xA1,0xA1,0xA1,0x7b, 0xff*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement