OSDN Git Service

[VM] TRY:Use namespace {VMNAME} to separate around VMs. This feature still apply...
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_mainmem.cpp
index 3203b96..3852475 100644 (file)
@@ -8,11 +8,16 @@
 #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
 
-FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+namespace FM7 {
+
+FM7_MAINMEM::FM7_MAINMEM(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
 {
-       p_vm = parent_vm;
-       p_emu = parent_emu;
 #if !defined(_FM77AV_VARIANTS)
        for(int i = 0; i < 8; i++) fm7_bootroms[i] = (uint8_t *)malloc(0x200);
 #endif
@@ -27,7 +32,6 @@ FM7_MAINMEM::FM7_MAINMEM(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, par
        fm7_mainmem_extram = NULL;
 #endif
        cpu_clocks = CPU_CLOCKS;
-       event_memorywait = -1;
        // Initialize table
        set_device_name(_T("MAIN MEMORY"));
 }
@@ -46,8 +50,8 @@ void FM7_MAINMEM::reset()
        mem_waitfactor = 0;
        mem_waitcount = 0;
        ioaccess_wait = false;
-       //sub_halted = (display->read_signal(SIG_DISPLAY_HALT) == 0) ? false : true;
-       sub_halted = 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)
@@ -118,63 +122,52 @@ void FM7_MAINMEM::setclock(int mode)
 #endif         
        } else {
 #if defined(HAS_MMR)
-               if(window_enabled) {
-                       if(window_fast) {
-                               clock = MAINCLOCK_FAST_MMR;
-                       } else {
-                               clock = MAINCLOCK_MMR;
-                       }
-               } else if(mmr_enabled) {
-                       if(mmr_fast) {
-                               clock = MAINCLOCK_FAST_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_MMR;
-                       }
+                               clock = MAINCLOCK_FAST_MMR - ((100000000 / 1302) * 3);  // Slow Refresh: 3Wait(!)
+                       }                               
+                       if(mmr_enabled || window_enabled) {
+                               clock = (uint32_t)((double)clock * 0.87);
+                       }                                       
                } else {
-                       // fix by Ryu Takegami
-                       if(mmr_fast) {
-                               clock = MAINCLOCK_FAST_MMR;
-                       } else {
-                               clock = MAINCLOCK_NORMAL;
-                       }
+                       clock = MAINCLOCK_FAST_MMR;
+                       //if(!(mmr_enabled) && !(window_enabled)) clock = MAINCLOCK_NORMAL;
                }
-               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);
-                               }                                       
-                       }
+#  else
+               if(mmr_enabled || window_enabled) {
+                       clock = MAINCLOCK_MMR;
+               } else {
+                       clock = MAINCLOCK_NORMAL;
                }
+#  endif
 #else
                clock = MAINCLOCK_NORMAL;
 #endif                         
        }
        //mem_waitcount = 0;
