Esempio n. 1
0
/* Run a number of tstates */
void link_wait(CPU_t *cpu, uint64_t tstates) {
	uint64_t time_end = cpu->timer_c->tstates + tstates;

	while (cpu->timer_c->tstates < time_end) {
		CPU_step(cpu);
	}
}
Esempio n. 2
0
int calc_run_frame(LPCALC lpCalc) {
	uint64_t end_time = lpCalc->timer_c.freq / FPS;
	uint64_t cpu_sync = tc_tstates(&lpCalc->timer_c) + end_time - lpCalc->time_error;

	while(lpCalc->running) {
		CPU_step(&lpCalc->cpu);

		if (tc_tstates(&lpCalc->timer_c) >= cpu_sync) {
			lpCalc->time_error = (time_t)(tc_tstates((&lpCalc->timer_c)) - cpu_sync);
			return 0;
		}
	}

	return 0;
}
Esempio n. 3
0
int calc_run_all(void) {
	int i, j, active_calc = -1;
	BOOL calc_waiting = FALSE;

	for (i = 0; i < FRAME_SUBDIVISIONS; i++) {
		link_hub[MAX_CALCS]->host = 0;
		for (j = 0; j < MAX_CALCS; j++) {
			char hostVal = 0;
			for (int k = 0; k < MAX_CALCS; k++) {
				if (link_hub[k] != NULL && link_hub[k]->host) {
					hostVal |= link_hub[k]->host;
					calc_waiting |= link_hub[k]->hasChanged;
				}
			}
			if (hostVal != link_hub[MAX_CALCS]->host) {
				link_hub[MAX_CALCS]->host = hostVal;
				calc_waiting = TRUE;
				for (int k = 0; k < MAX_CALCS; k++) {
					if (link_hub[k]) {
						link_hub[k]->hasChanged = TRUE;
						link_hub[k]->changedTime = calcs[k].timer_c.tstates;
					}
				}
			}
			if (calcs[j].active) {
				/*if (link_hub[j] != NULL && (!link_hub[MAX_CALCS]->host || link_hub[MAX_CALCS]->host != link_hub[j]->host)
					&& calcs[j].cpu.is_link_instruction || ((int) (calcs[j].cpu.linking_time - calcs[j].cpu.timer_c->tstates) >= 100000)) {
					calcs[j].cpu.is_link_instruction = FALSE;
					calcs[j].cpu.linking_time = 0;
					CPU_step(&calcs[j].cpu);
				}*/
				if (calcs[j].cpu.is_link_instruction && calcs[j].cpu.pio.link->changedTime - calcs[j].timer_c.tstates >= 100000) {
					calcs[j].cpu.is_link_instruction = FALSE;
					calcs[j].cpu.pio.link->changedTime = 0;
					calcs[j].cpu.pio.link->hasChanged = FALSE;
					CPU_step(&calcs[j].cpu);
				}
				active_calc = j;
				int time = (int)((int64_t) calcs[j].speed * calcs[j].timer_c.freq / FPS / 100) / FRAME_SUBDIVISIONS;
				if (!calcs[j].cpu.is_link_instruction || !calc_waiting || calcs[j].cpu.pio.link->hasChanged == TRUE) {
					calc_run_tstates(&calcs[j], time);
				} /*else {
					calcs[j].cpu.linking_time += time;
				}*/
			}
		}

		if (link_hub_count > 1 && calc_waiting_link >= link_hub_count) {
			for (int k = 0; k < MAX_CALCS; k++) {
				if (calcs[k].cpu.is_link_instruction) {
					calcs[k].cpu.is_link_instruction = FALSE;
					CPU_step(&calcs[k].cpu);
				}
			}
			calc_waiting_link = 0;
		}

		//this code handles screenshoting if were actually taking screenshots right now
		if (active_calc >= 0 && !calc_waiting_link && calcs[active_calc].cpu.timer_c != NULL && calcs[active_calc].cpu.pio.lcd != NULL &&
				((tc_elapsed(calcs[active_calc].cpu.timer_c) - calcs[active_calc].cpu.pio.lcd->lastgifframe) >= 0.01)) {
			handle_screenshot();
			calcs[active_calc].cpu.pio.lcd->lastgifframe += 0.01;
		}
	}

	return 0;
}
Esempio n. 4
0
int calc_run_tstates(LPCALC lpCalc, time_t tstates) {
	uint64_t time_end = tc_tstates(&lpCalc->timer_c) + tstates - lpCalc->time_error;

	while (lpCalc->running) {
		if (check_break(&lpCalc->mem_c, addr_to_waddr(&lpCalc->mem_c, lpCalc->cpu.pc)) & 1) {
#ifdef WINVER
			lpCalc->running = FALSE;
			bank_t *bank = &lpCalc->mem_c.banks[mc_bank(lpCalc->cpu.pc)];

			Z80_info_t z[2];
			disassemble(lpCalc, REGULAR, addr_to_waddr(lpCalc->cpu.mem_c, lpCalc->cpu.pc), 1, z);

			if (lpCalc->pCalcNotify != NULL) {
				
				bank_t *bank = &lpCalc->mem_c.banks[mc_bank(lpCalc->cpu.pc)];
				CCalcAddress *pCalcAddress = new CComObject<CCalcAddress>();
				pCalcAddress->Initialize(lpCalc->pWabbitemu, bank->ram, bank->page, lpCalc->cpu.pc);
				pCalcAddress->AddRef();
				lpCalc->pCalcNotify->Breakpoint(pCalcAddress);
			} else {
#endif
#ifndef MACVER
				lpCalc->breakpoint_callback(lpCalc);
#else
				printf("hit a breakpoint in run tstates\n");
				lpCalc->running = FALSE; 
				lpCalc->breakpoint_callback(lpCalc,lpCalc->breakpoint_owner);
#endif
#ifdef WINVER
			}
#endif
			return 0;
		}
		uint64_t oldTStates;
		uint16_t oldPC;
		if (lpCalc->profiler.running) {
			oldTStates = tc_tstates(&lpCalc->timer_c);
			oldPC = lpCalc->cpu.pc % PAGE_SIZE;
		}
		if (link_hub_count > 1) {
			CPU_connected_step(&lpCalc->cpu);
			if (lpCalc->cpu.is_link_instruction) {
				lpCalc->time_error = (time_t)(tc_tstates((&lpCalc->timer_c)) - time_end);
				calc_waiting_link++;
				break;
			}
		} else {
			CPU_step(&lpCalc->cpu);
		}
		if (lpCalc->profiler.running) {
			uint64_t time = tc_tstates(&lpCalc->timer_c) - oldTStates;
			lpCalc->profiler.totalTime += time;
			bank_t bank = lpCalc->cpu.mem_c->banks[mc_bank(oldPC)];
			if (bank.ram) {
				lpCalc->profiler.ram_data[bank.page][oldPC / lpCalc->profiler.blockSize] += (long) time;
			} else {
				lpCalc->profiler.flash_data[bank.page][oldPC / lpCalc->profiler.blockSize] += (long) time;
			}
		}
		if (tc_tstates((&lpCalc->timer_c)) >= time_end) {
			lpCalc->time_error = (time_t)(tc_tstates((&lpCalc->timer_c)) - time_end);
			break;
		}
	}

	return 0;
}