5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups by James L. Hammons
13 static uint16 eeprom_ram[64];
16 // Private function prototypes
19 void EEPROMSave(void);
20 void eeprom_set_di(uint32 state);
21 void eeprom_set_cs(uint32 state);
22 uint32 eeprom_get_do(void);
24 #define EE_STATE_START 1
25 #define EE_STATE_OP_A 2
26 #define EE_STATE_OP_B 3
31 #define EE_STATE_0_0 8
32 #define EE_READ_ADDRESS 9
33 #define EE_STATE_0_0_0 10
34 #define EE_STATE_0_0_1 11
35 #define EE_STATE_0_0_2 12
36 #define EE_STATE_0_0_3 13
37 #define EE_STATE_0_0_1_0 14
38 #define EE_READ_DATA 15
39 #define EE_STATE_BUSY 16
40 #define EE_STATE_1_0 17
41 #define EE_STATE_1_1 18
42 #define EE_STATE_2_0 19
43 #define EE_STATE_3_0 20
45 // External global variables
47 extern char jaguar_boot_dir[1024];
49 // Local global variables
51 uint16 jerry_ee_state = EE_STATE_START;
52 uint16 jerry_ee_op = 0;
53 uint16 jerry_ee_rstate = 0;
54 uint16 jerry_ee_address_data = 0;
55 uint16 jerry_ee_address_cnt = 6;
56 uint16 jerry_ee_data = 0;
57 uint16 jerry_ee_data_cnt = 16;
58 uint16 jerry_writes_enabled = 0;
59 uint16 jerry_ee_direct_jump = 0;
61 static char eeprom_filename[1024];
62 static bool foundEEPROM = false;
64 void eeprom_init(void)
66 sprintf(eeprom_filename, "%s/%s%08X.eep", jaguar_boot_dir, jaguar_eeproms_path, (unsigned int)jaguar_mainRom_crc32);
67 jerry_ee_fp = fopen(eeprom_filename, "rb");
70 fread(eeprom_ram, 1, 128, jerry_ee_fp);
72 WriteLog("EEPROM: Loaded from %s\n", eeprom_filename);
77 WriteLog("EEPROM: Creating %s\n", eeprom_filename);
78 jerry_ee_fp = fopen(eeprom_filename, "wb");
79 if (jerry_ee_fp == NULL)
80 WriteLog("EEPROM: Could not open/create %s\n", eeprom_filename);
84 void eeprom_reset(void)
87 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
90 void eeprom_done(void)
92 //Actually, is this necessary now that we write the file immediately?
98 jerry_ee_fp = fopen(eeprom_filename, "wb");
99 fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
103 uint8 eeprom_byte_read(uint32 offset)
108 return eeprom_get_do();
114 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
120 uint16 eeprom_word_read(uint32 offset)
122 return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
125 void eeprom_byte_write(uint32 offset, uint8 data)
132 eeprom_set_di(data & 0x01);
137 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
141 void eeprom_word_write(uint32 offset, uint16 data)
143 eeprom_byte_write(offset+0, (data >> 8) & 0xFF);
144 eeprom_byte_write(offset+1, data & 0xFF);
147 void eeprom_set_di(uint32 data)
149 // WriteLog("eeprom: di=%i\n",data);
150 // WriteLog("eeprom: state %i\n",jerry_ee_state);
151 switch (jerry_ee_state)
154 jerry_ee_state = EE_STATE_OP_A;
157 jerry_ee_op = (data << 1);
158 jerry_ee_state = EE_STATE_OP_B;
162 jerry_ee_direct_jump = 0;
163 // WriteLog("eeprom: opcode %i\n",jerry_ee_op);
166 case 0: jerry_ee_state = EE_STATE_0; break;
167 case 1: jerry_ee_state = EE_STATE_1; break;
168 case 2: jerry_ee_state = EE_STATE_2; break;
169 case 3: jerry_ee_state = EE_STATE_3; break;
174 jerry_ee_rstate = EE_STATE_0_0;
175 jerry_ee_state = EE_READ_ADDRESS;
176 jerry_ee_direct_jump = 1;
177 jerry_ee_address_cnt = 6;
178 jerry_ee_address_data = 0;
181 switch ((jerry_ee_address_data >> 4) & 0x03)
183 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
184 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
185 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
186 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
192 // WriteLog("eeprom: read only\n");
193 jerry_writes_enabled = 0;
194 jerry_ee_state = EE_STATE_START;
198 jerry_ee_rstate = EE_STATE_0_0_1_0;
199 jerry_ee_state = EE_READ_DATA;
200 jerry_ee_data_cnt = 16;
202 jerry_ee_direct_jump = 1;
204 case EE_STATE_0_0_1_0:
205 // WriteLog("eeprom: filling eeprom with 0x%.4x\n",data);
206 if (jerry_writes_enabled)
207 for(int i=0; i<64; i++)
208 eeprom_ram[i] = jerry_ee_data;
209 EEPROMSave(); // Save it NOW!
211 // WriteLog("eeprom: not writing because read only\n");
212 jerry_ee_state = EE_STATE_BUSY;
216 //WriteLog("eeprom: erasing eeprom\n");
217 if (jerry_writes_enabled)
218 for(int i=0; i<64; i++)
219 eeprom_ram[i] = 0xFFFF;
221 jerry_ee_state=EE_STATE_BUSY;
225 //WriteLog("eeprom: read/write\n");
226 jerry_writes_enabled = 1;
227 jerry_ee_state = EE_STATE_START;
230 jerry_ee_rstate = EE_STATE_1_0;
231 jerry_ee_state = EE_READ_ADDRESS;
232 jerry_ee_address_cnt = 6;
233 jerry_ee_address_data = 0;
234 jerry_ee_direct_jump = 1;
237 jerry_ee_rstate = EE_STATE_1_1;
238 jerry_ee_state = EE_READ_DATA;
239 jerry_ee_data_cnt = 16;
241 jerry_ee_direct_jump = 1;
244 //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
245 if (jerry_writes_enabled)
246 eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
247 EEPROMSave(); // Save it NOW!
248 jerry_ee_state = EE_STATE_BUSY;
251 jerry_ee_rstate = EE_STATE_2_0;
252 jerry_ee_state = EE_READ_ADDRESS;
253 jerry_ee_address_cnt = 6;
254 jerry_ee_address_data = 0;
255 jerry_ee_data_cnt = 16;
259 jerry_ee_rstate = EE_STATE_3_0;
260 jerry_ee_state = EE_READ_ADDRESS;
261 jerry_ee_address_cnt = 6;
262 jerry_ee_address_data = 0;
263 jerry_ee_direct_jump = 1;
266 //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
267 if (jerry_writes_enabled)
268 eeprom_ram[jerry_ee_address_data] = 0xFFFF;
269 jerry_ee_state = EE_STATE_BUSY;
272 //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
274 jerry_ee_data |= data;
276 if (!jerry_ee_data_cnt)
278 jerry_ee_state = jerry_ee_rstate;
279 if (jerry_ee_direct_jump)
283 case EE_READ_ADDRESS:
284 jerry_ee_address_data <<= 1;
285 jerry_ee_address_data |= data;
286 jerry_ee_address_cnt--;
287 // WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
288 if (!jerry_ee_address_cnt)
290 jerry_ee_state = jerry_ee_rstate;
291 //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
292 if (jerry_ee_direct_jump)
297 jerry_ee_state = EE_STATE_OP_A;
301 void eeprom_set_cs(uint32 state)
303 // WriteLog("eeprom: cs=%i\n",state);
304 jerry_ee_state = EE_STATE_START;
307 jerry_ee_address_data = 0;
308 jerry_ee_address_cnt = 6;
310 jerry_ee_data_cnt = 16;
311 jerry_writes_enabled = 1;
314 uint32 eeprom_get_do(void)
318 switch (jerry_ee_state)
324 jerry_ee_state = EE_STATE_START;
329 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
330 if (!jerry_ee_data_cnt)
332 //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());
333 jerry_ee_state = EE_STATE_START;
338 // WriteLog("eeprom: do=%i\n",data);