diff --git a/src/boards/164.c b/src/boards/164.c index 8557317..16e0748 100644 --- a/src/boards/164.c +++ b/src/boards/164.c @@ -26,7 +26,7 @@ */ #include "mapinc.h" -#include "eeprom_93C66.h" +#include "eeprom_93Cx6.h" static uint8 *WRAM; static uint32 WRAMSIZE; @@ -72,12 +72,12 @@ static void sync() setmirror(reg[0] &0x10 && ~reg[3] &0x80? MI_H: MI_V); - eeprom_93C66_write(reg[2] &0x10, reg[2] &0x04, reg[2] &0x01); + eeprom_93Cx6_write(reg[2] &0x10, reg[2] &0x04, reg[2] &0x01); } static DECLFR(readReg) { - return eeprom_93C66_read()? 0x00: 0x04; + return eeprom_93Cx6_read()? 0x00: 0x04; } static DECLFW(writeReg) @@ -89,7 +89,7 @@ static DECLFW(writeReg) static void power(void) { memset(reg, 0, sizeof(reg)); - eeprom_93C66_init(); + eeprom_93Cx6_init(512, 8); sync(); SetReadHandler (0x5400, 0x57FF, readReg); SetWriteHandler(0x5000, 0x57FF, writeReg); @@ -130,7 +130,7 @@ void Mapper164_Init (CartInfo *info) AddExState(WRAM, WRAMSIZE, 0, "WRAM"); FCEU_CheatAddRAM(WRAMSIZE >> 10, 0x6000, WRAM); - eeprom_93C66_storage = eeprom_data; + eeprom_93Cx6_storage = eeprom_data; info->battery = 1; info->SaveGame[0] = eeprom_data; info->SaveGameLen[0] = 512; diff --git a/src/boards/529.c b/src/boards/529.c index 6dfc047..57b5444 100644 --- a/src/boards/529.c +++ b/src/boards/529.c @@ -20,6 +20,14 @@ #include "mapinc.h" #include "vrc2and4.h" +#include "eeprom_93Cx6.h" + +static uint8 eeprom_data[256]; + +static SFORMAT stateRegs[] ={ + { eeprom_data, 256, "EEPR" }, + { 0 } +}; static void sync () { setprg16(0x8000, VRC24_prg[1]); @@ -29,19 +37,28 @@ static void sync () { } DECLFR(UNLT230_readEEPROM) { - return 0xFF; + return eeprom_93Cx6_read()? 0x01: 0x00; } DECLFW(UNLT230_writeEEPROM) { + eeprom_93Cx6_write(A &0x04, A &0x02, A &0x01); } void UNLT230_power (void) { VRC24_power(); + eeprom_93Cx6_init(256, 16); SetReadHandler(0x5000, 0x5FFF, UNLT230_readEEPROM); SetWriteHandler(0xF800, 0xFFFF, UNLT230_writeEEPROM); } void UNLT230_Init (CartInfo *info) { VRC24_init(info, sync, 0x04, 0x08, 1, 1, 0); - info->Power =UNLT230_power; + if (info->PRGRamSaveSize) { + info->Power =UNLT230_power; + AddExState(stateRegs, ~0, 0, 0); + eeprom_93Cx6_storage = eeprom_data; + info->battery = 1; + info->SaveGame[0] = eeprom_data; + info->SaveGameLen[0] = 256; + } } diff --git a/src/boards/558.c b/src/boards/558.c index 9be3ed1..e9b8c96 100644 --- a/src/boards/558.c +++ b/src/boards/558.c @@ -23,7 +23,7 @@ /* Yancheng YC-03-09/Waixing FS??? PCB */ #include "mapinc.h" -#include "eeprom_93C66.h" +#include "eeprom_93Cx6.h" static uint8 *WRAM; static uint32 WRAMSIZE; @@ -44,7 +44,7 @@ static void sync() setchr8(0); if (haveEEPROM) - eeprom_93C66_write(reg[2] &0x04, reg[2] &0x02, reg[2] &0x01); + eeprom_93Cx6_write(reg[2] &0x04, reg[2] &0x02, reg[2] &0x01); } static void hblank(void) { @@ -60,7 +60,7 @@ static void hblank(void) { static DECLFR(readReg) { if (haveEEPROM) - return eeprom_93C66_read()? 0x04: 0x00; + return eeprom_93Cx6_read()? 0x04: 0x00; else return reg[2] &0x04; } @@ -84,7 +84,7 @@ static void power(void) { memset(reg, 0, sizeof(reg)); if (haveEEPROM) - eeprom_93C66_init(); + eeprom_93Cx6_init(512, 8); sync(); SetReadHandler (0x5000, 0x57FF, readReg); SetWriteHandler(0x5000, 0x57FF, writeReg); @@ -128,7 +128,7 @@ void Mapper558_Init (CartInfo *info) haveEEPROM =!!(info->PRGRamSaveSize &0x200); if (haveEEPROM) { - eeprom_93C66_storage = eeprom_data; + eeprom_93Cx6_storage = eeprom_data; info->battery = 1; info->SaveGame[0] = eeprom_data; info->SaveGameLen[0] = 512; diff --git a/src/boards/eeprom_93C66.c b/src/boards/eeprom_93C66.c deleted file mode 100644 index 9f793ec..0000000 --- a/src/boards/eeprom_93C66.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "eeprom_93C66.h" - -uint8* eeprom_93C66_storage; -uint8 eeprom_93C66_opcode; -uint8 eeprom_93C66_data; -uint16 eeprom_93C66_address; -uint8 eeprom_93C66_state; -uint8 eeprom_93C66_lastCLK; -uint8 eeprom_93C66_writeEnabled; -uint8 eeprom_93C66_output; - -#define OPCODE_MISC 0 -#define OPCODE_WRITE 1 -#define OPCODE_READ 2 -#define OPCODE_ERASE 3 -#define OPCODE_WRITEDISABLE 10 -#define OPCODE_WRITEALL 11 -#define OPCODE_ERASEALL 12 -#define OPCODE_WRITEENABLE 13 - -#define STATE_STANDBY 0 -#define STATE_STARTBIT 1 -#define STATE_OPCODE 3 -#define STATE_ADDRESS 12 -#define STATE_DATA 20 -#define STATE_FINISHED 99 - -void eeprom_93C66_init () -{ - eeprom_93C66_address =0; - eeprom_93C66_state =STATE_STANDBY; - eeprom_93C66_lastCLK =0; - eeprom_93C66_writeEnabled =0; -} - -uint8 eeprom_93C66_read () -{ - return eeprom_93C66_output; -} - -void eeprom_93C66_write (uint8 CS, uint8 CLK, uint8 DAT) -{ - if (!CS && eeprom_93C66_state <= STATE_ADDRESS) - eeprom_93C66_state =STATE_STANDBY; - else - if (eeprom_93C66_state ==STATE_STANDBY && CS && CLK) - { - eeprom_93C66_state =STATE_STARTBIT; - eeprom_93C66_opcode =0; - eeprom_93C66_address =0; - eeprom_93C66_output =1; - } - else - if (CLK && !eeprom_93C66_lastCLK) - { - if (eeprom_93C66_state >=STATE_STARTBIT && eeprom_93C66_state =STATE_OPCODE && eeprom_93C66_state =STATE_ADDRESS && eeprom_93C66_state >7) + 10; - switch (eeprom_93C66_opcode) - { - case OPCODE_WRITEDISABLE: - eeprom_93C66_writeEnabled = 0; - eeprom_93C66_state = STATE_FINISHED; - break; - case OPCODE_WRITEENABLE: - eeprom_93C66_writeEnabled = 1; - eeprom_93C66_state = STATE_FINISHED; - break; - case OPCODE_ERASEALL: - if (eeprom_93C66_writeEnabled) - { - int i; - for (i =0; i <512; i++) - eeprom_93C66_storage[i] = 0xFF; - } - eeprom_93C66_state = STATE_FINISHED; - break; - case OPCODE_WRITEALL: - eeprom_93C66_address = 0; - break; - } - break; - case OPCODE_ERASE: - if (eeprom_93C66_writeEnabled) eeprom_93C66_storage[eeprom_93C66_address] = 0xFF; - eeprom_93C66_state = STATE_FINISHED; - break; - case OPCODE_READ: - eeprom_93C66_data = eeprom_93C66_storage[eeprom_93C66_address++]; - break; - } - } - else - if (eeprom_93C66_state ==STATE_DATA) - { - if (eeprom_93C66_opcode ==OPCODE_WRITE) - { - eeprom_93C66_storage[eeprom_93C66_address++] = eeprom_93C66_data; - eeprom_93C66_state = STATE_FINISHED; - } - else - if (eeprom_93C66_opcode ==OPCODE_WRITEALL) - { - eeprom_93C66_storage[eeprom_93C66_address++] = eeprom_93C66_data; - eeprom_93C66_state = CS && eeprom_93C66_address <512? STATE_ADDRESS: STATE_FINISHED; - } - else - if (eeprom_93C66_opcode ==OPCODE_READ) - { - if (eeprom_93C66_address <512) eeprom_93C66_data = eeprom_93C66_storage[eeprom_93C66_address]; - eeprom_93C66_state = CS && ++eeprom_93C66_address <=512? STATE_ADDRESS: STATE_FINISHED; - } - } - if (eeprom_93C66_state == STATE_FINISHED) - { - eeprom_93C66_output = 0; - eeprom_93C66_state = STATE_STANDBY; - } - } - eeprom_93C66_lastCLK = CLK; -} diff --git a/src/boards/eeprom_93C66.h b/src/boards/eeprom_93C66.h deleted file mode 100644 index 458f02e..0000000 --- a/src/boards/eeprom_93C66.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _EEPROM_93C66_H -#define _EEPROM_93C66_H -#include "mapinc.h" - -extern uint8* eeprom_93C66_storage; - -void eeprom_93C66_init (); -uint8 eeprom_93C66_read (); -void eeprom_93C66_write (uint8 CS, uint8 CLK, uint8 DAT); -#endif diff --git a/src/boards/eeprom_93Cx6.c b/src/boards/eeprom_93Cx6.c new file mode 100644 index 0000000..0ea16ee --- /dev/null +++ b/src/boards/eeprom_93Cx6.c @@ -0,0 +1,162 @@ +#include "eeprom_93Cx6.h" + +uint8* eeprom_93Cx6_storage; +uint8 eeprom_93Cx6_opcode; +uint16 eeprom_93Cx6_data; +uint16 eeprom_93Cx6_address; +uint8 eeprom_93Cx6_state; +uint8 eeprom_93Cx6_lastCLK; +uint8 eeprom_93Cx6_writeEnabled; +uint8 eeprom_93Cx6_output; +size_t eeprom_93Cx6_capacity; +uint8 eeprom_93Cx6_wordSize; + +static uint8 STATE_ADDRESS; +static uint8 STATE_DATA; + +#define OPCODE_MISC 0 +#define OPCODE_WRITE 1 +#define OPCODE_READ 2 +#define OPCODE_ERASE 3 +#define OPCODE_WRITEDISABLE 10 +#define OPCODE_WRITEALL 11 +#define OPCODE_ERASEALL 12 +#define OPCODE_WRITEENABLE 13 + +#define STATE_STANDBY 0 +#define STATE_STARTBIT 1 +#define STATE_OPCODE 3 +#define STATE_ADDRESS8 12 +#define STATE_DATA8 20 +#define STATE_ADDRESS16 11 +#define STATE_DATA16 27 +#define STATE_FINISHED 99 + +void eeprom_93Cx6_init (size_t capacity, uint8 wordSize) { + eeprom_93Cx6_capacity =capacity; + eeprom_93Cx6_wordSize =wordSize; + eeprom_93Cx6_address =0; + eeprom_93Cx6_state =STATE_STANDBY; + eeprom_93Cx6_lastCLK =0; + eeprom_93Cx6_writeEnabled =0; + STATE_ADDRESS =wordSize ==16? STATE_ADDRESS16: STATE_ADDRESS8; + STATE_DATA =wordSize ==16? STATE_DATA16: STATE_DATA8; + if (capacity ==128) { + STATE_ADDRESS -=2; + STATE_DATA -=2; + } +} + +uint8 eeprom_93Cx6_read () { + return eeprom_93Cx6_output; +} + +void eeprom_93Cx6_write (uint8 CS, uint8 CLK, uint8 DAT) { + if (!CS && eeprom_93Cx6_state <= STATE_ADDRESS) + eeprom_93Cx6_state =STATE_STANDBY; + else + if (eeprom_93Cx6_state ==STATE_STANDBY && CS && CLK && !eeprom_93Cx6_lastCLK) { + if (DAT) eeprom_93Cx6_state =STATE_STARTBIT; + eeprom_93Cx6_opcode =0; + eeprom_93Cx6_address =0; + eeprom_93Cx6_output =1; + } else + if (CLK && !eeprom_93Cx6_lastCLK && eeprom_93Cx6_state >=STATE_STARTBIT) { + if (eeprom_93Cx6_state >=STATE_STARTBIT && eeprom_93Cx6_state =STATE_OPCODE && eeprom_93Cx6_state =STATE_ADDRESS && eeprom_93Cx6_state >(eeprom_93Cx6_wordSize ==16? 6: 7)) + 10; + switch (eeprom_93Cx6_opcode) { + case OPCODE_WRITEDISABLE: + eeprom_93Cx6_writeEnabled = 0; + eeprom_93Cx6_state = STATE_FINISHED; + break; + case OPCODE_WRITEENABLE: + eeprom_93Cx6_writeEnabled = 1; + eeprom_93Cx6_state = STATE_FINISHED; + break; + case OPCODE_ERASEALL: + if (eeprom_93Cx6_writeEnabled) { + int i; + for (i =0; i >8; + eeprom_93Cx6_address++; + } else + eeprom_93Cx6_storage[eeprom_93Cx6_address++] = eeprom_93Cx6_data; + eeprom_93Cx6_state = STATE_FINISHED; + } else + if (eeprom_93Cx6_opcode ==OPCODE_WRITEALL) { + if (eeprom_93Cx6_wordSize ==16) { + eeprom_93Cx6_storage[eeprom_93Cx6_address <<1 |0] = eeprom_93Cx6_data &0xFF; + eeprom_93Cx6_storage[eeprom_93Cx6_address <<1 |1] = eeprom_93Cx6_data >>8; + eeprom_93Cx6_address++; + } else + eeprom_93Cx6_storage[eeprom_93Cx6_address++] = eeprom_93Cx6_data; + eeprom_93Cx6_state = CS && eeprom_93Cx6_address