Skip to content

Commit 1b4442f

Browse files
committed
Fix save states and rework memory system
All the memory stuff is connected so when fixing the save states it made sense to prepare for fixing up and enhancing the memory code. Particularly for allowing for configurable amounts of memory for homebrew.
1 parent a7bbf96 commit 1b4442f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1329
-932
lines changed

Makefile.common

+3
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@ SOURCES_C += \
3939
$(OPERA_DIR)/opera_diag_port.c \
4040
$(OPERA_DIR)/opera_dsp.c \
4141
$(OPERA_DIR)/opera_fixedpoint_math.c \
42+
$(OPERA_DIR)/opera_log.c \
4243
$(OPERA_DIR)/opera_madam.c \
44+
$(OPERA_DIR)/opera_mem.c \
4345
$(OPERA_DIR)/opera_nvram.c \
4446
$(OPERA_DIR)/opera_pbus.c \
4547
$(OPERA_DIR)/opera_region.c \
4648
$(OPERA_DIR)/opera_sport.c \
49+
$(OPERA_DIR)/opera_state.c \
4750
$(OPERA_DIR)/opera_vdlp.c \
4851
$(OPERA_DIR)/opera_xbus.c \
4952
$(OPERA_DIR)/opera_xbus_cdrom_plugin.c

libopera/bool.h

-9
This file was deleted.

libopera/endianness.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
defined(__i386) || \
3030
defined(_M_IX86)
3131
#define IS_BIG_ENDIAN 0
32+
#define IS_LITTLE_ENDIAN 1
3233
#elif \
3334
(defined(__BYTE_ORDER) && \
3435
(__BYTE_ORDER == __BIG_ENDIAN)) || \
@@ -50,10 +51,13 @@
5051
defined(_XENON) || \
5152
defined(__sparc__)
5253
#define IS_BIG_ENDIAN 1
54+
#define IS_LITTLE_ENDIAN 0
5355
#elif defined(MSB_FIRST)
5456
#define IS_BIG_ENDIAN 1
57+
#define IS_LITTLE_ENDIAN 0
5558
#else
5659
#define IS_BIG_ENDIAN 0
60+
#define IS_LITTLE_ENDIAN 1
5761
#endif
5862

5963
#if defined(__GNUC__)
@@ -70,13 +74,11 @@
7074

7175
#if IS_BIG_ENDIAN
7276

73-
#define is_little_endian() (0)
7477
#define swap32_if_little_endian(X) (X)
7578
#define swap32_array_if_little_endian(X,Y)
7679

7780
#else
7881

79-
#define is_little_endian() (1)
8082
#define swap32_if_little_endian(X) (SWAP32(X))
8183

8284
static

libopera/flags.h

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef LIBOPERA_FLAGS_H_INCLUDED
2+
#define LIBOPERA_FLAGS_H_INCLUDED
3+
4+
#define set_flag(V,F) ((V)|=(F))
5+
#define clr_flag(V,F) ((V)&=~(F))
6+
#define set_or_clr_flag(V,F,S) ((!!(S)) ? set_flag(V,F) : clr_flag(V,F))
7+
8+
#define flag_is_set(V,F) (!!((V)&(F)))
9+
#define flag_is_clr(V,F) (!((V)&(F)))
10+
11+
#endif

libopera/opera_3do.c

+99-68
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,34 @@
3434
#include "opera_core.h"
3535
#include "opera_diag_port.h"
3636
#include "opera_dsp.h"
37+
#include "opera_log.h"
3738
#include "opera_madam.h"
39+
#include "opera_mem.h"
3840
#include "opera_region.h"
3941
#include "opera_sport.h"
42+
#include "opera_state.h"
4043
#include "opera_vdlp.h"
4144
#include "opera_xbus.h"
4245
#include "opera_xbus_cdrom_plugin.h"
4346
#include "inline.h"
4447

4548
#include <stdint.h>
4649
#include <stdlib.h>
50+
#include <string.h>
4751

4852
static opera_ext_interface_t io_interface;
4953

5054
extern int flagtime;
5155

52-
int HIRESMODE = 0;
53-
uint32_t FIXMODE = 0;
54-
int CNBFIX = 0;
56+
uint32_t FIXMODE = 0;
57+
int CNBFIX = 0;
5558

5659
int
5760
opera_3do_init(opera_ext_interface_t callback_)
5861
{
5962
int i;
60-
uint8_t *dram;
61-
uint8_t *vram;
63+
64+
opera_mem_init();
6265

6366
io_interface = callback_;
6467

@@ -68,12 +71,9 @@ opera_3do_init(opera_ext_interface_t callback_)
6871

6972
opera_arm_init();
7073

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();
7777
opera_xbus_init(xbus_cdrom_plugin);
7878

7979
/*
@@ -187,75 +187,106 @@ opera_3do_process_frame(void)
187187
field = !field;
188188
}
189189

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+
190210
uint32_t
191211
opera_3do_state_size(void)
192212
{
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();
207214
}
208215

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_)
211220
{
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);
237238
}
238239

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_)
241243
{
242-
const uint8_t *data;
243-
const uint32_t *indexes;
244+
return opera_3do_state_save_v1(data_,size_);
245+
}
244246

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};
247255

248-
if(indexes[0] != 0x97970101)
256+
if(size_ != opera_3do_state_size_v1())
249257
return 0;
250258

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_);
259279

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+
}
261292
}

libopera/opera_3do.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
#include <stdint.h>
88

99
uint32_t opera_3do_state_size(void);
10-
void opera_3do_state_save(void *buf);
11-
int opera_3do_state_load(const void *buf);
10+
uint32_t opera_3do_state_save(void *buf, size_t size);
11+
uint32_t opera_3do_state_load(void const *buf, size_t size);
1212

1313
int opera_3do_init(opera_ext_interface_t callback);
1414
void opera_3do_destroy(void);

0 commit comments

Comments
 (0)