5 static uint16 eeprom_ram[64];
7 void eeprom_set_di(uint32 state);
8 void eeprom_set_cs(uint32 state);
9 uint32 eeprom_get_do(void);
11 #define EE_STATE_START 1
12 #define EE_STATE_OP_A 2
13 #define EE_STATE_OP_B 3
18 #define EE_STATE_0_0 8
19 #define EE_READ_ADDRESS 9
20 #define EE_STATE_0_0_0 10
21 #define EE_STATE_0_0_1 11
22 #define EE_STATE_0_0_2 12
23 #define EE_STATE_0_0_3 13
24 #define EE_STATE_0_0_1_0 14
25 #define EE_READ_DATA 15
26 #define EE_STATE_BUSY 16
27 #define EE_STATE_1_0 17
28 #define EE_STATE_1_1 18
29 #define EE_STATE_2_0 19
30 #define EE_STATE_3_0 20
32 uint16 jerry_ee_state = EE_STATE_START;
33 uint16 jerry_ee_op = 0;
34 uint16 jerry_ee_rstate = 0;
35 uint16 jerry_ee_address_data = 0;
36 uint16 jerry_ee_address_cnt = 6;
37 uint16 jerry_ee_data = 0;
38 uint16 jerry_ee_data_cnt = 16;
39 uint16 jerry_writes_enabled = 0;
40 uint16 jerry_ee_direct_jump = 0;
42 extern char * jaguar_boot_dir;
44 //////////////////////////////////////////////////////////////////////////////
46 //////////////////////////////////////////////////////////////////////////////
53 //////////////////////////////////////////////////////////////////////////////
54 void eeprom_init(void)
56 static char eeprom_filename[256];
57 sprintf(eeprom_filename,"%s\\%s%.8x.eep",jaguar_boot_dir,jaguar_eeproms_path,jaguar_mainRom_crc32);
58 jerry_ee_fp=fopen(eeprom_filename,"rb");
61 fread(eeprom_ram,1,128,jerry_ee_fp);
63 fprintf(log_get(),"eeprom: loaded from %s\n",eeprom_filename);
64 jerry_ee_fp=fopen(eeprom_filename,"wrb");
68 fprintf(log_get(),"eeprom: creating %s\n",eeprom_filename);
69 jerry_ee_fp=fopen(eeprom_filename,"wb");
70 if (jerry_ee_fp==NULL)
71 fprintf(log_get(),"eeprom: could not open/create %s\n",eeprom_filename);
74 //////////////////////////////////////////////////////////////////////////////
76 //////////////////////////////////////////////////////////////////////////////
83 //////////////////////////////////////////////////////////////////////////////
84 void eeprom_reset(void)
86 if (jerry_ee_fp==NULL)
87 memset(eeprom_ram,0xff,64*2);
89 //////////////////////////////////////////////////////////////////////////////
91 //////////////////////////////////////////////////////////////////////////////
98 //////////////////////////////////////////////////////////////////////////////
99 void eeprom_done(void)
103 fwrite(eeprom_ram,1,128,jerry_ee_fp);
107 fprintf(log_get(),"eeprom: not saved\n");
109 //////////////////////////////////////////////////////////////////////////////
111 //////////////////////////////////////////////////////////////////////////////
118 //////////////////////////////////////////////////////////////////////////////
119 void eeprom_byte_write(uint32 offset, uint8 data)
123 case 0xf14001: break;
124 case 0xf14801: eeprom_set_di(data&0x01); break;
125 case 0xf15001: eeprom_set_cs(1); break;
126 // default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;
129 //////////////////////////////////////////////////////////////////////////////
131 //////////////////////////////////////////////////////////////////////////////
138 //////////////////////////////////////////////////////////////////////////////
139 void eeprom_word_write(uint32 offset, uint16 data)
141 eeprom_byte_write(offset+0,(data>>8)&0xff);
142 eeprom_byte_write(offset+1,(data&0xff));
144 //////////////////////////////////////////////////////////////////////////////
146 //////////////////////////////////////////////////////////////////////////////
153 //////////////////////////////////////////////////////////////////////////////
154 uint8 eeprom_byte_read(uint32 offset)
158 case 0xf14001: return(eeprom_get_do()); break;
159 case 0xf14801: break;
160 case 0xf15001: eeprom_set_cs(1); break;
161 // default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;
165 //////////////////////////////////////////////////////////////////////////////
167 //////////////////////////////////////////////////////////////////////////////
174 //////////////////////////////////////////////////////////////////////////////
175 uint16 eeprom_word_read(uint32 offset)
177 uint16 data=eeprom_byte_read(offset+0);
179 data|=eeprom_byte_read(offset+1);
182 //////////////////////////////////////////////////////////////////////////////
184 //////////////////////////////////////////////////////////////////////////////
191 //////////////////////////////////////////////////////////////////////////////
192 void eeprom_set_di(uint32 data)
194 // fprintf(log_get(),"eeprom: di=%i\n",data);
195 // fprintf(log_get(),"eeprom: state %i\n",jerry_ee_state);
196 switch (jerry_ee_state)
198 case EE_STATE_START: {
199 jerry_ee_state=EE_STATE_OP_A;
202 case EE_STATE_OP_A: {
203 jerry_ee_op=(data<<1);
204 jerry_ee_state=EE_STATE_OP_B;
207 case EE_STATE_OP_B: {
209 jerry_ee_direct_jump=0;
210 // fprintf(log_get(),"eeprom: opcode %i\n",jerry_ee_op);
213 case 0: jerry_ee_state=EE_STATE_0; break;
214 case 1: jerry_ee_state=EE_STATE_1; break;
215 case 2: jerry_ee_state=EE_STATE_2; break;
216 case 3: jerry_ee_state=EE_STATE_3; break;
222 jerry_ee_rstate=EE_STATE_0_0;
223 jerry_ee_state=EE_READ_ADDRESS;
224 jerry_ee_direct_jump=1;
225 jerry_ee_address_cnt=6;
226 jerry_ee_address_data=0;
230 switch ((jerry_ee_address_data>>4)&0x03)
232 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
233 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
234 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
235 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
240 case EE_STATE_0_0_0:{
242 // fprintf(log_get(),"eeprom: read only\n");
243 jerry_writes_enabled=0;
244 jerry_ee_state=EE_STATE_START;
247 case EE_STATE_0_0_1:{
249 jerry_ee_rstate=EE_STATE_0_0_1_0;
250 jerry_ee_state=EE_READ_DATA;
251 jerry_ee_data_cnt=16;
253 jerry_ee_direct_jump=1;
256 case EE_STATE_0_0_1_0:{
257 // fprintf(log_get(),"eeprom: filling eeprom with 0x%.4x\n",data);
258 if (jerry_writes_enabled)
260 for (int i=0;i<64;i++)
261 eeprom_ram[i]=jerry_ee_data;
264 // fprintf(log_get(),"eeprom: not writing because read only\n");
265 jerry_ee_state=EE_STATE_BUSY;
268 case EE_STATE_0_0_2:{
270 //fprintf(log_get(),"eeprom: erasing eeprom\n");
271 if (jerry_writes_enabled)
273 for (int i=0;i<64;i++)
274 eeprom_ram[i]=0xffff;
276 jerry_ee_state=EE_STATE_BUSY;
279 case EE_STATE_0_0_3:{
281 //fprintf(log_get(),"eeprom: read/write\n");
282 jerry_writes_enabled=1;
283 jerry_ee_state=EE_STATE_START;
287 jerry_ee_rstate=EE_STATE_1_0;
288 jerry_ee_state=EE_READ_ADDRESS;
289 jerry_ee_address_cnt=6;
290 jerry_ee_address_data=0;
291 jerry_ee_direct_jump=1;
295 jerry_ee_rstate=EE_STATE_1_1;
296 jerry_ee_state=EE_READ_DATA;
297 jerry_ee_data_cnt=16;
299 jerry_ee_direct_jump=1;
303 //fprintf(log_get(),"eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
304 if (jerry_writes_enabled)
305 eeprom_ram[jerry_ee_address_data]=jerry_ee_data;
306 jerry_ee_state=EE_STATE_BUSY;
310 jerry_ee_rstate=EE_STATE_2_0;
311 jerry_ee_state=EE_READ_ADDRESS;
312 jerry_ee_address_cnt=6;
313 jerry_ee_address_data=0;
314 jerry_ee_data_cnt=16;
319 jerry_ee_rstate=EE_STATE_3_0;
320 jerry_ee_state=EE_READ_ADDRESS;
321 jerry_ee_address_cnt=6;
322 jerry_ee_address_data=0;
323 jerry_ee_direct_jump=1;
327 //fprintf(log_get(),"eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
328 if (jerry_writes_enabled)
329 eeprom_ram[jerry_ee_address_data]=0xffff;
330 jerry_ee_state=EE_STATE_BUSY;
335 //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
339 if (!jerry_ee_data_cnt)
341 jerry_ee_state=jerry_ee_rstate;
342 if (jerry_ee_direct_jump)
347 case EE_READ_ADDRESS:
349 jerry_ee_address_data<<=1;
350 jerry_ee_address_data|=data;
351 jerry_ee_address_cnt--;
352 // fprintf(log_get(),"eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
353 if (!jerry_ee_address_cnt)
355 jerry_ee_state=jerry_ee_rstate;
356 //fprintf(log_get(),"eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
357 if (jerry_ee_direct_jump)
363 jerry_ee_state=EE_STATE_OP_A;
369 //////////////////////////////////////////////////////////////////////////////
371 //////////////////////////////////////////////////////////////////////////////
378 //////////////////////////////////////////////////////////////////////////////
379 void eeprom_set_cs(uint32 state)
381 // fprintf(log_get(),"eeprom: cs=%i\n",state);
382 jerry_ee_state=EE_STATE_START;
385 jerry_ee_address_data=0;
386 jerry_ee_address_cnt=6;
388 jerry_ee_data_cnt=16;
389 jerry_writes_enabled=1;
391 //////////////////////////////////////////////////////////////////////////////
393 //////////////////////////////////////////////////////////////////////////////
400 //////////////////////////////////////////////////////////////////////////////
401 uint32 eeprom_get_do(void)
404 switch (jerry_ee_state)
406 case EE_STATE_START: {
410 case EE_STATE_BUSY: {
411 jerry_ee_state=EE_STATE_START;
417 data=((eeprom_ram[jerry_ee_address_data]&(1<<jerry_ee_data_cnt))>>jerry_ee_data_cnt);
418 if (!jerry_ee_data_cnt)
420 //fprintf(log_get(),"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());
421 jerry_ee_state=EE_STATE_START;
426 // fprintf(log_get(),"eeprom: do=%i\n",data);