{************************************************}
{ }
{ CMOS Backup Utility }
{ Backups CMOS data and restores it }
{ (c) 2001 by oraculozeus@hotmail.com }
{ }
{************************************************}
Program CMOSBackup;
{ This program was not fully tested. YOU ARE USING IT AT YOUR OWN RISK. }
Const
{ CMOS data file ID string }
CMOSBackupID : Array[1..5] Of Char = 'CBID' + #1;
Var
F : File; { File variable }
i : Byte; { Counter }
j : Word; { One temporary variable }
Checksum : Word; { File checksum }
CMOSData : Array[0..$7F] Of Byte; { Full CMOS data }
LastKey : Char; { Last pressed key }
Function UpperStr(Str : String) : String;
Var
Run : Byte;
Temp : String;
Begin
Temp := '';
For Run := 1 To Length(Str) Do Temp := Temp + UpCase(Str[Run]);
UpperStr := Temp;
End; { UpperStr }
Procedure CalculateChecksum;
Begin
Checksum := 0;
For i := 0 To $7F Do Inc(Checksum, CMOSData[i]);
End; { CalculateChecksum }
Procedure Help;
Begin
Writeln('This program can be used to backup and recover CMOS data');
Writeln;
Writeln('Usage: CMOS /switch');
Writeln('Switch can be:');
Writeln(' /b - backup CMOS');
Writeln(' /r - recover CMOS');
Writeln(' /? - this help');
Halt;
End; { Help }
Procedure CMOSIn(Which : Byte);
Var
Temp : Byte;
Begin
Asm
mov dx,70h
mov al,Which
out dx,al
inc dx
in al,dx
mov Temp,al
End;
CMOSData[Which] := Temp;
End; { CMOSIn }
Procedure CMOSOut(Which : Byte);
Var
Temp : Byte;
Begin
Temp := CMOSData[Which];
Asm
mov dx,70h
mov al,Which
out dx,al
inc dx
mov al,Temp
out dx,al
End;
End; { CMOSOut }
Function ReadKey : Char; assembler;
Asm
mov ah,00h
int 16h
End; { ReadKey }
Function AskUser(Message : String) : Boolean;
Begin
Write(Message);
Repeat
LastKey := ReadKey;
Until (Upcase(LastKey) = 'Y') Or (Upcase(LastKey) = 'N');
If Upcase(LastKey) = 'Y' Then AskUser := True Else AskUser := False;
End; { AskUser }
Procedure BackupCMOS;
Begin
{ Assign file }
Assign(F, 'CMOS!!!!.DAT');
Rewrite(F, 1);
{ Read CMOS data and calculate checksum }
For i := 0 To $7F Do CMOSIn(i);
CalculateChecksum;
{ Write the data }
BlockWrite(F, CMOSBackupID, SizeOf(CMOSBackupID));
BlockWrite(F, Checksum, SizeOf(Checksum));
BlockWrite(F, CMOSData, SizeOf(CMOSData));
{ Finish access to file }
Close(F);
End; { BackupCMOS }
Procedure RecoverCMOS;
Var
Temp : Array[1..5] Of Char;
Begin
{ Assign file }
Assign(F, 'CMOS!!!!.DAT');
{$I-}
Reset(F, 1);
{$I+}
{ File not exist? }
If IOResult <> 0 Then
Begin
Writeln('File CMOS!!!!.DAT not found');
Halt;
End;
{ Check file size }
If FileSize(F) <> 135 Then
Begin
Writeln('File CMOS!!!!.DAT has invalid size - it may not contain CMOS data');
Halt;
End;
{ Check file ID string }
BlockRead(F, Temp, SizeOf(Temp));
If Temp <> CMOSBackupID Then
Begin
If Not AskUser('Invalid file ID - this file may not contain CMOS data. Continue (Y/N)?') Then
Begin
Writeln;
Halt;
End;
Writeln;
End;
{ Load CMOS data and calculate checksum }
BlockRead(F, j, SizeOf(j));
BlockRead(F, CMOSData, SizeOf(CMOSData));
CalculateChecksum;
If Checksum <> j Then
Begin
If Not AskUser('Invalid checksum - file may be corrupted. Continue (Y/N)?') Then
Begin
Writeln;
Halt;
End;
Writeln;
End;
{ Finish access to file }
Close(F);
{ Restore CMOS data }
Writeln('Restoring CMOS data...');
For i := 0 To $7F Do CMOSOut(i);
End; { RecoverCMOS }
Begin
Writeln('CMOS Backup Program Version 1.0 Copyright (c) 2001 by MediaWorks Entertainment');
If (ParamStr(1) = '') Or (ParamStr(1) = '/?') Then Help
Else If UpperStr(ParamStr(1)) = '/B' Then BackupCMOS
Else If UpperStr(ParamStr(1)) = '/R' Then RecoverCMOS
Else Help;
End. { CMOS.PAS }
{ }
{ CMOS Backup Utility }
{ Backups CMOS data and restores it }
{ (c) 2001 by oraculozeus@hotmail.com }
{ }
{************************************************}
Program CMOSBackup;
{ This program was not fully tested. YOU ARE USING IT AT YOUR OWN RISK. }
Const
{ CMOS data file ID string }
CMOSBackupID : Array[1..5] Of Char = 'CBID' + #1;
Var
F : File; { File variable }
i : Byte; { Counter }
j : Word; { One temporary variable }
Checksum : Word; { File checksum }
CMOSData : Array[0..$7F] Of Byte; { Full CMOS data }
LastKey : Char; { Last pressed key }
Function UpperStr(Str : String) : String;
Var
Run : Byte;
Temp : String;
Begin
Temp := '';
For Run := 1 To Length(Str) Do Temp := Temp + UpCase(Str[Run]);
UpperStr := Temp;
End; { UpperStr }
Procedure CalculateChecksum;
Begin
Checksum := 0;
For i := 0 To $7F Do Inc(Checksum, CMOSData[i]);
End; { CalculateChecksum }
Procedure Help;
Begin
Writeln('This program can be used to backup and recover CMOS data');
Writeln;
Writeln('Usage: CMOS /switch');
Writeln('Switch can be:');
Writeln(' /b - backup CMOS');
Writeln(' /r - recover CMOS');
Writeln(' /? - this help');
Halt;
End; { Help }
Procedure CMOSIn(Which : Byte);
Var
Temp : Byte;
Begin
Asm
mov dx,70h
mov al,Which
out dx,al
inc dx
in al,dx
mov Temp,al
End;
CMOSData[Which] := Temp;
End; { CMOSIn }
Procedure CMOSOut(Which : Byte);
Var
Temp : Byte;
Begin
Temp := CMOSData[Which];
Asm
mov dx,70h
mov al,Which
out dx,al
inc dx
mov al,Temp
out dx,al
End;
End; { CMOSOut }
Function ReadKey : Char; assembler;
Asm
mov ah,00h
int 16h
End; { ReadKey }
Function AskUser(Message : String) : Boolean;
Begin
Write(Message);
Repeat
LastKey := ReadKey;
Until (Upcase(LastKey) = 'Y') Or (Upcase(LastKey) = 'N');
If Upcase(LastKey) = 'Y' Then AskUser := True Else AskUser := False;
End; { AskUser }
Procedure BackupCMOS;
Begin
{ Assign file }
Assign(F, 'CMOS!!!!.DAT');
Rewrite(F, 1);
{ Read CMOS data and calculate checksum }
For i := 0 To $7F Do CMOSIn(i);
CalculateChecksum;
{ Write the data }
BlockWrite(F, CMOSBackupID, SizeOf(CMOSBackupID));
BlockWrite(F, Checksum, SizeOf(Checksum));
BlockWrite(F, CMOSData, SizeOf(CMOSData));
{ Finish access to file }
Close(F);
End; { BackupCMOS }
Procedure RecoverCMOS;
Var
Temp : Array[1..5] Of Char;
Begin
{ Assign file }
Assign(F, 'CMOS!!!!.DAT');
{$I-}
Reset(F, 1);
{$I+}
{ File not exist? }
If IOResult <> 0 Then
Begin
Writeln('File CMOS!!!!.DAT not found');
Halt;
End;
{ Check file size }
If FileSize(F) <> 135 Then
Begin
Writeln('File CMOS!!!!.DAT has invalid size - it may not contain CMOS data');
Halt;
End;
{ Check file ID string }
BlockRead(F, Temp, SizeOf(Temp));
If Temp <> CMOSBackupID Then
Begin
If Not AskUser('Invalid file ID - this file may not contain CMOS data. Continue (Y/N)?') Then
Begin
Writeln;
Halt;
End;
Writeln;
End;
{ Load CMOS data and calculate checksum }
BlockRead(F, j, SizeOf(j));
BlockRead(F, CMOSData, SizeOf(CMOSData));
CalculateChecksum;
If Checksum <> j Then
Begin
If Not AskUser('Invalid checksum - file may be corrupted. Continue (Y/N)?') Then
Begin
Writeln;
Halt;
End;
Writeln;
End;
{ Finish access to file }
Close(F);
{ Restore CMOS data }
Writeln('Restoring CMOS data...');
For i := 0 To $7F Do CMOSOut(i);
End; { RecoverCMOS }
Begin
Writeln('CMOS Backup Program Version 1.0 Copyright (c) 2001 by MediaWorks Entertainment');
If (ParamStr(1) = '') Or (ParamStr(1) = '/?') Then Help
Else If UpperStr(ParamStr(1)) = '/B' Then BackupCMOS
Else If UpperStr(ParamStr(1)) = '/R' Then RecoverCMOS
Else Help;
End. { CMOS.PAS }
Comment