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