2 * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_READSEQ]
9 #include "fm7_mainmem.h"
10 #include "fm7_mainio.h"
11 #include "fm7_display.h"
16 uint8_t FM7_MAINMEM::read_data_tbl(uint32_t addr, bool dmamode)
18 uint32_t paddr = addr >> 7;
19 if(data_table[paddr].read_data != NULL) {
20 return data_table[paddr].read_data[addr & 0x7f];
21 } else if(data_table[paddr].read_func != NULL) {
22 uint8_t (__FASTCALL FM7_MAINMEM::*read_func)(uint32_t, bool);
23 read_func = this->data_table[paddr].read_func;
24 return (this->*read_func)(addr, dmamode);
29 uint8_t FM7_MAINMEM::read_data(uint32_t addr, bool dmamode)
35 stat = window_convert(addr, &raddr);
36 #if defined(_FM77AV_VARIANTS)
38 return fm7_mainmem_mmrbank_0[raddr & 0xffff];
40 #elif defined(_FM77_VARIANTS)
42 if((extram_pages >= 3) && (fm7_mainmem_extram != NULL) && (extram_connected)) {
43 return fm7_mainmem_extram[raddr];
51 uint32_t segment = 0x00;
52 uint32_t raddr = (addr & 0x0fff);
55 if(!dmamode) segment = mmr_segment;
57 return read_with_mmr(addr, segment, dmamode);
60 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x03) << 4)] & 0x003f;
62 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x07) << 4)];
65 // Bank 3x : Standard memories.
67 raddr = (mmr_bank << 12) | raddr;
68 return read_data_tbl(raddr, dmamode);
70 # ifdef _FM77AV_VARIANTS
71 else if(mmr_bank == 0x3f) {
72 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
76 raddr = raddr | 0x3f000;
77 return read_data_tbl(raddr, dmamode);
80 # elif defined(_FM77_VARIANTS)
81 else if(mmr_bank == 0x3f) {
82 if((raddr >= 0xc00) && (raddr < 0xe00)) {
86 raddr = raddr - 0xc00;
87 return fm77_shadowram[raddr];
89 } else if(raddr >= 0xe00) { // Note: Is this right sequence?
90 raddr = raddr - 0x0e00;
92 if(diag_load_bootrom_mmr) {
93 return fm7_bootroms[2][raddr];
95 return fm7_bootroms[0][raddr];
98 return fm7_bootram[raddr];
101 raddr = raddr | 0x3f000;
102 return read_data_tbl(raddr, dmamode);
108 raddr = 0x30000 | (addr & 0xffff);
109 return read_data_tbl(raddr, dmamode);
114 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77_VARIANTS)
115 uint32_t raddr = (addr & 0xffff);
116 return read_data_tbl(raddr, dmamode);
118 uint32_t raddr = (addr & 0xffff) | 0x30000;
119 return read_data_tbl(raddr, dmamode);
123 uint32_t FM7_MAINMEM::read_data8_main(uint32_t addr, bool dmamode)
127 #ifdef _FM77AV_VARIANTS
128 if(initiator_enabled) {
129 if((addr >= 0x6000) && (addr < 0x8000)) {
130 uint32_t raddr = addr - 0x6000;
132 return fm7_mainmem_initrom[raddr];
134 if((addr >= 0xfffe) && (addr < 0x10000)) {
135 uint32_t raddr = addr - 0xe000;
136 //out_debug_log("%04x %02x\n", raddr, fm7_mainmem_initrom[raddr]);
138 return fm7_mainmem_initrom[raddr];
142 return read_data(addr, dmamode);
146 uint8_t FM7_MAINMEM::read_shared_ram(uint32_t realaddr, bool dmamode)
148 realaddr = realaddr & 0x7f;
149 if(!sub_halted) return 0xff; // Not halt
150 return call_read_data8(display, realaddr + 0xd380); // Okay?
153 uint8_t FM7_MAINMEM::read_direct_access(uint32_t realaddr, bool dmamode)
155 #if defined(_FM77AV_VARIANTS)
156 if(!sub_halted) return 0xff; // Not halt
158 return call_read_dma_data8(display, realaddr & 0xffff); // Okay?
160 return call_read_data8(display, realaddr & 0xffff); // Okay?
167 uint8_t FM7_MAINMEM::read_ura_basicrom(uint32_t addr, bool dmamode)
169 addr = addr & 0x7fff;
171 return fm7_mainmem_basicrom[addr];
173 return fm7_mainmem_ura[addr];
176 uint8_t FM7_MAINMEM::read_mmio(uint32_t addr, bool dmamode)
181 return call_read_data8(mainio, addr);
186 uint8_t FM7_MAINMEM::read_bootrom(uint32_t addr, bool dmamode)
191 #if defined(_FM77AV_VARIANTS)
192 if(initiator_enabled) iowait();
193 return fm7_bootram[addr];
194 #elif defined(_FM77_VARIANTS)
196 return fm7_bootram[addr];
207 return fm7_bootroms[bootmode][addr];
210 return fm7_bootroms[0][addr];
223 return fm7_bootroms[bootmode][addr];
226 return fm7_bootroms[0][addr];
230 switch(bootmode & 3) {
235 return fm7_bootroms[bootmode][addr];
238 return fm7_bootroms[0][addr];
242 } else if (addr < 0x1fe) { // VECTOR
243 return fm7_mainmem_bootrom_vector[addr - 0x1e0];
244 } else { // RESET VECTOR
245 #if defined(_FM77AV_VARIANTS)
246 if(initiator_enabled) iowait();
247 return fm7_bootram[addr];
248 #elif defined(_FM77_VARIANTS)
251 return fm7_bootram[addr];
253 return fm7_mainmem_reset_vector[addr & 1];
255 return fm7_mainmem_reset_vector[addr & 1];