]> Shamusworld >> Repos - virtualjaguar/blob - src/eeprom.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / eeprom.cpp
1 #include "eeprom.h"\r
2 \r
3 #define eeprom_LOG\r
4 \r
5 static uint16 eeprom_ram[64];\r
6 \r
7 void eeprom_set_di(uint32 state); \r
8 void eeprom_set_cs(uint32 state);\r
9 uint32 eeprom_get_do(void);\r
10 \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
31 \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
41 FILE * jerry_ee_fp;\r
42 extern char * jaguar_boot_dir;\r
43 \r
44 //////////////////////////////////////////////////////////////////////////////\r
45 //\r
46 //////////////////////////////////////////////////////////////////////////////\r
47 //\r
48 //\r
49 //\r
50 //\r
51 //\r
52 //\r
53 //////////////////////////////////////////////////////////////////////////////\r
54 void eeprom_init(void)\r
55 {\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
59         if (jerry_ee_fp)\r
60         {\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
65         }\r
66         else\r
67         {\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
72         }\r
73 }\r
74 //////////////////////////////////////////////////////////////////////////////\r
75 //\r
76 //////////////////////////////////////////////////////////////////////////////\r
77 //\r
78 //\r
79 //\r
80 //\r
81 //\r
82 //\r
83 //////////////////////////////////////////////////////////////////////////////\r
84 void eeprom_reset(void)\r
85 {\r
86         if (jerry_ee_fp==NULL)\r
87                 memset(eeprom_ram,0xff,64*2);\r
88 }\r
89 //////////////////////////////////////////////////////////////////////////////\r
90 //\r
91 //////////////////////////////////////////////////////////////////////////////\r
92 //\r
93 //\r
94 //\r
95 //\r
96 //\r
97 //\r
98 //////////////////////////////////////////////////////////////////////////////\r
99 void eeprom_done(void)\r
100 {\r
101         if (jerry_ee_fp)\r
102         {\r
103                 fwrite(eeprom_ram,1,128,jerry_ee_fp);\r
104                 fclose(jerry_ee_fp);\r
105         }\r
106         else\r
107                 fprintf(log_get(),"eeprom: not saved\n");\r
108 }\r
109 //////////////////////////////////////////////////////////////////////////////\r
110 //\r
111 //////////////////////////////////////////////////////////////////////////////\r
112 //\r
113 //\r
114 //\r
115 //\r
116 //\r
117 //\r
118 //////////////////////////////////////////////////////////////////////////////\r
119 void eeprom_byte_write(uint32 offset, uint8 data)\r
120 {\r
121         switch (offset)\r
122         {\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
127         }\r
128 }\r
129 //////////////////////////////////////////////////////////////////////////////\r
130 //\r
131 //////////////////////////////////////////////////////////////////////////////\r
132 //\r
133 //\r
134 //\r
135 //\r
136 //\r
137 //\r
138 //////////////////////////////////////////////////////////////////////////////\r
139 void eeprom_word_write(uint32 offset, uint16 data)\r
140 {\r
141         eeprom_byte_write(offset+0,(data>>8)&0xff);\r
142         eeprom_byte_write(offset+1,(data&0xff));\r
143 }\r
144 //////////////////////////////////////////////////////////////////////////////\r
145 //\r
146 //////////////////////////////////////////////////////////////////////////////\r
147 //\r
148 //\r
149 //\r
150 //\r
151 //\r
152 //\r
153 //////////////////////////////////////////////////////////////////////////////\r
154 uint8 eeprom_byte_read(uint32 offset)\r
155 {\r
156         switch (offset)\r
157         {\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
162         }\r
163         return(0x00);\r
164 }\r
165 //////////////////////////////////////////////////////////////////////////////\r
166 //\r
167 //////////////////////////////////////////////////////////////////////////////\r
168 //\r
169 //\r
170 //\r
171 //\r
172 //\r
173 //\r
174 //////////////////////////////////////////////////////////////////////////////\r
175 uint16 eeprom_word_read(uint32 offset)\r
176 {\r
177         uint16 data=eeprom_byte_read(offset+0);\r
178         data<<=8;\r
179         data|=eeprom_byte_read(offset+1);\r
180         return(data);\r
181 }\r
182 //////////////////////////////////////////////////////////////////////////////\r
183 //\r
184 //////////////////////////////////////////////////////////////////////////////\r
185 //\r
186 //\r
187 //\r
188 //\r
189 //\r
190 //\r
191 //////////////////////////////////////////////////////////////////////////////\r
192 void eeprom_set_di(uint32 data)\r
193 {\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
197         {\r
198         case EE_STATE_START: { \r
199                                                         jerry_ee_state=EE_STATE_OP_A; \r
200                                                         break;\r
201                                                  }\r
202         case EE_STATE_OP_A:  { \r
203                                                         jerry_ee_op=(data<<1); \r
204                                                         jerry_ee_state=EE_STATE_OP_B; \r
205                                                         break;\r
206                                                  }\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
212                                                         {\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
217                                                         }\r
218                                                         eeprom_set_di(data);\r
219                                                         break;\r
220                                                  }\r
221         case EE_STATE_0:        {\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
227                                                         break;\r
228                                                 }\r
229         case EE_STATE_0_0:      {\r
230                                                         switch ((jerry_ee_address_data>>4)&0x03)\r
231                                                         {\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
236                                                         }\r
237                                                         eeprom_set_di(data);\r
238                                                         break;\r
239                                                 }\r
240         case EE_STATE_0_0_0:{\r
241                                                         // writes disable\r
242                                                         // fprintf(log_get(),"eeprom: read only\n");\r
243                                                         jerry_writes_enabled=0;\r
244                                                         jerry_ee_state=EE_STATE_START;\r
245                                                         break;\r
246                                                 }\r
247         case EE_STATE_0_0_1:{\r
248                                                         // writes all\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
252                                                         jerry_ee_data=0;\r
253                                                         jerry_ee_direct_jump=1;\r
254                                                         break;\r
255                                                 }\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
259                                                         {\r
260                                                                 for (int i=0;i<64;i++)\r
261                                                                         eeprom_ram[i]=jerry_ee_data;\r
262                                                         }\r
263                                                         //else \r
264                                                         //      fprintf(log_get(),"eeprom: not writing because read only\n");\r
265                                                         jerry_ee_state=EE_STATE_BUSY;\r
266                                                         break;\r
267                                                   }\r
268         case EE_STATE_0_0_2:{\r
269                                                         // erase all\r
270                                                         //fprintf(log_get(),"eeprom: erasing eeprom\n");\r
271                                                         if (jerry_writes_enabled)\r
272                                                         {\r
273                                                                 for (int i=0;i<64;i++)\r
274                                                                         eeprom_ram[i]=0xffff;\r
275                                                         }\r
276                                                         jerry_ee_state=EE_STATE_BUSY;\r
277                                                         break;\r
278                                                 }\r
279         case EE_STATE_0_0_3:{\r
280                                                         // writes enable\r
281                                                         //fprintf(log_get(),"eeprom: read/write\n");\r
282                                                         jerry_writes_enabled=1;\r
283                                                         jerry_ee_state=EE_STATE_START;\r
284                                                         break;\r
285                                                 }\r
286         case EE_STATE_1:        {\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
292                                                         break;\r
293                                                 }\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
298                                                         jerry_ee_data=0;\r
299                                                         jerry_ee_direct_jump=1;\r
300                                                         break;\r
301                                                 }\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
307                                                         break;\r
308                                                 }\r
309         case EE_STATE_2:        {\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
315                                                         jerry_ee_data=0;\r
316                                                         break;\r
317                                                 }\r
318         case EE_STATE_3:        {\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
324                                                         break;\r
325                                                 }\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
331                                                         break;\r
332                                                 }\r
333         case EE_READ_DATA: \r
334                                                 {\r
335                                                         //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);\r
336                                                         jerry_ee_data<<=1;\r
337                                                         jerry_ee_data|=data;\r
338                                                         jerry_ee_data_cnt--;\r
339                                                         if (!jerry_ee_data_cnt)\r
340                                                         {\r
341                                                                 jerry_ee_state=jerry_ee_rstate;\r
342                                                                 if (jerry_ee_direct_jump)\r
343                                                                         eeprom_set_di(data);\r
344                                                         }\r
345                                                         break;\r
346                                                 }\r
347         case EE_READ_ADDRESS: \r
348                                                 {\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
354                                                         {\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
359                                                         }\r
360                                                         break;\r
361                                                 }\r
362         default:                        { \r
363                                                         jerry_ee_state=EE_STATE_OP_A; \r
364                                                         break;\r
365                                                  }\r
366                                                 \r
367         }\r
368 }\r
369 //////////////////////////////////////////////////////////////////////////////\r
370 //\r
371 //////////////////////////////////////////////////////////////////////////////\r
372 //\r
373 //\r
374 //\r
375 //\r
376 //\r
377 //\r
378 //////////////////////////////////////////////////////////////////////////////\r
379 void eeprom_set_cs(uint32 state)\r
380 {\r
381 //      fprintf(log_get(),"eeprom: cs=%i\n",state);\r
382         jerry_ee_state=EE_STATE_START;\r
383         jerry_ee_op=0;\r
384         jerry_ee_rstate=0;\r
385         jerry_ee_address_data=0;\r
386         jerry_ee_address_cnt=6;\r
387         jerry_ee_data=0;\r
388         jerry_ee_data_cnt=16;\r
389         jerry_writes_enabled=1;\r
390 }\r
391 //////////////////////////////////////////////////////////////////////////////\r
392 //\r
393 //////////////////////////////////////////////////////////////////////////////\r
394 //\r
395 //\r
396 //\r
397 //\r
398 //\r
399 //\r
400 //////////////////////////////////////////////////////////////////////////////\r
401 uint32 eeprom_get_do(void)\r
402 {\r
403         uint16 data=1;\r
404         switch (jerry_ee_state)\r
405         {\r
406         case EE_STATE_START: {\r
407                                                         data=1;\r
408                                                         break;\r
409                                                  }\r
410         case EE_STATE_BUSY: {\r
411                                                         jerry_ee_state=EE_STATE_START;\r
412                                                         data=0;\r
413                                                         break;\r
414                                                  }\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
419                                                         {\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
422                                                         }\r
423                                                         break;\r
424                                                 }\r
425         }\r
426 //      fprintf(log_get(),"eeprom: do=%i\n",data);\r
427         return(data);\r
428 }\r