VOGONS


First post, by kalohimal

User metadata
Rank Member
Rank
Member

This utility is for slowing down the CPU for DOS/Win98 retro gaming. It does this by programming the hardware directly to control the CPU's cache, multiplier (if unlocked), and frequency throttling. I wrote this program about a year ago for my own retro gaming use, and initially it was only for pure DOS. Recently I've added new functionalities to allow it to run under Win98. Currently it is able to support Intel and AMD CPUs all the way from Pentium/K5 to Core 2/Athlon64 CPUs. By using the 3 controls: cache, multiplier and throttle, it is able to have fine control over CPU speed, and can slow these CPUs all the way down to 486/386/286 speeds.

CURRENT SUPPORTED CPUs:

Intel - Pentium, Pentium II, Pentium III, Pentium 4, Pentium D, Dual Core, Core Solo/Duo, Core 2, Core ix Gen1-Gen4, Pentium M, Atom CPUs.
AMD - K5, K6, K6-II, K6-III, K6-II+, K6-III+, K7 (Athlon & XP), and K8 (Athlon64, x2, x3) CPUs.
IDT - WinChip C6, 2, 2A, 2B, 3.
VIA - C3 Sameul 2, Ezra, Ezra-T, Nehemiah, Esther A & D.

SUPPORTED FUNCTIONS PER CPUs:

cpuspd support matrix 2.0a.jpg
Filename
cpuspd support matrix 2.0a.jpg
File size
341.75 KiB
Views
888 views
File license
Fair use/fair dealing exception

It's a protected mode program that is able to work under EMM386/JEMM/Windows 9x DOS box.

DOWNLOADS

Filename
cpuspd20a.zip
File size
116.96 KiB
Downloads
69 downloads
File license
Fair use/fair dealing exception
Filename
cpuspd20.zip
File size
117.02 KiB
Downloads
26 downloads
File license
Fair use/fair dealing exception
Filename
cpuspd15.zip
File size
111 KiB
Downloads
52 downloads
File license
Fair use/fair dealing exception

ACKNOWLEDGEMENTS
Special thanks to the following Vogons forumers for their help in testing the program:
johnnycontrario, SaxxonPike, JazeFox, Bancho, red-ray.
Special thanks to the following Vogons forumers for their help in suggesting new features and sharing their knowlege:
Falcosoft, PARUS.

DESCRIPTION CPUSPEED (CPUSPD) is a DOS/Win98 protected mode program written for retro gamers, to slow down the speed of modern […]
Show full quote


DESCRIPTION

CPUSPEED (CPUSPD) is a DOS/Win98 protected mode program written for retro
gamers, to slow down the speed of modern PCs to those of DOS era. Unlike TSR
programs which use software delays, CPUSPEED reprograms the system hardware
directly and does not stay resident in the system memory. Thus it does not
consume any DOS memory after execution, and the settings will remain effective
until the next reset/reboot.

