2 * Main memory for FM-7 [FM7_MAINMEM/MAINMEM_WRITESEQ]
10 #include "fm7_mainmem.h"
11 #include "fm7_mainio.h"
12 #include "fm7_display.h"
17 void FM7_MAINMEM::write_data_tbl(uint32_t addr, uint32_t data, bool dmamode)
19 uint32_t paddr = addr >> 7;
20 if(data_table[paddr].write_data != NULL) {
21 data_table[paddr].write_data[addr & 0x7f] = (uint8_t)data;
23 } else if(data_table[paddr].write_func != NULL) {
24 void (FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool);
25 write_func = this->data_table[paddr].write_func;
26 (this->*write_func)(addr, data, dmamode);
31 void FM7_MAINMEM::write_shared_ram(uint32_t realaddr, uint32_t data, bool dmamode)
33 realaddr = realaddr & 0x7f;
34 if(!sub_halted) return; // Not halt
35 return call_write_data8(display, realaddr + 0xd380, data); // Okay?
38 void FM7_MAINMEM::write_direct_access(uint32_t realaddr, uint32_t data, bool dmamode)
40 #if defined(_FM77AV_VARIANTS)
41 if(!sub_halted) return; // Not halt
43 call_write_dma_data8(display, realaddr & 0xffff, data); // Okay?
45 call_write_data8(display, realaddr & 0xffff, data); // Okay?
52 void FM7_MAINMEM::write_ura_basicrom(uint32_t addr, uint32_t data, bool dmamode)
58 fm7_mainmem_ura[addr] = (uint8_t)data;
62 void FM7_MAINMEM::write_mmio(uint32_t addr, uint32_t data, bool dmamode)
66 call_write_data8(mainio, addr, data);
70 void FM7_MAINMEM::write_bootrom(uint32_t addr, uint32_t data, bool dmamode)
75 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
77 fm7_bootram[addr] = (uint8_t)data;
81 } else if (addr < 0x1fe) { // VECTOR
82 fm7_mainmem_bootrom_vector[addr - 0x1e0] = (uint8_t)data;
85 else { // RESET VECTOR
86 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
89 fm7_bootram[addr] = (uint8_t)data;
97 void FM7_MAINMEM::write_data(uint32_t addr, uint32_t data, bool dmamode)
103 stat = window_convert(addr, &raddr);
104 #if defined(_FM77AV_VARIANTS)
106 fm7_mainmem_mmrbank_0[raddr & 0xffff] = (uint8_t)data;
109 #elif defined(_FM77_VARIANTS)
111 if((extram_pages >= 3) && (fm7_mainmem_extram != NULL)) {
112 fm7_mainmem_extram[raddr] = (uint8_t)data;;
119 uint32_t segment = 0x00;
120 uint32_t raddr = (addr & 0xfff);
123 if(!dmamode) segment = mmr_segment;
125 write_with_mmr(addr, segment, data, dmamode);
129 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x03) << 4)] & 0x003f;
131 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x07) << 4)];
133 // Reallocated by MMR
134 // Bank 3x : Standard memories.
135 if(mmr_bank != 0x3f){
136 raddr = (mmr_bank << 12) | raddr;
137 write_data_tbl(raddr, data, dmamode);
140 # ifdef _FM77AV_VARIANTS
141 else if(mmr_bank == 0x3f) {
142 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
146 raddr = raddr | 0x3f000;
147 write_data_tbl(raddr, data, dmamode);
151 # elif defined(_FM77_VARIANTS)
152 else if(mmr_bank == 0x3f) {
153 if((raddr >= 0xc00) && (raddr < 0xe00)) {
157 raddr = raddr - 0xc00;
158 fm77_shadowram[raddr] = (uint8_t)data;
161 } else if(raddr >= 0xe00) {
162 raddr = raddr - 0x0e00;
166 fm7_bootram[raddr] = (uint8_t)data;
170 raddr = raddr | 0x3f000;
171 write_data_tbl(raddr, data, dmamode);
178 raddr = 0x30000 | (addr & 0xffff);
179 write_data_tbl(raddr, data, dmamode);
183 #if !defined(_FM77AV_VARIANTS) && !defined(_FM77_VARIANTS)
184 uint32_t raddr = (addr & 0xffff);
185 write_data_tbl(raddr, data, dmamode);
187 uint32_t raddr = (addr & 0xffff) | 0x30000;
188 write_data_tbl(raddr, data, dmamode);
192 void FM7_MAINMEM::write_data8_main(uint32_t addr, uint32_t data, bool dmamode)
194 #ifdef _FM77AV_VARIANTS
195 if(initiator_enabled) {
196 if((addr >= 0x6000) && (addr < 0x8000)) {
198 //uint32_t raddr = addr - 0x6000;
199 //return fm7_mainmen_initrom[raddr];
202 if((addr >= 0xfffe) && (addr < 0x10000)) {
204 //uint32_t raddr = addr - 0xe000;
205 //return fm7_mainmen_initrom[raddr];
210 write_data(addr, data, dmamode);