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 / CPM / ZCPR2 / PROTECT.MAC < prev    next >
Text File  |  2000-06-30  |  18KB  |  802 lines

  1. ;  PROGRAM:  PROTECT
  2. ;  VERSION:  2.0
  3. ;  DATE:  16 Jan 83
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSIONS:  1.3 (6 Jan 83), 1.2 (7 Dec 82), 1.1 (10 NOV 82)
  6. ;  PREVIOUS VERSION:  PROTECT.ASM Version 1.0 (26 OCT 81)
  7. VERS    equ    20
  8.  
  9. ;
  10. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  11. ;    All Rights Reserved
  12. ;
  13. ;    ZCPR2 and its utilities, including this one, are released
  14. ; to the public domain.  Anyone who wishes to USE them may do so with
  15. ; no strings attached.  The author assumes no responsibility or
  16. ; liability for the use of ZCPR2 and its utilities.
  17. ;
  18. ;    The author, Richard Conn, has sole rights to this program.
  19. ; ZCPR2 and its utilities may not be sold without the express,
  20. ; written permission of the author.
  21. ;
  22.  
  23.  
  24. ;
  25. ;  PROTECT Command --
  26. ;    PROTECT is used to set the file protection and tag attribute bits
  27. ; for CP/M 2.x files in the ZCPR2 environment.  It is invoked via command
  28. ; lines of the following forms:
  29. ;        PROTECT dir:afn1,dir:afn2,... keys    <-- Set unconditionally
  30. ;        PROTECT dir:afn1,... keys I        <-- Inspect Mode
  31. ;        PROTECT dir:afn1,... C            <-- Set each ufn
  32. ;
  33. ;    In the above examples, the reference 'keys' is a string of zero or
  34. ; more characters which may be any of the following:
  35. ;
  36. ;        A <-- Set AR Attribute
  37. ;        R <-- Set R/O Attribute (no R sets R/W)
  38. ;        S <-- Set SYS Attribute (no S sets Non-System)
  39. ;        n <-- Set Tag Attribute (1 <= n <= 8)
  40. ;
  41. ;    Examples:
  42. ;        PROTECT *.COM RS    <-- Sets all COM files to R/O SYStem
  43. ;        PROTECT *.COM RSI    <-- Same, with user approval
  44. ;        PROTECT *.COM C        <-- Allows user to specify for each
  45. ;        PROTECT MYPROG.COM 1R    <-- Sets Tag Bit 1 and R/O Attribute
  46. ;
  47.  
  48. FALSE    EQU    0
  49. TRUE    EQU    NOT FALSE
  50.  
  51. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  52.  
  53.     EXT    DIRF    ; DIRECTORY PROCESSOR
  54.  
  55.     EXT    ZGPINS    ; INIT BUFFERS
  56.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  57.  
  58.     EXT    BBLINE    ; INPUT LINE EDITOR
  59.     EXT    INITFCB    ; INIT FCB
  60.     EXT    BDOS    ; BDOS ENTRY
  61.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  62.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  63.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  64.     EXT    MOVEB    ; COPY ROUTINE
  65.     EXT    PHLDC    ; PRINT HL AS DECIMAL CHARS
  66.     EXT    PRINT    ; PRINT ROUTINE
  67.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  68.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  69.     EXT    CAPS    ; CAPITALIZE ROUTINE
  70.     EXT    CRLF    ; NEW LINE ROUTINE
  71.     EXT    FILLB    ; FILL ROUTINE
  72.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  73.  
  74. ;
  75. ;  CP/M EQUATES
  76. ;
  77. CPM    EQU    0    ; WARM BOOT
  78. FCB    EQU    5CH    ; FCB
  79. BUFF    EQU    80H    ; INPUT LINE BUFFER
  80. CR    EQU    13    ; <CR>
  81. LF    EQU    10    ; <LF>
  82.  
  83. ;
  84. ;  Branch to Start of Program
  85. ;
  86.     JMP    START
  87.  
  88. ;
  89. ;******************************************************************
  90. ;
  91. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  92. ;
  93. ;    This data block precisely defines the data format for
  94. ; initial features of a ZCPR2 system which are required for proper
  95. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  96. ;
  97.  
  98. ;
  99. ;  EXTERNAL PATH DATA
  100. ;
  101. EPAVAIL:
  102.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  103. EPADR:
  104.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  105.  
  106. ;
  107. ;  INTERNAL PATH DATA
  108. ;
  109. INTPATH:
  110.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  111.             ; DISK = 1 FOR A, '$' FOR CURRENT
  112.             ; USER = NUMBER, '$' FOR CURRENT
  113.     DB    0,0
  114.     DB    0,0
  115.     DB    0,0
  116.     DB    0,0
  117.     DB    0,0
  118.     DB    0,0
  119.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  120.     DB    0    ; END OF PATH
  121.  
  122. ;
  123. ;  MULTIPLE COMMAND LINE BUFFER DATA
  124. ;
  125. MCAVAIL:
  126.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  127. MCADR:
  128.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  129.  
  130. ;
  131. ;  DISK/USER LIMITS
  132. ;
  133. MDISK:
  134.     DB    4    ; MAXIMUM NUMBER OF DISKS
  135. MUSER:
  136.     DB    31    ; MAXIMUM USER NUMBER
  137.  
  138. ;
  139. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  140. ;
  141. DOK:
  142.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  143. UOK:
  144.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  145.  
  146. ;
  147. ;  PRIVILEGED USER DATA
  148. ;
  149. PUSER:
  150.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  151. PPASS:
  152.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  153.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  154.  
  155. ;
  156. ;  CURRENT USER/DISK INDICATOR
  157. ;
  158. CINDIC:
  159.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  160.  
  161. ;
  162. ;  DMA ADDRESS FOR DISK TRANSFERS
  163. ;
  164. DMADR:
  165.     DW    80H    ; TBUFF AREA
  166.  
  167. ;
  168. ;  NAMED DIRECTORY INFORMATION
  169. ;
  170. NDRADR:
  171.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  172. NDNAMES:
  173.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  174. DNFILE:
  175.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  176.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  177.  
  178. ;
  179. ;  REQUIREMENTS FLAGS
  180. ;
  181. EPREQD:
  182.     DB    0FFH    ; EXTERNAL PATH?
  183. MCREQD:
  184.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  185. MXREQD:
  186.     DB    0FFH    ; MAX USER/DISK?
  187. UDREQD:
  188.     DB    0FFH    ; ALLOW USER/DISK CHANGE?
  189. PUREQD:
  190.     DB    0FFH    ; PRIVILEGED USER?
  191. CDREQD:
  192.     DB    0FFH    ; CURRENT INDIC AND DMA?
  193. NDREQD:
  194.     DB    0FFH    ; NAMED DIRECTORIES?
  195. Z2CLASS:
  196.     DB    0    ; CLASS 0
  197.     DB    'ZCPR2'
  198.     DS    10    ; RESERVED
  199.  
  200. ;
  201. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  202. ;
  203. ;******************************************************************
  204. ;
  205.  
  206. ;
  207. ;  Start of Program
  208. ;
  209. START:
  210.     LXI    H,0    ; GET STACK PTR
  211.     DAD    SP
  212.     SHLD    STACK    ; SAVE IT
  213.     LXI    SP,STACK    ; SET SP
  214.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  215.     MVI    A,0FFH    ; SET DEFAULT USER
  216.     STA    USER
  217.  
  218.     CALL    ZGPINS    ; INIT BUFFERS
  219.     CALL    PRINT
  220.     DB    'PROTECT  Version '
  221.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  222.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  223.     CPI    ' '    ; NO FILE SPEC?
  224.     JZ    HELP
  225.     CPI    '/'    ; OPTION CAUGHT?
  226.     JNZ    ECONT
  227.  
  228. ;  PRINT HELP INFORMATION
  229. HELP:
  230.     CALL    PRINT
  231.     DB    CR,LF,'PROTECT Command --'
  232.     DB    CR,LF,'  PROTECT dir:filename.typ,dir:fn.ft,dir:fn.ft,... ooo'
  233.     DB    CR,LF,LF,'d is disk, u is user, and o is one or more option '
  234.     DB    'letters.'
  235.     DB    CR,LF,'If one or more options are specified, the o MUST be '
  236.     DB    'preceded by a space.'
  237.     DB    CR,LF,'Nothing is required, and wild cards (?,*) are '
  238.     DB    CR,LF,'permitted.  o is optional, and valid options are -'
  239.     DB    CR,LF,'    C -- Control Mode (Allow user to set each file)'
  240.     DB    CR,LF,'    I -- Inspect Mode (Give user option to set att)'
  241.     DB    CR,LF,'    n -- 1 <= n <= 8; Set Tag Attribute'
  242.     DB    CR,LF,'    A -- Set AR (Archive) Attribute'
  243.     DB    CR,LF,'    R -- Set R/O Attribute (no R sets R/W)'
  244.     DB    CR,LF,'    S -- Set SYS Attribute (no S sets Non-System)'
  245.     DB    CR,LF,'dir: is a named directory or the form du:.'
  246.     DB    CR,LF,'Named Directories are ',0
  247.     LDA    NDREQD    ; NAMES REQUIRED?
  248.     ORA    A    ; 0=NO
  249.     JNZ    HELP1
  250.     CALL    PRINT
  251.     DB    'NOT ',0
  252. HELP1:
  253.     CALL    PRINT
  254.     DB    'Permitted in this Version of PROTECT'
  255.     DB    CR,LF,'If u is omitted, current user is assumed, as with d.'
  256.     DB    CR,LF,LF,'Special forms are:'
  257.     DB    CR,LF,'    PROTECT dir:    <-- Prot all files in named directory'
  258.     DB    CR,LF,'    PROTECT du:    <-- Prot all files in disk d, user u'
  259.     DB    CR,LF,'    PROTECT u:    <-- Prot all files in user u on '
  260.     DB    'current disk'
  261.     DB    CR,LF,'    PROTECT d:    <-- Prot all files on disk d in '
  262.     DB    'current user'
  263.     DB    0
  264.  
  265. ;  RETURN TO OS
  266. RETURN:
  267.     LHLD    STACK    ; GET OLD STACK
  268.     SPHL        ; SET IT
  269.     RET
  270.  
  271. ;  USER CHANGE NOT ALLOWED ERROR
  272. UNOK:
  273.     CALL    PRINT
  274.     DB    CR,LF,'User Number Change Not Allowed -- Aborting',0
  275.     JMP    RETURN
  276.  
  277. ;  DISK CHANGE NOT ALLOWED ERROR
  278. DNOK:
  279.     CALL    PRINT
  280.     DB    CR,LF,'Disk Change Not Allowed -- Aborting',0
  281.     JMP    RETURN
  282.  
  283. ;  PLACE ZERO AT END OF BUFFER
  284. ECONT:
  285.     LXI    H,BUFF    ; PT TO BUFFER
  286.     MOV    A,M    ; GET COUNT
  287.     INX    H    ; PT TO FIRST CHAR
  288.     ADD    L    ; PT TO END OF BUFFER
  289.     MOV    L,A
  290.     MOV    A,H
  291.     ACI    0
  292.     MOV    H,A
  293.     MVI    M,0
  294.  
  295. ;  COPY BUFFER INTO TEMP BUFFER
  296.     LXI    H,BUFF    ; PT TO BUFFER
  297.     MOV    B,M    ; GET CHAR COUNT
  298.     INX    H    ; PT TO FIRST CHAR
  299.     INR    B    ; ADD ENDING 0
  300.     LXI    D,CMDLNE    ; PT TO CMDLNE BUFFER
  301.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  302.  
  303. ;  EXTRACT FLAGS IF PRESENT
  304.     XRA    A    ; SET NO INSPECT, NO R/O, NO ARCH, AND NO SYSTEM FILES
  305.     STA    INSPECT
  306.     STA    READONLY
  307.     STA    SYSTEM
  308.     STA    ARCHIVE
  309.     STA    CONTROL    ; SET NO CONTROL MODE
  310.     MVI    B,8    ; CLEAR TAG BITS
  311.     LXI    H,TAGS
  312.     CALL    FILLB
  313.     LXI    H,0    ; SET FILE COUNT
  314.     SHLD    FILECNT
  315.     LXI    H,CMDLNE    ; PT TO BUFFER
  316. ;  SKIP TO FILE NAME STRING
  317. SBLANK:
  318.     MOV    A,M    ; SKIP TO NON-BLANK
  319.     CPI    ' '    ; <SP>?
  320.     JNZ    SBL1
  321.     INX    H    ; PT TO NEXT CHAR
  322.     JMP    SBLANK
  323. ;  SKIP TO END OF FILE NAME STRING
  324. SBL1:
  325.     MOV    A,M    ; SKIP TO <SP> OR EOL
  326.     ORA    A    ; DONE?
  327.     JZ    OPT
  328.     CPI    ' '    ; <SP>
  329.     JZ    OPT
  330.     INX    H    ; PT TO NEXT
  331.     JMP    SBL1
  332. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  333. OPT:
  334.     CPI    '/'    ; OPTION CHAR?
  335.     JNZ    OPTION
  336.     INX    H    ; SKIP SLASH
  337. ;  PROCESS LIST OF OPTIONS
  338. OPTION:
  339.     MOV    A,M    ; GET BYTE
  340.     ORA    A    ; DONE?
  341.     JZ    DSPEC
  342.     INX    H    ; PT TO NEXT CHAR
  343.     CPI    ' '    ; SKIP OVER SPACES
  344.     JZ    OPTION
  345.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  346.     JZ    HELP
  347.     CPI    '1'    ; DIGIT?
  348.     JC    HELP
  349.     CPI    '8'+1    ; IN RANGE?
  350.     JC    OPTNUM
  351.     CPI    'C'    ; CONTROL?
  352.     JZ    OPTCTRL
  353.     CPI    'I'    ; INSPECT?
  354.     JZ    OPTINS
  355.     CPI    'A'    ; ARCHIVE
  356.     JZ    OPTAR
  357.     CPI    'R'    ; READ/ONLY?
  358.     JZ    OPTRO
  359.     CPI    'S'    ; SYSTEM FILES?
  360.     JNZ    HELP
  361.     MVI    A,80H    ; SET FOR SYS FILES
  362.     STA    SYSTEM
  363.     JMP    OPTION
  364. OPTNUM:
  365.     SUI    '1'    ; ADJUST '1' TO '8' TO 0-7
  366.     PUSH    H    ; SAVE PTR
  367.     MOV    E,A    ; VALUE IN DE
  368.     MVI    D,0
  369.     LXI    H,TAGS    ; PT TO TAG BUFFER
  370.     DAD    D    ; PT TO ELEMENT
  371.     MVI    M,80H    ; SELECT ELEMENT
  372.     POP    H    ; GET PTR TO NEXT CHAR
  373.     JMP    OPTION
  374. OPTCTRL:
  375.     MVI    A,0FFH    ; CONTROL MODE
  376.     STA    CONTROL
  377.     JMP    OPTION
  378. OPTINS:
  379.     MVI    A,0FFH    ; INSPECT
  380.     STA    INSPECT
  381.     JMP    OPTION
  382. OPTAR:
  383.     MVI    A,80H    ; SET ARCHIVE
  384.     STA    ARCHIVE
  385.     JMP    OPTION
  386. OPTRO:
  387.     MVI    A,80H    ; SET R/O
  388.     STA    READONLY
  389.     JMP    OPTION
  390.  
  391. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  392. DSPEC:
  393.     LXI    H,CMDLNE-1    ; PT TO BEFORE FIRST BYTE
  394. DSPEC0:
  395.     INX    H    ; PT TO BYTE
  396.     MOV    A,M    ; GET BYTE
  397.     ORA    A    ; DONE?
  398.     JZ    HELP
  399.     CPI    ' '    ; <SP>?
  400.     JZ    DSPEC0
  401. ;
  402. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  403. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  404. ;
  405. DSPEC1:
  406.     CALL    GETUD    ; RESET USER IF NECESSARY
  407.     LXI    D,FCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  408.  
  409.     PUSH    H    ; SAVE HL PTR
  410.     CALL    CODEND    ; GET ADDRESS OF SCRATCH AREA
  411.     MOV    B,H    ; ADDRESS IN BC
  412.     MOV    C,L
  413.     POP    H
  414.  
  415.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  416.     JZ    DERR    ; ERROR HANDLER
  417.  
  418.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  419.     MOV    A,C    ; GET NEW USER
  420.     STA    USER    ; SAVE IT
  421.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  422.     CPI    0FFH    ; CURRENT DISK?
  423.     JZ    USPEC
  424.     LDA    MDISK    ; GET MAX DISK NUMBER
  425.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  426.     CMP    B    ; WITHIN BOUNDS?
  427.     MOV    A,B    ; GET DISK NUMBER IN A
  428.     JNC    DSPEC2
  429. DERR:
  430.     CALL    PRINT
  431.     DB    CR,LF,'Invalid Drive or User Specification',0
  432.     JMP    RETURN
  433.  
  434. ;  LOG IN SPECIFIED DISK
  435. DSPEC2:
  436.     PUSH    B    ; SAVE BC
  437.     MOV    E,A    ; DISK NUMBER IN E
  438.     LDA    DOK    ; OK TO DO SO?
  439.     ORA    A    ; 0=NO
  440.     JZ    DNOK    ; NOT ALLOWED ABORT
  441.     MVI    C,14    ; LOG IN DISK
  442.     CALL    BDOS
  443.     POP    B    ; GET BC
  444.  
  445. ;  CHECK FOR USER NUMBER
  446. USPEC:
  447.     MOV    A,C    ; GET NEW USER NUMBER
  448.     CPI    0FFH    ; DEFAULT USER?
  449.     JZ    PROT
  450.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  451.     JZ    UERR
  452.     LDA    MUSER    ; GET MAX USER NUMBER
  453.     CMP    C
  454.     MOV    A,C    ; USER NUMBER IN A
  455.     JNC    ULOG
  456. UERR:
  457.     CALL    PRINT
  458.     DB    CR,LF,'Invalid User Number',0
  459.     JMP    RETURN
  460. ULOG:
  461.     MOV    E,A    ; USER NUMBER IN E
  462.     LDA    UOK    ; ALLOWED?
  463.     ORA    A    ; 0=NO
  464.     JZ    UNOK    ; DISALLOWED AND ABORT
  465.     MVI    C,32    ; SELECT USER
  466.     CALL    BDOS
  467.  
  468. ;  LOAD DIRECTORY AND PROTECT FILES
  469. PROT:
  470.     CALL    CODEND    ; PT TO END OF CODE
  471.     CALL    RETUD    ; GET CURRENT USER
  472.     MOV    A,C    ; CURRENT USER IN A
  473.     ORI    0C0H    ; SELECT NON-SYS AND SYS FILES IN CURRENT USER
  474.     LXI    D,FCB    ; PT TO FCB
  475.     CALL    DIRF    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  476.  
  477. ;  PROT DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
  478.     CALL    PROTFILES
  479.  
  480. ;  CHECK FOR NEXT FILE SPEC
  481.     LHLD    NEXTCH    ; GET PTR
  482.     MOV    A,M    ; GET DELIM
  483.     CPI    ','    ; ANOTHER FILE?
  484.     JNZ    PROTDONE
  485.     INX    H    ; PT TO CHAR AFTER COMMA
  486.     JMP    DSPEC1    ; CONTINUE PROCESSING
  487.  
  488. ;  PROT COMPLETE -- PRINT COUNT AND EXIT
  489. PROTDONE:
  490.     CALL    PRCOUNT    ; PRINT FILE COUNT
  491.     JMP    RETURN
  492.  
  493. ;  PROT SELECTED FILES
  494. PROTFILES:
  495.     MOV    A,B    ; CHECK FOR ANY FILES LOADED
  496.     ORA    C
  497.     RZ
  498.  
  499. ;  PRINT FILE NAME
  500. PROTLP:
  501.     PUSH    B    ; SAVE ENTRY COUNT
  502.     CALL    CRLF    ; NEW LINE
  503.     PUSH    H    ; SAVE PTR TO FCB
  504.     INX    H    ; PT TO FILE NAME
  505.     MVI    B,8    ; PRINT NAME
  506.     CALL    PRNT
  507.     MVI    A,'.'    ; DECIMAL
  508.     CALL    COUT
  509.     MVI    B,3    ; PRINT TYPE
  510.     CALL    PRNT
  511.     POP    H    ; GET PTR
  512.  
  513. ;  CHECK FOR CONTROL MODE AND PERFORM CONTROL FUNCTION IF SET
  514.     LDA    CONTROL    ; GET FLAG
  515.     ORA    A    ; NZ=YES
  516.     JNZ    PROTCTRL
  517.  
  518. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  519.     LDA    INSPECT    ; GET FLAG
  520.     ORA    A    ; 0=NO
  521.     JZ    DOIT
  522.  
  523. ;  PROMPT USER FOR PROTECT
  524.     CALL    PROTQ    ; PROT QUESTION
  525.     CPI    'Q'    ; QUIT?
  526.     JZ    QUIT
  527.     CPI    'Y'    ; YES?
  528.     JZ    DOIT
  529.  
  530. ;  DON'T PROTECT FILE
  531. NODO:
  532.     CALL    PRINT
  533.     DB    '  ++ NO Attribute Change ++',0
  534.     JMP    PROTTEST
  535.  
  536. ;  PROMPT USER FOR PROT
  537. PROTQ:
  538.     CALL    PRINT    ; PRINT PROMPT
  539.     DB    ' -- Protect (Y/N/Q=Quit/other=N)? ',0
  540.     CALL    CIN    ; GET RESPONSE
  541.     CALL    CAPS    ; CAPITALIZE
  542.     CALL    COUT    ; ECHO
  543.     RET
  544.  
  545. ;  CONTROL FUNCTION -- ALLOW USER TO SET BITS AS HE DESIRES
  546. PROTCTRL:
  547.     PUSH    H    ; SAVE PTR TO FILE
  548.     XRA    A    ; A=0
  549.     STA    READONLY    ; CLEAR R/O, SYS, ARCHIVE, AND TAGS
  550.     STA    SYSTEM
  551.     STA    ARCHIVE
  552.     LXI    H,TAGS
  553.     MVI    B,8
  554.     CALL    FILLB
  555.     CALL    PRINT
  556.     DB    ' -- Attributes (? for Help)? ',0
  557.     MVI    A,0FFH    ; CAPITALIZE
  558.     CALL    BBLINE    ; INPUT LINE FROM USER
  559.     CALL    CRLF    ; NEW LINE
  560.     MVI    B,80H    ; MSB SET
  561. PCTRL:
  562.     MOV    A,M    ; GET ATTRIBUTE FLAG
  563.     ORA    A    ; DONE?
  564.     JZ    PDOIT    ; DO PROTECTION THEN
  565.     INX    H    ; PT TO NEXT
  566.     CPI    ' '    ; SKIP <SP>
  567.     JZ    PCTRL
  568.     CPI    'Q'    ; QUIT?
  569.     JZ    QUIT
  570.     CPI    'A'    ; ARCHIVE?
  571.     JZ    PCTRLA
  572.     CPI    'S'    ; SYSTEM?
  573.     JZ    PCTRLS
  574.     CPI    'R'    ; R/O?
  575.     JZ    PCTRLR
  576.     CPI    '1'    ; DIGIT?
  577.     JC    PCTRLH    ; HELP IF NOT
  578.     CPI    '8'+1    ; RANGE?
  579.     JC    PCTRLN    ; DO NUMBER
  580. PCTRLH:
  581.     CALL    PRINT
  582.     DB    CR,LF,'  You may issue the Q command to quit or select any'
  583.     DB    CR,LF,'    arrangement of attributes that you desire.'
  584.     DB    CR,LF,'  Attributes may be specified as follows --'
  585.     DB    CR,LF,'        A = Archive, R = R/O, S = SYS, 1-8 = Tags'
  586.     DB    CR,LF,0
  587.     POP    H    ; GET FCB PTR
  588.     POP    B    ; GET ENTRY COUNT
  589.     JMP    PROTLP    ; PROCESS AGAIN
  590. PCTRLA:
  591.     MOV    A,B    ; GET FLAG
  592.     STA    ARCHIVE    ; SET FLAG
  593.     JMP    PCTRL
  594. PCTRLS:
  595.     MOV    A,B    ; GET FLAG
  596.     STA    SYSTEM    ; SET FLAG
  597.     JMP    PCTRL
  598. PCTRLR:
  599.     MOV    A,B    ; GET AND SET FLAG
  600.     STA    READONLY
  601.     JMP    PCTRL
  602. PCTRLN:
  603.     PUSH    H
  604.     SUI    '1'    ; CONVERT TO OFFSET
  605.     MOV    E,A    ; OFFSET IN DE
  606.     MVI    D,0
  607.     LXI    H,TAGS    ; SET TAG
  608.     DAD    D
  609.     MOV    M,B    ; SET BIT
  610.     POP    H
  611.     JMP    PCTRL    ; CONTINUE
  612.  
  613. ;  QUIT PROTECT PROGRAM
  614. QUIT:
  615.     CALL    PRCOUNT    ; PRINT COUNT OF FILES PROTECTED
  616.     CALL    PRINT
  617.     DB    CR,LF,'  ++ QUIT -- Returning to CP/M ++',0
  618.     JMP    RETURN
  619.  
  620. ;  PROT FILE, BUT GET PTR FIRST
  621. PDOIT:
  622.     POP    H    ; GET PTR
  623.  
  624. ;  PROT FILE
  625. DOIT:
  626.     PUSH    H
  627.     LXI    D,PROTFCB    ; COPY TARGET FILE INTO PROTECT'S FCB
  628.     MVI    B,16    ; 16 BYTES
  629.     CALL    MOVEB    ; COPY
  630.     LXI    H,TAGS    ; SET TAG BITS NOW
  631.     INX    D    ; PT TO FIRST TAG BIT
  632.     MVI    B,8    ; 8 TAG BITS
  633. DOITL:
  634.     LDAX    D    ; GET BYTE FROM PROT FCB
  635.     ANI    7FH    ; MASK OUT OLD MSB
  636.     ORA    M    ; OR IN TAG BIT
  637.     STAX    D    ; PUT BYTE BACK
  638.     INX    H    ; PT TO NEXT
  639.     INX    D
  640.     DCR    B    ; COUNT DOWN
  641.     JNZ    DOITL
  642.     LDA    READONLY    ; GET R/O BIT
  643.     MOV    B,A    ; SAVE IN B
  644.     LDAX    D    ; GET BYTE
  645.     ANI    7FH    ; MASK OUT OLD MSB
  646.     ORA    B    ; OR IN NEW MSB
  647.     STAX    D    ; PUT IT BACK
  648.     INX    D    ; PT TO SYS BIT
  649.     LDA    SYSTEM    ; GET SYS BIT
  650.     MOV    B,A    ; SAVE IT
  651.     LDAX    D    ; GET BYTE
  652.     ANI    7FH    ; MASK OUT OLD MSB
  653.     ORA    B    ; MASK IN NEW MSB
  654.     STAX    D    ; PUT IT BACK
  655.     INX    D    ; PT TO ARCHIVE BIT
  656.     LDA    ARCHIVE    ; GET ARCHIVE BIT
  657.     MOV    B,A    ; SAVE IT
  658.     LDAX    D    ; GET BYTE
  659.     ANI    7FH    ; MASK OUT OLD MSB
  660.     ORA    B    ; MASK IN NEW MSB
  661.     STAX    D    ; PUT IT BACK
  662.     LXI    D,PROTFCB    ; PT TO FCB
  663.     CALL    INITFCB    ; INIT IT
  664.     MVI    C,30    ; SET FILE ATTRIBUTES
  665.     CALL    BDOS
  666.     CALL    PRINT
  667.     DB    ' Set to ',0
  668.     LXI    H,PROTFCB+1
  669.     MVI    B,8    ; 8 TAGS
  670.     MVI    C,'1'    ; SET DIGIT
  671. PATTL1:
  672.     MOV    A,M    ; GET BYTE
  673.     ANI    80H    ; PRINT ATT?
  674.     JZ    PATTL2
  675.     MOV    A,C    ; GET DIGIT
  676.     CALL    COUT
  677. PATTL2:
  678.     INR    C    ; INCREMENT DIGIT
  679.     INX    H    ; PT TO NEXT
  680.     DCR    B    ; COUNT DOWN
  681.     JNZ    PATTL1
  682.     MOV    A,M    ; GET R/O BYTE
  683.     ANI    80H    ; MASK IT
  684.     JZ    PATTL3
  685.     CALL    PRINT
  686.     DB    ' R/O ',0
  687.     JMP    PATTL4
  688. PATTL3:
  689.     CALL    PRINT
  690.     DB    ' R/W ',0
  691. PATTL4:
  692.     INX    H    ; PT TO SYS BYTE
  693.     MOV    A,M    ; GET SYS BYTE
  694.     ANI    80H    ; MASK IT
  695.     JZ    PATTL5
  696.     CALL    PRINT
  697.     DB    'SYS',0
  698.     JMP    PATTL6
  699. PATTL5:
  700.     CALL    PRINT
  701.     DB    'DIR',0
  702. PATTL6:
  703.     INX    H    ; PT TO ARCHIVE BYTE
  704.     MOV    A,M    ; GET ARCH BYTE
  705.     ANI    80H    ; MASK IT
  706.     JZ    PATTL7
  707.     CALL    PRINT
  708.     DB    ' AR',0
  709. PATTL7:
  710.     LHLD    FILECNT    ; INCREMENT FILE COUNT
  711.     INX    H
  712.     SHLD    FILECNT
  713.     POP    H    ; GET PTR TO DIRECTORY ENTRY
  714.  
  715. ;  PT TO NEXT ENTRY
  716. PROTTEST:
  717.     LXI    D,ESIZE    ; PT TO NEXT ENTRY
  718.     DAD    D
  719.     POP    B    ; GET COUNT
  720.     DCX    B    ; COUNT DOWN
  721.     MOV    A,B    ; CHECK FOR ZERO
  722.     ORA    C
  723.     JNZ    PROTLP
  724.  
  725. ;  RETURN TO CALLER
  726.     RET
  727.  
  728. ;
  729. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  730. ;
  731. PRNT:
  732.     MOV    A,M    ; GET CHAR
  733.     CALL    COUT
  734.     INX    H    ; PT TO NEXT
  735.     DCR    B    ; COUNT DOWN
  736.     JNZ    PRNT
  737.     RET
  738.  
  739. ;
  740. ;  PRINT COUNT OF NUMBER OF FILES PROTECTED
  741. ;
  742. PRCOUNT:
  743.     CALL    CRLF    ; NEW LINE
  744.     CALL    PRINT
  745.     DB    CR,LF,'++ ',0
  746.     LHLD    FILECNT    ; GET COUNT
  747.     MOV    A,L    ; CHECK FOR NONE
  748.     ORA    H
  749.     JZ    PRNO
  750.     CALL    PHLDC    ; PRINT DECIMAL COUNT
  751.     JMP    PRMS
  752. PRNO:
  753.     CALL    PRINT
  754.     DB    'No ',0
  755. PRMS:
  756.     LHLD    FILECNT    ; 1 FILE PROTECTED?
  757.     MOV    A,H    ; HIGH ZERO?
  758.     ORA    A
  759.     JNZ    PRMULT
  760.     MOV    A,L    ; LOW ONE?
  761.     CPI    1
  762.     JZ    PRSING
  763. PRMULT:
  764.     CALL    PRINT
  765.     DB    ' Files Protected ++',0
  766.     RET
  767. PRSING:
  768.     CALL    PRINT
  769.     DB    ' File  Protected ++',0
  770.     RET
  771.  
  772. ;
  773. ;  BUFFERS
  774. ;
  775. INSPECT:
  776.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  777. CONTROL:
  778.     DS    1    ; CONTROL FLAG (0=NO, 0FFH=YES)
  779. ARCHIVE:
  780.     DS    1    ; ARCHIVE FLAG (0=NO, 80H=YES)
  781. SYSTEM:
  782.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  783. READONLY:
  784.     DS    1    ; READ/ONLY FLAG (0=NO, 80H=YES)
  785. TAGS:
  786.     DS    8    ; 8 TAG BITS
  787. USER:
  788.     DS    1    ; NEW USER, OR 0FFH IF NO CHANGE
  789. NEXTCH:
  790.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  791. FILECNT:
  792.     DS    2    ; COUNT OF NUMBER OF FILES PROTECTED
  793. PROTFCB:
  794.     DS    40    ; FCB FOR PROTECT
  795. CMDLNE:
  796.     DS    256    ; ALLOW MAX SIZE OF COMMAND LINE
  797.     DS    100    ; STACK AREA
  798. STACK:
  799.     DS    2    ; OLD STACK PTR
  800.  
  801.     END
  802.