;
;                   FILE-EXT.A86 Version 1.0
;
;                           as of
;
;                     March 29, 1982
;
;
;
;  Originally  named  FILES.ASM,  and  from a  disassembly  by
; "J.A.P"  of January 23,1980...FILE-EXT.A86 will display  the
; selected disk's directory entries in the form:
;
; User Pro Filename.Typ R/OSysRes exs1s2rc <---------Group--------->
; ==================================================================
;
; Where:
;
; "User" is the User assignment for the file.
; "Pro" is the "proprietary software" control bit.
; "Filename" is the ASCII file name.
; "Typ" is the ASCII file type.
; "R/O" is the "read only" control bit
; "Sys" is the "system directory" control bit
; "Res" is the "reserved" (MP/M Ver.1.0) control bit
; "ex" is the "file extension" byte
; "s1" is a CP/M "internal function" byte.
; "s2" is a CP/M "internal function" byte
; "rc" is the "record count" byte.
; "Group" is the "allocation vector table" for the file.
;
;  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.
;
;  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

M       EQU     BYTE PTR 0[BX]

BDOS    EQU     05H
TBUFF   EQU     80H
;
CR      EQU     0DH                     ;ASCII CARRIAGE RETURN
LF      EQU     0AH                     ;ASCII LINE FEED
;
;
       JMP     BEGIN                   ;IF VERSION O.K., PRESS ON
;
;       SYSTEM SUBROUTINES
;
;       PRINT STRING FROM D&E REGS.
;
PRINT:  MOV     CL,9
       INT     224
       RET
;
;       DISPLAY A CHAR FROM (A)
;
DISPLAY:
       PUSH    CX
       PUSH    DX
       PUSH    BX
       MOV     CL,2
       MOV     DL,AL
       INT     224                     ;
       POP     BX
       POP     DX
       POP     CX
       RET
;
;       SEARCH FOR A FILE
;
SEARCH:                         ;
       PUSH    CX
       PUSH    DX
       PUSH    BX
       MOV     CL,11H
       MOV     DX,(Offset AFN)         ;
       INT     224                     ;
       MOV     Byte Ptr RESULT,AL      ;
       POP     BX
       POP     DX
       POP     CX
       RET
L_2     EQU     $
       DSEG
       ORG     Offset L_2
;
;       AMBIGUOUS FILENAME.TYP
;
AFN     RS      0                       ;
       DB      '?????????????'
RESULT  RS      0                       ;
       DB      0                       ;STORAGE FOR RESULT OF BDOS CALL
L_3     EQU     $
       CSEG
       ORG     Offset L_3
;
;       FIND NEXT OCCURRENCE OF FILE
;
NEXTFILE:                               ;
       PUSH    CX
       PUSH    DX
       PUSH    BX
       MOV     CL,12H
       MOV     DX,(Offset AFN)         ;
       INT     224                     ;
       MOV     Byte Ptr RESULT,AL      ;
       POP     BX
       POP     DX
       POP     CX
       RET
;
;       GET INPUT FROM CONSOLE
;
CONIN:                                  ;
       PUSH    CX
       PUSH    DX
       PUSH    BX
       MOV     CL,1
       INT     224                     ;
       POP     BX
       POP     DX
       POP     CX
       RET
;
;       CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS
;
HEXASC:                         ;
       CMP     AL,0AH
       JB      HEXA2                   ;
       ADD     AL,'7'                  ;
       CALL    DISPLAY                 ;
       RET
HEXA2:                                  ;
       ADD     AL,'0'                  ;
       CALL    DISPLAY                 ;
       RET
HEXCON:                         ;
       LAHF
       XCHG    AL,AH
       PUSH    AX
       XCHG    AL,AH
       RCR     AL,1
       RCR     AL,1
       RCR     AL,1
       RCR     AL,1
       AND     AL,0FH
       CALL    HEXASC                  ;
       POP     AX
       XCHG    AL,AH
       AND     AL,0FH
       CALL    HEXASC                  ;
       RET
;
;       NEWLINE
;
CRLF:                                   ;
       MOV     AL,CR
       CALL    DISPLAY                 ;
       MOV     AL,LF
       CALL    DISPLAY                 ;
       RET
;
;       PRINT A SPACE
;
SPACE:                                  ;
       MOV     AL,' '                  ;
       CALL    DISPLAY                 ;
       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:                               ;
       MOV     AL,Byte Ptr RESULT      ;RESULT HOLDS POSITION OF-
       MOV     CH,AL                   ; -THE DIRECTORY ENTRY IN THE DIR. DMA
       AND     AL,3
       RCL     AL,1
       RCL     AL,1
       RCL     AL,1
       RCL     AL,1
       RCL     AL,1
       AND     AL,0E0H
       MOV     DL,AL
       MOV     DH,0
       MOV     BX,TBUFF                ;
       ADD     BX,DX                   ;HL NOW POINTS AT THE FILE INFO
       MOV     AL,M
       CMP     AL,0E5H                 ;KILLED FILE?
       JNZ     L_4
       RET                             ;YES
L_4:
       CALL    SPACE                   ;SPACE OVER FOR NEATNESS
       MOV     AL,M
       CALL    HEXCON                  ;PRINT USER NUMBER
       CALL    SPACE
       CALL    SPACE
       CALL    SPACE
       PUSH    BX
       PUSH    BX
       LAHF                            ;POINT TO FIRST CHARACTER IN FILE NAME
       INC     BX
       SAHF
       MOV     AL,M                    ;ALLOW HIGH BIT SET FOR "PROPRIETARY SOFTWARE"
       ROL     AL,1                    ;TEST "PROPRIETARY SOFTWARE" BIT
       MOV     AL,'1'
       JB      WORK01
       MOV     AL,'0'
WORK01: CALL    DISPLAY
       CALL    SPACE
       CALL    SPACE
       CALL    SPACE
       MOV     CH,8
WORK02: MOV     AL,M                    ;PRINT FILE NAME
       AND     AL,07FH                 ; STRIP-OFF PARITY BIT
       CALL    DISPLAY                 ;
       DEC     CH
       LAHF
       INC     BX
       SAHF
       JNZ     WORK02                  ;
       MOV     CH,3
       MOV     AL,'.'
       CALL    DISPLAY                 ;PRINT NEXT THREE CHARACTERS AS ASCII
WORK03: MOV     AL,M
       AND     AL,07FH                 ; STRIP-OFF PARITY BIT
       CALL    DISPLAY                 ;
       DEC     CH
       LAHF
       INC     BX
       SAHF
       JNZ     WORK03                  ;
       CALL    DISPLAY
       CALL    SPACE
       MOV     CH,3
       POP     BX                      ;NOW DISPLAY ATTRIBUTES
       MOV     DX,9
       LAHF
       ADD     BX,DX
       RCR     SI,1
       SAHF
       RCL     SI,1
WORK03A:CALL    SPACE
       MOV     AL,M
       ROL     AL,1                    ;TEST $SYS AND $R/O, AND RESERVED
       MOV     AL,'1'
       JB      WORK03B
       MOV     AL,'0'
WORK03B:CALL    DISPLAY
       CALL    SPACE
       DEC     CH
       LAHF
       INC     BX
       SAHF
       JNZ     WORK03A
       MOV     CH,20
WORK04: MOV     AL,CH
       AND     AL,3
       JNZ     L_5
       CALL    SPACE                   ;
L_5:
       MOV     AL,M
       CALL    HEXCON                  ;
       LAHF
       INC     BX
       SAHF
       DEC     CH
       JNZ     WORK04                  ;
       CALL    CRLF                    ;
       POP     BX
       RET
L_6     EQU     $
       DSEG
       ORG     Offset L_6
;
BADVER  DB      'Sorry, CP/M Version 2.X required$'
MSG     DB      'User Pro  Filename.Typ R/OSysRes exs1s2rc'
       DB      ' <--------------Group-------------->'
       DB      CR,LF
       DB      '========================================='
       DB      '===================================='
       DB      CR,LF,'$'
L_7     EQU     $
       CSEG
       ORG     Offset L_7
;
;
;
; ERROR MESSAGES
;
ERROR1: MOV     DX,(Offset ERMSG1)      ;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT
L_8     EQU     $
       DSEG
       ORG     Offset L_8
;
ERMSG1  DB      CR,LF,'Disk select should be " N:"$'
L_9     EQU     $
       CSEG
       ORG     Offset L_9
;
ERROR2: MOV     DX,(Offset ERMSG2)      ;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT
L_10    EQU     $
       DSEG
       ORG     Offset L_10
ERMSG2  DB      CR,LF,'Bad delimeter, should be ":"$'
L_11    EQU     $
       CSEG
       ORG     Offset L_11
;
ERROR3: MOV     DX,(Offset ERMSG3)      ;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMP     QUIT
L_12    EQU     $
       DSEG
       ORG     Offset L_12
ERMSG3  DB      CR,LF,'No drive specified$'
L_13    EQU     $
       CSEG
       ORG     Offset L_13
;
ERROR4: MOV     DX,(Offset ERMSG4)      ;SAY NO GO, AND BAIL OUT
       CALL    PRINT
       JMPS    QUIT
L_14    EQU     $
       DSEG
       ORG     Offset L_14
ERMSG4  DB      CR,LF,'Only drives A to D allowed$'
L_15    EQU     $
       CSEG
       ORG     Offset L_15
;
;       PROGRAM BEGINS HERE
;
BEGIN:
;
; CHECK FOR DRIVE SPECIFICATION
;
       MOV     AL,Byte Ptr .TBUFF      ;GET LENGTH OF COMMAND PARAMETERS
       CMP     AL,2                    ; IF <2, NO PARAMETERS
       JB      MAIN01                  ; MUST BE PRESENT LOGGED-IN DRIVE
       JNZ     L_16
       JMP     ERROR1                  ;EXACTLY 2, IS ERROR
L_16:
       MOV     BX,Word Ptr .TBUFF+2    ;AT LEAST 3 THEN...
       MOV     AL,BH                   ;NEXT CHARACTER SHOULD BE ":"
       CMP     AL,':'
       JZ      L_17
       JMP     ERROR2                  ;ONLY ALLOW DRIVE SET
L_17:
       MOV     AL,BL                   ;NEXT CHARACTER SHOULD BE DRIVE
       CMP     AL,'A'                  ;AT A MINIMUM, "A"
       JB      ERROR3
       CMP     AL,'E'                  ;AT A MAXIMUM "D"
       JNB     ERROR4
       AND     AL,7                    ;STRIP BITS, FOR 0 TO 3
       DEC     AL                      ;BACK OFF FOR 0 TO 3
       MOV     DL,AL                   ;MAKE DISK NUMBER
       MOV     DH,0
       MOV     CL,14                   ;BDOS SELECT DISK FUNCTION
       INT     224
MAIN01: MOV     DX,(Offset MSG)
       CALL    PRINT
       CALL    SEARCH                  ;
MAIN02:                         ;
       MOV     AL,Byte Ptr RESULT      ;
       CMP     AL,0FFH
       JZ      QUIT
       CALL    WORKLOOP                ;
       CALL    NEXTFILE                ;
       JMPS    MAIN02                  ;
QUIT:   MOV     CL,0    ; WARM BOOT CP/M-86
       INT     224
;
L_18    EQU     $
       DSEG
       ORG     Offset L_18
;
;       SOME STORAGE LOCATIONS
;
OLDSTK  RS      2                       ;STORAGE FOR "OLD" STACK POINTER
       RS      32
NEWSTK  EQU     (Offset $)              ;STORAGE FOR "NEW" STACK
;
;
       END