-       if(CPU_CLOCKS >= clock) {
-               mem_waitfactor = (uint32_t)(4096.0 * (1.0 - ((double)clock / (double)CPU_CLOCKS)));
+       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::cpuwait()
-{
-       mem_waitcount += mem_waitfactor;
-       if(mem_waitcount >= 4096) {
-               uint32_t val = mem_waitcount / 4096;
-               if(maincpu != NULL) maincpu->set_extra_clock(val); // 
-               mem_waitcount = mem_waitcount & 0x0fff;
-       }
-}
 
 void FM7_MAINMEM::iowait()
 {
        int _waitfactor = 0;
-       if(!clockmode) return; // SLOW
+       if(config.cpu_type == 1) return; // SLOW
 #ifdef HAS_MMR
        if((window_enabled) || (mmr_enabled)) {
                if(!ioaccess_wait) {
@@ -192,8 +185,7 @@ void FM7_MAINMEM::iowait()
        if(_waitfactor <= 0) return;
        waitcount++;
        if(waitcount >= _waitfactor) {
-               mem_waitcount += 4096;
-               cpuwait();
+               maincpu->set_extra_clock(1);
                waitcount = 0;
                ioaccess_wait = !ioaccess_wait;
        }
@@ -373,12 +365,20 @@ void FM7_MAINMEM::write_signal(int sigid, uint32_t data, uint32_t mask)
        }
 }
 
+uint32_t FM7_MAINMEM::read_io8(uint32_t addr)
+{
+       return mainio->read_io8(addr);
+}
+
+void FM7_MAINMEM::write_io8(uint32_t addr, uint32_t data)
+{
+       return mainio->write_io8(addr, data);
+}
 
 uint32_t FM7_MAINMEM::read_dma_data8(uint32_t addr)
 {
 #if defined(HAS_MMR)   
        uint32_t val;
-       cpuwait();
        val = this->read_data8_main(addr & 0xffff, true);
        return val;
 #else
@@ -390,7 +390,6 @@ uint32_t FM7_MAINMEM::read_dma_io8(uint32_t addr)
 {
 #if defined(HAS_MMR)   
        uint32_t val;
-       cpuwait();
        val = this->read_data8_main(addr & 0xffff, true);
        return val;
 #else
@@ -418,27 +417,24 @@ uint32_t FM7_MAINMEM::read_data8(uint32_t addr)
                return 0xff;
        }
 #endif   
-       cpuwait();
        return read_data8_main(addr, false);
 }
 
 void FM7_MAINMEM::write_dma_data8(uint32_t addr, uint32_t data)
 {
 #if defined(HAS_MMR)
-       cpuwait();
-       this->write_data8_main(addr & 0xffff, data, true);
+       write_data8_main(addr & 0xffff, data, true);
 #else
-       this->write_data8(addr & 0xffff, data);
+       write_data8(addr & 0xffff, data);
 #endif 
 }
 
 void FM7_MAINMEM::write_dma_io8(uint32_t addr, uint32_t data)
 {
 #if defined(HAS_MMR)
-       cpuwait();
-       this->write_data8_main(addr & 0xffff, data, true);
+       write_data8_main(addr & 0xffff, data, true);
 #else
-       this->write_data8(addr & 0xffff, data);
+       write_data8(addr & 0xffff, data);
 #endif 
 }
 
@@ -467,7 +463,6 @@ void FM7_MAINMEM::write_data8(uint32_t addr, uint32_t data)
                return;
        }
 #endif
-       cpuwait();
        write_data8_main(addr, data, false);
 }
 
@@ -526,264 +521,159 @@ void FM7_MAINMEM::update_config()
        setclock(config.cpu_type);
 }
 
-#define STATE_VERSION 7
-void FM7_MAINMEM::save_state(FILEIO *state_fio)
+#define STATE_VERSION 8
+
+bool FM7_MAINMEM::decl_state(FILEIO *state_fio, bool loading)
 {
-       state_fio->FputUint32_BE(STATE_VERSION);
-       state_fio->FputInt32_BE(this_device_id);
-       this->out_debug_log(_T("Save State: MAINMEM: id=%d ver=%d\n"), this_device_id, STATE_VERSION);
-
-       // V1
-       state_fio->FputBool(ioaccess_wait);
-       state_fio->FputInt32_BE(waitfactor);
-       state_fio->FputInt32_BE(waitcount);
-       state_fio->FputBool(sub_halted);
+       if(!state_fio->StateCheckUint32(STATE_VERSION)) {
+               return false;
+       }
+       if(!state_fio->StateCheckInt32(this_device_id)) {
+               return false;
+       }
        
-       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->FputBool(diag_load_bootrom_bubble);
-       state_fio->FputBool(diag_load_bootrom_bubble_128k);
-       state_fio->FputBool(diag_load_bootrom_sfd8);
-       state_fio->FputBool(diag_load_bootrom_2hd);
-
-       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->StateBool(ioaccess_wait);
+       state_fio->StateInt32(waitfactor);
+       state_fio->StateInt32(waitcount);
+       state_fio->StateBool(sub_halted);
        
-       state_fio->Fwrite(fm7_mainmem_null, sizeof(fm7_mainmem_null), 1);
+       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);
+
 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
-       state_fio->Fwrite(fm7_bootram, sizeof(fm7_bootram), 1);
+       state_fio->StateBuffer(fm7_bootram, sizeof(fm7_bootram), 1);
 #endif 
 #if defined(_FM77_VARIANTS) || defined(_FM8)
-       for(int i = 0; i < 8; i++) state_fio->Fwrite(fm7_bootroms[i], sizeof(0x200), 1);
+       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->Fwrite(fm7_bootroms[i], sizeof(0x200), 1);
+       for(int i = 0; i < 4; i++) state_fio->StateBuffer(fm7_bootroms[i], 0x200, 1);
 #endif 
+
 #if defined(_FM8)
-       state_fio->FputBool(diag_load_sm11_14);
-       state_fio->FputBool(diag_load_sm11_15);
+       state_fio->StateBool(diag_load_sm11_14);
+       state_fio->StateBool(diag_load_sm11_15);
 #elif defined(_FM77_VARIANTS)
