; Een directory-commando dat sneller en korter is dan de originele die op de
; Workbench-diskette staat.
;
; Als eerste kijken we of een parameter meegegeven is, of dat we de standaard
; directory moeten bekijken.

o:      cmp.b     #1,d0       ; Geen parameters.
        bls.s     nofile      ; Dus gaan we SYS: bekijken.
        lea       naam,a1     ; String voor de naam naar A1.
search: move.b    (a0)+,d1    ; Kopieer een karakter uit de invoerbuffer.
        cmp.b     #$0a,d1     ; Is dat al de RETURN ?
        beq.s     found       ; Ja, gevonden.
        move.b    d1,(a1)+    ; Anders karakter in string kopieeren.
        bra.s     search      ; Volgende karakter bekijken.
found:  clr.b     (a1)+       ; Een 0 aan het einde van de string zetten.

; Nadat we de naam hebben moeten we het device gaan openen.

nofile: movem.l   d0-d7/a0-a6,-(sp) ; Registers opslaan.
        move.l    4,a6        ; Execbase in A6.
        lea       dosnaam,a1  ; Naam = dos.library.
        jsr       -408(a6)    ; OPENLIBRARY aanroepen.
        move.l    d0,a5       ; Pointer bewaren in A5.
        move.l    #naam,d1    ; Wijzer naar de naam van het device.
        move.l    #-2,d2      ; Modus.
        jsr       -84(a5)     ; LOCK aanroepen.
        move.l    d0,d5       ; Adres opslaan.
        tst.l     d0          ; Fout gevonden ?
        beq.L     error       ; Zo ja, dan stoppen.
        move.l    d0,a4       ; Loch-handle opslaan.

; Laten we nu gaan kijken of de diskette echt aanwezig is.

        move.l    a4,d1       ; Wijzer naar het device
        move.l    #$60000,d2  ; Fileinfoblok in D2.
        jsr       -102(a5)    ; EXAMINE aanroepen.
        tst.l     d0          ; Error ? B.v. geen diskette ?
        beq.L     error       ; Zo ja, dan stoppen.

; De diskette is er, we kunnen dus wat gaan printen. Als eerste wat kleuren-
; codes en de naam van de diskette.

        move.l    #dircode1,d2 ; Kleurencode 1.
        bsr.L     uitvoer     ; Tekst printen.
        move.l    #$60000+8,d2 ; Wijzer naar de filenaam.
        bsr.L     uitvoer     ; Tekst printen.
        move.l    #dircode2,d2 ; Kleurencode 2.
        bsr.L     uitvoer     ; Tekst printen.

; Nu gaan we de eigenlijke file afdrukken in 4 kolommen.

loop2:   moveq    #3,d7       ; 4 Namen op 1 regel.
loop:   move.l    a4,d1       ; Wijzer naar het device.
        move.l    #$60000,d2  ; Fileinfoblok in d2.
        jsr       -108(a5)    ; EXNEXT aanroepen.
        tst.l     d0          ; Error ? B.v. laatste naam ?
        beq.s     error       ; Zo ja, dan stoppen.

; Nu we het blok hebben moeten we eens kijken wat we eigenlijk hebben.

        lea       $60000+8,a2 ; Pointer naar de filenaam.
        lea       filenaam,a3 ; Pointer naar de file-string.
        move.l    $60000+4,d6 ; Eerst eens testen :
        cmp.l     #$-3,d6     ; File of Directory ?
        beq.s     donorm      ; Ja (=File) dus normaal verder.
        move.l    #dircode3,d2 ; Nee (=Dir) dus speciale tekens printen.
        bsr.s     uitvoer     ; En uitvoeren die tekst.

; Nu hebben we een filenaam en moeten deze zo afdrukken dat dat er ook mooi
; uit ziet.

donorm: moveq     #18,d0      ; Maximaal 18 tekens per naam.
copy:   move.b    (a2)+,d1    ; Eerste karakter kopieeren.
        tst.b     d1          ; Einde van de naam ?
        beq.s     copy2       ; Ja => Weg hier.
        move.b    d1,(a3)+    ; Karakter kopieeren.
        dbra      d0,copy     ; En naar de volgende karakter.
        bra.s     doit        ; Weg hier.
copy2:  move.b    #$20,(a3)+  ; De rest met spaties opvullen.
        dbra      d0,copy2    ; Aantal staat nog in D2.
doit:   move.l    #filenaam,d2 ; Filenaam-pointer in D2.
        bsr.s     uitvoer     ; Afdrukken.

; Als het een directory was dan moeten we nog wat kleuren-codes afdrukken.

        cmp.l     #$-3,d6     ; Test of Directory
        beq.s     doit2       ; Nee, dus normaal verder.
        move.l    #dircode4,d2 ; Terug naar normaal.
        bsr.s     uitvoer     ; Tekst afdrukken.
doit2:  dbra      d7,loop     ; Verder in de lus.
        move.l    #rcode,d2   ; RETURN in d2
        bsr.s     uitvoer     ; Tekst afdrukken.
        bra.s     loop2       ; En weer verder met de volgende.

; Nog een RETURN afdrukken en dan terug naar de CLI.

error:  move.l    #rcode,d2   ; RETURN in d2
        bsr.s     uitvoer     ; Tekst afdrukken.
        jsr       -132(a5)    ; DosCall IOERR
        move.l    d0,d6       ; Verplaats de error-pointer
        move.l    a5,a1       ; Dos.library
        jsr       -414(a6)    ; ExecCall CLOSELIB
        movem.l   (sp)+,d0-d7/a0-a6 ; Registers terug halen.
        rts                   ; Einde....

; Nu nog een kleine routine die de teksten afdrukt in het CLI-scherm en niet
; zo maar ergens.

uitvoer:move.l    d2,a0       ; String in A0 zetten.
        moveq     #0,d3       ; D3 Leeg maken.
ploop:  tst.b     (a0)+       ; Al de NUL gevonden ?
        beq.s     lus2        ; Ja, dan einde.
        addq.l    #1,d3       ; Lengte plus 1.
        bra.s     ploop       ; Verder in de lus.
lus2:   jsr       -60(a5)     ; Uitvoer via het aktuele kanaal !
        jsr       -48(a5)     ; Tekst uitvoeren.
        rts
        even

; Nu nog wat pointers en teksten.

dosnaam:
        dc.b      'dos.library',0
naam:   dc.b      'SYS:',0    ; Deze dir als er niets opgegeven wordt.
        blk.b     20,0
filenaam:
        blk.b     19,0        ; De filenaam.
        even

; De kleuren-codes.

dircode1: dc.b    $1b,"[42;33;1m Laten we eens kijken naar : '",0
dircode2: dc.b    "' ",$1b,"[0m",$a,0
dircode3: dc.b    $1b,"[32;1m",0
dircode4: dc.b    $1b,"[0m",0
rcode:    dc.b    $a,0
