====== 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 nop .L60: b .L70 lw $v0, 0x24($sp) b .L70 nop .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)