-
Notifications
You must be signed in to change notification settings - Fork 5
/
CKCMOS.PAS
124 lines (116 loc) · 3.37 KB
/
CKCMOS.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
112
113
114
115
116
117
118
119
120
121
122
123
124
{ @author: Sylvain Maltais ([email protected])
@created: 2022
@website(https://www.gladir.com/corail)
@abstract(Target: Turbo Pascal)
}
Program CKCMOS;
Const
RTCAdrPort:Byte=$70;
RTCDtaPort:Byte=$71;
Var
Mode:(_None,_Save,_Restore,_ShowClock);
I,J:Integer;
ByteReaded:Integer;
FileName:String;
Buffer:Array[0..63] of Byte;
FileCMOS:File{$IFDEF FPC}of Byte{$ENDIF};
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('CKCMOS : Cette commande permet de sauvegarder ou restaurer les données du CMOS du système.');
WriteLn;
WriteLn('Syntaxe : CKCMOS nomdufichier /T:action');
WriteLN(' CKCMOS /SHOWCLOCK');
WriteLn;
WriteLn(' nomdufichier Le fichier a lire ou modifier');
WriteLn(' /T:s Sauvegarde le CMOS dans un fichier');
WriteLn(' /T:rs Copie un fichier dans le CMOS');
WriteLn(' /AMDEK Utilise l''adresse d''un AMDEK SYSTEM/88');
WriteLn(' /SHOWCLOCK Affiche l''heure contenu dans le CMOS');
End
Else
Begin
Mode:=_None;
FileName:='';
For I:=1 to ParamCount do Begin
If(StrToUpper(ParamStr(I))='/AMDEK')Then Begin
RTCAdrPort:=$E0;
RTCDtaPort:=$E1;
End
Else
If(StrToUpper(ParamStr(I))='/SHOWCLOCK')Then Mode:=_ShowClock;
If(ParamStr(I)='/T:s')Then Mode:=_Save Else
If(ParamStr(I)='/T:rs')Then Mode:=_Restore
Else FileName:=ParamStr(I);
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
If FileName=''Then WriteLN('Nom de fichier attendu !')
Else
Case Mode Of
_Save:Begin
For J:=0 to 63 do Buffer[J]:=CMOSRead(J);
Assign(FileCMOS,FileName);
{$I-}ReWrite(FileCMOS,1);{$I+}
If IOResult<>0Then Begin
WriteLn('Fichier introuvable ou impossible a ecrire !');
Halt;
End;
{$I-}Seek(FileCMOS,0);
BlockWrite(FileCMOS,Buffer,64);{$I+}
If IOResult<>0 Then Begin
WriteLn('Impossible d''ecrire le fichier');
Halt;
End;
End;
_Restore:Begin
{$I-}Assign(FileCMOS,FileName);
Reset(FileCMOS,1);{$I+}
If IOResult<>0Then Begin
WriteLn('Fichier introuvable ou impossible a lire !');
Halt;
End;
Seek(FileCMOS,0);
BlockRead(FileCMOS,Buffer,SizeOf(Buffer),ByteReaded);
Close(FileCMOS);
For J:=0 to 63 do CMOSWrite(J,Buffer[J]);
End;
End;
End;
END.