sm64

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

osGetCount.s (1959B)


      1 .set noreorder // don't insert nops after branches
      2 
      3 #include "macros.inc"
      4 
      5 .section .text, "ax"
      6 
      7 #ifdef VERSION_CN
      8 
      9 glabel osGetCount
     10     addiu $sp, $sp, -0x38
     11     sd    $ra, 0x30($sp)
     12     sd    $fp, 0x28($sp)
     13     jal   __osDisableInt
     14      move  $fp, $sp
     15     sw    $v0, 0x24($fp)
     16     mfc0  $a1, $9
     17     sw    $a1, 0x20($fp)
     18     lw    $v0, 0x20($fp)
     19     lui   $v1, %hi(sLastHighestCount) # $v1, 0x8032
     20     lw    $v1, %lo(sLastHighestCount)($v1)
     21     sltu  $v0, $v0, $v1
     22     beqz  $v0, .L80304FCC
     23      nop
     24     lui   $v0, %hi(sNumCountOverflows) # $v0, 0x8032
     25     lw    $v0, %lo(sNumCountOverflows)($v0)
     26     addiu $v1, $v0, 1
     27     sw    $v1, sNumCountOverflows
     28 .L80304FCC:
     29     lw    $v0, 0x20($fp)
     30     sw    $v0, sLastHighestCount
     31     lui   $v0, %hi(sNumCountOverflows) // $v0, 0x8032
     32     lwu   $v0, %lo(sNumCountOverflows)($v0)
     33     dsll32 $v1, $v0, 0
     34     lwu   $a0, 0x20($fp)
     35     or    $v0, $v1, $a0
     36     move  $a0, $v0
     37     dsll  $v1, $a0, 5
     38     dsubu $v1, $v1, $v0
     39     dsll  $a0, $v1, 2
     40     daddu $a0, $a0, $v0
     41 .set noat // gas seems to add an extra mflo $zero after, if we don't manually use $at
     42     li $at, 192
     43     ddivu $zero, $a0, $at
     44 .set at
     45     mflo  $v0
     46     dsll32 $v0, $v0, 0
     47     dsra32 $v0, $v0, 0
     48     sw    $v0, 0x20($fp)
     49     lw    $v0, 0x20($fp)
     50     lui   $v1, %hi(sLastHighestCount2) // $v1, 0x8032
     51     lw    $v1, %lo(sLastHighestCount2)($v1)
     52     sltu  $v0, $v0, $v1
     53     beqz  $v0, .L80305044
     54      nop
     55     lui   $v0, %hi(sNumCountOverflows2) // $v0, 0x8032
     56     lw    $v0, %lo(sNumCountOverflows2)($v0)
     57     addiu $v1, $v0, 1
     58     sw    $v1, sNumCountOverflows2
     59 .L80305044:
     60     lw    $v0, 0x20($fp)
     61     sw    $v0, sLastHighestCount2
     62     jal   __osRestoreInt
     63      lw    $a0, 0x24($fp)
     64     lw    $v1, 0x20($fp)
     65     j     .L80305064
     66      move  $v0, $v1
     67 .L80305064:
     68     move  $sp, $fp
     69     ld    $ra, 0x30($sp)
     70     ld    $fp, 0x28($sp)
     71     jr    $ra
     72      addiu $sp, $sp, 0x38
     73 
     74 #else
     75 
     76 glabel osGetCount
     77     mfc0  $v0, $9
     78     jr    $ra
     79      nop
     80 
     81     nop
     82 
     83 #endif