. Real Time Chip i PMode

Hvordan få tilgang til Realtime Chip fra Beskyttet modus
bidragsyter: GREG Vigneault product: {MD > Hva ville noen her anbefale som å være den beste måten for DOS > beskyttet modus for å få det aktuelle klokkes dag * uten * pokkers > tilbake til det virkelige modus for å lage en standard DOS ringe
Hvis koden er lov til å snakke med sanntidsklokke (RTC) chip, her er noen eksempel kode for å få tilgang til RTC direkte?. Funksjonene jobbe utelukkende med 24-timers tidsformat (hvis nødvendig, internt av RTC, de oversette mellom 12/24-timers ganger og binære /BCD formater) ...} plakater (******** ************************************************** *********) PROGRAM RClock; {Få /Set Time /Date direkte fra RTC chip} {9. juni 1994. Greg Vigneault} TYPE Treg = 0 .. $ D; {Utvalg for tid /dato registeradresser} To23 = 0..23; {Utvalg i timevis} To59 = 0..59; {Spekter i minutter og sekunder} VAR Yr, MTH, Day, Dow, HR, Min, Sec: BYTE;
FUNKSJON RTCbusy: boolean; BEGIN Port [$ 70] {RTC tid /dato oppdateres ...?}: = $ A;; RTCbusy: = (Port [$ 71] OG 128) = 128; END {RTCbusy};
FUNKSJON ReadReg (Reg: Treg): BYTE; BEGIN {lese en RTC registrere ...} IF Reg IN [0..9] Så gjentar {vente} TIL IKKE RTCbusy; Port [$ 70]: = Reg;; ReadReg: = Port [$ 71]; END {ReadReg};
PROSEDYRE WriteReg (Reg: Treg, Data: BYTE); {Skrive RTC reg ...} VAR temp: BYTE; BEGIN IF Reg IN [0..9] deretter begynne {tid /dato reg? } REPEAT {vente} TIL IKKE RTCbusy; Port [$ 70]: = $ B;; temp: = Port [$ 71];; Port [$ 71]: = temp ELLER $ 80; END {IF}; Port [$ 70]: = Reg;; Port [$ 71]: = data; IF Reg IN [0..9] deretter begynne Port [$ 70]: = $ B;; Port [$ 71]: = temp OG IKKE $ 80; END {IF}; END {WriteReg};
FUNKSJON BCD2Bin (BCD: BYTE): BYTE; BEGIN {xlate BCD til binær ...} BCD2Bin: = (BCD OG $ 0F) + ((BCD SHR 4) * 10); END {BCD2Bin}; FUNKSJON Bin2BCD (Bin: BYTE): BYTE; BEGIN {xlate binær til BCD ...} Bin2BCD: = (Bin MOD 10) ELLER BYTE ((Bin DIV 10) SHL 4); END {Bin2BCD};
PROSEDYRE getTime (VAR Hr, Min, Sec: BYTE); VAR temp: BYTE; BEGIN Sec: = ReadReg (0);; Min: = ReadReg (2); Hr: = ReadReg (4);; temp: = Hr;; Hr: = Hr OG IKKE $ 80; IF (ReadReg ($ B) og 4) < > 4 deretter begynne {xlate BCD til bin ...} Sec: = BCD2Bin (Sec);; Min: = BCD2Bin (Min);; Hr: = BCD2Bin (Hr); END {IF}; IF (ReadReg ($ B) og 2) < > 2 SÅ {RTC i 12-timers modus? ...} IF (temp OG 128) = 128 {P.M.? } Deretter begynne IF (Hr < 12) SÅ INC (Hr, 12); END ELSE IF Hr = 12 THEN Hr: = 0; END {getTime};
PROSEDYRE fulls (Hr: To23, Min, Sec: To59); VAR temp: BYTE; BEGIN temp: = BYTE (Hr); IF (ReadReg ($ B) og 2) < > 2 SÅ {RTC i 12-timers modus ...?} IF (Hr > 12) SÅ DEC (Hr, 12) ELSE IF Hr = 0, så Hr: = 12; IF (ReadReg ($ B) og 4) < > 4 deretter begynne {RTC ønsker BCD format ...} Hr: = Bin2BCD (Hr);; Min: = Bin2BCD (Min);; Sec: = Bin2BCD (Sec); END {IF}; IF ((ReadReg ($ B) og 2) < > 2) og (temp > 11) SÅ Hr: = Hr ELLER $ 80; WriteReg (0, Sec);; WriteReg (2 min);; WriteReg (4, Hr); END {fulls};
PROSEDYRE getdate (VAR Yr, Mnd, Dag: BYTE); Begynn dagen: = ReadReg (7);; Mnd: = ReadReg (8);; Yr: = ReadReg (9); IF (ReadReg ($ B) og 4) < > 4 deretter begynne {xlate BCD til Binay ...} Day: = BCD2Bin (Day);; Mnd: = BCD2Bin (mnd);; Yr: = BCD2Bin (yr); END; {IF} END {getdate};
PROSEDYRE setDate (Yr, Mnd, Dag: BYTE); BEGIN IF (ReadReg ($ B) og 4) < > 4 deretter begynne {RTC ønsker BCD format ...} Day: = Bin2BCD (Day);; Mnd: = Bin2BCD (mnd);; Yr: = Bin2BCD (yr); END {IF}; WriteReg (7 Day);; WriteReg (8 Mnd);; WriteReg (9 år); END {setDate};
BEGIN {RClock} getTime (Hr, Min, Sec);; Getdate (Yr, Mnd, Day);; WriteLn; Skriv ('Date er ", Mnd,' /', Day,' /', Yr,'. '); WriteLn ('Time er ", Hr,': ', Min: 2,': ', Sec: 2,'. '); Skriv ('(BTW, er din RTC i'); IF (ReadReg ($ B) og 2) < > 2 SÅ skrive ('12') ELSE Write ('24'); skrive ('-timers modus ved hjelp '); IF (ReadReg ($ B) og 4) < > 4 og deretter skrive (' BCD ') ELSE Write (' binære '); WriteLn (' format). '); END {RClock}. Anmeldelser



Previous:
Next Page: