sm64

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

osEepromWrite.c (4180B)


      1 #include "libultra_internal.h"
      2 #include "osContInternal.h"
      3 #include "PR/ique.h"
      4 #include "controller.h"
      5 #include "macros.h"
      6 
      7 #ifdef VERSION_CN
      8 
      9 s32 osEepromWrite(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) {
     10     s32 ret = 0;
     11     s32 i;
     12 
     13     __osSiGetAccess();
     14 
     15     if (__osBbEepromSize == 0x200) {
     16         if (address >= 0x200 / 8) {
     17             ret = -1;
     18         }
     19     } else if (__osBbEepromSize != 0x800) {
     20         ret = 8;
     21     }
     22 
     23     if (ret == 0) {
     24         for (i = 0; i < 8; i++) {
     25             (__osBbEepromAddress + address * 8)[i] = buffer[i];
     26         }
     27     }
     28 
     29     __osSiRelAccess();
     30     return ret;
     31 }
     32 
     33 #else
     34 
     35 OSPifRam __osEepPifRam;
     36 
     37 void __osPackEepWriteData(u8, u8 *);
     38 
     39 s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) {
     40     s32 ret = 0;
     41     s32 i;
     42     u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
     43     __OSContEepromFormat eepromformat;
     44     OSContStatus sdata;
     45 
     46     if (address > EEPROM_MAXBLOCKS) {
     47         return -1;
     48     }
     49 
     50     __osSiGetAccess();
     51     ret = __osEepStatus(mq, &sdata);
     52 
     53     if (ret != 0 || sdata.type != CONT_EEPROM) {
     54         return CONT_NO_RESPONSE_ERROR;
     55     }
     56 
     57     while (sdata.status & CONT_EEPROM_BUSY) {
     58         __osEepStatus(mq, &sdata);
     59     }
     60 
     61     __osPackEepWriteData(address, buffer);
     62 
     63     ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
     64     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
     65 
     66     for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
     67         __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
     68     }
     69 
     70     __osEepPifRam.pifstatus = 0;
     71     ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
     72     __osContLastCmd = CONT_CMD_WRITE_EEPROM;
     73     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
     74 
     75     for (i = 0; i < 4; i++) {
     76         ptr++;
     77     }
     78 
     79     eepromformat = *(__OSContEepromFormat *) ptr;
     80     ret = CHNL_ERR(eepromformat);
     81     __osSiRelAccess();
     82     return ret;
     83 }
     84 
     85 void __osPackEepWriteData(u8 address, u8 *buffer) {
     86     u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
     87     __OSContEepromFormat eepromformat;
     88     s32 i;
     89 
     90     for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
     91         __osEepPifRam.ramarray[i] = CONT_CMD_NOP;
     92     }
     93     __osEepPifRam.pifstatus = CONT_CMD_EXE;
     94 
     95     eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX;
     96     eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX;
     97     eepromformat.cmd = CONT_CMD_WRITE_EEPROM;
     98     eepromformat.address = address;
     99 
    100     for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) {
    101         eepromformat.data[i] = *buffer++;
    102     }
    103 
    104     for (i = 0; i < 4; i++) {
    105         *ptr++ = 0;
    106     }
    107     *(__OSContEepromFormat *) ptr = eepromformat;
    108     ptr += sizeof(__OSContEepromFormat);
    109     *ptr = CONT_CMD_END;
    110 }
    111 
    112 s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) {
    113     u32 ret = 0;
    114     s32 i;
    115     u8 *ptr = (u8 *) __osEepPifRam.ramarray;
    116     __OSContRequesFormat requestformat;
    117 
    118     for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
    119         __osEepPifRam.ramarray[i] = 0;
    120     }
    121     __osEepPifRam.pifstatus = CONT_CMD_EXE;
    122 
    123     ptr = (u8 *) __osEepPifRam.ramarray;
    124     for (i = 0; i < 4; i++) {
    125         *ptr++ = 0;
    126     }
    127 
    128     requestformat.dummy = CONT_CMD_NOP;
    129     requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX;
    130     requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX;
    131     requestformat.cmd = CONT_CMD_REQUEST_STATUS;
    132     requestformat.typeh = CONT_CMD_NOP;
    133     requestformat.typel = CONT_CMD_NOP;
    134     requestformat.status = CONT_CMD_NOP;
    135     requestformat.dummy1 = CONT_CMD_NOP;
    136     *(__OSContRequesFormat *) ptr = requestformat;
    137 
    138     ptr += sizeof(__OSContRequesFormat);
    139     *ptr = CONT_CMD_END;
    140 
    141     ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
    142     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
    143 
    144     __osContLastCmd = CONT_CMD_WRITE_EEPROM;
    145 
    146     ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
    147     osRecvMesg(mq, NULL, OS_MESG_BLOCK);
    148 
    149     if (ret != 0) {
    150         return ret;
    151     }
    152 
    153     ptr = (u8 *) __osEepPifRam.ramarray;
    154     for (i = 0; i < 4; i++) {
    155         *ptr++ = 0;
    156     }
    157 
    158     requestformat = *(__OSContRequesFormat *) ptr;
    159     data->errnum = CHNL_ERR(requestformat);
    160     data->type = (requestformat.typel << 8) | requestformat.typeh;
    161     data->status = requestformat.status;
    162     if (data->errnum != 0) {
    163         return data->errnum;
    164     }
    165     return 0;
    166 }
    167 
    168 #endif