src/state.c

changeset 18
320dc6206f52
child 33
ae97a3146978
     1.1 diff -r 138cb2576dbc -r 320dc6206f52 src/state.c
     1.2 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 +++ b/src/state.c	Mon Nov 29 00:20:40 2010 +0000
     1.4 @@ -0,0 +1,74 @@
     1.5 +#define _STATE_C
     1.6 +#include <stddef.h>
     1.7 +#include <malloc.h>
     1.8 +#include <stdio.h>
     1.9 +#include "state.h"
    1.10 +
    1.11 +int state_init(size_t ramsize)
    1.12 +{
    1.13 +	// Free RAM if it's allocated
    1.14 +	if (state.ram != NULL)
    1.15 +		free(state.ram);
    1.16 +
    1.17 +	// Initialise hardware registers
    1.18 +	state.romlmap = false;
    1.19 +
    1.20 +	// Allocate RAM, making sure the user has specified a valid RAM amount first
    1.21 +	// Basically: 512KiB minimum, 4MiB maximum, in increments of 512KiB.
    1.22 +	if ((ramsize < 512*1024) || ((ramsize % (512*1024)) != 0))
    1.23 +		return -1;
    1.24 +	state.ram = malloc(state.ram_size);
    1.25 +	if (state.ram == NULL)
    1.26 +		return -2;
    1.27 +	state.ram_size = ramsize;
    1.28 +
    1.29 +	// Load ROMs
    1.30 +	FILE *r14c, *r15c;
    1.31 +	r14c = fopen("roms/14c.bin", "rb");
    1.32 +//	if (r14c == NULL) FAIL("unable to open roms/14c.bin");
    1.33 +	r15c = fopen("roms/15c.bin", "rb");
    1.34 +//	if (r15c == NULL) FAIL("unable to open roms/15c.bin");
    1.35 +
    1.36 +	// get ROM file size
    1.37 +	fseek(r14c, 0, SEEK_END);
    1.38 +	size_t romlen = ftell(r14c);
    1.39 +	fseek(r14c, 0, SEEK_SET);
    1.40 +	fseek(r15c, 0, SEEK_END);
    1.41 +	size_t romlen2 = ftell(r15c);
    1.42 +	fseek(r15c, 0, SEEK_SET);
    1.43 +//	if (romlen2 != romlen) FAIL("ROMs are not the same size!");
    1.44 +//	if ((romlen + romlen2) > ROM_SIZE) FAIL("ROMs are too large to fit in memory!");
    1.45 +
    1.46 +	// sanity checks completed; load the ROMs!
    1.47 +	uint8_t *romdat1, *romdat2;
    1.48 +	romdat1 = malloc(romlen);
    1.49 +	romdat2 = malloc(romlen2);
    1.50 +	fread(romdat1, 1, romlen, r15c);
    1.51 +	fread(romdat2, 1, romlen2, r14c);
    1.52 +
    1.53 +	// convert the ROM data
    1.54 +	for (size_t i=0; i<(romlen + romlen2); i+=2) {
    1.55 +		state.rom[i+0] = romdat1[i/2];
    1.56 +		state.rom[i+1] = romdat2[i/2];
    1.57 +	}
    1.58 +
    1.59 +	// TODO: if ROM buffer not filled, repeat the ROM data we read until it is (wraparound emulation)
    1.60 +
    1.61 +	// free the data arrays and close the files
    1.62 +	free(romdat1);
    1.63 +	free(romdat2);
    1.64 +	fclose(r14c);
    1.65 +	fclose(r15c);
    1.66 +
    1.67 +	return 0;
    1.68 +}
    1.69 +
    1.70 +void state_done()
    1.71 +{
    1.72 +	if (state.ram != NULL) {
    1.73 +		free(state.ram);
    1.74 +		state.ram = NULL;
    1.75 +	}
    1.76 +}
    1.77 +
    1.78 +