; ********************************************************************
; *                                                                  *
; *  Tree V1.3    (C) 1988 by M.Stoll & M.Zepf & H.E.Stöffler        *
; *  ---------                                                       *
; *               Program is placed in PUBLIC DOMAIN and may be      *
; *               freely distributed with sourcecode and docu-       *
; *               mentation.                                         *
; *                         Files included in Achive:                *
; *  Use Seka-Assembler.                              - Tree.S       *
; *                                                   - Tree.Doc     *
; *  To contact us: - Write to: Matthias Zepf         - Tree         *
; *                             Riegeläckerstr. 27                   *
; *                      D-7250 Leonberg                             *
; *                             West Germany                         *
; *                                                                  *
; *     - Call:     (+49) 7152 41917 (West Germany)                  *
; *                                                                  *
; *     - Electronic Mail:  (+49) 7031 44788 (ELIAS)                 *
; *                         (+49) 7031 36339 (dateMail)              *
; *                         (+49) 0711 813480 (microTalk/FNet)       *
; *                                                                  *
; *     - UUCP:  Smart:  Agnus@Aragon.UUCP                           *
; *             Domain:  ...!{uunet!mcvax}!unido!altger!aragon!agnus *
; *                                                                  *
; *   Bitte zuerst Tree.doc lesen!     Please read Tree.doc first!   *
; *                                                                  *
; ********************************************************************

openlib     equ   -408
output      equ   -60
input       equ   -54
read        equ   -42
write       equ   -48
lock        equ   -84
unlock      equ   -90
waitforchar equ -204
currentdir  equ -126
examine     equ -102
exnext      equ -108
allocmem    equ -198
freemem     equ -210
parentdir   equ -210
findtask    equ -294
SetSignal   equ -306

_LVOOpen         equ -$1e
_LVOClose        equ -$24
_LVOForbid       equ -$84
_LVOPermit       equ -$8a
_LVOGetMsg       equ -$174
_LVOReplyMsg     equ -$17a
_LVOWaitPort     equ -$180
_LVOCloseLibrary equ -$19e

ExecBase equ 4

pr_MsgPort       equ $5c
pr_CLI           equ $ac
ThisTask         equ $114
VBlankFrequency  equ $212
MODE_OLDFILE     equ 1005


   move.l  a0,adresse
   move.l  d0,comlang

   move.l  ExecBase,a6
   lea     dosname(pc),a1
   moveq   #0,d0
   jsr     openlib(a6)
   move.l  d0,dosbase

          moveq   #0,d0
           movea.l ThisTask(a6),a0
           tst.l   pr_CLI(a0)
           bne.s   isCLI

           lea     pr_MsgPort(a0),a0 for WB get WB Message
           jsr     _LVOWaitPort(a6)
           jsr     _LVOGetMsg(a6)
           move.l  d0,-(a7)

           cmpi.b  #60,VBlankFrequency(a6) test if PAL or NTSC
           beq.s   isNTSC
           move.l  #'256/',window+12

isNTSC     movea.l dosbase(pc),a6
           move.l  #window,d1
           move.l  #MODE_OLDFILE,d2
           jsr     _LVOOpen(a6)
           move.l  d0,outhandle
           move.l  d0,inhandle
           move.l  #1,comlang
           bra.s   start

isCLI      move.l  d0,-(a7)
   movea.l  dosbase(pc),a6
   jsr   output(a6)
   move.l   d0,outhandle
   jsr   input(a6)
   move.l   d0,inhandle

   clr.l   d1
   move.l   adresse(pc),a0
   cmp.l   #0,a0
   beq   Fehler1
start move.l   comlang(pc),d0
   cmp.l   #1,d0
   beq   Current
lab1:   cmp.b   #' ',(a0)+
   bne.s   lab3
   subq.l   #1,d0
   bne.s   lab1
   bra   Fehler1