CPUSPEED controls these three functions of the hardware:

  1. CPU cache - turning on/off the CPU L1 & L2 cache. This feature will work
    for all CPUs with on-chip cache, starting from Intel Pentium/AMD K5 and
    including slot 1 CPUs. Since the slow down effect of disabling L2 cache is
    rather small compare to L1 cache, CPUSPEED does not distinguish between
    the two, and will enable or disable them together.
    Support summary: All CPUs with on-chip cache, starting from Intel Pentium &
    AMD K5 onwards
  2. CPU multiplier - for CPUs that support Intel SpeedStep (IST/EIST) or AMD
    PowerNow!/Cool'n'Quiet, CPUSPEED is able to control it's multiplier. AMD
    introduced PowerNow! in their mobile CPUs starting from K6-II+/III+, and
    called it "Cool'n'Quiet" for desktop CPUs starting from Athlon XP. Intel
    started introducing SpeedStep from Pentium 4 630. While AMD's PowerNow!/
    Cool'n'Quiet is well documented and the technical documents are easily
    available, Intel's SpeedStep's documents are sketchy and hard to come by.
    Hence CPUSPEED's SpeedStep implementation is based on guess works and
    experimental results done by various people on the internet, and it is
    likely to have instances where it won't work correctly. With that said,
    the program will try it's best to assist the user to set the value within
    limits when those information are available (mostly via info embedded in
    BIOS).
    Support summary: Intel Pentium 4 630 & AMD mobile K6-II+/III+ & AMD Athlon
    XP onwards.
  3. CPU throttling - this function is available to all systems that support
    ACPI. Throttling of the CPU is achieved by controlling the duty cycle of
    the external CPU clock, which in plain words means turning the clock on
    and off at specific intervals, via the south bridge of the system. The
    ACPI specification was first released in Dec 1996 (around the Pentium 2
    era), so systems built after that time will most likely support it. Please
    note that in early system, ACPI could be enabled/disabled via CMOS setup,
    so please check your CMOS setup if the program reports that no ACPI is
    found. Please also note that some programs will over write the ACPI data
    that the BIOS deposited in high memory. One such example is the popular
    SpeedSys DOS benchmark program - if ESC is pressed while it is doing memory
    tests, the program will abort without restoring the data (which is restored
    upon completion of the tests), hence corrupting the ACPI data. In this case
    simply reboot the system to restore the ACPI data.
    Support summary: All PCs that supports ACPI (made after Dec 1996).
  4. Extra function for Intel Pentium 4 and later CPUs:
    CPU ODCM (On Demand Clock Modulation) - this function uses the clock
    modulation hardware to control the duty cycle of the internal CPU clock.
    It works independently from south bridge clock throttling, but using the
    same method of skipping clock pulses. For example, if it is set to 1/8,
    it will skip 7 clock pulses before asserting 1 clock, effectively slowing
    down the CPU clock frequency to 1/8. Intel extended the resolution to 1/16
    for later CPUs.
  5. Extra functions for lagacy CPUs:
    CPU features control:
    Independent L1 cache control - Pentium, Pentium MMX, K6, K6-2, K6-3, K6-2+ K6-3+.
    L2 cache control - Pentium M, Atom, Dual Core, Core, Core 2, K6-3, K6-2+, K63+, C3 Sameul 2, C3 Ezra & Ezra-T, C3 Nehemiah, Esther A & D.
    Branch prediction - Pentium, Pentium MMX, Winchip 2, 2A, 2B, 3, C3 Sameul 2, C3 Ezra & Ezra-T, C3 Nehemiah.
    Data prefetch - K6-2, K6-3, K6-2+, K6-3+.
    I (code) cache - Pentium MMX, Winchip C6, 2, 2A, 2B, 3, C3 Sameul 2, C3 Ezra & Ezra-T, C3 Nehemiah.
    D (data) cache - Pentium MMX, Winchip C6, 2, 2A, 2B, 3, C3 Sameul 2, C3 Ezra & Ezra-T, C3 Nehemiah.


Note: some PCI sound cards which use software synthesis might be affected by
CPU slow down. To avoid this issue, use sound cards with hardware emulation
instead. Or better still, use an ISA sound blaster if one is available.

CPUSPEED will attempt to measure the CPU clock speed with the 'i' command.
This is done using Intel's textbook CPU frequency measuring algorithm,
utilizing the TSC (Time Stamp Counter). For newer CPUs which support the
APERF/MPERF (performance) counters, CPUSPEED will also report the PERF speed
measured using these counters. Please note that while TSC is supposedly fixed,
its implementation varies across CPUs/brands, and on some systems it will
vary when the CPU clock is throttled.

CPUSPEED runs in protected mode and requires direct (ring 0) hardware access.
It uses its own DPMI host (CWSDPMI) in pure DOS, and will try to transit to
ring 0 when in Windows 98 DOS box, or when other DOS extender is already
running (e.g. Yamaha YMF744's tsr driver DSDMA uses one and will keep the DOS
extender active.) OSes starting from Windows NT employ a very strict protected
mode, hence CPUSPEED cannot run under these new OSes. CPUSPEED is written in a
combination of assembly (NASM) and C (DJGPP) codes.

Current supported CPUs:
Intel - Pentium, Pentium II, Pentium III, Pentium 4, Pentium D, Dual Core,
and Core 2 CPUs.
AMD - K5, K6, K6-II, K6-III, K6-II+, K6-III+, K7 (Athlon & XP), and
K8 (Athlon64, x2, x3) CPUs.

Please note that not all of these CPUs are tested at this moment (I could only
test on the hardware that I owned). If you encounter a "General Protection
Fault" or "Page Fault", it is most likely due to conditions that the program
doesn't handle.


RUNNING THE PROGRAM

CPUSPD <commands>

