P8000/WEGA/src/uts/sys/timer.c

116 lines
2.4 KiB
C

/******************************************************************************
*******************************************************************************
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1988
KERN 3.2 Modul: timer.c
Bearbeiter: P. Hoge
Datum: 10.5.88
Version: 1.1
*******************************************************************************
Datum/Zeit des Uhrmoduls
Gueltig: 1.1.70 - 31.12.2037
*******************************************************************************
******************************************************************************/
static int dmsize[] = /* Tage/Monat (kumulierend) */
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
long
gettime()
{
register long time;
register d1, d2, d3;
register i;
time = 0;
if (inb(0xfef1) != 0xbf) /* Uhrmodul vorhanden ? */
return(time);
outvalue(0x02); /* Umschalten auf Datum */
d1 = rdvalue(0xfef5); /* Jahr */
d2 = rdvalue(0xfef9); /* Tag */
d3 = rdvalue(0xfefd); /* Monat */
outvalue(0x00);
if (d1 > 100 || d2 > 31 || d3 > 12)
return(time);
i = dmsize[d3-1];
if (d1%4 == 0 && d3 > 2) i++;
if (d1 < 70) d1 += 100;
if (d1 > 137) return(time);
time = (d1-69)/4;
time += 365*(d1-70)+i;
time += d2 - 1;
d1 = inb(0xfeff) & 0x28; /* Umschalten auf Zeit */
if (d1 == 0x08 || d1 == 0x20) {
outvalue(0x02);
outvalue(0x00);
}
while ((d1 = rdvalue(0xfef5)) == 59)
; /* Sekunden */
d2 = rdvalue(0xfef9); /* Minuten */
d3 = rdvalue(0xfefd); /* Stunden */
if (d1 > 59 || d2 > 59 || d3 > 23)
return(time);
time = 24*time + d3;
time = 60*time + d2;
time = 60*time + d1;
return(time);
}
outvalue(t)
register t;
{
outb(0xfef1, t);
t = 10000;
while (t--)
;
}
rdvalue(addr)
unsigned addr;
{
return(invalue(addr) + invalue(addr+2)*10);
}
invalue(addr)
register addr;
{
register seg7;
seg7 = inb(addr);
if (seg7 != inb(addr))
seg7 = inb(addr);
if (seg7 & 0x20)
seg7 = ~seg7;
if (addr == 0xfeff) /* 6.Stelle */
seg7 &= 0x07;
seg7 &= 0x1f;
if (seg7 == 0x0f || seg7 == 0x00) /* case ist wesentlich laenger */
return(0);
if (seg7 == 0x02)
return(1);
if (seg7 == 0x17 || seg7 == 0x05)
return(2);
if (seg7 == 0x13)
return(3);
if (seg7 == 0x1a)
return(4);
if (seg7 == 0x19)
return(5);
if (seg7 == 0x1d)
return(6);
if (seg7 == 0x03)
return(7);
if (seg7 == 0x1f)
return(8);
if (seg7 == 0x1b)
return(9);
return(-1);
}