comparison romdb.c @ 1415:f7d653bb8899

Move Sega mapper implementation out of romdb.c
author Michael Pavone <pavone@retrodev.com>
date Fri, 23 Jun 2017 23:16:44 -0700
parents d94855080529
children 11ac0b511cff
comparison
equal deleted inserted replaced
1414:d94855080529 1415:f7d653bb8899
7 #include "genesis.h" 7 #include "genesis.h"
8 #include "menu.h" 8 #include "menu.h"
9 #include "xband.h" 9 #include "xband.h"
10 #include "realtec.h" 10 #include "realtec.h"
11 #include "nor.h" 11 #include "nor.h"
12 #include "sega_mapper.h"
12 13
13 #define DOM_TITLE_START 0x120 14 #define DOM_TITLE_START 0x120
14 #define DOM_TITLE_END 0x150 15 #define DOM_TITLE_END 0x150
15 #define TITLE_START DOM_TITLE_END 16 #define TITLE_START DOM_TITLE_END
16 #define TITLE_END (TITLE_START+48) 17 #define TITLE_END (TITLE_START+48)
27 return "EEPROM"; 28 return "EEPROM";
28 } else if(save_type == SAVE_NOR) { 29 } else if(save_type == SAVE_NOR) {
29 return "NOR Flash"; 30 return "NOR Flash";
30 } 31 }
31 return "SRAM"; 32 return "SRAM";
32 }
33
34 uint16_t read_sram_w(uint32_t address, m68k_context * context)
35 {
36 genesis_context * gen = context->system;
37 address &= gen->save_ram_mask;
38 switch(gen->save_type)
39 {
40 case RAM_FLAG_BOTH:
41 return gen->save_storage[address] << 8 | gen->save_storage[address+1];
42 case RAM_FLAG_EVEN:
43 return gen->save_storage[address >> 1] << 8 | 0xFF;
44 case RAM_FLAG_ODD:
45 return gen->save_storage[address >> 1] | 0xFF00;
46 }
47 return 0xFFFF;//We should never get here
48 }
49
50 uint8_t read_sram_b(uint32_t address, m68k_context * context)
51 {
52 genesis_context * gen = context->system;
53 address &= gen->save_ram_mask;
54 switch(gen->save_type)
55 {
56 case RAM_FLAG_BOTH:
57 return gen->save_storage[address];
58 case RAM_FLAG_EVEN:
59 if (address & 1) {
60 return 0xFF;
61 } else {
62 return gen->save_storage[address >> 1];
63 }
64 case RAM_FLAG_ODD:
65 if (address & 1) {
66 return gen->save_storage[address >> 1];
67 } else {
68 return 0xFF;
69 }
70 }
71 return 0xFF;//We should never get here
72 }
73
74 m68k_context * write_sram_area_w(uint32_t address, m68k_context * context, uint16_t value)
75 {
76 genesis_context * gen = context->system;
77 if ((gen->bank_regs[0] & 0x3) == 1) {
78 address &= gen->save_ram_mask;
79 switch(gen->save_type)
80 {
81 case RAM_FLAG_BOTH:
82 gen->save_storage[address] = value >> 8;
83 gen->save_storage[address+1] = value;
84 break;
85 case RAM_FLAG_EVEN:
86 gen->save_storage[address >> 1] = value >> 8;
87 break;
88 case RAM_FLAG_ODD:
89 gen->save_storage[address >> 1] = value;
90 break;
91 }
92 }
93 return context;
94 }
95
96 m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value)
97 {
98 genesis_context * gen = context->system;
99 if ((gen->bank_regs[0] & 0x3) == 1) {
100 address &= gen->save_ram_mask;
101 switch(gen->save_type)
102 {
103 case RAM_FLAG_BOTH:
104 gen->save_storage[address] = value;
105 break;
106 case RAM_FLAG_EVEN:
107 if (!(address & 1)) {
108 gen->save_storage[address >> 1] = value;
109 }
110 break;
111 case RAM_FLAG_ODD:
112 if (address & 1) {
113 gen->save_storage[address >> 1] = value;
114 }
115 break;
116 }
117 }
118 return context;
119 }
120
121 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
122 {
123 genesis_context * gen = context->system;
124 address &= 0xE;
125 address >>= 1;
126 gen->bank_regs[address] = value;
127 if (!address) {
128 if (value & 1) {
129 //Used for games that only use the mapper for SRAM
130 if (context->mem_pointers[gen->mapper_start_index]) {
131 gen->mapper_temp = context->mem_pointers[gen->mapper_start_index];
132 }
133 context->mem_pointers[gen->mapper_start_index] = NULL;
134 //For games that need more than 4MB
135 for (int i = 4; i < 8; i++)
136 {
137 context->mem_pointers[gen->mapper_start_index + i] = NULL;
138 }
139 } else {
140 //Used for games that only use the mapper for SRAM
141 if (!context->mem_pointers[gen->mapper_start_index]) {
142 context->mem_pointers[gen->mapper_start_index] = gen->mapper_temp;
143 }
144 //For games that need more than 4MB
145 for (int i = 4; i < 8; i++)
146 {
147 context->mem_pointers[gen->mapper_start_index + i] = gen->cart + 0x40000*gen->bank_regs[i];
148 }
149 }
150 } else {
151 void *new_ptr = gen->cart + 0x40000*value;
152 if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
153 m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);
154 context->mem_pointers[gen->mapper_start_index + address] = new_ptr;
155 }
156 }
157 return context;
158 }
159
160 m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value)
161 {
162 if (address & 1) {
163 write_bank_reg_w(address, context, value);
164 }
165 return context;
166 } 33 }
167 34
168 tern_node *load_rom_db() 35 tern_node *load_rom_db()
169 { 36 {
170 tern_node *db = parse_bundled_config("rom.db"); 37 tern_node *db = parse_bundled_config("rom.db");