34
34
#include "opera_core.h"
35
35
#include "opera_diag_port.h"
36
36
#include "opera_dsp.h"
37
+ #include "opera_log.h"
37
38
#include "opera_madam.h"
39
+ #include "opera_mem.h"
38
40
#include "opera_region.h"
39
41
#include "opera_sport.h"
42
+ #include "opera_state.h"
40
43
#include "opera_vdlp.h"
41
44
#include "opera_xbus.h"
42
45
#include "opera_xbus_cdrom_plugin.h"
43
46
#include "inline.h"
44
47
45
48
#include <stdint.h>
46
49
#include <stdlib.h>
50
+ #include <string.h>
47
51
48
52
static opera_ext_interface_t io_interface ;
49
53
50
54
extern int flagtime ;
51
55
52
- int HIRESMODE = 0 ;
53
- uint32_t FIXMODE = 0 ;
54
- int CNBFIX = 0 ;
56
+ uint32_t FIXMODE = 0 ;
57
+ int CNBFIX = 0 ;
55
58
56
59
int
57
60
opera_3do_init (opera_ext_interface_t callback_ )
58
61
{
59
62
int i ;
60
- uint8_t * dram ;
61
- uint8_t * vram ;
63
+
64
+ opera_mem_init () ;
62
65
63
66
io_interface = callback_ ;
64
67
@@ -68,12 +71,9 @@ opera_3do_init(opera_ext_interface_t callback_)
68
71
69
72
opera_arm_init ();
70
73
71
- dram = opera_arm_ram_get ();
72
- vram = opera_arm_vram_get ();
73
-
74
- opera_vdlp_init (vram );
75
- opera_sport_init (vram );
76
- opera_madam_init (dram );
74
+ opera_vdlp_init ();
75
+ opera_sport_init ();
76
+ opera_madam_init ();
77
77
opera_xbus_init (xbus_cdrom_plugin );
78
78
79
79
/*
@@ -187,75 +187,106 @@ opera_3do_process_frame(void)
187
187
field = !field ;
188
188
}
189
189
190
+ static
191
+ uint32_t
192
+ opera_3do_state_size_v1 (void )
193
+ {
194
+ uint32_t size ;
195
+
196
+ size = 0 ;
197
+ size += opera_state_save_size (sizeof (opera_state_hdr_t ));
198
+ size += opera_arm_state_size ();
199
+ size += opera_clio_state_size ();
200
+ size += opera_dsp_state_size ();
201
+ size += opera_madam_state_size ();
202
+ size += opera_mem_state_size ();
203
+ size += opera_sport_state_size ();
204
+ size += opera_vdlp_state_size ();
205
+ size += opera_xbus_state_size ();
206
+
207
+ return size ;
208
+ }
209
+
190
210
uint32_t
191
211
opera_3do_state_size (void )
192
212
{
193
- uint32_t tmp ;
194
-
195
- tmp = 0 ;
196
- tmp += 16 * 4 ;
197
- tmp += opera_arm_state_size ();
198
- tmp += opera_vdlp_state_size ();
199
- tmp += opera_dsp_state_size ();
200
- tmp += opera_clio_state_size ();
201
- tmp += opera_clock_state_size ();
202
- tmp += opera_sport_state_size ();
203
- tmp += opera_madam_state_size ();
204
- tmp += opera_xbus_state_size ();
205
-
206
- return tmp ;
213
+ return opera_3do_state_size_v1 ();
207
214
}
208
215
209
- void
210
- opera_3do_state_save (void * buf_ )
216
+ static
217
+ uint32_t
218
+ opera_3do_state_save_v1 (void * data_ ,
219
+ size_t const size_ )
211
220
{
212
- uint8_t * data ;
213
- uint32_t * indexes ;
214
-
215
- data = buf_ ;
216
- indexes = buf_ ;
217
-
218
- indexes [0 ] = 0x97970101 ;
219
- indexes [1 ] = 16 * 4 ;
220
- indexes [2 ] = indexes [1 ] + opera_arm_state_size ();
221
- indexes [3 ] = indexes [2 ] + opera_vdlp_state_size ();
222
- indexes [4 ] = indexes [3 ] + opera_dsp_state_size ();
223
- indexes [5 ] = indexes [4 ] + opera_clio_state_size ();
224
- indexes [6 ] = indexes [5 ] + opera_clock_state_size ();
225
- indexes [7 ] = indexes [6 ] + opera_sport_state_size ();
226
- indexes [8 ] = indexes [7 ] + opera_madam_state_size ();
227
- indexes [9 ] = indexes [8 ] + opera_xbus_state_size ();
228
-
229
- opera_arm_state_save (& data [indexes [1 ]]);
230
- opera_vdlp_state_save (& data [indexes [2 ]]);
231
- opera_dsp_state_save (& data [indexes [3 ]]);
232
- opera_clio_state_save (& data [indexes [4 ]]);
233
- opera_clock_state_save (& data [indexes [5 ]]);
234
- opera_sport_state_save (& data [indexes [6 ]]);
235
- opera_madam_state_save (& data [indexes [7 ]]);
236
- opera_xbus_state_save (& data [indexes [8 ]]);
221
+ uint8_t * start = (uint8_t * )data_ ;
222
+ uint8_t * data = (uint8_t * )data_ ;
223
+ opera_state_hdr_t hdr = {0 };
224
+
225
+ hdr .version = 0x01 ;
226
+
227
+ data += opera_state_save (data ,"3DO" ,& hdr ,sizeof (hdr ));
228
+ data += opera_arm_state_save (data );
229
+ data += opera_clio_state_save (data );
230
+ data += opera_dsp_state_save (data );
231
+ data += opera_madam_state_save (data );
232
+ data += opera_mem_state_save (data );
233
+ data += opera_sport_state_save (data );
234
+ data += opera_vdlp_state_save (data );
235
+ data += opera_xbus_state_save (data );
236
+
237
+ return (data - start );
237
238
}
238
239
239
- int
240
- opera_3do_state_load (const void * buf_ )
240
+ uint32_t
241
+ opera_3do_state_save (void * data_ ,
242
+ size_t const size_ )
241
243
{
242
- const uint8_t * data ;
243
- const uint32_t * indexes ;
244
+ return opera_3do_state_save_v1 ( data_ , size_ ) ;
245
+ }
244
246
245
- data = buf_ ;
246
- indexes = buf_ ;
247
+ static
248
+ uint32_t
249
+ opera_3do_state_load_v1 (const void * data_ ,
250
+ size_t const size_ )
251
+ {
252
+ uint8_t const * start = (uint8_t const * )data_ ;
253
+ uint8_t const * data = (uint8_t const * )data_ ;
254
+ opera_state_hdr_t hdr = {0 };
247
255
248
- if (indexes [ 0 ] != 0x97970101 )
256
+ if (size_ != opera_3do_state_size_v1 () )
249
257
return 0 ;
250
258
251
- opera_arm_state_load (& data [indexes [1 ]]);
252
- opera_vdlp_state_load (& data [indexes [2 ]]);
253
- opera_dsp_state_load (& data [indexes [3 ]]);
254
- opera_clio_state_load (& data [indexes [4 ]]);
255
- opera_clock_state_load (& data [indexes [5 ]]);
256
- opera_sport_state_load (& data [indexes [6 ]]);
257
- opera_madam_state_load (& data [indexes [7 ]]);
258
- opera_xbus_state_load (& data [indexes [8 ]]);
259
+ data += opera_state_load (& hdr ,"3DO" ,data ,sizeof (hdr ));
260
+ data += opera_arm_state_load (data );
261
+ data += opera_clio_state_load (data );
262
+ data += opera_dsp_state_load (data );
263
+ data += opera_madam_state_load (data );
264
+ data += opera_mem_state_load (data );
265
+ data += opera_sport_state_load (data );
266
+ data += opera_vdlp_state_load (data );
267
+ data += opera_xbus_state_load (data );
268
+
269
+ return (data - start );
270
+ }
271
+
272
+ uint32_t
273
+ opera_3do_state_load (void const * data_ ,
274
+ size_t size_ )
275
+ {
276
+ uint32_t version ;
277
+
278
+ version = opera_state_get_version (data_ ,size_ );
259
279
260
- return 1 ;
280
+ opera_log_printf (OPERA_LOG_DEBUG ,"[Opera]: loading state... version %x\n" ,version );
281
+
282
+ switch (version )
283
+ {
284
+ case 0x01 :
285
+ return opera_3do_state_load_v1 (data_ ,size_ );
286
+ default :
287
+ opera_log_printf (OPERA_LOG_ERROR ,
288
+ "[Opera]: unable to load state - unknown state version %x\n" ,
289
+ version );
290
+ return 0 ;
291
+ }
261
292
}
0 commit comments