home *** CD-ROM | disk | FTP | other *** search
- ; PROGRAM: PROTECT
- ; VERSION: 3.0
- ; DATE: 18 May 84
- ; AUTHOR: RICHARD CONN
- ; PREVIOUS VERSIONS: 2.0 (16 Jan 83)
- ; PREVIOUS VERSIONS: 1.3 (6 Jan 83), 1.2 (7 Dec 82), 1.1 (10 NOV 82)
- ; PREVIOUS VERSION: PROTECT.ASM Version 1.0 (26 OCT 81)
- VERS equ 30
- z3env SET 0f400h
-
- ;
- ; PROTECT Command --
- ; PROTECT is used to set the file protection and tag attribute bits
- ; for CP/M 2.x files in the ZCPR3 environment. It is invoked via command
- ; lines of the following forms:
- ; PROTECT dir:afn1,dir:afn2,... keys <-- Set unconditionally
- ; PROTECT dir:afn1,... keys I <-- Inspect Mode
- ; PROTECT dir:afn1,... C <-- Set each ufn
- ;
- ; In the above examples, the reference 'keys' is a string of zero or
- ; more characters which may be any of the following:
- ;
- ; A <-- Set AR Attribute
- ; R <-- Set R/O Attribute (no R sets R/W)
- ; S <-- Set SYS Attribute (no S sets Non-System)
- ; n <-- Set Tag Attribute (1 <= n <= 8)
- ;
- ; Examples:
- ; PROTECT *.COM RS <-- Sets all COM files to R/O SYStem
- ; PROTECT *.COM RSI <-- Same, with user approval
- ; PROTECT *.COM C <-- Allows user to specify for each
- ; PROTECT MYPROG.COM 1R <-- Sets Tag Bit 1 and R/O Attribute
- ;
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- ESIZE EQU 16 ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
-
- EXT DIRQ ; DIRECTORY PROCESSOR
-
- EXT Z3INIT ; INIT BUFFERS
- EXT ZFNAME ; FILE NAME PROCESSOR
- EXT Z3LOG ; LOG INTO Z3 DU
-
- EXT BBLINE ; INPUT LINE EDITOR
- EXT INITFCB ; INIT FCB
- EXT BDOS ; BDOS ENTRY
- EXT PUTUD ; SAVE CURRENT USER/DISK
- EXT GETUD ; RESTORE CURRENT USER/DISK
- EXT MOVEB ; COPY ROUTINE
- EXT PHLDC ; PRINT HL AS DECIMAL CHARS
- EXT PRINT ; PRINT ROUTINE
- EXT COUT ; CONSOLE OUTPUT ROUTINE
- EXT CIN ; CONSOLE INPUT ROUTINE
- EXT CAPS ; CAPITALIZE ROUTINE
- EXT CRLF ; NEW LINE ROUTINE
- EXT FILLB ; FILL ROUTINE
- EXT CODEND ; CODE END COMPUTATION ROUTINE
-
- ;
- ; CP/M EQUATES
- ;
- CPM EQU 0 ; WARM BOOT
- FCB EQU 5CH ; FCB
- BUFF EQU 80H ; INPUT LINE BUFFER
- CR EQU 13 ; <CR>
- LF EQU 10 ; <LF>
-
- ;
- ; Environment Definition
- ;
- if z3env ne 0
- ;
- ; External ZCPR3 Environment Descriptor
- ;
- jmp start
- db 'Z3ENV' ;This is a ZCPR3 Utility
- db 1 ;External Environment Descriptor
- z3eadr:
- dw z3env
- start:
- lhld z3eadr ;pt to ZCPR3 environment
- ;
- else
- ;
- ; Internal ZCPR3 Environment Descriptor
- ;
- MACLIB Z3BASE.LIB
- MACLIB SYSENV.LIB
- z3eadr:
- jmp start
- SYSENV
- start:
- lxi h,z3eadr ;pt to ZCPR3 environment
- endif
-
- ;
- ; Start of Program -- Initialize ZCPR3 Environment
- ;
- call z3init ;initialize the ZCPR3 Env and the VLIB Env
- LXI H,0 ; GET STACK PTR
- DAD SP
- SHLD STACK ; SAVE IT
- CALL CODEND ; DETERMINE FREE SPACE
- SHLD CMDLNE ; COMMAND LINE BUFFER
- LXI D,100H ; BUFFER SIZE
- DAD D
- SHLD DIRBUF ; DIR BUFFER
- SPHL ; SET SP
- CALL PUTUD ; SAVE CURRENT USER/DISK AWAY
-
- CALL PRINT
- DB 'PROTECT Version '
- DB VERS/10+'0','.',(VERS MOD 10)+'0',0
- LDA FCB+1 ; GET FIRST CHAR OF FILE NAME
- CPI ' ' ; NO FILE SPEC?
- JZ HELP
- CPI '/' ; OPTION CAUGHT?
- JNZ ECONT
-
- ; PRINT HELP INFORMATION
- HELP:
- CALL PRINT
- DB CR,LF,'Syntax:'
- DB CR,LF,' PROTECT dir:filename.typ,dir:fn.ft,... o...'
- DB CR,LF,'Options:'
- DB CR,LF,' C -- Control Mode (Allow user to set each file)'
- DB CR,LF,' I -- Inspect Mode (Give user option to set att)'
- DB CR,LF,' n -- 1 <= n <= 8; Set Tag Attribute'
- DB CR,LF,' A -- Set AR (Archive) Attribute'
- DB CR,LF,' R -- Set R/O Attribute (no R sets R/W)'
- DB CR,LF,' S -- Set SYS Attribute (no S sets Non-System)'
- DB CR,LF
- DB 0
-
- ; RETURN TO OS
- RETURN:
- LHLD STACK ; GET OLD STACK
- SPHL ; SET IT
- RET
-
- ; COPY BUFFER INTO TEMP BUFFER
- ECONT:
- LHLD CMDLNE ; PT TO CMDLNE BUFFER
- XCHG
- LXI H,BUFF+1 ; PT TO BUFFER
- MVI B,80H ; ARBITRARY
- CALL MOVEB ; COPY INTO COMMAND LINE BUFFER
-
- ; EXTRACT FLAGS IF PRESENT
- XRA A ; SET NO INSPECT, NO R/O, NO ARCH, AND NO SYSTEM FILES
- STA INSPECT
- STA READONLY
- STA SYSTEM
- STA ARCHIVE
- STA CONTROL ; SET NO CONTROL MODE
- MVI B,8 ; CLEAR TAG BITS
- LXI H,TAGS
- CALL FILLB
- LXI H,0 ; SET FILE COUNT
- SHLD FILECNT
- LHLD CMDLNE ; PT TO BUFFER
- ; SKIP TO FILE NAME STRING
- SBLANK:
- MOV A,M ; SKIP TO NON-BLANK
- CPI ' ' ; <SP>?
- JNZ SBL1
- INX H ; PT TO NEXT CHAR
- JMP SBLANK
- ; SKIP TO END OF FILE NAME STRING
- SBL1:
- MOV A,M ; SKIP TO <SP> OR EOL
- ORA A ; DONE?
- JZ OPT
- CPI ' ' ; <SP>
- JZ OPT
- INX H ; PT TO NEXT
- JMP SBL1
- ; CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
- OPT:
- CPI '/' ; OPTION CHAR?
- JNZ OPTION
- INX H ; SKIP SLASH
- ; PROCESS LIST OF OPTIONS
- OPTION:
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ DSPEC
- INX H ; PT TO NEXT CHAR
- CPI ' ' ; SKIP OVER SPACES
- JZ OPTION
- CPI '/' ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
- JZ HELP
- CPI '1' ; DIGIT?
- JC HELP
- CPI '8'+1 ; IN RANGE?
- JC OPTNUM
- CPI 'C' ; CONTROL?
- JZ OPTCTRL
- CPI 'I' ; INSPECT?
- JZ OPTINS
- CPI 'A' ; ARCHIVE
- JZ OPTAR
- CPI 'R' ; READ/ONLY?
- JZ OPTRO
- CPI 'S' ; SYSTEM FILES?
- JNZ HELP
- MVI A,80H ; SET FOR SYS FILES
- STA SYSTEM
- JMP OPTION
- OPTNUM:
- SUI '1' ; ADJUST '1' TO '8' TO 0-7
- PUSH H ; SAVE PTR
- MOV E,A ; VALUE IN DE
- MVI D,0
- LXI H,TAGS ; PT TO TAG BUFFER
- DAD D ; PT TO ELEMENT
- MVI M,80H ; SELECT ELEMENT
- POP H ; GET PTR TO NEXT CHAR
- JMP OPTION
- OPTCTRL:
- MVI A,0FFH ; CONTROL MODE
- STA CONTROL
- JMP OPTION
- OPTINS:
- MVI A,0FFH ; INSPECT
- STA INSPECT
- JMP OPTION
- OPTAR:
- MVI A,80H ; SET ARCHIVE
- STA ARCHIVE
- JMP OPTION
- OPTRO:
- MVI A,80H ; SET R/O
- STA READONLY
- JMP OPTION
-
- ; EXTRACT DISK, USER, AND FILE NAME INFORMATION
- DSPEC:
- LHLD CMDLNE ; PT TO BEFORE FIRST BYTE
- DCX H
- DSPEC0:
- INX H ; PT TO BYTE
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ HELP
- CPI ' ' ; <SP>?
- JZ DSPEC0
- ;
- ; MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
- ; HL PTS TO FIRST BYTE OF NEXT FILE SPEC
- ;
- DSPEC1:
- CALL GETUD ; RESET USER IF NECESSARY
- LXI D,FCB ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
- MVI A,0 ; DIR BEFORE DU
- CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
- SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
- LXI D,FCB ; PT TO FCB
- CALL Z3LOG ; LOG INTO DU
-
- ; LOAD DIRECTORY AND PROTECT FILES
- PROT:
- LHLD DIRBUF ; PT TO END OF CODE
- MVI A,0C0H ; SELECT NON-SYS AND SYS FILES
- LXI D,FCB ; PT TO FCB
- CALL DIRQ ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
-
- ; PROT DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
- CALL PROTFILES
-
- ; CHECK FOR NEXT FILE SPEC
- LHLD NEXTCH ; GET PTR
- MOV A,M ; GET DELIM
- CPI ',' ; ANOTHER FILE?
- JNZ PROTDONE
- INX H ; PT TO CHAR AFTER COMMA
- JMP DSPEC1 ; CONTINUE PROCESSING
-
- ; PROT COMPLETE -- PRINT COUNT AND EXIT
- PROTDONE:
- CALL PRCOUNT ; PRINT FILE COUNT
- JMP RETURN
-
- ; PROT SELECTED FILES
- PROTFILES:
- MOV A,B ; CHECK FOR ANY FILES LOADED
- ORA C
- RZ
-
- ; PRINT FILE NAME
- PROTLP:
- PUSH B ; SAVE ENTRY COUNT
- CALL CRLF ; NEW LINE
- PUSH H ; SAVE PTR TO FCB
- INX H ; PT TO FILE NAME
- MVI B,8 ; PRINT NAME
- CALL PRNT
- MVI A,'.' ; DECIMAL
- CALL COUT
- MVI B,3 ; PRINT TYPE
- CALL PRNT
- POP H ; GET PTR
-
- ; CHECK FOR CONTROL MODE AND PERFORM CONTROL FUNCTION IF SET
- LDA CONTROL ; GET FLAG
- ORA A ; NZ=YES
- JNZ PROTCTRL
-
- ; CHECK FOR INSPECTION AND INSPECT IF SET
- LDA INSPECT ; GET FLAG
- ORA A ; 0=NO
- JZ DOIT
-
- ; PROMPT USER FOR PROTECT
- CALL PROTQ ; PROT QUESTION
- CPI 'Q' ; QUIT?
- JZ QUIT
- CPI 'Y' ; YES?
- JZ DOIT
-
- ; DON'T PROTECT FILE
- NODO:
- CALL PRINT
- DB ' ++ NO Attribute Change ++',0
- JMP PROTTEST
-
- ; PROMPT USER FOR PROT
- PROTQ:
- CALL PRINT ; PRINT PROMPT
- DB ' -- Protect (Y/N/Q=Quit/other=N)? ',0
- CALL CIN ; GET RESPONSE
- CALL CAPS ; CAPITALIZE
- CALL COUT ; ECHO
- RET
-
- ; CONTROL FUNCTION -- ALLOW USER TO SET BITS AS HE DESIRES
- PROTCTRL:
- PUSH H ; SAVE PTR TO FILE
- XRA A ; A=0
- STA READONLY ; CLEAR R/O, SYS, ARCHIVE, AND TAGS
- STA SYSTEM
- STA ARCHIVE
- LXI H,TAGS
- MVI B,8
- CALL FILLB
- CALL PRINT
- DB ' -- Attributes (? for Help)? ',0
- MVI A,0FFH ; CAPITALIZE
- CALL BBLINE ; INPUT LINE FROM USER
- CALL CRLF ; NEW LINE
- MVI B,80H ; MSB SET
- PCTRL:
- MOV A,M ; GET ATTRIBUTE FLAG
- ORA A ; DONE?
- JZ PDOIT ; DO PROTECTION THEN
- INX H ; PT TO NEXT
- CPI ' ' ; SKIP <SP>
- JZ PCTRL
- CPI 'Q' ; QUIT?
- JZ QUIT
- CPI 'A' ; ARCHIVE?
- JZ PCTRLA
- CPI 'S' ; SYSTEM?
- JZ PCTRLS
- CPI 'R' ; R/O?
- JZ PCTRLR
- CPI '1' ; DIGIT?
- JC PCTRLH ; HELP IF NOT
- CPI '8'+1 ; RANGE?
- JC PCTRLN ; DO NUMBER
- PCTRLH:
- CALL PRINT
- DB CR,LF,' Attributes may be specified as follows --'
- DB CR,LF,' A = Archive, R = R/O, S = SYS, 1-8 = Tags'
- DB CR,LF,' The command Q exits'
- DB CR,LF,0
- POP H ; GET FCB PTR
- POP B ; GET ENTRY COUNT
- JMP PROTLP ; PROCESS AGAIN
- PCTRLA:
- MOV A,B ; GET FLAG
- STA ARCHIVE ; SET FLAG
- JMP PCTRL
- PCTRLS:
- MOV A,B ; GET FLAG
- STA SYSTEM ; SET FLAG
- JMP PCTRL
- PCTRLR:
- MOV A,B ; GET AND SET FLAG
- STA READONLY
- JMP PCTRL
- PCTRLN:
- PUSH H
- SUI '1' ; CONVERT TO OFFSET
- MOV E,A ; OFFSET IN DE
- MVI D,0
- LXI H,TAGS ; SET TAG
- DAD D
- MOV M,B ; SET BIT
- POP H
- JMP PCTRL ; CONTINUE
-
- ; QUIT PROTECT PROGRAM
- QUIT:
- CALL PRCOUNT ; PRINT COUNT OF FILES PROTECTED
- CALL PRINT
- DB CR,LF,' QUIT',0
- JMP RETURN
-
- ; PROT FILE, BUT GET PTR FIRST
- PDOIT:
- POP H ; GET PTR
-
- ; PROT FILE
- DOIT:
- PUSH H
- LXI D,PROTFCB ; COPY TARGET FILE INTO PROTECT'S FCB
- MVI B,16 ; 16 BYTES
- CALL MOVEB ; COPY
- LXI H,TAGS ; SET TAG BITS NOW
- INX D ; PT TO FIRST TAG BIT
- MVI B,8 ; 8 TAG BITS
- DOITL:
- LDAX D ; GET BYTE FROM PROT FCB
- ANI 7FH ; MASK OUT OLD MSB
- ORA M ; OR IN TAG BIT
- STAX D ; PUT BYTE BACK
- INX H ; PT TO NEXT
- INX D
- DCR B ; COUNT DOWN
- JNZ DOITL
- LDA READONLY ; GET R/O BIT
- MOV B,A ; SAVE IN B
- LDAX D ; GET BYTE
- ANI 7FH ; MASK OUT OLD MSB
- ORA B ; OR IN NEW MSB
- STAX D ; PUT IT BACK
- INX D ; PT TO SYS BIT
- LDA SYSTEM ; GET SYS BIT
- MOV B,A ; SAVE IT
- LDAX D ; GET BYTE
- ANI 7FH ; MASK OUT OLD MSB
- ORA B ; MASK IN NEW MSB
- STAX D ; PUT IT BACK
- INX D ; PT TO ARCHIVE BIT
- LDA ARCHIVE ; GET ARCHIVE BIT
- MOV B,A ; SAVE IT
- LDAX D ; GET BYTE
- ANI 7FH ; MASK OUT OLD MSB
- ORA B ; MASK IN NEW MSB
- STAX D ; PUT IT BACK
- LXI D,PROTFCB ; PT TO FCB
- CALL INITFCB ; INIT IT
- MVI C,30 ; SET FILE ATTRIBUTES
- CALL BDOS
- CALL PRINT
- DB ' Set to ',0
- LXI H,PROTFCB+1
- MVI B,8 ; 8 TAGS
- MVI C,'1' ; SET DIGIT
- PATTL1:
- MOV A,M ; GET BYTE
- ANI 80H ; PRINT ATT?
- JZ PATTL2
- MOV A,C ; GET DIGIT
- CALL COUT
- PATTL2:
- INR C ; INCREMENT DIGIT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PATTL1
- MOV A,M ; GET R/O BYTE
- ANI 80H ; MASK IT
- JZ PATTL3
- CALL PRINT
- DB ' R/O ',0
- JMP PATTL4
- PATTL3:
- CALL PRINT
- DB ' R/W ',0
- PATTL4:
- INX H ; PT TO SYS BYTE
- MOV A,M ; GET SYS BYTE
- ANI 80H ; MASK IT
- JZ PATTL5
- CALL PRINT
- DB 'SYS',0
- JMP PATTL6
- PATTL5:
- CALL PRINT
- DB 'DIR',0
- PATTL6:
- INX H ; PT TO ARCHIVE BYTE
- MOV A,M ; GET ARCH BYTE
- ANI 80H ; MASK IT
- JZ PATTL7
- CALL PRINT
- DB ' AR',0
- PATTL7:
- LHLD FILECNT ; INCREMENT FILE COUNT
- INX H
- SHLD FILECNT
- POP H ; GET PTR TO DIRECTORY ENTRY
-
- ; PT TO NEXT ENTRY
- PROTTEST:
- LXI D,ESIZE ; PT TO NEXT ENTRY
- DAD D
- POP B ; GET COUNT
- DCX B ; COUNT DOWN
- MOV A,B ; CHECK FOR ZERO
- ORA C
- JNZ PROTLP
-
- ; RETURN TO CALLER
- RET
-
- ;
- ; PRINT CHARS PTED TO BY HL FOR B BYTES
- ;
- PRNT:
- MOV A,M ; GET CHAR
- CALL COUT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PRNT
- RET
-
- ;
- ; PRINT COUNT OF NUMBER OF FILES PROTECTED
- ;
- PRCOUNT:
- CALL CRLF ; NEW LINE
- LHLD FILECNT ; GET COUNT
- MOV A,L ; CHECK FOR NONE
- ORA H
- JZ PRNO
- CALL PHLDC ; PRINT DECIMAL COUNT
- JMP PRMS
- PRNO:
- CALL PRINT
- DB 'No ',0
- PRMS:
- LHLD FILECNT ; 1 FILE PROTECTED?
- MOV A,H ; HIGH ZERO?
- ORA A
- JNZ PRMULT
- MOV A,L ; LOW ONE?
- CPI 1
- JZ PRSING
- PRMULT:
- CALL PRINT
- DB ' Files Protected',0
- RET
- PRSING:
- CALL PRINT
- DB ' File Protected',0
- RET
-
- ;
- ; BUFFERS
- ;
- INSPECT:
- DS 1 ; INSPECT FLAG (0=NO, 0FFH=YES)
- CONTROL:
- DS 1 ; CONTROL FLAG (0=NO, 0FFH=YES)
- ARCHIVE:
- DS 1 ; ARCHIVE FLAG (0=NO, 80H=YES)
- SYSTEM:
- DS 1 ; SYSTEM FLAG (0=NO, 80H=YES)
- READONLY:
- DS 1 ; READ/ONLY FLAG (0=NO, 80H=YES)
- TAGS:
- DS 8 ; 8 TAG BITS
- NEXTCH:
- DS 2 ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
- FILECNT:
- DS 2 ; COUNT OF NUMBER OF FILES PROTECTED
- PROTFCB:
- DS 40 ; FCB FOR PROTECT
- CMDLNE:
- DS 2 ; PTR TO COMMAND LINE SAVE AREA
- DIRBUF:
- DS 2 ; DIRECTORY BUFFER
- STACK:
- DS 2 ; OLD STACK PTR
-
- END