From 1c077097279bad89ae93c7e2145b633995501252 Mon Sep 17 00:00:00 2001 From: Jonathan Campbell Date: Sun, 4 May 2025 22:23:26 -0700 Subject: [PATCH] Add integration device commands to read CPU cycle count and info --- include/iglib.h | 8 ++++++++ src/ints/bios.cpp | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/iglib.h b/include/iglib.h index f56a56e19..87e99011c 100644 --- a/include/iglib.h +++ b/include/iglib.h @@ -112,6 +112,14 @@ extern uint16_t DOSBOXID_VAR dosbox_id_baseio; #define DOSBOX_ID_REG_INJECT_NMI (0x00808602UL) +#define DOSBOX_ID_REG_CPU_CYCLES (0x55504300UL) /* fixed cycle count, which may vary if max or auto */ +#define DOSBOX_ID_REG_CPU_MAX_PERCENT (0x55504301UL) /* for max cycles, percentage from 0 to 100 */ +#define DOSBOX_ID_REG_CPU_CYCLES_INFO (0x55504302UL) /* info about cycles, including fixed, auto, max */ +# define DOSBOX_ID_REG_CPU_CYCLES_INFO_MODE_MASK (0xFUL << 0UL) +# define DOSBOX_ID_REG_CPU_CYCLES_INFO_FIXED (1UL << 0UL) +# define DOSBOX_ID_REG_CPU_CYCLES_INFO_MAX (2UL << 0UL) +# define DOSBOX_ID_REG_CPU_CYCLES_INFO_AUTO (3UL << 0UL) + #define DOSBOX_ID_REG_8237_INJECT_WRITE (0x00823700UL) #define DOSBOX_ID_REG_8237_INJECT_READ (0x00823780UL) diff --git a/src/ints/bios.cpp b/src/ints/bios.cpp index be003f83c..036fb84ac 100644 --- a/src/ints/bios.cpp +++ b/src/ints/bios.cpp @@ -873,6 +873,27 @@ void dosbox_integration_trigger_read() { case DOSBOX_ID_RESET_INDEX_CODE: /* interface reset result */ break; + case DOSBOX_ID_REG_CPU_CYCLES: + if (CPU_CycleMax < 0x80000000) + dosbox_int_register = (uint32_t)CPU_CycleMax; + else + dosbox_int_register = (uint32_t)0x7FFFFFFFUL; + break; + + case DOSBOX_ID_REG_CPU_MAX_PERCENT: + dosbox_int_register = CPU_CyclePercUsed; + break; + + case DOSBOX_ID_REG_CPU_CYCLES_INFO: + dosbox_int_register = 0; + if (CPU_CycleAutoAdjust) + dosbox_int_register |= DOSBOX_ID_REG_CPU_CYCLES_INFO_MAX; + else if (CPU_AutoDetermineMode &CPU_AUTODETERMINE_CYCLES) + dosbox_int_register |= DOSBOX_ID_REG_CPU_CYCLES_INFO_AUTO; + else + dosbox_int_register |= DOSBOX_ID_REG_CPU_CYCLES_INFO_FIXED; + break; + default: dosbox_int_register = 0xAA55AA55; dosbox_int_error = true;