; *******************************
; *             Dir             *
; * Written in 1991 by N.Tausch *
; *        Public Domain        *
; *******************************

ExecBase:       equ 4
OldOpenLibrary: equ -408
CloseLibrary:   equ -414
Output:                         equ -60
Write:                          equ -48
Lock:                           equ -84
UnLock:                         equ -90
Examine:        equ -102
ExNext:                         equ -108
Shared_Lock:    equ -2

                movem.l a0/d0,-(sp)    ; Parameter retten
                move.l ExecBase,a6     ; dos.library öffnen
                lea DosName,a1
                jsr OldOpenLibrary(a6)
                move.l d0,DosBase      ; DosBase sichern
                tst.l d0               ; Ist ein Fehler aufgetreten?
                beq.w LibraryError     ; Dann Verzweige
                move.l DosBase,a6
                jsr Output(a6)         ; OutputHandle holen
                move.l d0,OutputHandle ; und sichern
                movem.l (sp)+,a0/d0    ; Parameter vom Stack
                subi.b #1,d0
                clr.b 0(a0,d0)         ; terminiere Parameter mit 0-Byte
                tst.l d0               ; ist ein Parameter vorhanden?
                beq.w Fehler           ; Nein? Dann verzweige
                move.l a0,d1           ; Parameter für Lockfunktion nach d1
                move.l #Shared_Lock,d2 ; Shared_Lock nach d2
                jsr Lock(a6)           ; Lock besorgen
                move.l d0,FileLock     ; und sichern
                tst.l d0               ; Ging was schief?
                beq.w Fehler           ; Ja? Dann Verzeige
                move.l FileLock,d1     ; Lock nach d1
                move.l #FIBlock,d2     ; Platz für FileInfoBlock nach d2
                jsr Examine(a6)        ; File-Information holen
                tst.l d0               ; Ist ein Fehler aufgetreten?
                beq.w Fehler           ; Ja? Dann verzweige
                move.l FIBlock+4,d1    ; File-Type nach d1 (Dir o. File)
                cmp.l #0,d1            ; Testen ob FileName=Directory
                bmi.w KeinDirectory    ; Wenn Nein? Dann Fehlertext schreiben
Schleife:
                move.l FileLock,d1     ; Lock nach d1
                move.l #FIBlock,d2     ; Platz für FIBlock nach d2
                jsr ExNext(a6)         ; Nächsten Eintrag holen
                tst.l d0               ; Ging was schief?
                beq.s SchleifenEnde    ; Ja? Dann gehe zum Schleifenende
                move.l OutputHandle,d1 ; OutputHandle nach d1
                move.l #LeerEnde,d2    ; Vier Leerzeichen_Text nach d2
                move.l #LeerEnde2-LeerEnde,d3   ; die Länge nach d3
                jsr Write(a6)          ; und schreiben
                move.l OutputHandle,d1
                move.l #FIBlock+8,d2   ; FileNamen schreiben
                move.b #FIBlock+86-FIBlock+8,d3
                jsr Write(a6)
                move.l FIBlock+4,d1    ; Nochmals Eintragungstyp holen
                cmp #0,d1              ; Ist es ein Directory?
                bmi.s Schleife2        ; Nein? Dann verzweige
                move.l OutputHandle,d1 ; schreibe "Directory"
                move.l #LeerEnde2,d2
                move.l #DirEnde2-LeerEnde2,d3
                jsr Write(a6)
Schleife2:
                move.l FIBlock+4,d1    ; Und wiederum Eintragungstyp holen
                cmp #0,d1              ; Ist es ein Directory?
                bpl.s Schleife3        ; Ja? Dann verzweige
                move.l OutputHandle,d1 ; Vier Leerezichen schreiben
                move.l #LeerEnde,d2
                move.l #LeerEnde2-LeerEnde,d3
                jsr Write(a6)
                jsr LeerZeichen        ; return-Code schreiben
Schleife3:
                jmp Schleife           ; Springe zum Schleifenanfang

SchleifenEnde:
                move.l FileLock,d1
                jsr UnLock(a6)         ; File-Lock wieder freigeben
                move.l ExecBase,a6     ; dos.library schließen
                move.l DosBase,a1
                jsr CloseLibrary(a6)

LibraryError:
                clr.l d0
                rts                                                             ; Zurück

Fehler:
                move.l OutputHandle,d1 ; Fehlertext schreiben
                move.l #FehlerText,d2
                move.l #FehlerTextEnde-FehlerText,d3
                jsr Write(a6)
                rts

KeinDirectory:
                move.l OutputHandle,d1 ; Kein Directory-Fehler-
                move.l #FehlerTextEnde,d2 ; Text schreiben
                move.l #DirEnde-FehlerTextEnde,d3
                jsr Write(a6)
                rts

LeerZeichen:
                move.l OutputHandle,d1 ; Einen Returncode
                move.l #VerEnde,d2     ; schreiben
                move.l #LeerEnde-VerEnde,d3
                jsr Write(a6)
                rts

; ****************** Daten *****************

DosBase:        dc.l 0
DosName:        dc.b "dos.library",0
FIBlock:        ds.b 260
OutputHandle:   dc.l 0
FileLock:       dc.l 0
FehlerText:
                dc.b "Es ist ein Fehler aufgetreten !!",10
                dc.b "  Benutze folgendes Format: <Dir Pfad>",10
FehlerTextEnde:
                dc.b "Es wurde als Parameter kein Directory-Name angegeben !!",10
                dc.b " Benutze folgendes Format: <Dir Pfad>",10
DirEnde:
VerEnde:
                dc.b 10
LeerEnde:
                dc.b "    "
LeerEnde2:
                dc.b $9b,"33m","  (Directory)",$9b,"0m",10
DirEnde2:
                end
