Пример #1
0
        public static void reset()
        {
            eepromData = new byte[8192];
            for (int i = 0; i < eepromData.Length; i++)
            {
                eepromData[i] = 0xFF;
            }

            eepromBuffer  = new byte[16];
            eepromMode    = EEPROMSTATE.EEPROM_IDLE;
            eepromBits    = 0;
            eepromByte    = 0;
            eepromAddress = 0;
        }
Пример #2
0
        public static int read()
        {
            switch (eepromMode)
            {
            case EEPROMSTATE.EEPROM_IDLE:
            case EEPROMSTATE.EEPROM_READADDRESS:
            case EEPROMSTATE.EEPROM_WRITEDATA:
                return(1);

            case EEPROMSTATE.EEPROM_READDATA:
            {
                eepromBits++;
                if (eepromBits == 4)
                {
                    eepromMode = EEPROMSTATE.EEPROM_READDATA2;
                    eepromBits = 0;
                    eepromByte = 0;
                }
                return(0);
            }

            case EEPROMSTATE.EEPROM_READDATA2:
            {
                int address = eepromAddress << 3;
                int mask    = 1 << (7 - (eepromBits & 7));
                int data    = 0;
                if ((eepromData[address + eepromByte] & mask) > 0)
                {
                    data = 1;
                }
                eepromBits++;
                if ((eepromBits & 7) == 0)
                {
                    eepromByte++;
                }
                if (eepromBits == 0x40)
                {
                    eepromMode = EEPROMSTATE.EEPROM_IDLE;
                }
                return(data);
            }

            default:
                return(0);
            }
        }
Пример #3
0
        public static void write(byte value)
        {
            if (DMA.cpuDmaCount == 0)
            {
                return;
            }
            int bit = value & 1;

            switch (eepromMode)
            {
            case EEPROMSTATE.EEPROM_IDLE:
                eepromByte = 0;
                eepromBits = 1;
                eepromBuffer[eepromByte] = (byte)bit;
                eepromMode = EEPROMSTATE.EEPROM_READADDRESS;
                break;

            case EEPROMSTATE.EEPROM_READADDRESS:
                eepromBuffer[eepromByte] <<= 1;
                eepromBuffer[eepromByte]   = (byte)(eepromBuffer[eepromByte] | bit);
                eepromBits++;
                if ((eepromBits & 7) == 0)
                {
                    eepromByte++;
                }
                if (DMA.cpuDmaCount == 0x11 || DMA.cpuDmaCount == 0x51)
                {
                    if (eepromBits == 0x11)
                    {
                        //eepromInUse = true;
                        eepromAddress = ((eepromBuffer[0] & 0x3F) << 8) | ((eepromBuffer[1] & 0xFF));
                        if ((eepromBuffer[0] & 0x40) == 0)
                        {
                            eepromBuffer[0] = (byte)bit;
                            eepromBits      = 1;
                            eepromByte      = 0;
                            eepromMode      = EEPROMSTATE.EEPROM_WRITEDATA;
                        }
                        else
                        {
                            eepromMode = EEPROMSTATE.EEPROM_READDATA;
                            eepromByte = 0;
                            eepromBits = 0;
                        }
                    }
                }
                else
                {
                    if (eepromBits == 9)
                    {
                        //eepromInUse = true;
                        eepromAddress = (eepromBuffer[0] & 0x3F);
                        if ((eepromBuffer[0] & 0x40) == 0)
                        {
                            eepromBuffer[0] = (byte)bit;
                            eepromBits      = 1;
                            eepromByte      = 0;
                            eepromMode      = EEPROMSTATE.EEPROM_WRITEDATA;
                        }
                        else
                        {
                            eepromMode = EEPROMSTATE.EEPROM_READDATA;
                            eepromByte = 0;
                            eepromBits = 0;
                        }
                    }
                }
                break;

            case EEPROMSTATE.EEPROM_READDATA:
            case EEPROMSTATE.EEPROM_READDATA2:
                // should we reset here?
                eepromMode = EEPROMSTATE.EEPROM_IDLE;
                break;

            case EEPROMSTATE.EEPROM_WRITEDATA:
                eepromBuffer[eepromByte] <<= 1;
                eepromBuffer[eepromByte]   = (byte)(eepromBuffer[eepromByte] | bit);
                eepromBits++;
                if ((eepromBits & 7) == 0)
                {
                    eepromByte++;
                }
                if (eepromBits == 0x40)
                {
                    //eepromInUse = true;
                    // write data;
                    for (int i = 0; i < 8; i++)
                    {
                        eepromData[(eepromAddress << 3) + i] = eepromBuffer[i];
                    }
                }
                else if (eepromBits == 0x41)
                {
                    eepromMode = EEPROMSTATE.EEPROM_IDLE;
                    eepromByte = 0;
                    eepromBits = 0;
                }
                break;
            }
        }