;
;  PROGRAM:  SYSTEST6
;  AUTHOR:  Richard Conn
;  PURPOSE:  To illustrate the ZCPR2-specific routines in SYSLIB
;

;
;  Externals
;
       EXT     ZCPRSET         ; Set DMA, et al
       EXT     ZINIEXT         ; Set External Path Address
       EXT     ZPFIND          ; Find File Along Path
       EXT     ZFSTAT          ; Return Status of File
       EXT     ZFNAME          ; Extended File Name Parser

       EXT     RETUD           ; Return Current User/Disk
       EXT     CRLF            ; New Line
       EXT     BBLINE          ; Input Line Editor
       EXT     PRINT           ; Print String
       EXT     PSTR            ; Another Print String
       EXT     CIN             ; Char in
       EXT     COUT            ; Char out
       EXT     CAPS            ; Capitalize char
       EXT     PADC            ; Print A as decimal
       EXT     BDOS            ; BDOS Call
       EXT     PHL4HC          ; Print HL as 4 Hex chars
       EXT     CODEND          ; End of code/beginning of buffer

;
;  Constants
;
CR      EQU     0DH
LF      EQU     0AH

;
;  THIS INITIALIZATION MUST BE DONE WHENEVER THE ZCPR-ORIENTED ROUTINES
;       ARE TO BE USED WITH THE USER'S EXTERNAL PATH
;
       LXI     H,40H           ; BASE OF EXTERNAL PATHS
       CALL    ZINIEXT         ; SET BASE ADDRESS

;
;  THIS INITIALIZATION NEED NOT ALWAYS BE DONE, ESPECIALLY WHEN THE
;       DEFAULTS ARE USED, BUT I'M DOING IT HERE FOR PURPOSE OF EXAMPLE
;
       MVI     A,'$'   ; CURRENT INDICATOR
       LXI     H,80H   ; DMA ADDRESS
       CALL    ZCPRSET ; SET THESE VALUES FOR ZCPR ROUTINES

;
;  SINCE I AM PLAYING WITH DISKS AND USER AREAS, GET THE CURRENT DISK/USER
;
       CALL    RETUD   ; GET CURRENT USER AND DISK
       MOV     A,B     ; SAVE DISK
       STA     CDISK
       MOV     A,C     ; SAVE USER
       STA     CUSER

;
;  TEST LOOP
;
LOOP:
       CALL    PRINT
       DB      CR,LF,'Current Disk is ',0
       LDA     CDISK   ; GET DISK
       PUSH    PSW     ; SAVE IF
       ADI     'A'     ; CONVERT TO ASCII
       CALL    COUT
       POP     PSW     ; GET DISK
       MOV     E,A
       MVI     C,14    ; SELECT DISK
       CALL    BDOS
       CALL    PRINT
       DB      ', and Current User is ',0
       LDA     CUSER   ; GET USER
       CALL    PADC    ; PRINT AS DECIMAL
       MOV     E,A     ; SELECT USER
       MVI     C,32
       CALL    BDOS
       CALL    PRINT
       DB      CR,LF,'Name of File to Search For (<CR>=Done)? ',0
       XRA     A       ; NO CAP
       CALL    BBLINE  ; GET LINE FROM USER
       ORA     A       ; ANY INPUT?
       RZ
       CALL    PRINT
       DB      CR,LF,'File Name: ',0
       PUSH    H       ; SAVE HL, SINCE MODIFIED BY PSTR
       CALL    PSTR
       CALL    CODEND  ; GET ADDRESS OF SCRATCH AREA FOR ZFNAME
       MOV     B,H     ; ... IN BC
       MOV     C,L
       POP     H
       LXI     D,FCB   ; PT TO FCB
       CALL    ZFNAME  ; CONVERT TO FCB FORM
       JZ      UDERR   ; USER OR DISK ERROR?
       CALL    PRINT
       DB      CR,LF,'Selected Disk is ',0
       MOV     A,B     ; GET DISK NUMBER
       CPI     0FFH    ; CURRENT?
       JNZ     DN1
       CALL    PRINT
       DB      'Current',0
       JMP     DN2
DN1:
       DCR     A       ; CONVERT TO 0-15
       ADI     'A'     ; CONVERT TO LETTER
       CALL    COUT
       SUI     'A'     ; CONVERT BACK
       MOV     E,A     ; IN E
       PUSH    B       ; SAVE BC
       MVI     C,14    ; SELECT DISK
       CALL    BDOS
       POP     B       ; GET BC
DN2:
       CALL    PRINT
       DB      ', and Selected User is ',0
       MOV     A,C     ; GET USER
       CPI     0FFH    ; CURRENT?
       JNZ     DN3
       CALL    PRINT
       DB      'Current',0
       JMP     DN4
DN3:
       CALL    PADC    ; PRINT AS DECIMAL
       MOV     E,A     ; USER IN E
       MVI     C,32    ; SELECT USER
       CALL    BDOS
DN4:
       CALL    PRINT
       DB      CR,LF,'Selected User and Disk Now Logged In'
       DB      CR,LF,'File Name from FCB: ',0
       LXI     H,FCB+1
       MVI     C,8     ; PRINT 8 CHARS
       CALL    PCH
       MVI     A,'.'
       CALL    COUT
       MVI     C,3     ; PRINT 3 MORE CHARS
       CALL    PCH
       CALL    CRLF
       LXI     D,FCB   ; PT TO FCB
       MVI     B,0     ; DON'T SEARCH CURRENT
       CALL    ZPFIND  ; SEARCH FOR FILE ALONG PATH (DE PTS TO FCB)
       JZ      FNF     ; FILE NOT FOUND IF A=0 AND ZERO FLAG SET
       CALL    PRINT
       DB      CR,LF,'File Found on Disk ',0
       MOV     A,B     ; GET DISK NUMBER
       ADI     'A'     ; CONVERT TO LETTER
       CALL    COUT
       CALL    PRINT
       DB      ' in User ',0
       MOV     A,C     ; GET USER NUMBER
       CALL    PADC    ; PRINT AS DECIMAL
       PUSH    D       ; SAVE FCB PTR
       PUSH    B       ; SAVE USER/DISK
       MOV     E,B     ; SELECT DISK
       MVI     C,14    ; BDOS FCT
       CALL    BDOS    ; SELECT USER
       POP     B       ; GET USER
       MOV     E,C
       MVI     C,32    ; BDOS FCT
       CALL    BDOS    ; SELECT USER
       POP     D       ; GET FCB PTR
       CALL    ZFSTAT  ; GET STATUS OF FILE
       JNZ     FNF1    ; FILE NOT FOUND?  SHOULD NOT HAPPEN
       CALL    PRINT
       DB      CR,LF,'File is ',0
       MOV     A,C     ; GET R/O FLAG
       ORA     A       ; 0=NOT R/O
       JNZ     LOOP1
       CALL    PRINT
       DB      'NOT ',0
LOOP1:
       CALL    PRINT
       DB      'Read/Only, and File is ',0
       MOV     A,B     ; GET SYSTEM FLAG
       ORA     A       ; 0=NOT SYSTEM
       JNZ     LOOP2
       CALL    PRINT
       DB      'Non-',0
LOOP2:
       CALL    PRINT
       DB      'System',0
       JMP     LOOP
FNF1:
       CALL    PRINT
       DB      CR,LF,'This should not happen',0
FNF:
       CALL    PRINT
       DB      CR,LF,'File Not Found',0
       JMP     LOOP
UDERR:
       CALL    PRINT
       DB      CR,LF,'Error in User or Disk Numbers',0
       JMP     LOOP
PCH:
       MOV     A,M     ; GET CHAR
       CALL    COUT    ; PRINT CHAR
       INX     H       ; PT TO NEXT
       DCR     C       ; COUNT DOWN
       JNZ     PCH
       RET

CDISK:
       DS      1       ; CURRENT DISK
CUSER:
       DS      1       ; CURRENT USER
FCB:
       DS      36

       END