where commands are:
a - display current cache status, multiplier, and throttle.
(same as commands 'c m t').
c - cache: display CPU cache status if run without any parameters.
cd - disable CPU cache.
ce - enable CPU cache.
f - fid/vid: display fidvid status if run without any parameters.
fxxyy - set fid/vid, where xx = fid in hex, and yy = vid in hex.
please note that the program gives you complete freedom in this
command; if you choose a fid/vid value unsupported by your CPU,
or insufficient CPU voltage (vid) for the selected fid, you might
cause your system to hang up.
Note: larger fid => bigger multiplier, but larger vid => smaller
voltage. Please refer to CPU datasheet for further info.
i - system information: shows CPU name along with its CPUID.
m - multiplier: display multiplier status if run without any parameters.
mxx - set multiplier, where xx is a decimal value from 0 to 99.
please note that any value less than min/greater than max will give
you the min/max value.
s - display system information read from SMBIOS. Please note that some
manufacturers leave some of the fields blank, so if it's blank that
just means the information wasn't provided.
t - throttle: display throttle status if run without any parameters.
txx - set CPU throttle, where xx = throttle value in decimal. Smaller value
implies more throttle (slower).
The slowest is 1 (max throttle) and the fastest is 8 or 16 (no
throttle), depends on your system. Systems with VIA south bridges
have 4-bit throttle (1-16) and hence provide finer control. Other
south bridges commonly have 3-bit throttle (1-8).

The commands are executed in sequence from left to right, and you can repeat
the same command. All commands must be separated with a space, and parameters
should follow their respective commands immediately without any space.


EXAMPLES

CPUSPD i
displays the system information.

CPUSPD i c m t
CPUSPD i a
displays the system information, cache status, multiplier status, and
throttle status, in that order.

CPUSPD m i m16 i
displays multiplier status, the system status, sets multiplier to 16, and
displays system status again.

CPUSPD i s
displays the system information and SMBIOS information.

CPUSPD i m0 t1 cd i
displays the system info, sets multiplier to 0, throttle to 1, disable cache,
displays system info again.

CPUSPD t4 i t1 i
sets throttle to 4, displays system info, sets throttle to 1, display system
info again.


ACKNOWLEDGEMENTS
Special thanks to the following Vogons forumers for their help in testing the program:
johnnycontrario, SaxxonPike, JazeFox, Bancho, red-ray.
Special thanks to the following Vogons forumers for their help in suggesting new features and sharing their knowlege:
Falcosoft, PARUS.

KNOWN ISSUES

Not tested under Windows 95 and Windows ME.

REVISION HISTORY

1.0 06-02-20 Initial release.
1.1 06-03-20 Resolved incompatibilty issue with Yamaha's DSDMA sound driver.
1.2 06-09-20 Resolved ACPI detecting issue when ACPI table is located within 1MB DOS memory. Added DOS version check under NT.
1.3 06-19-20 Added support for VIA C3 CPUs: Samuel, Samuel 2, Ezra, Ezra-T, and Nehemiah.
1.4 07-08-20 Added L2 cache control for Intel family 6 CPUs: Pentium 3 (Katmai, Coppermine, Tualatin), Pentium M, Core, Core 2.
Added south bridge database support for throttling, in addition to ACPI. This is to support systems without ACPI
implementation in BIOS (e.g. POS, thin clients, etc). Added PCI device scan to help identify the south bridge
devices. Note: CPUSPD.SBI file must be in the same folder as CPUSPD.EXE.
1.5 07-11-20 Added on demand clock modulation (ODCM) function for Intel Pentium 4 and later CPUs (Pentium D, Duo Core, Core,
Core 2).
2.0 08-09-20 Added VIA Esther support for both multiplier and fidvid control.
Added L2 cache, I-cache, D-cache, and branch prediction control for VIA & WinChip CPUs.
Added L1 cache, code cache, data cache, and branch prediction control for Intel Pentium & MMX CPUs.
Added L1 cache, L2 cache, and data prefetch control for AMD K6 CPUs.
Added voltage display for vidfid control.
Added CPU core and package temperature display for Intel and VIA Esther/Nano CPUs.
Restructured and tidied up some portions of program.
Fixed issue with acpi throttling causes GPF on some motherboards.

IMG_20200607_212151.jpg
Filename
IMG_20200607_212151.jpg
File size
942.86 KiB
Views
2011 views
File license
Public domain

Note: CPU speeds in the included spreadsheet are approximated using DOOM real ticks based on various results posted by other members on Vogons. 286 speeds, also taken from the forum, are extrapolation since DOOM does not run on 286s.

Last edited by kalohimal on 2020-08-20, 17:31. Edited 21 times in total.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 1 of 150, by kalohimal

