2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #include "fm7_mainmem.h"
11 int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr)
13 if(realaddr == NULL) return -1; // Not effect.
17 return FM7_MAINMEM_OMOTE;
21 *realaddr = addr - 0x8000;
22 if(mainio->get_rommode_fd0f() == true) return FM7_MAINMEM_BASICROM;
23 return FM7_MAINMEM_URA;
26 *realaddr = addr - 0xfc00;
27 return FM7_MAINMEM_BIOSWORK;
30 *realaddr = addr - 0xfc80;
31 return FM7_MAINMEM_SHAREDRAM;
35 *realaddr = addr - 0xfd00;
36 return FM7_MAINMEM_MMIO;
39 if(addr < 0xffe0) mainio->wait();
40 *realaddr = addr - 0xfe00;
41 //if(mainio->get_boot_romram() != true) return FM7_MAINMEM_BOOTROM_RAM;
42 switch(dipsw->get_boot_mode()) {
43 case FM7_BOOTMODE_BASIC:
44 return FM7_MAIMEM_BOOTROM_BAS;
46 case FM7_BOOTMODE_DOS:
47 return FM7_MAIMEM_BOOTROM_DOS;
49 case FM7_BOOTMODE_ROM3:
50 return FM7_MAIMEM_BOOTROM_ROM3;
53 return FM7_MAINMEM_BOOTROM_BAS; // Really?
58 *realaddr = addr - 0xfff0;
59 return FM7_MAINMEM_VECTOR;
63 *realaddr = addr - 0xfffe;
64 return FM7_MAINMEM_VECTOR_RESET;
71 uint32 FM7_MAINMEM::read_data8(uint32 addr)
77 bank = getbank(addr, &realaddr);
78 if(bank < 0) return 0xff; // Illegal
80 if(read_table[bank].dev != NULL) {
81 return read_table[bank].dev->read_memory_mapped_io8(realaddr);
83 if(read_table[bank].memory != NULL) {
84 return read_table[bank].memory[realaddr];
90 void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
96 bank = getbank(addr, &realaddr);
97 if(bank < 0) return; // Illegal
99 if(write_table[bank].dev != NULL) {
100 write_table[bank].dev->write_memory_mapped_io8(realaddr, data);
102 if(write_table[bank].memory != NULL) {
103 write_table[bank].memory[realaddr] = (uint8)(data & 0x000000ff);
108 // Read / Write data(s) as big endian.
109 uint32 FM7_MAINMEM::read_data16(uint32 addr)
114 hi = read_data8(addr) & 0xff;
115 lo = read_data8(addr + 1) & 0xff;
121 uint32 FM7_MAINMEM::read_data32(uint32 addr)
123 uint32 ah, a2, a3, al;
126 ah = read_data8(addr) & 0xff;
127 a2 = read_data8(addr + 1) & 0xff;
128 a3 = read_data8(addr + 2) & 0xff;
129 al = read_data8(addr + 3) & 0xff;
131 val = ah * (65536 * 256) + a2 * 65536 + a3 * 256 + al;
135 void FM7_MAINMEM::write_data16(uint32 addr, uint32 data)
139 write_data8(addr + 1, d & 0xff);
141 write_data8(addr + 0, d & 0xff);
144 void FM7_MAINMEM::write_data32(uint32 addr, uint32 data)
148 write_data8(addr + 3, d & 0xff);
150 write_data8(addr + 2, d & 0xff);
152 write_data8(addr + 1, d & 0xff);
154 write_data8(addr + 0, d & 0xff);
158 bool FM7_MAINMEM::get_loadstat_basicrom(void)
160 return diag_load_basicrom;
163 bool FM7_MAINMEM::get_loadstat_bootrom_bas(void)
165 return diag_load_bootrom_bas;
168 bool FM7_MAINMEM::get_loadstat_bootrom_dos(void)
170 return diag_load_bootrom_dos;
173 uint32 FM7_MAINMEM::read_bios(const char *name, uint8 *ptr, uint32 size)
179 if((name == NULL) || (ptr == NULL)) return 0;
181 if(s == NULL) return 0;
183 if(!fio.Fopen(s, FILEIO_READ_BINARY)) return 0;
184 blocks = fio.Fread(s, size, 1);
187 return blocks * size;
190 FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : MEMORY(parent_vm, parent_emu)
195 for(i = 0; i < 4; i++) fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS] = malloc(0x200);
198 FM7_MAINMEM::~FM7_MAINMEM()
201 for(i = 0; i < 4; i++) {
202 if(fm7_bootroms[i] != NULL) free(fm7_bootroms[i]);
203 fm7_bootroms[i] = NULL;
207 void FM7_MAINMEM::initialize()
212 i = FM7_MAINMEM_OMOTE;
213 memset(fm7_maimem_omote, 0x00, 0x8000 * sizeof(uint8));
214 read_table[i].dev = NULL;
215 read_table[i].memory = fm7_mainmem_omote;
216 write_table[i].dev = NULL;
217 write_table[i].memory = fm7_mainmem_omote;
222 memset(fm7_maimem_ura, 0x00, 0x7c00 * sizeof(uint8));
223 read_table[i].dev = NULL;
224 read_table[i].memory = fm7_mainmem_ura;
225 write_table[i].dev = NULL;
226 write_table[i].memory = fm7_mainmem_ura;
229 i = FM7_MAINMEM_BASICROM;
230 memset(fm7_maimem_basicrom, 0xff, 0x7c00 * sizeof(uint8));
231 read_table[i].dev = NULL;
232 read_table[i].memory = fm7_mainmem_basicrom;
233 write_table[i].dev = NULL;
234 write_table[i].memory = write_dummy;
235 if(read_bios("FBASIC30.ROM", read_table[i].memory, 0x7c00) == 0x7c00) diag_load_basicrom = true;
237 i = FM7_MAINMEM_BIOSWORK;
238 memset(fm7_maimem_bioswork, 0x00, 0x80 * sizeof(uint8));
239 read_table[i].dev = NULL;
240 read_table[i].memory = fm7_mainmem_bioswork;
241 write_table[i].dev = NULL;
242 write_table[i].memory = fm7_mainmem_bioswork;
244 i = FM7_MAINMEM_SHAREDRAM;
245 read_table[i].dev = sharedram;
246 read_table[i].memory = NULL;
247 write_table[i].dev = sharedram;
248 write_table[i].memory = NULL;
250 i = FM7_MAINMEM_MMIO;
251 read_table[i].dev = fm7_io_main;
252 read_table[i].memory = NULL;
253 write_table[i].dev = fm7_io_main;
254 write_table[i].memory = NULL;
256 for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_RAM; i++) {
257 memset(fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS], 0x00, 0x200);
258 read_table[i].dev = NULL;
259 read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS];
260 write_table[i].dev = NULL;
261 write_table[i].memory = write_dummy;
263 if(read_bios("BOOT_BAS.ROM", read_table[FM7_MAINMEM_BOOTROM_BAS].memory, 0x200) == 0x200) diag_load_bootrom_bas = true;
264 if(read_bios("BOOT_DOS.ROM", read_table[FM7_MAINMEM_BOOTROM_DOS].memory, 0x200) == 0x200) diag_load_bootrom_dos = true;
265 write_table[FM7_BAINMEM_BOOTROM_RAM].memory = read_table[FM7_BAINMEM_BOOTROM_RAM].memory; // Write enabled on BOOTRAM.
267 i = FM7_MAINMEM_VECTOR;
268 memset(fm7_mainmem_bootrom_vector, 0x00, 0x0e);
269 read_table[i].dev = NULL;
270 read_table[i].memory = fm7_mainmem_bootrom_vector;
271 write_table[i].dev = NULL;
272 write_table[i].memory = fm7_mainmem_bootrom_vector;
274 i = FM7_MAINMEM_VECTOR_RESET;
275 read_table[i].dev = NULL;
276 read_table[i].memory = fm7_mainmem_resetvector;
277 write_table[i].dev = NULL;
278 write_table[i].memory = write_dummy;