Real-Time-Chip in pmode


Wie der RealTime-Chip von Protected-Modus zugreifen.

Autor: GREG VIGNEAULT

{
MD > Was würde hier jemand empfehlen, als der beste Weg für DOS
> geschützter Modus um die aktuelle Uhrzeit zu erhalten * ohne * spiegeln
> zurück zu Realmodus Norm DOS telefonieren?

Wenn Ihr Code mit der Echtzeituhr (RTC) Chip sprechen darf,
Hier ist ein Beispielcode, die RTC direkt zuzugreifen. Die Funktionen
Arbeiten Sie ausschließlich mit 24 h-Zeitformat (falls nötig, intern durch die RTC
Sie übersetzen zwischen 12/24 h Mal und Binary/BCD-Format)...
}

(*******************************************************************)
Programm RClock; {Get/Set Time/Date direkt vom RTC-Chip}
{9. Juni 1994. Greg Vigneault}
Typ Treg = 0.. $D; {Bereich für Zeit/Datum-Adressen registrieren}
23 = 0..23; {Bereich stundenlang}
To59 = 0..59; {Bereich für Minuten und Sekunden}
VAR-Yr, Mth, Tag, DoW, Hr, Min, Sec: BYTE;

Funktion RTCbusy:BOOLEAN; BEGIN {RTC Zeit/Datum aktualisiert?...}
Port [$70]: = $A; RTCbusy: = (Port [$71] und 128) = 128;
Ende {RTCbusy};

Funktion ReadReg (Reg:Treg): BYTE; BEGIN {lesen eine RTC-Register...}
IF Reg IN [0.. 9] dann REPEAT {warten} bis nicht RTCbusy;
Port [$70]: = Reg; ReadReg: = Port [$71];
Ende {ReadReg};

Prozedur WriteReg (Reg:Treg; Data:Byte); {Schreiben Sie RTC reg...}
VAR Temp: BYTE; BEGIN
IF Reg IN [0.. 9] dann BEGIN {Uhrzeit/Datum Reg?}
REPEAT {warten} bis nicht RTCbusy;
Port [$70]: = $B; Temp: = Port [$71]; Port [$71]: = temp OR $80;
ENDIF {};
Port [$70]: = Reg; Port [$71]: = Daten;
IF Reg IN [0.. 9] dann BEGIN
Port [$70]: = $B; Port [$71]: = Temp und nicht $80;
ENDIF {};
Ende {WriteReg};

Funktion BCD2Bin (BCD:BYTE): BYTE; BEGIN {Xlate BCD zu Binär...}
BCD2Bin: = (BCD und $0F) + ((BCD SHR 4) * 10);
Ende {BCD2Bin};
Funktion Bin2BCD (Bin: BYTE): BYTE; BEGIN {Xlate Binär zu BCD...}
Bin2BCD: = (Bin MOD 10) oder BYTE (SHL 4 (Bin DIV 10));
Ende {Bin2BCD};

Prozedur GetTime (VAR Hr, Min, Sec:BYTE);
VAR Temp: BYTE; BEGIN
S: = ReadReg(0); Min: = ReadReg(2);
HR: = ReadReg(4); Temp: = Hr; HR: Hr = und nicht $80;
IF (ReadReg($B) und 4) <> 4 dann BEGIN {Xlate BCD auf bin...}
S: = BCD2Bin(Sec); Min: = BCD2Bin(Min); HR: = BCD2Bin(Hr);
ENDIF {};
IF (ReadReg($B) und 2) <> 2 dann {RTC in 12 h Modus?...}
IF (temporäre und 128) = 128 {Uhr?}
DANN beginnen, wenn (Hr < 12) dann INC(Hr,12); ENDE
SONST wenn Hr = 12 dann Hr: = 0;
Ende {GetTime};

Verfahren SetTime (Hr:To23; Min, Sec:To59);
VAR Temp: BYTE; BEGIN
Temp: = BYTE(Hr);
IF (ReadReg($B) und 2) <> 2 dann {RTC in 12 h Modus?...}
IF (Hr > 12) dann ElseIf DEC(Hr,12) Hr = 0 THEN Hr: = 12;
IF (ReadReg($B) und 4) <> 4 dann beginnen {RTC will BCD Format...}
HR: = Bin2BCD(Hr); Min: = Bin2BCD(Min); S: = Bin2BCD(Sec);
ENDIF {};
IF ((ReadReg($B) AND 2) <> 2) und (temporäre > 11) dann Hr: = Hr oder $80;
WriteReg(0,Sec); WriteReg(2,Min); WriteReg(4,Hr);
Ende {SetTime};

