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