Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

194 lines
4.4 KiB

#include "insignia.h"
#include "host_def.h"
/* INSIGNIA MODULE SPECIFICATION
-----------------------------
MODULE NAME : Bios code for accessing the cmos
THIS PROGRAM SOURCE FILE IS SUPPLIED IN CONFIDENCE TO THE
CUSTOMER, THE CONTENTS OR DETAILS OF ITS OPERATION MAY
ONLY BE DISCLOSED TO PERSONS EMPLOYED BY THE CUSTOMER WHO
REQUIRE A KNOWLEDGE OF THE SOFTWARE CODING TO CARRY OUT
THEIR JOB. DISCLOSURE TO ANY OTHER PERSON MUST HAVE PRIOR
AUTHORISATION FROM THE DIRECTORS OF INSIGNIA SOLUTIONS INC.
DESIGNER : J.P.Box
DATE : September '88
PURPOSE : To provide routines to initialise and access the
CMOS
The Following Routines are defined:
1. set_tod
2. cmos_read
3. cmos_write
=========================================================================
AMENDMENTS :
=========================================================================
*/
/*
* static char SccsID[]="@(#)cmos_bios.c 1.7 08/25/93 Copyright Insignia Solutions Ltd.";
*/
#ifdef SEGMENTATION
/*
* The following #include specifies the code segment into which this
* module will by placed by the MPW C compiler on the Mac II running
* MultiFinder.
*/
#include "SOFTPC_CMOS.seg"
#endif
#include "xt.h"
#include "bios.h"
#include "sas.h"
#include "cmos.h"
#include "cmosbios.h"
#include "ios.h"
#include "rtc_bios.h"
#ifndef NTVDM
/*
=========================================================================
FUNCTION : set_tod
PURPOSE : Reads the time from the CMOS and sets the timer
data area in the BIOS
RETURNED STATUS : None
DESCRIPTION :
=======================================================================
*/
#define BCD_TO_BIN( n ) ((n & 0x0f) + (((n >> 4) & 0x0f) * 10))
void set_tod()
{
half_word value; /* time value read from CMOS */
DOUBLE_TIME timer_tics; /* time converted to ticks */
double_word tics_temp; /* prevent floating point code */
/* set data area to 0 in case of error return */
sas_storew(TIMER_LOW, 0);
sas_storew(TIMER_HIGH, 0);
sas_store(TIMER_OVFL, 0);
/* read seconds */
value = cmos_read( CMOS_SECONDS + NMI_DISABLE );
if( value > 0x59)
{
value = cmos_read( CMOS_DIAG + NMI_DISABLE );
cmos_write( CMOS_DIAG + NMI_DISABLE, (value | CMOS_CLK_FAIL) );
return;
}
tics_temp = BCD_TO_BIN( value ) * 73; /* was 18.25 */
tics_temp /= 4;
timer_tics.total = tics_temp;
/* read minutes */
value = cmos_read( CMOS_MINUTES + NMI_DISABLE );
if( value > 0x59)
{
value = cmos_read( CMOS_DIAG + NMI_DISABLE );
cmos_write( CMOS_DIAG + NMI_DISABLE, (value | CMOS_CLK_FAIL) );
return;
}
tics_temp = BCD_TO_BIN( value ) * 2185; /* was 1092.5 */
tics_temp /= 2;
timer_tics.total += tics_temp;
/* read hours */
value = cmos_read( CMOS_HOURS + NMI_DISABLE );
if( value > 0x23)
{
value = cmos_read( CMOS_DIAG + NMI_DISABLE );
cmos_write( CMOS_DIAG + NMI_DISABLE, (value | CMOS_CLK_FAIL) );
return;
}
timer_tics.total += BCD_TO_BIN( value ) * 65543L;
/* write total to bios data area */
sas_storew(TIMER_LOW, timer_tics.half.low);
sas_storew(TIMER_HIGH, timer_tics.half.high);
return;
}
#endif
/*
=========================================================================
FUNCTION : cmos_read
PURPOSE : Reads a byte from the cmos system clock configuration table
from the CMOS address specified
RETURNED STATUS : The value read from the CMOS
DESCRIPTION :
=======================================================================
*/
half_word cmos_read(table_address)
/* IN */
half_word table_address; /* cmos table address to be read */
{
half_word value; /* value read from cmos */
outb( CMOS_PORT, (table_address | NMI_DISABLE) );
inb( CMOS_DATA, &value );
/*
* Set bit 7 if it was previously set in table_address
*/
outb( CMOS_PORT, (CMOS_SHUT_DOWN | (table_address & NMI_DISABLE)) );
return ( value );
}
/*
=========================================================================
FUNCTION : cmos_read
PURPOSE : Writes a byte to the cmos system clock configuration table
at the CMOS address specified
RETURNED STATUS : none
DESCRIPTION :
=======================================================================
*/
void cmos_write(table_address, value)
/* IN */
half_word table_address, /* cmos table address to be written */
value; /* value to be written */
{
outb( CMOS_PORT, (table_address | NMI_DISABLE) );
outb( CMOS_DATA, value );
/*
* Set bit 7 if it was previously set in table_address
*/
outb( CMOS_PORT, (CMOS_SHUT_DOWN | (table_address & NMI_DISABLE)) );
return;
}