2 * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_READSEQ]
10 #include "fm7_mainmem.h"
12 uint8_t FM7_MAINMEM::read_data_tbl(uint32_t addr, bool dmamode)
14 uint32_t paddr = addr >> 7;
15 if(data_table[paddr].read_data != NULL) {
16 return data_table[paddr].read_data[addr & 0x7f];
17 } else if(data_table[paddr].read_func != NULL) {
18 uint8_t (FM7_MAINMEM::*read_func)(uint32_t, bool);
19 read_func = this->data_table[paddr].read_func;
20 return (this->*read_func)(addr, dmamode);
25 uint8_t FM7_MAINMEM::read_data(uint32_t addr, bool dmamode)
31 stat = window_convert(addr, &raddr);
32 #if defined(_FM77AV_VARIANTS)
34 return fm7_mainmem_mmrbank_0[raddr & 0xffff];
36 #elif defined(_FM77_VARIANTS)
38 if((extram_pages >= 3) && (fm7_mainmem_extram != NULL)) {
39 return fm7_mainmem_extram[raddr];
47 uint32_t segment = 0x00;
48 uint32_t raddr = (addr & 0x0fff);
51 if(!dmamode) segment = mmr_segment;
53 return read_with_mmr(addr, segment, dmamode);
56 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x03) << 4)] & 0x003f;
58 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x07) << 4)];
61 // Bank 3x : Standard memories.
63 raddr = (mmr_bank << 12) | raddr;
64 return read_data_tbl(raddr, dmamode);
66 # ifdef _FM77AV_VARIANTS
67 else if(mmr_bank == 0x3f) {
68 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
71 raddr = raddr | 0x3f000;
72 return read_data_tbl(raddr, dmamode);
75 # elif defined(_FM77_VARIANTS)
76 else if(mmr_bank == 0x3f) {
77 if((raddr >= 0xc00) && (raddr < 0xe00)) {
81 raddr = raddr - 0xc00;
82 return fm77_shadowram[raddr];
84 } else if(raddr >= 0xe00) {
85 raddr = raddr - 0x0e00;
87 if(diag_load_bootrom_mmr) {
88 return fm7_bootroms[2][raddr];
90 return fm7_bootroms[0][raddr];
93 return fm7_bootram[raddr];
96 raddr = raddr | 0x3f000;
97 return read_data_tbl(raddr, dmamode);
103 raddr = 0x30000 | (addr & 0xffff);
104 return read_data_tbl(raddr, dmamode);
109 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77_VARIANTS)
110 uint32_t raddr = (addr & 0xffff);
111 return read_data_tbl(raddr, dmamode);
113 uint32_t raddr = (addr & 0xffff) | 0x30000;
114 return read_data_tbl(raddr, dmamode);
118 uint32_t FM7_MAINMEM::read_data8_main(uint32_t addr, bool dmamode)
122 #ifdef _FM77AV_VARIANTS
123 if(initiator_enabled) {
124 if((addr >= 0x6000) && (addr < 0x8000)) {
125 uint32_t raddr = addr - 0x6000;
126 return fm7_mainmem_initrom[raddr];
128 if((addr >= 0xfffe) && (addr < 0x10000)) {
129 uint32_t raddr = addr - 0xe000;
130 //printf("%04x %02x\n", raddr, fm7_mainmem_initrom[raddr]);
131 return fm7_mainmem_initrom[raddr];
135 return read_data(addr, dmamode);
139 uint8_t FM7_MAINMEM::read_shared_ram(uint32_t realaddr, bool dmamode)
141 realaddr = realaddr & 0x7f;
142 if(!sub_halted) return 0xff; // Not halt
143 return display->read_data8(realaddr + 0xd380); // Okay?
146 uint8_t FM7_MAINMEM::read_direct_access(uint32_t realaddr, bool dmamode)
148 #if defined(_FM77AV_VARIANTS)
149 if(!sub_halted) return 0xff; // Not halt
151 return display->read_dma_data8(realaddr & 0xffff); // Okay?
153 return display->read_data8(realaddr & 0xffff); // Okay?
160 uint8_t FM7_MAINMEM::read_ura_basicrom(uint32_t addr, bool dmamode)
162 addr = addr & 0x7fff;
164 return fm7_mainmem_basicrom[addr];
166 return fm7_mainmem_ura[addr];
169 uint8_t FM7_MAINMEM::read_mmio(uint32_t addr, bool dmamode)
174 return mainio->read_data8(addr);
179 uint8_t FM7_MAINMEM::read_bootrom(uint32_t addr, bool dmamode)
184 #if defined(_FM77AV_VARIANTS)
185 return fm7_bootram[addr];
192 return fm7_bootroms[bootmode][addr];
194 # if defined(_FM77_VARIANTS)
196 return fm7_bootram[addr];
200 return fm7_bootroms[0][addr];
204 } else if (addr < 0x1fe) { // VECTOR
205 return fm7_mainmem_bootrom_vector[addr - 0x1e0];
207 #if defined(_FM77AV_VARIANTS)
210 return fm7_bootram[addr];
214 return fm7_mainmem_reset_vector[addr & 1];