416 lines
8.9 KiB
C
416 lines
8.9 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
jztime.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the code to set the Jazz time.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David M. Robinson (davidro) 25-Oct-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include "jzsetup.h"
|
|||
|
|
|||
|
//
|
|||
|
// Static Data
|
|||
|
//
|
|||
|
|
|||
|
PVOID JzEisaControlBase;
|
|||
|
PVOID JzRealTimeClockBase;
|
|||
|
ULONG LastTime = 0;
|
|||
|
|
|||
|
|
|||
|
UCHAR
|
|||
|
JzReadClockRegister (
|
|||
|
UCHAR Register
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine reads the specified realtime clock register.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Register - Supplies the number of the register whose value is read.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The value of the register is returned as the function value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
UCHAR DataByte;
|
|||
|
|
|||
|
//
|
|||
|
// Read the EISA NMI enable register, insert the realtime clock register
|
|||
|
// number, and write the value back to the EISA NMI enable register. This
|
|||
|
// selects the realtime clock register that is read.
|
|||
|
//
|
|||
|
|
|||
|
DataByte = READ_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI);
|
|||
|
DataByte = (DataByte & 0x80) | Register;
|
|||
|
WRITE_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI, DataByte);
|
|||
|
|
|||
|
//
|
|||
|
// Read the realtime clock register value.
|
|||
|
//
|
|||
|
|
|||
|
DataByte = READ_REGISTER_UCHAR((PUCHAR)JzRealTimeClockBase);
|
|||
|
return DataByte;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
JzWriteClockRegister (
|
|||
|
UCHAR Register,
|
|||
|
UCHAR Value
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine writes the specified value to the specified realtime
|
|||
|
clock register.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Register - Supplies the number of the register whose value is written.
|
|||
|
|
|||
|
Value - Supplies the value that is written to the specified register.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The value of the register is returned as the function value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
UCHAR DataByte;
|
|||
|
|
|||
|
//
|
|||
|
// Read the EISA NMI enable register, insert the realtime clock register
|
|||
|
// number, and write the value back to the EISA NMI enable register. This
|
|||
|
// selects the realtime clock register that is written.
|
|||
|
//
|
|||
|
|
|||
|
DataByte = READ_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI);
|
|||
|
DataByte = (DataByte & 0x80) | Register;
|
|||
|
WRITE_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI, DataByte);
|
|||
|
|
|||
|
//
|
|||
|
// Write the realtime clock register value.
|
|||
|
//
|
|||
|
|
|||
|
WRITE_REGISTER_UCHAR((PUCHAR)JzRealTimeClockBase, Value);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
JzWriteTime (
|
|||
|
IN PTIME_FIELDS TimeFields
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine sets the realtime clock.
|
|||
|
|
|||
|
N.B. This routine assumes that the caller has provided any required
|
|||
|
synchronization to set the realtime clock information.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
TimeFields - Supplies a pointer to a time structure that specifies the
|
|||
|
realtime clock information.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
If the power to the realtime clock has not failed, then the time
|
|||
|
values are written to the realtime clock and a value of TRUE is
|
|||
|
returned. Otherwise, a value of FALSE is returned.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
UCHAR DataByte;
|
|||
|
|
|||
|
//
|
|||
|
// If the realtime clock battery is still functioning, then write
|
|||
|
// the realtime clock values, and return a function value of TRUE.
|
|||
|
// Otherwise, return a function value of FALSE.
|
|||
|
//
|
|||
|
|
|||
|
DataByte = JzReadClockRegister(RTC_CONTROL_REGISTERD);
|
|||
|
if (((PRTC_CONTROL_REGISTER_D)(&DataByte))->ValidTime == 1) {
|
|||
|
|
|||
|
//
|
|||
|
// Set the realtime clock control to set the time.
|
|||
|
//
|
|||
|
|
|||
|
DataByte = 0;
|
|||
|
((PRTC_CONTROL_REGISTER_B)(&DataByte))->HoursFormat = 1;
|
|||
|
((PRTC_CONTROL_REGISTER_B)(&DataByte))->DataMode = 1;
|
|||
|
((PRTC_CONTROL_REGISTER_B)(&DataByte))->SetTime = 1;
|
|||
|
JzWriteClockRegister(RTC_CONTROL_REGISTERB, DataByte);
|
|||
|
|
|||
|
//
|
|||
|
// Write the realtime clock values.
|
|||
|
//
|
|||
|
|
|||
|
JzWriteClockRegister(RTC_YEAR, (UCHAR)(TimeFields->Year - 1980));
|
|||
|
JzWriteClockRegister(RTC_MONTH, (UCHAR)TimeFields->Month);
|
|||
|
JzWriteClockRegister(RTC_DAY_OF_MONTH, (UCHAR)TimeFields->Day);
|
|||
|
JzWriteClockRegister(RTC_DAY_OF_WEEK, (UCHAR)(TimeFields->Weekday + 1));
|
|||
|
JzWriteClockRegister(RTC_HOUR, (UCHAR)TimeFields->Hour);
|
|||
|
JzWriteClockRegister(RTC_MINUTE, (UCHAR)TimeFields->Minute);
|
|||
|
JzWriteClockRegister(RTC_SECOND, (UCHAR)TimeFields->Second);
|
|||
|
|
|||
|
//
|
|||
|
// Set the realtime clock control to update the time.
|
|||
|
//
|
|||
|
|
|||
|
((PRTC_CONTROL_REGISTER_B)(&DataByte))->SetTime = 0;
|
|||
|
JzWriteClockRegister(RTC_CONTROL_REGISTERB, DataByte);
|
|||
|
return;
|
|||
|
|
|||
|
} else {
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
JzSetTime (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
UCHAR Character;
|
|||
|
ULONG Count;
|
|||
|
PTIME_FIELDS TimeFields;
|
|||
|
TIME Time;
|
|||
|
CHAR TimeString[80];
|
|||
|
CHAR DateString[80];
|
|||
|
PCHAR StartToken;
|
|||
|
PCHAR EndToken;
|
|||
|
GETSTRING_ACTION Action;
|
|||
|
|
|||
|
//
|
|||
|
// Set addresses for RTC access.
|
|||
|
//
|
|||
|
|
|||
|
JzEisaControlBase = (PVOID)EISA_IO_VIRTUAL_BASE;
|
|||
|
JzRealTimeClockBase = (PVOID)RTC_VIRTUAL_BASE;
|
|||
|
|
|||
|
JzSetPosition( 3, 5);
|
|||
|
JzPrint(JZ_ENTER_DATE_MSG);
|
|||
|
do {
|
|||
|
Action = FwGetString( DateString,
|
|||
|
sizeof(DateString),
|
|||
|
NULL,
|
|||
|
3,
|
|||
|
5 + strlen(JZ_ENTER_DATE_MSG));
|
|||
|
if (Action == GetStringEscape) {
|
|||
|
return;
|
|||
|
}
|
|||
|
} while ( Action != GetStringSuccess );
|
|||
|
|
|||
|
JzSetPosition( 4, 5);
|
|||
|
JzPrint(JZ_ENTER_TIME_MSG);
|
|||
|
do {
|
|||
|
Action = FwGetString( TimeString,
|
|||
|
sizeof(TimeString),
|
|||
|
NULL,
|
|||
|
4,
|
|||
|
5 + strlen(JZ_ENTER_TIME_MSG));
|
|||
|
if (Action == GetStringEscape) {
|
|||
|
return;
|
|||
|
}
|
|||
|
} while ( Action != GetStringSuccess );
|
|||
|
|
|||
|
//
|
|||
|
// Get time
|
|||
|
//
|
|||
|
|
|||
|
TimeFields = ArcGetTime();
|
|||
|
|
|||
|
StartToken = DateString;
|
|||
|
if (*StartToken != 0) {
|
|||
|
EndToken = strchr(StartToken, '-');
|
|||
|
if (EndToken != NULL) {
|
|||
|
*EndToken = 0;
|
|||
|
TimeFields->Month = atoi(StartToken);
|
|||
|
StartToken = EndToken + 1;
|
|||
|
}
|
|||
|
|
|||
|
EndToken = strchr(StartToken, '-');
|
|||
|
if (EndToken != NULL) {
|
|||
|
*EndToken = 0;
|
|||
|
TimeFields->Day = atoi(StartToken);
|
|||
|
StartToken = EndToken + 1;
|
|||
|
TimeFields->Year = atoi(StartToken);
|
|||
|
if (TimeFields->Year < 100) {
|
|||
|
if (TimeFields->Year < 80) {
|
|||
|
TimeFields->Year += 2000;
|
|||
|
} else {
|
|||
|
TimeFields->Year += 1900;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
StartToken = TimeString;
|
|||
|
if (*StartToken != 0) {
|
|||
|
EndToken = strchr(StartToken, ':');
|
|||
|
|
|||
|
if (EndToken != NULL) {
|
|||
|
*EndToken = 0;
|
|||
|
TimeFields->Hour = atoi(StartToken);
|
|||
|
StartToken = EndToken + 1;
|
|||
|
}
|
|||
|
|
|||
|
EndToken = strchr(StartToken, ':');
|
|||
|
if (EndToken != NULL) {
|
|||
|
*EndToken = 0;
|
|||
|
TimeFields->Minute = atoi(StartToken);
|
|||
|
StartToken = EndToken + 1;
|
|||
|
TimeFields->Second = atoi(StartToken);
|
|||
|
} else {
|
|||
|
TimeFields->Minute = atoi(StartToken);
|
|||
|
TimeFields->Second = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (!RtlTimeFieldsToTime(TimeFields, &Time)) {
|
|||
|
JzSetPosition( 5, 5);
|
|||
|
JzPrint(JZ_ILLEGAL_TIME_MSG);
|
|||
|
JzPrint(JZ_PRESS_KEY2_MSG);
|
|||
|
ArcRead(ARC_CONSOLE_INPUT, &Character, 1, &Count);
|
|||
|
} else {
|
|||
|
RtlTimeToTimeFields( &Time, TimeFields);
|
|||
|
JzWriteTime(TimeFields);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
JzShowTime (
|
|||
|
BOOLEAN First
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
First - If TRUE then don't check LastTime.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PTIME_FIELDS TimeFields;
|
|||
|
TIME Time;
|
|||
|
BOOLEAN Pm;
|
|||
|
ULONG ThisTime;
|
|||
|
|
|||
|
//
|
|||
|
// Set addresses for RTC access.
|
|||
|
//
|
|||
|
|
|||
|
JzEisaControlBase = (PVOID)EISA_IO_VIRTUAL_BASE;
|
|||
|
JzRealTimeClockBase = (PVOID)RTC_VIRTUAL_BASE;
|
|||
|
|
|||
|
//
|
|||
|
// See if the time has changed since last time we were called. This is
|
|||
|
// for when the display is over the serial port, so we don't blast
|
|||
|
// characters out all the time.
|
|||
|
//
|
|||
|
|
|||
|
ThisTime = ArcGetRelativeTime();
|
|||
|
if (!First && (ThisTime == LastTime)) {
|
|||
|
|
|||
|
//
|
|||
|
// Stall to get rid of the "whistle" on Jazz.
|
|||
|
//
|
|||
|
|
|||
|
JzStallExecution(1000);
|
|||
|
return;
|
|||
|
}
|
|||
|
LastTime = ThisTime;
|
|||
|
|
|||
|
//
|
|||
|
// Get and display time.
|
|||
|
//
|
|||
|
|
|||
|
TimeFields = ArcGetTime();
|
|||
|
|
|||
|
JzSetPosition( 0, 44);
|
|||
|
JzPrint("%s, ", Weekday[TimeFields->Weekday]);
|
|||
|
JzPrint("%d-", TimeFields->Month);
|
|||
|
JzPrint("%d-", TimeFields->Day);
|
|||
|
JzPrint("%d ", TimeFields->Year);
|
|||
|
|
|||
|
if (TimeFields->Hour >= 12) {
|
|||
|
Pm = TRUE;
|
|||
|
} else {
|
|||
|
Pm = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (TimeFields->Hour > 12) {
|
|||
|
TimeFields->Hour -= 12;
|
|||
|
} else if (TimeFields->Hour == 0) {
|
|||
|
TimeFields->Hour = 12;
|
|||
|
}
|
|||
|
|
|||
|
JzPrint("%d:", TimeFields->Hour);
|
|||
|
JzPrint("%02d:", TimeFields->Minute);
|
|||
|
JzPrint("%02d ", TimeFields->Second);
|
|||
|
if (Pm) {
|
|||
|
JzPrint(JZ_PM);
|
|||
|
} else {
|
|||
|
JzPrint(JZ_AM);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Clear anything to the end of the line.
|
|||
|
//
|
|||
|
|
|||
|
JzPrint("%cK", ASCII_CSI);
|
|||
|
|
|||
|
return;
|
|||
|
|
|||
|
}
|