home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 13 / sonstige / cmos.c next >
Encoding:
C/C++ Source or Header  |  1988-10-06  |  7.3 KB  |  255 lines

  1. /* ------------------------------------------------------ */
  2. /*                      CMOS.C                            */
  3. /*     CMOS /W - Sichern des CMOS-Inhalts in Datei        */
  4. /*     CMOS /R - Schreiben der Datei in CMOS-RAM          */
  5. /*     CMOS /U - Einlesen von Zeit und Datum in CMOS-RAM  */
  6. /*                                                        */
  7. /*          (c) 1988 by Jens Krüger & TOOLBOX             */
  8. /* ------------------------------------------------------ */
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <dos.h>
  13.  
  14. #define DEFAULTFIL "cmosram.dat"
  15. #define ENTER 13
  16.  
  17. char filnam[50] = DEFAULTFIL;      /* Konfigurationsdatei */
  18. int cr[10];                    /* Datum/Zeit aus CMOS-RAM */
  19.  
  20. /* ------------------------------------------------------ */
  21. /*   Hilfstext bei Fehler in der Kommandozeile oder bei   */
  22. /*   Option -h ausgeben                                   */
  23. void helptext(void)
  24. {
  25.   puts("\nAufruf       : CMOS [-r│-w│-u] [filename]");
  26.   puts("Beschreibung : Mit diesem Programm kann man die ");
  27.   puts("augenblickliche Konfiguration des CMOS-RAM von  ");
  28.   puts("ATs in eine Datei sichern und nach evtl.");
  29.   puts("Störungen wieder zurückschreiben.");
  30.   puts("Uhrzeit und Datum der Echtzeituhr werden aus ");
  31.   puts("naheliegenden Gründen nicht mit abgespeichert, ");
  32.   puts("müssen also ggf. neu eingegeben werden.");
  33.   puts("CMOS -w  => (Write) ");
  34.   puts("CMOS -r  => (Restore) ");
  35.   puts("CMOS -u  => (Update) ");
  36. }                        /* Ende von void helptext(void)  */
  37.  
  38. /* ------------------------------------------------------ */
  39. /* Erkennen des angeschlossenen Computertyps,  AT => true */
  40. int at_typ(void)
  41. {
  42.  unsigned char far *idbyte =
  43.                (unsigned char far *) 0xF000FFFE;
  44.  int erg;
  45.  
  46.  switch (*idbyte)
  47.   {
  48.    case 0xFC:                  /* AT / XT-268 */
  49.    case 0xFA: erg = 1; break;  /* Model 30    */
  50.    default  : erg = 0;
  51.   }
  52.  return erg;
  53. }                                /* Ende von int at_typ() */
  54.  
  55. /* ------------------------------------------------------ */
  56. /* Datum und Zeit einlesen und in CMOS-RAM schreiben      */
  57. void getcmosdt(void)
  58. {
  59.  int hh_j,mm_m,ss_t;
  60.  int ok_flag;
  61.  extern  cr[];
  62.  
  63.  do
  64.  {
  65.   ok_flag = 1;
  66.   printf("\nAlte Zeit                    : %02x:%02x:%02x",
  67.                                         cr[4],cr[2],cr[0]);
  68.   printf("\nEingabe neue Zeit (HH:MM:SS) : ");
  69.   if ((ss_t = getche()) == ENTER)
  70.     goto get_date;
  71.   else
  72.    {
  73.     ungetc(ss_t, stdin);
  74.     if (scanf("%2x : %2x : %2x", &hh_j, &mm_m, &ss_t) != 3)
  75.       ok_flag = 0;
  76.     if (hh_j>0x23 || hh_j<0 || mm_m>0x59 || mm_m<0
  77.     || ss_t>0x59 || ss_t<0)
  78.       ok_flag = 0;
  79.     if (!ok_flag)
  80.       printf("\n\007CMOS : Falsche Eingabe !\n");
  81.    }
  82.  } while (!ok_flag);
  83.  
  84.   outportb(0x70, 4); outportb(0x71, hh_j);
  85.   outportb(0x70, 2); outportb(0x71, mm_m);
  86.   outportb(0x70, 0); outportb(0x71, ss_t);
  87.  
  88.  get_date:
  89.  
  90.  do
  91.  {
  92.   ok_flag = 1;
  93.   printf("\nAltes Datum                    : %2x.%2x.%02x",
  94.                                         cr[7],cr[8],cr[9]);
  95.   printf("\nEingabe neues Datum (TT.MM.JJ) : ");
  96.   if ((ss_t = getche()) == ENTER)
  97.      goto ende;
  98.   else
  99.    {
  100.     ungetc(ss_t, stdin);
  101.     if (scanf("%2x . %2x . %2x", &ss_t, &mm_m, &hh_j) != 3)
  102.       ok_flag = 0;
  103.     if (hh_j<0x88 || hh_j>0x99 || mm_m>0x12 || mm_m<1
  104.     || ss_t>0x31 || ss_t<1)
  105.       ok_flag = 0;
  106.     if (!ok_flag)
  107.       printf("\n\007CMOS : Falsche Eingabe !\n");
  108.    }
  109.  } while (!ok_flag);
  110.  
  111.   outportb(0x70, 7); outportb(0x71, ss_t);
  112.   outportb(0x70, 8); outportb(0x71, mm_m);
  113.   outportb(0x70, 9); outportb(0x71, hh_j);
  114.  
  115.   ende:
  116.  
  117.   printf("\n   Im CMOS-RAM stehen zwar jetzt die ");
  118.   printf("richtigen Werte, dem Betriebssystem");
  119.   printf("\n        ist die Änderung aber erst nach dem ");
  120.   printf("nächsten Reset bekannt !\n");
  121. }                       /* Ende von void getcmosdt(void)  */
  122.  
  123. /* ------------------------------------------------------ */
  124. /* schreibt die aktuellen Werte des CMOS-RAM in die Datei */
  125. /* filnam im aktuellen Directory                          */
  126. void cmos_write(void)
  127. {
  128.  FILE *fil;
  129.  int loop;
  130.  
  131.  if ((fil = fopen(filnam,"wb")) == NULL)
  132.   {
  133.    fprintf(stderr,
  134.      "\n\007CMOS : Kann Datenfile %s nicht oeffnen !\n",
  135.       filnam);
  136.    exit(1);
  137.   }
  138.  
  139.  fprintf(fil, "%d ", (int) 9999);
  140.            /* ID-Word fuer Konsistenz-Check schreiben */
  141.  
  142.  for (loop=0x0E; loop <= 0x3F; loop++)
  143.   {
  144.    outportb(0x70, loop);
  145.    fprintf(fil ,"%02X", (int) inportb(0x71));
  146.   }
  147.  fclose(fil);
  148.  
  149.    printf("\nCMOS : Werte aus CMOS-RAM gelesen und nach ");
  150.    printf("%s geschrieben !\n",filnam);
  151. }                           /* Ende von void cmos_write() */
  152.  
  153. /* ------------------------------------------------------ */
  154. /* liest Werte aus der Datei filnam und schreibt sie      */
  155. /* in das CMOS-RAM                                        */
  156. void cmos_restore(void)
  157. {
  158.  FILE *fil;
  159.  int loop, temp;
  160.  extern cr[];
  161.  
  162.  if ((fil = fopen(filnam,"rb")) == NULL)
  163.   {
  164.    fprintf(stderr,
  165.        "\n\007CMOS : Datenfile %s nicht gefunden !\n",
  166.         filnam);
  167.    exit(1);
  168.   }
  169.  
  170.  fscanf(fil, "%d", &temp);    /* ID-Word lesen */
  171.  if (temp != 9999)
  172.   {
  173.    fprintf(stderr,
  174.    "\n\007CMOS : Datenfile %s inkonsistent, Programm ",
  175.          "wird abgebrochen !\n", filnam);
  176.    exit(1);
  177.   }
  178.  
  179.  for (loop=0x0E; loop <= 0x3F; loop++)
  180.   {
  181.    fscanf(fil, "%02X", &temp);
  182.    outportb(0x70, loop);
  183.    outportb(0x71, temp);
  184.   }
  185.    printf("\nCMOS : Werte aus %s gelesen und in das ");
  186.    printf("CMOS-RAM geschrieben !\n",filnam);
  187.  
  188.    fclose(fil);
  189.  
  190. /* Test, ob Datum/Zeit im CMOS-RAM o.k - ggf. Korrektur */
  191.  if (cr[2]>0x60 || cr[4]>0x23 || cr[7]>0x31 || cr[8]>0x12
  192.      || cr[9]<0x88 || cr[9]>0x99)
  193.   {
  194.    printf("\n\007CMOS : Oohps - Datum und Zeit im ");
  195.    printf("CMOS-RAM sind wahrscheinlich falsch !");
  196.    printf("\n       Bitte neu eingeben !\n");
  197.    getcmosdt();
  198.   }
  199. }                         /* Ende von void cmos_restore() */
  200.  
  201. /* ------------------------------------------------------ */
  202. main(int argc, char *argv[])
  203. {
  204.  int index, option;
  205.  extern cr[];
  206.  
  207. /* Initialisierung des globalen Arrays cr mit Datum/Zeit  */
  208.  for (index=0; index <= 10; index++)
  209.   {
  210.    outportb(0x70, index);
  211.    cr[index] = (int) inportb(0x71);
  212.   }
  213.  
  214.                      /* Parsing der Kommandozeile         */
  215.  option = '*';       /* Default : Fehler in Kommandozeile */
  216.  if (argc >= 2)
  217.   {
  218.    index = 0;
  219.    while ((argv[1][index] == ' ' || argv[1][index] == '\t'
  220.          || argv[1][index] == '/' || argv[1][index] == '-')
  221.          && argv[1][index])
  222.       index++;               /* Überlesen der Füllzeichen */
  223.    option = toupper(argv[1][index]);
  224.    if (argc > 2)
  225.      strcpy(filnam, argv[2]);
  226.   }
  227.  switch (option)
  228.   {
  229.    case 'U':
  230.    case 'R':
  231.    case 'W': break;
  232.     /* richtige Kommandozeilenoption, => weitermachen */
  233.    default : helptext(); exit(1);
  234.   }
  235.  
  236.  /* Ende des Kommandozeilen-Parsings, Ausführung der      */
  237.  /* gewünschten Funktion                                  */
  238.  
  239.   if (!at_typ())
  240.   {
  241.    fprintf(stderr,
  242.        "\nFehler : Programm läuft nur auf ATs und ",
  243.        "Kompatiblen !\n");
  244.    exit(1);
  245.   }
  246.  
  247.  switch (option)
  248.   {
  249.    case 'U' : getcmosdt();     break;
  250.    case 'R' : cmos_restore();  break;
  251.    case 'W' : cmos_write();    break;
  252.   }
  253.  exit(0);
  254. }                              /* Ende des Hauptprogramms */
  255. /* ------------------------------------------------------ */