1

Bonjour.
J'aimerais créer un fichier .89t à partir d'un texte qui se trouve en mémoire. Je voulais savoir si quelqu'un avait déjà écrit ça? Une petite fonction qui écrit un fichier à partir des données fournies? Parce que j'ai trouvé une description du format (je ne sais pas si elle est correcte) mais pour calculer le checksum, je ne suis pas vraiment sûr d'avoir tout compris...
@++
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

2

* Format of TI-92 TEXT

Adress Count Description

0000-0007 8 "**TI92**" text
0008-0009 2 00 01 separator
000A-0011 8 Folder name
0012-0039 40 "Text file..." text
003A-003F 6 01 00 52 00 00 00 separator
0040-0047 8 Variable name
0048-004B 4 0B 00 00 00 separator
004C-004F 4 File length (ex : &97 &01 &00 &00=> &(00 00 01 97) => 407)
0050-0055 6 A5 5A 00 00 00 00 separator
=========================Data=========================
0056-0057 2 Size = bytes to read
0058-0059 2 00 01 separator (?)
005A- x n Text with chr(13) as lign separator
x+1 - x+2 1 End mark = E0
===================================================== x+3 - x+4 2 Checksum from "size" to "end mark" (?)

En gros là t'as toutes les infos nécessaires. Pour le checksum, bah c'est pas compliqué : tu fais la somme de tous les octets du fichier (toute la partie entre les deux lignes de ===) et tu code ça sur un short à la fin du fichier. J'avais fait quelques trucs qui utilisaient des fichiers Ti, notament un pour recalculer le CheckSum, si ça t'interesse je peux poster la source.
C'est du Delphi, assez mal codé, mais ça devrait rester facilement traduisible en C (et encore plus en C++).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Eh bien volontiers, je ne connais pas beaucoup le delphi, mais je jetterais volontiers un coup d'oeil.
En attendant, je vais essayer de coder ça avec les infos que tu m'as données wink
Merci.
[Edit]: Le format n'est pas différent avec les TI92? Parce que j'ai lu qu'il y avait des incompatibilités, mais je ne suis pas sûr... (cependant, les formats 89/92+/V200 sont identiques)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

4

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;
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Ca c'est du complet! Merci. Merci beaucoup, ce n'est pas trop compliqué à comprendre...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741