VOGONS


First post, by asdf53

User metadata
Rank Member
Rank
Member

I'm trying to get a more authentic Windows 98 experience on my Athlon 64 machine. I was hoping to underclock it to 500 MHz, but the lowest I could go was 1000 MHz (200 MHz system clock, 5x multiplier). The board's lowest multiplier is 4x, but that gives me a black screen at boot. I tried to lower the system clock below the 200 MHz BIOS limit with a tool called ClockGen, but when I go below 195 MHz, the machine just locks up. Tried locking the AGP / PCI speed to 66/33, but no difference.

I was almost ready to give up, but then I saw this post under one of Phil's videos:

The 4000+ can downclock to 723mhz (180FSB x 4) which is perfect because Outcast in Windows 98 gets cranky above 800mhz and some other games don't like 1ghz+ either, believe it or not.

Another example from this thread:

I'm currently underclocking my A64 3000+ (Winchester) to 800Mhz (4multix200HTT)

So it seems to be possible, but how? If you did it, please post your board and CPU model. My board is Asus A8V, CPU is an A64 "San Diego".

Last edited by asdf53 on 2022-09-22, 13:37. Edited 1 time in total.

Reply 1 of 8, by pixel_workbench

User metadata
Rank Member
Rank
Member

In the bios there should be an option to set hypertransport speed. On S939 Athlon64 it's 1000mhz by default, and is usually set by a combination of base clock 200 and multiplier 5. The cpu speed can not be lower than the hypertransport speed. So to run the cpu at 800mhz you need to find the bios option for the hypertransport multiplier and set it to 4.

My Videos | Website
P2 400 unlocked / Asus P3B-F / Voodoo3 3k / MX300 + YMF718

Reply 2 of 8, by asdf53

User metadata
Rank Member
Rank
Member
pixel_workbench wrote on 2022-08-14, 14:52:

In the bios there should be an option to set hypertransport speed. On S939 Athlon64 it's 1000mhz by default, and is usually set by a combination of base clock 200 and multiplier 5. The cpu speed can not be lower than the hypertransport speed. So to run the cpu at 800mhz you need to find the bios option for the hypertransport multiplier and set it to 4.

Sorry, I somehow missed the reply notification for your post. I set the hypertransport to 800 MHz and it works, thank you very much! I can finally underclock the CPU to 800 MHz.

Since 4x is the lowest multiplier for Athlon 64, this is the lowest I could go with the default system clock of 200 MHz, which sadly cannot be underclocked on my board. If anyone had success with this, please post your board model and the tools you have used.

Reply 3 of 8, by The Sandman

User metadata
Rank Newbie
Rank
Newbie

The Abit AV8 can underclock very well. I was using SysTool
https://www.techpowerup.com/systool/

Board will lock up in Windows when clocking below 200-MHz. You have to reboot but the FSB will stay below 200-MHz

https://valid.x86.fr/vy9hfi
vy9hfi.png

Reply 4 of 8, by asdf53

User metadata
Rank Member
Rank
Member

Yes, I've had the same lockup when I tried to underclock the bus in Windows. Interesting that it persists with a reboot, I think I haven't tried that. I was wondering if there's a DOS tool that can underclock the CPU, maybe this way it wouldn't lock up. There's an open source library called WinRing0 that some of these tools use to write into the registers, I've had a look at it to see if it could be ported to DOS. I also have an Abit AV8, but I never liked it much because it does not allow to undervolt the CPU.

Reply 5 of 8, by Falcosoft

User metadata
Rank Oldbie
Rank
Oldbie
asdf53 wrote on 2022-09-23, 20:33:

...There's an open source library called WinRing0 that some of these tools use to write into the registers, I've had a look at it to see if it could be ported to DOS.

In DOS real mode you are already in Ring 0 (when no EMM386 like memory manager is loaded that puts CPU into protected/V86 mode). So you can do everything in DOS that is only possible in Windows with WinRing0 (such as reading/writing MSRs, reading/writing IO ports, reading/writing PCI address space etc.)
WinRing0 has no special functions that can set FSB or CPU multiplier directly, only generic functions that help you to access CPU MSRs, IO ports and PCI address space under Windows (protected mode).
So porting WinRing0 to DOS is absolutely unnecessary.

Website, Facebook, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper

Reply 6 of 8, by asdf53

User metadata
Rank Member
Rank
Member

Thank you for the explanation. I shouldn't have said "porting" the library, I meant just taking the functions from it that the FSB tools use to write into the CPU and clock generator registers. It would have been useful as a starting point because I have never done that before. I remember looking at the official documentation from AMD for all the different CPU registers and such, but it was so overwhelming that I had no idea where to begin.

Reply 7 of 8, by Falcosoft

User metadata
Rank Oldbie
Rank
Oldbie
asdf53 wrote on 2022-09-24, 07:31:

Thank you for the explanation. I shouldn't have said "porting" the library, I meant just taking the functions from it that the FSB tools use to write into the CPU and clock generator registers. It would have been useful as a starting point because I have never done that before. I remember looking at the official documentation from AMD for all the different CPU registers and such, but it was so overwhelming that I had no idea where to begin.

Hi,
Under DOS implementing these functions actually is just writing a few assembly instructions.
Reading/writing CPU configuration registers is only 1 assembly instruction: RDMSR / WRMSR.
Reading/writing IO ports and PCI configuration space is also only 1 assembly instruction: IN register, DX / OUT DX, register.

reading MSR:

mov ecx, MSRAddress
rdmsr
mov Upper32bitValue, edx
mov Lower32bitValue, eax

writing MSR

mov ecx, MSRAddress
mov edx, Upper32bitValue
mov eax, Lower32bitValue
wrmsr

reading 1 bye from PCI address space

mov eax, PciBusDevFuncRegOffset
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
in al, dx
mov ByteValue, al

writing 1 byte to PCI address space

mov eax, PciBusDevFuncRegOffset
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
mov al, ByteValue
out dx, al

The different MSR's and how to calculate PciBusDevFuncRegOffset can be found in AMD's documentation (BIOS and Kernel Developer's Guide for AMD AthlonTM 64 and AMD OpteronTM Processors)

Here is a sample program about how to change Athlon64 CPU multiplier from DOS (demonstrates the reading/writing of MSR's under DOS)
https://falcosoft.hu/a64lowp.zip

Also here is a sample program how to set Athlon 64 memory divider from 6 to 5 (demonstrates the reading/writing of PCI address space under DOS):

Filename
MEMMAX.zip
File size
1.05 KiB
Downloads
31 downloads
File license
Public domain

Website, Facebook, Youtube
Falcosoft Soundfont Midi Player + Munt VSTi + BassMidi VSTi
VST Midi Driver Midi Mapper

Reply 8 of 8, by The Sandman

User metadata
Rank Newbie
Rank
Newbie

CPUSpd also works great
CpuSpd - A Hardware Based CPU Speed Control Utility for DOS/Win9X Retro Gaming

cpuspd22vjj0.jpg

CPUSpd m12 = Multi 12
CPUSpd m10 = Multi 10
etc.

CPUSpd f1008 = 1.35V
CPUSpd f0c0A = 1.30V
CPUSpd f040C = 1.25V
CPUSpd f0C0e = 1.20V
CPUSpd f0410 = 1.15V
CPUSpd f0412 = 1.10V