yaze 0.2.2
Link to the Past ROM Editor
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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