home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / at / viewcmos.arc / VIEWCMOS.C next >
Text File  |  1989-12-31  |  20KB  |  381 lines

  1. /* ---------------------------------------------------------------------
  2.    C code for reading contents of CMOS setup registers.  This code uses
  3.    information supplied by James McDaniel, CIS 74365,1716 for his
  4.    CMOSRA.ARC file (CompuServ).  Code and information is provided for
  5.    use "as-is" and is not guaranteed to be completely correct. Some
  6.    update performed on this data.
  7.  
  8.    BASIC THEORY: CMOS data is accessible via I/O ports 70 and 71 HEX. 
  9.    First send address to I/O port 70 and then read data from I/O port
  10.    71.  See data sheet on MC14818 for more info on commands and their
  11.    use.  A breakdown of memory locations and their use follows.
  12.  
  13.    This C code organizes the CMOS data as a data structure, as follows.
  14.    --------------------------------------------------------------------- */
  15. #include <stdio.h>
  16. #include <dos.h>
  17.  
  18. typedef struct
  19. {    char    seconds;    /* AT Real Time Clock (RTC): Seconds */
  20.     char    secalrm;    /* AT RTC: Seconds Alarm */
  21.     char    minutes;    /* AT RTC: Minutes */
  22.     char    minalrm;    /* AT RTC: Minutes Alarm */
  23.     char    hours;        /* AT RTC: Hours */
  24.     char    hrsalrm;    /* AT RTC: Hours Alarm */
  25.     char    dayofweek;    /* AT RTC: day of week */
  26.     char    dayofmon;    /* AT RTC: day of month */
  27.     char    month;        /* AT RTC: month */
  28.     char    year;        /* AT RTC: year */
  29.     char    aregister;    /* STATUS REGISTER A */
  30.     char    bregister;    /* STATUS REGISTER B */
  31.     char    cregister;    /* STATUS REGISTER C */
  32.     char    dregister;    /* STATUS REGISTER D */
  33.     char    diagnostic;    /* Diagnostics status byte */
  34.     char    shutdown;    /* Shutdown status byte */
  35.     char    diskettes;    /* A & B diskette types */
  36.     char    reserved1;    /* undefined */
  37.     char    harddrive;    /* C & D hard drive types */
  38.     char    reserved2;    /* undefined */
  39.     char    equipment;    /* equipment byte */
  40.     char    lowbyte;    /* low byte of base memory */
  41.     char    highbyte;    /* high byte of base memory */
  42.                 /* 100h = 256k, 200h = 512k, 280h = 640k */
  43.     char    extlow;        /* low byte of extended memory */
  44.     char    exthigh;    /* high byte of extended memory */
  45.                 /* 200h=512k;400h=1024k;etc to 3c00h=15360k */
  46.     char    drivec;        /* more data on drive c */
  47.     char    drived;        /* more data on drive d */
  48.     char    reserved[19];    /* reserved */
  49.     unsigned checksum;
  50.     char    extlow1;    /* same as extlow */
  51.     char    exthigh1;    /* same as exthigh */
  52.     char    century;    /* binary coded decimal value for century */
  53.                 /* 19h = 1900 for example */
  54.     char    infoflag;    /* bit 7 set = top 128k installed */
  55.     char    info[12];    
  56. } CMOS, *CMOSPTR;
  57.  
  58. /* -------------------------------------------------------------------------
  59.                       AT REAL TIME CLOCK STATUS REGISTER A
  60. ===========================================================================
  61. 7 6 5 4 3 2 1 0   FUNCTION               ALLOWABLE VALUES
  62. ---------------------------------------------------------------------------
  63. X                 UPDATE IN PROGRESS    1=DATE/TIME BEING UPDATED 0=NOT
  64.   X X X           22 STAGE DIVIDER      DEFAULT=010, 32.768 KHZ TIME BASE
  65.         X X X X   RATE SELECTION        DEFAULT=0110, 1.024 KHZ FREQUENCY
  66. ===========================================================================
  67.                   AT REAL TIME CLOCK STATUS REGISTERS B
  68. ===========================================================================
  69. 7 6 5 4 3 2 1 0   NAME                ALLOWABLE VALUES
  70. --------------------------------------------------------------------------
  71. X                 SET, 1 PER SECOND   0=UPDATE NORMALLY, 1=ABORT UPDATE
  72.   X               PERIODIC INT ENABLE 0=DISABLE INT (DEFAULT), 1=ENABLED
  73.     X             ALARM INT ENABLE    0=DISABLED (DEFAULT), 1=ENABLED
  74.       X           UPDATE END INT ENA. 0=DISABLED (DEFAULT), 1=ENABLED
  75.         X         SQUARE WAVE ENABLE  0=DIS (DEF), 1=ENA, PER REG A 0-3
  76.           X       DATE MODE           0=BCD (DEFAULT), 1=BINARY
  77.             X     24/12 MODE          0=12 HOUR, 1=24 HOUR FORMAT (DEFAULT)
  78.               X   DAYLIGHT SAVING ENA 0=DISABLED (DEFAULT), 1=ENABLED
  79. ===========================================================================
  80.                   AT REAL TIME CLOCK STATUS REGISTER C
  81. ===========================================================================
  82. 7 6 5 4 3 2 1 0   NAME                ALLOWABLE VALUES
  83. -------------------------------------------------------------------------
  84. X                 IRQF FLAG           READ ONLY
  85.   X               PF FLAG             READ ONLY
  86.     X             AF FLAG             READ ONLY
  87.       X           UF FLAG             READ ONLY
  88.         X X X X   RESERVED            SHOULD ALWAYS BE ZERO
  89. ===========================================================================
  90.                   AT CMOS STATUS REGISTER D
  91. ===========================================================================
  92. 7 6 5 4 3 2 1 0   NAME                ALLOWABLE VALUES                   
  93. --------------------------------------------------------------------------
  94. X                 VALID RAM BIT       0=BATT DEAD,RAM INVALID, 1=BATT GOOD
  95.   X X X X X X X   RESERVED            SHOULD ALWAYS BE ZERO
  96. ===========================================================================
  97.                   AT CMOS DIAGNOSTICS BYTE
  98. ===========================================================================
  99. 7 6 5 4 3 2 1 0   NAME                ALLOWABLE VALUES
  100. ------------------------------------------------------------------------
  101. X                 POWER STAT OF RTC   1=CHIP HAS LOST POWER, 0=NOT
  102.   X               CHECKSUM STATUS     0=CHECKSUM OK, 1=NOT OK
  103.     X             CONFIGURATION INFO  0=VALID INFO, 1=NOT VALID
  104.       X           MEMORY SIZE COMPARE 0=SAME SIZE, 1=NOT SAME SIZE
  105.         X         FIXED DISK STATUS   0=OK, 1=DRIVE OR ADAPTER FAILED
  106.           X       TIME STATUS         0=TIME IS OK, 1=TIME NOT OK
  107.             X X   RESERVED
  108. ===========================================================================
  109.                   AT CMOS DRIVE TYPE BYTE
  110. ===========================================================================
  111. 7 6 5 4 3 2 1 0   FUNCTION            ALLOWABLE VALUES
  112. -------------------------------------------------------------------------
  113. X X X X           TYPE OF FIRST DRIVE 0000=NO DRIVE,   0001=360K 5.25"
  114.                                       0010=1.2M 5.25"  0011=720K 3.5"
  115.                                       0100=1.44M 3.5" 
  116.  
  117.         X X X X   TYPE OF SECOND DRIVE
  118. ===========================================================================
  119.                    AT CMOS FIXED DRIVE TYPES
  120. ===========================================================================
  121. 7 6 5 4 3 2 1 0    NAME               ALLOWABLE VALUES
  122. ----------------------------------------------------------------------------
  123. X X X X            FIXED DISK C TYPE  0000=NO DRIVE 1H TO 0EH SEE CHART
  124.         X X X X    FIXED DISK D TYPE  0000=NO DRIVE 1H TO 0EH SEE CHART
  125.                    IF BYTE= 0FH THEN SEE EXTENDED BYTE FOR DRIVE TYPE
  126. ===========================================================================
  127.                    AT CMOS EQUIPMENT BYTE
  128. ===========================================================================
  129. 7 6 5 4 3 2 1 0    NAME                  ALLOWABLE VALUES
  130. -----------------------------------------------------------------------------
  131. X X                NUMBER OF DISK DRIVES 00=1,01=2,10=3,11=4
  132.     X X            PRIMARY DISPLAY TYPE  00=DISPLAY HAS BIOS or EGA,
  133.                                          01=40 COL CGA,
  134.                                          10=80 COL CGA, 
  135.                                          11=MDA,
  136.                                          101=EGA
  137.         X X        NOT USED
  138.             X      MATH COPROCESSOR      0=NOT INSTALLED, 1=INSTALLED
  139.               X    DISK DRIVES AVAILABLE 0=NO DRIVES, 1=DISK DRIVES AVAILABLE
  140. ===========================================================================
  141.            AT CMOS DRIVE C AND D EXTENDED DRIVE TYPE BYTES
  142. ===========================================================================
  143. 7 6 5 4 3 2 1 0    NAME                  ALLOWABLE VALUES
  144. -----------------------------------------------------------------------------
  145. X X X X X X X X    DRIVE C TYPE BYTE     SEE NEXT CHART FOR TYPES
  146. X X X X X X X X    DRIVE D TYPE BYTE     SEE NEXT CHART FOR TYPES
  147.  
  148.                    IF FIXED DRIVE 4 BITS FOR C IS 0-0EH IGNOR EXTENDED C
  149.                    IF FIXED DRIVE 4 BITS FOR D IS 0-0EH IGNOR EXTENDED D
  150.  
  151.                         AT HARD DISK TYPES
  152.  
  153.     +--------------------------------------------------------+
  154.     |      |          |       |      |      |         |      |
  155.     | DISK | CYLINDER | TOTAL | PRE- | LAND | SECTORS | SIZE |
  156.     | TYPE |  COUNT   | HEADS | COMP | ZONE | PER/TRK |  MB  |
  157.     |------+----------+-------+------+------+---------+------|
  158.     |   1  |    306   |    4  |  128 |  305 |   17    | 10.1 |
  159.     |------+----------+-------+------+------+---------+------|
  160.     |   2  |    615   |    4  |  300 |  615 |   17    | 20.4 |
  161.     |------+----------+-------+------+------+---------+------|
  162.     |   3  |    615   |    6  |  300 |  615 |   17    | 30.6 |
  163.     |------+----------+-------+------+------+---------+------|
  164.     |   4  |    940   |    8  |  512 |  940 |   17    | 62.4 |
  165.     |------+----------+-------+------+------+---------+------|
  166.     |   5  |    940   |    6  |  512 |  940 |   17    | 46.8 |
  167.     |------+----------+-------+------+------+---------+------|
  168.     |   6  |    615   |    4  | NONE |  615 |   17    | 20.4 |
  169.     |------+----------+-------+------+------+---------+------|
  170.     |   7  |    462   |    8  |  256 |  511 |   17    | 30.6 |
  171.     |------+----------+-------+------+------+---------+------|
  172.     |   8  |    733   |    5  | NONE |  733 |   17    | 30.4 |
  173.     |------+----------+-------+------+------+---------+------|
  174.     |   9  |    900   |   15  | NONE |  901 |   17    |112.0 |
  175.     |------+----------+-------+------+------+---------+------|
  176.     |  10  |    820   |    3  | NONE |  820 |   17    | 20.4 |
  177.     |------+----------+-------+------+------+---------+------|
  178.     |  11  |    855   |    5  | NONE |  855 |   17    | 35.4 |
  179.     |------+----------+-------+------+------+---------+------|
  180.     |  12  |    855   |    7  | NONE |  855 |   17    | 49.6 |
  181.     |------+----------+-------+------+------+---------+------|
  182.     |  13  |    306   |    8  |  128 |  319 |   17    | 20.3 |
  183.     |------+----------+-------+------+------+---------+------|
  184.     |  14  |    733   |    7  | NONE |  733 |   17    | 42.5 |
  185.     |------+----------+-------+------+------+---------+------|
  186.     |  16  |    612   |    4  |    0 |  663 |   17    | 20.5 |
  187.     |------+----------+-------+------+------+---------+------|
  188.     |  17  |    977   |    5  |  300 |  977 |   17    | 40.5 |
  189.     |------+----------+-------+------+------+---------+------|
  190.     |  18  |    977   |    7  | NONE |  977 |   17    | 56.7 |
  191.     |------+----------+-------+------+------+---------+------|
  192.     |  19  |   1024   |    7  |  512 | 1023 |   17    | 59.5 |
  193.     |------+----------+-------+------+------+---------+------|
  194.     |  20  |    733   |    5  |  300 |  732 |   17    | 30.4 |
  195.     |------+----------+-------+------+------+---------+------|
  196.     |  21  |    733   |    7  |  300 |  732 |   17    | 42.5 |
  197.     |------+----------+-------+------+------+---------+------|
  198.     |  22  |    733   |    5  |  300 |  733 |   17    | 30.4 |
  199.     |------+----------+-------+------+------+---------+------|
  200.     |  23  |    306   |    4  |    0 |  336 |   17    | 10.1 |
  201.     |------+----------+-------+------+------+---------+------|
  202.     |  25  |    615   |    4  |    0 |  615 |   17    | 20.4 |
  203.     |------+----------+-------+------+------+---------+------|
  204.     |  26  |   1024   |    4  | NONE | 1023 |   17    | 34.0 |
  205.     |------+----------+-------+------+------+---------+------|
  206.     |  27  |   1024   |    5  | NONE | 1023 |   17    | 42.5 |
  207.     |------+----------+-------+------+------+---------+------|
  208.     |  28  |   1024   |    8  | NONE | 1023 |   17    | 68.0 |
  209.     |------+----------+-------+------+------+---------+------|
  210.     |  29  |    512   |    8  |  256 |  512 |   17    | 34.0 |
  211.     |------+----------+-------+------+------+---------+------|
  212.     |  30  |    615   |    2  |  615 |  615 |   17    | 10.2 |
  213.     |------+----------+-------+------+------+---------+------|
  214.     |  31  |    989   |    5  |    0 |  989 |   17    | 41.0 |
  215.     |------+----------+-------+------+------+---------+------|
  216.     |  32  |   1020   |   15  | NONE | 1024 |   17    |127.0 |
  217.     |------+----------+-------+------+------+---------+------|
  218.     |  35  |   1024   |    9  | 1024 | 1024 |   17    | 76.5 |
  219.     |------+----------+-------+------+------+---------+------|
  220.     |  36  |   1024   |    5  |  512 | 1024 |   17    | 42.5 |
  221.     |------+----------+-------+------+------+---------+------|
  222.     |  37  |    830   |   10  | NONE |  830 |   17    | 68.8 |
  223.     |------+----------+-------+------+------+---------+------|
  224.     |  38  |    823   |   10  |  256 |  824 |   17    | 68.3 |
  225.     |------+----------+-------+------+------+---------+------|
  226.     |  39  |    615   |    4  |  128 |  664 |   17    | 20.4 |
  227.     |------+----------+-------+------+------+---------+------|
  228.     |  40  |    615   |    8  |  128 |  664 |   17    | 40.8 |
  229.     |------+----------+-------+------+------+---------+------|
  230.     |  41  |    917   |   15  | NONE |  918 |   17    |114.1 |
  231.     |------+----------+-------+------+------+---------+------|
  232.     |  42  |   1023   |   15  | NONE | 1024 |   17    |127.3 |
  233.     |------+----------+-------+------+------+---------+------|
  234.     |  43  |    823   |   10  |  512 |  823 |   17    | 68.3 |
  235.     |------+----------+-------+------+------+---------+------|
  236.     |  44  |    820   |    6  | NONE |  820 |   17    | 40.8 |
  237.     |------+----------+-------+------+------+---------+------|
  238.     |  45  |   1024   |    8  | NONE | 1024 |   17    | 68.0 |
  239.     |------+----------+-------+------+------+---------+------|
  240.     |  46  |    925   |    9  | NONE |  925 |   17    | 69.1 |
  241.     |------+----------+-------+------+------+---------+------|
  242.     |  47  |    699   |    7  |  256 |  700 |   17    | 40.6 |
  243.     +--------------------------------------------------------+
  244.   --------------------------------------------------------------------- */
  245. #define    CMOS_ADDR    0x70        /* address port of CMOS */
  246. #define    CMOS_DATA    0x71        /* data port for CMOS */
  247.  
  248. void GetCMOS(char *cmosdata)        /* read CMOS data (64 bytes) */
  249. {
  250. unsigned char j, byte;
  251.     for (j=0; j<64; j++)
  252.     {    disable();            /* disable interrupts */
  253.         outportb(CMOS_ADDR,j);        /* specify byte to get */
  254.         byte= inportb(CMOS_DATA);    /* get data */
  255.         enable();            /* enable interrupts */
  256.         *cmosdata++ = byte;        /* save CMOS data */
  257.     }
  258. }
  259.  
  260. void ReadCMOS(void)
  261. {
  262. static char *floppy[]     = {    "None", 
  263.                 "360K 5.25-inch", 
  264.                 "1.2M 5.25-inch", 
  265.                 "720K 3.5-inch",
  266.                 "1.44M 3.5-inch"
  267.             };
  268. static char *display[]     = {    "EGA",            /* 00 */
  269.                 "40 column CGA",    /* 01 */
  270.                 "80 column CGA",    /* 10 */
  271.                 "MDA",            /* 11 */
  272.             };
  273. static    char *math[]     = {    "Not Installed",
  274.                 "Installed"
  275.             };
  276. static     char *diag[]     = {    "Time","Hard Dr","Memory","CnfInfo","Chksum","PwrOK"};
  277. static    char *status[]    = {    "OK","Not OK" };
  278. static    char *hardtbl[] = {
  279.         "┌──────┬──────────┬───────┬──────┬──────┬─────────┬──────┐",
  280.         "│Drive │ Cylinder │ Heads/│ Pre- │ Land │ Sectors │ Size │",
  281.         "│ Type │ (Tracks) │ Sides │ Comp │ Zone │ Per Trk │ (MB) │",
  282.         "│──────┼──────────┼───────┼──────┼──────┼─────────┼──────│"};
  283.  
  284. static    char *harddisk[] = 
  285.     {    "│ None │    ---   │  --   │  --- │  --- │   --    │ ---- │",
  286.         "│   1  │    306   │    4  │  128 │  305 │   17    │ 10.1 │",
  287.         "│   2  │    615   │    4  │  300 │  615 │   17    │ 20.4 │",
  288.         "│   3  │    615   │    6  │  300 │  615 │   17    │ 30.6 │",
  289.         "│   4  │    940   │    8  │  512 │  940 │   17    │ 62.4 │",
  290.         "│   5  │    940   │    6  │  512 │  940 │   17    │ 46.8 │",
  291.         "│   6  │    615   │    4  │ NONE │  615 │   17    │ 20.4 │",
  292.         "│   7  │    462   │    8  │  256 │  511 │   17    │ 30.6 │",
  293.         "│   8  │    733   │    5  │ NONE │  733 │   17    │ 30.4 │",
  294.         "│   9  │    900   │   15  │ NONE │  901 │   17    │112.0 │",
  295.         "│  10  │    820   │    3  │ NONE │  820 │   17    │ 20.4 │",
  296.         "│  11  │    855   │    5  │ NONE │  855 │   17    │ 35.4 │",
  297.         "│  12  │    855   │    7  │ NONE │  855 │   17    │ 49.6 │",
  298.         "│  13  │    306   │    8  │  128 │  319 │   17    │ 20.3 │",
  299.         "│  14  │    733   │    7  │ NONE │  733 │   17    │ 42.5 │",
  300.         "│  16  │    612   │    4  │    0 │  663 │   17    │ 20.5 │",
  301.         "│  17  │    977   │    5  │  300 │  977 │   17    │ 40.5 │",
  302.         "│  18  │    977   │    7  │ NONE │  977 │   17    │ 56.7 │",
  303.         "│  19  │   1024   │    7  │  512 │ 1023 │   17    │ 59.5 │",
  304.         "│  20  │    733   │    5  │  300 │  732 │   17    │ 30.4 │",
  305.         "│  21  │    733   │    7  │  300 │  732 │   17    │ 42.5 │",
  306.         "│  22  │    733   │    5  │  300 │  733 │   17    │ 30.4 │",
  307.         "│  23  │    306   │    4  │    0 │  336 │   17    │ 10.1 │",
  308.         "│  25  │    615   │    4  │    0 │  615 │   17    │ 20.4 │",
  309.         "│  26  │   1024   │    4  │ NONE │ 1023 │   17    │ 34.0 │",
  310.         "│  27  │   1024   │    5  │ NONE │ 1023 │   17    │ 42.5 │",
  311.         "│  28  │   1024   │    8  │ NONE │ 1023 │   17    │ 68.0 │",
  312.         "│  29  │    512   │    8  │  256 │  512 │   17    │ 34.0 │",
  313.         "│  30  │    615   │    2  │  615 │  615 │   17    │ 10.2 │",
  314.         "│  31  │    989   │    5  │    0 │  989 │   17    │ 41.0 │",
  315.         "│  32  │   1020   │   15  │ NONE │ 1024 │   17    │127.0 │",
  316.         "│  35  │   1024   │    9  │ 1024 │ 1024 │   17    │ 76.5 │",
  317.         "│  36  │   1024   │    5  │  512 │ 1024 │   17    │ 42.5 │",
  318.         "│  37  │    830   │   10  │ NONE │  830 │   17    │ 68.8 │",
  319.         "│  38  │    823   │   10  │  256 │  824 │   17    │ 68.3 │",
  320.         "│  39  │    615   │    4  │  128 │  664 │   17    │ 20.4 │",
  321.         "│  40  │    615   │    8  │  128 │  664 │   17    │ 40.8 │",
  322.         "│  41  │    917   │   15  │ NONE │  918 │   17    │114.1 │",
  323.         "│  42  │   1023   │   15  │ NONE │ 1024 │   17    │127.3 │",
  324.         "│  43  │    823   │   10  │  512 │  823 │   17    │ 68.3 │",
  325.         "│  44  │    820   │    6  │ NONE │  820 │   17    │ 40.8 │",
  326.         "│  45  │   1024   │    8  │ NONE │ 1024 │   17    │ 68.0 │",
  327.         "│  46  │    925   │    9  │ NONE │  925 │   17    │ 69.1 │",
  328.         "│  47  │    699   │    7  │  256 │  700 │   17    │ 40.6 │"};
  329. CMOS    cmosdata;
  330. char    *iptr = (char *)&cmosdata;
  331. int    j, k, drive;
  332.  
  333.     GetCMOS(iptr);            /* read 64 bytes of CMOS data */
  334.     printf("CMOS Diagnostics Status:\n");
  335.     j = (cmosdata.diagnostic >> 2);
  336.     for (k=0; k<6; k++)
  337.     {    printf("%-7s: %s\n",diag[k],status[(j & 1)]);
  338.         j >>= 1;
  339.     }
  340.     printf("\nCMOS Equipment Information:\n");
  341.     printf("Display: %s\n",display[(cmosdata.equipment >> 4) & 3]);
  342.     printf(" Coproc: %s\n",math[(cmosdata.equipment & 2)]);
  343.     drive = 'A';
  344.     j = (cmosdata.equipment & 1) * (1 + (cmosdata.equipment >> 6));
  345.     printf(" Floppy: %d\n",j);
  346.     if (j)
  347.     {    printf("Drive %c: %s\n",drive++,floppy[(cmosdata.diskettes >> 4)]);
  348.         printf("Drive %c: %s\n",drive++,floppy[(cmosdata.diskettes & 0x0f)]);
  349.     }
  350.     printf("Hard Dr: ");
  351.     if (cmosdata.harddrive)            /* at least 1 hard drive */
  352.     {       printf("\n");
  353.         for (j=0; j<4; j++)
  354.             printf("         %s\n",hardtbl[j]);
  355.         j = (cmosdata.harddrive >> 4);
  356.         k = (cmosdata.harddrive & 0x0f);
  357.         if (j == 15) j = (cmosdata.drivec);
  358.         if (k == 15) k = (cmosdata.drived);
  359.         printf("Drive %c: %s\n",drive++,harddisk[j]);
  360.         printf("Drive %c: %s\n",drive,harddisk[k]);
  361.         printf("         └──────┴──────────┴───────┴──────┴──────┴─────────┴──────┘\n");
  362.     }
  363.     else printf("None\n");
  364.  
  365.     iptr = (char *)&cmosdata;
  366.     printf("\nHex Dump of CMOS RAM:\n");
  367.     for (j=0,k=0;j<64;j++)
  368.     {    printf("%02x ",*iptr++);
  369.         k++;
  370.         if (k == 16)
  371.         {    k = 0;
  372.             printf("\n");
  373.         }
  374.     }
  375. }
  376.  
  377. main()
  378. {
  379.     ReadCMOS();
  380. }
  381.