]> Shamusworld >> Repos - virtualjaguar/blob - src/eeprom.cpp
Source cleanups mostly
[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/enhancements by James L. Hammons
7 //
8
9 #include <stdlib.h>
10 #include "eeprom.h"
11 #include "settings.h"
12
13 #define eeprom_LOG
14
15 static uint16 eeprom_ram[64];
16
17 //
18 // Private function prototypes
19 //
20
21 void EEPROMSave(void);
22 void eeprom_set_di(uint32 state); 
23 void eeprom_set_cs(uint32 state);
24 uint32 eeprom_get_do(void);
25
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 };
30
31 // Local global variables
32
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;
42 FILE * jerry_ee_fp;
43 static char eeprom_filename[MAX_PATH];
44 static bool foundEEPROM = false;
45
46 void eeprom_init(void)
47 {
48         sprintf(eeprom_filename, "%s%08X.eep", vjs.EEPROMPath, (unsigned int)jaguar_mainRom_crc32);
49         jerry_ee_fp = fopen(eeprom_filename, "rb");
50         if (jerry_ee_fp)
51         {
52                 fread(eeprom_ram, 1, 128, jerry_ee_fp);
53                 fclose(jerry_ee_fp);
54                 WriteLog("EEPROM: Loaded from %s\n", eeprom_filename);
55                 foundEEPROM = true;
56         }
57         else
58         {
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);
63         }
64 }
65
66 void eeprom_reset(void)
67 {
68         if (!foundEEPROM)
69                 memset(eeprom_ram, 0xFF, 64 * sizeof(uint16));
70 }
71
72 void eeprom_done(void)
73 {
74 //Actually, is this necessary now that we write the file immediately upon write to EEPROM?
75 //      EEPROMSave();
76 }
77
78 void EEPROMSave(void)
79 {
80         jerry_ee_fp = fopen(eeprom_filename, "wb");
81         fwrite(eeprom_ram, 1, 128, jerry_ee_fp);
82         fclose(jerry_ee_fp);
83 }
84
85 uint8 eeprom_byte_read(uint32 offset)
86 {
87         switch (offset)
88         {
89         case 0xF14001:
90                 return eeprom_get_do();
91         case 0xF14801:
92                 break;
93         case 0xF15001:
94                 eeprom_set_cs(1);
95                 break;
96 //      default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
97         }
98
99         return 0x00;
100 }
101
102 uint16 eeprom_word_read(uint32 offset)
103 {
104         return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1);
105 }
106
107 void eeprom_byte_write(uint32 offset, uint8 data)
108 {
109         switch (offset)
110         {
111         case 0xF14001:
112                 break;
113         case 0xF14801:
114                 eeprom_set_di(data & 0x01);
115                 break;
116         case 0xF15001:
117                 eeprom_set_cs(1);
118                 break;
119 //      default: WriteLog("eeprom: unmapped 0x%.8x\n",offset); break;
120         }
121 }
122
123 void eeprom_word_write(uint32 offset, uint16 data)
124 {
125         eeprom_byte_write(offset+0, (data >> 8) & 0xFF);
126         eeprom_byte_write(offset+1, data & 0xFF);
127 }
128
129 void eeprom_set_di(uint32 data)
130 {
131 //      WriteLog("eeprom: di=%i\n",data);
132 //      WriteLog("eeprom: state %i\n",jerry_ee_state);
133         switch (jerry_ee_state)
134         {
135         case EE_STATE_START:
136                 jerry_ee_state = EE_STATE_OP_A;
137                 break;
138         case EE_STATE_OP_A:
139                 jerry_ee_op = (data << 1);
140                 jerry_ee_state = EE_STATE_OP_B;
141                 break;
142         case EE_STATE_OP_B:
143                 jerry_ee_op |= data;
144                 jerry_ee_direct_jump = 0;
145 //              WriteLog("eeprom: opcode %i\n",jerry_ee_op);
146                 switch (jerry_ee_op)
147                 {
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;
152                 }
153                 eeprom_set_di(data);
154                 break;
155         case EE_STATE_0:
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;
161                 break;
162         case EE_STATE_0_0:
163                 switch ((jerry_ee_address_data >> 4) & 0x03)
164                 {
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;
169                 }
170                 eeprom_set_di(data);
171                 break;
172         case EE_STATE_0_0_0:
173                 // writes disable
174                 // WriteLog("eeprom: read only\n");
175                 jerry_writes_enabled = 0;
176                 jerry_ee_state = EE_STATE_START;
177                 break;
178         case EE_STATE_0_0_1:
179                 // writes all
180                 jerry_ee_rstate = EE_STATE_0_0_1_0;
181                 jerry_ee_state = EE_READ_DATA;
182                 jerry_ee_data_cnt = 16;
183                 jerry_ee_data = 0;
184                 jerry_ee_direct_jump = 1;
185                 break;
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!
192                 //else
193                 //      WriteLog("eeprom: not writing because read only\n");
194                 jerry_ee_state = EE_STATE_BUSY;
195                 break;
196         case EE_STATE_0_0_2:
197                 // erase all
198                 //WriteLog("eeprom: erasing eeprom\n");
199                 if (jerry_writes_enabled)
200                         for(int i=0; i<64; i++)
201                                 eeprom_ram[i] = 0xFFFF;
202
203                 jerry_ee_state = EE_STATE_BUSY;
204                 break;
205         case EE_STATE_0_0_3:
206                 // writes enable
207                 //WriteLog("eeprom: read/write\n");
208                 jerry_writes_enabled = 1;
209                 jerry_ee_state = EE_STATE_START;
210                 break;
211         case EE_STATE_1:
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;
217                 break;
218         case EE_STATE_1_0:
219                 jerry_ee_rstate = EE_STATE_1_1;
220                 jerry_ee_state = EE_READ_DATA;
221                 jerry_ee_data_cnt = 16;
222                 jerry_ee_data = 0;
223                 jerry_ee_direct_jump = 1;
224                 break;
225         case EE_STATE_1_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;
231                 break;
232         case EE_STATE_2:
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;
238                 jerry_ee_data = 0;
239                 break;
240         case EE_STATE_3:
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;
246                 break;
247         case EE_STATE_3_0:
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;
252                 break;
253         case EE_READ_DATA: 
254                 //WriteLog("eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);
255                 jerry_ee_data <<= 1;
256                 jerry_ee_data |= data;
257                 jerry_ee_data_cnt--;
258                 if (!jerry_ee_data_cnt)
259                 {
260                         jerry_ee_state = jerry_ee_rstate;
261                         if (jerry_ee_direct_jump)
262                                 eeprom_set_di(data);
263                 }
264                 break;
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)
271                 {
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)
275                                 eeprom_set_di(data);
276                 }
277                 break;
278         default:
279                 jerry_ee_state = EE_STATE_OP_A; 
280         }
281 }
282
283 void eeprom_set_cs(uint32 state)
284 {
285 //      WriteLog("eeprom: cs=%i\n",state);
286         jerry_ee_state = EE_STATE_START;
287         jerry_ee_op = 0;
288         jerry_ee_rstate = 0;
289         jerry_ee_address_data = 0;
290         jerry_ee_address_cnt = 6;
291         jerry_ee_data = 0;
292         jerry_ee_data_cnt = 16;
293         jerry_writes_enabled = 1;
294 }
295
296 uint32 eeprom_get_do(void)
297 {
298         uint16 data = 1;
299
300         switch (jerry_ee_state)
301         {
302         case EE_STATE_START:
303                 data = 1;
304                 break;
305         case EE_STATE_BUSY:
306                 jerry_ee_state = EE_STATE_START;
307                 data = 0;
308                 break;
309         case EE_STATE_2_0:
310                 jerry_ee_data_cnt--;
311                 data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
312                 if (!jerry_ee_data_cnt)
313                 {
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;
316                 }
317                 break;
318         }
319
320 //      WriteLog("eeprom: do=%i\n",data);
321         return data;
322 }