comparison segacd.c @ 1503:a763523dadf4 segacd

Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
author Michael Pavone <pavone@retrodev.com>
date Wed, 13 Dec 2017 09:44:41 -0800
parents 2564b6ba2e12
children 95b3a1a8b26c
comparison
equal deleted inserted replaced
1502:2564b6ba2e12 1503:a763523dadf4
201 .read_16 = work_ram_1M_read16, .write_16 = work_ram_1M_write16, .read_8 = work_ram_1M_read8, .write_8 = work_ram_1M_write8}, 201 .read_16 = work_ram_1M_read16, .write_16 = work_ram_1M_write16, .read_8 = work_ram_1M_read8, .write_8 = work_ram_1M_write8},
202 {0xFE0000, 0xFEFFFF, 0x3FFF, .flags=MMAP_READ | MMAP_WRITE | MMAP_ONLY_ODD}, 202 {0xFE0000, 0xFEFFFF, 0x3FFF, .flags=MMAP_READ | MMAP_WRITE | MMAP_ONLY_ODD},
203 {0xFF0000, 0xFF7FFF, 0x0000, .read_16 = pcm_read16, .write_16 = pcm_write16, .read_8 = pcm_read8, .write_8 = pcm_write8}, 203 {0xFF0000, 0xFF7FFF, 0x0000, .read_16 = pcm_read16, .write_16 = pcm_write16, .read_8 = pcm_read8, .write_8 = pcm_write8},
204 {0xFF8000, 0xFF81FF, 0x0000, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8} 204 {0xFF8000, 0xFF81FF, 0x0000, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8}
205 }; 205 };
206 memset(info, 0, sizeof(*info));
206 segacd_context *cd = calloc(sizeof(segacd_context), 1); 207 segacd_context *cd = calloc(sizeof(segacd_context), 1);
207 FILE *f = fopen("cdbios.bin", "rb"); 208 FILE *f = fopen("cdbios.bin", "rb");
208 if (!f) { 209 if (!f) {
209 fatal_error("Failed to open CD firmware for reading"); 210 fatal_error("Failed to open CD firmware for reading");
210 } 211 }
213 cd->rom = malloc(adjusted_size); 214 cd->rom = malloc(adjusted_size);
214 if (firmware_size != fread(cd->rom, 1, firmware_size, f)) { 215 if (firmware_size != fread(cd->rom, 1, firmware_size, f)) {
215 fatal_error("Failed to read CD firmware"); 216 fatal_error("Failed to read CD firmware");
216 } 217 }
217 cd->rom_mut = malloc(adjusted_size); 218 cd->rom_mut = malloc(adjusted_size);
219 byteswap_rom(adjusted_size, cd->rom);
218 memcpy(cd->rom_mut, cd->rom, adjusted_size); 220 memcpy(cd->rom_mut, cd->rom, adjusted_size);
219 byteswap_rom(firmware_size, cd->rom); 221
222 tern_node *db = get_rom_db();
223 *info = configure_rom(db, media->buffer, media->size, media->chain ? media->chain->buffer : NULL, media->chain ? media->chain->size : 0, NULL, 0);
224
220 cd->prog_ram = malloc(512*1024); 225 cd->prog_ram = malloc(512*1024);
221 cd->work_ram = malloc(256*1024); 226 cd->work_ram = malloc(256*1024);
222 cd->pcm_ram = malloc(64*1024); 227 cd->pcm_ram = malloc(64*1024);
223 //TODO: Load state from file 228 //TODO: Load state from file
224 cd->bram = malloc(8*1024); 229 cd->bram = malloc(8*1024);
236 } 241 }
237 242
238 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint32_t *num_chunks) 243 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint32_t *num_chunks)
239 { 244 {
240 static memmap_chunk main_cpu_map[] = { 245 static memmap_chunk main_cpu_map[] = {
241 {0x000000, 0x01FFFF, 0x00000, .flags=MMAP_READ}, 246 {0x000000, 0x01FFFF, 0xFFFFFF, .flags=MMAP_READ},
242 {0x020000, 0x03FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 0},//TODO: support running main CPU code from here 247 {0x020000, 0x03FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 0},//TODO: support running main CPU code from here
243 {0x040000, 0x05FFFF, 0x1FFFF, .flags=MMAP_READ}, //first ROM alias 248 {0x040000, 0x05FFFF, 0x1FFFF, .flags=MMAP_READ}, //first ROM alias
244 //TODO: additional ROM/prog RAM aliases 249 //TODO: additional ROM/prog RAM aliases
245 {0x200000, 0x01FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 1}, 250 {0x200000, 0x01FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 1},
246 {0x220000, 0x03FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 2}, 251 {0x220000, 0x03FFFF, 0x1FFFF, .flags=MMAP_READ|MMAP_WRITE|MMAP_PTR_IDX|MMAP_FUNC_NULL, .ptr_index = 2},