sm64

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

osEepromRead.c (2634B)


      1 #include "libultra_internal.h"
      2 #include "PR/ique.h"
      3 #include "controller.h"
      4 #include "macros.h"
      5 
      6 #ifdef VERSION_CN
      7 
      8 s32 osEepromRead(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) {
      9     s32 ret = 0;
     10     s32 i;
     11 
     12     __osSiGetAccess();
     13 
     14     if (__osBbEepromSize == 0x200) {
     15         if (address >= 0x200 / 8) {
     16             ret = -1;
     17         }
     18     } else if (__osBbEepromSize != 0x800) {
     19         ret = 8;
     20     }
     21 
     22     if (ret == 0) {
     23         for (i = 0; i < 8; i++) {
     24             buffer[i] = (__osBbEepromAddress + address * 8)[i];
     25         }
     26     }
     27 
     28     __osSiRelAccess();
     29     return ret;
     30 }
     31 
     32 #else
     33 
     34 void __osPackEepReadData(u8);
     35 
     36 s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) {
     37     s32 ret = 0;
     38     s32 i = 0;
     39     u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
     40     OSContStatus sdata;
     41     __OSContEepromFormat eepromformat;
     42 
     43     if (address > EEPROM_MAXBLOCKS) {
     44         return -1;
     45     }
     46 
     47     __osSiGetAccess();
     48     ret = __osEepStatus(mq, &sdata);
     49     if (ret != 0 || sdata.type != CONT_EEPROM) {
     50 
     51         return CONT_NO_RESPONSE_ERROR;
     52     }
     53 
     54     while (sdata.status & CONT_EEPROM_BUSY) {
     55         __osEepStatus(mq, &sdata);
     56     }
     57     __osPackEepReadData(address);
     58 
     59     ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
     60     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
     61 
     62     for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
     63         __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
     64     }
     65     __osEepPifRam.pifstatus = 0;
     66 
     67     ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
     68     __osContLastCmd = CONT_CMD_READ_EEPROM;
     69     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
     70 
     71     for (i = 0; i < 4; i++) {
     72         ptr++;
     73     }
     74 
     75     eepromformat = *(__OSContEepromFormat *) ptr;
     76     ret = CHNL_ERR(eepromformat);
     77 
     78     if (ret == 0) {
     79         for (i = 0; i < 8; i++) {
     80             *buffer++ = eepromformat.data[i];
     81         }
     82     }
     83 
     84     __osSiRelAccess();
     85     return ret;
     86 }
     87 
     88 void __osPackEepReadData(u8 address) {
     89     u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
     90     __OSContEepromFormat eepromformat;
     91     s32 i;
     92     
     93     for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
     94         __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
     95     }
     96     __osEepPifRam.pifstatus = CONT_CMD_EXE;
     97 
     98     eepromformat.txsize = CONT_CMD_READ_EEPROM_TX;
     99     eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX;
    100     eepromformat.cmd = CONT_CMD_READ_EEPROM;
    101     eepromformat.address = address;
    102     for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) {
    103         eepromformat.data[i] = 0;
    104     }
    105 
    106     for (i = 0; i < 4; i++) {
    107         *ptr++ = 0;
    108     }
    109 
    110     *(__OSContEepromFormat *) ptr = eepromformat;
    111     ptr += sizeof(__OSContEepromFormat);
    112     *ptr = CONT_CMD_END;
    113 }
    114 
    115 #endif