Mercurial > repos > blastem
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 } |