lab3:   sub.l   #1,a0
   cmp.b   #'?',(a0)
   beq   Fehler2
   lea   name(pc),a1
lab2:   move.b   (a0)+,(a1)+
   cmp.b   #':',-1(a1)
   beq.s   lab4
   subq.l   #1,d0
   bne.s   lab2
   bra   Fehler1
lab4:   clr.b   (a1)
   lea   name(pc),a1
   move.l   a1,d1
   move.l   #-2,d2
   move.l   dosbase(pc),a6
   jsr   lock(a6)
   tst.l   d0
   beq   Fehler3
   move.l   d0,actlock
lab_weiter:
   move.w   #1,lockcount
   move.l   #270,d0
   move.l   #$10001,d1
   move.l   4,a6
   jsr   allocmem(a6)
   move.l   d0,actpuff
   move.l   d0,d2
   move.l   actlock(pc),d1
   move.l   dosbase(pc),a6
   jsr   examine(a6)
   jsr   infoname(pc)
   lea   name(pc),a0
   lea   zeile(pc),a1
   lea   Pfad(pc),a2
su1:   move.b   (a0)+,(a1)+
   move.b   -1(a0),(a2)+
   bne.s   su1
   move.b   #':',-1(a1)
   move.b   #':',-1(a2)
   clr.b   (a1)
   clr.b   (a2)
   jsr   gebaus(pc)
schleife:
   move.l   actlock(pc),d1
   move.l   actpuff(pc),d2
   move.l   dosbase(pc),a6
   jsr   exnext(a6)
stop:   tst.l   d0
   beq   pop
   move.l   actpuff(pc),a0
   tst.l   4(a0)
   bmi   schleife
push:   add.w   #1,lockcount
   jsr   appendname(pc)
   jsr   zeilaus(pc)
   sub.w   #1,lockcount
pushi:   move.l   actlock(pc),d1
   move.l   actpuff(pc),d2
   move.l   dosbase(pc),a6
   jsr   exnext(a6)
   move.l   d0,success
   tst.l   d0
   beq.s   push_setbit
   move.l   actpuff(pc),a0
   tst.l   4(a0)
   bmi   pushi
   clr.l   d0
   move.w   lockcount(pc),d0
   clr.l   d1
   bset   d0,d1
   not.l   d1
   and.l   d1,bitter
   bra.s   pushwei
push_setbit:
   clr.l   d0
   move.w   lockcount(pc),d0
   clr.l   d1
   bset   d0,d1
   or.l   d1,bitter
pushwei:
   add.w   #1,lockcount
   move.l   actlock(pc),-(a7)
   move.l   actpuff(pc),-(a7)
   move.l   success(pc),-(a7)
   move.l   #Pfad,d1
   move.l   #-2,d2
   move.l   dosbase(pc),a6
   jsr   lock(a6)
   move.l   d0,actlock
   move.l   #270,d0
   move.l   #$10001,d1
   move.l   ExecBase,a6
   jsr   allocmem(a6)
   move.l   d0,actpuff
   move.l   d0,d2
   move.l   actlock(pc),d1
   move.l   dosbase(pc),a6
   jsr   examine(a6)
   clr.l   d0
   clr.l   d1
   move.l   4,a6
   jsr   SetSignal(a6)
   btst   #12,d0
   bne   unlockall
   bra   schleife
pop:   move.l   actpuff(pc),a1
   move.l   #270,d0
   move.l   4,a6
   jsr   freemem(a6)
   tst.w   unlockflag
   beq.s   unlockes
   cmp.w   #1,lockcount
   beq   ende
unlockes:
   move.l   actlock(pc),d1
   move.l   dosbase(pc),a6
   jsr   unlock(a6)
   sub.w   #1,lockcount
   beq   ende
   move.l   (a7)+,success
   move.l   (a7)+,actpuff
   move.l   (a7)+,actlock
   jsr   removename(pc)
   tst.l   success
   beq   pop
   bra   push
