; ; 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 (=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