
Program
  SaveBB;

Uses
  ExecIO;

{$incl 'devices/trackdisk.h'}

Const
  version = "$VER: SaveBB 1.0 (22.06.94) © by G.M.A.";

Var
  msg_port : p_MsgPort;                   { Zeiger auf unseren Message-Port }
  ioreq    : p_IOExtTD;         { Zeiger auf erweiterte IO-Request-Struktur }
  buffer   : ^Array[1..512*2] Of Byte;           { Buffer für Daten des BBs }
  lw       : Byte;                                           { Drive-Nummer }
  error    : Integer;     { Ist Fehler aufgetreten ? - Wird nicht getestet. }
  i        : Integer;                                        { Für Schleife }
  datei    : Text;                                            { Dateihandle }
  name     : String[80];                                        { Dateiname }


Procedure alles_zu;
Begin
  Close_Device (ioreq);                    { und trackdisk.device schließen }
  DeleteExtIO (ioreq);
  DeletePort (msg_port);                     { Messageport wieder entfernen }
End;


Begin
  lw := 0;                                            { Laufwerk 0 benutzen }

  msg_port := CreatePort ('SaveBB-Port', 0);          { Messageport anlegen }
  ioreq := CreateExtIO (msg_port, SizeOf(IOExtTD));
  Open_Device ('trackdisk.device', lw, ioreq, 0); { trackdisk.device öffnen }

  ioreq^.iotd_req.io_Command := TD_CHANGESTATE;    { Ist Disk im Laufwerk ? }
  error := DoIO (ioreq);
  If Not (ioreq^.iotd_req.io_Actual = 0) Then Begin
    WriteLn ('Keine Diskette in df0: !');
    alles_zu;
    Halt (0);
  End;

  ioreq^.iotd_req.io_Command := TD_PROTSTATUS;       { Schreibschutz testen }
  error := DoIO (ioreq);
  If (ioreq^.iotd_req.io_Actual <> 0) Then Begin
    WriteLn ('Diskette ist schreibgeschützt !');
    alles_zu;
    Halt (0);
  End;

  Buffer := Ptr(Alloc_Mem(512 * 2, 2));            { Chip-Memory allokieren }
  With ioreq^.iotd_req Do Begin
    io_Command := CMD_READ;
    io_Data    := Buffer;                              { Hier Daten ablegen }
    io_Length  := 512 * 2;                                 { 2 Blöcke lesen }
    io_Offset  := 0              { Hier mit Lesen beginnen, Offset in Bytes }
  End;
  error := DoIO (ioreq);

  With ioreq^.iotd_req Do Begin                    { noch Motor ausschalten }
    io_Command := TD_MOTOR;
    io_Length := 0;
  End;
  error := DoIO (ioreq);

  Write ("Dateiname = "); ReadLn (name);

  ReSet(datei, name);
  If IOResult = 0 Then Begin
    WriteLn ("Datei ", name, " existiert schon !");
    Close (datei);
    alles_zu;
    Halt (0);
  End;

  ReWrite(datei, name);
  If IOResult <> 0 Then Begin
    WriteLn ("Konnte Datei ", name, " nicht öffnen !");
    alles_zu;
    Halt (0);
  End;

  If error <> 0 Then                         { Wenn kein Fehler auftrat ... }
    Writeln ('Ein Fehler ist aufgetreten: ', error)
  Else Begin                                         { ... Daten bearbeiten }
    For i := 1 To 1024 Do                           { Jedes Byte bearbeiten }
      Write (datei, Chr(Buffer^[i]))                           { = ausgeben }
  End;
  Free_Mem (Long(Buffer), 512 * 2);

  alles_zu;
  Close (datei);                                   { Datei wieder schließen }
End.


