       Idnt    _Open
       Section _Fopen,Code
       Xref    Dosbase
       Xref    IoResult
       Xref    IoCheck
       Xref    Error
       Xdef    FOpen
       Xdef    FileTab

   ; --------------------------------
   ; - FOpen : Ein File mit Namen und Modus öffnen
   ; -
   ; - Stand : 07-Aug-93
   ; -
   ; -         RTS.l String(256) 0.w [Adresse Filevar]
   ; -         D2 = Modus
   ; -       
   ; - Die Null steht da, um 255-Byte lange Strings mit einem 0
   ; - beenden zu können.

FOpen move.l      (a7)+,a4   ; Rts - Adresse abheben
      Clr.l   IoResult   ; Ergebnis = Ok
      Moveq       #0,d4             ; Zähler
      move.b      (a7),d4      ; Länge des Strings
      addq.l      #1,d4      ; +1 (Längenbyte am Anfang )
      clr.b       (a7,d4)      ; Nullbyte ans Ende des Strings setzen
      lea         1(a7),a1
      move.l      a1,d1             ; Adresse String auf Stack
      move.l      Dosbase,a6
      jsr         -30(a6)
      adda.l      #258,a7      ; 256 Byte String + 2 Byte (0.w)
      Move.l      (sp)+,a0   ; Adresse Filevar
      Move.l      d0,(a0)      ; Ergebnis in die Var
      tst.l      d0      ; D0 = 0 --> Fehler beim Öffnen
      beq.s      FOfehler   ; Fehler !

  ; ---------------------------
  ; In die Tabelle eintragen

      Moveq     #0,d2      ; Zähler max. Felder (Index)
      Lea       FileTab,A1   ; Adresse 1. Feld
Tstl  Tst.l     (a1,d2)      ; Teste ob Filehandle Platz hat
      beq.s   Save      ; Platz frei, speichern
      addq.l   #4,d2      ; nächstes Feld
      Cmp.w     #128,d2      ; Tabelle durchsucht ?
      Beq.s     FTErr      ; Ja, Kein Platz mehr
      bra.s     Tstl
Save  Move.l    d0,(a1,d2)

      clr.l      IoResult   ; Kein Fehler, IOResult=0
FOrts jmp    (a4)
   
   ; Nun ist ein Fehler aufgetreten , also
   ; Fehlernummer ermitteln und abspeichern
FOfehler
       Jsr     -132(a6)          ; IOErr
       move.l  d0,IoResult
       tst.l   IoCheck      ; IO-Behandlung im Compiler ?
       beq     FOrts      ; Ja
       Move.l  a4,-(sp)      ; Nein, Adresse des Fehlers ablegen
       Jmp     Error

   ; Fehler: Tabelle ist voll
FTErr  Moveq   #4,d0   
       Move.l  a4,-(sp)
       Jmp     Error
   ; ---------------------------
   ; Tabelle für max. 30 Filedescriptoren
   ; Tabellenfeld = 0 --> noch leer

FileTab      dc.l 0,0,0,0,0,0
       dc.l 0,0,0,0,0,0
      dc.l 0,0,0,0,0,0
      dc.l 0,0,0,0,0,0
      dc.l 0,0,0,0,0,0
      dc.l 0,0         ; Abbruch forcieren





       End


