yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
memory.cc
Go to the documentation of this file.
2
3#include <cstdint>
4#include <vector>
5
6namespace yaze {
7namespace emu {
8
9void MemoryImpl::Initialize(const std::vector<uint8_t>& rom_data,
10 bool verbose) {
11 verbose_ = verbose;
12 type_ = 1;
13
14 auto location = 0x7FC0; // GetHeaderOffset();
15 rom_size_ = 0x400 << rom_data[location + 0x17];
16 sram_size_ = 0x400 << rom_data[location + 0x18];
17 rom_.resize(rom_size_);
18
19 // Copy memory into rom_
20 std::copy(rom_data.begin(), rom_data.begin() + rom_size_, rom_.begin());
21 ram_.resize(sram_size_);
22 std::fill(ram_.begin(), ram_.end(), 0);
23
24 // Clear memory
25 memory_.resize(0x1000000); // 16 MB
26 std::fill(memory_.begin(), memory_.end(), 0);
27
28 // Load ROM data into memory based on LoROM mapping
29 size_t rom_data_size = rom_data.size();
30 size_t rom_address = 0;
31 const size_t ROM_CHUNK_SIZE = 0x8000; // 32 KB
32 for (size_t bank = 0x00; bank <= 0x3F; ++bank) {
33 for (size_t offset = 0x8000; offset <= 0xFFFF; offset += ROM_CHUNK_SIZE) {
34 if (rom_address < rom_data_size) {
35 std::copy(rom_data.begin() + rom_address,
36 rom_data.begin() + rom_address + ROM_CHUNK_SIZE,
37 memory_.begin() + (bank << 16) + offset);
38 rom_address += ROM_CHUNK_SIZE;
39 }
40 }
41 }
42}
43
44uint8_t MemoryImpl::cart_read(uint8_t bank, uint16_t adr) {
45 switch (type_) {
46 case 0:
47 return open_bus_;
48 case 1:
49 return cart_readLorom(bank, adr);
50 case 2:
51 return cart_readHirom(bank, adr);
52 case 3:
53 return cart_readExHirom(bank, adr);
54 }
55 return open_bus_;
56}
57
58void MemoryImpl::cart_write(uint8_t bank, uint16_t adr, uint8_t val) {
59 switch (type_) {
60 case 0:
61 break;
62 case 1:
63 cart_writeLorom(bank, adr, val);
64 break;
65 case 2:
66 cart_writeHirom(bank, adr, val);
67 break;
68 case 3:
69 cart_writeHirom(bank, adr, val);
70 break;
71 }
72}
73
74uint8_t MemoryImpl::cart_readLorom(uint8_t bank, uint16_t adr) {
75 if (((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 &&
76 sram_size_ > 0) {
77 // banks 70-7e and f0-ff, adr 0000-7fff
78 return ram_[(((bank & 0xf) << 15) | adr) & (sram_size_ - 1)];
79 }
80 bank &= 0x7f;
81 if (adr >= 0x8000 || bank >= 0x40) {
82 // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff
83 return rom_[((bank << 15) | (adr & 0x7fff)) & (rom_size_ - 1)];
84 }
85 return open_bus_;
86}
87
88void MemoryImpl::cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val) {
89 if (((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && adr < 0x8000 &&
90 sram_size_ > 0) {
91 // banks 70-7e and f0-ff, adr 0000-7fff
92 ram_[(((bank & 0xf) << 15) | adr) & (sram_size_ - 1)] = val;
93 }
94}
95
96uint8_t MemoryImpl::cart_readHirom(uint8_t bank, uint16_t adr) {
97 bank &= 0x7f;
98 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
99 // banks 00-3f and 80-bf, adr 6000-7fff
100 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)];
101 }
102 if (adr >= 0x8000 || bank >= 0x40) {
103 // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff
104 return rom_[(((bank & 0x3f) << 16) | adr) & (rom_size_ - 1)];
105 }
106 return open_bus_;
107}
108
109uint8_t MemoryImpl::cart_readExHirom(uint8_t bank, uint16_t adr) {
110 if ((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
111 // banks 00-3f and 80-bf, adr 6000-7fff
112 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)];
113 }
114 bool secondHalf = bank < 0x80;
115 bank &= 0x7f;
116 if (adr >= 0x8000 || bank >= 0x40) {
117 // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff
118 return rom_[(((bank & 0x3f) << 16) | (secondHalf ? 0x400000 : 0) | adr) &
119 (rom_size_ - 1)];
120 }
121 return open_bus_;
122}
123
124void MemoryImpl::cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val) {
125 bank &= 0x7f;
126 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
127 // banks 00-3f and 80-bf, adr 6000-7fff
128 ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)] = val;
129 }
130}
131
132uint32_t MemoryImpl::GetMappedAddress(uint32_t address) const {
133 uint8_t bank = address >> 16;
134 uint32_t offset = address & 0xFFFF;
135
136 if (bank <= 0x3F) {
137 if (address <= 0x1FFF) {
138 return (0x7E << 16) + offset; // Shadow RAM
139 } else if (address <= 0x5FFF) {
140 return (bank << 16) + (offset - 0x2000) + 0x2000; // Hardware Registers
141 } else if (address <= 0x7FFF) {
142 return offset - 0x6000 + 0x6000; // Expansion RAM
143 } else {
144 // Return lorom mapping
145 return (bank << 16) + (offset - 0x8000) + 0x8000; // ROM
146 }
147 } else if (bank == 0x7D) {
148 return offset + 0x7D0000; // SRAM
149 } else if (bank == 0x7E || bank == 0x7F) {
150 return offset + 0x7E0000; // System RAM
151 } else if (bank >= 0x80) {
152 // Handle HiROM and mirrored areas
153 }
154
155 return address; // Return the original address if no mapping is defined
156}
157
158} // namespace emu
159} // namespace yaze
std::vector< uint8_t > rom_
Definition memory.h:285
std::vector< uint8_t > ram_
Definition memory.h:286
uint8_t cart_readHirom(uint8_t bank, uint16_t adr)
Definition memory.cc:96
uint32_t GetMappedAddress(uint32_t address) const
Definition memory.cc:132
uint8_t cart_read(uint8_t bank, uint16_t adr)
Definition memory.cc:44
std::vector< uint8_t > memory_
Definition memory.h:323
void cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:88
uint8_t cart_readLorom(uint8_t bank, uint16_t adr)
Definition memory.cc:74
uint8_t cart_readExHirom(uint8_t bank, uint16_t adr)
Definition memory.cc:109
void cart_write(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:58
void cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:124
void Initialize(const std::vector< uint8_t > &romData, bool verbose=false)
Definition memory.cc:9
uint32_t sram_size_
Definition memory.h:301
SNES Emulation and debugging tools.
Definition apu.cc:13
Main namespace for the application.
Definition controller.cc:18