2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #include "fm7_mainmem.h"
11 void FM7_MAINMEM::reset()
16 ioaccess_wait = false;
17 sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true;
19 #if defined(_FM77AV_VARIANTS)
20 memset(fm7_bootram, 0x00, 0x1f0);
21 if((config.boot_mode & 3) == 0) {
22 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1800], 0x1e0 * sizeof(uint8));
24 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1a00], 0x1e0 * sizeof(uint8));
26 fm7_bootram[0x1fe] = 0xfe; // Set reset vector.
27 fm7_bootram[0x1ff] = 0x00; //
28 initiator_enabled = true;
29 boot_ram_write = true;
30 #elif defined(_FM77_VARIANTS)
31 boot_ram_write = false;
33 bootmode = config.boot_mode & 3;
35 if((config.dipswitch & FM7_DIPSW_EXTRAM) != 0) {
36 extram_connected = true;
38 extram_connected = false;
41 #if defined(_FM77AV_VARIANTS)
42 if(dictrom_connected) {
43 use_page2_extram = true;
45 use_page2_extram = ((config.dipswitch & FM7_DIPSW_EXTRAM_AV) != 0) ? true : false;
49 for(i = 0x00; i < 0x80; i++) {
56 window_enabled = false;
58 if(bootmode == 0) { // IF BASIC BOOT THEN ROM
61 basicrom_fd0f = false;
64 clockmode = (config.cpu_type == 0) ? true : false;
65 is_basicrom = (bootmode == 0) ? true : false;
66 //if(bootmode < 4) bootmode = config.boot_mode & 3;
71 void FM7_MAINMEM::wait()
73 int waitfactor; // If MMR of TWR enabled, factor = 3.
74 // If memory, factor = 2?
75 if(!clockmode) return; // SLOW
80 } else { // Not MMR, TWR or enabled FAST MMR mode
81 waitfactor = 3; // If(MMR or TWR) and NOT FAST MMR factor = 3, else factor = 2
82 if(mmr_fast) waitfactor = 2;
83 ioaccess_wait = false;
85 if((window_enabled) &&
86 (mmr_enabled)) waitfactor = 2;
90 if(waitfactor <= 0) return;
92 if(waitcount >= waitfactor) {
93 if(maincpu != NULL) maincpu->set_extra_clock(1);
99 int FM7_MAINMEM::window_convert(uint32 addr, uint32 *realaddr)
103 if((addr < 0x8000) && (addr >= 0x7c00)) {
104 raddr = ((window_offset * 256) + addr) & 0x0ffff;
106 #ifdef _FM77AV_VARIANTS
107 //printf("TWR hit %04x -> %04x\n", addr, raddr);
108 return FM7_MAINMEM_AV_PAGE0; // 0x00000 - 0x0ffff
109 #else // FM77(L4 or others)
110 *realaddr |= 0x20000;
111 return FM7_MAINMEM_EXTRAM; // 0x20000 - 0x2ffff
119 int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr)
121 uint32 raddr = addr & 0x0fff;
126 if(addr >= 0xfc00) return -1;
127 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | (mmr_segment << 4)] & 0x007f;
129 // Reallocated by MMR
130 // Bank 3x : Standard memories.
131 if((mmr_bank < 0x3f) && (mmr_bank >= 0x30)) {
132 raddr = ((mmr_bank << 12) | raddr) & 0xffff;
133 return nonmmr_convert(raddr, realaddr);
135 #ifdef _FM77AV_VARIANTS
136 else if(mmr_bank == 0x3f) {
137 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
139 return FM7_MAINMEM_NULL;
141 raddr = raddr | 0xf000;
142 return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR.
145 #elif defined(_FM77_VARIANTS)
146 else if(mmr_bank == 0x3f) {
147 if((raddr >= 0xc00) && (raddr < 0xe00)) {
150 return FM7_MAINMEM_ZERO;
152 *realaddr = raddr - 0xc00;
153 return FM7_MAINMEM_SHADOWRAM;
155 } else if(raddr >= 0xe00) {
156 *realaddr = addr - 0x0e00;
158 if(diag_load_bootrom_mmr) {
159 return FM7_MAINMEM_BOOTROM_MMR;
161 return FM7_MAINMEM_BOOTROM_BAS;
164 return FM7_MAINMEM_BOOTROM_RAM;
167 raddr = raddr | 0xf000;
168 return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR.
172 major_bank = (mmr_bank >> 4) & 0x0f;
174 #ifdef _FM77AV_VARIANTS
175 if(major_bank == 0x0) { // PAGE 0
176 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
177 return FM7_MAINMEM_AV_PAGE0;
178 } else if(major_bank == 0x1) { // PAGE 1
179 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
180 return FM7_MAINMEM_AV_DIRECTACCESS;
181 } else if(major_bank == 0x2) { // PAGE 2
182 #if defined(CAPABLE_DICTROM)
183 //uint32 dbank = mainio->read_data8(FM7_MAINIO_EXTBANK);
184 uint32 dbank = extbank;
187 case 0x29: // Backuped RAM
188 if(((dbank & 0x80) != 0) && (dictrom_connected)){ // Battery backuped RAM
189 raddr = raddr & 0x1ff;
191 return FM7_MAINMEM_BACKUPED_RAM;
195 if(((dbank & 0x40) != 0) && (dictrom_connected)) { // Dictionary ROM
196 dbank = dbank & 0x3f;
197 uint32 extrom = mainio->read_data8(FM7_MAINIO_EXTROM) & 0x80;
198 //uint32 extrom = extrom_bank;
199 if(extrom == 0) { // Dictionary selected.
201 *realaddr = raddr | dbank;
202 return FM7_MAINMEM_DICTROM;
203 } else if(dbank <= 0x1f) { // KANJI
204 *realaddr = (dbank << 12) | raddr;
205 return FM7_MAINMEM_KANJI_LEVEL1;
206 } else if(dbank <= 0x37) {
208 *realaddr = (dbank - 0x20000) | raddr;
209 return FM7_MAINMEM_77AV40_EXTRAROM;
210 } else if(dbank <= 0x3f) {
211 raddr = ((dbank << 12) - 0x30000) | raddr;
212 if((raddr >= 0xffe0) || (raddr < 0xfd00)) {
213 return nonmmr_convert(raddr, realaddr);
214 } else if((raddr >= 0xfe00) || (raddr < 0xffe0)) {
215 *realaddr = raddr - 0xfe00;
216 return FM7_MAINMEM_BOOTROM_DOS;
218 *realaddr = raddr + 0x10000;
219 return FM7_MAINMEM_77AV40_EXTRAROM;
224 *realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff;
225 return FM7_MAINMEM_AV_PAGE2;
227 //*realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff;
228 if(use_page2_extram) {
229 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
230 return FM7_MAINMEM_AV_PAGE2;
235 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
236 else if(extram_connected) { // PAGE 4-
237 if(major_bank >= (extram_pages + 4)) {
239 return FM7_MAINMEM_NULL; // $FF
241 raddr = ((uint32)(mmr_bank - 0x40) << 12) | raddr;
243 return FM7_MAINMEM_EXTRAM;
246 if(mmr_bank >= 0x40) {
248 return FM7_MAINMEM_NULL;
251 #elif defined(_FM77_VARIANTS)
252 if(extram_connected) { // PAGE 4-
253 if((major_bank > extram_pages) || (major_bank >= 3)) {
255 return FM7_MAINMEM_NULL; // $FF
257 raddr = ((uint32)mmr_bank << 12) | raddr;
259 return FM7_MAINMEM_EXTRAM;
263 return FM7_MAINMEM_NULL; // $FF
265 #else // _FM77AV_VARIANTS
268 return FM7_MAINMEM_NULL; // $FF
276 int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr)
279 #ifdef _FM77AV_VARIANTS
280 if(initiator_enabled) {
281 if((addr >= 0x6000) && (addr < 0x8000)) {
282 //printf("HIT %02x\n", read_table[FM7_MAINMEM_INITROM].memory[addr - 0x6000]);
283 *realaddr = addr - 0x6000;
284 return FM7_MAINMEM_INITROM;
287 //printf("HIT %02x\n", read_table[FM7_MAINMEM_INITROM].memory[addr - 0xe000]);
288 *realaddr = addr - 0xe000;
289 return FM7_MAINMEM_INITROM;
296 return FM7_MAINMEM_OMOTE;
297 } else if(addr < 0xfc00) {
298 *realaddr = addr - 0x8000;
300 return FM7_MAINMEM_BASICROM;
302 return FM7_MAINMEM_URA;
303 } else if(addr < 0xfc80) {
304 *realaddr = addr - 0xfc00;
305 return FM7_MAINMEM_BIOSWORK;
306 }else if(addr < 0xfd00) {
307 *realaddr = addr - 0xfc80;
308 return FM7_MAINMEM_SHAREDRAM;
309 } else if(addr < 0xfe00) {
311 *realaddr = addr - 0xfd00;
312 return FM7_MAINMEM_MMIO;
313 }else if(addr < 0xffe0){
315 *realaddr = addr - 0xfe00;
316 #if defined(_FM77AV_VARIANTS)
317 return FM7_MAINMEM_BOOTROM_RAM;
321 return FM7_MAINMEM_BOOTROM_BAS;
324 //printf("BOOT_DOS ADDR=%04x\n", addr);
325 return FM7_MAINMEM_BOOTROM_DOS;
328 return FM7_MAINMEM_BOOTROM_MMR;
331 return FM7_MAINMEM_BOOTROM_EXTRA;
333 #if defined(_FM77_VARIANTS)
335 return FM7_MAINMEM_BOOTROM_RAM;
339 return FM7_MAINMEM_BOOTROM_BAS; // Really?
343 } else if(addr < 0xfffe) { // VECTOR
344 *realaddr = addr - 0xffe0;
345 return FM7_MAINMEM_VECTOR;
346 } else if(addr < 0x10000) {
347 *realaddr = addr - 0xfffe;
348 return FM7_MAINMEM_RESET_VECTOR;
351 emu->out_debug_log("Main: Over run ADDR = %08x", addr);
353 return FM7_MAINMEM_NULL;
356 int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr)
358 if(realaddr == NULL) return FM7_MAINMEM_NULL; // Not effect.
363 stat = window_convert(addr, &raddr);
364 //if(stat >= 0) printf("WINDOW CONVERT: %04x to %04x, bank = %02x\n", addr, raddr, stat);
373 stat = mmr_convert(addr, &raddr);
375 //printf("MMR CONVERT: %04x to %05x, bank = %02x\n", addr, raddr, stat);
381 addr = addr & 0xffff;
383 return nonmmr_convert(addr, realaddr);
386 void FM7_MAINMEM::write_signal(int sigid, uint32 data, uint32 mask)
388 bool flag = ((data & mask) != 0);
390 case SIG_FM7_SUB_HALT:
393 case FM7_MAINIO_IS_BASICROM:
396 case FM7_MAINIO_PUSH_FD0F:
397 basicrom_fd0f = flag;
399 case FM7_MAINIO_CLOCKMODE:
402 case FM7_MAINIO_BOOTMODE:
403 bootmode = data & 0x07;
405 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
406 case FM7_MAINIO_BOOTRAM_RW:
410 #ifdef _FM77AV_VARIANTS
411 case FM7_MAINIO_INITROM_ENABLED:
412 initiator_enabled = flag;
414 case FM7_MAINIO_EXTBANK:
415 extcard_bank = data & 0xff;
417 case FM7_MAINIO_EXTROM:
418 extrom_bank = data & 0xff;
422 case FM7_MAINIO_WINDOW_ENABLED:
423 window_enabled = flag;
425 case FM7_MAINIO_FASTMMR_ENABLED:
428 case FM7_MAINIO_MMR_ENABLED:
436 uint32 FM7_MAINMEM::read_data8(uint32 addr)
441 bank = getbank(addr, &realaddr);
443 emu->out_debug_log("Illegal BANK: ADDR = %04x", addr);
444 return 0xff; // Illegal
446 if(bank == FM7_MAINMEM_SHAREDRAM) {
447 if(!sub_halted) return 0xff; // Not halt
448 return display->read_data8(realaddr + 0xd380); // Okay?
449 //} else if(bank == FM7_MAINMEM_MMIO) {
450 // return mainio->read_data8(realaddr);
451 } else if(bank == FM7_MAINMEM_NULL) {
454 #if defined(_FM77AV_VARIANTS)
455 else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
456 if(!sub_halted) return 0xff; // Not halt
457 return display->read_data8(realaddr); // Okay?
460 else if(read_table[bank].dev != NULL) {
461 return read_table[bank].dev->read_data8(realaddr);
462 } else if(read_table[bank].memory != NULL) {
463 return read_table[bank].memory[realaddr];
465 return 0xff; // Dummy
468 void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
472 if(addr >= FM7_MAINIO_WINDOW_OFFSET) {
474 case FM7_MAINIO_WINDOW_OFFSET:
475 window_offset = data;
477 case FM7_MAINIO_MMR_SEGMENT:
478 mmr_segment = data & 0x0f;
481 if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 0x80))){
482 mmr_map_data[addr - FM7_MAINIO_MMR_BANK] = (uint8)data;
488 bank = getbank(addr, &realaddr);
490 emu->out_debug_log("Illegal BANK: ADDR = %04x", addr);
493 if(bank == FM7_MAINMEM_SHAREDRAM) {
494 if(!sub_halted) return; // Not halt
495 display->write_data8(realaddr + 0xd380, data); // Okay?
497 //} else if(bank == FM7_MAINMEM_MMIO) {
498 // mainio->write_data8(realaddr, (uint8)data);
500 } else if(bank == FM7_MAINMEM_NULL) {
503 #if defined(_FM77AV_VARIANTS)
504 else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
505 if(!sub_halted) return; // Not halt
506 display->write_data8(realaddr, data); // Okay?
511 else if(bank == FM7_MAINMEM_BOOTROM_RAM) {
512 if(!boot_ram_write) return;
513 write_table[bank].memory[realaddr] = (uint8)data;
517 else if(write_table[bank].dev != NULL) {
518 write_table[bank].dev->write_data8(realaddr, data);
519 } else if(write_table[bank].memory != NULL) {
520 write_table[bank].memory[realaddr] = (uint8)data;
524 // Read / Write data(s) as big endian.
525 uint32 FM7_MAINMEM::read_data16(uint32 addr)
530 hi = read_data8(addr) & 0xff;
531 lo = read_data8(addr + 1) & 0xff;
537 uint32 FM7_MAINMEM::read_data32(uint32 addr)
539 uint32 ah, a2, a3, al;
542 ah = read_data8(addr) & 0xff;
543 a2 = read_data8(addr + 1) & 0xff;
544 a3 = read_data8(addr + 2) & 0xff;
545 al = read_data8(addr + 3) & 0xff;
547 val = ah * (65536 * 256) + a2 * 65536 + a3 * 256 + al;
551 void FM7_MAINMEM::write_data16(uint32 addr, uint32 data)
555 write_data8(addr + 1, d & 0xff);
557 write_data8(addr + 0, d & 0xff);
560 void FM7_MAINMEM::write_data32(uint32 addr, uint32 data)
564 write_data8(addr + 3, d & 0xff);
566 write_data8(addr + 2, d & 0xff);
568 write_data8(addr + 1, d & 0xff);
570 write_data8(addr + 0, d & 0xff);
574 bool FM7_MAINMEM::get_loadstat_basicrom(void)
576 return diag_load_basicrom;
579 bool FM7_MAINMEM::get_loadstat_bootrom_bas(void)
581 return diag_load_bootrom_bas;
584 bool FM7_MAINMEM::get_loadstat_bootrom_dos(void)
586 return diag_load_bootrom_dos;
589 uint32 FM7_MAINMEM::read_bios(const char *name, uint8 *ptr, uint32 size)
595 if((name == NULL) || (ptr == NULL)) return 0;
596 s = emu->bios_path((_TCHAR *)name);
597 if(s == NULL) return 0;
599 if(!fio.Fopen(s, FILEIO_READ_BINARY)) return 0;
600 blocks = fio.Fread(ptr, size, 1);
603 return blocks * size;
606 uint32 FM7_MAINMEM::write_bios(const char *name, uint8 *ptr, uint32 size)
612 if((name == NULL) || (ptr == NULL)) return 0;
613 s = emu->bios_path((_TCHAR *)name);
614 if(s == NULL) return 0;
616 fio.Fopen(s, FILEIO_WRITE_BINARY);
617 blocks = fio.Fwrite(ptr, size, 1);
620 return blocks * size;
623 FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
627 #if !defined(_FM77AV_VARIANTS)
628 for(i = 0; i < 4; i++) fm7_bootroms[i] = (uint8 *)malloc(0x200);
635 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS)
636 fm7_mainmem_extram = NULL;
640 FM7_MAINMEM::~FM7_MAINMEM()
644 void FM7_MAINMEM::initialize(void)
647 diag_load_basicrom = false;
648 diag_load_bootrom_bas = false;
649 diag_load_bootrom_dos = false;
650 diag_load_bootrom_mmr = false;
651 #if defined(_FM77AV_VARIANTS)
652 dictrom_connected = false;
655 for(i = 0x00; i < 0x80; i++) {
662 window_enabled = false;
664 #ifdef _FM77AV_VARIANTS
667 initiator_enabled = true;
668 boot_ram_write = true;
670 bootmode = config.boot_mode & 3;
671 basicrom_fd0f = false;
672 is_basicrom = (bootmode == 0) ? true : false;
675 memset(read_table, 0x00, sizeof(read_table));
676 memset(write_table, 0x00, sizeof(write_table));
677 i = FM7_MAINMEM_OMOTE;
678 memset(fm7_mainmem_omote, 0x00, 0x8000 * sizeof(uint8));
679 read_table[i].memory = fm7_mainmem_omote;
680 write_table[i].memory = fm7_mainmem_omote;
684 memset(fm7_mainmem_ura, 0x00, 0x7c00 * sizeof(uint8));
685 read_table[i].memory = fm7_mainmem_ura;
686 write_table[i].memory = fm7_mainmem_ura;
689 i = FM7_MAINMEM_VECTOR;
690 memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e);
691 read_table[i].memory = fm7_mainmem_bootrom_vector;
692 write_table[i].memory = fm7_mainmem_bootrom_vector;
694 #if defined(CAPABLE_DICTROM)
695 diag_load_dictrom = false;
696 i = FM7_MAINMEM_DICTROM;
697 memset(fm7_mainmem_extrarom, 0xff, 0x40000 * sizeof(uint8));
698 read_table[i].memory = fm7_mainmem_dictrom;
699 write_table[i].memory = NULL;
700 if(read_bios("DICROM.ROM", fm7_mainmem_dictrom, 0x40000) == 0x40000) diag_load_dictrom = true;
701 emu->out_debug_log("DICTIONARY ROM READING : %s", diag_load_dictrom ? "OK" : "NG");
702 dictrom_connected = diag_load_dictrom;
704 i = FM7_MAINMEM_BACKUPED_RAM;
705 diag_load_learndata = false;
706 memset(fm7_mainmem_learndata, 0x00, 0x2000 * sizeof(uint8));
707 read_table[i].memory = fm7_mainmem_learndata;
708 write_table[i].memory = fm7_mainmem_learndata;
709 if(read_bios("USERDIC.DAT", read_table[i].memory, 0x2000) == 0x2000) diag_load_learndata = true;
710 emu->out_debug_log("DICTIONARY ROM READING : %s", diag_load_learndata ? "OK" : "NG");
711 if(!diag_load_learndata) write_bios("USERDIC.DAT", fm7_mainmem_learndata, 0x2000);
714 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20)
715 i = FM7_MAINMEM_77AV40_EXTRAROM;
716 diag_load_extrarom = false;
717 memset(fm7_mainmem_extrarom, 0xff, 0x20000 * sizeof(uint8));
718 read_table[i].memory = fm7_mainmem_extrarom;
719 write_table[i].memory = NULL;
720 if(read_bios("EXTSUB.ROM", read_table[i].memory, 0xc000) >= 0xc000) diag_load_extrarom = true;
721 emu->out_debug_log("AV40 EXTRA ROM READING : %s", diag_load_extrarom ? "OK" : "NG");
724 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS)
725 extram_pages = FM77_EXRAM_BANKS;
726 #if defined(_FM77_VARIANTS)
727 if(extram_pages > 3) extram_pages = 3;
729 if(extram_pages > 12) extram_pages = 12;
731 if(extram_pages > 0) {
732 i = FM7_MAINMEM_EXTRAM;
733 fm7_mainmem_extram = (uint8 *)malloc(extram_pages * 0x10000);
734 if(fm7_mainmem_extram != NULL) {
735 memset(fm7_mainmem_extram, 0x00, extram_pages * 0x10000);
736 read_table[i].memory = fm7_mainmem_extram;
737 write_table[i].memory = fm7_mainmem_extram;
742 #if defined(_FM77_VARIANTS)
743 memset(fm77_shadowram, 0x00, 0x200);
744 read_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram;
745 write_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram;
747 #if !defined(_FM77AV_VARIANTS)
748 for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_EXTRA; i++) {
749 memset(fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS], 0xff, 0x200);
750 read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS];
751 write_table[i].memory = NULL;
755 if(read_bios("BOOT_BAS8.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) {
756 diag_load_bootrom_bas = true;
758 diag_load_bootrom_bas = false;
760 if(read_bios("BOOT_DOS8.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) {
761 diag_load_bootrom_dos = true;
763 diag_load_bootrom_dos = false;
765 diag_load_bootrom_mmr = false;
766 # elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
767 if(read_bios("BOOT_BAS.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) {
768 diag_load_bootrom_bas = true;
770 diag_load_bootrom_bas = false;
772 if(read_bios("BOOT_DOS.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) {
773 diag_load_bootrom_dos = true;
775 diag_load_bootrom_dos = false;
777 # if defined(_FM77_VARIANTS)
778 if(read_bios("BOOT_MMR.ROM", fm7_bootroms[2], 0x200) >= 0x1e0) {
779 diag_load_bootrom_mmr = true;
781 diag_load_bootrom_mmr = false;
784 i = FM7_MAINMEM_BOOTROM_RAM;
785 memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM
786 read_table[i].memory = fm7_bootram;
787 write_table[i].memory = fm7_bootram;
790 diag_load_bootrom_mmr = false;
792 # elif defined(_FM77AV_VARIANTS)
793 i = FM7_MAINMEM_AV_PAGE0;
794 memset(fm7_mainmem_mmrbank_0, 0x00, 0x10000 * sizeof(uint8));
795 read_table[i].memory = fm7_mainmem_mmrbank_0;
796 write_table[i].memory = fm7_mainmem_mmrbank_0;
798 i = FM7_MAINMEM_AV_PAGE2;
799 memset(fm7_mainmem_mmrbank_2, 0x00, 0x10000 * sizeof(uint8));
800 read_table[i].memory = fm7_mainmem_mmrbank_2;
801 write_table[i].memory = fm7_mainmem_mmrbank_2;
803 i = FM7_MAINMEM_INITROM;
804 diag_load_initrom = false;
805 memset(fm7_mainmem_initrom, 0xff, 0x2000 * sizeof(uint8));
806 read_table[i].memory = fm7_mainmem_initrom;
807 write_table[i].memory = NULL;
808 if(read_bios("INITIATE.ROM", read_table[i].memory, 0x2000) >= 0x2000) diag_load_initrom = true;
809 emu->out_debug_log("77AV INITIATOR ROM READING : %s", diag_load_initrom ? "OK" : "NG");
811 read_table[FM7_MAINMEM_BOOTROM_BAS].memory = NULL; // Not connected.
812 read_table[FM7_MAINMEM_BOOTROM_DOS].memory = NULL; // Not connected.
813 read_table[FM7_MAINMEM_BOOTROM_MMR].memory = NULL; // Not connected.
815 i = FM7_MAINMEM_BOOTROM_RAM;
816 memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM
817 read_table[i].memory = fm7_bootram;
818 write_table[i].memory = fm7_bootram;
819 if(diag_load_initrom) diag_load_bootrom_bas = true;
820 if(diag_load_initrom) diag_load_bootrom_dos = true;
821 if((config.boot_mode & 0x03) == 0) {
822 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1800], 0x1e0 * sizeof(uint8));
824 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1a00], 0x1e0 * sizeof(uint8));
826 fm7_bootram[0x1fe] = 0xfe; // Set reset vector.
827 fm7_bootram[0x1ff] = 0x00; //
830 emu->out_debug_log("BOOT ROM (basic mode) READING : %s", diag_load_bootrom_bas ? "OK" : "NG");
831 emu->out_debug_log("BOOT ROM (DOS mode) READING : %s", diag_load_bootrom_dos ? "OK" : "NG");
832 #if defined(_FM77_VARIANTS)
833 emu->out_debug_log("BOOT ROM (MMR mode) READING : %s", diag_load_bootrom_mmr ? "OK" : "NG");
836 i = FM7_MAINMEM_VECTOR;
837 memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e);
838 read_table[i].memory = fm7_mainmem_bootrom_vector;
839 write_table[i].memory = fm7_mainmem_bootrom_vector;
841 #if !defined(_FM77AV_VARIANTS)
842 for(i = 0; i <= 3; i++) {
843 uint8 *p = fm7_bootroms[i];
844 p[0x1fe] = 0xfe; // Set reset vector.
848 i = FM7_MAINMEM_RESET_VECTOR;
849 fm7_mainmem_reset_vector[0] = 0xfe;
850 fm7_mainmem_reset_vector[1] = 0x00;
852 read_table[i].memory = fm7_mainmem_reset_vector;
853 write_table[i].memory = NULL;
855 i = FM7_MAINMEM_BASICROM;
856 memset(fm7_mainmem_basicrom, 0xff, 0x7c00 * sizeof(uint8));
857 read_table[i].dev = NULL;
858 read_table[i].memory = fm7_mainmem_basicrom;
859 write_table[i].dev = NULL;
860 write_table[i].memory = NULL;
862 if(read_bios("FBASIC302.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
863 diag_load_basicrom = true;
864 } else if(read_bios("FBASIC300.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
865 diag_load_basicrom = true;
866 } else if(read_bios("FBASIC30.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
867 diag_load_basicrom = true;
871 if(read_bios("FBASIC10.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) diag_load_basicrom = true;
873 emu->out_debug_log("BASIC ROM READING : %s", diag_load_basicrom ? "OK" : "NG");
875 i = FM7_MAINMEM_BIOSWORK;
876 memset(fm7_mainmem_bioswork, 0x00, 0x80 * sizeof(uint8));
877 read_table[i].dev = NULL;
878 read_table[i].memory = fm7_mainmem_bioswork;
879 write_table[i].dev = NULL;
880 write_table[i].memory = fm7_mainmem_bioswork;
883 void FM7_MAINMEM::release()
885 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS)
886 if(fm7_mainmem_extram != NULL) free(fm7_mainmem_extram);
888 #if !defined(_FM77AV_VARIANTS)
890 for(i = 0; i < 4; i++) {
891 if(fm7_bootroms[i] != NULL) free(fm7_bootroms[i]);
892 fm7_bootroms[i] = NULL;
895 // MEMORY::release();
898 #define STATE_VERSION 2
899 void FM7_MAINMEM::save_state(FILEIO *state_fio)
901 state_fio->FputUint32_BE(STATE_VERSION);
902 state_fio->FputInt32_BE(this_device_id);
905 state_fio->FputBool(ioaccess_wait);
906 state_fio->FputInt32_BE(waitfactor);
907 state_fio->FputInt32_BE(waitcount);
909 state_fio->FputBool(sub_halted);
911 state_fio->FputBool(diag_load_basicrom);
912 state_fio->FputBool(diag_load_bootrom_bas);
913 state_fio->FputBool(diag_load_bootrom_dos);
914 state_fio->FputBool(diag_load_bootrom_mmr);
915 state_fio->Fwrite(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
916 state_fio->Fwrite(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
917 state_fio->Fwrite(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1);
918 state_fio->Fwrite(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1);
919 state_fio->Fwrite(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1);
920 state_fio->Fwrite(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1);
922 state_fio->Fwrite(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1);
923 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
924 state_fio->Fwrite(fm7_bootram, sizeof(fm7_bootram), 1);
926 #if !defined(_FM77AV_VARIANTS)
928 for(addr = 0; addr < 4; addr++) state_fio->Fwrite(fm7_bootroms[addr], sizeof(0x200), 1);
930 #ifdef _FM77AV_VARIANTS
931 state_fio->FputBool(dictrom_connected);
932 state_fio->FputBool(use_page2_extram);
934 state_fio->FputBool(diag_load_initrom);
935 state_fio->FputBool(diag_load_dictrom);
936 state_fio->FputBool(diag_load_learndata);
937 state_fio->Fwrite(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1);
938 state_fio->Fwrite(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1);
939 state_fio->Fwrite(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1);
941 # if defined(CAPABLE_DICTROM)
942 state_fio->FputBool(diag_load_extrarom);
943 state_fio->Fwrite(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
944 state_fio->Fwrite(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
945 state_fio->Fwrite(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
950 state_fio->FputBool(extram_connected);
951 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS)
953 state_fio->FputInt32_BE(extram_pages);
954 pages = extram_pages;
955 # if defined(_FM77_VARIANTS)
956 if(pages > 3) pages = 3;
958 if(pages > 12) pages = 12;
960 if(pages > 0) state_fio->Fwrite(fm7_mainmem_extram, pages * 0x10000, 1);
961 # if defined(_FM77_VARIANTS)
962 state_fio->Fwrite(fm77_shadowram, sizeof(fm77_shadowram), 1);
968 state_fio->FputBool(is_basicrom);
969 state_fio->FputBool(clockmode);
970 state_fio->FputBool(basicrom_fd0f);
971 state_fio->FputUint32_BE(bootmode);
972 #if defined(_FM77AV_VARIANTS)
973 state_fio->FputUint32_BE(extcard_bank);
974 state_fio->FputUint32_BE(extrom_bank);
975 state_fio->FputBool(initiator_enabled);
977 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
978 state_fio->FputBool(boot_ram_write);
981 state_fio->FputBool(window_enabled);
982 state_fio->FputBool(mmr_enabled);
983 state_fio->FputBool(mmr_fast);
984 state_fio->FputUint16_BE(window_offset);
985 state_fio->FputUint8(mmr_segment);
986 state_fio->Fwrite(mmr_map_data, sizeof(mmr_map_data), 1);
991 bool FM7_MAINMEM::load_state(FILEIO *state_fio)
995 version = state_fio->FgetUint32_BE();
996 if(this_device_id != state_fio->FgetInt32_BE()) return false;
999 ioaccess_wait = state_fio->FgetBool();
1000 waitfactor = state_fio->FgetInt32_BE();
1001 waitcount = state_fio->FgetInt32_BE();
1003 sub_halted = state_fio->FgetBool();
1005 diag_load_basicrom = state_fio->FgetBool();
1006 diag_load_bootrom_bas = state_fio->FgetBool();
1007 diag_load_bootrom_dos = state_fio->FgetBool();
1008 diag_load_bootrom_mmr = state_fio->FgetBool();
1010 state_fio->Fread(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
1011 state_fio->Fread(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
1012 state_fio->Fread(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1);
1013 state_fio->Fread(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1);
1014 state_fio->Fread(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1);
1015 state_fio->Fread(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1);
1017 state_fio->Fread(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1);
1018 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1019 state_fio->Fread(fm7_bootram, sizeof(fm7_bootram), 1);
1021 #if !defined(_FM77AV_VARIANTS)
1023 for(addr = 0; addr < 4; addr++) state_fio->Fread(fm7_bootroms[addr], sizeof(0x200), 1);
1025 #ifdef _FM77AV_VARIANTS
1026 dictrom_connected = state_fio->FgetBool();
1027 use_page2_extram = state_fio->FgetBool();
1029 diag_load_initrom = state_fio->FgetBool();
1030 diag_load_dictrom = state_fio->FgetBool();
1031 diag_load_learndata = state_fio->FgetBool();
1032 state_fio->Fread(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1);
1033 state_fio->Fread(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1);
1034 state_fio->Fread(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1);
1036 # if defined(CAPABLE_DICTROM)
1037 diag_load_extrarom = state_fio->FgetBool();
1038 state_fio->Fread(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
1039 state_fio->Fread(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
1040 state_fio->Fread(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
1045 extram_connected = state_fio->FgetBool();
1046 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS)
1048 extram_pages = state_fio->FgetInt32_BE();
1049 pages = extram_pages;
1050 # if defined(_FM77_VARIANTS)
1051 if(pages > 3) pages = 3;
1053 if(pages > 12) pages = 12;
1055 if(pages > 0) state_fio->Fread(fm7_mainmem_extram, pages * 0x10000, 1);
1056 # if defined(_FM77_VARIANTS)
1057 state_fio->Fread(fm77_shadowram, sizeof(fm77_shadowram), 1);
1061 if(version == 1) return true;
1063 if(version >= 2) { // V2;
1064 is_basicrom = state_fio->FgetBool();
1065 clockmode = state_fio->FgetBool();
1066 basicrom_fd0f = state_fio->FgetBool();
1067 bootmode = state_fio->FgetUint32_BE();
1068 #if defined(_FM77AV_VARIANTS)
1069 extcard_bank = state_fio->FgetUint32_BE();
1070 extrom_bank = state_fio->FgetUint32_BE();
1071 initiator_enabled = state_fio->FgetBool();
1073 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1074 boot_ram_write = state_fio->FgetBool();
1076 #if defined(HAS_MMR)
1077 window_enabled = state_fio->FgetBool();
1078 mmr_enabled = state_fio->FgetBool();
1079 mmr_fast = state_fio->FgetBool();
1080 window_offset = state_fio->FgetUint16_BE();
1081 mmr_segment = state_fio->FgetUint8();
1082 state_fio->Fread(mmr_map_data, sizeof(mmr_map_data), 1);