Mon, 06 Dec 2010 01:43:04 +0000
fix side-select bug in WDC FDC driver, was causing all reads to occur on side0... now the Loader boots!
Loader will boot, but immediately gives up on the floppy drive... Not sure why.
1 #define _STATE_C
2 #include <stddef.h>
3 #include <malloc.h>
4 #include <stdio.h>
5 #include "wd279x.h"
6 #include "state.h"
8 int state_init(size_t ramsize)
9 {
10 // Free RAM if it's allocated
11 if (state.ram != NULL)
12 free(state.ram);
14 // Initialise hardware registers
15 state.romlmap = false;
17 // Allocate RAM, making sure the user has specified a valid RAM amount first
18 // Basically: 512KiB minimum, 4MiB maximum, in increments of 512KiB.
19 if ((ramsize < 512*1024) || ((ramsize % (512*1024)) != 0))
20 return -1;
21 state.ram = malloc(ramsize);
22 if (state.ram == NULL)
23 return -2;
24 state.ram_size = ramsize;
26 // Load ROMs
27 FILE *r14c, *r15c;
28 r14c = fopen("roms/14c.bin", "rb");
29 // if (r14c == NULL) FAIL("unable to open roms/14c.bin");
30 r15c = fopen("roms/15c.bin", "rb");
31 // if (r15c == NULL) FAIL("unable to open roms/15c.bin");
33 // get ROM file size
34 fseek(r14c, 0, SEEK_END);
35 size_t romlen = ftell(r14c);
36 fseek(r14c, 0, SEEK_SET);
37 fseek(r15c, 0, SEEK_END);
38 size_t romlen2 = ftell(r15c);
39 fseek(r15c, 0, SEEK_SET);
40 // if (romlen2 != romlen) FAIL("ROMs are not the same size!");
41 // if ((romlen + romlen2) > ROM_SIZE) FAIL("ROMs are too large to fit in memory!");
43 // sanity checks completed; load the ROMs!
44 uint8_t *romdat1, *romdat2;
45 romdat1 = malloc(romlen);
46 romdat2 = malloc(romlen2);
47 fread(romdat1, 1, romlen, r15c);
48 fread(romdat2, 1, romlen2, r14c);
50 // convert the ROM data
51 for (size_t i=0; i<(romlen + romlen2); i+=2) {
52 state.rom[i+0] = romdat1[i/2];
53 state.rom[i+1] = romdat2[i/2];
54 }
56 // TODO: if ROM buffer not filled, repeat the ROM data we read until it is (wraparound emulation)
58 // free the data arrays and close the files
59 free(romdat1);
60 free(romdat2);
61 fclose(r14c);
62 fclose(r15c);
64 // Initialise the disc controller
65 wd2797_init(&state.fdc_ctx);
67 return 0;
68 }
70 void state_done()
71 {
72 if (state.ram != NULL) {
73 free(state.ram);
74 state.ram = NULL;
75 }
77 // Deinitialise the disc controller
78 wd2797_done(&state.fdc_ctx);
79 }