Advertisement
Guest User

FF2 Ultima Assembly

a guest
Aug 28th, 2021
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.73 KB | None | 0 0
  1. z_un_0893298c:
  2.  
  3. addiu sp,sp,-0x30
  4. sw ra,0x1C(sp)
  5. sw s5,0x18(sp)
  6. sw s4,0x14(sp)
  7. sw s3,0x10(sp)
  8. sw s2,0xC(sp)
  9. sw s1,0x8(sp)
  10. sw s0,0x4(sp)
  11. move s4,a1 # Caster
  12. lbu a1,0x3A(a1) # Was 2. Rank of caster/target?
  13. li v0,0x8
  14. move s3,a2 # Target
  15. andi v1,a1,0x8 # Either 0s or sets to 8 if 0x3A(a1) is 8~15 (level?)
  16. move s5,a0 #? Was 09B9D640, maybe the spell ID?
  17. li s2,0x1
  18. li s0,0
  19. bne v1,v0,pos_08932A58
  20. sh a1,0x2E(sp)
  21. andi v0,a1,0xFF
  22. slti v0,v0,0x80 # < 128
  23. bne v0,zero,pos_08932A0C
  24. nop
  25. jal z_un_08934af0
  26. nop
  27. move a1,v0
  28. move a0,s5
  29. li a2,0x1
  30. addiu a3,sp,0x2E
  31. jal z_un_08934c8c
  32. addiu t0,sp,0x2C
  33. b pos_08932A30
  34. lbu v0,0x39(s4)
  35.  
  36. pos_08932A0C:
  37.  
  38. jal z_un_08936504
  39. nop
  40. move a1,v0
  41. move a0,s5
  42. li a2,0x1
  43. addiu a3,sp,0x2E
  44. jal z_un_089365d0
  45. addiu t0,sp,0x2C
  46. lbu v0,0x39(s4)
  47.  
  48. pos_08932A30:
  49.  
  50. slti v0,v0,0x29 # Multi-target bitfield
  51. bnel v0,zero,pos_08932A48
  52. lhu v0,0x2E(sp)
  53. li v0,0x2
  54. sh v0,0x2E(sp)
  55. lhu v0,0x2E(sp)
  56.  
  57. pos_08932A48:
  58.  
  59. slti v0,v0,0x2
  60. bnel v0,zero,pos_08932A5C
  61. li v0,0x1
  62. li s0,0x1
  63.  
  64. pos_08932A58:
  65.  
  66. li v0,0x1
  67.  
  68. pos_08932A5C:
  69.  
  70. sh v0,0x2E(sp)
  71. sb v0,0x3E(s3)
  72. move a0,s5
  73. move a1,s4
  74. jal z_un_08937d48
  75. li s1,0
  76. andi v0,v0,0xFF
  77. jal z_un_088a6d58
  78. sh v0,0x2E(sp)
  79. lbu a1,0x2E(sp)
  80. jal z_un_088a6de0 # Set v0 to 16 and a0 to 0
  81. move a0,v0
  82.  
  83. pos_08932A8C:
  84.  
  85. bnel v0,zero,pos_08932A9C
  86. lbu a0,0x0(v0)
  87. b pos_08932CE0
  88. li s2,0
  89.  
  90. pos_08932A9C:
  91.  
  92. li v1,0x3
  93. andi a0,a0,0xF
  94. bnel a0,v1,pos_08932AD0
  95. lbu a1,0x4B(v0)
  96. lbu v1,0x2E(v0)
  97. addiu a0,v1,0x64
  98. sll v1,a0,0x1
  99. lbu v0,0x32(s4)
  100. addu v1,v1,a0
  101. mult v0,v1
  102. mflo v0
  103. b pos_08932C20
  104. sh v0,0x2E(sp)
  105.  
  106. pos_08932AD0:
  107.  
  108. lbu a0,0x4D(v0)
  109. lbu v1,0x4F(v0)
  110. addu a1,s1,a1
  111. andi a1,a1,0xFFFF
  112. addu a0,a1,a0
  113. andi a0,a0,0xFFFF
  114. addu v1,a0,v1
  115. andi a2,v1,0xFFFF
  116. lbu a1,0x51(v0)
  117. lbu a0,0x53(v0)
  118. lbu v1,0x55(v0)
  119. addu a1,a2,a1
  120. andi a1,a1,0xFFFF
  121. addu a0,a1,a0
  122. andi a0,a0,0xFFFF
  123. addu v1,a0,v1
  124. andi a2,v1,0xFFFF
  125. lbu a1,0x57(v0)
  126. lbu v1,0x59(v0)
  127. li a0,0
  128. addu a1,a2,a1
  129. andi a1,a1,0xFFFF
  130. addu v1,a1,v1
  131. andi s1,v1,0xFFFF
  132. andi v1,a0,0xFFFF
  133.  
  134. pos_08932B34:
  135.  
  136. sll v1,v1,0x1
  137. addu v1,v0,v1
  138. lbu a3,0x5B(v1)
  139. lbu a2,0x5D(v1)
  140. lbu a1,0x5F(v1)
  141. addu a3,s1,a3
  142. andi a3,a3,0xFFFF
  143. addu a2,a3,a2
  144. andi a2,a2,0xFFFF
  145. addu a1,a2,a1
  146. andi t0,a1,0xFFFF
  147. lbu a3,0x61(v1)
  148. lbu a2,0x63(v1)
  149. lbu a1,0x65(v1)
  150. addu a3,t0,a3
  151. andi a3,a3,0xFFFF
  152. addu a2,a3,a2
  153. andi a2,a2,0xFFFF
  154. addu a1,a2,a1
  155. andi a3,a1,0xFFFF
  156. lbu a2,0x67(v1)
  157. lbu a1,0x69(v1)
  158. addiu v1,a0,0x8
  159. addu a0,a3,a2
  160. andi a0,a0,0xFFFF
  161. addu a0,a0,a1
  162. andi s1,a0,0xFFFF
  163. andi a0,v1,0xFFFF
  164. slti v1,a0,0x10
  165. bnel v1,zero,pos_08932B34
  166. andi v1,a0,0xFFFF
  167. sh s1,0x2E(sp)
  168. lhu v1,0x2E(sp) # Contains the sum of weapon skill and spell lvs
  169. lui v0,0xAAAA
  170. ori v0,v0,0xAAAB
  171. multu v0,v1
  172. mfhi v0
  173. srl v0,v0,0x4 # Division by 24 (Tier value)
  174. sh v0,0x2E(sp)
  175. lhu v1,0x2E(sp)
  176. ext v0,v1,0x1,0x10 # Divide by 2
  177. addu v0,v1,v0 # Tier + Tier / 2
  178. sh v0,0x2E(sp)
  179. lhu v0,0x2E(sp)
  180. mult v0,v0 # (Tier + Tier / 2)^2
  181. mflo v0
  182. sh v0,0x2E(sp)
  183. lhu v1,0x2E(sp)
  184. bnel v1,zero,pos_08932C08 # If Tier = 0
  185. lbu v1,0x32(s4)
  186. li v0,0x1
  187. sh v0,0x2E(sp) # Set it tier to 1 at least
  188. lbu v1,0x32(s4) # Ultima level
  189.  
  190. pos_08932C08:
  191.  
  192. andi v0,v0,0xFFFF
  193. mult v0,v1 # (Tier + Tier / 2)^2 * Ultima level
  194. mflo v0
  195. andi v0,v0,0xFFFF
  196. addiu v0,v0,0x64 # (Tier + Tier / 2)^2 * Ultima level + 100
  197. sh v0,0x2E(sp)
  198.  
  199. pos_08932C20:
  200.  
  201. andi a0,s0,0xFFFF # multi-target flag
  202. li v1,0x1
  203. bnel a0,v1,pos_08932C40
  204. move a0,s5
  205. andi v0,v0,0xFFFF
  206. srl v0,v0,0x2 # Divide damage by 4 if it's multi-target
  207. sh v0,0x2E(sp)
  208. move a0,s5
  209.  
  210. pos_08932C40:
  211.  
  212. move a1,s4
  213. move a2,s3
  214. andi a3,v0,0xFFFF
  215. li t0,0
  216. li t1,0x1
  217. jal z_un_08932d08 # Random damage added
  218. sh zero,0x2C(sp)
  219. sh v0,0x2E(sp)
  220. lhu a2,0x2E(sp)
  221. li v1,-0x1
  222. seh a0,a2
  223. bnel a0,v1,pos_08932C7C
  224. lbu a0,0x39(s3)
  225. b pos_08932CE0
  226. li s2,0
  227.  
  228. pos_08932C7C:
  229.  
  230. li v1,0xFC
  231. bne a0,v1,pos_08932C98
  232. nop
  233. move a0,s5
  234. jal z_un_0893394c
  235. move a1,s3
  236. sh v0,0x2E(sp)
  237.  
  238. pos_08932C98:
  239.  
  240. lw v1,0x08B77E58
  241. lw v1,0x4EBC(v1)
  242. andi v1,v1,0x2
  243. beql v1,zero,pos_08932CC0
  244. move a0,s5
  245. andi v0,v0,0xFFFF
  246. sll v0,v0,0x1
  247. sh v0,0x2E(sp)
  248. move a0,s5
  249.  
  250. pos_08932CC0:
  251.  
  252. move a1,s4
  253. move a2,s3
  254. andi a3,v0,0xFFFF
  255. jal z_un_089302b8
  256. li t0,0
  257. bnel v0,zero,pos_08932CE4
  258. move v0,s2
  259. li s2,0
  260.  
  261. pos_08932CE0:
  262.  
  263. move v0,s2
  264.  
  265. pos_08932CE4:
  266.  
  267. lw ra,0x1C(sp)
  268. lw s5,0x18(sp)
  269. lw s4,0x14(sp)
  270. lw s3,0x10(sp)
  271. lw s2,0xC(sp)
  272. lw s1,0x8(sp)
  273. lw s0,0x4(sp)
  274. jr ra
  275. addiu sp,sp,0x30
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288. z_un_08932d08:
  289.  
  290. addiu sp,sp,-0x20
  291. sw ra,0x1C(sp)
  292. sw s4,0x18(sp)
  293. sw s3,0x14(sp)
  294. sw s2,0x10(sp)
  295. sw s1,0xC(sp)
  296. sw s0,0x8(sp)
  297. move s1,t1 # Set to 1 before function
  298. move s3,a3 # Current damage of Ultima
  299. move s2,t0 # Set to 0 before function
  300. beq s1,zero,pos_08932E04
  301. li s0,0
  302. lbu v0,0x15(a1) # Something caster related (was 0)
  303. sll v0,v0,0x1C # Part of division
  304. srl v0,v0,0x1F # Divide v0 by 8
  305. beql v0,zero,pos_08932D54
  306. lbu v0,0x15(a2) # Something target related (same stat as caster above that was /8)
  307. ext s3,s3,0x1,0x10 # Multiply damage by 2
  308. lbu v0,0x15(a2)
  309.  
  310. pos_08932D54:
  311.  
  312. sll v0,v0,0x1C
  313. srl v0,v0,0x1F # Divide v0 by 8
  314. beq v0,zero,pos_08932D68
  315. nop
  316. ext s2,s2,0x1,0x10 # s2 probably 0? gets multiplied by 2
  317.  
  318. pos_08932D68:
  319.  
  320. beql s1,zero,pos_08932E08 # s1 probably 1
  321. seh v0,s0 # always 0
  322. andi a0,s3,0xFF # get the lowest bits of damage
  323.  
  324. pos_08932D74:
  325.  
  326. jal z_un_088a6470 # Rolls 0~255 (not sure what the point of this is)
  327. andi s4,s3,0xFFFF
  328. andi v0,v0,0xFF
  329. addu v0,s4,v0
  330. andi v0,v0,0xFFFF
  331. subu v0,v0,s2 # Something defence related?
  332. andi v1,v0,0xFFFF
  333. seh v0,v1
  334. bgezl v0,pos_08932DA4
  335. addu v0,s0,v1
  336. li v1,0 # minimum roll
  337. addu v0,s0,v1
  338.  
  339. pos_08932DA4:
  340.  
  341. andi s0,v0,0xFFFF
  342. jal z_un_088a6470 # First parameter set to 99 (extra damage bonus of 0~99)
  343. li a0,0x64
  344. andi v0,v0,0xFF
  345. slti at,v0,0x5 # If you rolled less than 5
  346. beql at,zero,pos_08932DF8
  347. addiu v0,s1,-0x1 # v0 is 0?
  348. lw v0,0x08C8EA40
  349. lhu v1,0x1158(v0)
  350. addiu a0,v0,0x1158
  351. andi v0,v1,0x1000
  352. beql v0,zero,pos_08932DE8
  353. ori v0,v1,0x2
  354. ori v0,v1,0x4 # Seems pointless? Sets something on address in a0
  355. b pos_08932DEC
  356. sh v0,0x0(a0)
  357.  
  358. pos_08932DE8:
  359.  
  360. sh v0,0x0(a0)
  361.  
  362. pos_08932DEC:
  363.  
  364. addu v0,s0,s3
  365. andi s0,v0,0xFFFF
  366. addiu v0,s1,-0x1
  367.  
  368. pos_08932DF8:
  369.  
  370. andi s1,v0,0xFFFF
  371. bnel s1,zero,pos_08932D74 # Loop back and add more damage
  372. andi a0,s3,0xFF
  373.  
  374. pos_08932E04:
  375.  
  376. seh v0,s0
  377.  
  378. pos_08932E08:
  379.  
  380. andi v1,v0,0xFFFF
  381. li at,0x8000
  382. slt at,v1,at
  383. bnel at,zero,pos_08932E24
  384. lw ra,0x1C(sp)
  385. li v0,0x7FFF
  386. lw ra,0x1C(sp)
  387.  
  388. pos_08932E24:
  389.  
  390. lw s4,0x18(sp)
  391. lw s3,0x14(sp)
  392. lw s2,0x10(sp)
  393. lw s1,0xC(sp)
  394. lw s0,0x8(sp)
  395. jr ra
  396. addiu sp,sp,0x20
  397.  
  398.  
  399. z_un_088a6470: # Random number from 0 to a0
  400.  
  401. andi v0,a0,0xFF
  402. addiu v1,v0,0x1
  403. lui v0,0x8C9
  404. lbu a1,-0x2A1C(v0)
  405. li a0,0x08C8D5E8
  406. addu a0,a0,a1
  407. lui v0,0x8C9
  408. addiu a1,a1,0x1
  409. sb a1,-0x2A1C(v0)
  410. lbu v0,0x0(a0)
  411. div v0,v1
  412. mfhi v0
  413. jr ra
  414. andi v0,v0,0xFF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement