;
;                       FILE-EXT.ASM
;
;  Originally  named  FILES.ASM,  and  from a  disassembly  by
; "J.A.P"  of January 23,1980...FILE-EXT.ASM will display  the
; selected disk's directory entries in the form:
;
;          Filename.Typ   exs1s2rc <-----Group----->
;          =========================================
;
;  The "hack-job" I did on this one was less than  ideal,  but
; none the less, it get's the job done...the display format is
; now  alot  cleaner,  and  it  does'nt  "warm  boot"  as  the
; FILES.ASM version did...
;
;  The  program will display the disk directory of the  logged
; on  disk,  including all the Hexadecimal information on  the
; groups.  If an illegal character is found in the filename or
; filetype,  it  will  prompt  the operator as to  whether  to
; delete the file (or not).  If the operator answers Y  (yes),
; the  program will go on displaying more file information and
; stopping  when  a bad filename or filetype  is  encountered.
; When the display is all done,  the files that were  selected
; for deletion will be removed from the directory.
;
;  On  the  subject  of  "hack-job's"  of  software,  read  an
; interesting  article  in  Psychology  Today  magazine,  "The
; Hacker  Papers;  Computer  Addiction:  Reflection on  a  New
; Obsession"...August 1980 issue, pages 62-69.
;
;                               Best regards,
;
;                               Kelly Smith, CP/M-NET (tm)
;                               805-527-9321 (Modem, 300 Baud)
;                               805-527-0518 (Verbal)
;

       ORG     0100H

BDOS    EQU     05H
TBUFF   EQU     80H
;
CR      EQU     0DH     ;ASCII CARRIAGE RETURN
LF      EQU     0AH     ;ASCII LINE FEED
;
;
FILES:                  ;
       LXI     H,0     ;
       DAD     SP      ;
       SHLD    OLDSTK  ;
       LXI     SP,NEWSTK       ;
       JMP     BEGIN   ;
;
;
;       SYSTEM SUBROUTINES
;
;       PRINT STRING FROM D&E REGS.
;
PRINT:  MVI     C,9
       CALL    BDOS
       RET
;
;       TYPE A CHAR FROM (A)
;
TYPE:           ;
       PUSH    B
       PUSH    D
       PUSH    H
       MVI     C,2
       MOV     E,A
       CALL    BDOS    ;
       POP     H
       POP     D
       POP     B
       RET
;
;       SEARCH FOR A FILE
;
SEARCH:         ;
       PUSH    B
       PUSH    D
       PUSH    H
       MVI     C,11H
       LXI     D,AFN   ;
       CALL    BDOS    ;
       STA     RESULT  ;
       POP     H
       POP     D
       POP     B
       RET
;
;       AMBIGUOUS FILENAME.TYP
;
AFN:            ;
       DB      '?????????????'
RESULT:         ;
       DB      0       ;STORAGE FOR RESULT OF BDOS CALL
;
;       FIND NEXT OCCURRENCE OF FILE
;
NEXTFILE:               ;
       PUSH    B
       PUSH    D
       PUSH    H
       MVI     C,12H
       LXI     D,AFN   ;
       CALL    BDOS    ;
       STA     RESULT  ;
       POP     H
       POP     D
       POP     B
       RET
;
;       DELETE A FILE
;
DELETE:         ;
       PUSH    B
       PUSH    D
       PUSH    H
       MVI     C,13H
       CALL    BDOS    ;
       POP     H
       POP     D
       POP     B
       RET
;
;       GET INPUT FROM CONSOLE
;
CONIN:          ;
       PUSH    B
       PUSH    D
       PUSH    H
       MVI     C,1
       CALL    BDOS    ;
       POP     H
       POP     D
       POP     B
       RET
;
;       CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS
;
HEXASC:         ;
       CPI     0AH
       JC      HEXA2   ;
       ADI     '7'     ;
       CALL    TYPE    ;
       RET
HEXA2:          ;
       ADI     '0'     ;
       CALL    TYPE    ;
       RET
HEXCON:         ;
       PUSH    PSW
       RAR
       RAR
       RAR
       RAR
       ANI     0FH
       CALL    HEXASC  ;
       POP     PSW
       ANI     0FH
       CALL    HEXASC  ;
       RET
;
;       NEWLINE
;
CRLF:           ;
       MVI     A,CR
       CALL    TYPE    ;
       MVI     A,LF
       CALL    TYPE    ;
       RET
;
;       PRINT A SPACE
;
SPACE:          ;
       MVI     A,' '   ;
       CALL    TYPE    ;
       RET
;
;       MAIN WORK LOOP
;
;       THIS ROUTINE FINDS THE POSITION OF THE FILE
;       INFORMATION IN THE DIRECTORY DMA, PRINTS THE
;       DATA IF IT IS A CURRENT FILE, AND PROMPTS THE
;       OPERATOR FOR INSTRUCTIONS IF THE FILENAME HAS
;       ILLEGAL (NON-ASCII) DATA IN IT.
;
WORKLOOP:               ;
       LDA     RESULT  ;RESULT HOLDS POSITION OF-
       MOV     B,A     ; -THE DIRECTORY ENTRY IN THE DIR. DMA
       ANI     3
       RAL
       RAL
       RAL
       RAL
       RAL
       ANI     0E0H
       MOV     E,A
       MVI     D,0
       LXI     H,TBUFF ;
       DAD     D       ;HL NOW POINTS AT THE FILE INFO
       MOV     A,M
       CPI     0E5H    ;KILLED FILE?
       RZ              ;YES
       MOV     A,M
       STA     ENTBYT  ;
       PUSH    H
       PUSH    H
       MVI     B,8
       INX     H
WORK02: MOV     A,M     ;PRINT FILE NAME
       CALL    ILLCHK  ;
       CALL    TYPE    ;
       DCR     B
       INX     H
       JNZ     WORK02  ;
       MVI     B,3
       MVI     A,'.'
       CALL    TYPE    ;PRINT NEXT THREE CHARACTERS AS ASCII
WORK03: MOV     A,M
       CALL    ILLCHK  ;
       CALL    TYPE    ;
       DCR     B
       INX     H
       JNZ     WORK03  ;
       CALL    TYPE
       CALL    SPACE
       MVI     B,3
       POP     H       ;NOW DISPLAY ATTRIBUTES
       LXI     D,9
       DAD     D
WORK03A:CALL    SPACE
       MOV     A,M
       RLC             ;TEST $SYS AND $R/O, AND RESERVED
       MVI     A,'1'
       JC      WORK03B
       MVI     A,'0'
WORK03B:CALL    TYPE
       CALL    SPACE
       DCR     B
       INX     H
       JNZ     WORK03A
       MVI     B,20
WORK04: MOV     A,B
       ANI     3
       CZ      SPACE   ;
       MOV     A,M
       CALL    HEXCON  ;
       INX     H
       DCR     B
       JNZ     WORK04  ;
       CALL    CRLF    ;
       POP     H
       LDA     ENTBYT  ;
       ORA     A
       RZ
       PUSH    H
       LXI     H,DELMSG        ;
WORK06:         ;
       MOV     A,M
       ORA     A
       JZ      WORK08  ;
       CALL    TYPE    ;
       INX     H
       JMP     WORK06  ;
DELMSG:         ;
       DB      'Delete this file ? ',0
WORK08:         ;
       CALL    CONIN   ;
       POP     H
       ANI     5FH
       CPI     'Y'     ;
       PUSH    PSW
       CALL    CRLF    ;KEEP IT NEAT
       POP     PSW
       RNZ
       XCHG
       LHLD    DELPTR  ;
       MVI     B,10H
WORK10:         ;
       LDAX    D
       MOV     M,A
       INX     H
       INX     D
       DCR     B
       JNZ     WORK10  ;
       SHLD    DELPTR  ;
       RET
;
;       CHECK FOR NONASCII CHARACTER  <20H  OR  >60H
;
ILLCHK: PUSH    PSW
       ANI     07FH    ;MASK FOR PROPRIETARY", "$SYS", "$R/W"
       CPI     ' '     ;
       JC      ILLEGL  ;
       CPI     61H
       JNC     ILLEGL  ;
       POP     PSW
       RET
ILLEGL: POP     PSW
       PUSH    PSW
       MVI     A,0FFH
       STA     ENTBYT  ;
       POP     PSW
       RET
;
;
;
MSG:    DB      'Filename.Typ R/OSysRes exs1s2rc'
       DB      ' <--------------Group-------------->'
       DB      CR,LF
       DB      '==============================='
       DB      '===================================='
       DB      CR,LF,'$'
;
;
;
; ERROR MESSAGES
;
ERROR1: LXI     D,ERMSG1;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT

;
ERMSG1: DB      CR,LF,'Disk select should be " N:"$'

;
ERROR2: LXI     D,ERMSG2;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT

ERMSG2: DB      CR,LF,'Bad delimeter, should be ":"$'

;
ERROR3: LXI     D,ERMSG3;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT

ERMSG3: DB      CR,LF,'No drive specified$'

;
ERROR4: LXI     D,ERMSG4;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT

ERMSG4: DB      CR,LF,'Only drives A to D allowed$'

;

;       PROGRAM BEGINS HERE
;
BEGIN:
;
; CHECK FOR DRIVE SPECIFICATION
;
       LDA     TBUFF   ;GET LENGTH OF COMMAND PARAMETERS
       CPI     2       ; IF <2, NO PARAMETERS
       JC      MAIN01  ; MUST BE PRESENT LOGGED-IN DRIVE
       JZ      ERROR1  ;EXACTLY 2, IS ERROR
       LHLD    TBUFF+2 ;AT LEAST 3 THEN...
       MOV     A,H     ;NEXT CHARACTER SHOULD BE ":"
       CPI     ':'
       JNZ     ERROR2  ;ONLY ALLOW DRIVE SET
       MOV     A,L     ;NEXT CHARACTER SHOULD BE DRIVE
       CPI     'A'     ;AT A MINIMUM, "A"
       JC      ERROR3
       CPI     'E'     ;AT A MAXIMUM "D"
       JNC     ERROR4
       ANI     7       ;STRIP BITS, FOR 0 TO 3
       DCR     A       ;BACK OFF FOR 0 TO 3
       MOV     E,A     ;MAKE DISK NUMBER
       MVI     D,0
       MVI     C,14    ;BDOS SELECT DISK FUNCTION
       CALL    BDOS

MAIN01: LXI     D,MSG
       CALL    PRINT
               ;
       LXI     H,DELFIL        ;
       SHLD    DELPTR  ;
       CALL    SEARCH  ;
MAIN02:         ;
       LDA     RESULT  ;
       CPI     0FFH
       JZ      MAIN04  ;
       CALL    WORKLOOP        ;
       CALL    NEXTFILE        ;
       JMP     MAIN02  ;
MAIN04:         ;
       LHLD    DELPTR  ;
       LXI     D,DELFIL
       MOV     A,L
       CMP     E
       JNZ     MAIN06  ;
       MOV     A,H
       CMP     D
       JZ      QUIT    ;
MAIN06:         ;
       LXI     D,-10H
       DAD     D
       SHLD    DELPTR  ;
       XCHG
       CALL    DELETE  ;
       JMP     MAIN04  ;
QUIT:           ;
       LHLD    OLDSTK  ;
       SPHL
       RET             ;
;
;       SOME STORAGE LOCATIONS
;
OLDSTK: DS      2       ;STORAGE FOR "OLD" STACK POINTER
       DS      32
NEWSTK  EQU     $       ;STORAGE FOR "NEW" STACK
ENTBYT: DS      1       ;
DELPTR: DS      16      ;
DELFIL  EQU     $       ;FILE OF DELETEABLE FILE BUILDS HERE
;
;
       END