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 +