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");