Purpose:
        This utility exists to allow manual adjustment of certain Intel CPU's
speed and voltage settings from within a (real mode) DOS environment. By
running a CPU more slowly and at a lower voltage, heat and power consumption
can be reduced.

Compatibility:
        The feature which makes this possible is known as Speedstep version 3
and is believed to exist on these CPU models:

Pentium M
Core Solo/Duo (65nm Yonah)
Core 2

not included: Pentium III, Pentium 4, Celeron, Core i3/i5/i7

Checking the Status:
        Running the program with no arguments causes it to display info from
the CPU's relevant Status register:

(example)
startup: 0607
current: 0607
max: 0C0E

"Startup" and "max" are predefined settings which are permanently programmed
into the CPU. The startup setting is generally the lowest speed setting
officially supported by the CPU, and consumes the least electricity. The max
setting is the CPU's full rated speed. The "current" setting would be
whatever has been set by the user or the motherboard's BIOS.

The four hexadecimal digits shown for each setting contain the associated
voltage and multiplier parameters just as they are represented in the
CPU's internal registers. Decoding these values is as follows:

Multiplier (first two digits):

06 = 6x                 0E = 14x
07 = unsupported        0F = 15x
08 = 8x                 10 = 16x
09 = 9x                 11 = 17x
0A = 10x                12 = 18x
0B = 11x                13 = 19x
0C = 12x                14 = 20x
0D = 13x                15 = 21x

An additional setting exists on some Core 2 systems:

88 = half speed

The resulting CPU frequency depends on the system's bus speed.
For Pentium M: 100 or 133MHz
For Core: 133 or 166MHz
For Core2: 133, 166, 200, 266, or 333

Voltage (third and fourth digits):

Pentium M:

00 = 0.700V     0C = 0.892V     18 = 1.084V     24 = 1.276V     30 = 1.468V
01 = 0.716V     0D = 0.908V     19 = 1.100V     25 = 1.292V     31 = 1.484V
02 = 0.732V     0E = 0.924V     1A = 1.116V     26 = 1.308V
03 = 0.748V     0F = 0.940V     1B = 1.132V     27 = 1.324V
04 = 0.764V     10 = 0.956V     1C = 1.148V     28 = 1.340V
05 = 0.780V     11 = 0.972V     1D = 1.164V     29 = 1.356V
06 = 0.796V     12 = 0.988V     1E = 1.180V     2A = 1.372V
07 = 0.812V     13 = 1.004V     1F = 1.196V     2B = 1.388V
08 = 0.828V     14 = 1.020V     20 = 1.212V     2C = 1.404V
09 = 0.844V     15 = 1.036V     21 = 1.228V     2D = 1.420V
0A = 0.860V     16 = 1.052V     22 = 1.244V     2E = 1.436V
0B = 0.876V     17 = 1.068V     23 = 1.260V     2F = 1.452V

Core:

???

Core 2:

Base voltage is 0.712V, increases in steps of .0125V


Changing the setting:
        Running the program with four hex digits as an argument causes the
value to be loaded into the relevant Control register.

example:
SPEEDSTP 0812


questions/comments?
please email damage_x@hyakushiki.net

