Mercurial > repos > blastem
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)); |