VOGONS


First post, by SergeK

User metadata
Rank Newbie
Rank
Newbie

Hi,

I am working on a 386SX/486DLC motherboard based on the SARC RC2016A chipset (https://github.com/skiselev/mb386sx-rc2016).
It started out of curiosity of reverse-engineering the schematic using the Marco Both's M369F replica PCB layout (https://github.com/Marco-Both/M396F-Replika)
Eventually I made a few improvements, and as of now (version 2.3) the board is pretty much ready. I tested the previous version, and fixed one schematic bug that prevented it from booting.

I've done some experiments on my board, and I have some questions.

TI486SXLC2-50 Clock Doubling
I wanted to get the clock doubling working with a TI486SXLC2-50 CPU. This processor and others I tested - Intel 386SX-33, TX486SLC-33, run fine on 20, 25, 33, and 40 MHz. The latter two get a bit warmer, but, being 5V parts, this is expected.
I run TI486SXLC2-50 at 3.3V voltage using this adapter: https://github.com/skiselev/i386sx-socket

To enabled double clocking, I ran the system at either 20 or 25 MHz (CLK2 = 40 MHz or 50 MHz), and I tried flipping bit 6 - clock doubling enable of CCR0 / 0xC0 (Configuration Control Register 0) using something like this:

MOV AL,0C0h
OUT 22h,AL
IN AL,23h
OR AL,40h
MOV AH,AL
MOV AL,0C0h
OUT 22h,AL
MOV AL,AH
OUT 23h,AL
(optional delays, writing POST port 0x80, etc.)
INT 20h

The system hangs after running this code... Not completely... I still see activity on ISA bus and CPU, it just does something non-deterministic, if I had to guess.
I tried adding a delay after this sequence, e.g., a loop with writing to I/O port 80h (POST port), and in this case, the loop runs fine, and I can see numbers on the POST card. But as soon as the program exists, the system hangs.
So there must be something that breaks... maybe from the DOS, I/O, or memory perspective (assuming that the sequence above runs from the cache... although I can try disabling the cache, and checking if the behavior remains).

Any ideas where to look?

SARC RC2016A5 Chipset and BIOS Support

There are several BIOS versions for SARC RC2016 based motherboards floating around. Generally speaking they are mostly AMI 5.20, and one of the boards used Award 4.50. I find the latter one a bit more user friendly, especially that I can customize it using MODBIN.
Now, some of these BIOSes have chipset settings (some don't). Particularly for this chipset the following:

  • ROM Shadowing - this seems to work fine, and I think I identified the chipset configuration registers bits responsible for it. There are two bits for each 16 KiB block at 0xC000-0xEFFFF. I suspect that one means read from ROM write to RAM and another is RAM write protect. I still need to verify that.
  • Fast reset/Fast A20 - I still have to test the register 0x92 function. At least with one BIOS, HIMEM.SYS fails to enable A20 when Fast A20 option is enabled.
  • Memory parity checking - Some BIOSes have enable/disable setting. I didn't notice any changes in any chipset configuration registers or in 0x61. I tried using SIMMs with and without parity. I don't have a defective SIMM to test. With that said, it appears that chipset does activate the data parity signals going to DRAM regardless of the parity checking setting.
  • DRAM refresh rate/burst - Seems to work as expected, although, somewhat counterintuitively, the higher the rate, the slower is the refresh. The rate is actually a divider for the refresh cycle clock... With the rate set to 1, the refresh cycles happen every 15 us (I believe this is the standard/typical period obtained by dividing 14.31818 MHz by 12 before feeding it to the PIT channel 1, and then channel 1 is configured as a clock divider by 18, resulting in 66.28787 kHz refresh frequency). The period is multiplied (and the frequency is divided) by the rate setting, that is, setting the rate to 8, results in ~120 us refresh period or ~8.28598 kHz refresh frequency. The burst setting simply specifies the number of DRAM rows refreshed during each refresh period (1 to 4). The end result is that slowest refresh (and the least impact on the system performance) is achieved using refresh rate of 8 and burst of 1. This seems to work fine with the SIMMs I have.
  • DRAM wait states - The setting is either 0 or 1. This seem have almost no impact on performance... The difference that I see in System Speed Test Ver 4.78 is about 0.06% in video memory accesses and 0.03% in CPU cache accesses (why CPU cache is affected?!)
  • RAS to CAS delay - Does not seem to impact the performance, but the system hangs after POST if it set to 6. (Works fine with 2 or 4). I'll hook up the scope to see if there are any differences in the delay...
  • RAS precharge - Also does not seem to impact the performance. Same, I need to hook up the scope and check.
  • IO Channel refresh - This enabled or disables refresh cycles on ISA bus. I suspect the refresh cycles might be needed by some DRAM-based ISA memory expansion boards... Disabling this setting turns off generating refresh cycles - ISA /REFRESH won't pulse, and it slightly improves the performance.
  • ATBUS (or AT BUS) stepping - Disabling this seem to add some jitter on I/O and slightly improves the I/O performance. E.g., in the System Speed Test, with this setting enabled, the read rates look very flat given that I use an IDE disk-on-module. With this setting disabled, I get slightly higher read rates, but also some variability between minimal and maximal read speed. Any idea what this setting is supposed to do?

Any insights, comments, or suggestions on what else to test are appreciated.

Thanks,
Sergey

P.S. Here is my reverse-engineered SARC RC2016A chipset documentation: https://github.com/skiselev/mb386sx-rc2016/bl … /SARC_RC2016.md

Reply 2 of 6, by SergeK

User metadata
Rank Newbie
Rank
Newbie
kixs wrote on 2026-02-27, 19:19:

Try this cache486 for enabling 2X multi.

It's here:
Re: Doom on the 386 and 486DLC

I already tried that, and it doesn't work. It gives "Null pointer assignment". Probably a bug in the program :>
The code in my post above is what TI suggests for enabling the clock doubling. See https://www.bitsavers.org/components/ti/TI486 … rence_Guide.pdf page 3-13.

Reply 3 of 6, by montecarlo4tony

User metadata
Rank Newbie
Rank
Newbie
SergeK wrote on 2026-02-27, 19:06:
The system hangs after running this code... Not completely... I still see activity on ISA bus and CPU, it just does something no […]
Show full quote

The system hangs after running this code... Not completely... I still see activity on ISA bus and CPU, it just does something non-deterministic, if I had to guess.
I tried adding a delay after this sequence, e.g., a loop with writing to I/O port 80h (POST port), and in this case, the loop runs fine, and I can see numbers on the POST card. But as soon as the program exists, the system hangs.
So there must be something that breaks... maybe from the DOS, I/O, or memory perspective (assuming that the sequence above runs from the cache... although I can try disabling the cache, and checking if the behavior remains).

Any ideas where to look?

Sounds like an issue with A20 interfering with the CPU cache. Try enabling CKD with both caching off and HIMEM.SYS unloaded.

[*] ROM Shadowing - this seems to work fine, and I think I identified the chipset configuration registers bits responsible for it. There are two bits for each 16 KiB block at 0xC000-0xEFFFF. I suspect that one means read from ROM write to RAM and another is RAM write protect. I still need to verify that.

On my RC2016A5, the bits responsible for segments C800 through EFFF don't do anything. The BIOS that came with my M396F V3.0 (SHA1: 5ca2b36d5bee2870f894984909aa2013b5c4d6cf) only has CMOS options for Video BIOS and System BIOS; the code for the other segments is still there but unused. But otherwise, the 2 sets of bits work exactly as you described. There's also a bit in index 81h that controls whether the 384K of RAM is mapped into the OPROM section or at the end of RAM (I think).

[*] Fast reset/Fast A20 - I still have to test the register 0x92 function. At least with one BIOS, HIMEM.SYS fails to enable A20 when Fast A20 option is enabled.

There is no PS/2-compatible port 92h on this chipset. Per BIOS disassembly, index 87h bit 0 is the Fast Reset (set to 0, then 1 to perform the reset); and index 87h bit 1 is the Fast A20 Gate (0 to disable, 1 to enable). However, it seems that the chipset doesn't actually output this A20 signal on the wire that traverses the 8042-RC2016A5-CPU. The BIOS disregards the Fast A20 CMOS setting if it detects a Cyrix CPU during POST and only uses the 8042 output.

Reply 4 of 6, by MikeSG

User metadata
Rank Oldbie
Rank
Oldbie
SergeK wrote on 2026-02-27, 19:06:

writing to I/O port 80h (POST port)

I use Paul Gortmaker's cyrix.exe program to enable flush/barb/clock doubling. Available here: https://www.ardent-tool.com/CPU/CYRIX100.ZIP?v=3

The code is available in the zip as well. The command for clock doubling is "-cd" which corresponds to 40. "ccr0|=0x40"

SergeK wrote on 2026-02-27, 19:06:

I run TI486SXLC2-50 at 3.3V voltage using this adapter: https://github.com/skiselev/i386sx-socket

I have been testing TI486SXLC2's for a few years. A lot of people have problems with clock doubling in general.
-Many used a hot air gun to solder the CPU and clock doubling failed. Some used a soldering iron and it fails.
-Some say clock doubling only works when using more voltage. 4v-5v.
-Some say it runs at 50MHz (non clock-doubled), but not at 25MHz clock doubled to 50MHz.

Most of the performance is in the chipsets FSB speed & memory speed with this setup from experience. Clock-doubling does very little except for benchmarks that use only CPU speed x L1 cache (no memory bottleneck).

The memory speed to achieve is around 20MB/S in Cachechk. However you can get there is the system maximised.

Some BIOS' may recognise a 486SLC/DLC chip and add wait states which drops memory speed. In that case the only way to get memory speed up is to raise FSB.

Reply 5 of 6, by SergeK

User metadata
Rank Newbie
Rank
Newbie
MikeSG wrote on 2026-03-06, 15:11:

I use Paul Gortmaker's cyrix.exe program to enable flush/barb/clock doubling. Available here: https://www.ardent-tool.com/CPU/CYRIX100.ZIP?v=3

The code is available in the zip as well. The command for clock doubling is "-cd" which corresponds to 40. "ccr0|=0x40"

I believe I tried this program too, and it didn't work, but I'll try again...

MikeSG wrote on 2026-03-06, 15:11:
I have been testing TI486SXLC2's for a few years. A lot of people have problems with clock doubling in general. -Many used a hot […]
Show full quote

I have been testing TI486SXLC2's for a few years. A lot of people have problems with clock doubling in general.
-Many used a hot air gun to solder the CPU and clock doubling failed. Some used a soldering iron and it fails.
-Some say clock doubling only works when using more voltage. 4v-5v.
-Some say it runs at 50MHz (non clock-doubled), but not at 25MHz clock doubled to 50MHz.

Most of the performance is in the chipsets FSB speed & memory speed with this setup from experience. Clock-doubling does very little except for benchmarks that use only CPU speed x L1 cache (no memory bottleneck).

The memory speed to achieve is around 20MB/S in Cachechk. However you can get there is the system maximised.

Some BIOS' may recognise a 486SLC/DLC chip and add wait states which drops memory speed. In that case the only way to get memory speed up is to raise FSB.

I saw the hot air gun soldering story... It does not seem to be very plausible... What would make the PLL circuit more sensitive to the heat than the rest of the circuitry on the chip? A reflow oven would be a typical way solder SMDs, and the components are designed to withstand 250 degrees Celsius for a minute or so...

The higher voltage might be a thing... or something else related to the power supply... I have three capacitors on the 3.3V CPU power rails - two 0.1uF and one 10uF, very close to the CPU... But maybe that's not sufficient, and switching the frequency creates a sudden voltage droop... But in this case, I'd expect the CPU to crash, but it does continue to execute the code, until it returns to DOS. I might try to debug what actually causes the crash... IRQ processing? Memory accesses?

Mine runs fine at 40 MHz not clock doubled. I ordered some 100 MHz oscillators to try to run it at 50 MHz.

Well, 386SX/486SXLC are somewhat limited by its external 16 bit data bus. Yet 8 KiB on-chip cache in 486SXLC running at the core frequency compensates for this somewhat, assuming that some code and data fit in the cache... But definitely, increasing the bus frequency vs. running in a clock doubling mode result in better performance, assuming that the chipset and memory can work at the higher speed.
When running at 40 MHz, I am getting about 30 MB/s L1 cache speed according to System Speed Test Ver 4.78 benchmark.

I played with chipset settings too... Despite that there is no documentation for RC2016A, I reverse engineered some of the configuration registers, and tried different setting. At least the Award BIOS will adjust chipset settings based on the CPU frequency detected. It also has separate configuration registers settings for Cyrix/TI and IBM 486SLC/SXLC variants, although these are mostly related to cache enabling. It appears that some AMI BIOSes will attempt to enable clock doubling on 486SXLC, if they detect the CPU frequency of 25 MHz (50 MHz CLK2)... which, in my case, results in a hang during the POST.

Reply 6 of 6, by SergeK

User metadata
Rank Newbie
Rank
Newbie
montecarlo4tony wrote on 2026-03-06, 01:15:

Sounds like an issue with A20 interfering with the CPU cache. Try enabling CKD with both caching off and HIMEM.SYS unloaded.

I believe I tried to enable clock doubling without the cache, without any success. I can try again... I did all my tests without HIMEM.SYS loaded.
I also don't understand, what A20 has to do with the clock doubling? Without clock doubling everything works fine. The CPU's A20M line is connected to the keyboard controller and the chipset, so it is all good there...

On my RC2016A5, the bits responsible for segments C800 through EFFF don't do anything. The BIOS that came with my M396F V3.0 (SHA1: 5ca2b36d5bee2870f894984909aa2013b5c4d6cf) only has CMOS options for Video BIOS and System BIOS; the code for the other segments is still there but unused. But otherwise, the 2 sets of bits work exactly as you described.

Can you clarify what do you mean by "don't do anything"? They don't enable shadowing of this ROM area? Or they don't do anything because your BIOS doesn't have a configuration option to enable ROM shadowing there?
I tested several AMI BIOSes used on RC2016 based motherboards, and many of them don't have shadow configuration for the C8000-EFFFF area (or rather, these options are disabled and not shown).
I haven't verified, if enabling these configuration bits actually enables shadowing though...

There's also a bit in index 81h that controls whether the 384K of RAM is mapped into the OPROM section or at the end of RAM (I think).

I was wondering about that... It is possible that 384K RAM remapping is mutually exclusive with shadowing. If shadowing is enabled, a portion of that 384K of RAM will be used for shadowing, and likely, it is complicated to remap chunks that are not used for shadowing. So maybe, that's bit 0 of 81h?

There is no PS/2-compatible port 92h on this chipset. Per BIOS disassembly, index 87h bit 0 is the Fast Reset (set to 0, then 1 to perform the reset); and index 87h bit 1 is the Fast A20 Gate (0 to disable, 1 to enable). However, it seems that the chipset doesn't actually output this A20 signal on the wire that traverses the 8042-RC2016A5-CPU. The BIOS disregards the Fast A20 CMOS setting if it detects a Cyrix CPU during POST and only uses the 8042 output.

Yeah, I tested port 92h, and it doesn't do anything. No fast reset, and no fast A20 Gate...
Your observation about Cyrix CPU is very interesting. It is possible that the fast A20 Gate is implemented internally in the chipset. But there is no A20 gate output from the chipset. The Gate A20 pin of the chipset is an input, used for standard/slow A20 gate using the keyboard controller. Since Cyrix requires the A20M signal, and chipset cannot generate it, the BIOS will resort to generating A20 Gate signal to using the keyboard controller.

Perhaps there are some differences between RC2016 revisions too.... I've seen RC2016A4, RC2016A5, and RC2016A8... Surprisingly the later one seems to be manufactured by Toshiba...
Also there are remarked / or custom labeled versions - PC Chips, Cyclone, ALD...
RC2016A5 seems to be the most common revision.