mirror of
https://github.com/joncampbell123/dosbox-x.git
synced 2025-05-08 02:53:03 +08:00
Initial cycles control
This commit is contained in:
parent
753d1632d0
commit
cf8f58e581
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user