home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / ZCPR3 / PROTECT.MAC < prev    next >
Text File  |  2000-06-30  |  12KB  |  591 lines

  1. ;  PROGRAM:  PROTECT
  2. ;  VERSION:  3.0
  3. ;  DATE:  18 May 84
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSIONS:  2.0 (16 Jan 83)
  6. ;  PREVIOUS VERSIONS:  1.3 (6 Jan 83), 1.2 (7 Dec 82), 1.1 (10 NOV 82)
  7. ;  PREVIOUS VERSION:  PROTECT.ASM Version 1.0 (26 OCT 81)
  8. VERS    equ    30
  9. z3env    SET    0f400h
  10.  
  11. ;
  12. ;  PROTECT Command --
  13. ;    PROTECT is used to set the file protection and tag attribute bits
  14. ; for CP/M 2.x files in the ZCPR3 environment.  It is invoked via command
  15. ; lines of the following forms:
  16. ;        PROTECT dir:afn1,dir:afn2,... keys    <-- Set unconditionally
  17. ;        PROTECT dir:afn1,... keys I        <-- Inspect Mode
  18. ;        PROTECT dir:afn1,... C            <-- Set each ufn
  19. ;
  20. ;    In the above examples, the reference 'keys' is a string of zero or
  21. ; more characters which may be any of the following:
  22. ;
  23. ;        A <-- Set AR Attribute
  24. ;        R <-- Set R/O Attribute (no R sets R/W)
  25. ;        S <-- Set SYS Attribute (no S sets Non-System)
  26. ;        n <-- Set Tag Attribute (1 <= n <= 8)
  27. ;
  28. ;    Examples:
  29. ;        PROTECT *.COM RS    <-- Sets all COM files to R/O SYStem
  30. ;        PROTECT *.COM RSI    <-- Same, with user approval
  31. ;        PROTECT *.COM C        <-- Allows user to specify for each
  32. ;        PROTECT MYPROG.COM 1R    <-- Sets Tag Bit 1 and R/O Attribute
  33. ;
  34.  
  35. FALSE    EQU    0
  36. TRUE    EQU    NOT FALSE
  37.  
  38. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  39.  
  40.     EXT    DIRQ    ; DIRECTORY PROCESSOR
  41.  
  42.     EXT    Z3INIT    ; INIT BUFFERS
  43.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  44.     EXT    Z3LOG    ; LOG INTO Z3 DU
  45.  
  46.     EXT    BBLINE    ; INPUT LINE EDITOR
  47.     EXT    INITFCB    ; INIT FCB
  48.     EXT    BDOS    ; BDOS ENTRY
  49.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  50.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  51.     EXT    MOVEB    ; COPY ROUTINE
  52.     EXT    PHLDC    ; PRINT HL AS DECIMAL CHARS
  53.     EXT    PRINT    ; PRINT ROUTINE
  54.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  55.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  56.     EXT    CAPS    ; CAPITALIZE ROUTINE
  57.     EXT    CRLF    ; NEW LINE ROUTINE
  58.     EXT    FILLB    ; FILL ROUTINE
  59.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  60.  
  61. ;
  62. ;  CP/M EQUATES
  63. ;
  64. CPM    EQU    0    ; WARM BOOT
  65. FCB    EQU    5CH    ; FCB
  66. BUFF    EQU    80H    ; INPUT LINE BUFFER
  67. CR    EQU    13    ; <CR>
  68. LF    EQU    10    ; <LF>
  69.  
  70. ;
  71. ; Environment Definition
  72. ;
  73.     if    z3env ne 0
  74. ;
  75. ; External ZCPR3 Environment Descriptor
  76. ;
  77.     jmp    start
  78.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  79.     db    1    ;External Environment Descriptor
  80. z3eadr:
  81.     dw    z3env
  82. start:
  83.     lhld    z3eadr    ;pt to ZCPR3 environment
  84. ;
  85.     else
  86. ;
  87. ; Internal ZCPR3 Environment Descriptor
  88. ;
  89.     MACLIB    Z3BASE.LIB
  90.     MACLIB    SYSENV.LIB
  91. z3eadr:
  92.     jmp    start
  93.     SYSENV
  94. start:
  95.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  96.     endif
  97.  
  98. ;
  99. ; Start of Program -- Initialize ZCPR3 Environment
  100. ;
  101.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  102.     LXI    H,0    ; GET STACK PTR
  103.     DAD    SP
  104.     SHLD    STACK    ; SAVE IT
  105.     CALL    CODEND    ; DETERMINE FREE SPACE
  106.     SHLD    CMDLNE    ; COMMAND LINE BUFFER
  107.     LXI    D,100H    ; BUFFER SIZE
  108.     DAD    D
  109.     SHLD    DIRBUF    ; DIR BUFFER
  110.     SPHL        ; SET SP
  111.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  112.  
  113.     CALL    PRINT
  114.     DB    'PROTECT  Version '
  115.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  116.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  117.     CPI    ' '    ; NO FILE SPEC?
  118.     JZ    HELP
  119.     CPI    '/'    ; OPTION CAUGHT?
  120.     JNZ    ECONT
  121.  
  122. ;  PRINT HELP INFORMATION
  123. HELP:
  124.     CALL    PRINT
  125.     DB    CR,LF,'Syntax:'
  126.     DB    CR,LF,'    PROTECT dir:filename.typ,dir:fn.ft,... o...'
  127.     DB    CR,LF,'Options:'
  128.     DB    CR,LF,'  C -- Control Mode (Allow user to set each file)'
  129.     DB    CR,LF,'  I -- Inspect Mode (Give user option to set att)'
  130.     DB    CR,LF,'  n -- 1 <= n <= 8; Set Tag Attribute'
  131.     DB    CR,LF,'  A -- Set AR (Archive) Attribute'
  132.     DB    CR,LF,'  R -- Set R/O Attribute (no R sets R/W)'
  133.     DB    CR,LF,'  S -- Set SYS Attribute (no S sets Non-System)'
  134.     DB    CR,LF
  135.     DB    0
  136.  
  137. ;  RETURN TO OS
  138. RETURN:
  139.     LHLD    STACK    ; GET OLD STACK
  140.     SPHL        ; SET IT
  141.     RET
  142.  
  143. ;  COPY BUFFER INTO TEMP BUFFER
  144. ECONT:
  145.     LHLD    CMDLNE    ; PT TO CMDLNE BUFFER
  146.     XCHG
  147.     LXI    H,BUFF+1    ; PT TO BUFFER
  148.     MVI    B,80H    ; ARBITRARY
  149.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  150.  
  151. ;  EXTRACT FLAGS IF PRESENT
  152.     XRA    A    ; SET NO INSPECT, NO R/O, NO ARCH, AND NO SYSTEM FILES
  153.     STA    INSPECT
  154.     STA    READONLY
  155.     STA    SYSTEM
  156.     STA    ARCHIVE
  157.     STA    CONTROL    ; SET NO CONTROL MODE
  158.     MVI    B,8    ; CLEAR TAG BITS
  159.     LXI    H,TAGS
  160.     CALL    FILLB
  161.     LXI    H,0    ; SET FILE COUNT
  162.     SHLD    FILECNT
  163.     LHLD    CMDLNE    ; PT TO BUFFER
  164. ;  SKIP TO FILE NAME STRING
  165. SBLANK:
  166.     MOV    A,M    ; SKIP TO NON-BLANK
  167.     CPI    ' '    ; <SP>?
  168.     JNZ    SBL1
  169.     INX    H    ; PT TO NEXT CHAR
  170.     JMP    SBLANK
  171. ;  SKIP TO END OF FILE NAME STRING
  172. SBL1:
  173.     MOV    A,M    ; SKIP TO <SP> OR EOL
  174.     ORA    A    ; DONE?
  175.     JZ    OPT
  176.     CPI    ' '    ; <SP>
  177.     JZ    OPT
  178.     INX    H    ; PT TO NEXT
  179.     JMP    SBL1
  180. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  181. OPT:
  182.     CPI    '/'    ; OPTION CHAR?
  183.     JNZ    OPTION
  184.     INX    H    ; SKIP SLASH
  185. ;  PROCESS LIST OF OPTIONS
  186. OPTION:
  187.     MOV    A,M    ; GET BYTE
  188.     ORA    A    ; DONE?
  189.     JZ    DSPEC
  190.     INX    H    ; PT TO NEXT CHAR
  191.     CPI    ' '    ; SKIP OVER SPACES
  192.     JZ    OPTION
  193.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  194.     JZ    HELP
  195.     CPI    '1'    ; DIGIT?
  196.     JC    HELP
  197.     CPI    '8'+1    ; IN RANGE?
  198.     JC    OPTNUM
  199.     CPI    'C'    ; CONTROL?
  200.     JZ    OPTCTRL
  201.     CPI    'I'    ; INSPECT?
  202.     JZ    OPTINS
  203.     CPI    'A'    ; ARCHIVE
  204.     JZ    OPTAR
  205.     CPI    'R'    ; READ/ONLY?
  206.     JZ    OPTRO
  207.     CPI    'S'    ; SYSTEM FILES?
  208.     JNZ    HELP
  209.     MVI    A,80H    ; SET FOR SYS FILES
  210.     STA    SYSTEM
  211.     JMP    OPTION
  212. OPTNUM:
  213.     SUI    '1'    ; ADJUST '1' TO '8' TO 0-7
  214.     PUSH    H    ; SAVE PTR
  215.     MOV    E,A    ; VALUE IN DE
  216.     MVI    D,0
  217.     LXI    H,TAGS    ; PT TO TAG BUFFER
  218.     DAD    D    ; PT TO ELEMENT
  219.     MVI    M,80H    ; SELECT ELEMENT
  220.     POP    H    ; GET PTR TO NEXT CHAR
  221.     JMP    OPTION
  222. OPTCTRL:
  223.     MVI    A,0FFH    ; CONTROL MODE
  224.     STA    CONTROL
  225.     JMP    OPTION
  226. OPTINS:
  227.     MVI    A,0FFH    ; INSPECT
  228.     STA    INSPECT
  229.     JMP    OPTION
  230. OPTAR:
  231.     MVI    A,80H    ; SET ARCHIVE
  232.     STA    ARCHIVE
  233.     JMP    OPTION
  234. OPTRO:
  235.     MVI    A,80H    ; SET R/O
  236.     STA    READONLY
  237.     JMP    OPTION
  238.  
  239. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  240. DSPEC:
  241.     LHLD    CMDLNE    ; PT TO BEFORE FIRST BYTE
  242.     DCX    H
  243. DSPEC0:
  244.     INX    H    ; PT TO BYTE
  245.     MOV    A,M    ; GET BYTE
  246.     ORA    A    ; DONE?
  247.     JZ    HELP
  248.     CPI    ' '    ; <SP>?
  249.     JZ    DSPEC0
  250. ;
  251. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  252. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  253. ;
  254. DSPEC1:
  255.     CALL    GETUD    ; RESET USER IF NECESSARY
  256.     LXI    D,FCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  257.     MVI    A,0    ; DIR BEFORE DU
  258.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  259.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  260.     LXI    D,FCB    ; PT TO FCB
  261.     CALL    Z3LOG    ; LOG INTO DU
  262.  
  263. ;  LOAD DIRECTORY AND PROTECT FILES
  264. PROT:
  265.     LHLD    DIRBUF    ; PT TO END OF CODE
  266.     MVI    A,0C0H    ; SELECT NON-SYS AND SYS FILES
  267.     LXI    D,FCB    ; PT TO FCB
  268.     CALL    DIRQ    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  269.  
  270. ;  PROT DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
  271.     CALL    PROTFILES
  272.  
  273. ;  CHECK FOR NEXT FILE SPEC
  274.     LHLD    NEXTCH    ; GET PTR
  275.     MOV    A,M    ; GET DELIM
  276.     CPI    ','    ; ANOTHER FILE?
  277.     JNZ    PROTDONE
  278.     INX    H    ; PT TO CHAR AFTER COMMA
  279.     JMP    DSPEC1    ; CONTINUE PROCESSING
  280.  
  281. ;  PROT COMPLETE -- PRINT COUNT AND EXIT
  282. PROTDONE:
  283.     CALL    PRCOUNT    ; PRINT FILE COUNT
  284.     JMP    RETURN
  285.  
  286. ;  PROT SELECTED FILES
  287. PROTFILES:
  288.     MOV    A,B    ; CHECK FOR ANY FILES LOADED
  289.     ORA    C
  290.     RZ
  291.  
  292. ;  PRINT FILE NAME
  293. PROTLP:
  294.     PUSH    B    ; SAVE ENTRY COUNT
  295.     CALL    CRLF    ; NEW LINE
  296.     PUSH    H    ; SAVE PTR TO FCB
  297.     INX    H    ; PT TO FILE NAME
  298.     MVI    B,8    ; PRINT NAME
  299.     CALL    PRNT
  300.     MVI    A,'.'    ; DECIMAL
  301.     CALL    COUT
  302.     MVI    B,3    ; PRINT TYPE
  303.     CALL    PRNT
  304.     POP    H    ; GET PTR
  305.  
  306. ;  CHECK FOR CONTROL MODE AND PERFORM CONTROL FUNCTION IF SET
  307.     LDA    CONTROL    ; GET FLAG
  308.     ORA    A    ; NZ=YES
  309.     JNZ    PROTCTRL
  310.  
  311. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  312.     LDA    INSPECT    ; GET FLAG
  313.     ORA    A    ; 0=NO
  314.     JZ    DOIT
  315.  
  316. ;  PROMPT USER FOR PROTECT
  317.     CALL    PROTQ    ; PROT QUESTION
  318.     CPI    'Q'    ; QUIT?
  319.     JZ    QUIT
  320.     CPI    'Y'    ; YES?
  321.     JZ    DOIT
  322.  
  323. ;  DON'T PROTECT FILE
  324. NODO:
  325.     CALL    PRINT
  326.     DB    '  ++ NO Attribute Change ++',0
  327.     JMP    PROTTEST
  328.  
  329. ;  PROMPT USER FOR PROT
  330. PROTQ:
  331.     CALL    PRINT    ; PRINT PROMPT
  332.     DB    ' -- Protect (Y/N/Q=Quit/other=N)? ',0
  333.     CALL    CIN    ; GET RESPONSE
  334.     CALL    CAPS    ; CAPITALIZE
  335.     CALL    COUT    ; ECHO
  336.     RET
  337.  
  338. ;  CONTROL FUNCTION -- ALLOW USER TO SET BITS AS HE DESIRES
  339. PROTCTRL:
  340.     PUSH    H    ; SAVE PTR TO FILE
  341.     XRA    A    ; A=0
  342.     STA    READONLY    ; CLEAR R/O, SYS, ARCHIVE, AND TAGS
  343.     STA    SYSTEM
  344.     STA    ARCHIVE
  345.     LXI    H,TAGS
  346.     MVI    B,8
  347.     CALL    FILLB
  348.     CALL    PRINT
  349.     DB    ' -- Attributes (? for Help)? ',0
  350.     MVI    A,0FFH    ; CAPITALIZE
  351.     CALL    BBLINE    ; INPUT LINE FROM USER
  352.     CALL    CRLF    ; NEW LINE
  353.     MVI    B,80H    ; MSB SET
  354. PCTRL:
  355.     MOV    A,M    ; GET ATTRIBUTE FLAG
  356.     ORA    A    ; DONE?
  357.     JZ    PDOIT    ; DO PROTECTION THEN
  358.     INX    H    ; PT TO NEXT
  359.     CPI    ' '    ; SKIP <SP>
  360.     JZ    PCTRL
  361.     CPI    'Q'    ; QUIT?
  362.     JZ    QUIT
  363.     CPI    'A'    ; ARCHIVE?
  364.     JZ    PCTRLA
  365.     CPI    'S'    ; SYSTEM?
  366.     JZ    PCTRLS
  367.     CPI    'R'    ; R/O?
  368.     JZ    PCTRLR
  369.     CPI    '1'    ; DIGIT?
  370.     JC    PCTRLH    ; HELP IF NOT
  371.     CPI    '8'+1    ; RANGE?
  372.     JC    PCTRLN    ; DO NUMBER
  373. PCTRLH:
  374.     CALL    PRINT
  375.     DB    CR,LF,'  Attributes may be specified as follows --'
  376.     DB    CR,LF,'    A = Archive, R = R/O, S = SYS, 1-8 = Tags'
  377.     DB    CR,LF,'  The command Q exits'
  378.     DB    CR,LF,0
  379.     POP    H    ; GET FCB PTR
  380.     POP    B    ; GET ENTRY COUNT
  381.     JMP    PROTLP    ; PROCESS AGAIN
  382. PCTRLA:
  383.     MOV    A,B    ; GET FLAG
  384.     STA    ARCHIVE    ; SET FLAG
  385.     JMP    PCTRL
  386. PCTRLS:
  387.     MOV    A,B    ; GET FLAG
  388.     STA    SYSTEM    ; SET FLAG
  389.     JMP    PCTRL
  390. PCTRLR:
  391.     MOV    A,B    ; GET AND SET FLAG
  392.     STA    READONLY
  393.     JMP    PCTRL
  394. PCTRLN:
  395.     PUSH    H
  396.     SUI    '1'    ; CONVERT TO OFFSET
  397.     MOV    E,A    ; OFFSET IN DE
  398.     MVI    D,0
  399.     LXI    H,TAGS    ; SET TAG
  400.     DAD    D
  401.     MOV    M,B    ; SET BIT
  402.     POP    H
  403.     JMP    PCTRL    ; CONTINUE
  404.  
  405. ;  QUIT PROTECT PROGRAM
  406. QUIT:
  407.     CALL    PRCOUNT    ; PRINT COUNT OF FILES PROTECTED
  408.     CALL    PRINT
  409.     DB    CR,LF,'  QUIT',0
  410.     JMP    RETURN
  411.  
  412. ;  PROT FILE, BUT GET PTR FIRST
  413. PDOIT:
  414.     POP    H    ; GET PTR
  415.  
  416. ;  PROT FILE
  417. DOIT:
  418.     PUSH    H
  419.     LXI    D,PROTFCB    ; COPY TARGET FILE INTO PROTECT'S FCB
  420.     MVI    B,16    ; 16 BYTES
  421.     CALL    MOVEB    ; COPY
  422.     LXI    H,TAGS    ; SET TAG BITS NOW
  423.     INX    D    ; PT TO FIRST TAG BIT
  424.     MVI    B,8    ; 8 TAG BITS
  425. DOITL:
  426.     LDAX    D    ; GET BYTE FROM PROT FCB
  427.     ANI    7FH    ; MASK OUT OLD MSB
  428.     ORA    M    ; OR IN TAG BIT
  429.     STAX    D    ; PUT BYTE BACK
  430.     INX    H    ; PT TO NEXT
  431.     INX    D
  432.     DCR    B    ; COUNT DOWN
  433.     JNZ    DOITL
  434.     LDA    READONLY    ; GET R/O BIT
  435.     MOV    B,A    ; SAVE IN B
  436.     LDAX    D    ; GET BYTE
  437.     ANI    7FH    ; MASK OUT OLD MSB
  438.     ORA    B    ; OR IN NEW MSB
  439.     STAX    D    ; PUT IT BACK
  440.     INX    D    ; PT TO SYS BIT
  441.     LDA    SYSTEM    ; GET SYS BIT
  442.     MOV    B,A    ; SAVE IT
  443.     LDAX    D    ; GET BYTE
  444.     ANI    7FH    ; MASK OUT OLD MSB
  445.     ORA    B    ; MASK IN NEW MSB
  446.     STAX    D    ; PUT IT BACK
  447.     INX    D    ; PT TO ARCHIVE BIT
  448.     LDA    ARCHIVE    ; GET ARCHIVE BIT
  449.     MOV    B,A    ; SAVE IT
  450.     LDAX    D    ; GET BYTE
  451.     ANI    7FH    ; MASK OUT OLD MSB
  452.     ORA    B    ; MASK IN NEW MSB
  453.     STAX    D    ; PUT IT BACK
  454.     LXI    D,PROTFCB    ; PT TO FCB
  455.     CALL    INITFCB    ; INIT IT
  456.     MVI    C,30    ; SET FILE ATTRIBUTES
  457.     CALL    BDOS
  458.     CALL    PRINT
  459.     DB    ' Set to ',0
  460.     LXI    H,PROTFCB+1
  461.     MVI    B,8    ; 8 TAGS
  462.     MVI    C,'1'    ; SET DIGIT
  463. PATTL1:
  464.     MOV    A,M    ; GET BYTE
  465.     ANI    80H    ; PRINT ATT?
  466.     JZ    PATTL2
  467.     MOV    A,C    ; GET DIGIT
  468.     CALL    COUT
  469. PATTL2:
  470.     INR    C    ; INCREMENT DIGIT
  471.     INX    H    ; PT TO NEXT
  472.     DCR    B    ; COUNT DOWN
  473.     JNZ    PATTL1
  474.     MOV    A,M    ; GET R/O BYTE
  475.     ANI    80H    ; MASK IT
  476.     JZ    PATTL3
  477.     CALL    PRINT
  478.     DB    ' R/O ',0
  479.     JMP    PATTL4
  480. PATTL3:
  481.     CALL    PRINT
  482.     DB    ' R/W ',0
  483. PATTL4:
  484.     INX    H    ; PT TO SYS BYTE
  485.     MOV    A,M    ; GET SYS BYTE
  486.     ANI    80H    ; MASK IT
  487.     JZ    PATTL5
  488.     CALL    PRINT
  489.     DB    'SYS',0
  490.     JMP    PATTL6
  491. PATTL5:
  492.     CALL    PRINT
  493.     DB    'DIR',0
  494. PATTL6:
  495.     INX    H    ; PT TO ARCHIVE BYTE
  496.     MOV    A,M    ; GET ARCH BYTE
  497.     ANI    80H    ; MASK IT
  498.     JZ    PATTL7
  499.     CALL    PRINT
  500.     DB    ' AR',0
  501. PATTL7:
  502.     LHLD    FILECNT    ; INCREMENT FILE COUNT
  503.     INX    H
  504.     SHLD    FILECNT
  505.     POP    H    ; GET PTR TO DIRECTORY ENTRY
  506.  
  507. ;  PT TO NEXT ENTRY
  508. PROTTEST:
  509.     LXI    D,ESIZE    ; PT TO NEXT ENTRY
  510.     DAD    D
  511.     POP    B    ; GET COUNT
  512.     DCX    B    ; COUNT DOWN
  513.     MOV    A,B    ; CHECK FOR ZERO
  514.     ORA    C
  515.     JNZ    PROTLP
  516.  
  517. ;  RETURN TO CALLER
  518.     RET
  519.  
  520. ;
  521. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  522. ;
  523. PRNT:
  524.     MOV    A,M    ; GET CHAR
  525.     CALL    COUT
  526.     INX    H    ; PT TO NEXT
  527.     DCR    B    ; COUNT DOWN
  528.     JNZ    PRNT
  529.     RET
  530.  
  531. ;
  532. ;  PRINT COUNT OF NUMBER OF FILES PROTECTED
  533. ;
  534. PRCOUNT:
  535.     CALL    CRLF    ; NEW LINE
  536.     LHLD    FILECNT    ; GET COUNT
  537.     MOV    A,L    ; CHECK FOR NONE
  538.     ORA    H
  539.     JZ    PRNO
  540.     CALL    PHLDC    ; PRINT DECIMAL COUNT
  541.     JMP    PRMS
  542. PRNO:
  543.     CALL    PRINT
  544.     DB    'No ',0
  545. PRMS:
  546.     LHLD    FILECNT    ; 1 FILE PROTECTED?
  547.     MOV    A,H    ; HIGH ZERO?
  548.     ORA    A
  549.     JNZ    PRMULT
  550.     MOV    A,L    ; LOW ONE?
  551.     CPI    1
  552.     JZ    PRSING
  553. PRMULT:
  554.     CALL    PRINT
  555.     DB    ' Files Protected',0
  556.     RET
  557. PRSING:
  558.     CALL    PRINT
  559.     DB    ' File  Protected',0
  560.     RET
  561.  
  562. ;
  563. ;  BUFFERS
  564. ;
  565. INSPECT:
  566.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  567. CONTROL:
  568.     DS    1    ; CONTROL FLAG (0=NO, 0FFH=YES)
  569. ARCHIVE:
  570.     DS    1    ; ARCHIVE FLAG (0=NO, 80H=YES)
  571. SYSTEM:
  572.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  573. READONLY:
  574.     DS    1    ; READ/ONLY FLAG (0=NO, 80H=YES)
  575. TAGS:
  576.     DS    8    ; 8 TAG BITS
  577. NEXTCH:
  578.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  579. FILECNT:
  580.     DS    2    ; COUNT OF NUMBER OF FILES PROTECTED
  581. PROTFCB:
  582.     DS    40    ; FCB FOR PROTECT
  583. CMDLNE:
  584.     DS    2    ; PTR TO COMMAND LINE SAVE AREA
  585. DIRBUF:
  586.     DS    2    ; DIRECTORY BUFFER
  587. STACK:
  588.     DS    2    ; OLD STACK PTR
  589.  
  590.     END
  591.