5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups/enhancements by James L. Hammons
15 static uint16 eeprom_ram[64];
18 // Private function prototypes
21 void EEPROMSave(void);
22 void eeprom_set_di(uint32 state);
23 void eeprom_set_cs(uint32 state);
24 uint32 eeprom_get_do(void);
26 enum { EE_STATE_START = 1, EE_STATE_OP_A, EE_STATE_OP_B, EE_STATE_0, EE_STATE_1,
27 EE_STATE_2, EE_STATE_3, EE_STATE_0_0, EE_READ_ADDRESS, EE_STATE_0_0_0,
28 EE_STATE_0_0_1, EE_STATE_0_0_2, EE_STATE_0_0_3, EE_STATE_0_0_1_0, EE_READ_DATA,
29 EE_STATE_BUSY, EE_STATE_1_0, EE_STATE_1_1, EE_STATE_2_0, EE_STATE_3_0 };
31 // Local global variables
33 uint16 jerry_ee_state = EE_STATE_START;
34 uint16 jerry_ee_op = 0;
35 uint16 jerry_ee_rstate = 0;
36 uint16 jerry_ee_address_data = 0;
37 uint16 jerry_ee_address_cnt = 6;
38 uint16 jerry_ee_data = 0;
39 uint16 jerry_ee_data_cnt = 16;
40 uint16 jerry_writes_enabled = 0;
41 uint16 jerry_ee_direct_jump = 0;
43 static char eeprom_filename[MAX_PATH];
44 static bool foundEEPROM = false;
46 void eeprom_init(void)
48 sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguar_mainRom_crc32);
49 jerry_ee_fp = fopen(eeprom_filename, "rb");
52 fread(eeprom_ram, 1, 128, jerry_ee_fp);
54 WriteLog("EEPROM: Loaded from %s\n", eeprom_filename);
59 WriteLog("EEPROM: Creating %s\n", eeprom_filename);
60 jerry_ee_fp = fopen(eeprom_filename, "wb");
61 if (jerry_ee_fp == NULL)
62 WriteLog("EEPROM: Could not open/create %s!\n", eeprom_filename);
66 void eeprom_reset(void)
69 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
72 void eeprom_done(void)
74 //Actually, is this necessary now that we write the file immediately upon write to EEPROM?
80 jerry_ee_fp = fopen(eeprom_filename, "wb");
81 fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
85 uint8 eeprom_byte_read(uint32 offset)
90 return eeprom_get_do();
96 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
102 uint16 eeprom_word_read(uint32 offset)
104 return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
107 void eeprom_byte_write(uint32 offset, uint8 data)
114 eeprom_set_di(data & 0x01);
119 // default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
123 void eeprom_word_write(uint32 offset, uint16 data)
125 eeprom_byte_write(offset+0, (data >> 8) & 0xFF);
126 eeprom_byte_write(offset+1, data & 0xFF);
129 void eeprom_set_di(uint32 data)
131 // WriteLog("eeprom: di=%i\n",data);
132 // WriteLog("eeprom: state %i\n",jerry_ee_state);
133 switch (jerry_ee_state)
136 jerry_ee_state = EE_STATE_OP_A;
139 jerry_ee_op = (data << 1);
140 jerry_ee_state = EE_STATE_OP_B;
144 jerry_ee_direct_jump = 0;
145 // WriteLog("eeprom: opcode %i\n",jerry_ee_op);
148 case 0: jerry_ee_state = EE_STATE_0; break;
149 case 1: jerry_ee_state = EE_STATE_1; break;
150 case 2: jerry_ee_state = EE_STATE_2; break;
151 case 3: jerry_ee_state = EE_STATE_3; break;
156 jerry_ee_rstate = EE_STATE_0_0;
157 jerry_ee_state = EE_READ_ADDRESS;
158 jerry_ee_direct_jump = 1;
159 jerry_ee_address_cnt = 6;
160 jerry_ee_address_data = 0;
163 switch ((jerry_ee_address_data >> 4) & 0x03)
165 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
166 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
167 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
168 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
174 // WriteLog("eeprom: read only\n");
175 jerry_writes_enabled = 0;
176 jerry_ee_state = EE_STATE_START;
180 jerry_ee_rstate = EE_STATE_0_0_1_0;
181 jerry_ee_state = EE_READ_DATA;
182 jerry_ee_data_cnt = 16;
184 jerry_ee_direct_jump = 1;
186 case EE_STATE_0_0_1_0:
187 // WriteLog("eeprom: filling eeprom with 0x%.4x\n",data);
188 if (jerry_writes_enabled)
189 for(int i=0; i<64; i++)
190 eeprom_ram[i] = jerry_ee_data;
191 EEPROMSave(); // Save it NOW!
193 // WriteLog("eeprom: not writing because read only\n");
194 jerry_ee_state = EE_STATE_BUSY;
198 //WriteLog("eeprom: erasing eeprom\n");
199 if (jerry_writes_enabled)
200 for(int i=0; i<64; i++)
201 eeprom_ram[i] = 0xFFFF;
203 jerry_ee_state = EE_STATE_BUSY;
207 //WriteLog("eeprom: read/write\n");
208 jerry_writes_enabled = 1;
209 jerry_ee_state = EE_STATE_START;
212 jerry_ee_rstate = EE_STATE_1_0;
213 jerry_ee_state = EE_READ_ADDRESS;
214 jerry_ee_address_cnt = 6;
215 jerry_ee_address_data = 0;
216 jerry_ee_direct_jump = 1;
219 jerry_ee_rstate = EE_STATE_1_1;
220 jerry_ee_state = EE_READ_DATA;
221 jerry_ee_data_cnt = 16;
223 jerry_ee_direct_jump = 1;
226 //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
227 if (jerry_writes_enabled)
228 eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
229 EEPROMSave(); // Save it NOW!
230 jerry_ee_state = EE_STATE_BUSY;
233 jerry_ee_rstate = EE_STATE_2_0;
234 jerry_ee_state = EE_READ_ADDRESS;
235 jerry_ee_address_cnt = 6;
236 jerry_ee_address_data = 0;
237 jerry_ee_data_cnt = 16;
241 jerry_ee_rstate = EE_STATE_3_0;
242 jerry_ee_state = EE_READ_ADDRESS;
243 jerry_ee_address_cnt = 6;
244 jerry_ee_address_data = 0;
245 jerry_ee_direct_jump = 1;
248 //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
249 if (jerry_writes_enabled)
250 eeprom_ram[jerry_ee_address_data] = 0xFFFF;
251 jerry_ee_state = EE_STATE_BUSY;
254 //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
256 jerry_ee_data |= data;
258 if (!jerry_ee_data_cnt)
260 jerry_ee_state = jerry_ee_rstate;
261 if (jerry_ee_direct_jump)
265 case EE_READ_ADDRESS:
266 jerry_ee_address_data <<= 1;
267 jerry_ee_address_data |= data;
268 jerry_ee_address_cnt--;
269 // WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
270 if (!jerry_ee_address_cnt)
272 jerry_ee_state = jerry_ee_rstate;
273 //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
274 if (jerry_ee_direct_jump)
279 jerry_ee_state = EE_STATE_OP_A;
283 void eeprom_set_cs(uint32 state)
285 // WriteLog("eeprom: cs=%i\n",state);
286 jerry_ee_state = EE_STATE_START;
289 jerry_ee_address_data = 0;
290 jerry_ee_address_cnt = 6;
292 jerry_ee_data_cnt = 16;
293 jerry_writes_enabled = 1;
296 uint32 eeprom_get_do(void)
300 switch (jerry_ee_state)
306 jerry_ee_state = EE_STATE_START;
311 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
312 if (!jerry_ee_data_cnt)
314 //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());
315 jerry_ee_state = EE_STATE_START;
320 // WriteLog("eeprom: do=%i\n",data);