2 * Main memory without MMR for FM-7 [FM7_MAINMEM]
8 #include "fm7_mainmem.h"
11 void FM7_MAINMEM::reset()
15 ioaccess_wait = false;
16 sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true;
18 memset(fm7_mainmem_bootrom_vector, 0x00, 0x10); // Clear without vector
19 #if defined(_FM77AV_VARIANTS)
20 memset(fm7_bootram, 0x00, 0x1f0);
21 initiator_enabled = true;
22 boot_ram_write = true;
23 #elif defined(_FM77_VARIANTS)
24 boot_ram_write = false;
26 bootmode = config.boot_mode & 3;
28 if((config.dipswitch & FM7_DIPSW_EXTRAM) != 0) {
29 extram_connected = true;
31 extram_connected = false;
34 #if defined(_FM77AV_VARIANTS)
35 if(dictrom_connected) {
36 use_page2_extram = true;
38 use_page2_extram = ((config.dipswitch & FM7_DIPSW_EXTRAM_AV) != 0) ? true : false;
47 window_enabled = false;
51 if((bootmode & 0x03) == 0) { // IF BASIC BOOT THEN ROM
54 basicrom_fd0f = false;
56 clockmode = (config.cpu_type == 0) ? true : false;
57 is_basicrom = ((bootmode & 0x03) == 0) ? true : false;
61 void FM7_MAINMEM::setclock(int mode)
63 uint32 clock = MAINCLOCK_SLOW;
64 if(mode == 1) { // SLOW
65 clock = MAINCLOCK_SLOW; // Temporally
67 if(!mmr_fast && !window_fast) {
69 if(mmr_enabled || window_enabled) {
70 clock = (uint32)((double)clock * 1.089);
72 clock = (uint32)((double)clock * 1.086);
81 clock = MAINCLOCK_FAST_MMR;
83 clock = MAINCLOCK_MMR;
85 } else if(mmr_enabled) {
87 clock = MAINCLOCK_FAST_MMR;
89 clock = MAINCLOCK_MMR;
92 clock = MAINCLOCK_NORMAL;
94 if(!mmr_fast && !window_fast) {
96 if(mmr_enabled || window_enabled) {
97 clock = (uint32)((double)clock * 1.089);
99 clock = (uint32)((double)clock * 1.086);
104 clock = MAINCLOCK_NORMAL;
107 p_vm->set_cpu_clock(this->maincpu, clock);
111 void FM7_MAINMEM::wait()
113 int waitfactor; // If MMR of TWR enabled, factor = 3.
114 // If memory, factor = 2?
115 if(!clockmode) return; // SLOW
117 //if(!mmr_fast && !window_fast && (window_enabled || mmr_enabled)) waitfactor = 2;
120 ioaccess_wait = true;
121 } else { // Not MMR, TWR or enabled FAST MMR mode
122 waitfactor = 3; // If(MMR or TWR) and NOT FAST MMR factor = 3, else factor = 2
123 if(mmr_fast) waitfactor = 2;
124 ioaccess_wait = false;
129 if(waitfactor <= 0) return;
131 if(waitcount >= waitfactor) {
132 if(maincpu != NULL) maincpu->set_extra_clock(1);
138 int FM7_MAINMEM::window_convert(uint32 addr, uint32 *realaddr)
142 if((addr < 0x8000) && (addr >= 0x7c00)) {
143 raddr = ((window_offset * 256) + addr) & 0x0ffff;
145 #ifdef _FM77AV_VARIANTS
146 //printf("TWR hit %04x -> %04x\n", addr, raddr);
147 return FM7_MAINMEM_AV_PAGE0; // 0x00000 - 0x0ffff
148 #else // FM77(L4 or others)
149 *realaddr |= 0x20000;
150 return FM7_MAINMEM_EXTRAM; // 0x20000 - 0x2ffff
159 int FM7_MAINMEM::check_extrom(uint32 raddr, uint32 *realaddr)
161 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
162 if(extrom_bank) { // Extra ROM selected.
163 uint32 dbank = extcard_bank & 0x3f;
164 if(dbank < 0x20) { // KANJI
165 if((dbank == 0x07) || (dbank == 0x06)) {
166 // NOT KANJI AS IS.Thanks Ryu.
167 *realaddr = raddr & 0x01;
168 return FM7_MAINMEM_KANJI_DUMMYADDR;
170 *realaddr = (dbank << 12) | raddr;
171 return FM7_MAINMEM_KANJI_LEVEL1;
172 } else if(dbank < 0x2c) {
173 raddr = ((dbank << 12) - 0x20000) | raddr;
175 return FM7_MAINMEM_77AV40_EXTRAROM;
176 } else if(dbank < 0x30) {
178 return FM7_MAINMEM_NULL;
180 raddr = ((dbank << 12) - 0x30000) | raddr;
181 if((raddr >= 0x8000) && (raddr < 0xfc00)) {
182 *realaddr = raddr - 0x8000;
183 return FM7_MAINMEM_BASICROM;
184 } else if((raddr >= 0xfe00) && (raddr < 0xffe0)) {
185 *realaddr = raddr - 0xfe00;
186 return FM7_MAINMEM_BOOTROM_MMR;
187 } else if(raddr >= 0xfffe) {
188 *realaddr = raddr - 0xfffe;
189 return FM7_MAINMEM_RESET_VECTOR;
191 //*realaddr = raddr + 0x10000;
192 //return FM7_MAINMEM_77AV40_EXTRAROM;
194 return FM7_MAINMEM_NULL;
202 int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr, bool write_state, bool dmamode)
204 uint32 raddr = addr & 0x0fff;
213 segment = mmr_segment;
215 if(addr >= 0xfc00) return -1;
217 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x03) << 4)] & 0x003f;
219 mmr_bank = mmr_map_data[(addr >> 12) & 0x000f | ((segment & 0x07) << 4)] & 0x007f;
221 // Reallocated by MMR
222 // Bank 3x : Standard memories.
223 if((mmr_bank < 0x3f) && (mmr_bank >= 0x30)) {
224 raddr = ((mmr_bank << 12) | raddr) & 0xffff;
225 return nonmmr_convert(raddr, realaddr);
227 # ifdef _FM77AV_VARIANTS
228 else if(mmr_bank == 0x3f) {
229 if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA
231 return FM7_MAINMEM_NULL;
233 raddr = raddr | 0xf000;
234 return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR.
237 # elif defined(_FM77_VARIANTS)
238 else if(mmr_bank == 0x3f) {
239 if((raddr >= 0xc00) && (raddr < 0xe00)) {
242 return FM7_MAINMEM_ZERO;
244 *realaddr = raddr - 0xc00;
245 return FM7_MAINMEM_SHADOWRAM;
247 } else if(raddr >= 0xe00) {
248 *realaddr = addr - 0x0e00;
250 if(diag_load_bootrom_mmr) {
251 return FM7_MAINMEM_BOOTROM_MMR;
253 return FM7_MAINMEM_BOOTROM_BAS;
256 return FM7_MAINMEM_BOOTROM_RAM;
259 raddr = raddr | 0xf000;
260 return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR.
264 major_bank = (mmr_bank >> 4) & 0x0f;
266 # ifdef _FM77AV_VARIANTS
267 if(major_bank == 0x0) { // PAGE 0
268 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
269 return FM7_MAINMEM_AV_PAGE0;
270 } else if(major_bank == 0x1) { // PAGE 1
271 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
272 return FM7_MAINMEM_AV_DIRECTACCESS;
273 } else if(major_bank == 0x2) { // PAGE 2
274 if((mmr_bank == 0x2e) && (!write_state)) {
275 int banknum = check_extrom(raddr, realaddr);
279 # if defined(CAPABLE_DICTROM)
280 if(dictrom_connected && dictrom_enabled) { // Dictionary ROM
281 uint32 dbank = extcard_bank & 0x3f;
282 *realaddr = raddr | (dbank << 12);
283 return FM7_MAINMEM_DICTROM;
287 return FM7_MAINMEM_NULL;
291 # if defined(CAPABLE_DICTROM)
294 case 0x29: // Backuped RAM
295 if(dictrom_connected && dictram_enabled){ // Battery backuped RAM
296 raddr = (((uint32)mmr_bank & 0x01) << 12) | raddr;
297 raddr = raddr & 0x1fff;
299 return FM7_MAINMEM_BACKUPED_RAM;
303 *realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff;
304 return FM7_MAINMEM_AV_PAGE2;
306 if(use_page2_extram) {
307 *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff;
308 return FM7_MAINMEM_AV_PAGE2;
311 return FM7_MAINMEM_NULL;
317 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
318 else if(extram_connected && mmr_extend) { // PAGE 4-
319 if((major_bank >= (extram_pages + 4)) || (fm7_mainmem_extram == NULL) ) {
321 return FM7_MAINMEM_NULL; // $FF
323 raddr = ((uint32)(mmr_bank - 0x40) << 12) | raddr;
325 return FM7_MAINMEM_EXTRAM;
329 return FM7_MAINMEM_NULL;
331 # elif defined(_FM77_VARIANTS)
332 if(extram_connected) { // PAGE 4-
333 if((major_bank > (extram_pages - 1)) || (major_bank >= 3)) {
335 return FM7_MAINMEM_NULL; // $FF
337 raddr = ((uint32)mmr_bank << 12) | raddr;
339 return FM7_MAINMEM_EXTRAM;
343 return FM7_MAINMEM_NULL; // $FF
345 # else // _FM77AV_VARIANTS
348 return FM7_MAINMEM_NULL; // $FF
356 int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr)
359 #ifdef _FM77AV_VARIANTS
360 if(initiator_enabled) {
361 if((addr >= 0x6000) && (addr < 0x8000)) {
362 //printf("HIT %02x\n", read_table[FM7_MAINMEM_INITROM].memory[addr - 0x6000]);
363 *realaddr = addr - 0x6000;
364 return FM7_MAINMEM_INITROM;
367 //printf("HIT %02x\n", read_table[FM7_MAINMEM_INITROM].memory[addr - 0xe000]);
368 *realaddr = addr - 0xe000;
369 return FM7_MAINMEM_INITROM;
374 uint32 addr_major, addr_minor;
375 addr_major = (addr >> 12) & 0x0f;
377 switch (addr_major) {
387 return FM7_MAINMEM_OMOTE;
396 *realaddr = addr - 0x8000;
398 return FM7_MAINMEM_BASICROM;
400 return FM7_MAINMEM_URA;
403 addr_minor = (addr >> 8) & 0x0f;
417 *realaddr = addr - 0x8000;
419 return FM7_MAINMEM_BASICROM;
421 return FM7_MAINMEM_URA;
425 *realaddr = addr - 0xfc00;
426 return FM7_MAINMEM_BIOSWORK;
429 *realaddr = addr - 0xfc80;
430 return FM7_MAINMEM_SHAREDRAM;
435 *realaddr = addr - 0xfd00;
436 return FM7_MAINMEM_MMIO;
441 *realaddr = addr - 0xfe00;
442 #if defined(_FM77AV_VARIANTS)
443 return FM7_MAINMEM_BOOTROM_RAM;
447 return FM7_MAINMEM_BOOTROM_BAS;
450 //printf("BOOT_DOS ADDR=%04x\n", addr);
451 return FM7_MAINMEM_BOOTROM_DOS;
454 return FM7_MAINMEM_BOOTROM_MMR;
457 return FM7_MAINMEM_BOOTROM_EXTRA;
459 # if defined(_FM77_VARIANTS)
461 return FM7_MAINMEM_BOOTROM_RAM;
465 return FM7_MAINMEM_BOOTROM_BAS; // Really?
470 else if (addr < 0xfffe) { // VECTOR
471 *realaddr = addr - 0xffe0;
472 return FM7_MAINMEM_VECTOR;
474 #if defined(_FM77AV_VARIANTS)
475 else if(addr < 0x10000) {
477 *realaddr = addr - 0xfe00;
478 return FM7_MAINMEM_BOOTROM_RAM;
481 else if (addr < 0x10000) {
482 *realaddr = addr - 0xfffe;
483 return FM7_MAINMEM_RESET_VECTOR;
490 emu->out_debug_log("Main: Over run ADDR = %08x", addr);
492 return FM7_MAINMEM_NULL;
495 int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr, bool write_state, bool dmamode)
497 if(realaddr == NULL) return FM7_MAINMEM_NULL; // Not effect.
502 stat = window_convert(addr, &raddr);
503 //if(stat >= 0) printf("WINDOW CONVERT: %04x to %04x, bank = %02x\n", addr, raddr, stat);
512 stat = mmr_convert(addr, &raddr, write_state, dmamode);
514 //printf("MMR CONVERT: %04x to %05x, bank = %02x\n", addr, raddr, stat);
520 addr = addr & 0xffff;
522 return nonmmr_convert(addr, realaddr);
525 uint32 FM7_MAINMEM::read_signal(int sigid)
527 uint32 value = 0x00000000;
529 case FM7_MAINIO_PUSH_FD0F:
530 value = (basicrom_fd0f) ? 0xffffffff : 0x00000000;
532 case FM7_MAINIO_IS_BASICROM:
533 value = (is_basicrom) ? 0xffffffff : 0x00000000;
535 case FM7_MAINIO_CLOCKMODE:
536 value = (clockmode) ? 0xffffffff : 0x00000000;
538 case FM7_MAINIO_BOOTMODE:
539 value = (uint32)bootmode & 0x07;
541 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
542 case FM7_MAINIO_BOOTRAM_RW:
543 value = (boot_ram_write) ? 0xffffffff : 0x00000000;
547 case FM7_MAINIO_WINDOW_ENABLED:
548 value = (window_enabled) ? 0xffffffff : 0x00000000;
550 case FM7_MAINIO_WINDOW_FAST:
551 value = (window_fast) ? 0xffffffff : 0x00000000;
553 case FM7_MAINIO_FASTMMR_ENABLED:
554 value = (mmr_fast) ? 0xffffffff : 0x00000000;
556 case FM7_MAINIO_MMR_ENABLED:
557 value = (mmr_enabled) ? 0xffffffff : 0x00000000;
559 case FM7_MAINIO_MMR_EXTENDED:
560 value = (mmr_extend) ? 0xffffffff : 0x00000000;
562 case FM7_MAINMEM_REFRESH_FAST:
563 value = (refresh_fast) ? 0xffffffff : 0x00000000;
566 #if defined(_FM77AV_VARIANTS)
567 case FM7_MAINIO_INITROM_ENABLED:
568 value = (initiator_enabled) ? 0xffffffff: 0x00000000;
570 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
571 case FM7_MAINIO_EXTROM:
572 value = (extrom_bank) ? 0xffffffff: 0x00000000;
575 case FM7_MAINIO_EXTBANK:
576 value = extcard_bank & 0x3f;
577 value |= (dictram_enabled) ? 0x80 : 0;
578 value |= (dictrom_enabled) ? 0x40 : 0;
586 void FM7_MAINMEM::write_signal(int sigid, uint32 data, uint32 mask)
588 bool flag = ((data & mask) != 0);
590 case SIG_FM7_SUB_HALT:
593 case FM7_MAINIO_IS_BASICROM:
596 case FM7_MAINIO_PUSH_FD0F:
597 basicrom_fd0f = flag;
599 case FM7_MAINIO_CLOCKMODE:
602 case FM7_MAINIO_BOOTMODE:
603 bootmode = data & 0x07;
605 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
606 case FM7_MAINIO_BOOTRAM_RW:
607 boot_ram_write = flag;
610 #ifdef _FM77AV_VARIANTS
611 case FM7_MAINIO_INITROM_ENABLED:
612 initiator_enabled = flag;
614 case FM7_MAINIO_EXTBANK:
615 extcard_bank = data & 0x3f;
616 dictram_enabled = ((data & 0x80) != 0) ? true : false;
617 dictrom_enabled = ((data & 0x40) != 0) ? true : false;
619 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
620 case FM7_MAINIO_EXTROM:
626 case FM7_MAINIO_WINDOW_ENABLED:
627 window_enabled = flag;
628 setclock(config.cpu_type);
630 case FM7_MAINIO_WINDOW_FAST:
632 setclock(config.cpu_type);
634 case FM7_MAINIO_FASTMMR_ENABLED:
636 setclock(config.cpu_type);
638 case FM7_MAINIO_MMR_ENABLED:
640 setclock(config.cpu_type);
642 case FM7_MAINIO_MMR_EXTENDED:
645 case FM7_MAINMEM_REFRESH_FAST:
647 setclock(config.cpu_type);
654 uint32 FM7_MAINMEM::read_dma_data8(uint32 addr)
658 val = this->read_data8_main(addr & 0xffff, true);
661 return this->read_data8(addr & 0xffff);
665 uint32 FM7_MAINMEM::read_dma_io8(uint32 addr)
669 val = this->read_data8_main(addr & 0xffff, true);
672 return this->read_data8(addr & 0xffff);
677 uint32 FM7_MAINMEM::read_data8_main(uint32 addr, bool dmamode)
682 bank = getbank(addr, &realaddr, false, dmamode);
684 emu->out_debug_log("Illegal BANK: ADDR = %04x", addr);
685 return 0xff; // Illegal
687 if(bank == FM7_MAINMEM_SHAREDRAM) {
688 if(!sub_halted) return 0xff; // Not halt
689 return display->read_data8(realaddr + 0xd380); // Okay?
690 } else if(bank == FM7_MAINMEM_NULL) {
693 #if defined(_FM77AV_VARIANTS)
694 else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
695 if(!sub_halted) return 0xff; // Not halt
697 return display->read_dma_data8(realaddr); // Okay?
699 return display->read_data8(realaddr); // Okay?
701 } else if(bank == FM7_MAINMEM_KANJI_DUMMYADDR) {
702 return (realaddr & 0x01);
705 #if defined(CAPABLE_DICTROM)
706 else if(bank == FM7_MAINMEM_KANJI_LEVEL1) {
707 return kanjiclass1->read_data8(KANJIROM_DIRECTADDR + realaddr);
710 else if(read_table[bank].dev != NULL) {
711 return read_table[bank].dev->read_data8(realaddr);
712 } else if(read_table[bank].memory != NULL) {
713 return read_table[bank].memory[realaddr];
715 return 0xff; // Dummy
718 uint32 FM7_MAINMEM::read_data8(uint32 addr)
724 if(addr >= FM7_MAINIO_WINDOW_OFFSET) {
726 case FM7_MAINIO_WINDOW_OFFSET:
727 return (uint32)window_offset;
729 case FM7_MAINIO_MMR_SEGMENT:
730 return (uint32)mmr_segment;
733 if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 0x80))){
734 return mmr_map_data[addr - FM7_MAINIO_MMR_BANK];
741 return this->read_data8_main(addr, false);
744 void FM7_MAINMEM::write_dma_data8(uint32 addr, uint32 data)
747 this->write_data8_main(addr & 0xffff, data, true);
749 this->write_data8(addr & 0xffff, data);
753 void FM7_MAINMEM::write_dma_io8(uint32 addr, uint32 data)
756 this->write_data8_main(addr & 0xffff, data, true);
758 this->write_data8(addr & 0xffff, data);
762 void FM7_MAINMEM::write_data8_main(uint32 addr, uint32 data, bool dmamode)
766 bank = getbank(addr, &realaddr, true, dmamode);
768 emu->out_debug_log("Illegal BANK: ADDR = %04x", addr);
771 if(bank == FM7_MAINMEM_SHAREDRAM) {
772 if(!sub_halted) return; // Not halt
773 display->write_data8(realaddr + 0xd380, data); // Okay?
775 } else if(bank == FM7_MAINMEM_NULL) {
778 #if defined(_FM7) || defined(_FMNEW7)
779 else if(bank == FM7_MAINMEM_BASICROM) {
780 bank = FM7_MAINMEM_URA; // FM-7/NEW7 write to ura-ram even enabled basic-rom.
784 #if defined(_FM77AV_VARIANTS)
785 else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
786 if(!sub_halted) return; // Not halt
788 display->write_dma_data8(realaddr, data); // Okay?
790 display->write_data8(realaddr, data); // Okay?
796 else if(bank == FM7_MAINMEM_BOOTROM_RAM) {
797 if(!boot_ram_write) return;
800 if(write_table[bank].dev != NULL) {
801 write_table[bank].dev->write_data8(realaddr, data);
802 } else if(write_table[bank].memory != NULL) {
803 write_table[bank].memory[realaddr] = (uint8)data;
807 void FM7_MAINMEM::write_data8(uint32 addr, uint32 data)
812 if(addr >= FM7_MAINIO_WINDOW_OFFSET) {
814 case FM7_MAINIO_WINDOW_OFFSET:
815 window_offset = data;
817 case FM7_MAINIO_MMR_SEGMENT:
819 mmr_segment = data & 0x07;
821 mmr_segment = data & 0x03;
825 if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 0x80))){
826 mmr_map_data[addr - FM7_MAINIO_MMR_BANK] = (uint8)data;
833 write_data8_main(addr, data, false);
836 // Read / Write data(s) as big endian.
837 uint32 FM7_MAINMEM::read_data16(uint32 addr)
842 hi = read_data8(addr) & 0xff;
843 lo = read_data8(addr + 1) & 0xff;
849 uint32 FM7_MAINMEM::read_data32(uint32 addr)
851 uint32 ah, a2, a3, al;
854 ah = read_data8(addr) & 0xff;
855 a2 = read_data8(addr + 1) & 0xff;
856 a3 = read_data8(addr + 2) & 0xff;
857 al = read_data8(addr + 3) & 0xff;
859 val = ah * (65536 * 256) + a2 * 65536 + a3 * 256 + al;
863 void FM7_MAINMEM::write_data16(uint32 addr, uint32 data)
867 write_data8(addr + 1, d & 0xff);
869 write_data8(addr + 0, d & 0xff);
872 void FM7_MAINMEM::write_data32(uint32 addr, uint32 data)
876 write_data8(addr + 3, d & 0xff);
878 write_data8(addr + 2, d & 0xff);
880 write_data8(addr + 1, d & 0xff);
882 write_data8(addr + 0, d & 0xff);
886 bool FM7_MAINMEM::get_loadstat_basicrom(void)
888 return diag_load_basicrom;
891 bool FM7_MAINMEM::get_loadstat_bootrom_bas(void)
893 return diag_load_bootrom_bas;
896 bool FM7_MAINMEM::get_loadstat_bootrom_dos(void)
898 return diag_load_bootrom_dos;
901 uint32 FM7_MAINMEM::read_bios(const char *name, uint8 *ptr, uint32 size)
907 if((name == NULL) || (ptr == NULL)) return 0;
908 s = create_local_path((const _TCHAR *)name);
909 if(s == NULL) return 0;
911 if(!fio.Fopen(s, FILEIO_READ_BINARY)) return 0;
912 blocks = fio.Fread(ptr, size, 1);
915 return blocks * size;
918 uint32 FM7_MAINMEM::write_bios(const char *name, uint8 *ptr, uint32 size)
924 if((name == NULL) || (ptr == NULL)) return 0;
925 s = create_local_path((const _TCHAR *)name);
926 if(s == NULL) return 0;
928 fio.Fopen(s, FILEIO_WRITE_BINARY);
929 blocks = fio.Fwrite(ptr, size, 1);
932 return blocks * size;
935 void FM7_MAINMEM::update_config()
937 setclock(config.cpu_type);
940 FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
944 #if !defined(_FM77AV_VARIANTS)
945 for(int i = 0; i < 4; i++) fm7_bootroms[i] = (uint8 *)malloc(0x200);
950 #if defined(CAPABLE_DICTROM)
953 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
954 defined(_FM77_VARIANTS)
955 fm7_mainmem_extram = NULL;
958 memset(read_table, 0x00, sizeof(read_table));
959 memset(write_table, 0x00, sizeof(write_table));
962 FM7_MAINMEM::~FM7_MAINMEM()
966 void FM7_MAINMEM::initialize(void)
969 diag_load_basicrom = false;
970 diag_load_bootrom_bas = false;
971 diag_load_bootrom_dos = false;
972 diag_load_bootrom_mmr = false;
975 #if defined(_FM77AV_VARIANTS)
976 dictrom_connected = false;
979 for(i = 0x00; i < 0x80; i++) {
986 window_enabled = false;
988 #ifdef _FM77AV_VARIANTS
991 dictrom_enabled = false;
992 dictram_enabled = false;
994 initiator_enabled = true;
995 boot_ram_write = true;
997 bootmode = config.boot_mode & 3;
998 basicrom_fd0f = false;
999 is_basicrom = ((bootmode & 0x03) == 0) ? true : false;
1002 i = FM7_MAINMEM_OMOTE;
1003 memset(fm7_mainmem_omote, 0x00, 0x8000 * sizeof(uint8));
1004 read_table[i].memory = fm7_mainmem_omote;
1005 write_table[i].memory = fm7_mainmem_omote;
1008 i = FM7_MAINMEM_URA;
1009 memset(fm7_mainmem_ura, 0x00, 0x7c00 * sizeof(uint8));
1010 read_table[i].memory = fm7_mainmem_ura;
1011 write_table[i].memory = fm7_mainmem_ura;
1013 i = FM7_MAINMEM_VECTOR;
1014 memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e);
1015 read_table[i].memory = fm7_mainmem_bootrom_vector;
1016 write_table[i].memory = fm7_mainmem_bootrom_vector;
1019 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1020 defined(_FM77_VARIANTS)
1021 extram_pages = FM77_EXRAM_BANKS;
1022 #if defined(_FM77_VARIANTS)
1023 if(extram_pages > 3) extram_pages = 3;
1025 if(extram_pages > 12) extram_pages = 12;
1027 if(extram_pages > 0) {
1028 i = FM7_MAINMEM_EXTRAM;
1029 fm7_mainmem_extram = (uint8 *)malloc(extram_pages * 0x10000);
1030 if(fm7_mainmem_extram != NULL) {
1031 memset(fm7_mainmem_extram, 0x00, extram_pages * 0x10000);
1032 read_table[i].memory = fm7_mainmem_extram;
1033 write_table[i].memory = fm7_mainmem_extram;
1038 #if defined(_FM77_VARIANTS)
1039 memset(fm77_shadowram, 0x00, 0x200);
1040 read_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram;
1041 write_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram;
1043 #if !defined(_FM77AV_VARIANTS)
1044 for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_EXTRA; i++) {
1045 memset(fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS], 0xff, 0x200);
1046 read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS];
1050 if(read_bios("BOOT_BAS8.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) {
1051 diag_load_bootrom_bas = true;
1053 diag_load_bootrom_bas = false;
1055 if(read_bios("BOOT_DOS8.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) {
1056 diag_load_bootrom_dos = true;
1058 diag_load_bootrom_dos = false;
1060 diag_load_bootrom_mmr = false;
1061 # elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
1062 if(read_bios("BOOT_BAS.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) {
1063 diag_load_bootrom_bas = true;
1065 diag_load_bootrom_bas = false;
1067 if(read_bios("BOOT_DOS.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) {
1068 diag_load_bootrom_dos = true;
1070 diag_load_bootrom_dos = false;
1072 # if defined(_FM77_VARIANTS)
1073 if(read_bios("BOOT_MMR.ROM", fm7_bootroms[2], 0x200) >= 0x1e0) {
1074 diag_load_bootrom_mmr = true;
1076 diag_load_bootrom_mmr = false;
1079 i = FM7_MAINMEM_BOOTROM_RAM;
1080 memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM
1081 read_table[i].memory = fm7_bootram;
1082 write_table[i].memory = fm7_bootram;
1085 diag_load_bootrom_mmr = false;
1087 # elif defined(_FM77AV_VARIANTS)
1088 i = FM7_MAINMEM_AV_PAGE0;
1089 memset(fm7_mainmem_mmrbank_0, 0x00, 0x10000 * sizeof(uint8));
1090 read_table[i].memory = fm7_mainmem_mmrbank_0;
1091 write_table[i].memory = fm7_mainmem_mmrbank_0;
1093 i = FM7_MAINMEM_AV_PAGE2;
1094 memset(fm7_mainmem_mmrbank_2, 0x00, 0x10000 * sizeof(uint8));
1095 read_table[i].memory = fm7_mainmem_mmrbank_2;
1096 write_table[i].memory = fm7_mainmem_mmrbank_2;
1098 i = FM7_MAINMEM_INITROM;
1099 diag_load_initrom = false;
1100 memset(fm7_mainmem_initrom, 0xff, 0x2000 * sizeof(uint8));
1101 read_table[i].memory = fm7_mainmem_initrom;
1103 if(read_bios("INITIATE.ROM", read_table[i].memory, 0x2000) >= 0x2000) diag_load_initrom = true;
1104 emu->out_debug_log("77AV INITIATOR ROM READING : %s", diag_load_initrom ? "OK" : "NG");
1106 read_table[FM7_MAINMEM_BOOTROM_BAS].memory = NULL; // Not connected.
1107 read_table[FM7_MAINMEM_BOOTROM_DOS].memory = NULL; // Not connected.
1108 read_table[FM7_MAINMEM_BOOTROM_MMR].memory = NULL; // Not connected.
1110 if(read_bios("BOOT_MMR.ROM", fm77av_hidden_bootmmr, 0x200) < 0x1e0) {
1111 memcpy(fm77av_hidden_bootmmr, &fm7_mainmem_initrom[0x1a00], 0x200);
1113 read_table[FM7_MAINMEM_BOOTROM_MMR].memory = fm77av_hidden_bootmmr; // Not connected.
1114 fm77av_hidden_bootmmr[0x1fe] = 0xfe;
1115 fm77av_hidden_bootmmr[0x1fe] = 0x00;
1117 i = FM7_MAINMEM_BOOTROM_RAM;
1118 memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM
1119 read_table[i].memory = fm7_bootram;
1120 write_table[i].memory = fm7_bootram;
1122 if(diag_load_initrom) diag_load_bootrom_bas = true;
1123 if(diag_load_initrom) diag_load_bootrom_dos = true;
1125 if((config.boot_mode & 0x03) == 0) {
1126 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1800], 0x1e0 * sizeof(uint8));
1128 memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1a00], 0x1e0 * sizeof(uint8));
1130 fm7_bootram[0x1fe] = 0xfe; // Set reset vector.
1131 fm7_bootram[0x1ff] = 0x00; //
1134 emu->out_debug_log("BOOT ROM (basic mode) READING : %s", diag_load_bootrom_bas ? "OK" : "NG");
1135 emu->out_debug_log("BOOT ROM (DOS mode) READING : %s", diag_load_bootrom_dos ? "OK" : "NG");
1136 #if defined(_FM77_VARIANTS)
1137 emu->out_debug_log("BOOT ROM (MMR mode) READING : %s", diag_load_bootrom_mmr ? "OK" : "NG");
1141 #if !defined(_FM77AV_VARIANTS)
1142 for(i = 0; i <= 3; i++) {
1143 uint8 *p = fm7_bootroms[i];
1144 p[0x1fe] = 0xfe; // Set reset vector.
1149 i = FM7_MAINMEM_RESET_VECTOR;
1150 fm7_mainmem_reset_vector[0] = 0xfe;
1151 fm7_mainmem_reset_vector[1] = 0x00;
1153 read_table[i].memory = fm7_mainmem_reset_vector;
1155 i = FM7_MAINMEM_BASICROM;
1156 memset(fm7_mainmem_basicrom, 0xff, 0x7c00 * sizeof(uint8));
1158 read_table[i].memory = fm7_mainmem_basicrom;
1160 if(read_bios("FBASIC302.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
1161 diag_load_basicrom = true;
1162 } else if(read_bios("FBASIC300.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
1163 diag_load_basicrom = true;
1164 } else if(read_bios("FBASIC30.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
1165 diag_load_basicrom = true;
1169 if(read_bios("FBASIC10.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) diag_load_basicrom = true;
1171 emu->out_debug_log("BASIC ROM READING : %s", diag_load_basicrom ? "OK" : "NG");
1173 i = FM7_MAINMEM_BIOSWORK;
1174 memset(fm7_mainmem_bioswork, 0x00, 0x80 * sizeof(uint8));
1175 read_table[i].memory = fm7_mainmem_bioswork;
1176 write_table[i].memory = fm7_mainmem_bioswork;
1177 #if defined(CAPABLE_DICTROM)
1178 diag_load_dictrom = false;
1179 i = FM7_MAINMEM_DICTROM;
1180 memset(fm7_mainmem_dictrom, 0xff, 0x40000 * sizeof(uint8));
1181 read_table[i].memory = fm7_mainmem_dictrom;
1182 if(read_bios("DICROM.ROM", fm7_mainmem_dictrom, 0x40000) == 0x40000) diag_load_dictrom = true;
1183 emu->out_debug_log("DICTIONARY ROM READING : %s", diag_load_dictrom ? "OK" : "NG");
1184 dictrom_connected = diag_load_dictrom;
1186 i = FM7_MAINMEM_BACKUPED_RAM;
1187 diag_load_learndata = false;
1188 memset(fm7_mainmem_learndata, 0x00, 0x2000 * sizeof(uint8));
1189 read_table[i].memory = fm7_mainmem_learndata;
1190 write_table[i].memory = fm7_mainmem_learndata;
1191 if(read_bios("USERDIC.DAT", read_table[i].memory, 0x2000) == 0x2000) diag_load_learndata = true;
1192 emu->out_debug_log("DICTIONARY BACKUPED RAM READING : %s", diag_load_learndata ? "OK" : "NG");
1193 if(!diag_load_learndata) write_bios("USERDIC.DAT", fm7_mainmem_learndata, 0x2000);
1196 i = FM7_MAINMEM_77AV40_EXTRAROM;
1197 #if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1198 diag_load_extrarom = false;
1199 memset(fm7_mainmem_extrarom, 0xff, sizeof(fm7_mainmem_extrarom));
1200 read_table[i].memory = fm7_mainmem_extrarom;
1201 if(read_bios("EXTSUB.ROM", read_table[i].memory, 0xc000) == 0xc000) diag_load_extrarom = true;
1202 emu->out_debug_log("AV40SX/EX EXTRA ROM READING : %s", diag_load_extrarom ? "OK" : "NG");
1206 void FM7_MAINMEM::release()
1208 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1209 defined(_FM77_VARIANTS)
1210 if(fm7_mainmem_extram != NULL) free(fm7_mainmem_extram);
1212 #if !defined(_FM77AV_VARIANTS)
1214 for(i = 0; i < 4; i++) {
1215 if(fm7_bootroms[i] != NULL) free(fm7_bootroms[i]);
1216 fm7_bootroms[i] = NULL;
1219 #if defined(CAPABLE_DICTROM)
1220 write_bios("USERDIC.DAT", fm7_mainmem_learndata, 0x2000);
1222 // MEMORY::release();
1225 #define STATE_VERSION 2
1226 void FM7_MAINMEM::save_state(FILEIO *state_fio)
1228 state_fio->FputUint32_BE(STATE_VERSION);
1229 state_fio->FputInt32_BE(this_device_id);
1232 state_fio->FputBool(ioaccess_wait);
1233 state_fio->FputInt32_BE(waitfactor);
1234 state_fio->FputInt32_BE(waitcount);
1236 state_fio->FputBool(sub_halted);
1238 state_fio->FputBool(diag_load_basicrom);
1239 state_fio->FputBool(diag_load_bootrom_bas);
1240 state_fio->FputBool(diag_load_bootrom_dos);
1241 state_fio->FputBool(diag_load_bootrom_mmr);
1242 state_fio->Fwrite(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
1243 state_fio->Fwrite(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
1244 state_fio->Fwrite(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1);
1245 state_fio->Fwrite(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1);
1246 state_fio->Fwrite(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1);
1247 state_fio->Fwrite(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1);
1249 state_fio->Fwrite(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1);
1250 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1251 state_fio->Fwrite(fm7_bootram, sizeof(fm7_bootram), 1);
1253 #if !defined(_FM77AV_VARIANTS)
1255 for(addr = 0; addr < 4; addr++) state_fio->Fwrite(fm7_bootroms[addr], sizeof(0x200), 1);
1257 #ifdef _FM77AV_VARIANTS
1258 state_fio->FputBool(dictrom_connected);
1259 state_fio->FputBool(use_page2_extram);
1261 state_fio->FputBool(diag_load_initrom);
1262 state_fio->FputBool(diag_load_dictrom);
1263 state_fio->FputBool(diag_load_learndata);
1264 state_fio->Fwrite(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1);
1265 state_fio->Fwrite(fm77av_hidden_bootmmr, sizeof(fm77av_hidden_bootmmr), 1);
1267 state_fio->Fwrite(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1);
1268 state_fio->Fwrite(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1);
1270 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1271 state_fio->FputBool(diag_load_extrarom);
1272 state_fio->Fwrite(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
1274 # if defined(CAPABLE_DICTROM)
1275 state_fio->Fwrite(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
1276 state_fio->Fwrite(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
1281 state_fio->FputBool(extram_connected);
1282 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1283 defined(_FM77_VARIANTS)
1285 state_fio->FputInt32_BE(extram_pages);
1286 pages = extram_pages;
1287 # if defined(_FM77_VARIANTS)
1288 if(pages > 3) pages = 3;
1290 if(pages > 12) pages = 12;
1292 if(pages > 0) state_fio->Fwrite(fm7_mainmem_extram, pages * 0x10000, 1);
1293 # if defined(_FM77_VARIANTS)
1294 state_fio->Fwrite(fm77_shadowram, sizeof(fm77_shadowram), 1);
1300 state_fio->FputBool(is_basicrom);
1301 state_fio->FputBool(clockmode);
1302 state_fio->FputBool(basicrom_fd0f);
1303 state_fio->FputUint32_BE(bootmode);
1304 #if defined(_FM77AV_VARIANTS)
1305 state_fio->FputUint32_BE(extcard_bank);
1306 state_fio->FputBool(extrom_bank);
1307 state_fio->FputBool(initiator_enabled);
1308 state_fio->FputBool(dictrom_enabled);
1309 state_fio->FputBool(dictram_enabled);
1311 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1312 state_fio->FputBool(boot_ram_write);
1314 #if defined(HAS_MMR)
1315 state_fio->FputBool(window_enabled);
1316 state_fio->FputBool(mmr_enabled);
1317 state_fio->FputBool(mmr_fast);
1318 state_fio->FputBool(mmr_extend);
1320 state_fio->FputUint16_BE(window_offset);
1321 state_fio->FputBool(window_fast);
1322 state_fio->FputBool(refresh_fast);
1323 state_fio->FputUint8(mmr_segment);
1324 state_fio->Fwrite(mmr_map_data, sizeof(mmr_map_data), 1);
1329 bool FM7_MAINMEM::load_state(FILEIO *state_fio)
1332 version = state_fio->FgetUint32_BE();
1333 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1336 ioaccess_wait = state_fio->FgetBool();
1337 waitfactor = state_fio->FgetInt32_BE();
1338 waitcount = state_fio->FgetInt32_BE();
1340 sub_halted = state_fio->FgetBool();
1342 diag_load_basicrom = state_fio->FgetBool();
1343 diag_load_bootrom_bas = state_fio->FgetBool();
1344 diag_load_bootrom_dos = state_fio->FgetBool();
1345 diag_load_bootrom_mmr = state_fio->FgetBool();
1347 state_fio->Fread(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
1348 state_fio->Fread(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
1349 state_fio->Fread(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1);
1350 state_fio->Fread(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1);
1351 state_fio->Fread(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1);
1352 state_fio->Fread(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1);
1354 state_fio->Fread(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1);
1355 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1356 state_fio->Fread(fm7_bootram, sizeof(fm7_bootram), 1);
1358 #if !defined(_FM77AV_VARIANTS)
1360 for(addr = 0; addr < 4; addr++) state_fio->Fread(fm7_bootroms[addr], sizeof(0x200), 1);
1362 #ifdef _FM77AV_VARIANTS
1363 dictrom_connected = state_fio->FgetBool();
1364 use_page2_extram = state_fio->FgetBool();
1366 diag_load_initrom = state_fio->FgetBool();
1367 diag_load_dictrom = state_fio->FgetBool();
1368 diag_load_learndata = state_fio->FgetBool();
1369 state_fio->Fread(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1);
1370 state_fio->Fread(fm77av_hidden_bootmmr, sizeof(fm77av_hidden_bootmmr), 1);
1372 state_fio->Fread(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1);
1373 state_fio->Fread(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1);
1375 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1376 diag_load_extrarom = state_fio->FgetBool();
1377 state_fio->Fread(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
1379 # if defined(CAPABLE_DICTROM)
1380 state_fio->Fread(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
1381 state_fio->Fread(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
1386 extram_connected = state_fio->FgetBool();
1387 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1388 defined(_FM77_VARIANTS)
1390 extram_pages = state_fio->FgetInt32_BE();
1391 pages = extram_pages;
1392 # if defined(_FM77_VARIANTS)
1393 if(pages > 3) pages = 3;
1395 if(pages > 12) pages = 12;
1397 if(pages > 0) state_fio->Fread(fm7_mainmem_extram, pages * 0x10000, 1);
1398 # if defined(_FM77_VARIANTS)
1399 state_fio->Fread(fm77_shadowram, sizeof(fm77_shadowram), 1);
1403 if(version == 1) return true;
1405 if(version >= 2) { // V2;
1406 is_basicrom = state_fio->FgetBool();
1407 clockmode = state_fio->FgetBool();
1408 basicrom_fd0f = state_fio->FgetBool();
1409 bootmode = state_fio->FgetUint32_BE();
1410 #if defined(_FM77AV_VARIANTS)
1411 extcard_bank = state_fio->FgetUint32_BE();
1412 extrom_bank = state_fio->FgetBool();
1413 initiator_enabled = state_fio->FgetBool();
1414 dictrom_enabled = state_fio->FgetBool();
1415 dictram_enabled = state_fio->FgetBool();
1417 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
1418 boot_ram_write = state_fio->FgetBool();
1420 #if defined(HAS_MMR)
1421 window_enabled = state_fio->FgetBool();
1422 mmr_enabled = state_fio->FgetBool();
1423 mmr_fast = state_fio->FgetBool();
1424 mmr_extend = state_fio->FgetBool();
1426 window_offset = state_fio->FgetUint16_BE();
1427 window_fast = state_fio->FgetBool();
1428 refresh_fast = state_fio->FgetBool();
1429 mmr_segment = state_fio->FgetUint8();
1430 state_fio->Fread(mmr_map_data, sizeof(mmr_map_data), 1);