Advertisement
psimastercarlos

Sideways Stairs Routine

Jan 19th, 2019
623
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.35 KB | None | 0 0
  1. .thumb
  2.  
  3. @ --- Change these:
  4. .equ start_address, 0x7487A0 @ Word-aligned address in your ROM with 0xC38 bytes of free space
  5. .equ behaviour_0, 0xB0 @ First of six contiguous, free behaviour bytes
  6. @ ---
  7.  
  8. .equ behaviour_1, (behaviour_0 + 1)
  9. .equ behaviour_2, (behaviour_1 + 1)
  10. .equ behaviour_3, (behaviour_2 + 1)
  11. .equ behaviour_4, (behaviour_3 + 1)
  12. .equ behaviour_5, (behaviour_4 + 1)
  13.  
  14. .equ npc_states, 0x02036E38
  15. .equ walkrun_state, 0x02037078
  16.  
  17. .equ rom, 0x08000000
  18. .equ change_movement_return, 0x0805BB66|1
  19. .equ walk_return, 0x0805C10E|1
  20. .equ run_return, 0x0805C156|1
  21. .equ bike_return, 0x0805C186|1
  22. .equ npc_set_direction, 0x0805FBDC|1
  23. .equ numbers_move_direction, 0x08063A20|1
  24. .equ sub_8063F84, 0x08063F84|1
  25. .equ sub_8064008, 0x08064008|1
  26. .equ sub_806408C, 0x0806408C|1
  27. .equ npc_apply_direction_return, 0x080646AC|1
  28. .equ an_run_any_return, 0x08064728|1
  29. .equ npc_obj_ministep_stop_on_arrival_return, 0x08064794|1
  30. .equ sub_80649C8_return, 0x080649D0|1
  31. .equ npc_08064C04_and_modify_priv1_return, 0x08064C10|1
  32. .equ an_pulse_dn_2_return, 0x08064D64|1
  33. .equ sub_8065EF0_return, 0x08065F18|1
  34. .equ sub_8065F60_return, 0x08065F6E|1
  35. .equ sub_8065F8C_return, 0x08065F98|1
  36. .equ sub_8065FE4_return, 0x08065FEE|1
  37. .equ an_stop, 0x08067934|1
  38. .equ little_step, 0x08068A8C|1
  39. .equ obj_npc_ministep_return, 0x08068B8C|1
  40. .equ sub_8068C18_return_0, 0x08068C30|1
  41. .equ sub_8068C18_return_1, 0x08068C3E|1
  42. .equ sub_8068CB4_return_0, 0x08068CDE|1
  43. .equ sub_8068CB4_return_1, 0x08068CE8|1
  44. .equ change_movement_2_return, 0x080BD3D0|1
  45. .equ memcpy, 0x081E5E78|1
  46. .equ off_83A6884, 0x083A6884
  47. .equ stepspeeds, 0x083A719C
  48. .equ stepspeed_seq_length, 0x083A71B0
  49.  
  50. .equ npc_tile_to, 0x1E
  51. .equ walkrun_npcid, 0x05
  52.  
  53. .equ left, 0x03
  54. .equ right, 0x04
  55. .equ down_and_left, 0x05
  56. .equ down_and_right, 0x06
  57. .equ up_and_left, 0x07
  58. .equ up_and_right, 0x08
  59.  
  60. .org 0x5BB5C, 0xFF
  61. ldr r0, =(rom + change_movement + 1)
  62. bx r0
  63. .pool
  64.  
  65. .org 0x5C104, 0xFF
  66. ldr r1, =(rom + walk + 1)
  67. bx r1
  68. .pool
  69.  
  70. .org 0x5C14C, 0xFF
  71. ldr r1, =(rom + bike + 1)
  72. bx r1
  73. .pool
  74.  
  75. .org 0x5C17C, 0xFF
  76. ldr r1, =(rom + run + 1)
  77. bx r1
  78. .pool
  79.  
  80. .org 0x64540, 0xFF
  81. .word (rom + an_table)
  82. .pool
  83.  
  84. .org 0x64584, 0xFF
  85. .word (rom + an_table)
  86. .pool
  87.  
  88. .org 0x645B4, 0xFF
  89. .word (rom + an_table)
  90. .pool
  91.  
  92. .org 0xBD3C8, 0xFF
  93. ldr r0, =(rom + change_movement_2 + 1)
  94. bx r0
  95. .pool
  96.  
  97. .org start_address, 0xFF
  98.  
  99. .align 2
  100. change_movement:
  101. mov r0, r5
  102. bl change_movement_main
  103. add r1, sp, #4
  104. mov r2, r4
  105. ldr r3, =(numbers_move_direction)
  106. bl call_via_r3
  107. ldr r3, =(change_movement_return)
  108.  
  109. call_via_r3:
  110. bx r3
  111.  
  112. .align 2
  113. change_movement_2:
  114. mov r0, r4
  115. bl change_movement_main
  116. add r1, sp, #4
  117. mov r2, r5
  118. ldr r3, =(numbers_move_direction)
  119. bl call_via_r3
  120. ldr r3, =(change_movement_2_return)
  121. bx r3
  122.  
  123. .align 2
  124. change_movement_main:
  125. push {lr}
  126. ldrb r0, [r0, #npc_tile_to]
  127.  
  128. branch_from_behaviour_byte:
  129. cmp r0, #behaviour_0
  130. beq behaviour_0_check
  131. cmp r0, #behaviour_1
  132. beq behaviour_1_check
  133. cmp r0, #behaviour_2
  134. beq behaviour_2_check
  135. cmp r0, #behaviour_3
  136. beq behaviour_3_check
  137. cmp r0, #behaviour_4
  138. beq behaviour_4_check
  139. cmp r0, #behaviour_5
  140. beq behaviour_5_check
  141. b normal_tile_behaviour
  142.  
  143. behaviour_0_check:
  144. cmp r6, #left
  145. beq move_up_and_left
  146. cmp r6, #right
  147. beq move_down_and_right
  148. b normal_tile_behaviour
  149.  
  150. behaviour_1_check:
  151. cmp r6, #left
  152. beq move_up_and_left
  153. b normal_tile_behaviour
  154.  
  155. behaviour_2_check:
  156. cmp r6, #right
  157. beq move_down_and_right
  158. b normal_tile_behaviour
  159.  
  160. behaviour_3_check:
  161. cmp r6, #left
  162. beq move_down_and_left
  163. cmp r6, #right
  164. beq move_up_and_right
  165. b normal_tile_behaviour
  166.  
  167. behaviour_4_check:
  168. cmp r6, #right
  169. beq move_up_and_right
  170. b normal_tile_behaviour
  171.  
  172. behaviour_5_check:
  173. cmp r6, #left
  174. beq move_down_and_left
  175. b normal_tile_behaviour
  176.  
  177. move_down_and_left:
  178. mov r0, #down_and_left
  179. b set_player_movement
  180.  
  181. move_down_and_right:
  182. mov r0, #down_and_right
  183. b set_player_movement
  184.  
  185. move_up_and_left:
  186. mov r0, #up_and_left
  187. b set_player_movement
  188.  
  189. move_up_and_right:
  190. mov r0, #up_and_right
  191. b set_player_movement
  192.  
  193. normal_tile_behaviour:
  194. mov r0, r6
  195.  
  196. set_player_movement:
  197. pop {r3}
  198. bx r3
  199.  
  200. .align 2
  201. .pool
  202.  
  203. walk:
  204. push {lr}
  205. push {r0}
  206. ldr r0, =(walkrun_state)
  207. ldrb r1, [r0, #walkrun_npcid]
  208. lsl r0, r1, #3
  209. add r0, r0, r1
  210. lsl r0, r0, #2
  211. ldr r1, =(npc_states)
  212. add r0, r0, r1
  213. ldrb r1, [r0, #npc_tile_to]
  214. pop {r0}
  215. lsl r0, r0, #24
  216. lsr r0, r0, #24
  217. cmp r1, #behaviour_0
  218. blt not_walking_on_stair
  219. cmp r1, #behaviour_5
  220. bgt not_walking_on_stair
  221. mov r2, #0
  222. ldr r3, =(rom + use_table + 1)
  223. bl call_via_r3
  224. b walk_end
  225.  
  226. not_walking_on_stair:
  227. ldr r3, =(sub_8063F84)
  228. bl call_via_r3
  229.  
  230. walk_end:
  231. ldr r3, =(walk_return)
  232. bx r3
  233.  
  234. .align 2
  235. bike:
  236. push {lr}
  237. push {r0}
  238. ldr r0, =(walkrun_state)
  239. ldrb r1, [r0, #walkrun_npcid]
  240. lsl r0, r1, #3
  241. add r0, r0, r1
  242. lsl r0, r0, #2
  243. ldr r1, =(npc_states)
  244. add r0, r0, r1
  245. ldrb r1, [r0, #npc_tile_to]
  246. pop {r0}
  247. lsl r0, r0, #24
  248. lsr r0, r0, #24
  249. cmp r1, #behaviour_0
  250. blt not_biking_on_stair
  251. cmp r1, #behaviour_5
  252. bgt not_biking_on_stair
  253. mov r2, #1
  254. ldr r3, =(rom + use_table + 1)
  255. bl call_via_r3
  256. b bike_end
  257.  
  258. not_biking_on_stair:
  259. ldr r3, =(sub_8064008)
  260. bl call_via_r3
  261.  
  262. bike_end:
  263. ldr r3, =(bike_return)
  264. bx r3
  265.  
  266. .align 2
  267. run:
  268. push {lr}
  269. push {r0}
  270. ldr r0, =(walkrun_state)
  271. ldrb r1, [r0, #walkrun_npcid]
  272. lsl r0, r1, #3
  273. add r0, r0, r1
  274. lsl r0, r0, #2
  275. ldr r1, =(npc_states)
  276. add r0, r0, r1
  277. ldrb r1, [r0, #npc_tile_to]
  278. pop {r0}
  279. lsl r0, r0, #24
  280. lsr r0, r0, #24
  281. cmp r1, #behaviour_0
  282. blt not_running_on_stair
  283. cmp r1, #behaviour_5
  284. bgt not_running_on_stair
  285. mov r2, #2
  286. ldr r3, =(rom + use_table + 1)
  287. bl call_via_r3
  288. b run_end
  289.  
  290. not_running_on_stair:
  291. ldr r3, =(sub_806408C)
  292. bl call_via_r3
  293.  
  294. run_end:
  295. ldr r3, =(run_return)
  296. bx r3
  297.  
  298. .align 2
  299. use_table:
  300. push {r4, lr}
  301. sub sp, #8
  302. lsl r0, r0, #24
  303. lsr r4, r0, #24
  304.  
  305. get_table_from_r2:
  306. ldr r0, =(rom + table_of_tables)
  307. lsl r2, r2, #2
  308. add r2, r2, r0
  309.  
  310. get_entry_from_behaviour_byte:
  311. sub r1, #behaviour_0
  312. lsl r1, r1, #2
  313. ldr r2, [r2]
  314. add r1, r1, r2
  315. ldr r1, [r1]
  316.  
  317. call_memcpy_with_entry:
  318. mov r0, sp
  319. mov r2, #5
  320. ldr r3, =(memcpy)
  321. bl call_via_r3
  322. cmp r4, #4
  323. bls use_table_end
  324. mov r4, #0
  325.  
  326. use_table_end:
  327. mov r1, sp
  328. add r0, r1, r4
  329. ldrb r0, [r0]
  330. add sp, #8
  331. pop {r4, pc}
  332.  
  333. walk_entry_0: .byte 0x10, 0x10, 0x11, 0xAC, 0xAB
  334. walk_entry_1: .byte 0x10, 0x10, 0x11, 0xAC, 0x13
  335. walk_entry_2: .byte 0x10, 0x10, 0x11, 0x12, 0xAB
  336. walk_entry_3: .byte 0x10, 0x10, 0x11, 0xAA, 0xAD
  337. walk_entry_4: .byte 0x10, 0x10, 0x11, 0x12, 0xAD
  338. walk_entry_5: .byte 0x10, 0x10, 0x11, 0xAA, 0x13
  339.  
  340. bike_entry_0: .byte 0x31, 0x31, 0x32, 0xB4, 0xB3
  341. bike_entry_1: .byte 0x31, 0x31, 0x32, 0xB4, 0x34
  342. bike_entry_2: .byte 0x31, 0x31, 0x32, 0x33, 0xB3
  343. bike_entry_3: .byte 0x31, 0x31, 0x32, 0xB2, 0xB5
  344. bike_entry_4: .byte 0x31, 0x31, 0x32, 0x33, 0xB5
  345. bike_entry_5: .byte 0x31, 0x31, 0x32, 0xB2, 0x34
  346.  
  347. run_entry_0: .byte 0x3D, 0x3D, 0x3E, 0xB1, 0xAF
  348. run_entry_1: .byte 0x3D, 0x3D, 0x3E, 0xB1, 0x40
  349. run_entry_2: .byte 0x3D, 0x3D, 0x3E, 0x3F, 0xAF
  350. run_entry_3: .byte 0x3D, 0x3D, 0x3E, 0xAE, 0xB0
  351. run_entry_4: .byte 0x3D, 0x3D, 0x3E, 0x3F, 0xB0
  352. run_entry_5: .byte 0x3D, 0x3D, 0x3E, 0xAE, 0x40
  353.  
  354. .align 2
  355. walk_table: .word (rom + walk_entry_0), (rom + walk_entry_1), (rom + walk_entry_2), (rom + walk_entry_3), (rom + walk_entry_4), (rom + walk_entry_5)
  356. bike_table: .word (rom + bike_entry_0), (rom + bike_entry_1), (rom + bike_entry_2), (rom + bike_entry_3), (rom + bike_entry_4), (rom + bike_entry_5)
  357. run_table: .word (rom + run_entry_0), (rom + run_entry_1), (rom + run_entry_2), (rom + run_entry_3), (rom + run_entry_4), (rom + run_entry_5)
  358. table_of_tables: .word (rom + walk_table), (rom + bike_table), (rom + run_table)
  359.  
  360. .pool
  361.  
  362. an_table:
  363. .word 0x083A6864, 0x083A686C, 0x083A6874, 0x083A687C, 0x083A6A30, 0x083A6A38, 0x083A6A40, 0x083A6A48, 0x083A68C8, 0x083A68D4, 0x083A68E0, 0x083A68EC, 0x083A6904, 0x083A68F8, 0x083A6910, 0x083A691C, 0x083A6928, 0x083A6934, 0x083A6940, 0x083A694C, 0x083A6964, 0x083A6970, 0x083A697C, 0x083A6988, 0x083A6994, 0x083A69A0, 0x083A69AC, 0x083A69B8, 0x083A69C4, 0x083A69D0, 0x083A69DC, 0x083A69E8, 0x083A69F4, 0x083A6A50, 0x083A6A5C, 0x083A6A68, 0x083A6A74, 0x083A6A80, 0x083A6A8C, 0x083A6A98, 0x083A6AA4, 0x083A6AB0, 0x083A6ABC, 0x083A6AC8, 0x083A6AD4, 0x083A6AE0, 0x083A6AEC, 0x083A6AF8, 0x083A6B04, 0x083A6B10, 0x083A6B1C, 0x083A6B28, 0x083A6B34, 0x083A6B40, 0x083A6B4C, 0x083A6B58, 0x083A6B64, 0x083A6B70, 0x083A6B7C, 0x083A6B88, 0x083A6B94, 0x083A6BA0, 0x083A6BAC, 0x083A6BB8, 0x083A6BC4, 0x083A6BD0, 0x083A6BDC, 0x083A6BE8, 0x083A6BF4, 0x083A6C00, 0x083A6C0C, 0x083A6C18, 0x083A6C24, 0x083A6C30, 0x083A6C6C, 0x083A6C74, 0x083A6C7C, 0x083A6C84, 0x083A6C8C, 0x083A6C98, 0x083A6CA4, 0x083A6CB0, 0x083A6CBC, 0x083A6CC8, 0x083A6CD4, 0x083A6CE0, 0x083A6CEC, 0x083A6CF8, 0x083A6D04, 0x083A6D10, 0x083A6D1C, 0x083A6D24, 0x083A6D30, 0x083A6D38, 0x083A6D40, 0x083A6D48, 0x083A6D50, 0x083A6D58, 0x083A6D60, 0x083A6D68, 0x083A6D70, 0x083A6D78, 0x083A6D80, 0x083A6D88, 0x083A6D94, 0x083A6DA4, 0x083A6DB4, 0x083A6DBC, 0x083A6DC4, 0x083A6DCC, 0x083A6DD4, 0x083A6DE0, 0x083A6DEC, 0x083A6DF4, 0x083A6DFC, 0x083A6E04, 0x083A6E0C, 0x083A6E18, 0x083A6E24, 0x083A6E30, 0x083A6E3C, 0x083A6E48, 0x083A6E54, 0x083A6E60, 0x083A6E9C, 0x083A6EA8, 0x083A6EB4, 0x083A6EC0, 0x083A6ECC, 0x083A6ED8, 0x083A6EE4, 0x083A6EF0, 0x083A6EFC, 0x083A6F08, 0x083A6F14, 0x083A6F20, 0x083A6F2C, 0x083A6F38, 0x083A6F44, 0x083A6F50, 0x083A6F5C, 0x083A6F68, 0x083A6F74, 0x083A6F80, 0x083A6F8C, 0x083A6F98, 0x083A6FA4, 0x083A6FB0, 0x083A6FBC, 0x083A6FC8, 0x083A6FD4, 0x083A6FE0, 0x083A6FEC, 0x083A6FF4, 0x083A6FFC, 0x083A6898, 0x083A68A4, 0x083A68B0, 0x083A68BC, 0x083A7004, 0x083A6A00, 0x083A6A0C, 0x083A6A18, 0x083A6A24, 0x083A700C, 0x083A7018, 0x083A6C3C, 0x083A6C48, 0x083A6C54, 0x083A6C60, (rom + entry_0), (rom + entry_1), (rom + entry_2), (rom + entry_3), (rom + entry_4), (rom + entry_5), (rom + entry_6), (rom + entry_7), (rom + entry_8), (rom + entry_9), (rom + entry_10), (rom + entry_11)
  364.  
  365. entry_0: .word (rom + routine_0 + 1), (rom + routine_1 + 1), an_stop
  366. entry_1: .word (rom + routine_2 + 1), (rom + routine_1 + 1), an_stop
  367. entry_2: .word (rom + routine_3 + 1), (rom + routine_4 + 1), an_stop
  368. entry_3: .word (rom + routine_5 + 1), (rom + routine_4 + 1), an_stop
  369. entry_4: .word (rom + routine_6 + 1), (rom + routine_7 + 1), an_stop
  370. entry_5: .word (rom + routine_8 + 1), (rom + routine_7 + 1), an_stop
  371. entry_6: .word (rom + routine_9 + 1), (rom + routine_10 + 1), an_stop
  372. entry_7: .word (rom + routine_11 + 1), (rom + routine_10 + 1), an_stop
  373. entry_8: .word (rom + routine_12 + 1), (rom + routine_13 + 1), an_stop
  374. entry_9: .word (rom + routine_14 + 1), (rom + routine_13 + 1), an_stop
  375. entry_10: .word (rom + routine_15 + 1), (rom + routine_16 + 1), an_stop
  376. entry_11: .word (rom + routine_17 + 1), (rom + routine_16 + 1), an_stop
  377.  
  378. routine_0:
  379. push {r4, r5, lr}
  380. mov r4, r0
  381. mov r5, r1
  382. mov r2, #3
  383. mov r3, #0
  384. bl subroutine_0
  385. mov r0, r4
  386. mov r1, r5
  387. bl routine_1
  388. lsl r0, r0, #24
  389. lsr r0, r0, #24
  390. pop {r4, r5, pc}
  391.  
  392. routine_2:
  393. push {r4, r5, lr}
  394. mov r4, r0
  395. mov r5, r1
  396. mov r2, #4
  397. mov r3, #0
  398. bl subroutine_0
  399. mov r0, r4
  400. mov r1, r5
  401. bl routine_1
  402. lsl r0, r0, #24
  403. lsr r0, r0, #24
  404. pop {r4, r5, pc}
  405.  
  406. subroutine_0:
  407. push {r4-r7, lr}
  408. mov r7, r8
  409. push {r7}
  410. sub sp, #0x14
  411. mov r5, r0
  412. mov r8, r1
  413. mov r4, r3
  414. lsl r2, r2, #24
  415. lsr r2, r2, #24
  416. lsl r4, r4, #24
  417. lsr r4, r4, #24
  418. mov r1, sp
  419. ldr r0, =(off_83A6884)
  420. ldmia r0!, {r3, r6, r7}
  421. stmia r1!, {r3, r6, r7}
  422. ldmia r0!, {r3, r6}
  423. stmia r1!, {r3, r6}
  424. mov r0, r5
  425. mov r1, r8
  426. mov r3, r4
  427. bl subroutine_1
  428. ldr r7, =(an_run_any_return)
  429. bx r7
  430.  
  431. subroutine_1:
  432. push {r4-r6, lr}
  433. mov r6, r9
  434. mov r5, r8
  435. push {r5, r6}
  436. sub sp, #4
  437. mov r8, r0
  438. mov r9, r1
  439. mov r4, r2
  440. mov r6, r3
  441. lsl r4, r4, #24
  442. lsr r4, r4, #24
  443. lsl r6, r6, #24
  444. lsr r6, r6, #24
  445. ldrh r1, [r0, #0x10]
  446. mov r0, sp
  447. strh r1, [r0]
  448. mov r1, r8
  449. ldrh r0, [r1, #0x12]
  450. mov r5, sp
  451. add r5, #2
  452. strh r0, [r5]
  453. mov r0, r8
  454. mov r1, r4
  455. ldr r3, =(npc_set_direction)
  456. bl call_via_r3
  457. ldr r1, =(rom + byte_list)
  458. sub r2, r4, #1
  459. lsl r2, r2, #1
  460. ldsh r0, [r1, r2]
  461. ldr r1, =(npc_apply_direction_return)
  462. bx r1
  463.  
  464. routine_1:
  465. push {r4, lr}
  466. mov r4, r1
  467. bl subroutine_2
  468. ldr r1, =(sub_80649C8_return)
  469. bx r1
  470.  
  471. subroutine_2:
  472. push {r4, r5, lr}
  473. mov r4, r0
  474. mov r5, r1
  475. mov r0, r5
  476. bl subroutine_3
  477. ldr r1, =(npc_08064C04_and_modify_priv1_return)
  478. bx r1
  479.  
  480. subroutine_3:
  481. push {r4, lr}
  482. mov r4, r0
  483. ldrh r0, [r4, #0x36]
  484. add r0, #1
  485. strh r0, [r4, #0x36]
  486. lsl r0, r0, #16
  487. asr r0, r0, #16
  488. cmp r0, #2
  489. bgt subroutine_3_r0_gt_2
  490. ldrh r1, [r4, #0x34]
  491. lsl r1, r1, #24
  492. lsr r1, r1, #24
  493. ldr r0, =(rom + byte_list)
  494. sub r1, #1
  495. lsl r1, r1, #1
  496. ldsh r1, [r0, r1]
  497. ldr r0, =(sub_8068C18_return_0)
  498. bx r0
  499.  
  500. subroutine_3_r0_gt_2:
  501. ldr r1, =(sub_8068C18_return_1)
  502. bx r1
  503.  
  504. .align 2
  505. .pool
  506.  
  507. routine_3:
  508. push {r4, r5, lr}
  509. mov r4, r0
  510. mov r5, r1
  511. mov r2, #3
  512. mov r3, #0
  513. bl subroutine_4
  514. mov r0, r4
  515. mov r1, r5
  516. bl routine_4
  517. lsl r0, r0, #24
  518. lsr r0, r0, #24
  519. pop {r4, r5, pc}
  520.  
  521. routine_5:
  522. push {r4, r5, lr}
  523. mov r4, r0
  524. mov r5, r1
  525. mov r2, #4
  526. mov r3, #0
  527. bl subroutine_4
  528. mov r0, r4
  529. mov r1, r5
  530. bl routine_4
  531. lsl r0, r0, #24
  532. lsr r0, r0, #24
  533. pop {r4, r5, pc}
  534.  
  535. subroutine_4:
  536. push {r4-r7, lr}
  537. mov r7, r8
  538. push {r7}
  539. sub sp, #0x14
  540. mov r5, r0
  541. mov r8, r1
  542. mov r4, r3
  543. lsl r2, r2, #24
  544. lsr r2, r2, #24
  545. lsl r4, r4, #24
  546. lsr r4, r4, #24
  547. mov r1, sp
  548. ldr r0, =(off_83A6884)
  549. ldmia r0!, {r3, r6, r7}
  550. stmia r1!, {r3, r6, r7}
  551. ldmia r0!, {r3, r6}
  552. stmia r1!, {r3, r6}
  553. mov r0, r5
  554. mov r1, r8
  555. mov r3, r4
  556. bl subroutine_5
  557. ldr r7, =(an_run_any_return)
  558. bx r7
  559.  
  560. subroutine_5:
  561. push {r4-r6, lr}
  562. mov r6, r9
  563. mov r5, r8
  564. push {r5, r6}
  565. sub sp, #4
  566. mov r8, r0
  567. mov r9, r1
  568. mov r4, r2
  569. mov r6, r3
  570. lsl r4, r4, #24
  571. lsr r4, r4, #24
  572. lsl r6, r6, #24
  573. lsr r6, r6, #24
  574. ldrh r1, [r0, #0x10]
  575. mov r0, sp
  576. strh r1, [r0]
  577. mov r1, r8
  578. ldrh r0, [r1, #0x12]
  579. mov r5, sp
  580. add r5, #2
  581. strh r0, [r5]
  582. mov r0, r8
  583. mov r1, r4
  584. ldr r3, =(npc_set_direction)
  585. bl call_via_r3
  586. ldr r1, =(rom + byte_list)
  587. add r2, r4, #3
  588. lsl r2, r2, #1
  589. ldsh r0, [r1, r2]
  590. ldr r1, =(npc_apply_direction_return)
  591. bx r1
  592.  
  593. routine_4:
  594. push {r4, lr}
  595. mov r4, r1
  596. bl subroutine_6
  597. ldr r1, =(sub_80649C8_return)
  598. bx r1
  599.  
  600. subroutine_6:
  601. push {r4, r5, lr}
  602. mov r4, r0
  603. mov r5, r1
  604. mov r0, r5
  605. bl subroutine_7
  606. ldr r1, =(npc_08064C04_and_modify_priv1_return)
  607. bx r1
  608.  
  609. subroutine_7:
  610. push {r4, lr}
  611. mov r4, r0
  612. ldrh r0, [r4, #0x36]
  613. add r0, #1
  614. strh r0, [r4, #0x36]
  615. lsl r0, r0, #16
  616. asr r0, r0, #16
  617. cmp r0, #2
  618. bgt subroutine_7_r0_gt_2
  619. ldrh r1, [r4, #0x34]
  620. lsl r1, r1, #24
  621. lsr r1, r1, #24
  622. ldr r0, =(rom + byte_list)
  623. add r1, #3
  624. lsl r1, r1, #1
  625. ldsh r1, [r0, r1]
  626. ldr r0, =(sub_8068C18_return_0)
  627. bx r0
  628.  
  629. subroutine_7_r0_gt_2:
  630. ldr r1, =(sub_8068C18_return_1)
  631. bx r1
  632.  
  633. .align 2
  634. .pool
  635.  
  636. routine_6:
  637. push {r4, r5, lr}
  638. mov r4, r0
  639. mov r5, r1
  640. mov r2, #3
  641. mov r3, #0
  642. bl subroutine_23
  643. mov r0, r4
  644. mov r1, r5
  645. bl routine_7
  646. lsl r0, r0, #24
  647. lsr r0, r0, #24
  648. pop {r4, r5, pc}
  649.  
  650. routine_8:
  651. push {r4, r5, lr}
  652. mov r4, r0
  653. mov r5, r1
  654. mov r2, #4
  655. mov r3, #0
  656. bl subroutine_23
  657. mov r0, r4
  658. mov r1, r5
  659. bl routine_7
  660. lsl r0, r0, #24
  661. lsr r0, r0, #24
  662. pop {r4, r5, pc}
  663.  
  664. subroutine_23:
  665. push {r4, r5, lr}
  666. mov r4, r0
  667. mov r5, r1
  668. lsl r2, r2, #24
  669. lsr r2, r2, #24
  670. bl subroutine_8
  671. ldr r1, =(sub_8065F60_return)
  672. bx r1
  673.  
  674. subroutine_8:
  675. push {r4-r6, lr}
  676. mov r6, r8
  677. push {r6}
  678. sub sp, #4
  679. mov r6, r0
  680. mov r8, r1
  681. lsl r5, r2, #24
  682. lsr r5, r5, #24
  683. ldrh r1, [r6, #0x10]
  684. mov r0, sp
  685. strh r1, [r0]
  686. ldrh r0, [r6, #0x12]
  687. mov r4, sp
  688. add r4, #2
  689. strh r0, [r4]
  690. mov r0, r6
  691. mov r1, r5
  692. ldr r3, =(npc_set_direction)
  693. bl call_via_r3
  694. ldr r1, =(rom + byte_list)
  695. sub r2, r5, #1
  696. lsl r2, r2, #1
  697. ldsh r0, [r1, r2]
  698. ldr r1, =(sub_8065EF0_return)
  699. bx r1
  700.  
  701. routine_7:
  702. push {r4, lr}
  703. mov r4, r1
  704. bl subroutine_9
  705. ldr r1, =(sub_8065FE4_return)
  706. bx r1
  707.  
  708. subroutine_9:
  709. push {r4, r5, lr}
  710. mov r4, r0
  711. mov r5, r1
  712. mov r0, r5
  713. bl subroutine_10
  714. ldr r1, =(sub_8065F8C_return)
  715. bx r1
  716.  
  717. subroutine_10:
  718. push {r4, lr}
  719. mov r4, r0
  720. ldrh r0, [r4, #0x36]
  721. add r0, #1
  722. strh r0, [r4, #0x36]
  723. mov r1, #1
  724. and r0, r1
  725. cmp r0, #0
  726. beq subroutine_10_r0_eq_0
  727. ldrh r1, [r4, #0x34]
  728. lsl r1, r1, #24
  729. lsr r1, r1, #24
  730. ldr r0, =(rom + byte_list)
  731. sub r1, #1
  732. lsl r1, r1, #1
  733. ldsh r1, [r0, r1]
  734. mov r0, r4
  735. ldr r3, =(little_step)
  736. bl call_via_r3
  737. ldrh r0, [r4, #0x38]
  738. add r0, #1
  739. ldr r3, =(sub_8068CB4_return_1)
  740. bx r3
  741.  
  742. subroutine_10_r0_eq_0:
  743. ldrh r1, [r4, #0x34]
  744. lsl r1, r1, #0x18
  745. lsr r1, r1, #0x18
  746. ldr r0, =(rom + byte_list)
  747. sub r1, #1
  748. lsl r1, r1, #1
  749. ldsh r1, [r0, r1]
  750. ldr r3, =(sub_8068CB4_return_0)
  751. bx r3
  752.  
  753. .align 2
  754. .pool
  755.  
  756. routine_9:
  757. push {r4, r5, lr}
  758. mov r4, r0
  759. mov r5, r1
  760. mov r2, #4
  761. mov r3, #0
  762. bl subroutine_11
  763. mov r0, r4
  764. mov r1, r5
  765. bl routine_10
  766. lsl r0, r0, #24
  767. lsr r0, r0, #24
  768. pop {r4, r5, pc}
  769.  
  770. routine_11:
  771. push {r4, r5, lr}
  772. mov r4, r0
  773. mov r5, r1
  774. mov r2, #3
  775. mov r3, #0
  776. bl subroutine_11
  777. mov r0, r4
  778. mov r1, r5
  779. bl routine_10
  780. lsl r0, r0, #24
  781. lsr r0, r0, #24
  782. pop {r4, r5, pc}
  783.  
  784. routine_10:
  785. push {r4, lr}
  786. mov r4, r1
  787. bl subroutine_13
  788. ldr r1, =(sub_8065FE4_return)
  789. bx r1
  790.  
  791. subroutine_11:
  792. push {r4, r5, lr}
  793. mov r4, r0
  794. mov r5, r1
  795. lsl r2, r2, #24
  796. lsr r2, r2, #24
  797. bl subroutine_12
  798. ldr r1, =(sub_8065F60_return)
  799. bx r1
  800.  
  801. subroutine_12:
  802. push {r4-r6, lr}
  803. mov r6, r8
  804. push {r6}
  805. sub sp, #4
  806. mov r6, r0
  807. mov r8, r1
  808. lsl r5, r2, #24
  809. lsr r5, r5, #24
  810. ldrh r1, [r6, #0x10]
  811. mov r0, sp
  812. strh r1, [r0]
  813. ldrh r0, [r6, #0x12]
  814. mov r4, sp
  815. add r4, #2
  816. strh r0, [r4]
  817. mov r0, r6
  818. mov r1, r5
  819. ldr r3, =(npc_set_direction)
  820. bl call_via_r3
  821. ldr r1, =(rom + byte_list)
  822. add r2, r5, #3
  823. lsl r2, r2, #1
  824. ldsh r0, [r1, r2]
  825. ldr r1, =(sub_8065EF0_return)
  826. bx r1
  827.  
  828. subroutine_13:
  829. push {r4, r5, lr}
  830. mov r4, r0
  831. mov r5, r1
  832. mov r0, r5
  833. bl subroutine_14
  834. ldr r1, =(sub_8065F8C_return)
  835. bx r1
  836.  
  837. subroutine_14:
  838. push {r4, lr}
  839. mov r4, r0
  840. ldrh r0, [r4, #0x36]
  841. add r0, #1
  842. strh r0, [r4, #0x36]
  843. mov r1, #1
  844. and r0, r1
  845. cmp r0, #0
  846. beq subroutine_14_r0_eq_0
  847. ldrh r1, [r4, #0x34]
  848. lsl r1, r1, #24
  849. lsr r1, r1, #24
  850. ldr r0, =(rom + byte_list)
  851. add r1, #3
  852. lsl r1, r1, #1
  853. ldsh r1, [r0, r1]
  854. mov r0, r4
  855. ldr r3, =(little_step)
  856. bl call_via_r3
  857. ldrh r0, [r4, #0x38]
  858. add r0, #1
  859. ldr r3, =(sub_8068CB4_return_1)
  860. bx r3
  861.  
  862. subroutine_14_r0_eq_0:
  863. ldrh r1, [r4, #0x34]
  864. lsl r1, r1, #0x18
  865. lsr r1, r1, #0x18
  866. ldr r0, =(rom + byte_list)
  867. add r1, #3
  868. lsl r1, r1, #1
  869. ldsh r1, [r0, r1]
  870. ldr r3, =(sub_8068CB4_return_0)
  871. bx r3
  872.  
  873. .align 2
  874. .pool
  875.  
  876. routine_12:
  877. push {r4, r5, lr}
  878. mov r4, r0
  879. mov r5, r1
  880. mov r2, #3
  881. mov r3, #1
  882. bl subroutine_15
  883. mov r0, r4
  884. mov r1, r5
  885. bl routine_13
  886. lsl r0, r0, #24
  887. lsr r0, r0, #24
  888. pop {r4, r5, pc}
  889.  
  890. routine_14:
  891. push {r4, r5, lr}
  892. mov r4, r0
  893. mov r5, r1
  894. mov r2, #4
  895. mov r3, #1
  896. bl subroutine_15
  897. mov r0, r4
  898. mov r1, r5
  899. bl routine_13
  900. lsl r0, r0, #24
  901. lsr r0, r0, #24
  902. pop {r4, r5, pc}
  903.  
  904. subroutine_15:
  905. push {r4-r7, lr}
  906. mov r7, r8
  907. push {r7}
  908. sub sp, #0x14
  909. mov r5, r0
  910. mov r8, r1
  911. mov r4, r3
  912. lsl r2, r2, #24
  913. lsr r2, r2, #24
  914. lsl r4, r4, #24
  915. lsr r4, r4, #24
  916. mov r1, sp
  917. ldr r0, =(off_83A6884)
  918. ldmia r0!, {r3, r6, r7}
  919. stmia r1!, {r3, r6, r7}
  920. ldmia r0!, {r3, r6}
  921. stmia r1!, {r3, r6}
  922. mov r0, r5
  923. mov r1, r8
  924. mov r3, r4
  925. bl subroutine_16
  926. ldr r7, =(an_run_any_return)
  927. bx r7
  928.  
  929. subroutine_16:
  930. push {r4-r6, lr}
  931. mov r6, r8
  932. mov r5, r9
  933. push {r5, r6}
  934. sub sp, #4
  935. mov r8, r0
  936. mov r9, r1
  937. mov r4, r2
  938. mov r6, r3
  939. lsl r4, r4, #24
  940. lsr r4, r4, #24
  941. lsl r6, r6, #24
  942. lsr r6, r6, #24
  943. ldrh r1, [r0, #0x10]
  944. mov r0, sp
  945. strh r1, [r0]
  946. mov r1, r8
  947. ldrh r0, [r1, #0x12]
  948. mov r5, sp
  949. add r5, #2
  950. strh r0, [r5]
  951. mov r0, r8
  952. mov r1, r4
  953. ldr r3, =(npc_set_direction)
  954. bl call_via_r3
  955. ldr r1, =(rom + byte_list)
  956. sub r2, r4, #1
  957. lsl r2, r2, #1
  958. ldsh r0, [r1, r2]
  959. ldr r1, =(npc_apply_direction_return)
  960. bx r1
  961.  
  962. routine_13:
  963. push {r4, lr}
  964. mov r4, r1
  965. bl subroutine_17
  966. ldr r1, =(an_pulse_dn_2_return)
  967. bx r1
  968.  
  969. subroutine_17:
  970. push {r4, r5, lr}
  971. mov r4, r0
  972. mov r5, r1
  973. mov r0, r5
  974. bl subroutine_18
  975. ldr r1, =(npc_obj_ministep_stop_on_arrival_return)
  976. bx r1
  977.  
  978. subroutine_18:
  979. push {r4, r5, lr}
  980. mov r4, r0
  981. ldr r5, =(stepspeed_seq_length)
  982. ldrh r2, [r4, #0x36]
  983. lsl r0, r2, #1
  984. add r0, r0, r5
  985. ldrh r1, [r4, #0x38]
  986. ldrh r0, [r0]
  987. cmp r1, r0
  988. bge subroutine_18_r1_ge_r0
  989. ldr r1, =(stepspeeds)
  990. lsl r0, r2, #2
  991. add r0, r0, r1
  992. ldrh r2, [r4, #0x38]
  993. ldr r0, [r0]
  994. lsl r2, r2, #2
  995. add r2, r2, r0
  996. ldrh r1, [r4, #0x34]
  997. lsl r1, r1, #24
  998. lsr r1, r1, #24
  999. ldr r0, =(rom + byte_list)
  1000. sub r1, #1
  1001. lsl r1, r1, #1
  1002. ldsh r1, [r0, r1]
  1003. ldr r3, [r2]
  1004. mov r0, r4
  1005. bl call_via_r3
  1006. ldr r0, =(obj_npc_ministep_return)
  1007. bx r0
  1008.  
  1009. subroutine_18_r1_ge_r0:
  1010. mov r0, #0
  1011. pop {r4, r5, pc}
  1012.  
  1013. .align 2
  1014. .pool
  1015.  
  1016. routine_15:
  1017. push {r4, r5, lr}
  1018. mov r4, r0
  1019. mov r5, r1
  1020. mov r2, #3
  1021. mov r3, #1
  1022. bl subroutine_19
  1023. mov r0, r4
  1024. mov r1, r5
  1025. bl routine_16
  1026. lsl r0, r0, #24
  1027. lsr r0, r0, #24
  1028. pop {r4, r5, pc}
  1029.  
  1030. routine_17:
  1031. push {r4, r5, lr}
  1032. mov r4, r0
  1033. mov r5, r1
  1034. mov r2, #4
  1035. mov r3, #1
  1036. bl subroutine_19
  1037. mov r0, r4
  1038. mov r1, r5
  1039. bl routine_16
  1040. lsl r0, r0, #24
  1041. lsr r0, r0, #24
  1042. pop {r4, r5, pc}
  1043.  
  1044. routine_16:
  1045. push {r4, lr}
  1046. mov r4, r1
  1047. bl subroutine_20
  1048. ldr r1, =(an_pulse_dn_2_return)
  1049. bx r1
  1050.  
  1051. subroutine_20:
  1052. push {r4, r5, lr}
  1053. mov r4, r0
  1054. mov r5, r1
  1055. mov r0, r5
  1056. bl subroutine_21
  1057. ldr r1, =(npc_obj_ministep_stop_on_arrival_return)
  1058. bx r1
  1059.  
  1060. subroutine_21:
  1061. push {r4, r5, lr}
  1062. mov r4, r0
  1063. ldr r5, =(stepspeed_seq_length)
  1064. ldrh r2, [r4, #0x36]
  1065. lsl r0, r2, #1
  1066. add r0, r0, r5
  1067. ldrh r1, [r4, #0x38]
  1068. ldrh r0, [r0]
  1069. cmp r1, r0
  1070. bge subroutine_21_r1_ge_r0
  1071. ldr r1, =(stepspeeds)
  1072. lsl r0, r2, #2
  1073. add r0, r0, r1
  1074. ldrh r2, [r4, #0x38]
  1075. ldr r0, [r0]
  1076. lsl r2, r2, #2
  1077. add r2, r2, r0
  1078. ldrh r1, [r4, #0x34]
  1079. lsl r1, r1, #24
  1080. lsr r1, r1, #24
  1081. ldr r0, =(rom + byte_list)
  1082. add r1, #3
  1083. lsl r1, r1, #1
  1084. ldsh r1, [r0, r1]
  1085. ldr r3, [r2]
  1086. mov r0, r4
  1087. bl call_via_r3
  1088. ldr r0, =(obj_npc_ministep_return)
  1089. bx r0
  1090.  
  1091. subroutine_21_r1_ge_r0:
  1092. mov r0, #0
  1093. pop {r4, r5, pc}
  1094.  
  1095. subroutine_19:
  1096. push {r4-r7, lr}
  1097. mov r7, r8
  1098. push {r7}
  1099. sub sp, #0x14
  1100. mov r5, r0
  1101. mov r8, r1
  1102. mov r4, r3
  1103. lsl r2, r2, #24
  1104. lsr r2, r2, #24
  1105. lsl r4, r4, #24
  1106. lsr r4, r4, #24
  1107. mov r1, sp
  1108. ldr r0, =(off_83A6884)
  1109. ldmia r0!, {r3, r6, r7}
  1110. stmia r1!, {r3, r6, r7}
  1111. ldmia r0!, {r3, r6}
  1112. stmia r1!, {r3, r6}
  1113. mov r0, r5
  1114. mov r1, r8
  1115. mov r3, r4
  1116. bl subroutine_22
  1117. ldr r7, =(an_run_any_return)
  1118. bx r7
  1119.  
  1120. subroutine_22:
  1121. push {r4-r6, lr}
  1122. mov r6, r8
  1123. mov r5, r9
  1124. push {r5, r6}
  1125. sub sp, #4
  1126. mov r8, r0
  1127. mov r9, r1
  1128. mov r4, r2
  1129. mov r6, r3
  1130. lsl r4, r4, #24
  1131. lsr r4, r4, #24
  1132. lsl r6, r6, #24
  1133. lsr r6, r6, #24
  1134. ldrh r1, [r0, #0x10]
  1135. mov r0, sp
  1136. strh r1, [r0]
  1137. mov r1, r8
  1138. ldrh r0, [r1, #0x12]
  1139. mov r5, sp
  1140. add r5, #2
  1141. strh r0, [r5]
  1142. mov r0, r8
  1143. mov r1, r4
  1144. ldr r3, =(npc_set_direction)
  1145. bl call_via_r3
  1146. ldr r1, =(rom + byte_list)
  1147. add r2, r4, #3
  1148. lsl r2, r2, #1
  1149. ldsh r0, [r1, r2]
  1150. ldr r1, =(npc_apply_direction_return)
  1151. bx r1
  1152.  
  1153. .align 2
  1154. byte_list:
  1155. .short 5, 7, 5, 6, 6, 8, 7, 8
  1156.  
  1157. .pool
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement