;***************************************************************************;
;                                                                           ;
;                                  DIRSER                                   ;
;                         Directory Service Utility                         ;
;                                                                           ;
;                         Author: David F. Pallmann                         ;
;            Copyright (C) 1984 by LMS Technical Services, Inc.             ;
;                                                                           ;
;***************************************************************************;
;
; File uses universal (.UNV) files other
; than SYS, SYSSYM, and TRM.
; These are on the AMUS network
;
; File makes external references to WLDSCN.OBJ[P,PN].  After
; assembly, enter this command:  .LNKLIT file,WLDSCN[P,PN]
;

OBJNAM  DIRSER.LIT

VMAJOR=1

;edit history
VEDIT=100.      ;11-Jan-84 DFP creation.

;universals
SEARCH  SYS
SEARCH  SYSSYM
SEARCH  TRM
SEARCH  MACLIB
SEARCH  WLDSCN
ASMMSG  "(WLDSCN must be linked to this module after assembly)"

;registers
IMP=A5                                  ;impure index

;ASCII chars
CR=15
ESC=33

;DDB offsets
D.BLK=D.WRK+2                           ;file block size
D.ACT=D.WRK+6                           ;active count

;impure area
OFINI
OFDEF   FILE,D.DDB                      ;DDB for disk file operations
OFDEF   LSTDEV,2                        ;last device displayed
OFDEF   LSTDRV,2                        ;last drive displayed
OFDEF   LSTPPN,2                        ;last PPN displayed
OFDEF   FILCNT,4                        ;number of files processed
OFDEF   BLKCNT,4                        ;block count
OFDEF   DELBLK,4                        ;blocks deleted
OFDEF   BUFFER,10                       ;PACK-UNPACK buffer
OFDEF   FLAGS,4                         ;control flags--.
       F.DIR=1                         ; /D - directory
       F.KIL=2                         ; /K - kill
       F.NXT=100000                    ; find file in next PPN
OFSIZ   IMPSIZ

START:  PHDR    -1,0,PH$REE!PH$REU      ;program header
       GETIMP  IMPSIZ,IMP              ;allocate impure area
       WINIT                           ;initialize WLDSCN

PROGID: TYPESP  DIRSER
       VCVT    START+2,OT$TRM
       CRLF

;output a newline

NEWLIN: CRLF

;prompt for file specification

PROMPT: TTYI
       ASCIZ   />/

;set ASCII line mode

SETASC: MOV     JOBCUR,A0
       MOV     JOBTRM(A0),A0
       ANDW    #^C<T$DAT!T$ECS>,T.STS(A0)

;get wildcard file specification

GTSPEC: KBD     EXIT                    ;get input line (branch on ^C)
       BYP                             ;bypass white space
       LIN                             ;empty line?
       JEQ     EXIT                    ; yes - exit

;check for valid spec
;reject invalid spec

CHKSPC: WSPEC
       BNE     NEWLIN

;initialize storage
INSTOR: CLRW    LSTDEV(IMP)
       CLRW    LSTDRV(IMP)
       CLRW    LSTPPN(IMP)
       CLR     FILCNT(IMP)
       CLR     BLKCNT(IMP)
       CLR     DELBLK(IMP)
       CLR     FLAGS(IMP)
       CLRW    FILE+D.DEV(IMP)
       CLRW    FILE+D.DRV(IMP)
       CLRW    FILE+D.PPN(IMP)

;process switches
;/D for directory only
;/K to delete all files

SWITCH: BYP
       LIN
       JEQ     SETDAT
       MOVB    (A2)+,D1
       AND     #177,D1
       UCS
       CMPB    D1,#'/
       BNE     CMDERR
       MOVB    (A2)+,D1
       AND     #177,D1
       UCS
       LEA     A0,SWCTBL
       MOV     #1,D0
10$:    TSTB    @A0
       BEQ     CMDERR
       CMMB    (A0)+,D1
       BNE     20$
       OR      D0,FLAGS(IMP)
       BR      SWITCH
20$:    ASL     D0
       BR      10$

SWCTBL: ASCIZ   /DK/
       EVEN

CMDERR: TYPECR  ?command format error
       TTYI
       ASCIZ   "?format is wildcard-spec {/D for directory} {/K to delete}"
       EVEN
       CRLF
       JMP     NEWLIN

;set terminal to data mode, no echo

SETDAT: MOV     JOBCUR,A0
       MOV     JOBTRM(A0),A0
       ORW     #<T$DAT!T$ECS>,T.STS(A0)

;request file from WLDSCN

GETFIL: WSCAN
       JNE     STATS

;copy file information returned by WLDSCN to our own DDB

CPYDDB: MOVW    D.DEV(A4),FILE+D.DEV(IMP)
       MOVW    D.DRV(A4),FILE+D.DRV(IMP)
       MOV     D.FIL(A4),FILE+D.FIL(IMP)
       MOVW    D.EXT(A4),FILE+D.EXT(IMP)
       MOVW    D.PPN(A4),FILE+D.PPN(IMP)
       MOVW    D.BLK(A4),FILE+D.BLK(IMP)
       MOVW    D.ACT(A4),FILE+D.ACT(IMP)
       INIT    FILE(IMP)

;check for blank device/drive and/or PPN
;if present we must fill these areas so our display looks pretty

CHKDEV: MOV     JOBCUR,A0
       TSTW    FILE+D.DEV(IMP)
       BNE     CHKPPN
       MOVW    JOBDEV(A0),FILE+D.DEV(IMP)
       MOVW    JOBDRV(A0),FILE+D.DRV(IMP)

CHKPPN: TSTW    FILE+D.PPN(IMP)
       BNE     CHKNXT
       MOVW    JOBUSR(A0),FILE+D.PPN(IMP)

;if control flag F.NXT set, then only display file if the device, drive, or
;PPN are different

CHKNXT: BIT     #F.NXT,FLAGS(IMP)
       BEQ     DISACT
       CMMW    FILE+D.DEV(IMP),LSTDEV(IMP)
       BNE     10$
       CMMW    FILE+D.DRV(IMP),LSTDRV(IMP)
       BNE     10$
       CMMW    FILE+D.PPN(IMP),LSTPPN(IMP)
       BNE     10$
       JMP     GETFIL
10$:    AND     #^C<F.NXT>,FLAGS(IMP)

;if device/drive/PPN different than that of file last displayed,
;display the account on the screen

DISACT: CMMW    FILE+D.DEV(IMP),LSTDEV(IMP)
       BNE     10$
       CMMW    FILE+D.DRV(IMP),LSTDRV(IMP)
       BNE     10$
       CMMW    FILE+D.PPN(IMP),LSTPPN(IMP)
       BEQ     RECFIL
10$:    TST     FILCNT(IMP)
       BEQ     20$
       CRLF
20$:    LEA     A1,FILE+D.DEV(IMP)
       LEA     A2,BUFFER(IMP)
       UNPACK
       CLRB    @A2
       TTYL    BUFFER(IMP)
       CLR     D1
       MOVW    FILE+D.DRV(IMP),D1
       DCVT    0,OT$TRM
       TYPE    :[
       PRPPN   FILE+D.PPN(IMP)
       TYPECR  ]
       MOVW    FILE+D.DEV(IMP),LSTDEV(IMP)
       MOVW    FILE+D.DRV(IMP),LSTDRV(IMP)
       MOVW    FILE+D.PPN(IMP),LSTPPN(IMP)

;record file size for end-of-directory statistics
RECFIL: INC     FILCNT(IMP)
;;      LOOKUP  FILE(IMP)
       CLR     D1
       MOVW    FILE+D.BLK(IMP),D1
       ADD     D1,BLKCNT(IMP)

;display file
DISFIL: LEA     A1,FILE+D.FIL(IMP)
       LEA     A2,BUFFER(IMP)
       UNPACK
       UNPACK
       CLRB    @A2
       TTYL    BUFFER(IMP)
       TYPESP
       LEA     A2,BUFFER(IMP)
       UNPACK
       CLRB    @A2
       TTYL    BUFFER(IMP)
       TYPESP
       MOVW    FILE+D.BLK(IMP),D1
       DCVT    5,OT$TRM!OT$ZER!OT$TSP
       TSTW    FILE+D.ACT(IMP)
       BMI     10$
       TYPE    L
       BR      20$
10$:    TYPE    C
20$:    TYPESP  :

;auto-delete if /K in effect

AUTDEL: BIT     #F.KIL,FLAGS(IMP)
       JNE     DELETE

;auto-bypass if /D in effect

AUTBYP: BIT     #F.DIR,FLAGS(IMP)
       JNE     BYPASS

;get option char

OPTION: KBD
       AND     #177,D1
       UCS
       LEA     A0,CMDTBL
       MOV     #-2,D0
10$:    TSTB    @A0
       BEQ     OPTION
       ADD     #2,D0
       CMMB    (A0)+,D1
       BNE     10$

BRANCH: TJMP    D0
       OFFSET  BYPASS
       OFFSET  QUIT
       OFFSET  DELETE
       OFFSET  HELP
       OFFSET  LIST
       OFFSET  NEXT
       OFFSET  QUIT
       OFFSET  BYPASS

CMDTBL: BYTE    CR,ESC
       ASCIZ   /DHLNQ /
       EVEN

;end-of-directory statistics

STATS:  MOV     FILCNT(IMP),D1
       JNE     10$
       TYPECR  %no such files
       JMP     NEWLIN
10$:    TYPESP  Total of
       DCVT    0,OT$TRM!OT$TSP
       TYPE    file
       CMPW    D1,#1
       BEQ     20$
       TYPE    s
20$:    TYPE    < in >
       MOV     BLKCNT(IMP),D1
       DCVT    0,OT$TRM!OT$TSP
       TYPE    block
       CMPW    D1,#1
       BEQ     24$
       TYPE    s
24$:    MOV     DELBLK(IMP),D1
       BEQ     40$
       TYPE    < (>
       DCVT    0,OT$TRM!OT$TSP
       TYPE    block
       CMPW    D1,#1
       BEQ     30$
       TYPE    s
30$:    TYPE    < deleted)>
40$:    CRLF
       JMP     NEWLIN

;exit to AMOS

EXIT:   CRLF
       EXIT

PAGE
;delete file

DELETE: TYPECR  Delete
       CLR     D1
       MOVW    FILE+D.BLK(IMP),D1
       ADD     D1,DELBLK(IMP)
       DSKDEL  FILE(IMP)
       CLR     D1
       JMP     GETFIL

;help

HELP:   TYPECR  Help
       TYPECR  <                    D - delete file>
       TYPECR  <                    L - list file>
       TYPECR  <                    N - next PPN>
       TYPECR  <                    Q - quit>
       TYPECR  <                   SP - bypass file>
       CRLF
       JMP     DISFIL

;list file

LIST:   TSTW    FILE+D.ACT(IMP)         ;contiguous file?
       JMI     OPTION                  ; yes - can't list file
       TYPECR  List
       OPENI   FILE(IMP)
10$:    TCKI
       BEQ     20$
       FILINB  FILE(IMP)
       TST     FILE+D.SIZ(IMP)
       BEQ     30$
       TTY
       BR      10$
20$:    KBD
30$:    CLOSE   FILE(IMP)
       CRLF
       JMP     DISFIL

;next PPN

NEXT:   TYPECR  Next
       OR      #F.NXT,FLAGS(IMP)
       JMP     GETFIL

;quit

QUIT:   TYPECR  Quit
       JMP     STATS

;bypass file

BYPASS: CRLF
       JMP     GETFIL

       END