X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Ffm7%2Ffm7_mainmem.cpp;h=38524752366a5698d85757d755439538724e85aa;hb=9657068762e0ebc1ed5a42638db31cdcdda7c9db;hp=6c74f2ee8b8d8bd2288da25d02563f33e09f1ec7;hpb=bb417371bdad8ccd31228f2cf3de1150ad302e9f;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/fm7/fm7_mainmem.cpp b/source/src/vm/fm7/fm7_mainmem.cpp index 6c74f2ee8..385247523 100644 --- a/source/src/vm/fm7/fm7_mainmem.cpp +++ b/source/src/vm/fm7/fm7_mainmem.cpp @@ -1,30 +1,71 @@ /* - * Main memory without MMR for FM-7 [FM7_MAINMEM] + * Main memory MMR for FM-7 [FM7_MAINMEM] * Author: K.Ohta * Date : 2015.01.01- + * License: GPLv2 * */ - +#include "vm.h" +#include "emu.h" #include "fm7_mainmem.h" +#include "fm7_mainio.h" +#include "fm7_display.h" +#if defined(CAPABLE_DICTROM) +#include "kanjirom.h" +#endif + +namespace FM7 { + +FM7_MAINMEM::FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) +{ +#if !defined(_FM77AV_VARIANTS) + for(int i = 0; i < 8; i++) fm7_bootroms[i] = (uint8_t *)malloc(0x200); +#endif + mainio = NULL; + display = NULL; + maincpu = NULL; +#if defined(CAPABLE_DICTROM) + kanjiclass1 = NULL; +#endif +#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \ + defined(_FM77_VARIANTS) + fm7_mainmem_extram = NULL; +#endif + cpu_clocks = CPU_CLOCKS; + // Initialize table + set_device_name(_T("MAIN MEMORY")); +} +FM7_MAINMEM::~FM7_MAINMEM() +{ +#if !defined(_FM77AV_VARIANTS) + for(int i = 0; i < 8; i++) if(fm7_bootroms[i] != NULL) free(fm7_bootroms[i]); +#endif +} void FM7_MAINMEM::reset() { waitfactor = 0; waitcount = 0; + mem_waitfactor = 0; + mem_waitcount = 0; ioaccess_wait = false; sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true; //sub_halted = false; + memset(fm7_mainmem_bootrom_vector, 0x00, 0x10); // Clear without vector + #if defined(_FM77AV_VARIANTS) memset(fm7_bootram, 0x00, 0x1f0); - if((config.boot_mode & 3) == 0) { - memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1800], 0x1e0 * sizeof(uint8)); - } else { - memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1a00], 0x1e0 * sizeof(uint8)); - } - fm7_bootram[0x1fe] = 0xfe; // Set reset vector. - fm7_bootram[0x1ff] = 0x00; // -#endif + initiator_enabled = true; + boot_ram_write = true; +#elif defined(_FM77_VARIANTS) + boot_ram_write = false; +#endif +#if defined(_FM77_VARIANTS) || defined(_FM8) + bootmode = config.boot_mode & 7; +#else + bootmode = config.boot_mode & 3; +#endif #if defined(HAS_MMR) if((config.dipswitch & FM7_DIPSW_EXTRAM) != 0) { extram_connected = true; @@ -39,413 +80,397 @@ void FM7_MAINMEM::reset() use_page2_extram = ((config.dipswitch & FM7_DIPSW_EXTRAM_AV) != 0) ? true : false; } #endif - //maincpu->reset(); +#ifdef HAS_MMR + mmr_extend = false; + mmr_segment = 0; + window_offset = 0; + mmr_enabled = false; + mmr_fast = false; + window_enabled = false; + window_fast = false; + refresh_fast = false; +#endif + if((bootmode & 0x03) == 0) { // IF BASIC BOOT THEN ROM + basicrom_fd0f = true; + } else { // ELSE RAM + basicrom_fd0f = false; + } + clockmode = (config.cpu_type == 0) ? true : false; + is_basicrom = ((bootmode & 0x03) == 0) ? true : false; + setclock(clockmode ? 0 : 1); + init_data_table(); + update_all_mmr_jumptable(); + maincpu->reset(); } +void FM7_MAINMEM::setclock(int mode) +{ + uint32_t clock = MAINCLOCK_SLOW; + if(mode == 1) { // SLOW + clock = MAINCLOCK_SLOW; // Temporally +#if defined(HAS_MMR) + if(!mmr_fast && !window_fast) { + if(refresh_fast) { + if(mmr_enabled || window_enabled) { + clock = (uint32_t)((double)clock * 1.089); + } else { + clock = (uint32_t)((double)clock * 1.086); + } + } + } +#endif + } else { +#if defined(HAS_MMR) +# if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) + // Thanks to Ryu Takegami, around DRAM refresh. + // DRAM refresh makes halting MAIN MPU per 13.02uS. + if(!mmr_fast && !window_fast) { // SLOW + if(refresh_fast) { + clock = MAINCLOCK_FAST_MMR - ((100000000 / 1302) * 1); // Fast Refresh: 1wait + } else { + clock = MAINCLOCK_FAST_MMR - ((100000000 / 1302) * 3); // Slow Refresh: 3Wait(!) + } + if(mmr_enabled || window_enabled) { + clock = (uint32_t)((double)clock * 0.87); + } + } else { + clock = MAINCLOCK_FAST_MMR; + //if(!(mmr_enabled) && !(window_enabled)) clock = MAINCLOCK_NORMAL; + } +# else + if(mmr_enabled || window_enabled) { + clock = MAINCLOCK_MMR; + } else { + clock = MAINCLOCK_NORMAL; + } +# endif +#else + clock = MAINCLOCK_NORMAL; +#endif + } + //mem_waitcount = 0; + uint32_t before_waitfactor = mem_waitfactor; + if(CPU_CLOCKS > clock) { + mem_waitfactor = (uint32_t)(65536.0 * ((1.0 - (double)clock / (double)CPU_CLOCKS))); + //out_debug_log(_T("CLOCK=%d WAIT FACTOR=%d"), clock, mem_waitfactor); + } else { + mem_waitfactor = 0; + //out_debug_log(_T("CLOCK=%d WAIT FACTOR=%d"), clock, mem_waitfactor); + } + cpu_clocks = clock; + // Below is ugly hack cause of CPU#0 cannot modify clock. + if(before_waitfactor != mem_waitfactor) maincpu->write_signal(SIG_CPU_WAIT_FACTOR, mem_waitfactor, 0xffffffff); +} + -void FM7_MAINMEM::wait() +void FM7_MAINMEM::iowait() { - int waitfactor; // If MMR of TWR enabled, factor = 3. - // If memory, factor = 2? - if(mainio->read_data8(FM7_MAINIO_CLOCKMODE) == FM7_MAINCLOCK_SLOW) return; + int _waitfactor = 0; + if(config.cpu_type == 1) return; // SLOW #ifdef HAS_MMR - if(!ioaccess_wait) { - waitfactor = 2; - ioaccess_wait = true; - } else { // Not MMR, TWR or enabled FAST MMR mode - waitfactor = 3; // If(MMR or TWR) and NOT FAST MMR factor = 3, else factor = 2 - if((mainio->read_data8(FM7_MAINIO_FASTMMR_ENABLED) != 0)) waitfactor = 2; - ioaccess_wait = false; - } - if((mainio->read_data8(FM7_MAINIO_WINDOW_ENABLED) == 0) && - (mainio->read_data8(FM7_MAINIO_MMR_ENABLED) == 0)) waitfactor = 2; + if((window_enabled) || (mmr_enabled)) { + if(!ioaccess_wait) { + _waitfactor = 2; + } else { // Not MMR, TWR or enabled FAST MMR mode + _waitfactor = 3; // If(MMR or TWR) and NOT FAST MMR factor = 3, else factor = 2 + if(mmr_fast) _waitfactor = 2; + } + } else { + _waitfactor = 2; + } #else - waitfactor = 2; + _waitfactor = 2; #endif - if(waitfactor <= 0) return; + if(_waitfactor <= 0) return; waitcount++; - if(waitcount >= waitfactor) { - if(maincpu != NULL) maincpu->set_extra_clock(1); + if(waitcount >= _waitfactor) { + maincpu->set_extra_clock(1); waitcount = 0; + ioaccess_wait = !ioaccess_wait; } } -int FM7_MAINMEM::window_convert(uint32 addr, uint32 *realaddr) -{ - uint32 raddr = addr; -#ifdef HAS_MMR - if((addr < 0x8000) && (addr >= 0x7c00)) { - raddr = ((mainio->read_data8(FM7_MAINIO_WINDOW_OFFSET) * 256) + addr) & 0x0ffff; - *realaddr = raddr; -#ifdef _FM77AV_VARIANTS - //printf("TWR hit %04x -> %04x\n", addr, raddr); - return FM7_MAINMEM_AV_PAGE0; // 0x00000 - 0x0ffff -#else // FM77(L4 or others) - *realaddr |= 0x20000; - return FM7_MAINMEM_EXTRAM; // 0x20000 - 0x2ffff -#endif - } - // Window not hit. -#endif - return -1; -} -int FM7_MAINMEM::mmr_convert(uint32 addr, uint32 *realaddr) +int FM7_MAINMEM::check_extrom(uint32_t raddr, uint32_t *realaddr) { - uint32 raddr = addr & 0x0fff; - uint32 mmr_bank; - uint32 major_bank; - - //#ifdef _FM77AV_VARIANTS -#ifdef HAS_MMR - if(addr >= 0xfc00) return -1; - //mmr_segment = mainio->read_data8(FM7_MAINIO_MMR_SEGMENT); - mmr_bank = mainio->read_data8(FM7_MAINIO_MMR_BANK + ((addr >> 12) & 0x000f)); - - // Reallocated by MMR - // Bank 3x : Standard memories. - if((mmr_bank < 0x3f) && (mmr_bank >= 0x30)) { - raddr = ((mmr_bank << 12) | raddr) & 0xffff; - return nonmmr_convert(raddr, realaddr); - } - -#ifdef _FM77AV_VARIANTS - else if(mmr_bank == 0x3f) { - if((raddr >= 0xd80) && (raddr <= 0xd97)) { // MMR AREA - *realaddr = 0; - return FM7_MAINMEM_NULL; - } else { - raddr = raddr | 0xf000; - return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR. - } - } -#elif defined(_FM77_VARIANTS) - else if(mmr_bank == 0x3f) { - if((raddr >= 0xc00) && (raddr < 0xe00)) { - if(mainio->read_data8(FM7_MAINIO_IS_BASICROM) != 0) { // BASICROM enabled - *realaddr = 0; - return FM7_MAINMEM_ZERO; - } else { - *realaddr = raddr - 0xc00; - return FM7_MAINMEM_SHADOWRAM; +#if defined(_FM77AV40EX) || defined(_FM77AV40SX) + if(extrom_bank) { // Extra ROM selected. + uint32_t dbank = extcard_bank & 0x3f; + if(dbank < 0x20) { // KANJI + if((dbank == 0x07) || (dbank == 0x06)) { + // NOT KANJI AS IS.Thanks Ryu. + *realaddr = raddr & 0x01; + return FM7_MAINMEM_KANJI_DUMMYADDR; } - } else if(raddr >= 0xe00) { - *realaddr = addr - 0x0e00; - if(mainio->read_data8(FM7_MAINIO_IS_BASICROM) != 0) { // BASICROM enabled - if(diag_load_bootrom_mmr) { - return FM7_MAINMEM_BOOTROM_MMR; - } else { - return FM7_MAINMEM_BOOTROM_BAS; - } - } else { - return FM7_MAINMEM_BOOTROM_RAM; - } - } else { - raddr = raddr | 0xf000; - return nonmmr_convert(raddr, realaddr); // Access I/O, Bootrom, even via MMR. - } - } -#endif - major_bank = (mmr_bank >> 4) & 0x0f; - -#ifdef _FM77AV_VARIANTS - - if(major_bank == 0x0) { // PAGE 0 - *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff; - return FM7_MAINMEM_AV_PAGE0; - } else if(major_bank == 0x1) { // PAGE 1 - *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff; - return FM7_MAINMEM_AV_DIRECTACCESS; - } else if(major_bank == 0x2) { // PAGE 2 -#if defined(CAPABLE_DICTROM) - uint32 dbank = mainio->read_data8(FM7_MAINIO_EXTBANK); - switch(mmr_bank) { - case 0x28: - case 0x29: // Backuped RAM - if(((dbank & 0x80) != 0) && (dictrom_connected)){ // Battery backuped RAM - raddr = raddr & 0x1ff; - *realaddr = raddr; - return FM7_MAINMEM_BACKUPED_RAM; - } - break; - case 0x2e: - if(((dbank & 0x40) != 0) && (dictrom_connected)) { // Dictionary ROM - dbank = dbank & 0x3f; - uint32 extrom = mainio->read_data8(FM7_MAINIO_EXTROM) & 0x80; - if(extrom == 0) { // Dictionary selected. - dbank = dbank << 12; - *realaddr = raddr | dbank; - return FM7_MAINMEM_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_MAINMEM_BOOTROM_DOS; - } - *realaddr = raddr + 0x10000; - return FM7_MAINMEM_77AV40_EXTRAROM; - } - } - break; - } - *realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff; - return FM7_MAINMEM_AV_PAGE2; -#else - //*realaddr = (raddr | (mmr_bank << 12)) & 0x0ffff; - if(use_page2_extram) { - *realaddr = ((mmr_bank << 12) | raddr) & 0x0ffff; - return FM7_MAINMEM_AV_PAGE2; - } - *realaddr = 0; - return FM7_MAINMEM_NULL; - -#endif - // RAM - } -# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) - else if(extram_connected) { // PAGE 4- - if((mmr_bank >> 4) >= (extram_pages + 4)) { - *realaddr = 0; - return FM7_MAINMEM_NULL; // $FF - } else { - raddr = ((uint32)(mmr_bank - 0x40) << 12) | raddr; + *realaddr = (dbank << 12) | raddr; + return FM7_MAINMEM_KANJI_LEVEL1; + } else if(dbank < 0x2c) { + raddr = ((dbank << 12) - 0x20000) | raddr; *realaddr = raddr; - return FM7_MAINMEM_EXTRAM; - } - } else { - if(mmr_bank >= 0x40) { + return FM7_MAINMEM_77AV40_EXTRAROM; + } else if(dbank < 0x30) { *realaddr = 0; return FM7_MAINMEM_NULL; - } - } -#endif -#else // 77 - // page 0 or 1 or 2. - if(extram_connected) { - if(major_bank >= extram_pages) { + } else { + raddr = ((dbank << 12) - 0x30000) | raddr; + if((raddr >= 0x8000) && (raddr < 0xfc00)) { + *realaddr = raddr - 0x8000; + return FM7_MAINMEM_BASICROM; + } else if((raddr >= 0xfe00) && (raddr < 0xffe0)) { + *realaddr = raddr - 0xfe00; + return FM7_MAINMEM_BOOTROM_MMR; + } else if(raddr >= 0xfffe) { + *realaddr = raddr - 0xfffe; + return FM7_MAINMEM_RESET_VECTOR; + } + //*realaddr = raddr + 0x10000; + //return FM7_MAINMEM_77AV40_EXTRAROM; *realaddr = 0; return FM7_MAINMEM_NULL; - } else { // EXTRAM Exists. - raddr = ((mmr_bank << 12) | raddr) & 0x3ffff; - *realaddr = raddr; - return FM7_MAINMEM_EXTRAM; } } -#endif -#endif +#endif return -1; } -int FM7_MAINMEM::nonmmr_convert(uint32 addr, uint32 *realaddr) -{ - addr &= 0x0ffff; -#ifdef _FM77AV_VARIANTS - if(mainio->read_data8(FM7_MAINIO_INITROM_ENABLED) != 0) { - if((addr >= 0x6000) && (addr < 0x8000)) { - *realaddr = addr - 0x6000; - return FM7_MAINMEM_INITROM; - } - if(addr >= 0xfffe) { - //printf("HIT %02x\n", read_table[FM7_MAINMEM_INITROM].memory[addr - 0xe000]); - *realaddr = addr - 0xe000; - return FM7_MAINMEM_INITROM; - } - } -#endif - if(addr < 0x8000) { - *realaddr = addr; - return FM7_MAINMEM_OMOTE; - } else if(addr < 0xfc00) { - *realaddr = addr - 0x8000; - if(mainio->read_data8(FM7_MAINIO_READ_FD0F) != 0) { - return FM7_MAINMEM_BASICROM; - } - return FM7_MAINMEM_URA; - } else if(addr < 0xfc80) { - *realaddr = addr - 0xfc00; - return FM7_MAINMEM_BIOSWORK; - }else if(addr < 0xfd00) { - *realaddr = addr - 0xfc80; - return FM7_MAINMEM_SHAREDRAM; - } else if(addr < 0xfe00) { - wait(); - *realaddr = addr - 0xfd00; - return FM7_MAINMEM_MMIO; - }else if(addr < 0xffe0){ - wait(); - *realaddr = addr - 0xfe00; +uint32_t FM7_MAINMEM::read_signal(int sigid) +{ + uint32_t value = 0x00000000; + switch(sigid) { + case FM7_MAINIO_PUSH_FD0F: + value = (basicrom_fd0f) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_IS_BASICROM: + value = (is_basicrom) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_CLOCKMODE: + value = (clockmode) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_BOOTMODE: + value = (uint32_t)bootmode & 0x07; + break; +#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) + case FM7_MAINIO_BOOTRAM_RW: + value = (boot_ram_write) ? 0xffffffff : 0x00000000; + break; +#endif +#ifdef HAS_MMR + case FM7_MAINIO_WINDOW_ENABLED: + value = (window_enabled) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_WINDOW_FAST: + value = (window_fast) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_FASTMMR_ENABLED: + value = (mmr_fast) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_MMR_ENABLED: + value = (mmr_enabled) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_MMR_EXTENDED: + value = (mmr_extend) ? 0xffffffff : 0x00000000; + break; + case FM7_MAINIO_MEM_REFRESH_FAST: + value = (refresh_fast) ? 0xffffffff : 0x00000000; + break; +#endif #if defined(_FM77AV_VARIANTS) - return FM7_MAINMEM_BOOTROM_RAM; -#else - switch(mainio->read_data8(FM7_MAINIO_BOOTMODE)) { - case 0: - return FM7_MAINMEM_BOOTROM_BAS; - break; - case 1: - //printf("BOOT_DOS ADDR=%04x\n", addr); - return FM7_MAINMEM_BOOTROM_DOS; - break; - case 2: - return FM7_MAINMEM_BOOTROM_MMR; - break; - case 3: - return FM7_MAINMEM_BOOTROM_EXTRA; - break; -#if defined(_FM77_VARIANTS) - case 4: - return FM7_MAINMEM_BOOTROM_RAM; - break; -#endif - default: - return FM7_MAINMEM_BOOTROM_BAS; // Really? - break; - } + case FM7_MAINIO_INITROM_ENABLED: + value = (initiator_enabled) ? 0xffffffff: 0x00000000; + break; +# if defined(_FM77AV40EX) || defined(_FM77AV40SX) + case FM7_MAINIO_EXTROM: + value = (extrom_bank) ? 0xffffffff: 0x00000000; + break; +# endif + case FM7_MAINIO_EXTBANK: + value = extcard_bank & 0x3f; + value |= (dictram_enabled) ? 0x80 : 0; + value |= (dictrom_enabled) ? 0x40 : 0; + break; #endif - } else if(addr < 0xfffe) { // VECTOR - *realaddr = addr - 0xffe0; - return FM7_MAINMEM_VECTOR; - } else if(addr < 0x10000) { - *realaddr = addr - 0xfffe; - return FM7_MAINMEM_RESET_VECTOR; - } - - emu->out_debug_log("Main: Over run ADDR = %08x", addr); - *realaddr = addr; - return FM7_MAINMEM_NULL; -} - -int FM7_MAINMEM::getbank(uint32 addr, uint32 *realaddr) -{ - if(realaddr == NULL) return FM7_MAINMEM_NULL; // Not effect. - addr = addr & 0xffff; -#ifdef HAS_MMR - if(mainio->read_data8(FM7_MAINIO_WINDOW_ENABLED) != 0) { - int stat; - uint32 raddr; - stat = window_convert(addr, &raddr); - //if(stat >= 0) printf("WINDOW CONVERT: %04x to %04x, bank = %02x\n", addr, raddr, stat); - if(stat >= 0) { - *realaddr = raddr; - return stat; - } - } - if(mainio->read_data8(FM7_MAINIO_MMR_ENABLED) != 0) { - int stat; - uint32 raddr; - stat = mmr_convert(addr, &raddr); - if(stat >= 0) { - //printf("MMR CONVERT: %04x to %05x, bank = %02x\n", addr, raddr, stat); - *realaddr = raddr; - return stat; - } } -#endif - // NOT MMR. - return nonmmr_convert(addr, realaddr); + return value; } -void FM7_MAINMEM::write_signal(int sigid, uint32 data, uint32 mask) + +void FM7_MAINMEM::write_signal(int sigid, uint32_t data, uint32_t mask) { bool flag = ((data & mask) != 0); switch(sigid) { case SIG_FM7_SUB_HALT: sub_halted = flag; break; + case FM7_MAINIO_IS_BASICROM: + is_basicrom = flag; + break; + case FM7_MAINIO_PUSH_FD0F: + basicrom_fd0f = flag; + break; + case FM7_MAINIO_CLOCKMODE: + clockmode = flag; + setclock(clockmode ? 0 : 1); + break; + case FM7_MAINIO_BOOTMODE: + bootmode = data & 0x07; + break; +#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) + case FM7_MAINIO_BOOTRAM_RW: + boot_ram_write = flag; + break; +#endif +#ifdef _FM77AV_VARIANTS + case FM7_MAINIO_INITROM_ENABLED: + initiator_enabled = flag; + break; + case FM7_MAINIO_EXTBANK: + extcard_bank = data & 0x3f; + dictram_enabled = ((data & 0x80) != 0) ? true : false; + dictrom_enabled = ((data & 0x40) != 0) ? true : false; + break; +# if defined(_FM77AV40EX) || defined(_FM77AV40SX) + case FM7_MAINIO_EXTROM: + extrom_bank = flag; + break; +# endif +#endif +#ifdef HAS_MMR + case FM7_MAINIO_WINDOW_ENABLED: + window_enabled = flag; + setclock(config.cpu_type); + break; + case FM7_MAINIO_WINDOW_FAST: + window_fast = flag; + setclock(config.cpu_type); + break; + case FM7_MAINIO_FASTMMR_ENABLED: + mmr_fast = flag; + setclock(config.cpu_type); + break; + case FM7_MAINIO_MMR_ENABLED: + mmr_enabled = flag; + setclock(config.cpu_type); + break; + case FM7_MAINIO_MMR_EXTENDED: + mmr_extend = flag; + break; + case FM7_MAINIO_MEM_REFRESH_FAST: + refresh_fast = flag; + setclock(config.cpu_type); + break; +#endif } } +uint32_t FM7_MAINMEM::read_io8(uint32_t addr) +{ + return mainio->read_io8(addr); +} -uint32 FM7_MAINMEM::read_data8(uint32 addr) +void FM7_MAINMEM::write_io8(uint32_t addr, uint32_t data) { - uint32 realaddr; - int bank; + return mainio->write_io8(addr, data); +} - bank = getbank(addr, &realaddr); - if(bank < 0) { - emu->out_debug_log("Illegal BANK: ADDR = %04x", addr); - return 0xff; // Illegal - } - - if(bank == FM7_MAINMEM_SHAREDRAM) { - //sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true; - if(!sub_halted) return 0xff; // Not halt - return display->read_data8(realaddr + 0xd380); // Okay? - } else if(bank == FM7_MAINMEM_MMIO) { - return mainio->read_data8(realaddr); - } else if(bank == FM7_MAINMEM_NULL) { +uint32_t FM7_MAINMEM::read_dma_data8(uint32_t addr) +{ +#if defined(HAS_MMR) + uint32_t val; + val = this->read_data8_main(addr & 0xffff, true); + return val; +#else + return this->read_data8(addr & 0xffff); +#endif +} + +uint32_t FM7_MAINMEM::read_dma_io8(uint32_t addr) +{ +#if defined(HAS_MMR) + uint32_t val; + val = this->read_data8_main(addr & 0xffff, true); + return val; +#else + return this->read_data8(addr & 0xffff); +#endif +} + +uint32_t FM7_MAINMEM::read_data8(uint32_t addr) +{ +#if defined(HAS_MMR) + if(addr >= FM7_MAINIO_WINDOW_OFFSET) { + switch(addr) { + case FM7_MAINIO_WINDOW_OFFSET: + return (uint32_t)window_offset; + break; + case FM7_MAINIO_MMR_SEGMENT: + return (uint32_t)mmr_segment; + break; + default: + if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 0x80))){ + return mmr_map_data[addr - FM7_MAINIO_MMR_BANK]; + } + break; + } return 0xff; } -#if defined(_FM77AV_VARIANTS) - else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) { - //sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true; - if(!sub_halted) return 0xff; // Not halt - return display->read_data8(realaddr); // Okay? - } -#endif - else if(read_table[bank].memory != NULL) { - return read_table[bank].memory[realaddr]; - } - return 0xff; // Dummy +#endif + return read_data8_main(addr, false); } -void FM7_MAINMEM::write_data8(uint32 addr, uint32 data) +void FM7_MAINMEM::write_dma_data8(uint32_t addr, uint32_t data) { - uint32 realaddr; - int bank; - - bank = getbank(addr, &realaddr); - if(bank < 0) { - emu->out_debug_log("Illegal BANK: ADDR = %04x", addr); - return; // Illegal - } - - if(bank == FM7_MAINMEM_SHAREDRAM) { - //sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true; - if(!sub_halted) return; // Not halt - display->write_data8(realaddr + 0xd380, data); // Okay? - return; - } else if(bank == FM7_MAINMEM_MMIO) { - mainio->write_data8(realaddr, (uint8)data); - return; - } else if(bank == FM7_MAINMEM_NULL) { - return; - } -#if defined(_FM77AV_VARIANTS) - else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) { - //sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true; - if(!sub_halted) return; // Not halt - display->write_data8(realaddr, data); // Okay? +#if defined(HAS_MMR) + write_data8_main(addr & 0xffff, data, true); +#else + write_data8(addr & 0xffff, data); +#endif +} + +void FM7_MAINMEM::write_dma_io8(uint32_t addr, uint32_t data) +{ +#if defined(HAS_MMR) + write_data8_main(addr & 0xffff, data, true); +#else + write_data8(addr & 0xffff, data); +#endif +} + +void FM7_MAINMEM::write_data8(uint32_t addr, uint32_t data) +{ +#if defined(HAS_MMR) + if(addr >= FM7_MAINIO_WINDOW_OFFSET) { + switch(addr) { + case FM7_MAINIO_WINDOW_OFFSET: + window_offset = data; + break; + case FM7_MAINIO_MMR_SEGMENT: + if(mmr_extend) { + mmr_segment = data & 0x07; + } else { + mmr_segment = data & 0x03; + } + break; + default: + if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 0x80))){ + mmr_map_data[addr - FM7_MAINIO_MMR_BANK] = (uint8_t)data; + update_mmr_jumptable(addr - FM7_MAINIO_MMR_BANK); + } + break; + } return; } #endif -#if defined(HAS_MMR) - else if(bank == FM7_MAINMEM_BOOTROM_RAM) { - if(mainio->read_data8(FM7_MAINIO_BOOTMODE) != 4) return; - write_table[bank].memory[realaddr] = (uint8)data; - } -#endif - else if(write_table[bank].memory != NULL) { - write_table[bank].memory[realaddr] = (uint8)data; - } + write_data8_main(addr, data, false); } // Read / Write data(s) as big endian. -uint32 FM7_MAINMEM::read_data16(uint32 addr) +uint32_t FM7_MAINMEM::read_data16(uint32_t addr) { - uint32 hi, lo; - uint32 val; + uint32_t hi, lo; + uint32_t val; hi = read_data8(addr) & 0xff; lo = read_data8(addr + 1) & 0xff; @@ -454,10 +479,10 @@ uint32 FM7_MAINMEM::read_data16(uint32 addr) return val; } -uint32 FM7_MAINMEM::read_data32(uint32 addr) +uint32_t FM7_MAINMEM::read_data32(uint32_t addr) { - uint32 ah, a2, a3, al; - uint32 val; + uint32_t ah, a2, a3, al; + uint32_t val; ah = read_data8(addr) & 0xff; a2 = read_data8(addr + 1) & 0xff; @@ -468,18 +493,18 @@ uint32 FM7_MAINMEM::read_data32(uint32 addr) return val; } -void FM7_MAINMEM::write_data16(uint32 addr, uint32 data) +void FM7_MAINMEM::write_data16(uint32_t addr, uint32_t data) { - uint32 d = data; + uint32_t d = data; write_data8(addr + 1, d & 0xff); d = d / 256; write_data8(addr + 0, d & 0xff); } -void FM7_MAINMEM::write_data32(uint32 addr, uint32 data) +void FM7_MAINMEM::write_data32(uint32_t addr, uint32_t data) { - uint32 d = data; + uint32_t d = data; write_data8(addr + 3, d & 0xff); d = d / 256; @@ -491,453 +516,164 @@ void FM7_MAINMEM::write_data32(uint32 addr, uint32 data) } -bool FM7_MAINMEM::get_loadstat_basicrom(void) -{ - return diag_load_basicrom; -} - -bool FM7_MAINMEM::get_loadstat_bootrom_bas(void) +void FM7_MAINMEM::update_config() { - return diag_load_bootrom_bas; + setclock(config.cpu_type); } -bool FM7_MAINMEM::get_loadstat_bootrom_dos(void) -{ - return diag_load_bootrom_dos; -} +#define STATE_VERSION 8 -uint32 FM7_MAINMEM::read_bios(const char *name, uint8 *ptr, uint32 size) +bool FM7_MAINMEM::decl_state(FILEIO *state_fio, bool loading) { - FILEIO fio; - uint32 blocks; - _TCHAR *s; - - if((name == NULL) || (ptr == NULL)) return 0; - s = emu->bios_path((_TCHAR *)name); - if(s == NULL) return 0; - - if(!fio.Fopen(s, FILEIO_READ_BINARY)) return 0; - blocks = fio.Fread(ptr, size, 1); - fio.Fclose(); - - return blocks * size; -} - -uint32 FM7_MAINMEM::write_bios(const char *name, uint8 *ptr, uint32 size) -{ - FILEIO fio; - uint32 blocks; - _TCHAR *s; - - if((name == NULL) || (ptr == NULL)) return 0; - s = emu->bios_path((_TCHAR *)name); - if(s == NULL) return 0; - - fio.Fopen(s, FILEIO_WRITE_BINARY); - blocks = fio.Fwrite(ptr, size, 1); - fio.Fclose(); - - return blocks * size; -} + if(!state_fio->StateCheckUint32(STATE_VERSION)) { + return false; + } + if(!state_fio->StateCheckInt32(this_device_id)) { + return false; + } + + state_fio->StateBool(ioaccess_wait); + state_fio->StateInt32(waitfactor); + state_fio->StateInt32(waitcount); + state_fio->StateBool(sub_halted); + + state_fio->StateBool(diag_load_basicrom); + state_fio->StateBool(diag_load_bootrom_bas); + state_fio->StateBool(diag_load_bootrom_dos); + state_fio->StateBool(diag_load_bootrom_mmr); + state_fio->StateBool(diag_load_bootrom_bubble); + state_fio->StateBool(diag_load_bootrom_bubble_128k); + state_fio->StateBool(diag_load_bootrom_sfd8); + state_fio->StateBool(diag_load_bootrom_2hd); + + state_fio->StateBuffer(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1); + state_fio->StateBuffer(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1); + state_fio->StateBuffer(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1); + state_fio->StateBuffer(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1); + state_fio->StateBuffer(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1); + state_fio->StateBuffer(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1); + + state_fio->StateBuffer(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1); -FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) -{ - int i; - p_vm = parent_vm; - p_emu = parent_emu; -#if !defined(_FM77AV_VARIANTS) - for(i = 0; i < 4; i++) fm7_bootroms[i] = (uint8 *)malloc(0x200); +#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) + state_fio->StateBuffer(fm7_bootram, sizeof(fm7_bootram), 1); #endif - mainio = NULL; - display = NULL; - maincpu = NULL; - kanjiclass1 = NULL; - kanjiclass2 = NULL; -#if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS) - fm7_mainmem_extram = NULL; +#if defined(_FM77_VARIANTS) || defined(_FM8) + for(int i = 0; i < 8; i++) state_fio->StateBuffer(fm7_bootroms[i], 0x200, 1); +#elif defined(_FM7) || defined(_FMNEW7) + for(int i = 0; i < 4; i++) state_fio->StateBuffer(fm7_bootroms[i], 0x200, 1); #endif -} - -FM7_MAINMEM::~FM7_MAINMEM() -{ -} -void FM7_MAINMEM::initialize(void) -{ - int i; - diag_load_basicrom = false; - diag_load_bootrom_bas = false; - diag_load_bootrom_dos = false; - diag_load_bootrom_mmr = false; -#if defined(_FM77AV_VARIANTS) - dictrom_connected = false; -#endif - // Initialize table - // $0000-$7FFF - memset(read_table, 0x00, sizeof(read_table)); - memset(write_table, 0x00, sizeof(write_table)); - i = FM7_MAINMEM_OMOTE; - memset(fm7_mainmem_omote, 0x00, 0x8000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_omote; - write_table[i].memory = fm7_mainmem_omote; - - // $8000-$FBFF - i = FM7_MAINMEM_URA; - memset(fm7_mainmem_ura, 0x00, 0x7c00 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_ura; - write_table[i].memory = fm7_mainmem_ura; - - - i = FM7_MAINMEM_VECTOR; - memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e); - read_table[i].memory = fm7_mainmem_bootrom_vector; - write_table[i].memory = fm7_mainmem_bootrom_vector; - -#if defined(CAPABLE_DICTROM) - diag_load_dictrom = false; - i = FM7_MAINMEM_DICTROM; - memset(fm7_mainmem_extrarom, 0xff, 0x40000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_dictrom; - write_table[i].memory = NULL; - if(read_bios("DICROM.ROM", fm7_mainmem_dictrom, 0x40000) == 0x40000) diag_load_dictrom = true; - emu->out_debug_log("DICTIONARY ROM READING : %s", diag_load_dictrom ? "OK" : "NG"); - dictrom_connected = diag_load_dictrom; - - i = FM7_MAINMEM_BACKUPED_RAM; - diag_load_learndata = false; - memset(fm7_mainmem_learndata, 0x00, 0x2000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_learndata; - write_table[i].memory = fm7_mainmem_learndata; - if(read_bios("USERDIC.DAT", read_table[i].memory, 0x2000) == 0x2000) diag_load_learndata = true; - emu->out_debug_log("DICTIONARY ROM READING : %s", diag_load_learndata ? "OK" : "NG"); - if(!diag_load_learndata) write_bios("USERDIC.DAT", fm7_mainmem_learndata, 0x2000); -#endif - -#if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) - i = FM7_MAINMEM_77AV40_EXTRAROM; - diag_load_extrarom = false; - memset(fm7_mainmem_extrarom, 0xff, 0x20000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_extrarom; - write_table[i].memory = NULL; - if(read_bios("EXTSUB.ROM", read_table[i].memory, 0xc000) >= 0xc000) diag_load_extrarom = true; - emu->out_debug_log("AV40 EXTRA ROM READING : %s", diag_load_extrarom ? "OK" : "NG"); +#if defined(_FM8) + state_fio->StateBool(diag_load_sm11_14); + state_fio->StateBool(diag_load_sm11_15); +#elif defined(_FM77_VARIANTS) + state_fio->StateBool(diag_load_wb11_12); +#elif defined(_FM7) || defined(_FMNEW7) + state_fio->StateBool(diag_load_tl11_11); +# if defined(_FMNEW7) + state_fio->StateBool(diag_load_tl11_12); +# endif +#elif defined(_FM77AV_VARIANTS) + state_fio->StateBool(dictrom_connected); + state_fio->StateBool(use_page2_extram); + + state_fio->StateBool(diag_load_initrom); + state_fio->StateBool(diag_load_dictrom); + state_fio->StateBool(diag_load_learndata); + state_fio->StateBuffer(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1); + state_fio->StateBuffer(fm77av_hidden_bootmmr, sizeof(fm77av_hidden_bootmmr), 1); + + state_fio->StateBuffer(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1); + state_fio->StateBuffer(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1); + +# if defined(_FM77AV40EX) || defined(_FM77AV40SX) + state_fio->StateBool(diag_load_extrarom); + state_fio->StateBuffer(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1); +# endif +# if defined(CAPABLE_DICTROM) + state_fio->StateBuffer(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1); + state_fio->StateBuffer(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1); +# endif #endif - -#if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS) - extram_pages = FM77_EXRAM_BANKS; -#if defined(_FM77_VARIANTS) - if(extram_pages > 3) extram_pages = 3; -#else - if(extram_pages > 12) extram_pages = 12; -#endif - if(extram_pages > 0) { - i = FM7_MAINMEM_EXTRAM; - fm7_mainmem_extram = (uint8 *)malloc(extram_pages * 0x10000); - if(fm7_mainmem_extram != NULL) { - memset(fm7_mainmem_extram, 0x00, extram_pages * 0x10000); - read_table[i].memory = fm7_mainmem_extram; - write_table[i].memory = fm7_mainmem_extram; - } - } -#endif -#if defined(_FM77_VARIANTS) - memset(fm77_shadowram, 0x00, 0x200); - read_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram; - write_table[FM7_MAINMEM_SHADOWRAM].memory = fm77_shadowram; -#endif -#if !defined(_FM77AV_VARIANTS) - for(i = FM7_MAINMEM_BOOTROM_BAS; i <= FM7_MAINMEM_BOOTROM_EXTRA; i++) { - memset(fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS], 0xff, 0x200); - read_table[i].memory = fm7_bootroms[i - FM7_MAINMEM_BOOTROM_BAS]; - write_table[i].memory = NULL; - } -#endif -#if defined(_FM8) - if(read_bios("BOOT_BAS8.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) { - diag_load_bootrom_bas = true; - } else { - diag_load_bootrom_bas = false; - } - if(read_bios("BOOT_DOS8.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) { - diag_load_bootrom_dos = true; - } else { - diag_load_bootrom_dos = false; - } - diag_load_bootrom_mmr = false; -# elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS) - if(read_bios("BOOT_BAS.ROM", fm7_bootroms[0], 0x200) >= 0x1e0) { - diag_load_bootrom_bas = true; - } else { - diag_load_bootrom_bas = false; - } - if(read_bios("BOOT_DOS.ROM", fm7_bootroms[1], 0x200) >= 0x1e0) { - diag_load_bootrom_dos = true; - } else { - diag_load_bootrom_dos = false; - } +#ifdef HAS_MMR + state_fio->StateBool(extram_connected); +# if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \ + defined(_FM77_VARIANTS) + state_fio->StateInt32(extram_pages); + state_fio->StateBuffer(fm7_mainmem_extram, extram_size, 1); # if defined(_FM77_VARIANTS) - if(read_bios("BOOT_MMR.ROM", fm7_bootroms[2], 0x200) >= 0x1e0) { - diag_load_bootrom_mmr = true; - } else { - diag_load_bootrom_mmr = false; - } - - i = FM7_MAINMEM_BOOTROM_RAM; - memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM - read_table[i].memory = fm7_bootram; - write_table[i].memory = fm7_bootram; -# else - // FM-7/8 - diag_load_bootrom_mmr = false; + state_fio->StateBuffer(fm77_shadowram, sizeof(fm77_shadowram), 1); # endif -# elif defined(_FM77AV_VARIANTS) - i = FM7_MAINMEM_AV_PAGE0; - memset(fm7_mainmem_mmrbank_0, 0x00, 0x10000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_mmrbank_0; - write_table[i].memory = fm7_mainmem_mmrbank_0; - - i = FM7_MAINMEM_AV_PAGE2; - memset(fm7_mainmem_mmrbank_2, 0x00, 0x10000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_mmrbank_2; - write_table[i].memory = fm7_mainmem_mmrbank_2; - - i = FM7_MAINMEM_INITROM; - diag_load_initrom = false; - memset(fm7_mainmem_initrom, 0xff, 0x2000 * sizeof(uint8)); - read_table[i].memory = fm7_mainmem_initrom; - write_table[i].memory = NULL; - if(read_bios("INITIATE.ROM", read_table[i].memory, 0x2000) >= 0x2000) diag_load_initrom = true; - emu->out_debug_log("77AV INITIATOR ROM READING : %s", diag_load_initrom ? "OK" : "NG"); - - read_table[FM7_MAINMEM_BOOTROM_BAS].memory = NULL; // Not connected. - read_table[FM7_MAINMEM_BOOTROM_DOS].memory = NULL; // Not connected. - read_table[FM7_MAINMEM_BOOTROM_MMR].memory = NULL; // Not connected. - - i = FM7_MAINMEM_BOOTROM_RAM; - memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8)); // RAM - read_table[i].memory = fm7_bootram; - write_table[i].memory = fm7_bootram; - if(diag_load_initrom) diag_load_bootrom_bas = true; - if(diag_load_initrom) diag_load_bootrom_dos = true; - if((config.boot_mode & 0x03) == 0) { - memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1800], 0x1e0 * sizeof(uint8)); - } else { - memcpy(fm7_bootram, &fm7_mainmem_initrom[0x1a00], 0x1e0 * sizeof(uint8)); - } - fm7_bootram[0x1fe] = 0xfe; // Set reset vector. - fm7_bootram[0x1ff] = 0x00; // - // FM-7 +# endif #endif - emu->out_debug_log("BOOT ROM (basic mode) READING : %s", diag_load_bootrom_bas ? "OK" : "NG"); - emu->out_debug_log("BOOT ROM (DOS mode) READING : %s", diag_load_bootrom_dos ? "OK" : "NG"); -#if defined(_FM77_VARIANTS) - emu->out_debug_log("BOOT ROM (MMR mode) READING : %s", diag_load_bootrom_mmr ? "OK" : "NG"); + + { // V2; + state_fio->StateBool(is_basicrom); + state_fio->StateBool(clockmode); + state_fio->StateBool(basicrom_fd0f); + state_fio->StateUint32(bootmode); +#if defined(_FM77AV_VARIANTS) + state_fio->StateUint32(extcard_bank); + state_fio->StateBool(extrom_bank); + state_fio->StateBool(initiator_enabled); + state_fio->StateBool(dictrom_enabled); + state_fio->StateBool(dictram_enabled); #endif - - i = FM7_MAINMEM_VECTOR; - memset(fm7_mainmem_bootrom_vector, 0x00, 0x1e); - read_table[i].memory = fm7_mainmem_bootrom_vector; - write_table[i].memory = fm7_mainmem_bootrom_vector; - -#if !defined(_FM77AV_VARIANTS) - for(i = 0; i <= 3; i++) { - uint8 *p = fm7_bootroms[i]; - p[0x1fe] = 0xfe; // Set reset vector. - p[0x1ff] = 0x00; // - } -#endif - i = FM7_MAINMEM_RESET_VECTOR; - fm7_mainmem_reset_vector[0] = 0xfe; - fm7_mainmem_reset_vector[1] = 0x00; - - read_table[i].memory = fm7_mainmem_reset_vector; - write_table[i].memory = NULL; - - i = FM7_MAINMEM_BASICROM; - memset(fm7_mainmem_basicrom, 0xff, 0x7c00 * sizeof(uint8)); - read_table[i].dev = NULL; - read_table[i].memory = fm7_mainmem_basicrom; - write_table[i].dev = NULL; - write_table[i].memory = NULL; -#if !defined(_FM8) - if(read_bios("FBASIC302.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) { - diag_load_basicrom = true; - } else if(read_bios("FBASIC300.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) { - diag_load_basicrom = true; - } else if(read_bios("FBASIC30.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) { - diag_load_basicrom = true; - } - -#else // FM8 - if(read_bios("FBASIC10.ROM", fm7_mainmem_basicrom, 0x7c00) == 0x7c00) diag_load_basicrom = true; -#endif - emu->out_debug_log("BASIC ROM READING : %s", diag_load_basicrom ? "OK" : "NG"); - - i = FM7_MAINMEM_BIOSWORK; - memset(fm7_mainmem_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; -} - -void FM7_MAINMEM::release() -{ - int i; -# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS) - if(fm7_mainmem_extram != NULL) free(fm7_mainmem_extram); -#endif -#if !defined(_FM77AV_VARIANTS) - for(i = 0; i < 4; i++) { - if(fm7_bootroms[i] != NULL) free(fm7_bootroms[i]); - fm7_bootroms[i] = NULL; - } +#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) + state_fio->StateBool(boot_ram_write); +#endif +#if defined(HAS_MMR) + state_fio->StateBool(window_enabled); + state_fio->StateBool(mmr_enabled); + state_fio->StateBool(mmr_fast); + state_fio->StateBool(mmr_extend); + + state_fio->StateUint16(window_offset); + state_fio->StateBool(window_fast); + state_fio->StateBool(refresh_fast); + state_fio->StateUint8(mmr_segment); + state_fio->StateBuffer(mmr_map_data, sizeof(mmr_map_data), 1); #endif -// MEMORY::release(); + } + state_fio->StateUint32(mem_waitfactor); // OK? + state_fio->StateUint32(mem_waitcount); // OK? + + state_fio->StateInt32(cpu_clocks); // OK? + + return true; } -#define STATE_VERSION 1 void FM7_MAINMEM::save_state(FILEIO *state_fio) { - int pages; - int addr; - state_fio->FputUint32(STATE_VERSION); - state_fio->FputInt32(this_device_id); - - // V1 - state_fio->FputBool(ioaccess_wait); - state_fio->FputInt32(waitfactor); - state_fio->FputInt32(waitcount); - - state_fio->FputBool(sub_halted); - - state_fio->FputBool(diag_load_basicrom); - state_fio->FputBool(diag_load_bootrom_bas); - state_fio->FputBool(diag_load_bootrom_dos); - state_fio->FputBool(diag_load_bootrom_mmr); - state_fio->Fwrite(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1); - state_fio->Fwrite(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1); - state_fio->Fwrite(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1); - state_fio->Fwrite(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1); - state_fio->Fwrite(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1); - state_fio->Fwrite(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1); - - state_fio->Fwrite(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1); -#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) - state_fio->Fwrite(fm7_bootram, sizeof(fm7_bootram), 1); -#endif -#if !defined(_FM77AV_VARIANTS) - for(addr = 0; addr < 4; addr++) state_fio->Fwrite(fm7_bootroms[addr], sizeof(0x200), 1); -#endif -#ifdef _FM77AV_VARIANTS - state_fio->FputBool(dictrom_connected); - state_fio->FputBool(use_page2_extram); - - state_fio->FputBool(diag_load_initrom); - state_fio->FputBool(diag_load_dictrom); - state_fio->FputBool(diag_load_learndata); - state_fio->Fwrite(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1); - state_fio->Fwrite(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1); - state_fio->Fwrite(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1); - -# if defined(CAPABLE_DICTROM) - state_fio->FputBool(diag_load_extrarom); - state_fio->Fwrite(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1); - state_fio->Fwrite(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1); - state_fio->Fwrite(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1); -# endif -#endif - -#ifdef HAS_MMR - state_fio->FputBool(extram_connected); -# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS) - state_fio->FputInt32(extram_pages); - pages = extram_pages; -# if defined(_FM77_VARIANTS) - if(pages > 3) pages = 3; -# else - if(pages > 12) pages = 12; -# endif - if(pages > 0) state_fio->Fwrite(fm7_mainmem_extram, pages * 0x10000, 1); + decl_state(state_fio, false); +#if defined(HAS_MMR) # if defined(_FM77_VARIANTS) - state_fio->Fwrite(fm77_shadowram, sizeof(fm77_shadowram), 1); + if(extram_pages > 3) extram_pages = 3; +# elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) + if(extram_pages > 12) extram_pages = 12; # endif -# endif #endif + //extram_size = extram_pages * 0x10000; } bool FM7_MAINMEM::load_state(FILEIO *state_fio) { - int pages; - int addr; - bool stat = false; - uint32 version; - version = state_fio->FgetUint32(); - if(this_device_id != state_fio->FgetInt32()) return false; - if(version >= 1) { - // V1 - ioaccess_wait = state_fio->FgetBool(); - waitfactor = state_fio->FgetInt32(); - waitcount = state_fio->FgetInt32(); - - sub_halted = state_fio->FgetBool(); - - diag_load_basicrom = state_fio->FgetBool(); - diag_load_bootrom_bas = state_fio->FgetBool(); - diag_load_bootrom_dos = state_fio->FgetBool(); - diag_load_bootrom_mmr = state_fio->FgetBool(); - - state_fio->Fread(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1); - state_fio->Fread(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1); - state_fio->Fread(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1); - state_fio->Fread(fm7_mainmem_bioswork, sizeof(fm7_mainmem_bioswork), 1); - state_fio->Fread(fm7_mainmem_bootrom_vector, sizeof(fm7_mainmem_bootrom_vector), 1); - state_fio->Fread(fm7_mainmem_reset_vector, sizeof(fm7_mainmem_reset_vector), 1); - - state_fio->Fread(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1); -#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS) - state_fio->Fread(fm7_bootram, sizeof(fm7_bootram), 1); -#endif -#if !defined(_FM77AV_VARIANTS) - for(addr = 0; addr < 4; addr++) state_fio->Fread(fm7_bootroms[addr], sizeof(0x200), 1); -#endif -#ifdef _FM77AV_VARIANTS - dictrom_connected = state_fio->FgetBool(); - use_page2_extram = state_fio->FgetBool(); - - diag_load_initrom = state_fio->FgetBool(); - diag_load_dictrom = state_fio->FgetBool(); - diag_load_learndata = state_fio->FgetBool(); - state_fio->Fread(fm7_mainmem_initrom, sizeof(fm7_mainmem_initrom), 1); - state_fio->Fread(fm7_mainmem_mmrbank_0, sizeof(fm7_mainmem_mmrbank_0), 1); - state_fio->Fread(fm7_mainmem_mmrbank_2, sizeof(fm7_mainmem_mmrbank_2), 1); - -# if defined(CAPABLE_DICTROM) - diag_load_extrarom = state_fio->FgetBool(); - state_fio->Fread(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1); - state_fio->Fread(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1); - state_fio->Fread(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1); -# endif -#endif - -#ifdef HAS_MMR - extram_connected = state_fio->FgetBool(); -# if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77_VARIANTS) - extram_pages = state_fio->FgetInt32(); - pages = extram_pages; -# if defined(_FM77_VARIANTS) - if(pages > 3) pages = 3; -# else - if(pages > 12) pages = 12; -# endif - if(pages > 0) state_fio->Fread(fm7_mainmem_extram, pages * 0x10000, 1); + bool mb = decl_state(state_fio, true); + this->out_debug_log(_T("Load State: MAINMEM: id=%d stat=%s\n"), this_device_id, (mb) ? _T("OK") : _T("NG")); + if(!mb) return false; + +#if defined(HAS_MMR) # if defined(_FM77_VARIANTS) - state_fio->Fread(fm77_shadowram, sizeof(fm77_shadowram), 1); + if(extram_pages > 3) extram_pages = 3; +# elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) + if(extram_pages > 12) extram_pages = 12; # endif -# endif #endif - if(version == 1) return true; - } - return false; + //extram_size = extram_pages * 0x10000; + init_data_table(); + update_all_mmr_jumptable(); + return true; +} }