static void cpu_reset_generic(i386_state* cpustate)
{
+ int busreq = cpustate->busreq;
+ int haltreq = cpustate->haltreq;
switch(cpustate->cpu_type) {
case N_CPU_TYPE_I386:
CPU_RESET_CALL( i386 );
CPU_RESET_CALL( i386 );
break;
}
+ cpustate->busreq = busreq;
+ cpustate->haltreq = haltreq;
}
{
int first_cycles = cpustate->cycles;
if (cpustate->haltreq != 0) {
- cpustate->extra_cycles += first_cycles - cpustate->cycles;
- cpustate->cycles = first_cycles;
+// cpustate->extra_cycles += first_cycles - cpustate->cycles;
+// cpustate->cycles = first_cycles;
return;
}
if (state != CLEAR_LINE && cpustate->halted)
if (cycles == -1) {
int passed_cycles = max(1, cpustate->extra_cycles);
// this is main cpu, cpustate->cycles is not used
- cpustate->cycles += passed_cycles;
+ cpustate->cycles -= passed_cycles;
+ /* if busreq is raised, spin cpu while remained clock */
+ if (cpustate->cycles > 0) {
+ cpustate->cycles = 0;
+ }
+// cpustate->cycles = 0;
cpustate->base_cycles = cpustate->cycles;
/* adjust for any interrupts that came in */
return passed_cycles;
}
}
- int ncycles;
if (cycles == -1) {
cpustate->cycles = 1;
- ncycles = 1;
} else {
cpustate->cycles += cycles;
- ncycles = cycles;
}
cpustate->base_cycles = cpustate->cycles;
cpustate->debugger->exception_happened = true;
exception_caused = false;
exception_code = 0;
- printf("EXCEPTION HIT PC=%08X CODE=%X\n", exception_pc, exception_code);
+ //printf("EXCEPTION HIT PC=%08X CODE=%X\n", exception_pc, exception_code);
}
cpustate->debugger->check_break_points(cpustate->pc);
if(cpustate->debugger->now_suspended) {
cpustate->io = cpustate->io_stored;
}
}
+ int passed_icount;
if (icount == -1) {
- int passed_icount = max(1, cpustate->extra_cycles);
+ passed_icount = max(1, cpustate->extra_cycles);
// this is main cpu, cpustate->icount is not used
cpustate->icount += passed_icount;
cpustate->extra_cycles = 0;
-//#ifdef USE_DEBUGGER
cpustate->total_icount += passed_icount;
-//#endif
- cpu_wait_v30(cpustate, passed_icount);
- return passed_icount;
+// cpu_wait_v30(cpustate, passed_icount);
} else {
+#if 0
cpustate->icount += icount;
int base_icount = cpustate->icount;
-
/* adjust for any interrupts that came in */
cpustate->icount -= cpustate->extra_cycles;
-
+ cpustate->extra_cycles = 0;
/* if busreq is raised, spin cpu while remained clock */
if (cpustate->icount > 0) {
cpustate->icount = 0;
cpustate->total_icount += base_icount - cpustate->icount;
//#endif
cpu_wait_v30(cpustate, base_icount - cpustate->icount);
- cpustate->extra_cycles = 0;
return base_icount - cpustate->icount;
+#else
+ int passed_icount = 0;
+ if(icount > 0) {
+ passed_icount = icount;
+ }
+ if(cpustate->extra_cycles > 0) {
+ passed_icount += cpustate->extra_cycles;
+ }
+ cpustate->icount = 0;
+ cpustate->extra_cycles = 0;
+ cpustate->total_icount += passed_icount;
+//#endif
+// cpu_wait_v30(cpustate, passed_icount);
+#endif
}
+ return passed_icount;
}
+ // Not HALTED
if (icount == -1) {
cpustate->icount = 1;
} else {
cpustate->total_icount += cpustate->icount;
//#endif
cpustate->icount = 0;
+ return base_icount;
}
- cpu_wait_v30(cpustate, base_icount - cpustate->icount);
int passed_icount = base_icount - cpustate->icount;
+ cpu_wait_v30(cpustate, passed_icount);
cpustate->icount = 0;
return passed_icount;
}