comparison sega_mapper.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
children 14a2834d010c
comparison
equal deleted inserted replaced
1414:d94855080529 1415:f7d653bb8899
1 #include "genesis.h"
2
3 uint16_t read_sram_w(uint32_t address, m68k_context * context)
4 {
5 genesis_context * gen = context->system;
6 address &= gen->save_ram_mask;
7 switch(gen->save_type)
8 {
9 case RAM_FLAG_BOTH:
10 return gen->save_storage[address] << 8 | gen->save_storage[address+1];
11 case RAM_FLAG_EVEN:
12 return gen->save_storage[address >> 1] << 8 | 0xFF;
13 case RAM_FLAG_ODD:
14 return gen->save_storage[address >> 1] | 0xFF00;
15 }
16 return 0xFFFF;//We should never get here
17 }
18
19 uint8_t read_sram_b(uint32_t address, m68k_context * context)
20 {
21 genesis_context * gen = context->system;
22 address &= gen->save_ram_mask;
23 switch(gen->save_type)
24 {
25 case RAM_FLAG_BOTH:
26 return gen->save_storage[address];
27 case RAM_FLAG_EVEN:
28 if (address & 1) {
29 return 0xFF;
30 } else {
31 return gen->save_storage[address >> 1];
32 }
33 case RAM_FLAG_ODD:
34 if (address & 1) {
35 return gen->save_storage[address >> 1];
36 } else {
37 return 0xFF;
38 }
39 }
40 return 0xFF;//We should never get here
41 }
42
43 m68k_context * write_sram_area_w(uint32_t address, m68k_context * context, uint16_t value)
44 {
45 genesis_context * gen = context->system;
46 if ((gen->bank_regs[0] & 0x3) == 1) {
47 address &= gen->save_ram_mask;
48 switch(gen->save_type)
49 {
50 case RAM_FLAG_BOTH:
51 gen->save_storage[address] = value >> 8;
52 gen->save_storage[address+1] = value;
53 break;
54 case RAM_FLAG_EVEN:
55 gen->save_storage[address >> 1] = value >> 8;
56 break;
57 case RAM_FLAG_ODD:
58 gen->save_storage[address >> 1] = value;
59 break;
60 }
61 }
62 return context;
63 }
64
65 m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value)
66 {
67 genesis_context * gen = context->system;
68 if ((gen->bank_regs[0] & 0x3) == 1) {
69 address &= gen->save_ram_mask;
70 switch(gen->save_type)
71 {
72 case RAM_FLAG_BOTH:
73 gen->save_storage[address] = value;
74 break;
75 case RAM_FLAG_EVEN:
76 if (!(address & 1)) {
77 gen->save_storage[address >> 1] = value;
78 }
79 break;
80 case RAM_FLAG_ODD:
81 if (address & 1) {
82 gen->save_storage[address >> 1] = value;
83 }
84 break;
85 }
86 }
87 return context;
88 }
89
90 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
91 {
92 genesis_context * gen = context->system;
93 address &= 0xE;
94 address >>= 1;
95 gen->bank_regs[address] = value;
96 if (!address) {
97 if (value & 1) {
98 //Used for games that only use the mapper for SRAM
99 if (context->mem_pointers[gen->mapper_start_index]) {
100 gen->mapper_temp = context->mem_pointers[gen->mapper_start_index];
101 }
102 context->mem_pointers[gen->mapper_start_index] = NULL;
103 //For games that need more than 4MB
104 for (int i = 4; i < 8; i++)
105 {
106 context->mem_pointers[gen->mapper_start_index + i] = NULL;
107 }
108 } else {
109 //Used for games that only use the mapper for SRAM
110 if (!context->mem_pointers[gen->mapper_start_index]) {
111 context->mem_pointers[gen->mapper_start_index] = gen->mapper_temp;
112 }
113 //For games that need more than 4MB
114 for (int i = 4; i < 8; i++)
115 {
116 context->mem_pointers[gen->mapper_start_index + i] = gen->cart + 0x40000*gen->bank_regs[i];
117 }
118 }
119 } else {
120 void *new_ptr = gen->cart + 0x40000*value;
121 if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
122 m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);
123 context->mem_pointers[gen->mapper_start_index + address] = new_ptr;
124 }
125 }
126 return context;
127 }
128
129 m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value)
130 {
131 if (address & 1) {
132 write_bank_reg_w(address, context, value);
133 }
134 return context;
135 }