Mercurial > repos > blastem
comparison romdb.c @ 1842:49f65d240299 mame_interp
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 14 Apr 2019 23:38:02 -0700 |
parents | 8500bd987dda |
children | 882746581f17 |
comparison
equal
deleted
inserted
replaced
1787:0c6d07f91346 | 1842:49f65d240299 |
---|---|
291 info->map[8].end = 0xA13100; | 291 info->map[8].end = 0xA13100; |
292 info->map[8].mask = 0xFF; | 292 info->map[8].mask = 0xFF; |
293 info->map[8].write_16 = (write_16_fun)write_bank_reg_w; | 293 info->map[8].write_16 = (write_16_fun)write_bank_reg_w; |
294 info->map[8].write_8 = (write_8_fun)write_bank_reg_b; | 294 info->map[8].write_8 = (write_8_fun)write_bank_reg_b; |
295 return; | 295 return; |
296 } else if(!memcmp("SEGA MEGAWIFI", rom + 0x100, strlen("SEGA MEGAWIFI"))) { | |
297 info->mapper_type = MAPPER_NONE; | |
298 info->map_chunks = base_chunks + 2; | |
299 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); | |
300 memset(info->map, 0, sizeof(memmap_chunk)*2); | |
301 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); | |
302 info->save_size = 0x400000; | |
303 info->save_bus = RAM_FLAG_BOTH; | |
304 info->save_type = SAVE_NOR; | |
305 info->map[0].start = 0; | |
306 info->map[0].end = 0x400000; | |
307 info->map[0].mask = 0xFFFFFF; | |
308 info->map[0].write_16 = nor_flash_write_w; | |
309 info->map[0].write_8 = nor_flash_write_b; | |
310 info->map[0].read_16 = nor_flash_read_w; | |
311 info->map[0].read_8 = nor_flash_read_b; | |
312 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; | |
313 info->map[0].buffer = info->save_buffer = malloc(info->save_size); | |
314 uint32_t init_size = size < info->save_size ? size : info->save_size; | |
315 memcpy(info->save_buffer, rom, init_size); | |
316 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); | |
317 info->nor = calloc(1, sizeof(nor_state)); | |
318 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH); | |
319 info->nor->cmd_address1 = 0xAAB; | |
320 info->nor->cmd_address2 = 0x555; | |
321 info->map[1].start = 0xA130C0; | |
322 info->map[1].end = 0xA130D0; | |
323 info->map[1].mask = 0xFFFFFF; | |
324 if (!strcmp( | |
325 "on", | |
326 tern_find_path_default(config, "system\0megawifi\0", (tern_val){.ptrval="off"}, TVAL_PTR).ptrval) | |
327 ) { | |
328 info->map[1].write_16 = megawifi_write_w; | |
329 info->map[1].write_8 = megawifi_write_b; | |
330 info->map[1].read_16 = megawifi_read_w; | |
331 info->map[1].read_8 = megawifi_read_b; | |
332 } else { | |
333 warning("ROM uses MegaWiFi, but it is disabled\n"); | |
334 } | |
335 return; | |
296 } else if (has_ram_header(rom, size)) { | 336 } else if (has_ram_header(rom, size)) { |
297 uint32_t ram_start = read_ram_header(info, rom); | 337 uint32_t ram_start = read_ram_header(info, rom); |
298 | 338 |
299 if (info->save_buffer) { | 339 if (info->save_buffer) { |
300 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); | 340 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); |
558 } | 598 } |
559 tern_node * bits_write = tern_find_node(node, "bits_write"); | 599 tern_node * bits_write = tern_find_node(node, "bits_write"); |
560 if (bits_write) { | 600 if (bits_write) { |
561 tern_foreach(bits_write, eeprom_write_fun, eep_map); | 601 tern_foreach(bits_write, eeprom_write_fun, eep_map); |
562 } | 602 } |
563 printf("EEPROM address %X: sda read: %X, sda write: %X, scl: %X\n", start, eep_map->sda_read_bit, eep_map->sda_write_mask, eep_map->scl_mask); | 603 debug_message("EEPROM address %X: sda read: %X, sda write: %X, scl: %X\n", start, eep_map->sda_read_bit, eep_map->sda_write_mask, eep_map->scl_mask); |
564 state->info->num_eeprom++; | 604 state->info->num_eeprom++; |
565 } | 605 } |
566 | 606 |
567 void map_iter_fun(char *key, tern_val val, uint8_t valtype, void *data) | 607 void map_iter_fun(char *key, tern_val val, uint8_t valtype, void *data) |
568 { | 608 { |
769 map->start = 0xA13000; | 809 map->start = 0xA13000; |
770 map->end = 0xA13100; | 810 map->end = 0xA13100; |
771 map->mask = 0xFF; | 811 map->mask = 0xFF; |
772 map->write_16 = (write_16_fun)write_bank_reg_w; | 812 map->write_16 = (write_16_fun)write_bank_reg_w; |
773 map->write_8 = (write_8_fun)write_bank_reg_b; | 813 map->write_8 = (write_8_fun)write_bank_reg_b; |
814 #ifndef IS_LIB | |
774 } else if (!strcmp(dtype, "MENU")) { | 815 } else if (!strcmp(dtype, "MENU")) { |
775 //fake hardware for supporting menu | 816 //fake hardware for supporting menu |
776 map->buffer = NULL; | 817 map->buffer = NULL; |
777 map->mask = 0xFF; | 818 map->mask = 0xFF; |
778 map->write_16 = menu_write_w; | 819 map->write_16 = menu_write_w; |
779 map->read_16 = menu_read_w; | 820 map->read_16 = menu_read_w; |
821 #endif | |
780 } else if (!strcmp(dtype, "fixed")) { | 822 } else if (!strcmp(dtype, "fixed")) { |
781 uint16_t *value = malloc(2); | 823 uint16_t *value = malloc(2); |
782 map->buffer = value; | 824 map->buffer = value; |
783 map->mask = 0; | 825 map->mask = 0; |
784 map->flags = MMAP_READ; | 826 map->flags = MMAP_READ; |
845 break; | 887 break; |
846 } | 888 } |
847 product_id[i] = rom[GAME_ID_OFF + i]; | 889 product_id[i] = rom[GAME_ID_OFF + i]; |
848 | 890 |
849 } | 891 } |
850 printf("Product ID: %s\n", product_id); | 892 debug_message("Product ID: %s\n", product_id); |
851 uint8_t raw_hash[20]; | 893 uint8_t raw_hash[20]; |
852 sha1(vrom, rom_size, raw_hash); | 894 sha1(vrom, rom_size, raw_hash); |
853 uint8_t hex_hash[41]; | 895 uint8_t hex_hash[41]; |
854 bin_to_hex(hex_hash, raw_hash, 20); | 896 bin_to_hex(hex_hash, raw_hash, 20); |
855 printf("SHA1: %s\n", hex_hash); | 897 debug_message("SHA1: %s\n", hex_hash); |
856 tern_node * entry = tern_find_node(rom_db, hex_hash); | 898 tern_node * entry = tern_find_node(rom_db, hex_hash); |
857 if (!entry) { | 899 if (!entry) { |
858 entry = tern_find_node(rom_db, product_id); | 900 entry = tern_find_node(rom_db, product_id); |
859 } | 901 } |
860 if (!entry) { | 902 if (!entry) { |
861 puts("Not found in ROM DB, examining header\n"); | 903 debug_message("Not found in ROM DB, examining header\n\n"); |
862 if (xband_detect(rom, rom_size)) { | 904 if (xband_detect(rom, rom_size)) { |
863 return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks); | 905 return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks); |
864 } | 906 } |
865 if (realtec_detect(rom, rom_size)) { | 907 if (realtec_detect(rom, rom_size)) { |
866 return realtec_configure_rom(rom, rom_size, base_map, base_chunks); | 908 return realtec_configure_rom(rom, rom_size, base_map, base_chunks); |
869 } | 911 } |
870 rom_info info; | 912 rom_info info; |
871 info.mapper_type = MAPPER_NONE; | 913 info.mapper_type = MAPPER_NONE; |
872 info.name = tern_find_ptr(entry, "name"); | 914 info.name = tern_find_ptr(entry, "name"); |
873 if (info.name) { | 915 if (info.name) { |
874 printf("Found name: %s\n", info.name); | 916 debug_message("Found name: %s\n\n", info.name); |
875 info.name = strdup(info.name); | 917 info.name = strdup(info.name); |
876 } else { | 918 } else { |
877 info.name = get_header_name(rom); | 919 info.name = get_header_name(rom); |
878 } | 920 } |
879 | 921 |