User metadata
Rank Member
Rank
Member

CPUSPD version 1.1 released. Resolve incompatibility issue with Yamaha's DSDMA sound driver. Please download from first post.

Sound card test results:

Please note that we are only testing the proper functioning of the CPUSPD program here. Some sound cards might experience stuttering on certain motherboards, due to poor implementation of the throttling function in the south bridge.

Attachments

  • cpuspd2.jpg
    Filename
    cpuspd2.jpg
    File size
    253.34 KiB
    Views
    2134 views
    File license
    Public domain

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 2 of 150, by matze79

User metadata
Rank l33t
Rank
l33t

Stutters also on VIA C3 EPIA 800.

Onboard Sound does not work proper with deactivated L1 etc.

https://dosreloaded.de - The German Retro DOS PC Community
https://www.retroianer.de - under constructing since ever

Co2 - for a endless Summer

Reply 3 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
matze79 wrote on 2020-06-03, 14:07:

Stutters also on VIA C3 EPIA 800.

Onboard Sound does not work proper with deactivated L1 etc.

Thanks for helping out with the testing. Any idea which south bridge this board is using? When I tested on VIA 868 it seems fine, even though at times it might stutter. The best combo I find so far that works is a motherboard with AMD CPU and VIA chipset, pairing with Yamaha YMF744 sound card. I have not an opportunity to test the Aureal Vortex 2 though I suspect it might not be good since a portion of it is using software emulation.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 4 of 150, by matze79

User metadata
Rank l33t
Rank
l33t

Its quite normal i think, it just lacks processing power for software emulation of SB Stuff/FM.

its this motherboard:
https://www.ebay.de/itm/MOTHERBOARD-EPIA-800- … 3-/173834841716

https://dosreloaded.de - The German Retro DOS PC Community
https://www.retroianer.de - under constructing since ever

Co2 - for a endless Summer

Reply 7 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
undeon wrote on 2020-06-08, 20:13:

Nice project... I'll keep an eye on it, because I'm building a fast WinME project...

Thanks, but I'm not sure how it would work in WinME though, as it's written for DOS/Win9x and never tested on ME. Please let me know if you encounter any problems, cheers.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 8 of 150, by The Serpent Rider

User metadata
Rank l33t
Rank
l33t

Does it support more subtle tweaking on Pentium MMX and Cyrix like Setmul?

Get up, come on get down with the sickness
Open up your hate, and let it flow into me

Reply 9 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
The Serpent Rider wrote on 2020-06-09, 01:51:

Does it support more subtle tweaking on Pentium MMX and Cyrix like Setmul?

No it doesn't. The program is aimed to expand on Setmul while not duplicating the functions it already has, since Setmul is already doing an excellent job. For subtle controlling of branch prediction/pipelines/etc, and for Cyrix/VIA CPUs, it would be better to use Setmul.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 10 of 150, by kalohimal

User metadata
Rank Member
Rank
Member

Version 1.2 released. Resolved ACPI detecting issue when ACPI table is located within 1MB DOS memory. Added DOS version check under NT. Please download from first post.

Thanks to enaiel for reporting the problem.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 12 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
MAZter wrote on 2020-06-09, 13:43:

Interesting, but never heard about "Prince of Pursia".

Haha, thanks for pointing out the typo, just noticed it. Sorry English is not my mother tongue.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 13 of 150, by henk717

User metadata
Rank Newbie
Rank
Newbie

Interesting stuff, Is there a reason this program requires protect mode or could it in theory also work on real mode? Some older games require real mode and it would be nice to be able to set the cpu multiplier for them without resorting to the bios.

Reply 14 of 150, by kalohimal

User metadata
Rank Member
Rank
Member

Hi henk717,

No worries, it won't interfere with real mode programs, all real mode apps/games will be able to run as per normal in real mode (as you can see from the games I tested). Since CPUSPD is not a TSR, it will only switch the CPU to protected mode when it is doing it's job. Once it is done, the CPU will revert back to whatever mode it was in.

The reason why CPUSPD is a protected mode program is a little bit technical. It's because EMM386 puts the CPU into a mode called VCPI (something like half protected mode), and Windows 98 DOS box also puts the CPU into protected mode. Once in these mode, CPUSPD will be prevented from accessing hardware directly (certain CPU instructions e.g. rdmsr/wrmsr will become privileged). To overcome this problem, CPUSPD needs to gain access to "ring 0 privilege level" via something called "call gates", and the only way to do that is to run in protected mode.

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 15 of 150, by SuperSirLink

