2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #include "fm7_mainmem.h"
10 int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr)
12 if(realaddr == NULL) return -1; // Not effect.
16 if(window->isenabled() && ((addr >= 0x7c00) && (addr < 0x8000)) { // Window open
17 *realaddr = (addr + window->getwindow() * 256) & 0xffff;
18 if(window->is77av()) return FM7_MAINMEM_AV_PAGE0; // 77AV
19 return FM7_MAINMEM_TVRAM; // FM77
25 if(!mmr->isenabled()) goto _fm7_0;
26 if(addr < 0xfc00) { // MMR Banked
27 mmr_page = mmr->getpage(addr);
28 mmr_offset = addr & 0x0fff;
30 if(mmr->is77av() != true) { // FM77
33 if(extram->isenabled()) { // EXTEND RAM, 192KB.
34 *realaddr = mmr_offset + mmr_page * 0x1000;
35 return FM7_MAINMEM_77EXTRAM;
38 } else if((mmr_page & 0x30) == 0x30) {
39 if(mmr_page == 0x3f) { // $3f000 - $3ffff
40 if(mmr_offset < 0x0c00) {
41 addr = mmr_offset + 0xf000;
44 if((mmr_offset < 0x0e00)) {
45 *realaddr = mmr_offset - 0x0c00;
46 if(mainio->get_rommode_fd0f() == true) {
47 return FM7_MAINMEN_77_NULLRAM;
49 return FM7_MAINMEM_77_SHADOWRAM;
51 addr = mmr_offset + 0xf000;
55 addr = mmr_offset + (mmr_page & 0x0f) * 0x1000;
58 *realaddr = mmr_offset;
61 if((mmr_page & 0x30) == 0x30) { // 77AV RAM/ROM Page1
63 a = (mmr_page & 0x0f) * 0x1000 + mmr_offset;
64 if((a < 0xfd80) && (a > 0xfd97)) { // Okay.
68 // MMR Area is illegal.
72 if(mmr_page < 0x10) { // 77AV RAM PAGE0
73 *realaddr = mmr_page * 0x1000 + mmr_offset;
74 return FM7_MAINMEM_AV_PAGE0;
76 if(mmr_page < 0x20) { // 77AV VRAM
77 *realaddr = ((mmr_page & 0x0f) * 0x1000) + mmr_offset;
78 return FM7_MAINMEM_AV_SUBMEM;
80 if(mmr_page < 0x30) { // 77AV Jcard
82 if(jcard->isenabled()) {
83 *realaddr = ((mmr_page & 0x0f) * 0x1000) + mmr_offset;
84 return FM7_MAINMEM_AV_JCARD;
87 *realaddr = mmr_offset;
90 if(av_extram != NULL) {
91 if(av_extram->isenabled()) {
92 *realaddr = ((mmr_page - 0x40) * 0x1000) + mmr_offset;
93 return FM7_MAINMEM_AV_EXTRAM768K;
104 addr = addr & 0x0ffff;
105 if(mainio->is_initiaterom()) { // Initiate rom enabled, force overwrite vector.
107 *realaddr = addr - 0xe000;
108 return FM7_MAINMEM_AV_INITROM;
110 if((addr >= 0x6000) && (addr < 0x8000)){ // Real addr: $6000 - $7fff
111 *realaddr = addr - 0x6000;
112 return FM7_MAINMEM_AV_INITROM;
117 *realaddr = addr - 0;
118 return FM7_MAINMEM_OMOTE;
122 *realaddr = addr - 0x8000;
123 if(mainio->get_rommode_fd0f() == true) return FM7_MAINMEM_BASICROM;
124 return FM7_MAINMEM_URA;
127 *realaddr = addr - 0xfc00;
128 return FM7_MAINMEM_BIOSWORK;
132 *realaddr = addr - 0xfc80;
133 return FM7_MAINMEM_SHAREDRAM;
136 *realaddr = addr - 0xfd00;
137 return FM7_MAINMEM_MMIO;
140 *realaddr = addr - 0xfe00;
141 if(mainio->get_boot_romram() != true) return FM7_MAINMEM_BOOTROM_RAM;
142 switch(dipsw->get_boot_mode()) {
143 case FM7_BOOTMODE_BASIC:
144 return FM7_MAIMEM_BOOTROM_BAS;
146 case FM7_BOOTMODE_DOS:
147 return FM7_MAIMEM_BOOTROM_DOS;
149 case FM7_BOOTMODE_ROM3:
150 return FM7_MAIMEM_BOOTROM_ROM3;
153 return FM7_MAINMEM_BOOTROM_BAS; // Really?
159 *realaddr = addr - 0xfff0;
160 return FM7_MAINMEM_VECTOR;
163 *realaddr = addr - 0xfffe;
164 return FM7_MAINMEM_VECTOR_RESET;
171 uint32 FM7_MAINMEM::read_data8(uint32 addr)
177 bank = getbank(addr, &realaddr);
178 if(bank < 0) return 0xff; // Illegal
180 if(read_table[bank].dev != NULL) {
181 return read_table[bank].dev->read_memory_mapped_io8(realaddr);
183 if(read_table[bank].memory != NULL) {
184 return read_table[bank].memory[realaddr];
186 return 0xff; // Dummy
191 void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
197 bank = getbank(addr, &realaddr);
198 if(bank < 0) return; // Illegal
200 if(write_table[bank].dev != NULL) {
201 write_table[bank].dev->write_memory_mapped_io8(realaddr, data);
203 if(write_table[bank].memory != NULL) {
204 write_table[bank].memory[realaddr] = (uint8)(data & 0x000000ff);
210 // Read / Write data(s) as big endian.
211 uint32 FM7_MAINMEM::read_data16(uint32 addr)
216 hi = read_data8(addr) & 0xff;
217 lo = read_data8(addr + 1) & 0xff;
223 uint32 FM7_MAINMEM::read_data32(uint32 addr)
225 uint32 ah, a2, a3, al;
228 ah = read_data8(addr) & 0xff;
229 a2 = read_data8(addr + 1) & 0xff;
230 a3 = read_data8(addr + 2) & 0xff;
231 al = read_data8(addr + 3) & 0xff;
233 val = ah * (65536 * 256) + a2 * 65536 + a3 * 256 + al;
237 void FM7_MAINMEM::write_data16(uint32 addr, uint32 data)
241 write_data8(addr + 1, d & 0xff);
243 write_data8(addr + 0, d & 0xff);
247 void FM7_MAINMEM::write_data32(uint32 addr, uint32 data)
251 write_data8(addr + 3, d & 0xff);
253 write_data8(addr + 2, d & 0xff);
255 write_data8(addr + 1, d & 0xff);
257 write_data8(addr + 0, d & 0xff);
262 bool FM7_MAINMEM::get_loadstat_basicrom(void)
264 return diag_load_basicrom;
267 bool FM7_MAINMEM::get_loadstat_bootrom_bas(void)
269 return diag_load_bootrom_bas;
272 bool FM7_MAINMEM::get_loadstat_bootrom_dos(void)
274 return diag_load_bootrom_dos;