sm64

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

__osDevMgrMain.c (6859B)


      1 #include "libultra_internal.h"
      2 #include "macros.h"
      3 #include "PR/os.h"
      4 
      5 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
      6 #include "new_func.h"
      7 #include "PR/rcp.h"
      8 #include "PR/ique.h"
      9 
     10 #define ALIGN16(val) (((val) + 0xF) & ~0xF)
     11 
     12 void __osDevMgrMain(void *args) {
     13 #ifdef VERSION_CN
     14     s32 loadedToTempBuffer = FALSE;
     15 #endif
     16     OSIoMesg *mb;
     17     OSMesg em;
     18     OSMesg dummy;
     19     s32 ret;
     20     OSMgrArgs *sp34;
     21 #ifdef VERSION_EU
     22     UNUSED u32 sp30;
     23 #endif
     24     u32 sp2c;
     25     __OSBlockInfo *sp28;
     26     __OSTranxInfo *sp24;
     27 #if defined(VERSION_SH) || defined(VERSION_CN)
     28     u32 tmp;
     29 #endif
     30 #ifdef VERSION_EU
     31     sp30 = 0;
     32 #endif
     33     sp2c = 0;
     34     mb = NULL;
     35     ret = 0;
     36     sp34 = (OSMgrArgs *) args;
     37     while (TRUE) {
     38         osRecvMesg(sp34->cmdQueue, (OSMesg) &mb, OS_MESG_BLOCK);
     39         if (mb->piHandle != NULL && mb->piHandle->type == 2
     40             && (mb->piHandle->transferInfo.cmdType == 0
     41                 || mb->piHandle->transferInfo.cmdType == 1)) {
     42             sp24 = &mb->piHandle->transferInfo;
     43             sp28 = &sp24->block[sp24->blockNum];
     44             sp24->sectorNum = -1;
     45             if (sp24->transferMode != 3) {
     46                 sp28->dramAddr = (void *) ((u32) sp28->dramAddr - sp28->sectorSize);
     47             }
     48             if (sp24->transferMode == 2 && mb->piHandle->transferInfo.cmdType == 0) {
     49                 sp2c = 1;
     50             } else {
     51                 sp2c = 0;
     52             }
     53             osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK);
     54             __osResetGlobalIntMask(OS_IM_PI);
     55             osEPiRawWriteIo(mb->piHandle, 0x05000510, (sp24->bmCtlShadow | 0x80000000));
     56 l1:
     57             osRecvMesg(sp34->eventQueue, &em, OS_MESG_BLOCK);
     58 #if defined(VERSION_SH) || defined(VERSION_CN)
     59             sp24 = &mb->piHandle->transferInfo;
     60             sp28 = &sp24->block[sp24->blockNum];
     61             if (sp28->errStatus == 0x1D) {
     62                 osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow | 0x10000000);
     63                 osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow);
     64                 osEPiRawReadIo(mb->piHandle, 0x5000508, &tmp);
     65                 if ((tmp & 0x2000000) != 0) {
     66                     osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow | 0x1000000);
     67                 }
     68                 sp28->errStatus = 4;
     69                 IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
     70                 __osSetGlobalIntMask(0x100C01);
     71             }
     72 
     73             osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
     74 
     75             if (sp2c == 1 && mb->piHandle->transferInfo.block[0].errStatus == 0) {
     76                 sp2c = 0;
     77                 goto l1;
     78             }
     79 #else
     80             sp30 = osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
     81 
     82             if (sp2c == 1 && mb->piHandle->transferInfo.errStatus == 0) {
     83                 sp2c = 0;
     84                 goto l1;
     85             }
     86 #endif
     87             osSendMesg(sp34->accessQueue, NULL, OS_MESG_NOBLOCK);
     88 
     89             if (mb->piHandle->transferInfo.blockNum == 1) {
     90                 osYieldThread();
     91             }
     92         } else {
     93             switch (mb->hdr.type) {
     94                 case 11:
     95                     osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK);
     96 #ifdef VERSION_CN
     97                     if (__osBbIsBb == 1 && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) {
     98                         loadedToTempBuffer = TRUE;
     99                         ret = sp34->dma_func(OS_READ, mb->devAddr, (void *) 0x80600000, mb->size);
    100                     } else
    101 #endif
    102                         ret = sp34->dma_func(OS_READ, mb->devAddr, mb->dramAddr, mb->size);
    103                     break;
    104                 case 12:
    105                     osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK);
    106                     ret = sp34->dma_func(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size);
    107                     break;
    108                 case 15:
    109                     osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK);
    110 #ifdef VERSION_CN
    111                     if (__osBbIsBb == 1 && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) {
    112                         loadedToTempBuffer = TRUE;
    113                         ret = sp34->edma_func(mb->piHandle, OS_READ, mb->devAddr, (void *) 0x80600000,
    114                                                mb->size);
    115                     } else
    116 #endif
    117                         ret = sp34->edma_func(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr,
    118                                                mb->size);
    119                     break;
    120                 case 16:
    121                     osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK);
    122                     ret = sp34->edma_func(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr,
    123                                            mb->size);
    124                     break;
    125                 case 10:
    126                     osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
    127                     ret = -1;
    128                     break;
    129                     break;
    130                 default:
    131                     ret = -1;
    132                     break;
    133             }
    134             if (ret == 0) {
    135                 osRecvMesg(sp34->eventQueue, &em, OS_MESG_BLOCK);
    136 #ifdef VERSION_CN
    137                 if (__osBbIsBb == 1 && loadedToTempBuffer) {
    138                     osInvalDCache((void *) 0x80600000, ALIGN16(mb->size));
    139                     bcopy((void *) 0x80600000, mb->dramAddr, mb->size);
    140                     osWritebackDCache(mb->dramAddr, mb->size);
    141                     loadedToTempBuffer = FALSE;
    142                 }
    143 #endif
    144 #ifdef VERSION_EU
    145                 sp30 =
    146 #endif
    147                 osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
    148                 osSendMesg(sp34->accessQueue, NULL, OS_MESG_NOBLOCK);
    149             }
    150         }
    151     }
    152 }
    153 #else
    154 void __osDevMgrMain(void *args) {
    155     OSIoMesg *sp34;
    156     OSMesg sp30;
    157     OSMesg sp2c;
    158     s32 sp28;
    159     OSMgrArgs *sp24;
    160     sp34 = NULL;
    161     sp28 = 0;
    162     sp24 = (OSMgrArgs *) args;
    163     while (TRUE) {
    164         osRecvMesg(sp24->cmdQueue, (OSMesg) &sp34, OS_MESG_BLOCK);
    165         switch (sp34->hdr.type) {
    166             case 11:
    167                 osRecvMesg(sp24->accessQueue, &sp2c, OS_MESG_BLOCK);
    168                 sp28 = sp24->dma_func(OS_READ, sp34->devAddr, sp34->dramAddr, sp34->size);
    169                 break;
    170             case 12:
    171                 osRecvMesg(sp24->accessQueue, &sp2c, OS_MESG_BLOCK);
    172                 sp28 = sp24->dma_func(OS_WRITE, sp34->devAddr, sp34->dramAddr, sp34->size);
    173                 break;
    174             case 10:
    175                 osSendMesg(sp34->hdr.retQueue, sp34, OS_MESG_NOBLOCK);
    176                 sp28 = -1;
    177                 break;
    178             default:
    179                 sp28 = -1;
    180                 break;
    181         }
    182         if (sp28 == 0) {
    183             osRecvMesg(sp24->eventQueue, &sp30, OS_MESG_BLOCK);
    184             osSendMesg(sp34->hdr.retQueue, sp34, OS_MESG_NOBLOCK);
    185             osSendMesg(sp24->accessQueue, NULL, OS_MESG_NOBLOCK);
    186         }
    187     }
    188 }
    189 #endif