OSDN Git Service

[VM][FM7][MAINMEM] More accurate wait implementation.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 27 Feb 2018 19:26:55 +0000 (04:26 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 27 Feb 2018 19:26:55 +0000 (04:26 +0900)
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_mainmem.cpp
source/src/vm/fm7/mainmem_readseq.cpp

index f935945..8bc135e 100644 (file)
@@ -387,8 +387,8 @@ void VM::connect_bus(void)
        //if((config.dipswitch & FM7_DIPSW_CYCLESTEAL) != 0) subclock = subclock / 3;
 #endif
        mainclock = CPU_CLOCKS;
-//     subclock = SUBCLOCK_NORMAL;
-//     event->set_context_cpu(dummycpu, MAINCLOCK_SLOW / 2);
+       subclock = SUBCLOCK_NORMAL;
+
        event->set_context_cpu(maincpu, mainclock);
        event->set_context_cpu(subcpu,  subclock);      
    
index 6db17b2..0f86735 100644 (file)
 
 // TODO: check refresh rate
 //#define FRAMES_PER_SEC               60.0962 /* Related to display.cpp */ 
-#define FRAMES_PER_SEC         59.94 /* Related to display.cpp */ 
+#define FRAMES_PER_SEC         60.00 /* Related to display.cpp */ 
 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77L4)
 #define LINES_PER_FRAME        400
 #else
 
 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
   defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
-#define CPU_CLOCKS             2196000 /* 2016 * 1.089 */
+#define CPU_CLOCKS             2016000 /* 2016 */
 #else
 #define CPU_CLOCKS      1798000   /* FM8,7 - 77AV/20? */
 #endif
index eae08eb..3203b96 100644 (file)
@@ -151,10 +151,10 @@ void FM7_MAINMEM::setclock(int mode)
                clock = MAINCLOCK_NORMAL;
 #endif                         
        }
-       mem_waitcount = 0;
-       if(CPU_CLOCKS > clock) {
-               //mem_waitfactor = (uint32_t)(4096.0 * (double)(CPU_CLOCKS - clock) / (double)clock);
+       //mem_waitcount = 0;
+       if(CPU_CLOCKS >= clock) {
                mem_waitfactor = (uint32_t)(4096.0 * (1.0 - ((double)clock / (double)CPU_CLOCKS)));
+               //out_debug_log(_T("CLOCK=%d WAIT FACTOR=%d"), clock, mem_waitfactor);
        } else {
                mem_waitfactor = 0;
        }
@@ -163,39 +163,39 @@ void FM7_MAINMEM::setclock(int mode)
                
 void FM7_MAINMEM::cpuwait()
 {
-#if 1
        mem_waitcount += mem_waitfactor;
        if(mem_waitcount >= 4096) {
-               uint32_t val = mem_waitcount >> 12;
+               uint32_t val = mem_waitcount / 4096;
                if(maincpu != NULL) maincpu->set_extra_clock(val); // 
-               mem_waitcount = mem_waitcount - (val << 12) ;
+               mem_waitcount = mem_waitcount & 0x0fff;
        }
-#endif
 }
 
 void FM7_MAINMEM::iowait()
 {
-       int _waitfactor; // If MMR of TWR enabled, factor = 3.
-                           // If memory, factor = 2?
+       int _waitfactor = 0;
        if(!clockmode) return; // SLOW
 #ifdef HAS_MMR
-    //if(!mmr_fast && !window_fast && (window_enabled || mmr_enabled)) waitfactor = 2;
-       if(!ioaccess_wait) {
+       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;
-               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(mmr_fast) _waitfactor = 2;
-               ioaccess_wait = false;
-       } 
+       }
 #else
        _waitfactor = 2;
 #endif   
        if(_waitfactor <= 0) return;
        waitcount++;
        if(waitcount >= _waitfactor) {
-               if(maincpu != NULL) maincpu->set_extra_clock(1);
+               mem_waitcount += 4096;
+               cpuwait();
                waitcount = 0;
+               ioaccess_wait = !ioaccess_wait;
        }
 }
 
index f3443fa..cd9ba90 100644 (file)
@@ -235,7 +235,7 @@ uint8_t FM7_MAINMEM::read_bootrom(uint32_t addr, bool dmamode)
                return fm7_mainmem_bootrom_vector[addr - 0x1e0];
        } else { // RESET VECTOR
 #if defined(_FM77AV_VARIANTS)
-               iowait();
+               if(initiator_enabled) iowait();
                return fm7_bootram[addr];
 #elif defined(_FM77_VARIANTS)
                iowait();