Current: move.w   #'CU',unlockflag
   sub.l   a1,a1
   move.l   ExecBase,a6
   jsr   findtask(a6)
   move.l   d0,a0
   move.l   152(a0),d1
   move.l   d1,actlock
   move.l   dosbase(pc),a6
cu_loop: jsr   parentdir(a6)
   tst.l   d0
   beq.s   cu_end
   tst.l   userlock
   beq.s   cu_nix
   move.l   d0,-(a7)
   move.l   userlock(pc),d1
   jsr   unlock(a6)
   move.l   (a7)+,d0
cu_nix:   clr.w   unlockflag
   move.l   d0,d1
   move.l   d0,actlock
   move.l   d0,userlock
   bra.s   cu_loop
cu_end:   bra   lab_weiter
infoname:
   move.l   actpuff(pc),a0
   lea   8(a0),a0
   lea   name(pc),a1
inf1:   move.b   (a0)+,(a1)+
   bne.s   inf1
   rts
leerzeile:
   lea   zeile(pc),a0
   move.w   #$0a00,(a0)
gebaus:   lea   zeile(pc),a0
allgaus: move.l   outhandle(pc),d1
   move.l   a0,d2
   clr.l   d3
lab7:   addq.l   #1,d3
   tst.b   (a0)+
   bne.s   lab7
   move.b   #10,-1(a0)
   move.l   dosbase(pc),a6
   jmp   write(a6)
unlockall:
   move.l   actpuff(pc),a1
   move.l   #270,d0
   move.l   4,a6
   jsr   freemem(a6)
   tst.w   unlockflag
   beq.s   un1_all
   cmp.w   #1,lockcount
   beq.s   endeI
un1_all: move.l   actlock(pc),d1
   move.l   dosbase(pc),a6
   jsr   unlock(a6)
   sub.w   #1,lockcount
   beq.s   endeI
unlocki: move.l   (a7)+,a1
   move.l   (a7)+,a1
   move.l   #270,d0
   move.l   4,a6
   jsr   freemem(a6)
   move.l   (a7)+,d1
   tst.w   unlockflag
   beq.s   un2_all
   cmp.w   #1,lockcount
   beq.s   endeI
un2_all: move.l   dosbase(pc),a6
   jsr   unlock(a6)
   sub.w   #1,lockcount
   bne.s   unlocki
endeI:   move.l   outhandle(pc),d1
   move.l   #break,d2
   move.l   #breakend-break,d3
   move.l   dosbase(pc),a6
   jsr   write(a6)

ende  move.l (a7)+,d4
      beq.s  DosClose
      movea.l dosbase(pc),a6
      move.l  outhandle(pc),d1
      move.l  #press,d2
      moveq   #14,d3
      jsr     write(a6)

      move.l  outhandle(pc),d1
      move.l  #press,d2
      moveq   #1,d3
      jsr     read(a6)

         move.l  outhandle(pc),d1   close console
         beq.s   nocon
         jsr     _LVOClose(a6)


nocon    move.l  ExecBase,a6
         jsr     _LVOForbid(a6)    reply to WB
         movea.l d4,a1
         jsr     _LVOReplyMsg(a6)
         jsr     _LVOPermit(a6)

DosClose movea.l ExecBase,a6
         movea.l dosbase(pc),a1
         jsr     _LVOCloseLibrary(a6)

         moveq #0,d0
         rts

getend:   lea   Pfad(pc),a0
ge_1:   tst.b   (a0)+
   bne.s   ge_1
   sub.l   #1,a0
   rts
appendname:
   bsr.s   getend
   cmp.b   #':',-1(a0)
   beq.s   an_1
   move.b   #'/',(a0)+
an_1:   move.l   actpuff(pc),a1
   lea   8(a1),a1
   lea   name(pc),a2
