Advertisement
Bring_Stabity

Decompression with updates

Mar 5th, 2015
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. Reminder: *pointer = value at the location being pointed to.
  2. Note: variable<rx> = decompiled variable name <note at which register>
  3.  
  4. pointer<r3> Decompression(arg1<r3>, const1<r4>)
  5. //r4 always equals 807cca60 (copied from r29)
  6. //r3 = r31(802cafe8) + some number (0x44 in this case) = 802cb02c
  7. {
  8. //build stack frame (LR, r31, r30, and r29 pushed)
  9. //r4 is copied back to r29, this is really stupid.
  10. scratch<r0> = *const1<r4>
  11. if (scratch<r0>!=0) {
  12. return pointer<r3> = null
  13. //and unwind stack frame
  14. }
  15.  
  16. arg1<r3> -> <r5>
  17. offsetStack<r3> = stack<r1> + 8
  18. offsetTOC<r4> = TOC<r2> - 0x5570
  19. clear(floatingPointInvalidException<crb6>)
  20.  
  21. result<r3> = subfunction1(offsetStack<r3>, offsetTOC<r4>, arg1<r5>)
  22.  
  23. index2<r30> = 0
  24. limit<r0> = *(const1<r29> + 4)
  25. //limit abstracted away from r0
  26. for( i<r31> = 0; i<r31> < limit; i<r31>++) {
  27. result<r3> = stack<r1> + 8
  28. <r4> = *(const1<r29> + 8) + index2<r30>
  29. result<r3> = subfunction2(result<r3>, <r4>, 0x20);
  30. if(result<r3> == 0) {
  31. break
  32. }
  33. index2<r30> += 0x28
  34. }
  35.  
  36. if( i<r31> < 0 || limit <= 0) {
  37. <r4> = 0
  38. } else {
  39. <r4> = i<r31> * 0x28 + *(const1<r29> + 8)
  40. }
  41.  
  42. if( <r4> == 0 ) {
  43. return pointer<r3> = null
  44. //and unwind stack frame
  45. }
  46.  
  47. return pointer<r3> = *(const1<r29> + 0x10) + *(<r4> + 0x20)
  48. //and unwind stack frame
  49. }
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56. result<r3> subfunction1(offsetStack<r3>, offsetTOC<r4>, arg1<r5>) {
  57. //build stack frame
  58. //LR, r25-r31
  59. offsetStack<r3> -> <r25>
  60. offsetTOC<r4> -> <r26>
  61.  
  62. if(crb6 != 0) {
  63. push f1-f8
  64. }
  65.  
  66. <r29> = stack<r1> + 0xA8
  67. <r30> = stack<r1> + 8
  68. <r28> = 0x0200 0000
  69. <r31> = -1
  70. <r12> = 0
  71. <r11> = 0x8013 0000
  72. push offsetTOC<r4> to stack<r1> + 0xC
  73. <r27> = stack<r1> + 0x74
  74. <r0> = 0x80128FB4
  75. <r4> = stack<r1> + 0x68
  76. push offsetStack<r3> to stack<r1> + 0x8
  77. <r0> -> <r3> //0x80128FB4
  78. push arg1<r5> to Stack<r1> + 0x10
  79. offsetTOC<r26> -> <r5>
  80. push <r6> to stack<r1> + 0x14
  81. <r27> -> <r6>
  82. push <r7 - r10, r12, r25, r28-r31>
  83. <r3> = subfunction1_1 (r3, r4, r5)
  84.  
  85. if( <r5> != 0) {
  86. <r4> = -2
  87. if( <r3> < -1 ) {
  88. <r4> = <r3>
  89. }
  90. store byte 0 @ (<r25> + <r4>)
  91. }
  92. //unwind stack register, pop <r25> - <r31>
  93. //return is probably on <r3>
  94. }
  95.  
  96. result<r3> subfunction2(previousResult<r3>, <r4>, 0x20) {
  97. offsetStack<r3>--
  98. <r4>--
  99. <r6> = 0x21
  100. while(true) {
  101. <r6>-- //and update condition register
  102. if(<r6> == 0) {
  103. return result2<r3> = null
  104. }
  105. <r0> = byte *( --previousResult<r3>) //predecrement
  106. <r5> = byte *( --<r4>) //also predecrement
  107. if(<r0> != <r5>) {
  108. return result<r3> = <r5> - <r0>
  109. }
  110. if(<r0> == 0) {
  111. return result2<r3> = null
  112. }
  113. }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement