X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Feeprom.cpp;h=bba94afd3d4cb5f283b79cc30a08aaa53d04a5c0;hb=5c28b6dbf7aa20441c8a51f484f4f64b1966f7e3;hp=6b2ef65d68f837ded862b17d59a5328d6dd23abe;hpb=6c19e4098a43c47f8cd1824902f7335e124b834f;p=virtualjaguar diff --git a/src/eeprom.cpp b/src/eeprom.cpp index 6b2ef65..bba94af 100644 --- a/src/eeprom.cpp +++ b/src/eeprom.cpp @@ -1,18 +1,25 @@ // -// EEPROM handler +// Jaguar EEPROM handler // // by Cal2 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS) -// Cleanups/enhancements by James L. Hammons +// Cleanups/enhancements by James Hammons +// (C) 2010 Underground Software +// +// JLH = James Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 01/16/2010 Created this log ;-) // #include "eeprom.h" -#include // For memset #include -#include "settings.h" -#include "log.h" +#include // For memset #include "jaguar.h" +#include "log.h" +#include "settings.h" #define eeprom_LOG @@ -22,10 +29,10 @@ static uint16 eeprom_ram[64]; // Private function prototypes // -void EEPROMSave(void); -void eeprom_set_di(uint32 state); -void eeprom_set_cs(uint32 state); -uint32 eeprom_get_do(void); +static void EEPROMSave(void); +static void eeprom_set_di(uint32 state); +static void eeprom_set_cs(uint32 state); +static uint32 eeprom_get_do(void); enum { EE_STATE_START = 1, EE_STATE_OP_A, EE_STATE_OP_B, EE_STATE_0, EE_STATE_1, EE_STATE_2, EE_STATE_3, EE_STATE_0_0, EE_READ_ADDRESS, EE_STATE_0_0_0, @@ -34,26 +41,27 @@ enum { EE_STATE_START = 1, EE_STATE_OP_A, EE_STATE_OP_B, EE_STATE_0, EE_STATE_1, // Local global variables -uint16 jerry_ee_state = EE_STATE_START; -uint16 jerry_ee_op = 0; -uint16 jerry_ee_rstate = 0; -uint16 jerry_ee_address_data = 0; -uint16 jerry_ee_address_cnt = 6; -uint16 jerry_ee_data = 0; -uint16 jerry_ee_data_cnt = 16; -uint16 jerry_writes_enabled = 0; -uint16 jerry_ee_direct_jump = 0; +static uint16 jerry_ee_state = EE_STATE_START; +static uint16 jerry_ee_op = 0; +static uint16 jerry_ee_rstate = 0; +static uint16 jerry_ee_address_data = 0; +static uint16 jerry_ee_address_cnt = 6; +static uint16 jerry_ee_data = 0; +static uint16 jerry_ee_data_cnt = 16; +static uint16 jerry_writes_enabled = 0; +static uint16 jerry_ee_direct_jump = 0; static char eeprom_filename[MAX_PATH]; static bool foundEEPROM = false; -void eeprom_init(void) +void EepromInit(void) { - sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguar_mainRom_crc32); - FILE * jerry_ee_fp = fopen(eeprom_filename, "rb"); - if (jerry_ee_fp) + sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguarMainROMCRC32); + FILE * fp = fopen(eeprom_filename, "rb"); + + if (fp) { - fread(eeprom_ram, 1, 128, jerry_ee_fp); - fclose(jerry_ee_fp); + fread(eeprom_ram, 1, 128, fp); + fclose(fp); WriteLog("EEPROM: Loaded from %s\n", eeprom_filename); foundEEPROM = true; } @@ -61,31 +69,32 @@ void eeprom_init(void) WriteLog("EEPROM: Could not open file \"%s\"!\n", eeprom_filename); } -void eeprom_reset(void) +void EepromReset(void) { if (!foundEEPROM) memset(eeprom_ram, 0xFF, 64 * sizeof(uint16)); } -void eeprom_done(void) +void EepromDone(void) { + WriteLog("EEPROM: Done.\n"); } -void EEPROMSave(void) +static void EEPROMSave(void) { - FILE * jerry_ee_fp = fopen(eeprom_filename, "wb"); + FILE * fp = fopen(eeprom_filename, "wb"); - if (jerry_ee_fp == NULL) + if (fp == NULL) { WriteLog("EEPROM: Could not create file \"%s!\"\n", eeprom_filename); return; } - fwrite(eeprom_ram, 1, 128, jerry_ee_fp); - fclose(jerry_ee_fp); + fwrite(eeprom_ram, 1, 128, fp); + fclose(fp); } -uint8 eeprom_byte_read(uint32 offset) +uint8 EepromReadByte(uint32 offset) { switch (offset) { @@ -96,18 +105,18 @@ uint8 eeprom_byte_read(uint32 offset) case 0xF15001: eeprom_set_cs(1); break; -// default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break; +// default: WriteLog("EEPROM: unmapped 0x%.8x\n", offset); break; } return 0x00; } -uint16 eeprom_word_read(uint32 offset) +uint16 EepromReadWord(uint32 offset) { - return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1); + return ((uint16)EepromReadByte(offset + 0) << 8) | EepromReadByte(offset + 1); } -void eeprom_byte_write(uint32 offset, uint8 data) +void EepromWriteByte(uint32 offset, uint8 data) { switch (offset) { @@ -123,13 +132,13 @@ void eeprom_byte_write(uint32 offset, uint8 data) } } -void eeprom_word_write(uint32 offset, uint16 data) +void EepromWriteWord(uint32 offset, uint16 data) { - eeprom_byte_write(offset+0, (data >> 8) & 0xFF); - eeprom_byte_write(offset+1, data & 0xFF); + EepromWriteByte(offset + 0, (data >> 8) & 0xFF); + EepromWriteByte(offset + 1, data & 0xFF); } -void eeprom_set_di(uint32 data) +static void eeprom_set_di(uint32 data) { // WriteLog("eeprom: di=%i\n",data); // WriteLog("eeprom: state %i\n",jerry_ee_state); @@ -191,6 +200,7 @@ void eeprom_set_di(uint32 data) if (jerry_writes_enabled) for(int i=0; i<64; i++) eeprom_ram[i] = jerry_ee_data; + EEPROMSave(); // Save it NOW! //else // WriteLog("eeprom: not writing because read only\n"); @@ -229,6 +239,7 @@ void eeprom_set_di(uint32 data) //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data); if (jerry_writes_enabled) eeprom_ram[jerry_ee_address_data] = jerry_ee_data; + EEPROMSave(); // Save it NOW! jerry_ee_state = EE_STATE_BUSY; break; @@ -251,39 +262,44 @@ void eeprom_set_di(uint32 data) //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data); if (jerry_writes_enabled) eeprom_ram[jerry_ee_address_data] = 0xFFFF; + jerry_ee_state = EE_STATE_BUSY; break; - case EE_READ_DATA: + case EE_READ_DATA: //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1); jerry_ee_data <<= 1; jerry_ee_data |= data; jerry_ee_data_cnt--; + if (!jerry_ee_data_cnt) { jerry_ee_state = jerry_ee_rstate; + if (jerry_ee_direct_jump) eeprom_set_di(data); } break; - case EE_READ_ADDRESS: + case EE_READ_ADDRESS: jerry_ee_address_data <<= 1; jerry_ee_address_data |= data; jerry_ee_address_cnt--; // WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt); + if (!jerry_ee_address_cnt) { jerry_ee_state = jerry_ee_rstate; //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data); + if (jerry_ee_direct_jump) eeprom_set_di(data); } break; default: - jerry_ee_state = EE_STATE_OP_A; + jerry_ee_state = EE_STATE_OP_A; } } -void eeprom_set_cs(uint32 state) +static void eeprom_set_cs(uint32 state) { // WriteLog("eeprom: cs=%i\n",state); jerry_ee_state = EE_STATE_START; @@ -296,7 +312,7 @@ void eeprom_set_cs(uint32 state) jerry_writes_enabled = 1; } -uint32 eeprom_get_do(void) +static uint32 eeprom_get_do(void) { uint16 data = 1; @@ -312,6 +328,7 @@ uint32 eeprom_get_do(void) case EE_STATE_2_0: jerry_ee_data_cnt--; data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt; + if (!jerry_ee_data_cnt) { //WriteLog("eeprom: read 0x%.4x at 0x%.2x cpu %i pc=0x%.8x\n",eeprom_ram[jerry_ee_address_data],jerry_ee_address_data,jaguar_cpu_in_exec,s68000readPC());