User metadata
Rank Member
Rank
Member

Looks like a handy app... Setmul does seem to change my CPU multi, and running your program with the a switch reports the same... Running it on a ASUS P3B-F with PII400... Mine is an unlocked version as I can set the multiplier in the BIOS...

Reply 16 of 150, by clueless1

User metadata
Rank l33t
Rank
l33t

Cheers! It's good to have options and you seem to have given newer cpus just that. Thank you for your time and efforts!

The more I learn, the more I realize how much I don't know.
OPL3 FM vs. Roland MT-32 vs. General MIDI DOS Game Comparison
Let's benchmark our systems with cache disabled
DOS PCI Graphics Card Benchmarks

Reply 17 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
SuperSirLink wrote on 2020-06-10, 21:11:

Setmul does seem to change my CPU multi, and running your program with the a switch reports the same...

Hi SuperSirLink,

Does that mean CPUSPD couldn't change the multiplier but Setmul can? Or do you mean it works the same as Setmul? Hope it's not another bug...

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 18 of 150, by kalohimal

User metadata
Rank Member
Rank
Member
clueless1 wrote on 2020-06-10, 23:07:

Cheers! It's good to have options and you seem to have given newer cpus just that. Thank you for your time and efforts!

Thanks clueless1, that is exactly the purpose of this program. Previously I used Throttle and Setmul quite a lot and both are excellent, but they couldn't do it for quite a few modern hardware. That's what prompted me to start writing my own program, and at the beginning it was rather difficult and just for fun as I'm not sure whether I could do it. Setting Core 2 CPUs' multiplier was very hard, as all cores need to be set before the multiplier would change, requiring some sort of multiprocessing in DOS. I was really delighted when it finally works, after many months of digging through the datasheets/programming references of various Intel/AMD CPUs and lots of head scratching!

Btw, the benchmark references (DOOM real ticks) used in the spreadsheet is based on your excellent work here. I also taken the extrapolation for the 286 CPUs somewhere, not sure where I saw it on this forum or it's also yours (I've completely forgotten).

Cheers!

Slow down your CPU with CPUSPD for DOS retro gaming.

Reply 19 of 150, by kalohimal

User metadata
Rank Member
Rank
Member

One not so obvious features of CPUSPD is that it allows you to set the voltage of the CPU. By lowering the voltage when running at lower multiplier will reduce power consumption and heat generated by the CPU, allowing it to reduce fan speed and run quieter. The difficult part is that you must know the minimum required voltage for the corresponding multiplier. AMD CPUs have an advantage here over Intel as the min and max voltages are listed in the BIOS. In fact AMD pioneered this technology when they started introducing PowerNow! and Cool'n'Quiet (AMD called it Cool'n;Quiet for desktop CPUs and PowerNow! for mobile), starting from K6-II+ and AthlonXP. Intel only followed suit starting from Pentium 4 430 and called it SpeedStep (IST, Intel Speedstep Technology, later change to EIST, Enhanced IST), and their documentation on this is sketchy (perhaps afraid of lawsuit from AMD?). They do not have this info embedded in the BIOS as well, and to find out, we need to refer to the individual CPU's datasheet.

Here is the screenshot when AMD CPU (in this case an Opteron Dual Core 180) is used with the "f" command:

IMG_20200611_100339a.jpg
Filename
IMG_20200611_100339a.jpg
File size
124.93 KiB
Views
1778 views
File license
Public domain

P-states are the "power states" listed in BIOS. The first 2 digits is the multiplier in hex ("fid"), and the next 2 digits is the voltage ("vid") also in hex. Please note that vids are inversely proportional; larger value means lower votage, so 0212 has lower multiplier and voltage vs 1008. Caution: insufficient voltage will hang up the system!

One thing to note is how the value of fid relates to multiplier. For this CPU, the multiplier min is 5.0 and max is 12.0, while the fid min is 02h and max is 10h. This is because it's multiplier increments in 0.5. So we have 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0. The corresponding fids are: 02h, 03h, 04h... 0Fh,10h, for a total of 15 steps.

Please note that to use this feature the CPU will either need to be unlocked, or support PowerNow!/Cool'n'Quiet/IST/EIST. This holds the same for the multiplier setting command ("m"). Also please note that the m command is a subset of f command - it just hides the voltage settting portion for users who don't want to be bothered.

- David W.

Slow down your CPU with CPUSPD for DOS retro gaming.