home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
at
/
viewcmos.arc
/
VIEWCMOS.C
next >
Wrap
Text File
|
1989-12-31
|
20KB
|
381 lines
/* ---------------------------------------------------------------------
C code for reading contents of CMOS setup registers. This code uses
information supplied by James McDaniel, CIS 74365,1716 for his
CMOSRA.ARC file (CompuServ). Code and information is provided for
use "as-is" and is not guaranteed to be completely correct. Some
update performed on this data.
BASIC THEORY: CMOS data is accessible via I/O ports 70 and 71 HEX.
First send address to I/O port 70 and then read data from I/O port
71. See data sheet on MC14818 for more info on commands and their
use. A breakdown of memory locations and their use follows.
This C code organizes the CMOS data as a data structure, as follows.
--------------------------------------------------------------------- */
#include <stdio.h>
#include <dos.h>
typedef struct
{ char seconds; /* AT Real Time Clock (RTC): Seconds */
char secalrm; /* AT RTC: Seconds Alarm */
char minutes; /* AT RTC: Minutes */
char minalrm; /* AT RTC: Minutes Alarm */
char hours; /* AT RTC: Hours */
char hrsalrm; /* AT RTC: Hours Alarm */
char dayofweek; /* AT RTC: day of week */
char dayofmon; /* AT RTC: day of month */
char month; /* AT RTC: month */
char year; /* AT RTC: year */
char aregister; /* STATUS REGISTER A */
char bregister; /* STATUS REGISTER B */
char cregister; /* STATUS REGISTER C */
char dregister; /* STATUS REGISTER D */
char diagnostic; /* Diagnostics status byte */
char shutdown; /* Shutdown status byte */
char diskettes; /* A & B diskette types */
char reserved1; /* undefined */
char harddrive; /* C & D hard drive types */
char reserved2; /* undefined */
char equipment; /* equipment byte */
char lowbyte; /* low byte of base memory */
char highbyte; /* high byte of base memory */
/* 100h = 256k, 200h = 512k, 280h = 640k */
char extlow; /* low byte of extended memory */
char exthigh; /* high byte of extended memory */
/* 200h=512k;400h=1024k;etc to 3c00h=15360k */
char drivec; /* more data on drive c */
char drived; /* more data on drive d */
char reserved[19]; /* reserved */
unsigned checksum;
char extlow1; /* same as extlow */
char exthigh1; /* same as exthigh */
char century; /* binary coded decimal value for century */
/* 19h = 1900 for example */
char infoflag; /* bit 7 set = top 128k installed */
char info[12];
} CMOS, *CMOSPTR;
/* -------------------------------------------------------------------------
AT REAL TIME CLOCK STATUS REGISTER A
===========================================================================
7 6 5 4 3 2 1 0 FUNCTION ALLOWABLE VALUES
---------------------------------------------------------------------------
X UPDATE IN PROGRESS 1=DATE/TIME BEING UPDATED 0=NOT
X X X 22 STAGE DIVIDER DEFAULT=010, 32.768 KHZ TIME BASE
X X X X RATE SELECTION DEFAULT=0110, 1.024 KHZ FREQUENCY
===========================================================================
AT REAL TIME CLOCK STATUS REGISTERS B
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
--------------------------------------------------------------------------
X SET, 1 PER SECOND 0=UPDATE NORMALLY, 1=ABORT UPDATE
X PERIODIC INT ENABLE 0=DISABLE INT (DEFAULT), 1=ENABLED
X ALARM INT ENABLE 0=DISABLED (DEFAULT), 1=ENABLED
X UPDATE END INT ENA. 0=DISABLED (DEFAULT), 1=ENABLED
X SQUARE WAVE ENABLE 0=DIS (DEF), 1=ENA, PER REG A 0-3
X DATE MODE 0=BCD (DEFAULT), 1=BINARY
X 24/12 MODE 0=12 HOUR, 1=24 HOUR FORMAT (DEFAULT)
X DAYLIGHT SAVING ENA 0=DISABLED (DEFAULT), 1=ENABLED
===========================================================================
AT REAL TIME CLOCK STATUS REGISTER C
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
-------------------------------------------------------------------------
X IRQF FLAG READ ONLY
X PF FLAG READ ONLY
X AF FLAG READ ONLY
X UF FLAG READ ONLY
X X X X RESERVED SHOULD ALWAYS BE ZERO
===========================================================================
AT CMOS STATUS REGISTER D
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
--------------------------------------------------------------------------
X VALID RAM BIT 0=BATT DEAD,RAM INVALID, 1=BATT GOOD
X X X X X X X RESERVED SHOULD ALWAYS BE ZERO
===========================================================================
AT CMOS DIAGNOSTICS BYTE
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
------------------------------------------------------------------------
X POWER STAT OF RTC 1=CHIP HAS LOST POWER, 0=NOT
X CHECKSUM STATUS 0=CHECKSUM OK, 1=NOT OK
X CONFIGURATION INFO 0=VALID INFO, 1=NOT VALID
X MEMORY SIZE COMPARE 0=SAME SIZE, 1=NOT SAME SIZE
X FIXED DISK STATUS 0=OK, 1=DRIVE OR ADAPTER FAILED
X TIME STATUS 0=TIME IS OK, 1=TIME NOT OK
X X RESERVED
===========================================================================
AT CMOS DRIVE TYPE BYTE
===========================================================================
7 6 5 4 3 2 1 0 FUNCTION ALLOWABLE VALUES
-------------------------------------------------------------------------
X X X X TYPE OF FIRST DRIVE 0000=NO DRIVE, 0001=360K 5.25"
0010=1.2M 5.25" 0011=720K 3.5"
0100=1.44M 3.5"
X X X X TYPE OF SECOND DRIVE
===========================================================================
AT CMOS FIXED DRIVE TYPES
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
----------------------------------------------------------------------------
X X X X FIXED DISK C TYPE 0000=NO DRIVE 1H TO 0EH SEE CHART
X X X X FIXED DISK D TYPE 0000=NO DRIVE 1H TO 0EH SEE CHART
IF BYTE= 0FH THEN SEE EXTENDED BYTE FOR DRIVE TYPE
===========================================================================
AT CMOS EQUIPMENT BYTE
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
-----------------------------------------------------------------------------
X X NUMBER OF DISK DRIVES 00=1,01=2,10=3,11=4
X X PRIMARY DISPLAY TYPE 00=DISPLAY HAS BIOS or EGA,
01=40 COL CGA,
10=80 COL CGA,
11=MDA,
101=EGA
X X NOT USED
X MATH COPROCESSOR 0=NOT INSTALLED, 1=INSTALLED
X DISK DRIVES AVAILABLE 0=NO DRIVES, 1=DISK DRIVES AVAILABLE
===========================================================================
AT CMOS DRIVE C AND D EXTENDED DRIVE TYPE BYTES
===========================================================================
7 6 5 4 3 2 1 0 NAME ALLOWABLE VALUES
-----------------------------------------------------------------------------
X X X X X X X X DRIVE C TYPE BYTE SEE NEXT CHART FOR TYPES
X X X X X X X X DRIVE D TYPE BYTE SEE NEXT CHART FOR TYPES
IF FIXED DRIVE 4 BITS FOR C IS 0-0EH IGNOR EXTENDED C
IF FIXED DRIVE 4 BITS FOR D IS 0-0EH IGNOR EXTENDED D
AT HARD DISK TYPES
+--------------------------------------------------------+
| | | | | | | |
| DISK | CYLINDER | TOTAL | PRE- | LAND | SECTORS | SIZE |
| TYPE | COUNT | HEADS | COMP | ZONE | PER/TRK | MB |
|------+----------+-------+------+------+---------+------|
| 1 | 306 | 4 | 128 | 305 | 17 | 10.1 |
|------+----------+-------+------+------+---------+------|
| 2 | 615 | 4 | 300 | 615 | 17 | 20.4 |
|------+----------+-------+------+------+---------+------|
| 3 | 615 | 6 | 300 | 615 | 17 | 30.6 |
|------+----------+-------+------+------+---------+------|
| 4 | 940 | 8 | 512 | 940 | 17 | 62.4 |
|------+----------+-------+------+------+---------+------|
| 5 | 940 | 6 | 512 | 940 | 17 | 46.8 |
|------+----------+-------+------+------+---------+------|
| 6 | 615 | 4 | NONE | 615 | 17 | 20.4 |
|------+----------+-------+------+------+---------+------|
| 7 | 462 | 8 | 256 | 511 | 17 | 30.6 |
|------+----------+-------+------+------+---------+------|
| 8 | 733 | 5 | NONE | 733 | 17 | 30.4 |
|------+----------+-------+------+------+---------+------|
| 9 | 900 | 15 | NONE | 901 | 17 |112.0 |
|------+----------+-------+------+------+---------+------|
| 10 | 820 | 3 | NONE | 820 | 17 | 20.4 |
|------+----------+-------+------+------+---------+------|
| 11 | 855 | 5 | NONE | 855 | 17 | 35.4 |
|------+----------+-------+------+------+---------+------|
| 12 | 855 | 7 | NONE | 855 | 17 | 49.6 |
|------+----------+-------+------+------+---------+------|
| 13 | 306 | 8 | 128 | 319 | 17 | 20.3 |
|------+----------+-------+------+------+---------+------|
| 14 | 733 | 7 | NONE | 733 | 17 | 42.5 |
|------+----------+-------+------+------+---------+------|
| 16 | 612 | 4 | 0 | 663 | 17 | 20.5 |
|------+----------+-------+------+------+---------+------|
| 17 | 977 | 5 | 300 | 977 | 17 | 40.5 |
|------+----------+-------+------+------+---------+------|
| 18 | 977 | 7 | NONE | 977 | 17 | 56.7 |
|------+----------+-------+------+------+---------+------|
| 19 | 1024 | 7 | 512 | 1023 | 17 | 59.5 |
|------+----------+-------+------+------+---------+------|
| 20 | 733 | 5 | 300 | 732 | 17 | 30.4 |
|------+----------+-------+------+------+---------+------|
| 21 | 733 | 7 | 300 | 732 | 17 | 42.5 |
|------+----------+-------+------+------+---------+------|
| 22 | 733 | 5 | 300 | 733 | 17 | 30.4 |
|------+----------+-------+------+------+---------+------|
| 23 | 306 | 4 | 0 | 336 | 17 | 10.1 |
|------+----------+-------+------+------+---------+------|
| 25 | 615 | 4 | 0 | 615 | 17 | 20.4 |
|------+----------+-------+------+------+---------+------|
| 26 | 1024 | 4 | NONE | 1023 | 17 | 34.0 |
|------+----------+-------+------+------+---------+------|
| 27 | 1024 | 5 | NONE | 1023 | 17 | 42.5 |
|------+----------+-------+------+------+---------+------|
| 28 | 1024 | 8 | NONE | 1023 | 17 | 68.0 |
|------+----------+-------+------+------+---------+------|
| 29 | 512 | 8 | 256 | 512 | 17 | 34.0 |
|------+----------+-------+------+------+---------+------|
| 30 | 615 | 2 | 615 | 615 | 17 | 10.2 |
|------+----------+-------+------+------+---------+------|
| 31 | 989 | 5 | 0 | 989 | 17 | 41.0 |
|------+----------+-------+------+------+---------+------|
| 32 | 1020 | 15 | NONE | 1024 | 17 |127.0 |
|------+----------+-------+------+------+---------+------|
| 35 | 1024 | 9 | 1024 | 1024 | 17 | 76.5 |
|------+----------+-------+------+------+---------+------|
| 36 | 1024 | 5 | 512 | 1024 | 17 | 42.5 |
|------+----------+-------+------+------+---------+------|
| 37 | 830 | 10 | NONE | 830 | 17 | 68.8 |
|------+----------+-------+------+------+---------+------|
| 38 | 823 | 10 | 256 | 824 | 17 | 68.3 |
|------+----------+-------+------+------+---------+------|
| 39 | 615 | 4 | 128 | 664 | 17 | 20.4 |
|------+----------+-------+------+------+---------+------|
| 40 | 615 | 8 | 128 | 664 | 17 | 40.8 |
|------+----------+-------+------+------+---------+------|
| 41 | 917 | 15 | NONE | 918 | 17 |114.1 |
|------+----------+-------+------+------+---------+------|
| 42 | 1023 | 15 | NONE | 1024 | 17 |127.3 |
|------+----------+-------+------+------+---------+------|
| 43 | 823 | 10 | 512 | 823 | 17 | 68.3 |
|------+----------+-------+------+------+---------+------|
| 44 | 820 | 6 | NONE | 820 | 17 | 40.8 |
|------+----------+-------+------+------+---------+------|
| 45 | 1024 | 8 | NONE | 1024 | 17 | 68.0 |
|------+----------+-------+------+------+---------+------|
| 46 | 925 | 9 | NONE | 925 | 17 | 69.1 |
|------+----------+-------+------+------+---------+------|
| 47 | 699 | 7 | 256 | 700 | 17 | 40.6 |
+--------------------------------------------------------+
--------------------------------------------------------------------- */
#define CMOS_ADDR 0x70 /* address port of CMOS */
#define CMOS_DATA 0x71 /* data port for CMOS */
void GetCMOS(char *cmosdata) /* read CMOS data (64 bytes) */
{
unsigned char j, byte;
for (j=0; j<64; j++)
{ disable(); /* disable interrupts */
outportb(CMOS_ADDR,j); /* specify byte to get */
byte= inportb(CMOS_DATA); /* get data */
enable(); /* enable interrupts */
*cmosdata++ = byte; /* save CMOS data */
}
}
void ReadCMOS(void)
{
static char *floppy[] = { "None",
"360K 5.25-inch",
"1.2M 5.25-inch",
"720K 3.5-inch",
"1.44M 3.5-inch"
};
static char *display[] = { "EGA", /* 00 */
"40 column CGA", /* 01 */
"80 column CGA", /* 10 */
"MDA", /* 11 */
};
static char *math[] = { "Not Installed",
"Installed"
};
static char *diag[] = { "Time","Hard Dr","Memory","CnfInfo","Chksum","PwrOK"};
static char *status[] = { "OK","Not OK" };
static char *hardtbl[] = {
"┌──────┬──────────┬───────┬──────┬──────┬─────────┬──────┐",
"│Drive │ Cylinder │ Heads/│ Pre- │ Land │ Sectors │ Size │",
"│ Type │ (Tracks) │ Sides │ Comp │ Zone │ Per Trk │ (MB) │",
"│──────┼──────────┼───────┼──────┼──────┼─────────┼──────│"};
static char *harddisk[] =
{ "│ None │ --- │ -- │ --- │ --- │ -- │ ---- │",
"│ 1 │ 306 │ 4 │ 128 │ 305 │ 17 │ 10.1 │",
"│ 2 │ 615 │ 4 │ 300 │ 615 │ 17 │ 20.4 │",
"│ 3 │ 615 │ 6 │ 300 │ 615 │ 17 │ 30.6 │",
"│ 4 │ 940 │ 8 │ 512 │ 940 │ 17 │ 62.4 │",
"│ 5 │ 940 │ 6 │ 512 │ 940 │ 17 │ 46.8 │",
"│ 6 │ 615 │ 4 │ NONE │ 615 │ 17 │ 20.4 │",
"│ 7 │ 462 │ 8 │ 256 │ 511 │ 17 │ 30.6 │",
"│ 8 │ 733 │ 5 │ NONE │ 733 │ 17 │ 30.4 │",
"│ 9 │ 900 │ 15 │ NONE │ 901 │ 17 │112.0 │",
"│ 10 │ 820 │ 3 │ NONE │ 820 │ 17 │ 20.4 │",
"│ 11 │ 855 │ 5 │ NONE │ 855 │ 17 │ 35.4 │",
"│ 12 │ 855 │ 7 │ NONE │ 855 │ 17 │ 49.6 │",
"│ 13 │ 306 │ 8 │ 128 │ 319 │ 17 │ 20.3 │",
"│ 14 │ 733 │ 7 │ NONE │ 733 │ 17 │ 42.5 │",
"│ 16 │ 612 │ 4 │ 0 │ 663 │ 17 │ 20.5 │",
"│ 17 │ 977 │ 5 │ 300 │ 977 │ 17 │ 40.5 │",
"│ 18 │ 977 │ 7 │ NONE │ 977 │ 17 │ 56.7 │",
"│ 19 │ 1024 │ 7 │ 512 │ 1023 │ 17 │ 59.5 │",
"│ 20 │ 733 │ 5 │ 300 │ 732 │ 17 │ 30.4 │",
"│ 21 │ 733 │ 7 │ 300 │ 732 │ 17 │ 42.5 │",
"│ 22 │ 733 │ 5 │ 300 │ 733 │ 17 │ 30.4 │",
"│ 23 │ 306 │ 4 │ 0 │ 336 │ 17 │ 10.1 │",
"│ 25 │ 615 │ 4 │ 0 │ 615 │ 17 │ 20.4 │",
"│ 26 │ 1024 │ 4 │ NONE │ 1023 │ 17 │ 34.0 │",
"│ 27 │ 1024 │ 5 │ NONE │ 1023 │ 17 │ 42.5 │",
"│ 28 │ 1024 │ 8 │ NONE │ 1023 │ 17 │ 68.0 │",
"│ 29 │ 512 │ 8 │ 256 │ 512 │ 17 │ 34.0 │",
"│ 30 │ 615 │ 2 │ 615 │ 615 │ 17 │ 10.2 │",
"│ 31 │ 989 │ 5 │ 0 │ 989 │ 17 │ 41.0 │",
"│ 32 │ 1020 │ 15 │ NONE │ 1024 │ 17 │127.0 │",
"│ 35 │ 1024 │ 9 │ 1024 │ 1024 │ 17 │ 76.5 │",
"│ 36 │ 1024 │ 5 │ 512 │ 1024 │ 17 │ 42.5 │",
"│ 37 │ 830 │ 10 │ NONE │ 830 │ 17 │ 68.8 │",
"│ 38 │ 823 │ 10 │ 256 │ 824 │ 17 │ 68.3 │",
"│ 39 │ 615 │ 4 │ 128 │ 664 │ 17 │ 20.4 │",
"│ 40 │ 615 │ 8 │ 128 │ 664 │ 17 │ 40.8 │",
"│ 41 │ 917 │ 15 │ NONE │ 918 │ 17 │114.1 │",
"│ 42 │ 1023 │ 15 │ NONE │ 1024 │ 17 │127.3 │",
"│ 43 │ 823 │ 10 │ 512 │ 823 │ 17 │ 68.3 │",
"│ 44 │ 820 │ 6 │ NONE │ 820 │ 17 │ 40.8 │",
"│ 45 │ 1024 │ 8 │ NONE │ 1024 │ 17 │ 68.0 │",
"│ 46 │ 925 │ 9 │ NONE │ 925 │ 17 │ 69.1 │",
"│ 47 │ 699 │ 7 │ 256 │ 700 │ 17 │ 40.6 │"};
CMOS cmosdata;
char *iptr = (char *)&cmosdata;
int j, k, drive;
GetCMOS(iptr); /* read 64 bytes of CMOS data */
printf("CMOS Diagnostics Status:\n");
j = (cmosdata.diagnostic >> 2);
for (k=0; k<6; k++)
{ printf("%-7s: %s\n",diag[k],status[(j & 1)]);
j >>= 1;
}
printf("\nCMOS Equipment Information:\n");
printf("Display: %s\n",display[(cmosdata.equipment >> 4) & 3]);
printf(" Coproc: %s\n",math[(cmosdata.equipment & 2)]);
drive = 'A';
j = (cmosdata.equipment & 1) * (1 + (cmosdata.equipment >> 6));
printf(" Floppy: %d\n",j);
if (j)
{ printf("Drive %c: %s\n",drive++,floppy[(cmosdata.diskettes >> 4)]);
printf("Drive %c: %s\n",drive++,floppy[(cmosdata.diskettes & 0x0f)]);
}
printf("Hard Dr: ");
if (cmosdata.harddrive) /* at least 1 hard drive */
{ printf("\n");
for (j=0; j<4; j++)
printf(" %s\n",hardtbl[j]);
j = (cmosdata.harddrive >> 4);
k = (cmosdata.harddrive & 0x0f);
if (j == 15) j = (cmosdata.drivec);
if (k == 15) k = (cmosdata.drived);
printf("Drive %c: %s\n",drive++,harddisk[j]);
printf("Drive %c: %s\n",drive,harddisk[k]);
printf(" └──────┴──────────┴───────┴──────┴──────┴─────────┴──────┘\n");
}
else printf("None\n");
iptr = (char *)&cmosdata;
printf("\nHex Dump of CMOS RAM:\n");
for (j=0,k=0;j<64;j++)
{ printf("%02x ",*iptr++);
k++;
if (k == 16)
{ k = 0;
printf("\n");
}
}
}
main()
{
ReadCMOS();
}