home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* CMOS.C */
- /* CMOS /W - Sichern des CMOS-Inhalts in Datei */
- /* CMOS /R - Schreiben der Datei in CMOS-RAM */
- /* CMOS /U - Einlesen von Zeit und Datum in CMOS-RAM */
- /* */
- /* (c) 1988 by Jens Krüger & TOOLBOX */
- /* ------------------------------------------------------ */
-
- #include <stdio.h>
- #include <string.h>
- #include <dos.h>
-
- #define DEFAULTFIL "cmosram.dat"
- #define ENTER 13
-
- char filnam[50] = DEFAULTFIL; /* Konfigurationsdatei */
- int cr[10]; /* Datum/Zeit aus CMOS-RAM */
-
- /* ------------------------------------------------------ */
- /* Hilfstext bei Fehler in der Kommandozeile oder bei */
- /* Option -h ausgeben */
- void helptext(void)
- {
- puts("\nAufruf : CMOS [-r│-w│-u] [filename]");
- puts("Beschreibung : Mit diesem Programm kann man die ");
- puts("augenblickliche Konfiguration des CMOS-RAM von ");
- puts("ATs in eine Datei sichern und nach evtl.");
- puts("Störungen wieder zurückschreiben.");
- puts("Uhrzeit und Datum der Echtzeituhr werden aus ");
- puts("naheliegenden Gründen nicht mit abgespeichert, ");
- puts("müssen also ggf. neu eingegeben werden.");
- puts("CMOS -w => (Write) ");
- puts("CMOS -r => (Restore) ");
- puts("CMOS -u => (Update) ");
- } /* Ende von void helptext(void) */
-
- /* ------------------------------------------------------ */
- /* Erkennen des angeschlossenen Computertyps, AT => true */
- int at_typ(void)
- {
- unsigned char far *idbyte =
- (unsigned char far *) 0xF000FFFE;
- int erg;
-
- switch (*idbyte)
- {
- case 0xFC: /* AT / XT-268 */
- case 0xFA: erg = 1; break; /* Model 30 */
- default : erg = 0;
- }
- return erg;
- } /* Ende von int at_typ() */
-
- /* ------------------------------------------------------ */
- /* Datum und Zeit einlesen und in CMOS-RAM schreiben */
- void getcmosdt(void)
- {
- int hh_j,mm_m,ss_t;
- int ok_flag;
- extern cr[];
-
- do
- {
- ok_flag = 1;
- printf("\nAlte Zeit : %02x:%02x:%02x",
- cr[4],cr[2],cr[0]);
- printf("\nEingabe neue Zeit (HH:MM:SS) : ");
- if ((ss_t = getche()) == ENTER)
- goto get_date;
- else
- {
- ungetc(ss_t, stdin);
- if (scanf("%2x : %2x : %2x", &hh_j, &mm_m, &ss_t) != 3)
- ok_flag = 0;
- if (hh_j>0x23 || hh_j<0 || mm_m>0x59 || mm_m<0
- || ss_t>0x59 || ss_t<0)
- ok_flag = 0;
- if (!ok_flag)
- printf("\n\007CMOS : Falsche Eingabe !\n");
- }
- } while (!ok_flag);
-
- outportb(0x70, 4); outportb(0x71, hh_j);
- outportb(0x70, 2); outportb(0x71, mm_m);
- outportb(0x70, 0); outportb(0x71, ss_t);
-
- get_date:
-
- do
- {
- ok_flag = 1;
- printf("\nAltes Datum : %2x.%2x.%02x",
- cr[7],cr[8],cr[9]);
- printf("\nEingabe neues Datum (TT.MM.JJ) : ");
- if ((ss_t = getche()) == ENTER)
- goto ende;
- else
- {
- ungetc(ss_t, stdin);
- if (scanf("%2x . %2x . %2x", &ss_t, &mm_m, &hh_j) != 3)
- ok_flag = 0;
- if (hh_j<0x88 || hh_j>0x99 || mm_m>0x12 || mm_m<1
- || ss_t>0x31 || ss_t<1)
- ok_flag = 0;
- if (!ok_flag)
- printf("\n\007CMOS : Falsche Eingabe !\n");
- }
- } while (!ok_flag);
-
- outportb(0x70, 7); outportb(0x71, ss_t);
- outportb(0x70, 8); outportb(0x71, mm_m);
- outportb(0x70, 9); outportb(0x71, hh_j);
-
- ende:
-
- printf("\n Im CMOS-RAM stehen zwar jetzt die ");
- printf("richtigen Werte, dem Betriebssystem");
- printf("\n ist die Änderung aber erst nach dem ");
- printf("nächsten Reset bekannt !\n");
- } /* Ende von void getcmosdt(void) */
-
- /* ------------------------------------------------------ */
- /* schreibt die aktuellen Werte des CMOS-RAM in die Datei */
- /* filnam im aktuellen Directory */
- void cmos_write(void)
- {
- FILE *fil;
- int loop;
-
- if ((fil = fopen(filnam,"wb")) == NULL)
- {
- fprintf(stderr,
- "\n\007CMOS : Kann Datenfile %s nicht oeffnen !\n",
- filnam);
- exit(1);
- }
-
- fprintf(fil, "%d ", (int) 9999);
- /* ID-Word fuer Konsistenz-Check schreiben */
-
- for (loop=0x0E; loop <= 0x3F; loop++)
- {
- outportb(0x70, loop);
- fprintf(fil ,"%02X", (int) inportb(0x71));
- }
- fclose(fil);
-
- printf("\nCMOS : Werte aus CMOS-RAM gelesen und nach ");
- printf("%s geschrieben !\n",filnam);
- } /* Ende von void cmos_write() */
-
- /* ------------------------------------------------------ */
- /* liest Werte aus der Datei filnam und schreibt sie */
- /* in das CMOS-RAM */
- void cmos_restore(void)
- {
- FILE *fil;
- int loop, temp;
- extern cr[];
-
- if ((fil = fopen(filnam,"rb")) == NULL)
- {
- fprintf(stderr,
- "\n\007CMOS : Datenfile %s nicht gefunden !\n",
- filnam);
- exit(1);
- }
-
- fscanf(fil, "%d", &temp); /* ID-Word lesen */
- if (temp != 9999)
- {
- fprintf(stderr,
- "\n\007CMOS : Datenfile %s inkonsistent, Programm ",
- "wird abgebrochen !\n", filnam);
- exit(1);
- }
-
- for (loop=0x0E; loop <= 0x3F; loop++)
- {
- fscanf(fil, "%02X", &temp);
- outportb(0x70, loop);
- outportb(0x71, temp);
- }
- printf("\nCMOS : Werte aus %s gelesen und in das ");
- printf("CMOS-RAM geschrieben !\n",filnam);
-
- fclose(fil);
-
- /* Test, ob Datum/Zeit im CMOS-RAM o.k - ggf. Korrektur */
- if (cr[2]>0x60 || cr[4]>0x23 || cr[7]>0x31 || cr[8]>0x12
- || cr[9]<0x88 || cr[9]>0x99)
- {
- printf("\n\007CMOS : Oohps - Datum und Zeit im ");
- printf("CMOS-RAM sind wahrscheinlich falsch !");
- printf("\n Bitte neu eingeben !\n");
- getcmosdt();
- }
- } /* Ende von void cmos_restore() */
-
- /* ------------------------------------------------------ */
- main(int argc, char *argv[])
- {
- int index, option;
- extern cr[];
-
- /* Initialisierung des globalen Arrays cr mit Datum/Zeit */
- for (index=0; index <= 10; index++)
- {
- outportb(0x70, index);
- cr[index] = (int) inportb(0x71);
- }
-
- /* Parsing der Kommandozeile */
- option = '*'; /* Default : Fehler in Kommandozeile */
- if (argc >= 2)
- {
- index = 0;
- while ((argv[1][index] == ' ' || argv[1][index] == '\t'
- || argv[1][index] == '/' || argv[1][index] == '-')
- && argv[1][index])
- index++; /* Überlesen der Füllzeichen */
- option = toupper(argv[1][index]);
- if (argc > 2)
- strcpy(filnam, argv[2]);
- }
- switch (option)
- {
- case 'U':
- case 'R':
- case 'W': break;
- /* richtige Kommandozeilenoption, => weitermachen */
- default : helptext(); exit(1);
- }
-
- /* Ende des Kommandozeilen-Parsings, Ausführung der */
- /* gewünschten Funktion */
-
- if (!at_typ())
- {
- fprintf(stderr,
- "\nFehler : Programm läuft nur auf ATs und ",
- "Kompatiblen !\n");
- exit(1);
- }
-
- switch (option)
- {
- case 'U' : getcmosdt(); break;
- case 'R' : cmos_restore(); break;
- case 'W' : cmos_write(); break;
- }
- exit(0);
- } /* Ende des Hauptprogramms */
- /* ------------------------------------------------------ */