From: K.Ohta Date: Sun, 8 Mar 2015 08:23:34 +0000 (+0900) Subject: [VM][FM7][WIP] Implementing mainmemory. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3a3fb18fe59dc193c3e7d338f88e4f970db61730;p=csp-qt%2Fcommon_source_project-fm7.git [VM][FM7][WIP] Implementing mainmemory. --- diff --git a/source/src/vm/fm7/fm7_common.h b/source/src/vm/fm7/fm7_common.h index 0381ab28a..0f45b2d72 100644 --- a/source/src/vm/fm7/fm7_common.h +++ b/source/src/vm/fm7/fm7_common.h @@ -9,38 +9,67 @@ #ifndef _FM7_COMMON_H_ #define _FM7_COMMON_H_ -enum -{ - FM7_MAINMEM_OMOTE = 0, // $0000-$7FFF - FM7_MAINMEM_URA, // $8000-$FBFF #1 - FM7_MAINMEM_BASICROM, // $8000-$FBFF #2 - FM7_MAINMEM_BIOSWORK, // $FC00-$FC7F - FM7_MAINMEM_SHAREDRAM, // $FC80-$FCFF - FM7_MAINMEM_MMIO, // $FD00-$FDFF - FM7_MAINMEM_BOOTROM_BAS, // $FE00-$FFEF #1 - FM7_MAINMEM_BOOTROM_DOS, // $FE00-$FFEF #2 - FM7_MAINMEM_BOOTROM_ROM3, // $FE00-$FFEF #3 - FM7_MAINMEM_BOOTROM_RAM, // $FE00-$FFEF #4 - FM7_MAINMEM_VECTOR, // $FFF0-$FFFD - FM7_MAINMEM_VECTOR_RESET, // $FFFE-$FFFF - - FM7_MAINMEM_77EXTRAM, // 77AVL4, 192KB EXTRAM. - FM7_MAINMEM_77_NULLRAM, // 0x00 - FM7_MAINMEM_77_SHADOWRAM, // 0x200 - - FM7_MAINMEM_AV_PAGE0, - FM7_MAINMEM_AV_SUBMEM, - FM7_MAINMEM_AV_JCARD, - FM7_MAINMEM_AV_EXTRAM786K, - FM7_MAINMEN_AV_INITROM, - FM7_MAINMEM_END +enum { + FM7_MAINMEM_OMOTE = 0, // $0000-$7FFF + FM7_MAINMEM_URA, // $8000-$FBFF #1 + FM7_MAINMEM_BASICROM, // $8000-$FBFF #2 + FM7_MAINMEM_BIOSWORK, // $FC00-$FC7F + FM7_MAINMEM_SHAREDRAM, // $FC80-$FCFF + FM7_MAINMEM_MMIO, // $FD00-$FDFF + FM7_MAINMEM_BOOTROM_BAS, // $FE00-$FFEF #1 + FM7_MAINMEM_BOOTROM_DOS, // $FE00-$FFEF #2 + FM7_MAINMEM_BOOTROM_MMR, // $FE00-$FFEF #3 + FM7_MAINMEM_BOOTROM_RAM, // $FE00-$FFEF #4 + FM7_MAINMEM_VECTOR, // $FFF0-$FFFD + FM7_MAINMEM_NULL, // NULL + FM7_MAINMEM_ZERO, // ZERO + + FM7_MAINMEM_EXTRAM, // 192KB EXTRAM of FM-77, or 77AV40 768KB max. of 77AV40. + + FM7_MAINMEM_AV_PAGE0, // $00000-$0ffff + FM7_MAINMEM_AV_DIRECTACCESS, // $10000-$1ffff + FM7_MAINMEM_AV_PAGE2, // $20000-$2ffff + FM7_MAINMEM_INITROM, // Initiator ROM, $06000 - $07fff + // 77AV40 + FM7_MAINMEM_BACKUPED_RAM, // DICTIONARY CARD, Backuped + FM7_MAINMEM_DICTROM, // DICTIONARY CARD, ROM + FM7_MAINMEM_77AV40_EXTRAROM, // DICTIONARY CARD, Extra sub ROM + FM7_MAINMEM_END }; #define FM7_BOOTMODE_BASIC 0 #define FM7_BOOTMODE_DOS 1 -#define FM7_BOOTMODE_ROM3 2 +#define FM7_BOOTMODE_MMR 2 #define FM7_BOOTMODE_ROM4 3 #define FM7_BOOTMODE_RAM 4 +enum { + FM7_SUBMEM_VRAMBANK_0 = 0, // $0000-$BFFF #1 + FM7_SUBMEM_CONSOLERAM, // $C000-$CFFF + FM7_SUBMEM_WORKRAM, // $D000-$D37F + FM7_SUBMEM_SHAREDRAM, // $D380-$D3FF + FM7_SUBMEM_MMIO, // $D400-$D7FF + FM7_SUBMEM_MONITOR_C, // $D800-#FFFF #1 + FM7_SUBMEM_NULL, + FM7_SUBMEM_ZERO, + // 77AV + FM7_SUBMEM_VRAMBANK_1, // $0000-$BFFF #2 + // 77AV : $E000-$FFFF + FM7_SUBMEM_MONITOR_A, + FM7_SUBMEM_MONITOR_B, + FM7_SUBMEM_MONITOR_CG, + FM7_SUBMEM_CGROM, // 77AV: CGROM #2($D800-$DFFF) + // 77AV40 + FM7_SUBMEM_VRAMBANK_2, // $0000-$BFFF #3 + FM7_SUBMEM_MONITOR_RAM, // $E000-$DFFF + FM7_SUBMEM_CGRAM, // $D800-$DFFF + // 77(L4) + FM7_SUBMEM_77_WORKRAM, + FM7_SUBMEM_77_GVRAM, + FM7_SUBMEM_77_TEXTRAM, + FM7_SUBMEM_77_SUBMONITOR, + FM7_SUBMEM_END +}; + #endif // _FM7_COMMON_H_ diff --git a/source/src/vm/fm7/fm7_mainmem.cpp b/source/src/vm/fm7/fm7_mainmem.cpp index 4253034b0..771989d11 100644 --- a/source/src/vm/fm7/fm7_mainmem.cpp +++ b/source/src/vm/fm7/fm7_mainmem.cpp @@ -68,29 +68,58 @@ int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr) #endif #ifdef _FM77AV_VARIANTS - if((mmr_bank & 0xf0) == 0) { // PAGE 0 + if((mmr_bank & 0xf0) == 0x00) { // PAGE 0 *realaddr = (((uint32)mmr_bank & 0x0f) << 12) | raddr; - return FM7_MAINIO_77AV_PAGE0; + return FM7_MAINMEM_77AV_PAGE0; } - if((mmr_bank & 0xf0) == 1) { // PAGE 1 - if(mainio->read_signal(SIG_FM7MAINIO_SUB_RUN) != 0) { // Subsystem is not halted. - *realaddr = 0; - return FM7_MAINMEM_NULL; - } else { // Subsystem is halted. - *realaddr = (((uint32)mmr_bank & 0x0f) << 12) | raddr; - return FM7_MAIMEM_SUBSYSTEM; - } + if((mmr_bank & 0xf0) == 0x10) { // PAGE 1 + *realaddr = (((uint32)mmr_bank & 0x0f) << 12) | raddr; + return FM7_MAIMEM_DIRECTACCESS; } - if((mmr_bank & 0xf0) == 2) { // PAGE 1 - if(dict_connected) { - *realaddr = (((uint32)mmr_bank & 0x0f) << 12) | raddr; - return FM7_MAIMEM_77AVDICTROM; - } else { - *realaddr = 0; - return FM7_MAINMEM_NULL; + if((mmr_bank & 0xf0) == 0x20) { // PAGE 2 + uint32 dbank = mainio->read_signal(SIG_FM7_MAINIO_EXTBANK); + switch(mmr_bank) { + case 0x28: + case 0x29: // Backuped RAM + if(((dbank & 0x80) != 0) && (dictrom_connected)){ // Battery backuped RAM + raddr = raddr & 0x1ff; + *readladdr = raddr; + return FM7_MAINMEM_BACKUPED_RAM; + } + break; + case 0x2e: + if(((dbank & 0x40) != 0) && (dictrom_connected)) { // Dictionary ROM + dbank = dbank & 0x3f; + uint32 extrom = mainio->read_signal(SIG_FM7_MAINIO_EXTROM) & 0x80; + if(extrom == 0) { // Dictionary selected. + dbank = dbank << 12; + *realaddr = raddr | dbank; + return FM7_MAINMEM_77AV40_DICTROM; + } else if(dbank <= 0x1f) { // KANJI + *realaddr = (dbank << 12) | raddr; + return FM7_MAINMEM_KANJI_LEVEL1; + } else if(dbank <= 0x37) { + dbank = dbank << 12; + *realaddr = (dbank - 0x20000) | raddr; + return FM7_MAINMEM_77AV40_EXTRAROM; + } else if(dbank <= 0x3f) { + raddr = ((dbank << 12) - 0x30000) | raddr; + if((raddr >= 0xffe0) || (raddr < 0xfd00)) { + return nonmmr_convert(raddr, realaddr); + } else if((raddr >= 0xfe00) || (raddr < 0xffe0)) { + *realaddr = raddr - 0xfe00; + return FM7_MAINMMEM_BOOTROM_DOS; + } + *realaddr = raddr + 0x10000; + return FM7_MAINMEM_77AV40_EXTRAROM; + } + } + break; } + // RAM + *realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff; + return FM7_MAINMEM_77AV_PAGE2; } - if(extram_connected) { // PAGE 4- if((mmr_bank >> 4) >= (extram_pages + 4)) { *realaddr = 0; @@ -119,11 +148,23 @@ int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr) } } #endif - return -1; + return -1; } int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr) { + addr &= 0x0ffff; + if(mainio->read_signal(SIG_FM7_INITROM_ENABLED) != 0) { + if((addr >= 0x6000) && (addr < 0x8000)) { + *realaddr = addr - 0x6000; + return FM7_MAINMEM_INITROM; + } + if(addr >= 0xfffe) { + *realaddr = addr - 0xe000; + return FM7_MAINMEM_INITROM; + } + } + if(addr < 0x8000) { *realaddr = addr - 0; return FM7_MAINMEM_OMOTE; @@ -146,19 +187,23 @@ int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr) *realaddr = addr - 0xfd00; return FM7_MAINMEM_MMIO; } - if(addr < 0xffe0) { + + if((addr < 0xffe0) || (addr >= 0xfffe)) { if(addr < 0xffe0) mainio->wait(); *realaddr = addr - 0xfe00; //if(mainio->get_boot_romram() != true) return FM7_MAINMEM_BOOTROM_RAM; - switch(dipsw->get_boot_mode()) { - case FM7_BOOTMODE_BASIC: + switch(mainio->read_signal(SIG_FM7_GET_BOOTMODE)) { + case 0: return FM7_MAIMEM_BOOTROM_BAS; break; - case FM7_BOOTMODE_DOS: + case 1: return FM7_MAIMEM_BOOTROM_DOS; break; - case FM7_BOOTMODE_ROM3: - return FM7_MAIMEM_BOOTROM_ROM3; + case 2: + return FM7_MAIMEM_BOOTROM_MMR; + break; + case 3: + return FM7_MAIMEM_BOOTRAM; break; default: return FM7_MAINMEM_BOOTROM_BAS; // Really? @@ -169,11 +214,6 @@ int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr) *realaddr = addr - 0xffe0; return FM7_MAINMEM_VECTOR; } - if(addr < 0x10000) { - mainio->wait(); - *realaddr = addr - 0xfffe; - return FM7_MAINMEM_VECTOR_RESET; - } realaddr = addr; return FM7_MAINMEM_NULL; } @@ -216,9 +256,15 @@ uint32 FM7_MAINMEM::read_data8(uint32 addr) if(bank < 0) return 0xff; // Illegal if(bank == FM7_MAINMEM_SHAREDRAM) { - if(submem->read_signal(SIG_SUBCPU_HALT) != 0) return 0xff; // Not halt - return submem->read_data8(realaddr + 0xd000); // Okay? + if(display->read_signal(SIG_SUBCPU_HALT) != 0) return 0xff; // Not halt + return display->read_data8(realaddr + 0xd380); // Okay? } +#if defined(_FM77AV_VARIANTS) + else if(bank == FM7_MAINMEM_77AV_DIRECTACCESS) { + if(display->read_signal(SIG_SUBCPU_HALT) != 0) return 0xff; // Not halt + return display->reat_data8(realaddr); // Okay? + } +#endif if(read_table[bank].dev != NULL) { return read_table[bank].dev->read_data8(realaddr); } else { @@ -239,10 +285,17 @@ void FM7_MAINMEM::write_data8(uint32 addr, uint32 data) if(bank < 0) return; // Illegal if(bank == FM7_MAINMEM_SHAREDRAM) { - if(submem->read_signal(SIG_SUBCPU_HALT) != 0) return; // Not halt - submem->write_data8(realaddr + 0xd000, data); // Okay? + if(display->read_signal(SIG_SUBCPU_HALT) != 0) return; // Not halt + display->write_data8(realaddr + 0xd380, data); // Okay? + return; + } +#if defined(_FM77AV_VARIANTS) + else if(bank == FM7_MAINMEM_77AV_DIRECTACCESS) { + if(display->read_signal(SIG_SUBCPU_HALT) != 0) return; // Not halt + display->write_data8(realaddr, data); // Okay? return; } +#endif if(write_table[bank].dev != NULL) { write_table[bank].dev->write_data8(realaddr, data); } else { @@ -372,45 +425,146 @@ void FM7_MAINMEM::initialize(void) read_table[i].memory = fm7_mainmem_ura; write_table[i].dev = NULL; write_table[i].memory = fm7_mainmem_ura; + +#if defined(_FM77AV_VARIANTS) + i = FM7_MAINMEM_MMRBANK_0; + memset(fm7_maimem_mmrbank_0, 0xff, 0x10000 * sizeof(uint8)); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_mmrbank_0; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_mmrbank_0; + i = FM7_MAINMEM_MMRBANK_2; + memset(fm7_maimem_mmrbank_2, 0xff, 0x10000 * sizeof(uint8)); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_mmrbank_0; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_mmrbank_0; - i = FM7_MAINMEM_BASICROM; - memset(fm7_maimem_basicrom, 0xff, 0x7c00 * sizeof(uint8)); + i = FM7_MAINMEM_VECTOR; + memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e); read_table[i].dev = NULL; - read_table[i].memory = fm7_mainmem_basicrom; + read_table[i].memory = fm7_mainmem_bootrom_vector; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_bootrom_vector; + + i = FM7_MAINMEM_VECTOR; + memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_bootrom_vector; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_bootrom_vector; + + +# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) + i = FM7_MAINMEM_77AV40_DICTROM; + memset(fm7_maimem_extrarom, 0xff, 0x40000 * sizeof(uint8)); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_dictrom; write_table[i].dev = NULL; write_table[i].memory = write_dummy; - if(read_bios("FBASIC30.ROM", read_table[i].memory, 0x7c00) == 0x7c00) diag_load_basicrom = true; + if(read_bios("DICROM.ROM", read_table[i].memory, 0x40000) == 0x40000) diag_load_dictrom = true; - i = FM7_MAINMEM_BIOSWORK; - memset(fm7_maimem_bioswork, 0x00, 0x80 * sizeof(uint8)); + i = FM7_MAINMEM_77AV40_EXTRAROM; + memset(fm7_maimem_extrarom, 0xff, 0x20000 * sizeof(uint8)); read_table[i].dev = NULL; - read_table[i].memory = fm7_mainmem_bioswork; + read_table[i].memory = fm7_mainmem_extrarom; write_table[i].dev = NULL; - write_table[i].memory = fm7_mainmem_bioswork; + write_table[i].memory = write_dummy; + if(read_bios("EXTSUB.ROM", read_table[i].memory, 0xc000) >= 0xc000) diag_load_extrarom = true; - i = FM7_MAINMEM_SHAREDRAM; - read_table[i].dev = sharedram; - read_table[i].memory = NULL; - write_table[i].dev = sharedram; - write_table[i].memory = NULL; + if(config.extram_pages > 0) { + i = FM7_MAINMEM_EXTRAM; + extram_pages = config.extram_pages; + if(extram_pages >= 12) extram_pages = 12; + fm7_mainmem_extram = malloc(extram_pages * 0x10000); + if(fm7_maimem_extram != NULL) { + memset(fm7_maimem_extram, 0x00, extram_pages * 0x10000); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_extram; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_extram; + } + } +# else + // 77AV Only +# endif + // Both 77AV and AV40 + for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_RAM; i++) { + read_table[i].dev = NULL; + read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS]; + write_table[i].dev = NULL; + write_table[i].memory = write_dummy; + } + memcpy(fm7_bootroms[0], &fm7_mainmem_initiate[0x1800], 0x200 * sizeof(uint8)); + memcpy(fm7_bootroms[1], &fm7_mainmem_initiate[0x1a00], 0x200 * sizeof(uint8)); + read_table[FM7_MAINMEM_BOOTROM_MMR].memory = NULL; // Not connected. - i = FM7_MAINMEM_MMIO; - read_table[i].dev = mainio; - read_table[i].memory = NULL; - write_table[i].dev = mainio; - write_table[i].memory = NULL; + memset(fm7_bootroms[3], 0x00, 0x200 * sizeof(uint8)); // RAM + if(diag_load_extrom) diag_load_bootrom_bas = true; + if(diag_load_extrom) diag_load_bootrom_dos = true; + write_table[FM7_BAINMEM_BOOTRAM].memory = read_table[FM7_BAINMEM_BOOTROM_RAM].memory; // Write enabled on BOOTRAM. +#else + // FM-7/77 + if(read_bios("BOOT_BAS.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) { + diag_load_bootrom_bas = true; + } else { + diag_load_bootrom_bas = false; + memset(fm7_bootroms[0], 0xff, 0x200); + } + if(read_bios("BOOT_DOS.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) { + diag_load_bootrom_dos = true; + } else { + diag_load_bootrom_dos = false; + memset(fm7_bootroms[1], 0xff, 0x200); + } + +# if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) + + if(read_bios("BOOT_MMR.ROM", fm7_bootroms[2], 0x200) >= 0x1e0) { + diag_load_bootrom_mmr = true; + } else { + diag_load_bootrom_mmr = false; + memset(fm7_bootroms[2], 0xff, 0x200); + } + + if(config.extram_pages > 0) { + i = FM7_MAINMEM_EXTRAM; + extram_pages = config.extram_pages; + if(extram_pages >= 3) pages = 3; + fm7_mainmem_extram = malloc(extram_pages * 0x10000); + if(fm7_maimem_extram != NULL) { + memset(fm7_maimem_extram, 0x00, extram_pages * 0x10000); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_extram; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_extram; + } + } +#else + // FM-7 + diag_load_bootrom_mmr = false; + memset(fm7_bootroms[2], 0xff, 0x200); +#endif - for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_RAM; i++) { - memset(fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS], 0x00, 0x200); +#if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) + for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTRAM; i++) { read_table[i].dev = NULL; read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS]; write_table[i].dev = NULL; write_table[i].memory = write_dummy; } - if(read_bios("BOOT_BAS.ROM", read_table[FM7_MAINMEM_BOOTROM_BAS].memory, 0x200) == 0x200) diag_load_bootrom_bas = true; - if(read_bios("BOOT_DOS.ROM", read_table[FM7_MAINMEM_BOOTROM_DOS].memory, 0x200) == 0x200) diag_load_bootrom_dos = true; - write_table[FM7_BAINMEM_BOOTROM_RAM].memory = read_table[FM7_BAINMEM_BOOTROM_RAM].memory; // Write enabled on BOOTRAM. + memset(fm7_bootroms[3], 0x00, 0x200 * sizeof(uint8)); // RAM + write_table[FM7_BAINMEM_BOOTRAM].memory = read_table[FM7_BAINMEM_BOOTROM_RAM].memory; // Write enabled on BOOTRAM. +#else + // FM-7/8 + for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_DOS; i++) { + read_table[i].dev = NULL; + read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS]; + write_table[i].dev = NULL; + write_table[i].memory = write_dummy; + } +#endif i = FM7_MAINMEM_VECTOR; memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e); @@ -418,10 +572,39 @@ void FM7_MAINMEM::initialize(void) read_table[i].memory = fm7_mainmem_bootrom_vector; write_table[i].dev = NULL; write_table[i].memory = fm7_mainmem_bootrom_vector; - - i = FM7_MAINMEM_VECTOR_RESET; +#endif + for(i = 0; i <= 3; i++) { + uint8 *p = fm7_bootroms[i]; + p[0x1fe] = 0xfe; // Set reset vector. + p[0x1ff] = 0x00; // + } + + i = FM7_MAINMEM_BASICROM; + memset(fm7_maimem_basicrom, 0xff, 0x7c00 * sizeof(uint8)); read_table[i].dev = NULL; - read_table[i].memory = fm7_mainmem_resetvector; + read_table[i].memory = fm7_mainmem_basicrom; write_table[i].dev = NULL; write_table[i].memory = write_dummy; + if(read_bios("FBASIC30.ROM", read_table[i].memory, 0x7c00) == 0x7c00) diag_load_basicrom = true; + + i = FM7_MAINMEM_BIOSWORK; + memset(fm7_maimem_bioswork, 0x00, 0x80 * sizeof(uint8)); + read_table[i].dev = NULL; + read_table[i].memory = fm7_mainmem_bioswork; + write_table[i].dev = NULL; + write_table[i].memory = fm7_mainmem_bioswork; + + i = FM7_MAINMEM_SHAREDRAM; + read_table[i].dev = display; + read_table[i].memory = NULL; + write_table[i].dev = display; + write_table[i].memory = NULL; + +#if defined(_FM77AV_VARIANTS) + i = FM7_MAINMEM_DIRECTACCESS; + read_table[i].dev = display; + read_table[i].memory = NULL; + write_table[i].dev = display; + write_table[i].memory = NULL; +#endif } diff --git a/source/src/vm/fm7/fm7_mainmem.h b/source/src/vm/fm7/fm7_mainmem.h index fa9c03ef6..94e10f393 100644 --- a/source/src/vm/fm7/fm7_mainmem.h +++ b/source/src/vm/fm7/fm7_mainmem.h @@ -31,15 +31,30 @@ class FM7_MAINMEM : public MEMORY uint8 fm7_mainmem_bioswork[0x80]; uint8 *fm7_bootroms[4]; uint8 fm7_mainmem_bootrom_vector[0x1e]; // Without - uint8 fm7_mainmem_resetvector[2] = {0xfe, 0x00}; // Reset vector. Addr = 0xfe00. - + uint8 fm7_mainmem_null[1]; + +#ifdef HAS_MMR +#ifdef _FM77AV_VARIANTS + uint8 fm7_mainmem_mmrbank_0[0x10000]; // $00000-$0ffff + uint8 fm7_mainmem_mmrbank_2[0x10000]; // $20000-$2ffff +# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) + uint8 *fm7_mainmem_extram; // $40000- : MAX 768KB ($c0000) + uint8 fm7_mainmem_extrarom[0x20000]; // $20000-$2ffff, banked + uint8 fm7_mainmem_dictrom[0x20000]; // $20000-$2ffff, banked +# endif +#else + uint8 *fm7_mainmem_extram; // $00000-$2ffff +#endif bool diag_load_basicrom = false; bool diag_load_bootrom_bas = false; bool diag_load_bootrom_dos = false; - + bool diag_load_bootrom_mmr = false; + + bool extram_connected; + uint8 extram_pages; // Per 64KB, MAX=3(77) or 12(77AV40) virtual int getbank(uint32 addr, uint32 *realaddr); - FM7_MAINIO *mainio; - DEVICE *submem; + DEVICE *mainio; + DEVICE *display; public: FM7_MAINMEM(VM* parent_vm, EMU* parent_emu); ~FM7_MAINMEM(); @@ -60,8 +75,17 @@ class FM7_MAINMEM : public MEMORY bool get_loadstat_bootrom_dos(void){ return diag_load_bootrom_dos; } - void set_context_submem(DEVICE *p){ - submem = p; + void set_context_display(DEVICE *p){ + display = p; + } + void set_context_mainio(DEVICE *p){ + int i; + mainio = p; + i = FM7_MAINMEM_MMIO; + read_table[i].dev = mainio; + read_table[i].memory = NULL; + write_table[i].dev = mainio; + write_table[i].memory = NULL; } };