]> Shamusworld >> Repos - virtualjaguar/blob - src/eeprom.cpp
This commit was generated by cvs2svn to compensate for changes in r8,
[virtualjaguar] / src / eeprom.cpp
1 //
2 // EEPROM handler
3 //
4 // by cal2
5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups by James L. Hammons
7 //
8
9 #include "eeprom.h"
10
11 #define eeprom_LOG
12
13 static uint16 eeprom_ram[64];
14
15 void eeprom_set_di(uint32 state); 
16 void eeprom_set_cs(uint32 state);
17 uint32 eeprom_get_do(void);
18
19 #define EE_STATE_START                  1
20 #define EE_STATE_OP_A                   2
21 #define EE_STATE_OP_B                   3
22 #define EE_STATE_0                              4
23 #define EE_STATE_1                              5
24 #define EE_STATE_2                              6
25 #define EE_STATE_3                              7
26 #define EE_STATE_0_0                    8
27 #define EE_READ_ADDRESS                 9
28 #define EE_STATE_0_0_0                  10
29 #define EE_STATE_0_0_1                  11
30 #define EE_STATE_0_0_2                  12
31 #define EE_STATE_0_0_3                  13
32 #define EE_STATE_0_0_1_0                14
33 #define EE_READ_DATA                    15
34 #define EE_STATE_BUSY                   16
35 #define EE_STATE_1_0                    17
36 #define EE_STATE_1_1                    18
37 #define EE_STATE_2_0                    19
38 #define EE_STATE_3_0                    20
39
40 uint16 jerry_ee_state = EE_STATE_START;
41 uint16 jerry_ee_op = 0;
42 uint16 jerry_ee_rstate = 0;
43 uint16 jerry_ee_address_data = 0;
44 uint16 jerry_ee_address_cnt = 6;
45 uint16 jerry_ee_data = 0;
46 uint16 jerry_ee_data_cnt = 16;
47 uint16 jerry_writes_enabled = 0;
48 uint16 jerry_ee_direct_jump = 0;
49 FILE * jerry_ee_fp;
50 extern char * jaguar_boot_dir;
51
52
53 void eeprom_init(void)
54 {
55         static char eeprom_filename[1024];
56
57         sprintf(eeprom_filename, "%s\\%s%08X.eep", jaguar_boot_dir, jaguar_eeproms_path, (unsigned int)jaguar_mainRom_crc32);
58         jerry_ee_fp = fopen(eeprom_filename, "rb");
59         if (jerry_ee_fp)
60         {
61                 fread(eeprom_ram, 1, 128, jerry_ee_fp);
62                 fclose(jerry_ee_fp);
63                 fprintf(log_get(), "eeprom: loaded from %s\n", eeprom_filename);
64                 jerry_ee_fp = fopen(eeprom_filename, "wrb");
65         }
66         else
67         {
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);
72         }
73 }
74
75 void eeprom_reset(void)
76 {
77         if (jerry_ee_fp == NULL)
78                 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
79 }
80
81 void eeprom_done(void)
82 {
83         if (jerry_ee_fp)
84         {
85                 fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
86                 fclose(jerry_ee_fp);
87         }
88         else
89                 fprintf(log_get(),"eeprom: not saved\n");
90 }
91
92 void eeprom_byte_write(uint32 offset, uint8 data)
93 {
94         switch (offset)
95         {
96         case 0xF14001:
97                 break;
98         case 0xF14801:
99                 eeprom_set_di(data & 0x01);
100                 break;
101         case 0xF15001:
102                 eeprom_set_cs(1);
103                 break;
104 //      default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;
105         }
106 }
107
108 void eeprom_word_write(uint32 offset, uint16 data)
109 {
110         eeprom_byte_write(offset+0, (data >> 8) & 0xFF);
111         eeprom_byte_write(offset+1, data & 0xFF);
112 }
113
114 uint8 eeprom_byte_read(uint32 offset)
115 {
116         switch (offset)
117         {
118         case 0xF14001:
119                 return eeprom_get_do();
120         case 0xF14801:
121                 break;
122         case 0xF15001:
123                 eeprom_set_cs(1);
124                 break;
125 //      default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;
126         }
127
128         return 0x00;
129 }
130
131 uint16 eeprom_word_read(uint32 offset)
132 {
133         return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
134 }
135
136 void eeprom_set_di(uint32 data)
137 {
138 //      fprintf(log_get(),"eeprom: di=%i\n",data);
139 //      fprintf(log_get(),"eeprom: state %i\n",jerry_ee_state);
140         switch (jerry_ee_state)
141         {
142         case EE_STATE_START:
143                 jerry_ee_state = EE_STATE_OP_A;
144                 break;
145         case EE_STATE_OP_A:
146                 jerry_ee_op = (data << 1);
147                 jerry_ee_state = EE_STATE_OP_B;
148                 break;
149         case EE_STATE_OP_B:
150                 jerry_ee_op |= data;
151                 jerry_ee_direct_jump = 0;
152 //              fprintf(log_get(),"eeprom: opcode %i\n",jerry_ee_op);
153                 switch (jerry_ee_op)
154                 {
155                 case 0: jerry_ee_state = EE_STATE_0; break;
156                 case 1: jerry_ee_state = EE_STATE_1; break;
157                 case 2: jerry_ee_state = EE_STATE_2; break;
158                 case 3: jerry_ee_state = EE_STATE_3; break;
159                 }
160                 eeprom_set_di(data);
161                 break;
162         case EE_STATE_0:
163                 jerry_ee_rstate = EE_STATE_0_0;
164                 jerry_ee_state = EE_READ_ADDRESS;
165                 jerry_ee_direct_jump = 1;
166                 jerry_ee_address_cnt = 6;
167                 jerry_ee_address_data = 0;
168                 break;
169         case EE_STATE_0_0:
170                 switch ((jerry_ee_address_data >> 4) & 0x03)
171                 {
172                 case 0: jerry_ee_state=EE_STATE_0_0_0; break;
173                 case 1: jerry_ee_state=EE_STATE_0_0_1; break;
174                 case 2: jerry_ee_state=EE_STATE_0_0_2; break;
175                 case 3: jerry_ee_state=EE_STATE_0_0_3; break;
176                 }
177                 eeprom_set_di(data);
178                 break;
179         case EE_STATE_0_0_0:
180                 // writes disable
181                 // fprintf(log_get(),"eeprom: read only\n");
182                 jerry_writes_enabled = 0;
183                 jerry_ee_state = EE_STATE_START;
184                 break;
185         case EE_STATE_0_0_1:
186                 // writes all
187                 jerry_ee_rstate = EE_STATE_0_0_1_0;
188                 jerry_ee_state = EE_READ_DATA;
189                 jerry_ee_data_cnt = 16;
190                 jerry_ee_data = 0;
191                 jerry_ee_direct_jump = 1;
192                 break;
193         case EE_STATE_0_0_1_0:
194                 // fprintf(log_get(),"eeprom: filling eeprom with 0x%.4x\n",data);
195                 if (jerry_writes_enabled)
196                         for(int i=0; i<64; i++)
197                                 eeprom_ram[i] = jerry_ee_data;
198                 //else 
199                 //      fprintf(log_get(),"eeprom: not writing because read only\n");
200                 jerry_ee_state = EE_STATE_BUSY;
201                 break;
202         case EE_STATE_0_0_2:
203                 // erase all
204                 //fprintf(log_get(),"eeprom: erasing eeprom\n");
205                 if (jerry_writes_enabled)
206                         for(int i=0; i<64; i++)
207                                 eeprom_ram[i] = 0xFFFF;
208
209                 jerry_ee_state=EE_STATE_BUSY;
210                 break;
211         case EE_STATE_0_0_3:
212                 // writes enable
213                 //fprintf(log_get(),"eeprom: read/write\n");
214                 jerry_writes_enabled = 1;
215                 jerry_ee_state = EE_STATE_START;
216                 break;
217         case EE_STATE_1:
218                 jerry_ee_rstate = EE_STATE_1_0;
219                 jerry_ee_state = EE_READ_ADDRESS;
220                 jerry_ee_address_cnt = 6;
221                 jerry_ee_address_data = 0;
222                 jerry_ee_direct_jump = 1;
223                 break;
224         case EE_STATE_1_0:
225                 jerry_ee_rstate = EE_STATE_1_1;
226                 jerry_ee_state = EE_READ_DATA;
227                 jerry_ee_data_cnt = 16;
228                 jerry_ee_data = 0;
229                 jerry_ee_direct_jump = 1;
230                 break;
231         case EE_STATE_1_1:
232                 //fprintf(log_get(),"eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
233                 if (jerry_writes_enabled)
234                         eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
235                 jerry_ee_state = EE_STATE_BUSY;
236                 break;
237         case EE_STATE_2:
238                 jerry_ee_rstate = EE_STATE_2_0;
239                 jerry_ee_state = EE_READ_ADDRESS;
240                 jerry_ee_address_cnt = 6;
241                 jerry_ee_address_data = 0;
242                 jerry_ee_data_cnt = 16;
243                 jerry_ee_data = 0;
244                 break;
245         case EE_STATE_3:
246                 jerry_ee_rstate = EE_STATE_3_0;
247                 jerry_ee_state = EE_READ_ADDRESS;
248                 jerry_ee_address_cnt = 6;
249                 jerry_ee_address_data = 0;
250                 jerry_ee_direct_jump = 1;
251                 break;
252         case EE_STATE_3_0:
253                 //fprintf(log_get(),"eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
254                 if (jerry_writes_enabled)
255                         eeprom_ram[jerry_ee_address_data] = 0xFFFF;
256                 jerry_ee_state = EE_STATE_BUSY;
257                 break;
258         case EE_READ_DATA: 
259                 //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
260                 jerry_ee_data <<= 1;
261                 jerry_ee_data |= data;
262                 jerry_ee_data_cnt--;
263                 if (!jerry_ee_data_cnt)
264                 {
265                         jerry_ee_state = jerry_ee_rstate;
266                         if (jerry_ee_direct_jump)
267                                 eeprom_set_di(data);
268                 }
269                 break;
270         case EE_READ_ADDRESS: 
271                 jerry_ee_address_data <<= 1;
272                 jerry_ee_address_data |= data;
273                 jerry_ee_address_cnt--;
274 //              fprintf(log_get(),"eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
275                 if (!jerry_ee_address_cnt)
276                 {
277                         jerry_ee_state = jerry_ee_rstate;
278                         //fprintf(log_get(),"eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
279                         if (jerry_ee_direct_jump)
280                                 eeprom_set_di(data);
281                 }
282                 break;
283         default:
284                 jerry_ee_state = EE_STATE_OP_A; 
285         }
286 }
287
288 void eeprom_set_cs(uint32 state)
289 {
290 //      fprintf(log_get(),"eeprom: cs=%i\n",state);
291         jerry_ee_state = EE_STATE_START;
292         jerry_ee_op = 0;
293         jerry_ee_rstate = 0;
294         jerry_ee_address_data = 0;
295         jerry_ee_address_cnt = 6;
296         jerry_ee_data = 0;
297         jerry_ee_data_cnt = 16;
298         jerry_writes_enabled = 1;
299 }
300
301 uint32 eeprom_get_do(void)
302 {
303         uint16 data = 1;
304
305         switch (jerry_ee_state)
306         {
307         case EE_STATE_START:
308                 data = 1;
309                 break;
310         case EE_STATE_BUSY:
311                 jerry_ee_state = EE_STATE_START;
312                 data = 0;
313                 break;
314         case EE_STATE_2_0:
315                 jerry_ee_data_cnt--;
316                 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
317                 if (!jerry_ee_data_cnt)
318                 {
319                         //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());
320                         jerry_ee_state = EE_STATE_START;
321                 }
322                 break;
323         }
324
325 //      fprintf(log_get(),"eeprom: do=%i\n",data);
326         return data;
327 }