home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / 2.9-derivatives / 2.9-pro350 / sys-dev / prostuff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-26  |  3.9 KB  |  191 lines

  1. /* These two fuctions handle the pro 300's clock
  2.  * This code is defunct at the end of the century.
  3.  * Will Unix still be here then??
  4.  */
  5. #include "whoami.h"
  6. #if PDP11 == 21
  7. #include <sys/param.h>
  8. #include <sys/systm.h>
  9. #include <sys/ivecpos.h>
  10.  
  11. #define    MINSEC    60l
  12. #define    HRSEC    3600l
  13. #define    DAYSEC    86400l
  14.  
  15. #define    CLK_VRT    0200
  16. #define    CLK_UIP    0200
  17. #define    CLK_RATE    052
  18. #define    CLK_ENABLE    0106
  19. #define    CLK_SET    0206
  20.  
  21. struct cldevice {
  22.     int    sec;
  23.     int    secalrm;
  24.     int    min;
  25.     int    minalrm;
  26.     int    hr;
  27.     int    hralrm;
  28.     int    dayofwk;
  29.     int    day;
  30.     int    mon;
  31.     int    yr;
  32.     int    csr0;
  33.     int    csr1;
  34.     int    csr2;
  35.     int    csr3;
  36. };
  37.  
  38. #define    CLKADDR    ((struct cldevice *)0173000)
  39.  
  40. short dayyr[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, };
  41. /* Starts the pro 300 clock. Called from clkstart... */
  42. proclock()
  43. {
  44.     register int tmp1, tmp2;
  45.  
  46.     CLKADDR->csr1 = CLK_SET;
  47.     while (CLKADDR->csr0 & CLK_UIP)
  48.         ;
  49.     /* If the clock is valid, use it. */
  50.     if ((CLKADDR->csr3 & CLK_VRT) && ((CLKADDR->csr1&07)==06)) {
  51.         /* Convert yr,mon,day,hr,min,sec to sec past Jan.1, 1970. */
  52.         tmp2 = 0;
  53.         for (tmp1 = 70; tmp1 < CLKADDR->yr; tmp1++) {
  54.             tmp2 += 365;
  55.             /* I just luv leap years... */
  56.             if ((tmp1 % 4) == 0)
  57.                 tmp2++;
  58.         }
  59.         tmp2 += (dayyr[CLKADDR->mon-1]+CLKADDR->day-1);
  60.         if ((CLKADDR->yr % 4) == 0 && CLKADDR->mon > 2)
  61.             tmp2++;
  62.         /* Finally got days past Jan. 1,1970. the rest is easy.. */
  63.         time = tmp2*DAYSEC+CLKADDR->hr*HRSEC+
  64.             CLKADDR->min*MINSEC+CLKADDR->sec;
  65.     }
  66.     CLKADDR->csr0 = CLK_RATE;
  67.     ienable(CLPOS);
  68.     tmp1 = CLKADDR->csr2;
  69.     CLKADDR->csr1 = CLK_ENABLE;
  70. }
  71. /* Set the time of day clock, called via. stime system call.. */
  72. sdtime()
  73. {
  74.     register int tmp1, tmp3;
  75.     long tmp2, tmp4;
  76.  
  77.     CLKADDR->csr1 = CLK_SET;
  78.     while (CLKADDR->csr0 & CLK_UIP)
  79.         ;
  80.     /* The reverse of above, sec. past Jan. 1,1970 to yr, mon... */
  81.     tmp2 = time/3600;
  82.     tmp4 = tmp2 = tmp2/24;
  83.     tmp1 = 69;
  84.     while (tmp2 >= 0) {
  85.         tmp3 = tmp2;
  86.         tmp2 -= 365;
  87.         tmp1++;
  88.         if ((tmp1 % 4) == 0)
  89.             tmp2--;
  90.     }
  91.     /* Got the year... */
  92.     CLKADDR->yr = tmp1;
  93.     tmp1 = -1;
  94.     do {
  95.         tmp2 = tmp3-dayyr[++tmp1];
  96.         if ((CLKADDR->yr % 4) == 0 && tmp1 > 1)
  97.             tmp2--;
  98.     } while (tmp2 >= 0);
  99.     /* Finally, got the rest... */
  100.     CLKADDR->mon = tmp1;
  101.     CLKADDR->day = tmp3-dayyr[tmp1-1]+1;
  102.     if ((CLKADDR->yr%4) == 0 && tmp1 > 2)
  103.         CLKADDR->day--;
  104.     tmp2 = time-(tmp4*DAYSEC);
  105.     CLKADDR->hr = tmp2/3600;
  106.     tmp2 = tmp2%3600;
  107.     CLKADDR->min = tmp2/60;
  108.     tmp2 = tmp2%60;
  109.     CLKADDR->sec = tmp2;
  110.     tmp1 = CLKADDR->csr2;
  111.     tmp1 = CLKADDR->csr3;
  112.     CLKADDR->csr1 = CLK_ENABLE;
  113. }
  114. /* These two little functions interface to the pro's interrupt
  115.  * handler chips. Most of the work in setting these up is done
  116.  * in firmware at powerup, so just enable, disable each device
  117.  * as required.
  118.  * Note: The device numbers are kept in "...sys/h/ivecpos.h
  119.  */
  120.  
  121. struct indevice {
  122.     int dat;
  123.     int csr;
  124. };
  125.  
  126. char    imask[3] = { 0, 0, 0 };
  127.  
  128. #define    IVECADDR    ((struct indevice *)0173200)
  129. #define    IVEC_CIM    050
  130. #define    IVEC_SIM    070
  131. #define    IVEC_CIR    0110
  132. #define    IVEC_PACR    0300
  133. #define    IVEC_M5T7    0245
  134. #define    IVEC_M0T4    0201
  135. #define    IVEC_PIMR    0260
  136.  
  137. /* Enable interrupts for "device"
  138.  * returns 1 - was enabled
  139.  *         0 - was disabled
  140.  */
  141. ienable(device)
  142. int device;
  143. {
  144.     register int dev, intr;
  145.     register struct indevice *iaddr;
  146.     int tmp;
  147.  
  148.     dev = device>>3;
  149.     intr = device & 07;
  150.     iaddr = IVECADDR+dev;
  151.     iaddr->csr = IVEC_CIM | intr;
  152.     tmp = (imask[dev]>>intr) & 01;
  153.     imask[dev] |= (01<<intr);
  154.     return(tmp);
  155. }
  156.  
  157. /* Disable interrupts for "device", return as above. */
  158. idisable(device)
  159. int device;
  160. {
  161.     register int dev, intr;
  162.     register struct indevice *iaddr;
  163.     int tmp;
  164.  
  165.     dev = device>>3;
  166.     intr = device & 07;
  167.     iaddr = IVECADDR+dev;
  168.     iaddr->csr = IVEC_SIM | intr;
  169.     iaddr->csr = IVEC_CIR | intr;
  170.     tmp = (imask[dev]>>intr) & 01;
  171.     imask[dev] &= ~(01<<intr);
  172.     return(tmp);
  173. }
  174.  
  175. ivinit()
  176. {
  177.     register struct indevice *iaddr = IVECADDR;
  178.     register int i;
  179.  
  180.     for (i = 0; i < 3; i++) {
  181.         iaddr->csr = IVEC_PACR;
  182.         iaddr->dat = 0377;
  183.         iaddr->csr = IVEC_M5T7;
  184.         if (i > 0)
  185.             iaddr->csr = IVEC_M0T4;
  186.         iaddr->csr = IVEC_PIMR;
  187.         iaddr++;
  188.     }
  189. }
  190. #endif
  191.