Bon alors, voilà deux fonctions, une qui charge un fichier Ti et une autre qui le sauvegarde. Ça sera pê plus clair pour voir ce qu'il faut lire et combien d'octets ça prend. La première fonction (load) vérifie si le checksum est correct, cf les commentaires que j'ai ajouté à la fin. La fonction save ne le recalcule pas, puisque le programme ne servait pas à modifier le fichier et donc le checksum n'avait aucune raison de changer.
Les fichiers sont les mêmes sur Ti89 / 92+ (et V200)
Procédure qui ouvre un fichier Ti et lit les données qu'il contient :
procedure LoadFile(name: string);
var i: integer;
buffer: array [0 .. 39] of byte;
fHandle: file;
begin
if (FileExists(name)) then
begin
fName := name;
fMain.LFile.Caption := ExtractFileName(fName);
AssignFile(fHandle,fName);
Reset(fHandle,1);
BlockRead(fHandle,buffer,8); // **TI92P*
BlockRead(fHandle,buffer,2); // Separator
BlockRead(fHandle,buffer,8); // Folder Name
fMain.EFold.Text := ByteToString(buffer,8);
BlockRead(fHandle,buffer,40); // Comment
fMain.MComment.Text := ByteToString(buffer,40);
BlockRead(fHandle,buffer,6); // Separator
BlockRead(fHandle,buffer,8); // File Name
fMain.EName.Text := ByteToString(buffer,8);
BlockRead(fHandle,buffer,4); // ? - ? - ? - ? (4 octets inconnus)
BlockRead(fHandle,buffer,4); // File Length
fMain.LNFileLength.Caption := IntToStr(buffer[0] + buffer[1] shl 8 + buffer[2] shl 16 + buffer[3] shl 24);
BlockRead(fHandle,buffer,6); // Separator
BlockRead(fHandle,buffer,2); // Data Length
fChecksum := buffer[0] + buffer[1];
fSize := buffer[0] shl 8 + buffer[1];
fMain.LNDataLength.Caption := IntToStr(fSize);
BlockRead(fHandle,fData,fSize); // Data (le tableau fData reçoit le contenu de la variable telle qu'elle est sur Ti)
for i := 0 to fSize - 1 do Inc(fChecksum,fData[i]); // Calcul du checksum en additionnant tous les octets de fData
BlockRead(fHandle,buffer,2); // Checksum
if (fChecksum = buffer[0] + buffer[1] shl 8) then // Teste si le checksum indiqué dans le fichier est correct
begin
fMain.BCheck.Enabled := False;
fMain.LNCheck.Color := clBtnFace;
end
else
begin
fMain.BCheck.Enabled := True;
fMain.LNCheck.Color := clRed;
end;
CloseFile(fHandle);
fMain.BSave.Enabled := True;
fMain.EName.Enabled := True;
fMain.EFold.Enabled := True;
fMain.MComment.Enabled := True;
fMain.SBar.Panels.Items[0].Text := MsgLoaded;
end
else
begin
fMain.SBar.Panels.Items[0].Text := MsgNotfound;
end;
end;
Procédure qui sauvegarde le contenu d'un tableau (fData) dans un fichier Ti :
procedure TfMain.BSaveClick(Sender: TObject);
var i: Integer;
buffer: array [0 .. 39] of byte;
begin
AssignFile(fHandle,fName);
Rewrite(fHandle,1);
WriteString('**TI92P*',8);
buffer[0] := $01;
buffer[1] := $00;
BlockWrite(fHandle,buffer,2);
WriteString(EFold.Text,8);
WriteString(MComment.Text,40);
buffer[0] := $01;
buffer[1] := $00;
buffer[2] := $52;
buffer[3] := $00;
buffer[4] := $00;
buffer[5] := $00;
BlockWrite(fHandle,buffer,6);
WriteString(EName.Text,8);
buffer[0] := $10;
buffer[1] := $00;
buffer[2] := $00;
buffer[3] := $00;
BlockWrite(fHandle,buffer,4);
i := StrToInt(LNFileLength.Caption); // Taille du fichier
buffer[0] := i and $FF;
buffer[1] := (i shr 8) and $FF;
buffer[2] := (i shr 16) and $FF;
buffer[3] := (i shr 24) and $FF;
BlockWrite(fHandle,buffer,4);
buffer[0] := $A5;
buffer[1] := $5A;
buffer[2] := $00;
buffer[3] := $00;
buffer[4] := $00;
buffer[5] := $00;
BlockWrite(fHandle,buffer,6);
buffer[0] := (fSize shr 8) and $FF; // fSize = taille des données (nbr d'octets dans le tableau fData)
buffer[1] := fSize and $FF;
BlockWrite(fHandle,buffer,2);
BlockWrite(fHandle,fData,fSize); // fData = tableau (équivalent de unsigned char []) qui contient les données (fSize octets)
i := StrToInt(LNCheck.Caption); // CheckSum, déjà calculé à l'ouverture du fichier
buffer[0] := i and $FF;
buffer[1] := (i shr 8) and $FF;
BlockWrite(fHandle,buffer,2);
CloseFile(fHandle);
SBar.Panels.Items[0].Text := MsgSaved;
end;