5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups/enhancements by James L. Hammons
11 #include <string.h> // For memset
19 static uint16 eeprom_ram[64];
22 // Private function prototypes
25 void EEPROMSave(void);
26 void eeprom_set_di(uint32 state);
27 void eeprom_set_cs(uint32 state);
28 uint32 eeprom_get_do(void);
30 enum { EE_STATE_START = 1, EE_STATE_OP_A, EE_STATE_OP_B, EE_STATE_0, EE_STATE_1,
31 EE_STATE_2, EE_STATE_3, EE_STATE_0_0, EE_READ_ADDRESS, EE_STATE_0_0_0,
32 EE_STATE_0_0_1, EE_STATE_0_0_2, EE_STATE_0_0_3, EE_STATE_0_0_1_0, EE_READ_DATA,
33 EE_STATE_BUSY, EE_STATE_1_0, EE_STATE_1_1, EE_STATE_2_0, EE_STATE_3_0 };
35 // Local global variables
37 uint16 jerry_ee_state = EE_STATE_START;
38 uint16 jerry_ee_op = 0;
39 uint16 jerry_ee_rstate = 0;
40 uint16 jerry_ee_address_data = 0;
41 uint16 jerry_ee_address_cnt = 6;
42 uint16 jerry_ee_data = 0;
43 uint16 jerry_ee_data_cnt = 16;
44 uint16 jerry_writes_enabled = 0;
45 uint16 jerry_ee_direct_jump = 0;
46 static char eeprom_filename[MAX_PATH];
47 static bool foundEEPROM = false;
49 void eeprom_init(void)
51 sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguar_mainRom_crc32);
52 FILE * jerry_ee_fp = fopen(eeprom_filename, "rb");
55 fread(eeprom_ram, 1, 128, jerry_ee_fp);
57 WriteLog("EEPROM: Loaded from %s\n", eeprom_filename);
61 WriteLog("EEPROM: Could not open file \"%s\"!\n", eeprom_filename);
64 void eeprom_reset(void)
67 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
70 void eeprom_done(void)
76 FILE * jerry_ee_fp = fopen(eeprom_filename, "wb");
78 if (jerry_ee_fp == NULL)
80 WriteLog("EEPROM: Could not create file \"%s!\"\n", eeprom_filename);
84 fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
88 uint8 eeprom_byte_read(uint32 offset)
93 return eeprom_get_do();
99 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
105 uint16 eeprom_word_read(uint32 offset)
107 return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
110 void eeprom_byte_write(uint32 offset, uint8 data)
117 eeprom_set_di(data & 0x01);
122 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
126 void eeprom_word_write(uint32 offset, uint16 data)
128 eeprom_byte_write(offset+0, (data >> 8) & 0xFF);
129 eeprom_byte_write(offset+1, data & 0xFF);
132 void eeprom_set_di(uint32 data)
134 // WriteLog("eeprom: di=%i\n",data);
135 // WriteLog("eeprom: state %i\n",jerry_ee_state);
136 switch (jerry_ee_state)
139 jerry_ee_state = EE_STATE_OP_A;
142 jerry_ee_op = (data << 1);
143 jerry_ee_state = EE_STATE_OP_B;
147 jerry_ee_direct_jump = 0;
148 // WriteLog("eeprom: opcode %i\n",jerry_ee_op);
151 case 0: jerry_ee_state = EE_STATE_0; break;
152 case 1: jerry_ee_state = EE_STATE_1; break;
153 case 2: jerry_ee_state = EE_STATE_2; break;
154 case 3: jerry_ee_state = EE_STATE_3; break;
159 jerry_ee_rstate = EE_STATE_0_0;
160 jerry_ee_state = EE_READ_ADDRESS;
161 jerry_ee_direct_jump = 1;
162 jerry_ee_address_cnt = 6;
163 jerry_ee_address_data = 0;
166 switch ((jerry_ee_address_data >> 4) & 0x03)
168 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
169 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
170 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
171 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
177 // WriteLog("eeprom: read only\n");
178 jerry_writes_enabled = 0;
179 jerry_ee_state = EE_STATE_START;
183 jerry_ee_rstate = EE_STATE_0_0_1_0;
184 jerry_ee_state = EE_READ_DATA;
185 jerry_ee_data_cnt = 16;
187 jerry_ee_direct_jump = 1;
189 case EE_STATE_0_0_1_0:
190 // WriteLog("eeprom: filling eeprom with 0x%.4x\n",data);
191 if (jerry_writes_enabled)
192 for(int i=0; i<64; i++)
193 eeprom_ram[i] = jerry_ee_data;
194 EEPROMSave(); // Save it NOW!
196 // WriteLog("eeprom: not writing because read only\n");
197 jerry_ee_state = EE_STATE_BUSY;
201 //WriteLog("eeprom: erasing eeprom\n");
202 if (jerry_writes_enabled)
203 for(int i=0; i<64; i++)
204 eeprom_ram[i] = 0xFFFF;
206 jerry_ee_state = EE_STATE_BUSY;
210 //WriteLog("eeprom: read/write\n");
211 jerry_writes_enabled = 1;
212 jerry_ee_state = EE_STATE_START;
215 jerry_ee_rstate = EE_STATE_1_0;
216 jerry_ee_state = EE_READ_ADDRESS;
217 jerry_ee_address_cnt = 6;
218 jerry_ee_address_data = 0;
219 jerry_ee_direct_jump = 1;
222 jerry_ee_rstate = EE_STATE_1_1;
223 jerry_ee_state = EE_READ_DATA;
224 jerry_ee_data_cnt = 16;
226 jerry_ee_direct_jump = 1;
229 //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
230 if (jerry_writes_enabled)
231 eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
232 EEPROMSave(); // Save it NOW!
233 jerry_ee_state = EE_STATE_BUSY;
236 jerry_ee_rstate = EE_STATE_2_0;
237 jerry_ee_state = EE_READ_ADDRESS;
238 jerry_ee_address_cnt = 6;
239 jerry_ee_address_data = 0;
240 jerry_ee_data_cnt = 16;
244 jerry_ee_rstate = EE_STATE_3_0;
245 jerry_ee_state = EE_READ_ADDRESS;
246 jerry_ee_address_cnt = 6;
247 jerry_ee_address_data = 0;
248 jerry_ee_direct_jump = 1;
251 //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
252 if (jerry_writes_enabled)
253 eeprom_ram[jerry_ee_address_data] = 0xFFFF;
254 jerry_ee_state = EE_STATE_BUSY;
257 //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
259 jerry_ee_data |= data;
261 if (!jerry_ee_data_cnt)
263 jerry_ee_state = jerry_ee_rstate;
264 if (jerry_ee_direct_jump)
268 case EE_READ_ADDRESS:
269 jerry_ee_address_data <<= 1;
270 jerry_ee_address_data |= data;
271 jerry_ee_address_cnt--;
272 // WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
273 if (!jerry_ee_address_cnt)
275 jerry_ee_state = jerry_ee_rstate;
276 //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
277 if (jerry_ee_direct_jump)
282 jerry_ee_state = EE_STATE_OP_A;
286 void eeprom_set_cs(uint32 state)
288 // WriteLog("eeprom: cs=%i\n",state);
289 jerry_ee_state = EE_STATE_START;
292 jerry_ee_address_data = 0;
293 jerry_ee_address_cnt = 6;
295 jerry_ee_data_cnt = 16;
296 jerry_writes_enabled = 1;
299 uint32 eeprom_get_do(void)
303 switch (jerry_ee_state)
309 jerry_ee_state = EE_STATE_START;
314 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
315 if (!jerry_ee_data_cnt)
317 //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());
318 jerry_ee_state = EE_STATE_START;
323 // WriteLog("eeprom: do=%i\n",data);