-       state_fio->FputBool(diag_load_wb11_12);
+       state_fio->StateBool(diag_load_wb11_12);
 #elif defined(_FM7) || defined(_FMNEW7)
-       state_fio->FputBool(diag_load_tl11_11);
+       state_fio->StateBool(diag_load_tl11_11);
 #  if defined(_FMNEW7)
-       state_fio->FputBool(diag_load_tl11_12);
+       state_fio->StateBool(diag_load_tl11_12);
 #  endif       
 #elif defined(_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(fm77av_hidden_bootmmr, sizeof(fm77av_hidden_bootmmr), 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);
-       
+       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->FputBool(diag_load_extrarom);
-       state_fio->Fwrite(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
+       state_fio->StateBool(diag_load_extrarom);
+       state_fio->StateBuffer(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
 # endif
 # if defined(CAPABLE_DICTROM)
-       state_fio->Fwrite(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
-       state_fio->Fwrite(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
+       state_fio->StateBuffer(fm7_mainmem_dictrom, sizeof(fm7_mainmem_dictrom), 1);
+       state_fio->StateBuffer(fm7_mainmem_learndata, sizeof(fm7_mainmem_learndata), 1);
 # endif
 #endif
-       
+
 #ifdef HAS_MMR
-       state_fio->FputBool(extram_connected);
+       state_fio->StateBool(extram_connected);
 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
-        defined(_FM77_VARIANTS)
-       int pages;
-       state_fio->FputInt32_BE(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);
+       defined(_FM77_VARIANTS)
+       state_fio->StateInt32(extram_pages);
+       state_fio->StateBuffer(fm7_mainmem_extram, extram_size, 1);
 #  if defined(_FM77_VARIANTS)
-       state_fio->Fwrite(fm77_shadowram, sizeof(fm77_shadowram), 1);
+       state_fio->StateBuffer(fm77_shadowram, sizeof(fm77_shadowram), 1);
 #  endif
 # endif
 #endif
-       
-       { // V2;
-               state_fio->FputBool(is_basicrom);
-               state_fio->FputBool(clockmode);
-               state_fio->FputBool(basicrom_fd0f);
-               state_fio->FputUint32_BE(bootmode);
+                                                         
+       { // 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->FputUint32_BE(extcard_bank);
-               state_fio->FputBool(extrom_bank);
-               state_fio->FputBool(initiator_enabled);
-               state_fio->FputBool(dictrom_enabled);
-               state_fio->FputBool(dictram_enabled);
+               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
 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
-               state_fio->FputBool(boot_ram_write);
+               state_fio->StateBool(boot_ram_write);
 #endif         
 #if defined(HAS_MMR)
-               state_fio->FputBool(window_enabled);
-               state_fio->FputBool(mmr_enabled);
-               state_fio->FputBool(mmr_fast);
-               state_fio->FputBool(mmr_extend);
-               
-               state_fio->FputUint16_BE(window_offset);
-               state_fio->FputBool(window_fast);
-               state_fio->FputBool(refresh_fast);
-               state_fio->FputUint8(mmr_segment);
-               state_fio->Fwrite(mmr_map_data, sizeof(mmr_map_data), 1);
+               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
-       }
-       state_fio->FputUint32_BE(mem_waitfactor); // OK?
-       state_fio->FputUint32_BE(mem_waitcount); // OK?
+       }
+       state_fio->StateUint32(mem_waitfactor); // OK?
+       state_fio->StateUint32(mem_waitcount); // OK?
 
-       state_fio->FputUint32_BE(cpu_clocks); // OK?
+       state_fio->StateInt32(cpu_clocks); // OK?
+       return true;
 }
 
-bool FM7_MAINMEM::load_state(FILEIO *state_fio)
+void FM7_MAINMEM::save_state(FILEIO *state_fio)
 {
-       uint32_t version;
-       version = state_fio->FgetUint32_BE();
-       if(this_device_id != state_fio->FgetInt32_BE()) return false;
-       this->out_debug_log(_T("Load State: MAINMEM: id=%d ver=%d\n"), this_device_id, version);
-       if(version >= 1) {
-               // V1
-               ioaccess_wait = state_fio->FgetBool();
-               waitfactor = state_fio->FgetInt32_BE();
-               waitcount = state_fio->FgetInt32_BE();
-
-               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();
-               diag_load_bootrom_bubble = state_fio->FgetBool();
-               diag_load_bootrom_bubble_128k = state_fio->FgetBool();
-               diag_load_bootrom_sfd8 = state_fio->FgetBool();
-               diag_load_bootrom_2hd = 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(_FM77_VARIANTS) || defined(_FM8)
-       for(int i = 0; i < 8; i++) state_fio->Fread(fm7_bootroms[i], sizeof(0x200), 1);
-#elif defined(_FM7) || defined(_FMNEW7)
-       for(int i = 0; i < 4; i++) state_fio->Fread(fm7_bootroms[i], sizeof(0x200), 1);
-#endif 
-#if defined(_FM8)
-       diag_load_sm11_14 = state_fio->FgetBool();
-       diag_load_sm11_15 = state_fio->FgetBool();
-#elif defined(_FM77_VARIANTS)
-       diag_load_wb11_12 = state_fio->FgetBool();
-#elif defined(_FM7) || defined(_FMNEW7)
-       diag_load_tl11_11 = state_fio->FgetBool();
-#  if defined(_FMNEW7)
-       diag_load_tl11_12 = state_fio->FgetBool();
-#  endif       
-#elif defined(_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(fm77av_hidden_bootmmr, sizeof(fm77av_hidden_bootmmr), 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(_FM77AV40EX) || defined(_FM77AV40SX)
-               diag_load_extrarom = state_fio->FgetBool();
-               state_fio->Fread(fm7_mainmem_extrarom, sizeof(fm7_mainmem_extrarom), 1);
-# endif                
-# if defined(CAPABLE_DICTROM)
-               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(_FM77AV40EX) || defined(_FM77AV40SX) || \
-        defined(_FM77_VARIANTS)
-               int pages;
-               extram_pages = state_fio->FgetInt32_BE();
-               pages = extram_pages;
-#  if defined(_FM77_VARIANTS)
-               if(pages > 3) pages = 3;
-#  else
-               if(pages > 12) pages = 12;
-#  endif       
-               if(fm7_mainmem_extram != NULL) {
-                       free(fm7_mainmem_extram);
-                       fm7_mainmem_extram = NULL;
-               }
-               if(pages > 0) {
-                       fm7_mainmem_extram = (uint8_t *)malloc(pages * 0x10000);
-                       state_fio->Fread(fm7_mainmem_extram, pages * 0x10000, 1);
-               }
+       decl_state(state_fio, 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;
-       }
-       { // V2;
-               is_basicrom = state_fio->FgetBool();
-               clockmode = state_fio->FgetBool();
-               basicrom_fd0f = state_fio->FgetBool();
-               bootmode = state_fio->FgetUint32_BE();
-#if defined(_FM77AV_VARIANTS)
-               extcard_bank = state_fio->FgetUint32_BE();
-               extrom_bank = state_fio->FgetBool();
-               initiator_enabled = state_fio->FgetBool();
-               dictrom_enabled = state_fio->FgetBool();
-               dictram_enabled = state_fio->FgetBool();
 #endif
-#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
-               boot_ram_write = state_fio->FgetBool();
-#endif         
+       //extram_size = extram_pages * 0x10000;
+}
+
+bool FM7_MAINMEM::load_state(FILEIO *state_fio)
+{
+       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)
-               window_enabled = state_fio->FgetBool();
-               mmr_enabled = state_fio->FgetBool();
-               mmr_fast = state_fio->FgetBool();
-               mmr_extend = state_fio->FgetBool();
-               
-               window_offset = state_fio->FgetUint16_BE();
-               window_fast = state_fio->FgetBool();
-               refresh_fast = state_fio->FgetBool();
-               mmr_segment = state_fio->FgetUint8();
-               state_fio->Fread(mmr_map_data, sizeof(mmr_map_data), 1);
+#  if defined(_FM77_VARIANTS)
+       if(extram_pages > 3) extram_pages = 3;
+#  elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) 
+       if(extram_pages > 12) extram_pages = 12;
+#  endif
 #endif
-       }
-       mem_waitfactor = state_fio->FgetUint32_BE();
-       mem_waitcount = state_fio->FgetUint32_BE();
-
-       cpu_clocks = state_fio->FgetUint32_BE();
-       
-       init_data_table();
-       update_all_mmr_jumptable();
-       if(version != STATE_VERSION) return false;
-       return true;
+       //extram_size = extram_pages * 0x10000;
+       init_data_table();
+       update_all_mmr_jumptable();
+       return true;
+}
 }