Verfahren GetDate (VAR Yr, Mth, Tag: BYTE); BEGIN
Tag: = ReadReg(7); Mth: = ReadReg(8); Yr: = ReadReg(9);
IF (ReadReg($B) und 4) <> 4 dann BEGIN {Xlate BCD, Binay...}
Tag: = BCD2Bin(Day); Mth: = BCD2Bin(Mth); Yr: = BCD2Bin(Yr);
ENDE; {IF}
Ende {GetDate};

Verfahren SetDate (Yr, Mth, Tag: BYTE); BEGIN
IF (ReadReg($B) und 4) <> 4 dann beginnen {RTC will BCD Format...}
Tag: = Bin2BCD(Day); Mth: = Bin2BCD(Mth); Yr: = Bin2BCD(Yr);
ENDIF {};
WriteReg(7,Day); WriteReg(8,Mth); WriteReg(9,Yr);
Ende {SetDate};

BEGIN {RClock}
GetTime (h, Min, Sec); GetDate (Yr, Mth, Tag); WriteLn;
Schreiben ('Datum ist', Mth, '/' Tag '/', Yr,'. ');
WriteLn ('Zeit ist', Hr,': ', Min:2,': ', Sec:2,'. ');
Schreiben ('(BTW, ist Ihre RTC in ');
IF (ReadReg($B) 2) <> 2 dann Write ('12') anderes Schreiben ('24');
Schreiben ('-Stunden-Modus verwenden ');
IF (ReadReg($B) und 4) <> 4 dann Write('BCD') sonst Write('binary');
WriteLn (' Format.)');
Ende {RClock}.









Real-Time-Chip in pmode


Real-Time-Chip in pmode : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Wie der RealTime-Chip von Protected-Modus zugreifen.

Autor: GREG VIGNEAULT

{
MD > Was würde hier jemand empfehlen, als der beste Weg für DOS
> geschützter Modus um die aktuelle Uhrzeit zu erhalten * ohne * spiegeln
> zurück zu Realmodus Norm DOS telefonieren?

Wenn Ihr Code mit der Echtzeituhr (RTC) Chip sprechen darf,
Hier ist ein Beispielcode, die RTC direkt zuzugreifen. Die Funktionen
Arbeiten Sie ausschließlich mit 24 h-Zeitformat (falls nötig, intern durch die RTC
Sie übersetzen zwischen 12/24 h Mal und Binary/BCD-Format)...
}

(*******************************************************************)
Programm RClock; {Get/Set Time/Date direkt vom RTC-Chip}
{9. Juni 1994. Greg Vigneault}
Typ Treg = 0.. $D; {Bereich für Zeit/Datum-Adressen registrieren}
23 = 0..23; {Bereich stundenlang}
To59 = 0..59; {Bereich für Minuten und Sekunden}
VAR-Yr, Mth, Tag, DoW, Hr, Min, Sec: BYTE;

Funktion RTCbusy:BOOLEAN; BEGIN {RTC Zeit/Datum aktualisiert?...}
Port [$70]: = $A; RTCbusy: = (Port [$71] und 128) = 128;
Ende {RTCbusy};

Funktion ReadReg (Reg:Treg): BYTE; BEGIN {lesen eine RTC-Register...}
IF Reg IN [0.. 9] dann REPEAT {warten} bis nicht RTCbusy;
Port [$70]: = Reg; ReadReg: = Port [$71];
Ende {ReadReg};

Prozedur WriteReg (Reg:Treg; Data:Byte); {Schreiben Sie RTC reg...}
VAR Temp: BYTE; BEGIN
IF Reg IN [0.. 9] dann BEGIN {Uhrzeit/Datum Reg?}
REPEAT {warten} bis nicht RTCbusy;
Port [$70]: = $B; Temp: = Port [$71]; Port [$71]: = temp OR $80;
ENDIF {};
Port [$70]: = Reg; Port [$71]: = Daten;
IF Reg IN [0.. 9] dann BEGIN
Port [$70]: = $B; Port [$71]: = Temp und nicht $80;
ENDIF {};
Ende {WriteReg};

