comparison segacd.c @ 2083:372625dd9590

Persist BRAM to file. Load BIOS relative to blastem directory
author Michael Pavone <pavone@retrodev.com>
date Thu, 03 Feb 2022 23:41:53 -0800
parents cfd53c94fffb
children 3e0801280bef
comparison
equal deleted inserted replaced
2082:485834c0fea7 2083:372625dd9590
1141 {0xFF0000, 0xFF7FFF, 0x003FFF, .read_16 = pcm_read16, .write_16 = pcm_write16, .read_8 = pcm_read8, .write_8 = pcm_write8}, 1141 {0xFF0000, 0xFF7FFF, 0x003FFF, .read_16 = pcm_read16, .write_16 = pcm_write16, .read_8 = pcm_read8, .write_8 = pcm_write8},
1142 {0xFF8000, 0xFF81FF, 0x0001FF, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8} 1142 {0xFF8000, 0xFF81FF, 0x0001FF, .read_16 = sub_gate_read16, .write_16 = sub_gate_write16, .read_8 = sub_gate_read8, .write_8 = sub_gate_write8}
1143 }; 1143 };
1144 1144
1145 segacd_context *cd = calloc(sizeof(segacd_context), 1); 1145 segacd_context *cd = calloc(sizeof(segacd_context), 1);
1146 FILE *f = fopen("cdbios.bin", "rb"); 1146 uint32_t firmware_size;
1147 if (!f) { 1147 cd->rom = (uint16_t *)read_bundled_file("cdbios.bin", &firmware_size);
1148 fatal_error("Failed to open CD firmware for reading");
1149 }
1150 long firmware_size = file_size(f);
1151 uint32_t adjusted_size = nearest_pow2(firmware_size); 1148 uint32_t adjusted_size = nearest_pow2(firmware_size);
1152 cd->rom = malloc(adjusted_size); 1149 if (adjusted_size != firmware_size) {
1153 if (firmware_size != fread(cd->rom, 1, firmware_size, f)) { 1150 cd->rom = realloc(cd->rom, adjusted_size);
1154 fatal_error("Failed to read CD firmware");
1155 } 1151 }
1156 cd->rom_mut = malloc(adjusted_size); 1152 cd->rom_mut = malloc(adjusted_size);
1157 byteswap_rom(adjusted_size, cd->rom); 1153 byteswap_rom(adjusted_size, cd->rom);
1158 memcpy(cd->rom_mut, cd->rom, adjusted_size); 1154 memcpy(cd->rom_mut, cd->rom, adjusted_size);
1159 cd->rom_mut[0x72/2] = 0xFFFF; 1155 cd->rom_mut[0x72/2] = 0xFFFF;
1160 1156
1161 //memset(info, 0, sizeof(*info)); 1157 //memset(info, 0, sizeof(*info));
1162 //tern_node *db = get_rom_db(); 1158 //tern_node *db = get_rom_db();
1163 //*info = configure_rom(db, media->buffer, media->size, media->chain ? media->chain->buffer : NULL, media->chain ? media->chain->size : 0, NULL, 0); 1159 //*info = configure_rom(db, media->buffer, media->size, media->chain ? media->chain->buffer : NULL, media->chain ? media->chain->size : 0, NULL, 0);
1164 1160
1165 cd->prog_ram = malloc(512*1024); 1161 cd->prog_ram = calloc(512*1024, 1);
1166 cd->word_ram = malloc(256*1024); 1162 cd->word_ram = calloc(256*1024, 1);
1167 cd->pcm_ram = malloc(64*1024); 1163 cd->pcm_ram = calloc(64*1024, 1);
1168 //TODO: Load state from file 1164 //TODO: Load state from file
1169 cd->bram = malloc(8*1024); 1165 cd->bram = calloc(8*1024, 1);
1170 1166
1171 1167
1172 sub_cpu_map[0].buffer = sub_cpu_map[1].buffer = cd->prog_ram; 1168 sub_cpu_map[0].buffer = sub_cpu_map[1].buffer = cd->prog_ram;
1173 sub_cpu_map[4].buffer = cd->bram; 1169 sub_cpu_map[4].buffer = cd->bram;
1174 m68k_options *mopts = malloc(sizeof(m68k_options)); 1170 m68k_options *mopts = malloc(sizeof(m68k_options));