//
-// 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 <jlhamm@acm.org>
+//
+// Who When What
+// --- ---------- -------------------------------------------------------------
+// JLH 01/16/2010 Created this log ;-)
//
-#include <stdlib.h>
#include "eeprom.h"
+
+#include <stdlib.h>
+#include <string.h> // For memset
+#include "jaguar.h"
+#include "log.h"
#include "settings.h"
#define eeprom_LOG
-static uint16 eeprom_ram[64];
+static uint16_t 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_t state);
+static void eeprom_set_cs(uint32_t state);
+static uint32_t 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,
// 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;
-FILE * jerry_ee_fp;
+static uint16_t jerry_ee_state = EE_STATE_START;
+static uint16_t jerry_ee_op = 0;
+static uint16_t jerry_ee_rstate = 0;
+static uint16_t jerry_ee_address_data = 0;
+static uint16_t jerry_ee_address_cnt = 6;
+static uint16_t jerry_ee_data = 0;
+static uint16_t jerry_ee_data_cnt = 16;
+static uint16_t jerry_writes_enabled = 0;
+static uint16_t 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);
- 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;
}
else
- {
- WriteLog("EEPROM: Creating %s\n", eeprom_filename);
- jerry_ee_fp = fopen(eeprom_filename, "wb");
- if (jerry_ee_fp == NULL)
- WriteLog("EEPROM: Could not open/create %s!\n", eeprom_filename);
- }
+ 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));
+ memset(eeprom_ram, 0xFF, 64 * sizeof(uint16_t));
}
-void eeprom_done(void)
+void EepromDone(void)
{
-//Actually, is this necessary now that we write the file immediately upon write to EEPROM?
-// EEPROMSave();
+ WriteLog("EEPROM: Done.\n");
}
-void EEPROMSave(void)
+static void EEPROMSave(void)
{
- jerry_ee_fp = fopen(eeprom_filename, "wb");
- fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
- fclose(jerry_ee_fp);
+ FILE * fp = fopen(eeprom_filename, "wb");
+
+ if (fp == NULL)
+ {
+ WriteLog("EEPROM: Could not create file \"%s!\"\n", eeprom_filename);
+ return;
+ }
+
+ fwrite(eeprom_ram, 1, 128, fp);
+ fclose(fp);
}
-uint8 eeprom_byte_read(uint32 offset)
+uint8_t EepromReadByte(uint32_t offset)
{
switch (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_t EepromReadWord(uint32_t offset)
{
- return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
+ return ((uint16_t)EepromReadByte(offset + 0) << 8) | EepromReadByte(offset + 1);
}
-void eeprom_byte_write(uint32 offset, uint8 data)
+void EepromWriteByte(uint32_t offset, uint8_t data)
{
switch (offset)
{
}
}
-void eeprom_word_write(uint32 offset, uint16 data)
+void EepromWriteWord(uint32_t offset, uint16_t 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_t data)
{
// WriteLog("eeprom: di=%i\n",data);
// WriteLog("eeprom: state %i\n",jerry_ee_state);
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");
//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;
//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_t state)
{
// WriteLog("eeprom: cs=%i\n",state);
jerry_ee_state = EE_STATE_START;
jerry_writes_enabled = 1;
}
-uint32 eeprom_get_do(void)
+static uint32_t eeprom_get_do(void)
{
- uint16 data = 1;
+ uint16_t data = 1;
switch (jerry_ee_state)
{
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());