Funktion BCD2Bin (BCD:BYTE): BYTE; BEGIN {Xlate BCD zu Binär...}
BCD2Bin: = (BCD und $0F) + ((BCD SHR 4) * 10);
Ende {BCD2Bin};
Funktion Bin2BCD (Bin: BYTE): BYTE; BEGIN {Xlate Binär zu BCD...}
Bin2BCD: = (Bin MOD 10) oder BYTE (SHL 4 (Bin DIV 10));
Ende {Bin2BCD};

Prozedur GetTime (VAR Hr, Min, Sec:BYTE);
VAR Temp: BYTE; BEGIN
S: = ReadReg(0); Min: = ReadReg(2);
HR: = ReadReg(4); Temp: = Hr; HR: Hr = und nicht $80;
IF (ReadReg($B) und 4) <> 4 dann BEGIN {Xlate BCD auf bin...}
S: = BCD2Bin(Sec); Min: = BCD2Bin(Min); HR: = BCD2Bin(Hr);
ENDIF {};
IF (ReadReg($B) und 2) <> 2 dann {RTC in 12 h Modus?...}
IF (temporäre und 128) = 128 {Uhr?}
DANN beginnen, wenn (Hr < 12) dann INC(Hr,12); ENDE
SONST wenn Hr = 12 dann Hr: = 0;
Ende {GetTime};

Verfahren SetTime (Hr:To23; Min, Sec:To59);
VAR Temp: BYTE; BEGIN
Temp: = BYTE(Hr);
IF (ReadReg($B) und 2) <> 2 dann {RTC in 12 h Modus?...}
IF (Hr > 12) dann ElseIf DEC(Hr,12) Hr = 0 THEN Hr: = 12;
IF (ReadReg($B) und 4) <> 4 dann beginnen {RTC will BCD Format...}
HR: = Bin2BCD(Hr); Min: = Bin2BCD(Min); S: = Bin2BCD(Sec);
ENDIF {};
IF ((ReadReg($B) AND 2) <> 2) und (temporäre > 11) dann Hr: = Hr oder $80;
WriteReg(0,Sec); WriteReg(2,Min); WriteReg(4,Hr);
Ende {SetTime};

Verfahren GetDate (VAR Yr, Mth, Tag: BYTE); BEGIN
Tag: = ReadReg(7); Mth: = ReadReg(8); Yr: = ReadReg(9);
IF (ReadReg($B) und 4) <> 4 dann BEGIN {Xlate BCD, Binay...}
Tag: = BCD2Bin(Day); Mth: = BCD2Bin(Mth); Yr: = BCD2Bin(Yr);
ENDE; {IF}
Ende {GetDate};

Verfahren SetDate (Yr, Mth, Tag: BYTE); BEGIN
IF (ReadReg($B) und 4) <> 4 dann beginnen {RTC will BCD Format...}
Tag: = Bin2BCD(Day); Mth: = Bin2BCD(Mth); Yr: = Bin2BCD(Yr);
ENDIF {};
WriteReg(7,Day); WriteReg(8,Mth); WriteReg(9,Yr);
Ende {SetDate};

BEGIN {RClock}
GetTime (h, Min, Sec); GetDate (Yr, Mth, Tag); WriteLn;
Schreiben ('Datum ist', Mth, '/' Tag '/', Yr,'. ');
WriteLn ('Zeit ist', Hr,': ', Min:2,': ', Sec:2,'. ');
Schreiben ('(BTW, ist Ihre RTC in ');
IF (ReadReg($B) 2) <> 2 dann Write ('12') anderes Schreiben ('24');
Schreiben ('-Stunden-Modus verwenden ');
IF (ReadReg($B) und 4) <> 4 dann Write('BCD') sonst Write('binary');
WriteLn (' Format.)');
Ende {RClock}.


Real-Time-Chip in pmode

Real-Time-Chip in pmode : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Real-Time-Chip in pmode
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung