Mercurial > repos > blastem
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"); |