comparison sega_mapper.c @ 2234:b6fdedd3b070

Fix SRAM endianness for word-wide SRAM combined with Sega mapper
author Michael Pavone <pavone@retrodev.com>
date Sun, 11 Sep 2022 15:04:42 -0700
parents 3748a2a8a4b7
children b9cd3c64652d
comparison
equal deleted inserted replaced
2233:54cd40fc0da5 2234:b6fdedd3b070
1 #include "genesis.h" 1 #include "genesis.h"
2 #include "util.h" 2 #include "util.h"
3 3
4 uint16_t read_sram_w(uint32_t address, m68k_context * context) 4 uint16_t read_sram_w(uint32_t address, m68k_context * context)
5 {
6 genesis_context * gen = context->system;
7 address &= gen->save_ram_mask;
8 uint16_t *word_storage = (uint16_t *)gen->save_storage;
9 switch(gen->save_type)
10 {
11 case RAM_FLAG_BOTH:
12 return word_storage[address >> 1];
13 case RAM_FLAG_EVEN:
14 return gen->save_storage[address >> 1] << 8 | 0xFF;
15 case RAM_FLAG_ODD:
16 return gen->save_storage[address >> 1] | 0xFF00;
17 }
18 return 0xFFFF;//We should never get here
19 }
20
21 uint8_t read_sram_b(uint32_t address, m68k_context * context)
5 { 22 {
6 genesis_context * gen = context->system; 23 genesis_context * gen = context->system;
7 address &= gen->save_ram_mask; 24 address &= gen->save_ram_mask;
8 switch(gen->save_type) 25 switch(gen->save_type)
9 { 26 {
10 case RAM_FLAG_BOTH: 27 case RAM_FLAG_BOTH:
11 return gen->save_storage[address] << 8 | gen->save_storage[address+1]; 28 return gen->save_storage[address ^ 1];
12 case RAM_FLAG_EVEN:
13 return gen->save_storage[address >> 1] << 8 | 0xFF;
14 case RAM_FLAG_ODD:
15 return gen->save_storage[address >> 1] | 0xFF00;
16 }
17 return 0xFFFF;//We should never get here
18 }
19
20 uint8_t read_sram_b(uint32_t address, m68k_context * context)
21 {
22 genesis_context * gen = context->system;
23 address &= gen->save_ram_mask;
24 switch(gen->save_type)
25 {
26 case RAM_FLAG_BOTH:
27 return gen->save_storage[address];
28 case RAM_FLAG_EVEN: 29 case RAM_FLAG_EVEN:
29 if (address & 1) { 30 if (address & 1) {
30 return 0xFF; 31 return 0xFF;
31 } else { 32 } else {
32 return gen->save_storage[address >> 1]; 33 return gen->save_storage[address >> 1];
51 context->mem_pointers[gen->mapper_start_index + bank][address >> 1] = value; 52 context->mem_pointers[gen->mapper_start_index + bank][address >> 1] = value;
52 } 53 }
53 return context; 54 return context;
54 } 55 }
55 if ((gen->bank_regs[0] & 0x3) == 1) { 56 if ((gen->bank_regs[0] & 0x3) == 1) {
57 uint16_t *word_storage = (uint16_t *)gen->save_storage;
56 address &= gen->save_ram_mask; 58 address &= gen->save_ram_mask;
57 switch(gen->save_type) 59 switch(gen->save_type)
58 { 60 {
59 case RAM_FLAG_BOTH: 61 case RAM_FLAG_BOTH:
60 gen->save_storage[address] = value >> 8; 62 word_storage[address >> 1] = value;
61 gen->save_storage[address+1] = value;
62 break; 63 break;
63 case RAM_FLAG_EVEN: 64 case RAM_FLAG_EVEN:
64 gen->save_storage[address >> 1] = value >> 8; 65 gen->save_storage[address >> 1] = value >> 8;
65 break; 66 break;
66 case RAM_FLAG_ODD: 67 case RAM_FLAG_ODD:
77 if ((gen->bank_regs[0] & 0x3) == 1) { 78 if ((gen->bank_regs[0] & 0x3) == 1) {
78 address &= gen->save_ram_mask; 79 address &= gen->save_ram_mask;
79 switch(gen->save_type) 80 switch(gen->save_type)
80 { 81 {
81 case RAM_FLAG_BOTH: 82 case RAM_FLAG_BOTH:
82 gen->save_storage[address] = value; 83 gen->save_storage[address ^ 1] = value;
83 break; 84 break;
84 case RAM_FLAG_EVEN: 85 case RAM_FLAG_EVEN:
85 if (!(address & 1)) { 86 if (!(address & 1)) {
86 gen->save_storage[address >> 1] = value; 87 gen->save_storage[address >> 1] = value;
87 } 88 }