sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

bcopy.s (8318B)


      1 .set noat      // allow manual use of $at
      2 .set noreorder // don't insert nops after branches
      3 
      4 #include "macros.inc"
      5 
      6 
      7 .section .text, "ax"
      8 
      9 //TODO There seem to be patterns in these iQue diffs. Can we figure out what's causing them? Could this have been written in C?
     10 //also ifdef hell lol
     11 
     12 glabel bcopy
     13     beqz  $a2, .L80323A4C
     14      move  $a3, $a1
     15 #ifdef VERSION_CN
     16     beq   $a0, $a1, .L80323A4C
     17      nop
     18     slt   $at, $a1, $a0
     19     bnez  $at, .L80323A14
     20      nop
     21     add   $v0, $a0, $a2
     22     slt   $at, $a1, $v0
     23     beqz   $at, .L80323A14
     24      nop
     25     b     .L80323B78
     26      nop
     27 .L80323A14:
     28     slti  $at, $a2, 0x10
     29 #else
     30     beq   $a0, $a1, .L80323A4C
     31      slt   $at, $a1, $a0
     32     bnezl $at, .L80323A14
     33      slti  $at, $a2, 0x10
     34     add   $v0, $a0, $a2
     35     slt   $at, $a1, $v0
     36     beqzl  $at, .L80323A14
     37      slti  $at, $a2, 0x10
     38     b     .L80323B78
     39      slti  $at, $a2, 0x10
     40     slti  $at, $a2, 0x10
     41 .L80323A14:
     42 #endif
     43     bnez  $at, .L80323A2C
     44      nop
     45     andi  $v0, $a0, 3
     46     andi  $v1, $a1, 3
     47     beq   $v0, $v1, .L80323A54
     48      nop
     49 .L80323A2C:
     50     beqz  $a2, .L80323A4C
     51      nop
     52     addu  $v1, $a0, $a2
     53 .L80323A38:
     54     lb    $v0, ($a0)
     55     addiu $a0, $a0, 1
     56 #ifdef VERSION_CN
     57     sb    $v0, ($a1)
     58     bne   $a0, $v1, .L80323A38
     59      addiu $a1, $a1, 1
     60 #else
     61     addiu $a1, $a1, 1
     62     bne   $a0, $v1, .L80323A38
     63      sb    $v0, -1($a1)
     64 #endif
     65 .L80323A4C:
     66     jr    $ra
     67      move  $v0, $a3
     68 
     69 .L80323A54:
     70 #ifdef VERSION_CN
     71     beqz  $v0, .L80323AB8
     72      nop
     73     li    $at, 1
     74     beq   $v0, $at, .L80323A9C
     75      nop
     76     li    $at, 2
     77     beq   $v0, $at, .L80323A88
     78      nop
     79     lb    $v0, ($a0)
     80     addiu $a0, $a0, 1
     81     sb    $v0, ($a1)
     82     addiu $a1, $a1, 1
     83     b     .L80323AB8
     84      addiu $a2, $a2, -1
     85 .L80323A88:
     86     lh    $v0, ($a0)
     87 #else
     88     beqz  $v0, .L80323AB8
     89      li    $at, 1
     90     beq   $v0, $at, .L80323A9C
     91      li    $at, 2
     92     beql  $v0, $at, .L80323A88
     93      lh    $v0, ($a0)
     94     lb    $v0, ($a0)
     95     addiu $a0, $a0, 1
     96     addiu $a1, $a1, 1
     97     addiu $a2, $a2, -1
     98     b     .L80323AB8
     99      sb    $v0, -1($a1)
    100     lh    $v0, ($a0)
    101 .L80323A88:
    102 #endif
    103     addiu $a0, $a0, 2
    104 #ifdef VERSION_CN
    105     sh    $v0, ($a1)
    106     addiu $a1, $a1, 2
    107     b     .L80323AB8
    108      addiu $a2, $a2, -2
    109 #else
    110     addiu $a1, $a1, 2
    111     addiu $a2, $a2, -2
    112     b     .L80323AB8
    113      sh    $v0, -2($a1)
    114 #endif
    115 .L80323A9C:
    116     lb    $v0, ($a0)
    117     lh    $v1, 1($a0)
    118     addiu $a0, $a0, 3
    119 #ifdef VERSION_CN
    120     sb    $v0, ($a1)
    121     sh    $v1, 1($a1)
    122 #endif
    123     addiu $a1, $a1, 3
    124     addiu $a2, $a2, -3
    125 #ifndef VERSION_CN
    126     sb    $v0, -3($a1)
    127     sh    $v1, -2($a1)
    128 #endif
    129 .L80323AB8:
    130     slti  $at, $a2, 0x20
    131 #ifdef VERSION_CN
    132     bnez  $at, .L80323B14
    133      nop
    134 #else
    135     bnezl $at, .L80323B18
    136      slti  $at, $a2, 0x10
    137 #endif
    138     lw    $v0, ($a0)
    139     lw    $v1, 4($a0)
    140     lw    $t0, 8($a0)
    141     lw    $t1, 0xc($a0)
    142     lw    $t2, 0x10($a0)
    143     lw    $t3, 0x14($a0)
    144     lw    $t4, 0x18($a0)
    145     lw    $t5, 0x1c($a0)
    146     addiu $a0, $a0, 0x20
    147 #ifdef VERSION_CN
    148     sw    $v0, ($a1)
    149     sw    $v1, 4($a1)
    150     sw    $t0, 8($a1)
    151     sw    $t1, 0xc($a1)
    152     sw    $t2, 0x10($a1)
    153     sw    $t3, 0x14($a1)
    154     sw    $t4, 0x18($a1)
    155     sw    $t5, 0x1c($a1)
    156 #endif
    157     addiu $a1, $a1, 0x20
    158 #ifndef VERSION_CN
    159     addiu $a2, $a2, -0x20
    160     sw    $v0, -0x20($a1)
    161     sw    $v1, -0x1c($a1)
    162     sw    $t0, -0x18($a1)
    163     sw    $t1, -0x14($a1)
    164     sw    $t2, -0x10($a1)
    165     sw    $t3, -0xc($a1)
    166     sw    $t4, -8($a1)
    167 #endif
    168     b     .L80323AB8
    169 #ifdef VERSION_CN
    170      addiu $a2, $a2, -0x20
    171 #else
    172      sw    $t5, -4($a1)
    173 #endif
    174 .L80323B14:
    175     slti  $at, $a2, 0x10
    176 .L80323B18:
    177 #ifdef VERSION_CN
    178     bnez  $at, .L80323B50
    179 	 nop
    180 #else
    181     bnezl $at, .L80323B54
    182      slti  $at, $a2, 4
    183 #endif
    184     lw    $v0, ($a0)
    185     lw    $v1, 4($a0)
    186     lw    $t0, 8($a0)
    187     lw    $t1, 0xc($a0)
    188     addiu $a0, $a0, 0x10
    189 #ifdef VERSION_CN
    190     sw    $v0, ($a1)
    191     sw    $v1, 4($a1)
    192     sw    $t0, 8($a1)
    193     sw    $t1, 0xc($a1)
    194 #endif
    195     addiu $a1, $a1, 0x10
    196 #ifndef VERSION_CN
    197     addiu $a2, $a2, -0x10
    198     sw    $v0, -0x10($a1)
    199     sw    $v1, -0xc($a1)
    200     sw    $t0, -8($a1)
    201 #endif
    202     b     .L80323B14
    203 #ifdef VERSION_CN
    204      addiu $a2, $a2, -0x10
    205 #else
    206      sw    $t1, -4($a1)
    207 #endif
    208 .L80323B50:
    209     slti  $at, $a2, 4
    210 .L80323B54:
    211     bnez  $at, .L80323A2C
    212      nop
    213     lw    $v0, ($a0)
    214     addiu $a0, $a0, 4
    215 #ifdef VERSION_CN
    216     sw    $v0, ($a1)
    217 #endif
    218     addiu $a1, $a1, 4
    219 #ifndef VERSION_CN
    220     addiu $a2, $a2, -4
    221 #endif
    222     b     .L80323B50
    223 #ifdef VERSION_CN
    224      addiu $a2, $a2, -4
    225 #else
    226      sw    $v0, -4($a1)
    227     slti  $at, $a2, 0x10
    228 #endif
    229 .L80323B78:
    230     add   $a0, $a0, $a2
    231 #ifdef VERSION_CN
    232     add   $a1, $a1, $a2
    233     slti  $at, $a2, 0x10
    234 #endif
    235     bnez  $at, .L80323B94
    236 #ifdef VERSION_CN
    237      nop
    238 #else
    239      add   $a1, $a1, $a2
    240 #endif
    241     andi  $v0, $a0, 3
    242     andi  $v1, $a1, 3
    243     beq   $v0, $v1, .L80323BC4
    244      nop
    245 .L80323B94:
    246     beqz  $a2, .L80323A4C
    247      nop
    248     addiu $a0, $a0, -1
    249     addiu $a1, $a1, -1
    250     subu  $v1, $a0, $a2
    251 .L80323BA8:
    252     lb    $v0, ($a0)
    253     addiu $a0, $a0, -1
    254 #ifdef VERSION_CN
    255     sb    $v0, 0($a1)
    256 #else
    257     addiu $a1, $a1, -1
    258 #endif
    259     bne   $a0, $v1, .L80323BA8
    260 #ifdef VERSION_CN
    261      addiu $a1, $a1, -1
    262 #else
    263      sb    $v0, 1($a1)
    264 #endif
    265     jr    $ra
    266      move  $v0, $a3
    267 
    268 .L80323BC4:
    269     beqz  $v0, .L80323C28
    270 #ifdef VERSION_CN
    271      nop
    272 #endif
    273      li    $at, 3
    274     beq   $v0, $at, .L80323C0C
    275 #ifdef VERSION_CN
    276      nop
    277 #endif
    278      li    $at, 2
    279 #ifdef VERSION_CN
    280     beq   $v0, $at, .L80323BF4
    281 	 nop
    282 #else
    283     beql  $v0, $at, .L80323BF8
    284      lh    $v0, -2($a0)
    285 #endif
    286     lb    $v0, -1($a0)
    287     addiu $a0, $a0, -1
    288 #ifdef VERSION_CN
    289     sb    $v0, -1($a1)
    290 #endif
    291     addiu $a1, $a1, -1
    292 #ifndef VERSION_CN
    293     addiu $a2, $a2, -1
    294 #endif
    295     b     .L80323C28
    296 #ifdef VERSION_CN
    297      addiu $a2, $a2, -1
    298 #else
    299      sb    $v0, ($a1)
    300 #endif
    301 .L80323BF4:
    302     lh    $v0, -2($a0)
    303 .L80323BF8:
    304     addiu $a0, $a0, -2
    305 #ifdef VERSION_CN
    306     sh    $v0, -2($a1)
    307 #endif
    308     addiu $a1, $a1, -2
    309 #ifndef VERSION_CN
    310     addiu $a2, $a2, -2
    311 #endif
    312     b     .L80323C28
    313 #ifdef VERSION_CN
    314      addiu $a2, $a2, -2
    315 #else
    316      sh    $v0, ($a1)
    317 #endif
    318 .L80323C0C:
    319     lb    $v0, -1($a0)
    320     lh    $v1, -3($a0)
    321     addiu $a0, $a0, -3
    322 #ifdef VERSION_CN
    323     sb    $v0, -1($a1)
    324     sh    $v1, -3($a1)
    325     addiu $a1, $a1, -3
    326     addiu $a2, $a2, -3
    327 #else
    328     addiu $a1, $a1, -3
    329     addiu $a2, $a2, -3
    330     sb    $v0, 2($a1)
    331     sh    $v1, ($a1)
    332 #endif
    333 .L80323C28:
    334     slti  $at, $a2, 0x20
    335 #ifdef VERSION_CN
    336     bnez  $at, .L80323C84
    337 	 nop
    338 #else
    339     bnezl $at, .L80323C88
    340      slti  $at, $a2, 0x10
    341 #endif
    342     lw    $v0, -4($a0)
    343     lw    $v1, -8($a0)
    344     lw    $t0, -0xc($a0)
    345     lw    $t1, -0x10($a0)
    346     lw    $t2, -0x14($a0)
    347     lw    $t3, -0x18($a0)
    348     lw    $t4, -0x1c($a0)
    349     lw    $t5, -0x20($a0)
    350     addiu $a0, $a0, -0x20
    351 #ifdef VERSION_CN
    352     sw    $v0, -4($a1)
    353     sw    $v1, -8($a1)
    354     sw    $t0, -0xc($a1)
    355     sw    $t1, -0x10($a1)
    356     sw    $t2, -0x14($a1)
    357     sw    $t3, -0x18($a1)
    358     sw    $t4, -0x1c($a1)
    359     sw    $t5, -0x20($a1)
    360     addiu $a1, $a1, -0x20
    361 #else
    362     addiu $a1, $a1, -0x20
    363     addiu $a2, $a2, -0x20
    364     sw    $v0, 0x1c($a1)
    365     sw    $v1, 0x18($a1)
    366     sw    $t0, 0x14($a1)
    367     sw    $t1, 0x10($a1)
    368     sw    $t2, 0xc($a1)
    369     sw    $t3, 8($a1)
    370     sw    $t4, 4($a1)
    371 #endif
    372     b     .L80323C28
    373 #ifdef VERSION_CN
    374      addiu  $a2, $a2, -0x20
    375 #else
    376      sw    $t5, ($a1)
    377 #endif
    378 .L80323C84:
    379     slti  $at, $a2, 0x10
    380 .L80323C88:
    381 #ifdef VERSION_CN
    382     bnez $at, .L80323CC0
    383      nop
    384 #else
    385     bnezl $at, .L80323CC4
    386      slti  $at, $a2, 4
    387 #endif
    388     lw    $v0, -4($a0)
    389     lw    $v1, -8($a0)
    390     lw    $t0, -0xc($a0)
    391     lw    $t1, -0x10($a0)
    392     addiu $a0, $a0, -0x10
    393 #ifdef VERSION_CN
    394     sw    $v0, -4($a1)
    395     sw    $v1, -8($a1)
    396     sw    $t0, -0xc($a1)
    397     sw    $t1, -0x10($a1)
    398     addiu $a1, $a1, -0x10
    399 #else
    400     addiu $a1, $a1, -0x10
    401     addiu $a2, $a2, -0x10
    402     sw    $v0, 0xc($a1)
    403     sw    $v1, 8($a1)
    404     sw    $t0, 4($a1)
    405 #endif
    406     b     .L80323C84
    407 #ifdef VERSION_CN
    408      addiu $a2, $a2, -0x10
    409 #else
    410      sw    $t1, ($a1)
    411 #endif
    412 .L80323CC0:
    413     slti  $at, $a2, 4
    414 .L80323CC4:
    415     bnez  $at, .L80323B94
    416      nop
    417     lw    $v0, -4($a0)
    418     addiu $a0, $a0, -4
    419 #ifdef VERSION_CN
    420     sw    $v0, -4($a1)
    421 #endif
    422     addiu $a1, $a1, -4
    423 #ifndef VERSION_CN
    424     addiu $a2, $a2, -4
    425 #endif
    426     b     .L80323CC0
    427 #ifdef VERSION_CN
    428      addiu $a2, $a2, -4
    429 #else
    430      sw    $v0, ($a1)
    431     nop
    432     nop
    433     nop
    434 #endif