Initial cycles control

This commit is contained in:
Jonathan Campbell 2025-05-05 07:51:45 -07:00
parent 753d1632d0
commit cf8f58e581

View File

@ -83,6 +83,10 @@ extern bool PS1AudioCard;
# define S_ISREG(x) ((x & S_IFREG) == S_IFREG)
#endif
static unsigned char ig_cpu_cycles_set = 0;
static uint32_t ig_cpu_cycles_value = 0;
static uint8_t ig_cpu_cycles_max_percent = 0;
struct BIOS_E280_entry {
uint64_t base = 0;
uint64_t length = 0;
@ -876,6 +880,7 @@ void dosbox_integration_trigger_read() {
break;
case DOSBOX_ID_REG_CPU_CYCLES:
ig_cpu_cycles_set = 0;
if (CPU_CycleMax < 0x80000000)
dosbox_int_register = (uint32_t)CPU_CycleMax;
else
@ -884,9 +889,11 @@ void dosbox_integration_trigger_read() {
case DOSBOX_ID_REG_CPU_MAX_PERCENT:
dosbox_int_register = CPU_CyclePercUsed;
ig_cpu_cycles_set = 0;
break;
case DOSBOX_ID_REG_CPU_CYCLES_INFO:
ig_cpu_cycles_set = 0;
dosbox_int_register = 0;
if (CPU_CycleAutoAdjust)
dosbox_int_register |= DOSBOX_ID_REG_CPU_CYCLES_INFO_MAX;
@ -1131,6 +1138,66 @@ void dosbox_integration_trigger_write() {
CAPTURE_WaveEvent(true);
break;
case DOSBOX_ID_REG_CPU_CYCLES:
ig_cpu_cycles_set |= 1u;
ig_cpu_cycles_value = dosbox_int_register;
if (ig_cpu_cycles_value == 0) ig_cpu_cycles_value = 1;
if (ig_cpu_cycles_value > 0x7FFFFFFFul) ig_cpu_cycles_value = 0x7FFFFFFFul;
break;
case DOSBOX_ID_REG_CPU_MAX_PERCENT:
ig_cpu_cycles_set |= 2u;
ig_cpu_cycles_max_percent = dosbox_int_register;
if (ig_cpu_cycles_max_percent == 0) ig_cpu_cycles_max_percent = 1;
if (ig_cpu_cycles_max_percent > 100) ig_cpu_cycles_max_percent = 100;
break;
case DOSBOX_ID_REG_CPU_CYCLES_INFO:
dosbox_int_error = false;
{
unsigned int mode = dosbox_int_register & DOSBOX_ID_REG_CPU_CYCLES_INFO_MODE_MASK;
char setting[256] = {0};
if (mode == 0) {
if (CPU_CycleAutoAdjust)
mode = DOSBOX_ID_REG_CPU_CYCLES_INFO_MAX;
else if (CPU_AutoDetermineMode &CPU_AUTODETERMINE_CYCLES)
mode = DOSBOX_ID_REG_CPU_CYCLES_INFO_AUTO;
else
mode = DOSBOX_ID_REG_CPU_CYCLES_INFO_FIXED;
}
switch (mode) {
case DOSBOX_ID_REG_CPU_CYCLES_INFO_MAX:
if (ig_cpu_cycles_set & 2)
sprintf(setting,"cycles=max %lu",(unsigned long)ig_cpu_cycles_max_percent);
break;
case DOSBOX_ID_REG_CPU_CYCLES_INFO_AUTO:
if (ig_cpu_cycles_set & 2)
sprintf(setting,"cycles=auto %lu",(unsigned long)ig_cpu_cycles_max_percent);
break;
case DOSBOX_ID_REG_CPU_CYCLES_INFO_FIXED:
if (ig_cpu_cycles_set & 1)
sprintf(setting,"cycles=fixed %lu",(unsigned long)ig_cpu_cycles_value);
break;
default:
dosbox_int_error = true;
break;
};
if (setting) {
LOG(LOG_MISC,LOG_DEBUG)("Integratoin device cycle change: %s\n",setting);
Section* sec = control->GetSection("cpu");
if (sec) sec->HandleInputline(setting);
}
else {
LOG(LOG_MISC,LOG_DEBUG)("Integratoin device cycle change ignored (setmask 0x%x mode 0x%x)\n",
ig_cpu_cycles_set,mode);
}
}
ig_cpu_cycles_set = 0;
break;
default:
dosbox_int_register = 0x55AA55AA;
dosbox_int_error = true;