2 * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_READSEQ]
10 #include "fm7_mainmem.h"
11 #include "fm7_mainio.h"
12 #include "fm7_display.h"
17 uint8_t FM7_MAINMEM::read_data_tbl(uint32_t addr, bool dmamode)
19 uint32_t paddr = addr >> 7;
20 if(data_table[paddr].read_data != NULL) {
21 return data_table[paddr].read_data[addr & 0x7f];
22 } else if(data_table[paddr].read_func != NULL) {
23 uint8_t (FM7_MAINMEM::*read_func)(uint32_t, bool);
24 read_func = this->data_table[paddr].read_func;
25 return (this->*read_func)(addr, dmamode);
30 uint8_t FM7_MAINMEM::read_data(uint32_t addr, bool dmamode)
36 stat = window_convert(addr, &raddr);
37 #if defined(_FM77AV_VARIANTS)
39 return fm7_mainmem_mmrbank_0[raddr & 0xffff];
41 #elif defined(_FM77_VARIANTS)
43 if((extram_pages >= 3) && (fm7_mainmem_extram != NULL) && (extram_connected)) {
44 return fm7_mainmem_extram[raddr];
52 uint32_t segment = 0x00;
53 uint32_t raddr = (addr & 0x0fff);
56 if(!dmamode) segment = mmr_segment;
58 return read_with_mmr(addr, segment, dmamode);
61 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x03) << 4)] & 0x003f;
63 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x07) << 4)];
66 // Bank 3x : Standard memories.
68 raddr = (mmr_bank << 12) | raddr;
69 return read_data_tbl(raddr, dmamode);
71 # ifdef _FM77AV_VARIANTS
72 else if(mmr_bank == 0x3f) {
73 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
77 raddr = raddr | 0x3f000;
78 return read_data_tbl(raddr, dmamode);
81 # elif defined(_FM77_VARIANTS)
82 else if(mmr_bank == 0x3f) {
83 if((raddr >= 0xc00) && (raddr < 0xe00)) {
87 raddr = raddr - 0xc00;
88 return fm77_shadowram[raddr];
90 } else if(raddr >= 0xe00) { // Note: Is this right sequence?
91 raddr = raddr - 0x0e00;
93 if(diag_load_bootrom_mmr) {
94 return fm7_bootroms[2][raddr];
96 return fm7_bootroms[0][raddr];
99 return fm7_bootram[raddr];
102 raddr = raddr | 0x3f000;
103 return read_data_tbl(raddr, dmamode);
109 raddr = 0x30000 | (addr & 0xffff);
110 return read_data_tbl(raddr, dmamode);
115 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77_VARIANTS)
116 uint32_t raddr = (addr & 0xffff);
117 return read_data_tbl(raddr, dmamode);
119 uint32_t raddr = (addr & 0xffff) | 0x30000;
120 return read_data_tbl(raddr, dmamode);
124 uint32_t FM7_MAINMEM::read_data8_main(uint32_t addr, bool dmamode)
128 #ifdef _FM77AV_VARIANTS
129 if(initiator_enabled) {
130 if((addr >= 0x6000) && (addr < 0x8000)) {
131 uint32_t raddr = addr - 0x6000;
133 return fm7_mainmem_initrom[raddr];
135 if((addr >= 0xfffe) && (addr < 0x10000)) {
136 uint32_t raddr = addr - 0xe000;
137 //printf("%04x %02x\n", raddr, fm7_mainmem_initrom[raddr]);
139 return fm7_mainmem_initrom[raddr];
143 return read_data(addr, dmamode);
147 uint8_t FM7_MAINMEM::read_shared_ram(uint32_t realaddr, bool dmamode)
149 realaddr = realaddr & 0x7f;
150 if(!sub_halted) return 0xff; // Not halt
151 return call_read_data8(display, realaddr + 0xd380); // Okay?
154 uint8_t FM7_MAINMEM::read_direct_access(uint32_t realaddr, bool dmamode)
156 #if defined(_FM77AV_VARIANTS)
157 if(!sub_halted) return 0xff; // Not halt
159 return call_read_dma_data8(display, realaddr & 0xffff); // Okay?
161 return call_read_data8(display, realaddr & 0xffff); // Okay?
168 uint8_t FM7_MAINMEM::read_ura_basicrom(uint32_t addr, bool dmamode)
170 addr = addr & 0x7fff;
172 return fm7_mainmem_basicrom[addr];
174 return fm7_mainmem_ura[addr];
177 uint8_t FM7_MAINMEM::read_mmio(uint32_t addr, bool dmamode)
182 return call_read_data8(mainio, addr);
187 uint8_t FM7_MAINMEM::read_bootrom(uint32_t addr, bool dmamode)
192 #if defined(_FM77AV_VARIANTS)
193 if(initiator_enabled) iowait();
194 return fm7_bootram[addr];
195 #elif defined(_FM77_VARIANTS)
197 return fm7_bootram[addr];
208 return fm7_bootroms[bootmode][addr];
211 return fm7_bootroms[0][addr];
224 return fm7_bootroms[bootmode][addr];
227 return fm7_bootroms[0][addr];
231 switch(bootmode & 3) {
236 return fm7_bootroms[bootmode][addr];
239 return fm7_bootroms[0][addr];
243 } else if (addr < 0x1fe) { // VECTOR
244 return fm7_mainmem_bootrom_vector[addr - 0x1e0];
245 } else { // RESET VECTOR
246 #if defined(_FM77AV_VARIANTS)
247 if(initiator_enabled) iowait();
248 return fm7_bootram[addr];
249 #elif defined(_FM77_VARIANTS)
252 return fm7_bootram[addr];
254 return fm7_mainmem_reset_vector[addr & 1];
256 return fm7_mainmem_reset_vector[addr & 1];