OSDN Git Service

[VM][MC6809][FM7] Fix correct to determine clocks.Maybe useful for low-clock host...
authorKyuma Ohta <whatisthis.sowhat@gmail.com>
Tue, 11 Aug 2015 03:57:15 +0000 (12:57 +0900)
committerKyuma Ohta <whatisthis.sowhat@gmail.com>
Tue, 11 Aug 2015 03:57:15 +0000 (12:57 +0900)
source/src/vm/fm7/fm7.cpp
source/src/vm/mc6809.cpp

index d821812..8892be0 100644 (file)
@@ -173,8 +173,8 @@ void VM::connect_bus(void)
         */
        event->set_frames_per_sec(FRAMES_PER_SEC);
        event->set_lines_per_frame(LINES_PER_FRAME);
-       //event->set_context_cpu(dummycpu, CPU_CLOCKS / 2);
-       event->set_context_cpu(dummycpu, SUBCLOCK_SLOW);
+       event->set_context_cpu(dummycpu, CPU_CLOCKS / 3);
+       //event->set_context_cpu(dummycpu, SUBCLOCK_SLOW);
        
 #if defined(_FM8)
        mainclock = MAINCLOCK_SLOW;
index fc88fd5..bd10f24 100644 (file)
@@ -364,21 +364,29 @@ void MC6809::cpu_irq(void)
 int MC6809::run(int clock)
 {
        int cycle = 0;
+       int first_icount;
+       if (clock >= 0) {
+               icount += clock;
+       }
+       first_icount = icount;
+
        if ((int_state & MC6809_HALT_BIT) != 0) {       // 0x80
-               if(icount > 0) icount = 0;  // OK?
+               icount = 0;
+               icount -= extra_icount;
+               extra_icount = 0;
                if(!busreq) write_signals(&outputs_bus_halt, 0xffffffff);
                busreq = true;
-               return icount;
+               return first_icount - icount;
        }
        if(busreq) write_signals(&outputs_bus_halt, 0x00000000);
        busreq = false;
        if((int_state & MC6809_INSN_HALT) != 0) {       // 0x80
                uint8 dmy = RM(PCD);
-               icount -= 2;
-               icount -= extra_icount;
-               extra_icount = 0;
+               icount = 0;
+               icount -= extra_icount;
+               extra_icount = 0;
                PC++;
-               return icount;
+               return first_icount - icount;
        }
        /*
         * Check Interrupt
@@ -432,33 +440,38 @@ int_cycle:
        } else {
                int_state &= ~MC6809_CWAI_IN;
        }
-       return icount;
+       return first_icount - icount;
 
        // run cpu
 check_ok:
        if((int_state & MC6809_SYNC_IN) != 0) {
-               icount = 0;
-               return icount;
+               if (clock >= 0) {
+                       icount -= clock;
+               } else {
+                       icount = 0;
+               }
+               return first_icount - icount;
        }
        if((int_state & MC6809_CWAI_IN) == 0) {
                if(clock == -1) {
                // run only one opcode
-                 //icount = 0;
                        run_one_opecode();
                        return icount;
                } else {
                        // run cpu while given clocks
-                       icount += clock;
-                       int first_icount = icount;
-                       
                        while(icount > 0) {
                                run_one_opecode();
                        }
                        return first_icount - icount;
                }
-       } else {
-               icount = 0;
-               return icount;
+       } else { // CWAI_IN
+               if (clock >= 0) {
+                       icount -= clock;
+               }
+               else {
+                       icount = 0;
+               }
+               return first_icount - icount;
        }
 
 }