|Introduction||Getting Help From Roedy|
|Author||Verification Fire Drill|
|Freeware Status||False Alarm CMOSChk Corruption Messages|
|Warranty and Support||What If You Have Already Crashed?|
|Getting the Latest Version||WINDOWS 95/98/ME|
|What Is CMOS?||Modern Large CMOS|
|Syntax||Y2K Year 2000 Compliance|
|Belt and Suspenders||Repeated Failures|
|Running Under DOS||CMOS Offsets. How each byte of CMOS is used|
|How It Works||CMOS Offset Notes|
|How to Use CMOS||Note to Computer Manufacturers|
|DOS Bootable Device||Extended CMOS|
CMOSSAVE is not a program for the naïve user. You must be familiar with composing ASCII (American Standard Code for Information Interchange) text command files and booting to DOS (Disk Operating System) to be able to use it.
Please report bugs and problems to firstname.lastname@example.org
Harvey Fishman wrote a pair of programs similar to CMOSSAVE and CMOSREST, but to the best of my knowledge, never released them.
Tel: (250) 361-9093
Big companies such as Sony, NCR (National Cash Register) and Chemineer use cmossave to protect all their machines and to clone CMOS settings across machines.
Keep in mind, CMOSSAVE won’t do you any good unless you have used it before you have trouble. I have no magic to bail you out after the fact. Pleading with me won’t help.
Happily, so long as you have done a CMOSSAVE and have not overwritten it, almost any problem can be rectified even if CMOSREST or CMOSCHK should fail.
The data in CMOS RAM can only be examined or changed with a special program such as CMOSSAVE. It is not a file. If you are curious about how CMOSSAVE does the access, have a look at the notes in the source code in CMOS.ASM.
When the battery dies, or does when a rechargeable battery not get sufficient on time to recharge, the CMOS fails and it forgets all it knows about your configuration.
CMOSSAVE is designed to restore this lost information by storing copies of it on floppy and/or hard disk.
/Q suppresses unnecessary banner messages.
At that point you must reboot before the restored CMOS settings take effect. Sometimes CMOS will be so badly damaged the hard disk parameters will be corrupt and your hard disk will stop working. In that case you will have to revert to using the floppy copy.
Whenever you change your CMOS setting deliberately, you need to redo the CMOSSAV.COM. However, use a new filename, so that you can easily revert to the old version if your new settings do not pan out.
Modern computers have larger CMOS memories than 128 bytes, but you access them via proprietary ways, which CMOSSAVE does not know. So CMOSSAVE just saves the first 128 bytes, which are accesses in a uniform way on all PCs (Personal Computers).
CMOSREST does not touch bytes 0 to 09 and 32h because these are volatile — they contain the date and time. Similarly CMOSCHK, does not panic if any of these volatile bytes differ. However, CMOSSAVE saves all 128 bytes, so that you can browse the generated file with a hex editor to learn more about how CMOS works.
You need some sort of hex viewer to see the contents of the CMOS.SAV file. The hex list of bytes is not that meaningful if you are not a computer programmer.
Daring users could even patch the CMOS.SAV file with a hex editor and restore to get special effects, e.g. to switch between two different CMOS configurations e.g. one with and one without some hard disk. Don’t attempt to edit the file with a non-hex viewer such as NotePad, WordPad, Write or Word For Windows. If you do, you will scramble the file beyond recognition.
Because CMOSSave also saves the extended CMOS bytes, CMOSRest will restore the esoteric options like shadow RAM, wait states, processor clock speed, HMA (High Memory Area) enable etc. It works on ISA (Industry Standard Architecture), EISA (Extended Industry Standard Architecture) and PCI (Peripheral Component Interconnect) machines.
These is no need for any of the three utilities to calculate checksums, since the checksum is saved and restored just like any other CMOS byte.
You might wonder why CMOSSave saves only 128 bytes of CMOS even though some modern computers have many times that amount. The problem is the way you get at the rest of it is proprietary. The vendors won’t disclose how you get at it. It is possible to disassemble the ROM BIOS to figure it out in an individual case, but that won’t work on other machines. So it is usually not worth the bother unless you wanted a special version of CMOSSAVE for thousands of identical machines.
See CMOS.OFS for a detailed list of what each byte in the CMOS is used for. This is usually of interests to technophiles only.
What is considered volatile and what is not, might vary for different motherboards. If you have trouble restoring, Do not despair. All is recorded. A variant of the CMOSREST program could get you back. All you need do in make a slight modification to the assembler source VOLATILE routine that decides which bytes to consider volatile. Even a very junior MASM (Microsoft Assembler) programmer could make that modification for you using the assembler source.
If you do a CMOSSAVE from the DOS prompt and from true DOS there may be some subtle differences and CMOSCHK may complain about them. This is nothing to worry about since when you restore, those bits in the CMOS will be automatically corrected the next time you boot to either DOS or Windows. It is quite safe to save from the DOS prompt with CMOSSAVE, check with CMOSCHK from autoexec.bat or other bat file and do your restore with CMOSREST from true DOS.
Sometimes your CMOS will be so wrecked you cannot even get your machine limping enough to run CMOSREST from floppy. In that case you must clear CMOS. Do this on AMI (American Megatrends Inc) BIOS es by holding down the Ins key, powering off, powering on, then releasing the Ins key. In the worst case, remove the battery and let the capacitance on the board drain overnight to clear it. On some CMOS es you can clear CMOS by selecting universal default settings from the normal CMOS setting menu.
You can then get a bare bones CMOS configured — that just has the floppies right. Nothing else much matters. From there you can run CMOSREST.COM.
The SSTOR disk formatting utility from Storage Dimensions makes it look as though it had modified CMOS. If you boot without the SSTOR driver, CMOS will appear to have changed because SSTOR is not doing its standard trickery.
The NCR CMOSDR6X program interferes with CMOSSAVE and CMOSREST. Make sure you do your CMOSSAVE CMOSREST work before loading this program.
The TURBO setting is part of CMOS. If you accidentally turn turbo mode off, CMOS will appear to be changed and CMOSCHK will complain. To clear the problem, set turbo back on and allow the CMOSCHK to restore CMOS. This way CMOSCHK will remind you if you have accidentally turned off turbo mode. This feature can be turned off by making the byte where your turbo info is stored volatile. If you want this feature, just send the CMOSCHK listing that complains about CMOS being changed.
CMOSREST does not take effect until you REBOOT!!
You had best get an expert to help you set the CMOS back to defaults and guess the fine tuning for the parameters. The dealer who sold you the machine is the best person to help. He may be able to contact the disk manufacturer to find out how many heads and cylinders it has. He may be able to find hints in the motherboard manual.
If your machine has an exact twin, you may still be in luck. You can make a backup of the CMOS on that machine, then restore it into the ruined one. Don’t try this unless the machines are absolutely identical. There is a good chance you will destroy your hard disk data if you transplant a CMOS from a different sized disk.
You can manually set CMOS back if you hit the magic keys during hard boot, often DEL, F2, or Ctrl-Alt-Esc. Sometimes you need a diskette to set up CMOS. Check the manual that came with your motherboard, or check with the company that sold it to you.
Usually there is a way to set CMOS settings to default. In a pinch you can do it by removing the battery for a day or two.
Windows 95 still has a C:\autoexec.bat just as under DOS. Alternatively go into a DOS box and use the CMOSSSAVE utilities just as you would under DOS to add the call to CHKCMOS.BAT or to directly invoke CHKCMOS.COM. still use CMOSSAVE and CMOSREST just as under previous versions of DOS and Windows. Putting cmoschk.com in your autoexec just helps you detect CMOS corruption the instant it occurs.
Windows 95 users often have no understanding of the DOS CD, MD and path commands, how to edit autoexec.bat or even how to run a DOS program. If you are one of this new breed, your best bet is to get help from someone who is familiar with DOS, since if CMOS is corrupt you will need to revert to DOS to get Windows going again.
You can run the utilities either in autoexec.bat, in DOS or 4DOS box, in a BAT (Batch) file, or by creating a shortcut, complete with parameters on the command line.
However, here is a crude, but fool-proof recipe to use cmossave manually under Windows 95.
Copy the files cmossave.com, cmoschk.com and cmosrest.com to a freshly formatted floppy in your A: drive.
In Win 95, select Start, Programs, MS DOS Prompt to get you to the Win 95 DOS box. Type:
You can acquire a bootable floppy by digging in your old DOS diskettes, asking an old timer for one, or you can right click Format and select bootable DOS disk. It may be possible to use memory sticks, thumbdrives, CDs (Compact Discs) and DVDs (Digital Video Discs) too with appropriate DOS-formatting software.
If you are testing a number of machines, make sure you erase the CMOS.SAV file on floppy between tests. You don’t want to accidentally restore the CMOS.SAV file from one machine into another (unless they were absolutely identical, including hard disk size.)
You can configure XT floppies using DOS ’s DRIVPARM.
Back in the good old days of the XT you had to use proprietary methods to format hard disks and tell DOS how big they are. Typically you fired them up with debug g=c800:5 and talked with a proprietary ram-based low level formatting program. Then you later used DOS format. HDSNIFF goes into this in much more detail. Briefly:
|XT Drive Settings|
|Brand||Debug Init||Step byte code = step pulse rate|
|Adaptec||g=c800:ccc||3=13 µs, 2=30 µs, 5=70 µs, 4=200 µs, 0=3 ms|
|DTC5150CRH||g=c800:5||2=12 µs, 5=70 µs, 4=200 µs, 0,1,6,7=3 ms|
|DTC5150XL||g=c800:5||0=5,10,20,30,40,50,60,70 µs (cannot tell which!)|
|IBM/Xebec||5=70 µs, 4=200 µs, 0,6,7=3 ms|
|Omti||g=c800:6||1=10 µs, 2=25 µs, 3=40 µs, 5=70 µs, 4=200 µs, 0,6,7=3 ms|
|WD-old||g=c800:5||5=70 µs, 4=200 µs, 0,6,7=3 ms|
|Wd1002-Wx1||g=c800:5||3,7=10.5 µs, 2=22.5 µs, 6=28.5 µs, 1=46.5 µs, 5=70.5 µs, 4=202.5 µs, 0=3.1 ms|
|WD10025WX2||g=c800:5||3,7=18 µs, 6=30 µs, 1=45 µs, 2=60 µs, 5=75 µs, 4=210 µs, 0=3ms|
|Wd1002-27X||g=c800:5||3,7=8 µs, 1,2,4,5,6=24 µs, 0=3 ms|
|Wd1004-Wx1||g=c800:5||3,7=12 µs, 6=27 µs, 1=51 µs, 2=63 µs, 5=75 µs, 4=207 µs, 0=3 ms|
|Wd1004-27X||g=c800:5||3,7=8 µs, 1,2,4,5,6=24 µs, 0=3 ms|
|WD1004A27X||g=c800:5||3,7=11 µs, 1,2,4,5,6=24 µs, 0=3.3 ms|
|WD-XT-GEN1||g=c800:5||3,7=18 µs, 6=30 µs, 1=45 µs, 2=60 µs, 5=75 µs, 4=210 µs, 0=3ms|
|WD-XT-GEN2||g=c800:5||3,7=18 µs, 6=30 µs, 1=45 µs, 2=60 µs, 5=75 µs, 4=210 µs, 0=3ms|
! = must be restored
* = checksummed
v = volatile
|v||00h||Seconds time of day|
|v||02h||Minutes time of day|
|v||04h||Hours time of day|
|v||06h||Day of the Week|
|v||07h||Day of the Month|
|v||09h||Year 1980 = 0|
|v||0Ah||Status Register A
bit 7 = updating time
bit 6:4 = system clock divider
bit 3:0 = periodic interrupt rate
|!||0Bh||Status Register B alarm
bit 7 = abort update cycle
bit 6 = enable periodic interrupt
bit 5 = enable alarm interrupt
bit 4 = enable update-ended interrupt
bit 3 = enable square wave generator
bit 2 = 1 = calendar in binary, 0 = bcd
bit 1 = 1 = 24 hour clock, 0 = 12 hour clock
bit 0 = 1 enable daylight savings
|v||0Ch||Status Register C flags
bit 7 = interrupt active
bit 6 = periodic interrupt flag
bit 5 = alarm flag
bit 4 = update end flag
bit 3:0 = reserved
|!||0Dh||Status Register D battery bit 7 = Real Time Clock has power
bit 6:0 = reserved
|!||0Eh||Diagnostic Status Byte
bit 7 = RTC (Real Time Clock) lost power
bit 6 = CMOS checksum bad
bit 5 = invalid system config
bit 4 = invalid memory size
bit 3 = fixed disk adapter failure
bit 2 = invalid CMOS time
bit 1 = reserved
bit 0 = reserved
|!||0Fh||Shutdown Status Byte|
|!*||10h||Disk Drive Type for Drives A: and B:
The drive-type bytes use bits 7:4 (most significant nibble)
for the first floppy drive A: and 3:0 for B:
floppy drive types:
00h no drive present
|!*||11h||(AT (Advanced Technology)):Reserved (PS/2):drive
type for hard disk C:
AMI bios uses it like this:
bit 7 mouse enabled
bit 6 test memory above 1 MB
bit 5 tick sound during memory test
bit 4 memory parity enabled
bit 3 at bootup display setup keystroke
bit 2 specify hard disk data location
bit 1 pause on error
bit 0 numlock on
XT/286):hard disk type for drives C: and D:
bits 7:4 C: bits 3:0 D:
(PS/2):drive type for hard disk D:
Format of drive-type entry for AT, XT/286:
|!*||13h||Reserved, keyboard repeat rate|
|!*||14h||Equipment Byte (corresponds to sw. 1 on PC (Personal Computer)
bits 7:6 - 00 = 1 floppy 01 = 2 floppies
bits 5:4 = 10 = colour 11 = mono
bit 1 = coprocessor present
bit 0 = 0 = floppies present
|!*||15h-16h||Base Memory Size in K (low,high)|
|!*||17h-18h||Expansion Memory Size in K (low,high)|
|!*||19h||drive C: extended info|
|!*||1Ah||drive D: extended info|
(PS/2) POS (Point Of Sale) information Model 50 (60 and 80 use a 2K
CMOS RAM that is not accessible through software)
|!*||1Bh-1CH||AMI type 46 cyls|
|!*||1Dh||AMI type 46 head count|
|!*||1Eh-1Fh||AMI type 46 write precomp starting cyl|
|!*||20h||AMI type 46 control byte|
|!*||21h-22h||AMI type 46 landing zone cylinder|
|!*||23h||AMI type 46 sectors per track|
|!*||24h-25H||AMI type 47 cyls|
|!*||26h||AMI type 47 head count|
|!*||27h-28h||AMI type 47 write precomp starting cyl|
|!*||29h||AMI type 47 control byte|
|!*||2Ah-2Bh||AMI type 47 landing zone cylinder|
|!*||2Ch||AMI type 47 sectors per track|
|!*||21h||Used in AMI bioses
bit 7 Weitek present
bit 6 floppy seek on boot
bit 5 first C: then A:
bit 4 fast clock
bit 3 external cache enabled
bit 2 internal cache enabled
bit 1 fast A20
bit 0 allow turbo switch
|!*||22h-2Dh||Reserved (possibly checksumed)|
|!*||2Eh-2Fh||Checksum of Bytes 10..20 or 10..2F (low,high)|
|!||30h-31h||Exp. Memory Size as Det. by POST (low,high)|
|v||32h||Date Century Byte|
|!||33h||Information Flags (set during power-on)|
|!||37h||Date Century on MCA (Micro-Channel Architecture)|
|v||3Ah||bit 1 of 3Ah used to mark whether have Plug & Play OS in Sony.|
|!||3Ch||90/91 AMI Bios boot order A/C or C/A|
|!||3Fh||quasi-volatile in Pentiums (We restore, but ignore in CMOSCHK)|
|!v||40h-42h||Reserved for chipmaker|
|!||43h-49h||Reserved for chipmaker|
|4Ah||AST laptop backlight timeout in minutes|
|4Bh||AST laptop hard disk timeout in minutes|
|4Ch-52h||system password scan codes|
|!*||60h-61H||Phoenix type 48 cyls|
|!*||62h||Phoenix type 48 head count|
|!*||63h-64h||Phoenix type 48 write precomp starting cyl|
|!*||65h-65h||Phoenix type 48 landing zone cylinder|
|!*||67h||Phoenix type 48 sectors per track|
|!*||75h-76H||Phoenix type 49 cyls|
|!*||77h||Phoenix type 49 head count|
|!*||78h-79h||Phoenix type 49 write precomp starting cyl|
|!*||7Ah-7Bh||Phoenix type 49 landing zone cylinder|
|!*||7Ch||Phoenix type 49 sectors per track|
To access the configuration RAM write the byte address (00-3Fh) you need to access to I/O port 70h, then access the data via I/O port 71h.
CMOS RAM chip is a Motorola 146818
The equipment byte is used to determine the configuration for the POST power-on diagnostics.
Bytes 00-0Dh are defined by the chip for timing functions, bytes 0Eh-3Fh are defined by IBM (International Business Machines).
compaq 386 uses the same CMOS chip as IBM
byte 45 (2Dh) store additional info not maintained by AT
bit 0 indicates is Compaq dual-mode monitor installed
bit 1 indicates whether keyclick is enabled
bit 2 not used
bit 3 if non-Compaq graphics adapter installed
Some CMOS es, (SXs) appear to store duplicates of registers 0:3F in 40:7F, others (DXs) store some other advanced configuration information in these registers. Thus there are 64 byte and 128 byte CMOSes (Complementary Metal Oxide on Silicons). We tell them apart by looking for a match in bytes in the checksum range.
Offsets 10..2F are included in the checksum. We do not ever need to compute a checksum in CMOSREST since we just save and restore. Exactly what is included in the checksum varies with the BIOS. Sometimes only 10..20 is included.
For further information see the IBM AT Technical reference page 1-56. PC Magazine did an article on CMOS on page 344 of the 1994-09-13 edition.
For a detailed list, especially for vendor specific bytes is in The Undocumented PC, A Programmer’s Guide To I/O, CPU s and Fixed Memory Areas by Frank van Gilluwe, Addison-Wesley. For exhaustive detail, see CMOS.LST available as part of Ralf Brown’s interrupt list:
You can modify the VOLATILIST in CMOS.ASM if you find other volatile bytes in your CMOS, in other words, bytes in CMOS that seem to change even when CMOS is not corrupted.
You can rapidly clone the CMOS settings of one template machine in a dozen others. You create a DOS bootable removable device (floppy, USB drive etc), with a copy of CMOSSAVE.com and CMOSREST.com on it. You set up one machine, do a CMOSSAVE to the DOS bootable device, then insert that device into each machine to clone, boot and do a CMOSREST.
|recommend book⇒The Undocumented PC, A Programmer’s Guide To I/O, CPUs and Fixed Memory Areas|
|by||Frank van Gilluwe||978-0-201-62277-5||paperback|
|A fasciting book about CPU detection, undocumented CPU instructions, how adapter cards work, how the BIOS works, how DMA works and, of course, how CMOS works and how the various parts of CMOS are used.|
|Greyed out stores probably do not have the item in stock. Try looking for it with a bookfinder.|
This page is posted
Optional Replicator mirror
Your face IP:
You are visitor number|
|The information on this page is for non-military use only.|
Military use includes use by defence contractors.