sm64

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

osSetIntMask.s (2835B)


      1 .set noat      // allow manual use of $at
      2 .set noreorder // don't insert nops after branches
      3 
      4 #include "macros.inc"
      5 
      6 #include <PR/R4300.h>
      7 #include <PR/rcp.h>
      8 #include <PR/os.h>
      9 
     10 .section .text, "ax"
     11 
     12 glabel osSetIntMask
     13 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
     14     mfc0  $t4, $12
     15     andi  $v0, $t4, OS_IM_CPU
     16     lui   $t0, %hi(__OSGlobalIntMask) // $t0, 0x8030
     17     addiu $t0, %lo(__OSGlobalIntMask) // addiu $t0, $t0, 0x208c
     18     lw    $t3, ($t0)
     19     li    $at, 0xFFFFFFFF
     20     xor   $t0, $t3, $at
     21     andi  $t0, $t0, SR_IMASK
     22     or    $v0, $v0, $t0
     23 #else
     24     mfc0  $t1, $12
     25     andi  $v0, $t1, OS_IM_CPU
     26 #endif
     27     lui   $t2, %hi(PHYS_TO_K1(MI_INTR_MASK_REG)) // $t2, 0xa430
     28     lw    $t2, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($t2)
     29 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
     30     beqz  $t2, .L80200074
     31     srl   $t1, $t3, 0x10
     32     li    $at, 0xFFFFFFFF
     33     xor   $t1, $t1, $at
     34     andi  $t1, $t1, 0x3f
     35     or    $t2, $t2, $t1
     36 .L80200074:
     37 #endif
     38     sll   $t2, $t2, 0x10
     39     or    $v0, $v0, $t2
     40     lui   $at, 0x3f
     41     and   $t0, $a0, $at
     42 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
     43     and   $t0, $t0, $t3
     44 #endif
     45     srl   $t0, $t0, 0xf
     46     lui   $t2, %hi(__osRcpImTable)
     47     addu  $t2, $t2, $t0
     48     lhu   $t2, %lo(__osRcpImTable)($t2)
     49     lui   $at, %hi(PHYS_TO_K1(MI_INTR_MASK_REG)) // $at, 0xa430
     50     sw    $t2, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($at)
     51     andi  $t0, $a0, OS_IM_CPU
     52 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
     53     andi  $t1, $t3, 0xff00
     54     and   $t0, $t0, $t1
     55 #endif
     56     lui   $at, (0xFFFF00FF >> 16) // lui $at, 0xffff
     57     ori   $at, (0xFFFF00FF & 0xFFFF) // ori $at, $at, 0xff
     58 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
     59     and   $t4, $t4, $at
     60     or    $t4, $t4, $t0
     61     mtc0  $t4, $12
     62 #else
     63     and   $t1, $t1, $at
     64     or    $t1, $t1, $t0
     65     mtc0  $t1, $12
     66 #endif
     67     nop
     68     nop
     69     jr    $ra
     70      nop
     71 
     72 
     73 .section .rodata
     74 
     75 glabel __osRcpImTable
     76 .half 0x0555
     77 .half 0x0556
     78 .half 0x0559
     79 .half 0x055A
     80 .half 0x0565
     81 .half 0x0566
     82 .half 0x0569
     83 .half 0x056A
     84 .half 0x0595
     85 .half 0x0596
     86 .half 0x0599
     87 .half 0x059A
     88 .half 0x05A5
     89 .half 0x05A6
     90 .half 0x05A9
     91 .half 0x05AA
     92 .half 0x0655
     93 .half 0x0656
     94 .half 0x0659
     95 .half 0x065A
     96 .half 0x0665
     97 .half 0x0666
     98 .half 0x0669
     99 .half 0x066A
    100 .half 0x0695
    101 .half 0x0696
    102 .half 0x0699
    103 .half 0x069A
    104 .half 0x06A5
    105 .half 0x06A6
    106 .half 0x06A9
    107 .half 0x06AA
    108 .half 0x0955
    109 .half 0x0956
    110 .half 0x0959
    111 .half 0x095A
    112 .half 0x0965
    113 .half 0x0966
    114 .half 0x0969
    115 .half 0x096A
    116 .half 0x0995
    117 .half 0x0996
    118 .half 0x0999
    119 .half 0x099A
    120 .half 0x09A5
    121 .half 0x09A6
    122 .half 0x09A9
    123 .half 0x09AA
    124 .half 0x0A55
    125 .half 0x0A56
    126 .half 0x0A59
    127 .half 0x0A5A
    128 .half 0x0A65
    129 .half 0x0A66
    130 .half 0x0A69
    131 .half 0x0A6A
    132 .half 0x0A95
    133 .half 0x0A96
    134 .half 0x0A99
    135 .half 0x0A9A
    136 .half 0x0AA5
    137 .half 0x0AA6
    138 .half 0x0AA9
    139 .half 0x0AAA