an_2:   move.b   (a1)+,(a0)+
   move.b   -1(a1),(a2)+
   bne   an_2
   rts
removename:
   bsr.s   getend
rem_2:   cmp.b   #'/',-1(a0)
   beq.s   rem_3
   cmp.b   #':',-1(a0)
   beq.s   rem_1
   clr.b   -(a0)
   bra.s   rem_2
rem_3:   clr.b   -(a0)
rem_1:   rts
spaces:   move.b   #' ',(a0)+
   bra.s   Zeil_ll
zeilaus: lea   zeile(pc),a0
   lea   name(pc),a1
   move.b   #' ',(a0)+
   move.w   lockcount(pc),d0
   sub.w   #1,d0
   beq.s   zeil_end
   sub.w   #1,d0
   beq.s   keinspc
   clr.l   d2
zeil_loop:
   add.l   #1,d2
   clr.l   d3
   bset   d2,d3
   move.l   bitter(pc),d4
   and.l   d3,d4
   bne.s   spaces
   move.b   #'|',(a0)+
Zeil_ll: move.b   #' ',(a0)+
   move.b   #' ',(a0)+
   sub.w   #1,d0
   bne.s   zeil_loop
keinspc: move.b   #'+',(a0)+
   move.b   #'-',(a0)+
z_loop2: move.b   (a1)+,(a0)+
   bne.s   z_loop2
   jsr   gebaus(pc)
zeil_end:
   rts
Fehler1: move.l   #Fehlerm1,d2
   move.l   #Fehlerm1end-Fehlerm1,d3
   bra.s   fehlerallg
Fehler2: move.l   #Fehlerm2,d2
   move.l   #F2ende-Fehlerm2,d3
   bra.s   fehlerallg
Fehler3: move.l   #Fehlerm3,d2
   move.l   #Fehlerm3end-Fehlerm3,d3
fehlerallg:
   move.l   outhandle(pc),d1
   move.l   dosbase(pc),a6
   jsr   write(a6)
   bra   ende

; ---------------------------------------------------------------------


window     dc.b 'CON:0/0/639/199/Tree',0
           even
press      dc.b 'Press <RETURN>'
           even
dosname:   dc.b 'dos.library',0
      even
Fehlerm1:   dc.b "**Kein Device angegeben. [device missing]",10,0
Fehlerm1end:
      even
Fehlerm2:   dc.b 10,$9b,"7;31;40",$6d," Tree V1.3 ",$9b,"0;31;40"
      dc.b $6d," © 1988 by "
      dc.b $9b,"1;31;40",$6d,"M.Stoll & M.Zepf &"
      dc.b " H.E.Stöffler  ",$9b,"0;31;40",$6d,10
      dc.b "Dieses Programm darf frei kopiert werden. Es "
      dc.b "handelt sich dabei um PUBLIC-",10
      dc.b "DOMAIN-Software. [This program may be "
      dc.b "freely distributed. It is placed in",10
      dc.b "the PUBLIC DOMAIN.]",10,10
      dc.b "Benutzung: Tree <Device>",10,10,0
F2ende:
      even
break:      dc.b "**Abbruch! [Break!]",10,0
breakend:
      even
Fehlerm3:   dc.b "**Ungültiges Device angegeben. [device invalid]",10,0
Fehlerm3end:
      even
dosbase:   dc.l 0
adresse:   dc.l 0
inhandle:   dc.l 0
outhandle:   dc.l 0
tre_getr:   dc.l 0
comlang:   dc.l 0
userlock:   dc.l 0
actlock:   dc.l 0
actpuff:   dc.l 0
lockcount:   dc.l 0
success:   dc.l 0
unlockflag:   dc.w 0
bitter:      dc.l 0
dummy:      dc.w 0
      even
name:      ds.b 120
      even
zeile:      ds.b 256
      even
Pfad:      ds.b 1024
      even
dospuff:   ds.b 20
      even
      end

