Mercurial > repos > blastem
comparison sms.c @ 2320:8016dbb0fcde
Initial work on ROM DB support for SMS/GG games
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 09 May 2023 09:03:37 -0700 |
parents | 0343f0d5add0 |
children | 2eda5f81f91e |
comparison
equal
deleted
inserted
replaced
2319:ab3d8759da08 | 2320:8016dbb0fcde |
---|---|
152 z80_invalidate_code_range(z80, 0x8000, 0xC000); | 152 z80_invalidate_code_range(z80, 0x8000, 0xC000); |
153 } | 153 } |
154 } | 154 } |
155 } | 155 } |
156 | 156 |
157 static void *mapper_write(uint32_t location, void *vcontext, uint8_t value) | 157 void *sms_sega_mapper_write(uint32_t location, void *vcontext, uint8_t value) |
158 { | 158 { |
159 z80_context *z80 = vcontext; | 159 z80_context *z80 = vcontext; |
160 sms_context *sms = z80->system; | 160 sms_context *sms = z80->system; |
161 location &= 3; | 161 location &= 3; |
162 sms->ram[0x1FFC + location] = value; | 162 sms->ram[0x1FFC + location] = value; |
677 } | 677 } |
678 | 678 |
679 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region) | 679 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region) |
680 { | 680 { |
681 sms_context *sms = calloc(1, sizeof(sms_context)); | 681 sms_context *sms = calloc(1, sizeof(sms_context)); |
682 uint32_t rom_size = nearest_pow2(media->size); | 682 tern_node *rom_db = get_rom_db(); |
683 memmap_chunk memory_map[6]; | 683 const memmap_chunk base_map[] = { |
684 if (media->size > 0xC000) { | 684 {0xC000, 0x10000, sizeof(sms->ram)-1, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram} |
685 sms->header.info.map_chunks = 6; | |
686 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; | |
687 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, .flags = MMAP_READ, .buffer = media->buffer}; | |
688 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, .ptr_index = 0, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE}; | |
689 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, .ptr_index = 1, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE}; | |
690 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, .ptr_index = 2, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, .write_8 = cart_ram_write}; | |
691 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, .ptr_index = 0, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram}; | |
692 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, .ptr_index = 0, .flags = MMAP_READ, .buffer = ram_reg_overlap, .write_8 = mapper_write}; | |
693 } else { | |
694 sms->header.info.map_chunks = 2; | |
695 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, .flags = MMAP_READ, .buffer = media->buffer}; | |
696 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram}; | |
697 }; | 685 }; |
698 sms->header.info.map = malloc(sizeof(memmap_chunk) * sms->header.info.map_chunks); | 686 sms->header.info = configure_rom_sms(rom_db, media->buffer, media->size, base_map, sizeof(base_map)/sizeof(base_map[0])); |
699 memcpy(sms->header.info.map, memory_map, sizeof(memmap_chunk) * sms->header.info.map_chunks); | 687 uint32_t rom_size = sms->header.info.rom_size; |
700 z80_options *zopts = malloc(sizeof(z80_options)); | 688 z80_options *zopts = malloc(sizeof(z80_options)); |
701 tern_node *model_def; | 689 tern_node *model_def; |
702 uint8_t is_gamegear = !strcasecmp(media->extension, "gg"); | 690 uint8_t is_gamegear = !strcasecmp(media->extension, "gg"); |
703 if (is_gamegear) { | 691 if (is_gamegear) { |
704 model_def = tern_find_node(get_systems_config(), "gg"); | 692 model_def = tern_find_node(get_systems_config(), "gg"); |