2 // Jaguar EEPROM handler
5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups/enhancements by James L. Hammons
7 // (C) 2010 Underground Software
9 // JLH = James L. Hammons <jlhamm@acm.org>
12 // --- ---------- -------------------------------------------------------------
13 // JLH 01/16/2010 Created this log ;-)
19 #include <string.h> // For memset
26 static uint16 eeprom_ram[64];
29 // Private function prototypes
32 static void EEPROMSave(void);
33 static void eeprom_set_di(uint32 state);
34 static void eeprom_set_cs(uint32 state);
35 static uint32 eeprom_get_do(void);
37 enum { EE_STATE_START = 1, EE_STATE_OP_A, EE_STATE_OP_B, EE_STATE_0, EE_STATE_1,
38 EE_STATE_2, EE_STATE_3, EE_STATE_0_0, EE_READ_ADDRESS, EE_STATE_0_0_0,
39 EE_STATE_0_0_1, EE_STATE_0_0_2, EE_STATE_0_0_3, EE_STATE_0_0_1_0, EE_READ_DATA,
40 EE_STATE_BUSY, EE_STATE_1_0, EE_STATE_1_1, EE_STATE_2_0, EE_STATE_3_0 };
42 // Local global variables
44 static uint16 jerry_ee_state = EE_STATE_START;
45 static uint16 jerry_ee_op = 0;
46 static uint16 jerry_ee_rstate = 0;
47 static uint16 jerry_ee_address_data = 0;
48 static uint16 jerry_ee_address_cnt = 6;
49 static uint16 jerry_ee_data = 0;
50 static uint16 jerry_ee_data_cnt = 16;
51 static uint16 jerry_writes_enabled = 0;
52 static uint16 jerry_ee_direct_jump = 0;
53 static char eeprom_filename[MAX_PATH];
54 static bool foundEEPROM = false;
58 sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguarMainROMCRC32);
59 FILE * fp = fopen(eeprom_filename, "rb");
63 fread(eeprom_ram, 1, 128, fp);
65 WriteLog("EEPROM: Loaded from %s\n", eeprom_filename);
69 WriteLog("EEPROM: Could not open file \"%s\"!\n", eeprom_filename);
72 void EepromReset(void)
75 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
80 WriteLog("EEPROM: Done.\n");
83 static void EEPROMSave(void)
85 FILE * fp = fopen(eeprom_filename, "wb");
89 WriteLog("EEPROM: Could not create file \"%s!\"\n", eeprom_filename);
93 fwrite(eeprom_ram, 1, 128, fp);
97 uint8 EepromReadByte(uint32 offset)
102 return eeprom_get_do();
108 // default: WriteLog("EEPROM: unmapped 0x%.8x\n", offset); break;
114 uint16 EepromReadWord(uint32 offset)
116 return ((uint16)EepromReadByte(offset + 0) << 8) | EepromReadByte(offset + 1);
119 void EepromWriteByte(uint32 offset, uint8 data)
126 eeprom_set_di(data & 0x01);
131 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
135 void EepromWriteWord(uint32 offset, uint16 data)
137 EepromWriteByte(offset + 0, (data >> 8) & 0xFF);
138 EepromWriteByte(offset + 1, data & 0xFF);
141 static void eeprom_set_di(uint32 data)
143 // WriteLog("eeprom: di=%i\n",data);
144 // WriteLog("eeprom: state %i\n",jerry_ee_state);
145 switch (jerry_ee_state)
148 jerry_ee_state = EE_STATE_OP_A;
151 jerry_ee_op = (data << 1);
152 jerry_ee_state = EE_STATE_OP_B;
156 jerry_ee_direct_jump = 0;
157 // WriteLog("eeprom: opcode %i\n",jerry_ee_op);
160 case 0: jerry_ee_state = EE_STATE_0; break;
161 case 1: jerry_ee_state = EE_STATE_1; break;
162 case 2: jerry_ee_state = EE_STATE_2; break;
163 case 3: jerry_ee_state = EE_STATE_3; break;
168 jerry_ee_rstate = EE_STATE_0_0;
169 jerry_ee_state = EE_READ_ADDRESS;
170 jerry_ee_direct_jump = 1;
171 jerry_ee_address_cnt = 6;
172 jerry_ee_address_data = 0;
175 switch ((jerry_ee_address_data >> 4) & 0x03)
177 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
178 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
179 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
180 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
186 // WriteLog("eeprom: read only\n");
187 jerry_writes_enabled = 0;
188 jerry_ee_state = EE_STATE_START;
192 jerry_ee_rstate = EE_STATE_0_0_1_0;
193 jerry_ee_state = EE_READ_DATA;
194 jerry_ee_data_cnt = 16;
196 jerry_ee_direct_jump = 1;
198 case EE_STATE_0_0_1_0:
199 // WriteLog("eeprom: filling eeprom with 0x%.4x\n",data);
200 if (jerry_writes_enabled)
201 for(int i=0; i<64; i++)
202 eeprom_ram[i] = jerry_ee_data;
203 EEPROMSave(); // Save it NOW!
205 // WriteLog("eeprom: not writing because read only\n");
206 jerry_ee_state = EE_STATE_BUSY;
210 //WriteLog("eeprom: erasing eeprom\n");
211 if (jerry_writes_enabled)
212 for(int i=0; i<64; i++)
213 eeprom_ram[i] = 0xFFFF;
215 jerry_ee_state = EE_STATE_BUSY;
219 //WriteLog("eeprom: read/write\n");
220 jerry_writes_enabled = 1;
221 jerry_ee_state = EE_STATE_START;
224 jerry_ee_rstate = EE_STATE_1_0;
225 jerry_ee_state = EE_READ_ADDRESS;
226 jerry_ee_address_cnt = 6;
227 jerry_ee_address_data = 0;
228 jerry_ee_direct_jump = 1;
231 jerry_ee_rstate = EE_STATE_1_1;
232 jerry_ee_state = EE_READ_DATA;
233 jerry_ee_data_cnt = 16;
235 jerry_ee_direct_jump = 1;
238 //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
239 if (jerry_writes_enabled)
240 eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
241 EEPROMSave(); // Save it NOW!
242 jerry_ee_state = EE_STATE_BUSY;
245 jerry_ee_rstate = EE_STATE_2_0;
246 jerry_ee_state = EE_READ_ADDRESS;
247 jerry_ee_address_cnt = 6;
248 jerry_ee_address_data = 0;
249 jerry_ee_data_cnt = 16;
253 jerry_ee_rstate = EE_STATE_3_0;
254 jerry_ee_state = EE_READ_ADDRESS;
255 jerry_ee_address_cnt = 6;
256 jerry_ee_address_data = 0;
257 jerry_ee_direct_jump = 1;
260 //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
261 if (jerry_writes_enabled)
262 eeprom_ram[jerry_ee_address_data] = 0xFFFF;
263 jerry_ee_state = EE_STATE_BUSY;
266 //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
268 jerry_ee_data |= data;
270 if (!jerry_ee_data_cnt)
272 jerry_ee_state = jerry_ee_rstate;
273 if (jerry_ee_direct_jump)
277 case EE_READ_ADDRESS:
278 jerry_ee_address_data <<= 1;
279 jerry_ee_address_data |= data;
280 jerry_ee_address_cnt--;
281 // WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
282 if (!jerry_ee_address_cnt)
284 jerry_ee_state = jerry_ee_rstate;
285 //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
286 if (jerry_ee_direct_jump)
291 jerry_ee_state = EE_STATE_OP_A;
295 static void eeprom_set_cs(uint32 state)
297 // WriteLog("eeprom: cs=%i\n",state);
298 jerry_ee_state = EE_STATE_START;
301 jerry_ee_address_data = 0;
302 jerry_ee_address_cnt = 6;
304 jerry_ee_data_cnt = 16;
305 jerry_writes_enabled = 1;
308 static uint32 eeprom_get_do(void)
312 switch (jerry_ee_state)
318 jerry_ee_state = EE_STATE_START;
323 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
324 if (!jerry_ee_data_cnt)
326 //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());
327 jerry_ee_state = EE_STATE_START;
332 // WriteLog("eeprom: do=%i\n",data);