-
Notifications
You must be signed in to change notification settings - Fork 5
/
CLOCK.PAS
111 lines (102 loc) · 2.79 KB
/
CLOCK.PAS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
{ @author: Sylvain Maltais ([email protected])
@created: 2023
@website(https://www.gladir.com/corail)
@abstract(Target: Turbo Pascal 7)
}
Program CLOCK;
Uses DOS;
Const
RTCAdrPort:Byte=$70;
RTCDtaPort:Byte=$71;
Var
Mode:(_None,_Save,_Restore,_ShowClock,_SystemClock,_WriteClock);
I,J:Integer;
Heure,Min,Sec,CentSec:Word;
Annee,Mois,Jour,JourSemaine:Word;
Function StrToUpper(S:String):String;
Var
I:Byte;
Begin
For I:=1 to Length(S)do Begin
If S[I] in['a'..'z']Then S[I]:=Chr(Ord(S[I])-32);
End;
StrToUpper:=S;
End;
Function CMOSRead(Address:Integer):Integer;Begin
If Address in [0..63]Then Begin
Port[RTCAdrPort]:=Address;
CMOSRead:=Port[RTCDtaPort]
End
Else
CMOSRead:=-1;
End;
Procedure CMOSWrite(Address:Integer;Value:Byte);Begin
Port[RTCAdrPort]:=Address;
Port[RTCDtaPort]:=Value;
End;
Function RTCDT(Address:Integer):Integer;
Var
Value:Integer;
Begin
Value:=CMOSRead(Address);
If(CMOSRead($0B) and 4 = 4)Then RTCDT:=Value
Else RTCDT:=(Value shr 4) * 10 + Value and 15;
End;
BEGIN
If(ParamStr(1)='/?')or(ParamStr(1)='--help')or(ParamStr(1)='-h')Then Begin
WriteLn('CLOCK : Cette commande permet de manipuler l''heure du CMOS.');
WriteLn;
WriteLn('Syntaxe : CLOCK -r');
WriteLn;
WriteLn(' -amdek Utilise l''adresse d''un AMDEK SYSTEM/88');
WriteLn(' -r Affiche l''heure contenu dans le CMOS');
WriteLn(' -s Ecrit l''heure CMOS dans le systŠme d''exploitation');
WriteLn(' -w Ecrit l''heure du systŠme d''exploitation dans le CMOS');
End
Else
Begin
Mode:=_None;
For I:=1 to ParamCount do Begin
If(ParamStr(I)='-amdek')Then Begin
RTCAdrPort:=$E0;
RTCDtaPort:=$E1;
End
Else
If(ParamStr(I)='-r')Then Mode:=_ShowClock Else
If(ParamStr(I)='-s')Then Mode:=_SystemClock Else
If(ParamStr(I)='-w')Then Mode:=_WriteClock
Else
Begin
WriteLn('ParamŠtre non reconnu');
Halt;
End;
End;
If(Mode=_ShowClock)Then Begin
If CMOSRead($0E) and 128 = 0 Then Begin
WriteLn('L''horloge est exploitee en mode ',(CMOSRead($0B) and 2)*6+12,' heures');
WriteLn('Il est : ', RTCDT($04), ':', RTCDT($02):2,':', RTCDT($00):2);
WriteLn('Nous sommes le : ',RTCDT($32), RTCDT($09),'-',RTCDT($08),'-',RTCDT($07));
end
Else
WriteLn('ATTENTION ! Impossible de connaitre l''heure. Les piles de l''horloge sont vides');
End
Else
Case Mode Of
_SystemClock:Begin
SetDate(RTCDT($09),RTCDT($08),RTCDT($07));
SetTime(RTCDT($04),RTCDT($02),RTCDT($00),0);
End;
_WriteClock:Begin
GetTime(Heure,Min,Sec,CentSec);
CMOSWrite($04,Heure);
CMOSWrite($02,Min);
CMOSWrite($00,Sec);
GetDate(Annee,Mois,Jour,JourSemaine);
CMOSWrite($09,Annee);
CMOSWrite($08,Mois);
CMOSWrite($07,Jour);
End;
Else WriteLn('ParamŠtre attendu.');
End;
End;
END.