Mercurial > repos > blastem
comparison sms.c @ 1201:aee2177a1630
Use filename for game title in SMS mode
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 25 Jan 2017 09:41:12 -0800 |
parents | b1147418254a |
children | 5ee6b6345ea9 |
comparison
equal
deleted
inserted
replaced
1200:9661b30bd3f7 | 1201:aee2177a1630 |
---|---|
273 if (sms->vdp->debug_pal == 4) { | 273 if (sms->vdp->debug_pal == 4) { |
274 sms->vdp->debug_pal = 0; | 274 sms->vdp->debug_pal = 0; |
275 } | 275 } |
276 } | 276 } |
277 | 277 |
278 sms_context *alloc_configure_sms(void *rom, uint32_t rom_size, void *extra_rom, uint32_t extra_rom_size, uint32_t opts, uint8_t force_region, rom_info *info_out) | 278 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info_out) |
279 { | 279 { |
280 memset(info_out, 0, sizeof(*info_out)); | 280 memset(info_out, 0, sizeof(*info_out)); |
281 sms_context *sms = calloc(1, sizeof(sms_context)); | 281 sms_context *sms = calloc(1, sizeof(sms_context)); |
282 uint32_t orig_size = rom_size; | 282 uint32_t rom_size = nearest_pow2(media->size); |
283 rom_size = nearest_pow2(rom_size); | |
284 memmap_chunk memory_map[6]; | 283 memmap_chunk memory_map[6]; |
285 if (orig_size > 0xC000) { | 284 if (media->size > 0xC000) { |
286 info_out->map_chunks = 6; | 285 info_out->map_chunks = 6; |
287 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; | 286 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; |
288 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; | 287 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; |
289 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; | 288 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
290 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; | 289 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
291 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write}; | 290 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write}; |
292 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; | 291 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; |
293 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; | 292 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; |
294 } else { | 293 } else { |
295 info_out->map_chunks = 2; | 294 info_out->map_chunks = 2; |
296 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; | 295 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; |
297 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; | 296 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; |
298 }; | 297 }; |
299 info_out->map = malloc(sizeof(memmap_chunk) * info_out->map_chunks); | 298 info_out->map = malloc(sizeof(memmap_chunk) * info_out->map_chunks); |
300 memcpy(info_out->map, memory_map, sizeof(memmap_chunk) * info_out->map_chunks); | 299 memcpy(info_out->map, memory_map, sizeof(memmap_chunk) * info_out->map_chunks); |
301 z80_options *zopts = malloc(sizeof(z80_options)); | 300 z80_options *zopts = malloc(sizeof(z80_options)); |
302 init_z80_opts(zopts, info_out->map, info_out->map_chunks, io_map, 4, 15, 0xFF); | 301 init_z80_opts(zopts, info_out->map, info_out->map_chunks, io_map, 4, 15, 0xFF); |
303 sms->z80 = init_z80_context(zopts); | 302 sms->z80 = init_z80_context(zopts); |
304 sms->z80->system = sms; | 303 sms->z80->system = sms; |
305 sms->z80->options->gen.debug_cmd_handler = debug_commands; | 304 sms->z80->options->gen.debug_cmd_handler = debug_commands; |
306 | 305 |
307 sms->rom = rom; | 306 sms->rom = media->buffer; |
308 sms->rom_size = rom_size; | 307 sms->rom_size = rom_size; |
309 if (info_out->map_chunks > 2) { | 308 if (info_out->map_chunks > 2) { |
310 sms->z80->mem_pointers[0] = sms->rom; | 309 sms->z80->mem_pointers[0] = sms->rom; |
311 sms->z80->mem_pointers[1] = sms->rom + 0x4000; | 310 sms->z80->mem_pointers[1] = sms->rom + 0x4000; |
312 sms->z80->mem_pointers[2] = sms->rom + 0x8000; | 311 sms->z80->mem_pointers[2] = sms->rom + 0x8000; |
327 sms->vdp = malloc(sizeof(vdp_context)); | 326 sms->vdp = malloc(sizeof(vdp_context)); |
328 init_vdp_context(sms->vdp, 0); | 327 init_vdp_context(sms->vdp, 0); |
329 sms->vdp->system = &sms->header; | 328 sms->vdp->system = &sms->header; |
330 | 329 |
331 info_out->save_type = SAVE_NONE; | 330 info_out->save_type = SAVE_NONE; |
332 info_out->name = strdup("Master System Game"); | 331 info_out->name = strdup(media->name); |
333 | 332 |
334 setup_io_devices(config, info_out, &sms->io); | 333 setup_io_devices(config, info_out, &sms->io); |
335 | 334 |
336 sms->header.set_speed_percent = set_speed_percent; | 335 sms->header.set_speed_percent = set_speed_percent; |
337 sms->header.start_context = start_sms; | 336 sms->header.start_context = start_sms; |