home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / CLOCKK / MDCLCK13.LBR / SETTIME.CZ / SETTIME.C
Text File  |  2000-06-30  |  6KB  |  166 lines

  1. /*    program in MIX 'C' to set real-time-clock located at ports
  2.     30h through 33h in Morrow MD 2/3 rev. 2 main board.
  3.         Mike Allen   8/10/86                */
  4.  
  5. #include "stdio"
  6. #include "stdlib.h"
  7.  
  8. #define    CLS    'Z'-0x40    /* Clear Screen (^Z) */
  9. #define PA    0x30        /* 8255 A register */
  10. #define    PB    0x31        /* 8255 B register */
  11. #define    PC    0x32        /* 8255 C register */
  12. #define CNTRL    0x33        /* 8255 Control register */
  13.  
  14. main()
  15.  
  16. {
  17.     int    rtc[13];    /* MSM8532 registers */
  18.     
  19.     int    i,        /* general loop variable */
  20.         civil_time,    /* 24hr, AM or PM indicator */
  21.         new_in;        /* new values */
  22.  
  23.     char junque[3];        /* input string */
  24.  
  25.     putchar(CLS);            /* Clear the screen */
  26.     outp(CNTRL,'\220');        /* Set up 8255 */
  27.     outp(PC,'\040');        /* Put MSM5832 in 'read' mode */
  28.     for(i=2;i<13;i++) {    /* read top 11 MSM5832 registers */
  29.         outp(PB,i);    /* output the register address */
  30.         rtc[i]=inp(PA)&0xf;    /* read the register and
  31.                        strip the 4 top bits */
  32.     }
  33.     outp(PC,'\000');    /* Take the MSM5832 out of the read mode */
  34.     if(rtc[5]>7)        /* check for 24 hr time. */
  35.         civil_time=0;
  36.     else if(rtc[5]>3)    /* not 24 hr,  check for PM */
  37.         civil_time=2;
  38.     else             /* not 24 hr or PM.  Must be AM. */
  39.         civil_time=1;
  40.     do {
  41.         new_in = 10*rtc[12]+rtc[11];    /* old value of years */
  42.         printf("Year? <%d> ",new_in);    /* show it */
  43.         gets(junque);            /* get input */
  44.         if (strlen(junque))        /* see if new value */
  45.             new_in = atoi(junque);    /* if so, make integer */
  46.     } while( new_in < 0 || new_in > 99);    /* make sure it's valid */
  47.     rtc[12] = new_in/10;            /* set up 10s of years */
  48.     rtc[11] = new_in%10;            /* set up 1s of years */
  49.     do {
  50.         new_in = rtc[8]/4;        /* old leap year flag */
  51.         printf("Leap year? [1=yes] <%d> ",new_in);    /* show it */
  52.         gets(junque);            /* get input */
  53.         if (strlen(junque))        /* see if new value */
  54.             new_in = atoi(junque);    /* if so, make integer */
  55.     } while( new_in < 0 || new_in > 1);    /* make sure it's valid */
  56.     rtc[8] = (rtc[8] & 0x3) | (new_in*4);    /* set/reset leap year flag */
  57.     do {
  58.         new_in = 10*rtc[10]+rtc[9];    /* old value of month */
  59.         printf("Month? <%d> ",new_in);    /* show it */
  60.         gets(junque);            /* get input */
  61.         if (strlen(junque))        /* see if new value */
  62.             new_in = atoi(junque);    /* if so, make integer */
  63.     } while( new_in < 1 || new_in > 12);    /* make sure it's valid */
  64.     rtc[10] = new_in/10;            /* set up 10s of months */
  65.     rtc[9] = new_in%10;            /* set up 1s of months */
  66.     do {
  67.         new_in = 10*(rtc[8] & 0x3)+rtc[7];
  68.                         /* old value of day */
  69.         printf("Day? <%d> ",new_in);    /* show it */
  70.         gets(junque);            /* get input */
  71.         if (strlen(junque))        /* see if new value */
  72.             new_in = atoi(junque);    /* if so, make integer */
  73.     } while( new_in < 1 || new_in > 31);    /* make sure it's valid */
  74.     rtc[8] = (rtc[8] & 0x4) | (new_in/10);    /* set up 10s of days */
  75.     rtc[7] = new_in%10;            /* set up 1s of years */
  76.     do {
  77.         new_in = rtc[6];    /* old value of day of week */
  78.         printf("Day of week? [0=Sunday, 6=Saturday] <%d> ",new_in);
  79.                         /* show it */
  80.         gets(junque);            /* get input */
  81.         if (strlen(junque))        /* see if new value */
  82.             new_in = atoi(junque);    /* if so, make integer */
  83.     } while( new_in < 0 || new_in > 6);    /* make sure it's valid */
  84.     rtc[6] = new_in;            /* set up day of week */
  85.     do {
  86.         new_in = civil_time;
  87.         printf("24 hr[0], AM[1] or PM[2]? <%d> ",new_in);
  88.                         /* show 24hr, AM, PM flags */
  89.         gets(junque);            /* get input */
  90.         if (strlen(junque))        /* see if new value */
  91.             new_in = atoi(junque);
  92.                         /* if so, make integer */
  93.     } while( new_in < 0 || new_in > 2);
  94.                         /* make sure it's valid */
  95.     civil_time = new_in;
  96.     new_in = 10*(rtc[5] & 0x3) + rtc[4];    /* get hours */
  97.     rtc[5] = rtc[5] & 0x3;            /* clear 24hr & PM flags */
  98.     switch(civil_time) {
  99.         case 0:    rtc[5] |= 0x8;        /* set 24hr flag */
  100.             break;
  101.         case 2:    rtc[5] |= 0x4;        /* set PM flag */
  102.             break;
  103.         default:    break;
  104.     }
  105.     if (civil_time) {        /* make sure 12hr times are valid */
  106.         if (new_in > 12)
  107.             new_in -=12;
  108.         else if (new_in == 0)
  109.             new_in = 12;
  110.         rtc[5] = (rtc[5] & 0x4) | (new_in/10);    /* set 10s of hours */
  111.         rtc[4] = new_in%10;            /* set 1s of hours */
  112.         do {
  113.             new_in = 10*(rtc[5] & 0x3)+rtc[4];    
  114.                         /* old value of hours */
  115.             printf("Hours? <%d> ",new_in);    /* show it */
  116.             gets(junque);            /* get input */
  117.             if (strlen(junque))        /* see if new value */
  118.                 new_in = atoi(junque);
  119.                         /* if so, make integer */
  120.         } while( new_in < 1 || new_in > 12);
  121.                         /* make sure it's valid */
  122.     }
  123.     else {
  124.         do {
  125.             new_in = 10*(rtc[5] & 0x3)+rtc[4];    
  126.                         /* old value of hours */
  127.             printf("Hours? <%d> ",new_in);    /* show it */
  128.             gets(junque);            /* get input */
  129.             if (strlen(junque))        /* see if new value */
  130.                 new_in = atoi(junque);
  131.                         /* if so, make integer */
  132.         } while( new_in < 0 || new_in > 23);
  133.                         /* make sure it's valid */
  134.     }
  135.     rtc[5] = (rtc[5] & 0xC) | (new_in/10);    /* set up 10s of hours */
  136.     rtc[4] = new_in%10;            /* set up 1s of hours */
  137.     do {
  138.         new_in = 10*rtc[3]+rtc[2];    /* old value of minutes */
  139.         printf("Minutes? <%d> ",new_in);    /* show it */
  140.         gets(junque);            /* get input */
  141.         if (strlen(junque))        /* see if new value */
  142.             new_in = atoi(junque);    /* if so, make integer */
  143.     } while( new_in < 0 || new_in > 59);    /* make sure it's valid */
  144.     rtc[3] = new_in/10;            /* set up 10s of minutes */
  145.     rtc[2] = new_in%10;            /* set up 1s of minutes */
  146.     puts("Press RETURN to start clock on the minute.");
  147.                         /* prompt user */
  148.     gets(junque);                /* load the clock */
  149.     outp(CNTRL,'\200');            /* set up 8255 */
  150.     outp(PC,'\020');            /* turn on the hold */
  151.     for(i=0;i<15;i++);            /* wait a LONG time */
  152.     for(i=0;i<13;i++) {        /* write ALL 13 MSM5832 registers
  153.                        to reset seconds */
  154.         outp(PB,i);        /* output the register address */
  155.         outp(PA,(rtc[i] & 0xF));    /* output the bottom 4 bits
  156.                             of the register */
  157.         outp(PC,'\120');    /* strobe the write line */
  158.         outp(PC,'\020');
  159.     }
  160.     outp(PC,'\000');        /* trun off the hold line */
  161.     outp(CNTRL,'\220');        /* restore the 8255 */
  162.     exit(0);        /* We done! We bad! */
  163. }
  164. PC,'\000');        /* trun off the hold line */
  165.     outp(CNTRL,'\220');        /* restore the 8255 */
  166.     exit(0);        /* We d