yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
memory.cc
Go to the documentation of this file.
2
3#include <algorithm>
4#include <cstdint>
5#include <vector>
6
7#include "util/log.h"
8
9namespace yaze {
10namespace emu {
11
12void MemoryImpl::Initialize(const std::vector<uint8_t>& rom_data,
13 bool verbose) {
14 verbose_ = verbose;
15 type_ = 1; // LoROM
16
17 auto location = 0x7FC0; // LoROM header location
18 rom_size_ = 0x400 << rom_data[location + 0x17];
19 sram_size_ = 0x400 << rom_data[location + 0x18];
20
21 // Allocate ROM and SRAM storage
22 rom_.resize(rom_size_);
23 const size_t copy_size = std::min<size_t>(rom_size_, rom_data.size());
24 std::copy(rom_data.begin(), rom_data.begin() + copy_size, rom_.begin());
25
26 ram_.resize(sram_size_);
27 std::fill(ram_.begin(), ram_.end(), 0);
28
29 LOG_DEBUG("Memory", "LoROM initialized: ROM size=$%06X (%zuKB) SRAM size=$%04X",
31 LOG_DEBUG("Memory", "Reset vector at ROM offset $7FFC-$7FFD = $%02X%02X",
32 rom_data[0x7FFD], rom_data[0x7FFC]);
33}
34
35uint8_t MemoryImpl::cart_read(uint8_t bank, uint16_t adr) {
36 // Emulator uses this path for all ROM/cart reads
37 switch (type_) {
38 case 0:
39 return open_bus_;
40 case 1:
41 return cart_readLorom(bank, adr);
42 case 2:
43 return cart_readHirom(bank, adr);
44 case 3:
45 return cart_readExHirom(bank, adr);
46 }
47 return open_bus_;
48}
49
50void MemoryImpl::cart_write(uint8_t bank, uint16_t adr, uint8_t val) {
51 switch (type_) {
52 case 0:
53 break;
54 case 1:
55 cart_writeLorom(bank, adr, val);
56 break;
57 case 2:
58 cart_writeHirom(bank, adr, val);
59 break;
60 case 3:
61 cart_writeHirom(bank, adr, val);
62 break;
63 }
64}
65
66uint8_t MemoryImpl::cart_readLorom(uint8_t bank, uint16_t adr) {
67 // SRAM access: banks 70-7e and f0-ff, addresses 0000-7fff
68 if (((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 &&
69 sram_size_ > 0) {
70 return ram_[(((bank & 0xf) << 15) | adr) & (sram_size_ - 1)];
71 }
72
73 // ROM access: banks 00-7f (mirrored to 80-ff), addresses 8000-ffff
74 // OR banks 40-7f, all addresses
75 bank &= 0x7f;
76 if (adr >= 0x8000 || bank >= 0x40) {
77 uint32_t rom_offset = ((bank << 15) | (adr & 0x7fff)) & (rom_size_ - 1);
78 return rom_[rom_offset];
79 }
80
81 return open_bus_;
82}
83
84void MemoryImpl::cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val) {
85 if (((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && adr < 0x8000 &&
86 sram_size_ > 0) {
87 // banks 70-7e and f0-ff, adr 0000-7fff
88 ram_[(((bank & 0xf) << 15) | adr) & (sram_size_ - 1)] = val;
89 }
90}
91
92uint8_t MemoryImpl::cart_readHirom(uint8_t bank, uint16_t adr) {
93 bank &= 0x7f;
94 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
95 // banks 00-3f and 80-bf, adr 6000-7fff
96 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)];
97 }
98 if (adr >= 0x8000 || bank >= 0x40) {
99 // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff
100 return rom_[(((bank & 0x3f) << 16) | adr) & (rom_size_ - 1)];
101 }
102 return open_bus_;
103}
104
105uint8_t MemoryImpl::cart_readExHirom(uint8_t bank, uint16_t adr) {
106 if ((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
107 // banks 00-3f and 80-bf, adr 6000-7fff
108 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)];
109 }
110 bool secondHalf = bank < 0x80;
111 bank &= 0x7f;
112 if (adr >= 0x8000 || bank >= 0x40) {
113 // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff
114 return rom_[(((bank & 0x3f) << 16) | (secondHalf ? 0x400000 : 0) | adr) &
115 (rom_size_ - 1)];
116 }
117 return open_bus_;
118}
119
120void MemoryImpl::cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val) {
121 bank &= 0x7f;
122 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
123 // banks 00-3f and 80-bf, adr 6000-7fff
124 ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (sram_size_ - 1)] = val;
125 }
126}
127
128uint32_t MemoryImpl::GetMappedAddress(uint32_t address) const {
129 // NOTE: This function is only used by ROM editor via Memory interface.
130 // The emulator core uses cart_read/cart_write instead.
131 // Returns identity mapping for now - full implementation not needed for emulator.
132 return address;
133}
134
135} // namespace emu
136} // 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:92
uint32_t GetMappedAddress(uint32_t address) const
Definition memory.cc:128
uint8_t cart_read(uint8_t bank, uint16_t adr)
Definition memory.cc:35
void cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:84
uint8_t cart_readLorom(uint8_t bank, uint16_t adr)
Definition memory.cc:66
uint8_t cart_readExHirom(uint8_t bank, uint16_t adr)
Definition memory.cc:105
void cart_write(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:50
void cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val)
Definition memory.cc:120
void Initialize(const std::vector< uint8_t > &romData, bool verbose=false)
Definition memory.cc:12
uint32_t sram_size_
Definition memory.h:301
#define LOG_DEBUG(category, format,...)
Definition log.h:104
Main namespace for the application.