Mercurial > repos > blastem
comparison romdb.c @ 1410:4cd4aa6be5f6
Initial SRAM support for lock-on carts
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 20 Jun 2017 22:56:07 -0700 |
parents | b0e0bb20fc41 |
children | 780fbe0b97be |
comparison
equal
deleted
inserted
replaced
1409:b0e0bb20fc41 | 1410:4cd4aa6be5f6 |
---|---|
804 info->map[0].flags = MMAP_READ; | 804 info->map[0].flags = MMAP_READ; |
805 info->map[0].buffer = rom; | 805 info->map[0].buffer = rom; |
806 | 806 |
807 info->map[1].start = ram_start; | 807 info->map[1].start = ram_start; |
808 info->map[1].mask = info->save_mask; | 808 info->map[1].mask = info->save_mask; |
809 info->map[1].end = ram_start + info->save_size; | 809 info->map[1].end = ram_start + info->save_mask + 1; |
810 info->map[1].flags = MMAP_READ | MMAP_WRITE; | 810 info->map[1].flags = MMAP_READ | MMAP_WRITE; |
811 | 811 |
812 if (info->save_type == RAM_FLAG_ODD) { | 812 if (info->save_type == RAM_FLAG_ODD) { |
813 info->map[1].flags |= MMAP_ONLY_ODD; | 813 info->map[1].flags |= MMAP_ONLY_ODD; |
814 } else if (info->save_type == RAM_FLAG_EVEN) { | 814 } else if (info->save_type == RAM_FLAG_EVEN) { |
1049 if (!strcmp(dtype, "ROM")) { | 1049 if (!strcmp(dtype, "ROM")) { |
1050 map->buffer = state->rom + offset; | 1050 map->buffer = state->rom + offset; |
1051 map->flags = MMAP_READ; | 1051 map->flags = MMAP_READ; |
1052 map->mask = calc_mask(state->rom_size - offset, start, end); | 1052 map->mask = calc_mask(state->rom_size - offset, start, end); |
1053 } else if (!strcmp(dtype, "LOCK-ON")) { | 1053 } else if (!strcmp(dtype, "LOCK-ON")) { |
1054 map->flags = MMAP_READ; | |
1054 if (state->lock_on) { | 1055 if (state->lock_on) { |
1055 if (state->lock_on_size > offset) { | 1056 if (state->lock_on_size > offset) { |
1056 map->mask = calc_mask(state->lock_on_size - offset, start, end); | 1057 map->mask = calc_mask(state->lock_on_size - offset, start, end); |
1057 } else { | 1058 } else { |
1058 map->mask = calc_mask(state->lock_on_size, start, end); | 1059 map->mask = calc_mask(state->lock_on_size, start, end); |
1060 map->buffer = state->lock_on + (offset & (nearest_pow2(state->lock_on_size) - 1)); | 1061 map->buffer = state->lock_on + (offset & (nearest_pow2(state->lock_on_size) - 1)); |
1061 } else if (state->rom_size > start) { | 1062 } else if (state->rom_size > start) { |
1062 //This is a bit of a hack to deal with pre-combined S3&K/S2&K ROMs and S&K ROM hacks | 1063 //This is a bit of a hack to deal with pre-combined S3&K/S2&K ROMs and S&K ROM hacks |
1063 map->buffer = state->rom + start; | 1064 map->buffer = state->rom + start; |
1064 map->mask = calc_mask(state->rom_size - start, start, end); | 1065 map->mask = calc_mask(state->rom_size - start, start, end); |
1066 if (has_ram_header(map->buffer, state->rom_size - start)) { | |
1067 uint32_t sram_start = read_ram_header(state->info, map->buffer); | |
1068 | |
1069 state->info->map_chunks+=1; | |
1070 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); | |
1071 memset(state->info->map + state->info->map_chunks - 1, 0, sizeof(memmap_chunk) * 1); | |
1072 if (sram_start >= state->rom_size) { | |
1073 map = state->info->map + ++state->index; | |
1074 map->start = sram_start; | |
1075 map->mask = state->info->save_mask; | |
1076 map->end = sram_start + state->info->save_mask + 1; | |
1077 map->flags = MMAP_READ | MMAP_WRITE; | |
1078 if (state->info->save_type == RAM_FLAG_ODD) { | |
1079 map->flags |= MMAP_ONLY_ODD; | |
1080 } else if (state->info->save_type == RAM_FLAG_EVEN) { | |
1081 map->flags |= MMAP_ONLY_EVEN; | |
1082 } | |
1083 map->buffer = state->info->save_buffer; | |
1084 } else { | |
1085 map = state->info->map + state->index++; | |
1086 map->flags |= MMAP_CODE | MMAP_PTR_IDX | MMAP_FUNC_NULL; | |
1087 state->info->mapper_start_index = state->ptr_index++; | |
1088 map->ptr_index = state->info->mapper_start_index; | |
1089 map->read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[ptr_idx] == NULL | |
1090 map->read_8 = (read_8_fun)read_sram_b; | |
1091 map->write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area | |
1092 map->write_8 = (write_8_fun)write_sram_area_b; | |
1093 | |
1094 map = state->info->map + state->index; | |
1095 map->start = 0xA13000; | |
1096 map->end = 0xA13100; | |
1097 map->mask = 0xFF; | |
1098 map->write_16 = (write_16_fun)write_bank_reg_w; | |
1099 map->write_8 = (write_8_fun)write_bank_reg_b; | |
1100 } | |
1101 } | |
1065 } else { | 1102 } else { |
1066 //skip this entry if there is no lock on cartridge attached | 1103 //skip this entry if there is no lock on cartridge attached |
1067 return; | 1104 return; |
1068 } | 1105 } |
1069 map->flags = MMAP_READ; | |
1070 } else if (!strcmp(dtype, "EEPROM")) { | 1106 } else if (!strcmp(dtype, "EEPROM")) { |
1071 process_eeprom_def(key, state); | 1107 process_eeprom_def(key, state); |
1072 add_eeprom_map(node, start, end, state); | 1108 add_eeprom_map(node, start, end, state); |
1073 | 1109 |
1074 map->write_16 = write_eeprom_i2c_w; | 1110 map->write_16 = write_eeprom_i2c_w; |