User Tools

Weird ASM Code

Throughout the SM64 ROM there is a lot of weird assembly code. The purpose of this page is to document all the ASM weirdness.

Kill it Again

In case the first ANDI didn't work, the compiler inserts a second one. It does this two more times.

Behavior1F: # begin 80385114 (101E94)
  addiu $sp, $sp, -0x10
  lw    $t6, 0x80361164
  lw    $t7, ($t6)
  srl   $t8, $t7, 0x10
  andi  $t9, $t8, 0xff
  andi  $t0, $t9, 0xff
  sw    $t0, 0xc($sp)

Branch Branch Branch

All the branch delay slots weren't enough, so the compiler inserted 3 back-to-back branches, including one that can't even be reached!

# From LevelProc_8024BCD8 starting at 8024BD30:
  b     .L60
  b     .L70
  lw    $v0, 0x24($sp)
  b     .L70
  lw    $ra, 0x1c($sp)

Unnecessary String Copy

Instead of referencing the string directly, a copy is made on the stack. Additionally, instead of calling memcpy or strcpy, a raw set of lw/sw, lb/sb are used inline to copy the data to the stack.

# From FileConfirmations starting at 80175284/225744
lui   $t5, 0x801a
addiu $t5, $t5, 0x7e98
lw    $at, ($t5)
addiu $t4, $sp, 0x44
lw    $t6, 4($t5)
sw    $at, ($t4)
lw    $at, 8($t5)
sw    $t6, 4($t4)
lw    $t6, 0xc($t5)
sw    $at, 8($t4)
lw    $at, 0x10($t5)
sw    $t6, 0xc($t4)
sw    $at, 0x10($t4)
lbu   $at, 0x14($t5)
sb    $at, 0x14($t4)