home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv048.ark / USRPW34.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  17KB  |  558 lines

  1. ;
  2. ;    USERPW.ASM  version 3.4   11/03/81
  3. ;      By Dave Hardy
  4. ;
  5. ;
  6. ;    USERPW is used to replace the 'USER' command in a remote
  7. ;    CP/M system, which is usually removed to restrict users
  8. ;    to the lower user areas. USERPW will allow password access
  9. ;    to any group of user areas via any number of passwords
  10. ;    that are specified in an external file called PWFILE.
  11. ;    An option is also available that allows only a single
  12. ;    built-in password to be used, as in the original version.
  13. ;    Public access is available to all user areas with values less
  14. ;    than MAXUSER (set below), and USERPW will also allow password
  15. ;    access to the 'restricted' user areas.  If the caller
  16. ;    types only the filename, with no user number on the command
  17. ;    tail, the program will tell the caller what user number he
  18. ;    is in and give instructions.
  19. ;
  20. ;   If the PWFILE option is selected, then the entered password will
  21. ;    be compared with a disk-resident file called PWFILE kept in a
  22. ;    user area specified by the PWUSR equate.  PWFILE contains one
  23. ;    password on each line, followed by all of that passwords allowed
  24. ;    user areas, all items separated by commas.  The last line of the
  25. ;    file must contain a '$' to indicate the end-of-file.
  26. ;
  27. ;PWFILE STRUCTURE IS:    PASSWORD1,X,Y<cr><lf>    <--X and Y are USER #'s
  28. ;            PASSWORD2,Y<cr><lf>
  29. ;            etc....
  30. ;            $            <--this must be here
  31. ;
  32. ;  Modification history:
  33. ;
  34. ;11/03/81 Removed BACKSPACE and DELETE code to prevent nightmare
  35. ;      bug that allowed remote callers to backspace over code 
  36. ;      and cause PWFILE to be printed as part of "INCORRECT"
  37. ;      error messages.
  38. ;      By Dave Hardy
  39. ;
  40. ;08/24/81 Cleaned up file, made compatible with MAC/ASM, made lower
  41. ;      case trap conditional (since some PW's might want them,
  42. ;      or numbers, etc.), changed PW error jump to eliminate
  43. ;      reloading PWFILE, corrected errors in BADPW routine,
  44. ;      and separated GOCCP code to avoid confusion.
  45. ;      By Dave Hardy
  46. ;
  47. ;08/23/81 Added multiple tries at PW, Trap for lower case,
  48. ;         cleaned up code and added many needed C/R's & L/F's.
  49. ;         By Jim C., Larkspur, Ca. RCPM (415) 461-7726
  50. ;
  51. ;08/19/81 Added equates for use with the GOCCP program.
  52. ;         By Larry Shipinski
  53. ;
  54. ;08/18/81 Moved PWFILE loader CALL so that PWFILE will be loaded 
  55. ;      before asking for PW, to eliminate the noticeable delay
  56. ;      before warm-boot, cleaned up code, and added comments.
  57. ;      By Dave Hardy
  58. ;
  59. ;08/11/81 Added RANGE conditional to allow PW access to a range of
  60. ;      user areas.  For example, if the range is from 1 to 4, then
  61. ;      once a user has logged into any user area within the range,
  62. ;      he may log into any other user areas within the range without
  63. ;      having to re-enter the password.  This is similar to the
  64. ;      LOGONCE option, but allows any range of user numbers to be
  65. ;      selected, while the range of LOGONCE includes all non-zero
  66. ;      user areas.  In addition, RANGE can only be used if the
  67. ;      PWFILE conditional is selected, and LOGONCE can only be
  68. ;      used if the PWFILE conditional is NOT selected.
  69. ;      By Dave Hardy
  70. ;
  71. ;08/09/81 Added PWFILE conditional to allow multiple passwords to be
  72. ;      readfrom a file, so that separate PW's can be used for
  73. ;      different user areas.  The number of PW's will be limited
  74. ;      only by the amount of available memory in the TPA.
  75. ;      The file of passwords can be kept in any user area,
  76. ;      and can be created with any editor.  Multiple user areas
  77. ;      are available to each password.  The format of the PWFILE
  78. ;      is defined at the beginning of this file.
  79. ;      By Dave Hardy
  80. ;
  81. ;08/03/81 Changed console input routines to DIRECT I/O so that
  82. ;      password will not be echoed.  This should make the
  83. ;      program's function a bit more secure by making it more
  84. ;      difficult to see what password has been typed.
  85. ;      By Dave Hardy
  86. ;
  87. ;07/12/81 Added TELUSR routines to inform caller of current user
  88. ;      number and how to use program.  Changed version number
  89. ;      to 2.1 instead of 3.0, because I'm still working on a
  90. ;      major revision of USERPW to be released as version 3.0.
  91. ;      By Dave Hardy
  92. ;
  93. ;05/23/81 Added LOGONCE option so that program will not ask for PW
  94. ;      if user is already in password-accessible user area.
  95. ;      By Dave Hardy
  96. ;
  97. ;  Define miscellaneous values:
  98. DFCB    EQU    5CH    ;Default File Control Block address
  99. SETUSR    EQU    32    ;BDOS Set User function
  100. PRNSTR    EQU    9    ;BDOS Print String function
  101. OPEN    EQU    15    ;BDOS Open File function
  102. STDMA    EQU    26    ;BDOS Set DMA Address function
  103. READ    EQU    20    ;BDOS Read Sequential function
  104. CONOUT    EQU    2    ;BDOS Print Character function
  105. DIRIO    EQU    6    ;BDOS Direct Console I/O function
  106. INPUT    EQU    0FFH    ;Value passed to DIRIO to do console input
  107. BDOS    EQU    5    ;CP/M's BDOS jump
  108. USERDR    EQU    4    ;CP/M's USER/DRIVE select byte
  109. WBOOT    EQU    0    ;CP/M's warm-boot address
  110. CR    EQU    0DH    ;ASCII carriage-return
  111. LF    EQU    0AH    ;ASCII line-feed
  112. ;
  113. ;  Define TRUE and FALSE:
  114. FALSE    EQU    0
  115. TRUE    EQU    NOT FALSE
  116. ;
  117. ;
  118. ;  Set the following equates as desired:
  119. ;
  120. MAXUSER EQU    0    ;Set to highest PUBLIC user area desired
  121. ABSUSER    EQU    15    ;Set to highest PW ACCESS user area desired
  122. MAXTRYS    EQU    03    ;Max # of PW attempts before exit to CP/M
  123. PWFILE    EQU    TRUE    ;True, if PW's from file instead of built-in
  124. PWUSR    EQU    21    ;User area where PWFILE is to be kept
  125. PWDRV    EQU    1    ;Drive where PWFILE is kept (1=A, 2=B, etc.)
  126. TRAPLC    EQU    FALSE    ;True, if want to only use upper-case PW's
  127. RANGE    EQU    TRUE    ;True, if no ask for PW when within ranges
  128. HRANGE    EQU    4    ;High-end value of "no ask" range
  129. LRANGE    EQU    1    ;Low-end value of "no-ask" range
  130. LOGONCE    EQU    FALSE    ;True, if desire log-in only from user 0
  131.             ;SHOULD BE FALSE if PWFILE is used
  132. ;
  133. ;
  134. ;  The following code is for use with the GOCCP program, which
  135. ;  is a CCP substitute.  If you are not using GOCCP, then setting
  136. ;  GOCCP to TRUE will cause unpredictable results.  NOTE that this
  137. ;  option requires that you set the label CCP equal to the address
  138. ;  of the CCP in your system.  This address can be determined most
  139. ;  easily by using the STATUS or BDLOC programs.
  140. ;
  141. GOCCP    EQU    FALSE    ;True, if using the GOCCP program
  142.     IF    GOCCP
  143. CCP    EQU    3400H        ;Set to start of CCP in your system
  144. REQUSR    EQU    CCP+7FEH    ;Store requested USER number in CCP
  145.     ENDIF
  146. ;
  147. ;
  148. ;
  149.     ORG    100H
  150. ;
  151.     XRA    A        ;Initialize first pass flag
  152.     STA    FLAG        ;Set First pass flag
  153. ;
  154.     LXI    H,DFCB+1 ;Point to specified USER # in command line
  155.     MVI    E,0    ;Initialize user number accumulator
  156.     MOV    A,M    ;Check that there is something in command line
  157.     CPI    20H
  158.     JZ    TELUSR    ;Nothing?  then tell user number and give help
  159. ;
  160. NUMLUP    MOV    A,M    ;Get first character
  161.     INX    H    ;Point to next location in command line
  162.     SUI    '0'    ;Remove ASCII bias
  163.     JC    NUMDONE    ;Exit with specified user number in E
  164.     CPI    10    ;Check for illegal number (>9)
  165.     JNC    NUMDONE    ;Stop if illegal character found
  166.     MOV    D,A    ;Get specified user number
  167.     MOV    A,E    ; into A register
  168.     ADD    A
  169.     ADD    A
  170.     ADD    E
  171.     ADD    A
  172.     ADD    D
  173.     MOV    E,A    ;Save accumulation
  174.     JMP    NUMLUP    ;Loop back for next character
  175. ;
  176. TELUSR    LXI    D,TUMSG    ;Tell the user what user number he's in
  177.     MVI    C,PRNSTR
  178.     CALL    BDOS
  179.     LDA    USERDR    ;Get current USER number
  180.     RRC
  181.     RRC
  182.     RRC
  183.     RRC
  184.     ANI    0FH
  185.     CPI    0AH
  186.     JC    LT10
  187.     PUSH    PSW    ;Save user number
  188.     MVI    E,'1'    ;If user # is 10-16, then print leading '1'
  189.     MVI    C,CONOUT    ;This routine won't work
  190.     CALL    BDOS        ;if your CCP allows more than 19 user areas.
  191.     POP    PSW    ;Restore user number
  192.     SUI    0AH
  193. LT10    ADI    30H    ;Print user number
  194.     MOV    E,A
  195.     MVI    C,CONOUT
  196.     CALL    BDOS
  197.     MVI    E,'.'    ;Get a period
  198.     MVI    C,CONOUT
  199.     CALL    BDOS    ;Make cosmetic
  200. ;
  201.     CALL    ERRXIT    ;Print rest of message, then exit to CP/M
  202.     DB    CR,LF,'To change user areas, type user number '
  203.     DB    'on command line.',CR,LF
  204.     DB    'For example, type: USER 3   to enter'
  205.     DB    ' user area 3.',CR,LF,'$'
  206. ;
  207. NUMDONE    MOV    A,E    ;Get requested user number
  208.     STA    REQUSR    ;Save for later, if needed
  209.     ORA    A
  210.     RM        ;Exit if illegal user number
  211.     CPI    ABSUSER+1
  212.     JNC    NOBODY    ;Illegal user area request
  213.     CPI    MAXUSER+1
  214.     JNC    SOME    ;Password user area request
  215. CHANGE    RLC        ;Move to upper nibble
  216.      RLC
  217.      RLC
  218.      RLC
  219.     MOV    B,A    ;Save requested user number
  220.     LDA    USERDR    ;Get current user/drive number
  221.     ANI    0FH    ;Trim off old user number
  222.     ORA    B    ;Add new user number
  223.     STA    USERDR    ;Set new user number
  224.     LDA    REQUSR
  225.     MOV    E,A
  226.     MVI    C,SETUSR ;Set user number with BDOS call, too.
  227.     JMP    BDOS     ;  then exit
  228. ;
  229. ;
  230. ;  REQUEST FOR RESTRICTED USER AREA, SO ASK FOR PASSWORD
  231. ;
  232. SOME    EQU    $
  233. ;
  234.     IF    LOGONCE    ;then see if user has already logged in
  235.     LDA    USERDR    ;Get USER NUMBER/DRIVE
  236.     ANI    0F0H
  237.     RLC
  238.     RLC
  239.     RLC
  240.     RLC
  241.     MVI    B,MAXUSER+1
  242.     CMP    B
  243.     JNC    GOTPW    ;If in non-public user area, PW was already
  244.             ; given so don't ask again
  245.     ENDIF
  246. ;
  247.     IF    PWFILE AND RANGE    ;Then check for already in RANGE
  248.     LDA    USERDR            ;Get USER/DRIVE number
  249.     ANI    0F0H
  250.     RLC
  251.     RLC
  252.     RLC
  253.     RLC
  254.     MVI    B,HRANGE+1        ;See if above RANGE
  255.     CMP    B
  256.     JNC    PRANGE            ;Jump if above RANGE
  257.     MVI    B,LRANGE        ;See if below RANGE
  258.     CMP    B
  259.     JC    PRANGE            ;Jump if below RANGE
  260.     LDA    REQUSR    ;Now see if requested user# is in RANGE
  261.     MVI    B,HRANGE+1        ;See if above RANGE
  262.     CMP    B
  263.     JNC    PRANGE            ;Jump if above RANGE
  264.     MVI    B,LRANGE        ;See if below RANGE
  265.     CMP    B
  266.     JC    PRANGE            ;Jump if below RANGE
  267.     JMP    GOTPW    ;If already in RANGE, and new user # is also in
  268.     ENDIF        ; RANGE, then don't ask for PW
  269. ;
  270. PRANGE    EQU    $
  271. ;
  272.     IF    PWFILE
  273.     CALL    LODPWF    ;Load the file of PW's
  274.     ENDIF
  275. ;
  276. PR2    LDA    FLAG    ;Get # of passes
  277.     ORA    A    ;First pass?
  278.     JZ    NOCRLF    ;If yes, then no CRLF needed
  279.     LXI    D,CRLF    ;Else print a CRLF to put next PW on a new line
  280.     MVI    C,PRNSTR
  281.     CALL    BDOS    ;Print CRLF
  282. NOCRLF    LXI    D,MSG    ;Ask for password
  283.     MVI    C,PRNSTR
  284.     CALL    BDOS
  285. ;
  286.     LXI    H,CONBUF    ;Reset console buffer pointer
  287.     MVI    C,10H        ;Allow 16 characters maximum
  288. TRYAGN    PUSH    B
  289.     PUSH    H
  290.     MVI    C,06H    ;Direct console I/O
  291.     MVI    E,0FFH    ;Console input
  292.     CALL    BDOS    ;Get password, 1 character at a time
  293.     POP    H
  294.     POP    B
  295.     ORA    A    ;Wait for input
  296.     JZ    TRYAGN
  297. ;
  298.     IF    TRAPLC
  299.     CPI    060H    ;Lower Case?
  300.     JC    NOTLC    ;No, Skip.
  301.     ANI    05FH    ;Strip L/C.
  302.     ENDIF
  303. ;
  304. NOTLC    CPI    0DH    ;Carriage return?
  305.     JZ    CHKPW    ;If yes, then check for match
  306.     MOV    M,A    ;Put character into buffer
  307.     INX    H    ;Increment pointer
  308.     DCR    C    ;See if 16 characters entered
  309.     MOV    A,C
  310.     ORA    A
  311.     JNZ    TRYAGN        ;If less than 16 characters entered,
  312.                 ;then continue...
  313. ;
  314.     IF    NOT PWFILE    ;Then check built-in PW
  315. CHKPW    LXI    H,CONBUF    ;Check for match with password
  316.     LXI    D,PASSWD    ;Point DE and HL to buffers
  317. NEXT    LDAX    D
  318.     CPI    '$'        ;When '$' found, then passwords match,
  319.     JZ    GOTPW        ;  so jump
  320.     CMP    M        ;Else check for character match
  321.     JNZ    BADPW        ;Jump if wrong password given
  322.     INX    H        ;Check next character for match
  323.     INX    D
  324.     JMP    NEXT
  325.     ENDIF
  326. ;
  327.     IF    PWFILE        ;Then check list of PW's in PWFILE
  328. CHKPW    LHLD    LASTPW
  329.     XCHG            ;Make DE point to first PW in file
  330.     JMP    FRSTPW        ; Then check for match
  331. DONXPW    CALL    GETNXPW        ;Returns with DE==>PW or '$' in PWFILE
  332. FRSTPW    LDAX    D        ;If DE==>'$' then done, no match
  333.     CPI    '$'        
  334.     JZ    BADPW        ;Jump if wrong PW given
  335.     LXI    H,CONBUF    ;Point HL to entered password
  336. NEXT    LDAX    D
  337.     CMP    M        ;Else check for character match
  338.     JNZ    DONXPW        ;If no match, then try next PW
  339.     INX    H        ;Else try next character for match
  340.     INX    D
  341.     LDAX    D
  342.     CPI    ','        ;If ',' found, then passwords may match
  343.     JNZ    NEXT        ; If not found, then continue,
  344.     MOV    A,M        ;Else check that both PW's are all read
  345.     CPI    0
  346.     JZ    CHKUSR        ;If both completely read, then match, so jump
  347.     JMP    DONXPW        ;Else try next PW in PWFILE list
  348. ;
  349. GETNXPW    LHLD    LASTPW        ;Get pointer to last PW checked
  350. NXCH    MOV    A,M
  351.     CPI    0DH        ;Scan for carriage return
  352.     JZ    GOTCR        ;When CR found, then point to next PW
  353.     CPI    '$'        ;Check for '$' here just in case...
  354.     JZ    NOMORE        ;If '$' found, then no more PW's
  355.     INX    H
  356.     JMP    NXCH
  357. ;
  358. GOTCR    INX    H        ;Skip over LF
  359.     INX    H        ;And point to next PW
  360.     SHLD    LASTPW        ;Save pointer to current PW
  361. NOMORE    XCHG            ;MAKE DE==>PW or '$'
  362.     RET            ;Then return to calling routine
  363. ;
  364. CHKUSR    XCHG        ;Make HL==>first user number in PWFILE line
  365.     INX    H
  366. NXNUM    MVI    E,0    ;Initialize USER number accumulator
  367. NUMLUP2    MOV    A,M    ;Get first character
  368.     INX    H    ;Point to next location in command line
  369.     SUI    '0'    ;Remove ASCII bias
  370.     JC    CMPUSR    ;Exit with specified user number in A
  371.     CPI    10    ;Check for illegal number (>9)
  372.     JNC    CMPUSR    ;Stop if illegal character found
  373.     MOV    D,A    ;Get specified user number
  374.     MOV    A,E    ; into A register
  375.     ADD    A
  376.     ADD    A
  377.     ADD    E
  378.     ADD    A
  379.     ADD    D
  380.     MOV    E,A    ;Save accumulation
  381.     JMP    NUMLUP2    ;Loop back for next character
  382. ;
  383. CMPUSR    DCX    H    ;Back up pointer (NUMLUP2 advanced 1 too many)
  384.     LDA    REQUSR    ;Compare allowable user# to the requested one.
  385.     CMP    E
  386.     JZ    GOTPW    ;Jump if they match, change user #, then exit
  387.     MOV    A,M    ;Check for CR, which means no more user areas
  388.     CPI    0DH    ;Jump if no more, and say "denied"
  389.     JZ    NOBODY2
  390.     INX    H    ;Skip over ',' and point to next user number
  391.     MOV    A,M    ;Check for CR, which means no more user areas
  392.     CPI    0DH    ;Jump if no more, and say "denied"
  393.     JZ    NOBODY2
  394.     JMP    NXNUM    ;Try next user number in PWFILE line
  395.     ENDIF
  396. ;
  397. GOTPW    LDA    REQUSR        ;Get back requested user number
  398.     JMP    CHANGE        ;Change user number and exit
  399. ;
  400. BADPW    MVI    C,PRNSTR    ;Print "BAD PASSWORD" message
  401.     LXI    D,BADMSG
  402.     CALL    BDOS
  403. ;
  404.     IF    PWFILE    ;Then initialize CONBUF and PW pointer
  405.     CALL    INIT        
  406.     ENDIF
  407. ;
  408.     IF    NOT PWFILE    ;Then just initialize CONBUF
  409.     LXI    H,CONBUF
  410.     MVI    C,17
  411. NXIN    MVI    M,0
  412.     INX    H
  413.     DCR    C
  414.     JNZ    NXIN
  415.     ENDIF
  416. ;
  417.     LDA    FLAG        ;Get # of trys flag
  418.     INR    A        ;Increment # of trys.
  419.     STA    FLAG
  420.     CPI    MAXTRYS        ;See if max guesses...
  421.     JC    PR2        ;If more tries allowed, then jump
  422. ;
  423. NOBODY2    LXI    D,CRLF    ;Print 'NO ACCESS' msg on new line, then exit to CP/M
  424.     MVI    C,PRNSTR
  425.     CALL    BDOS
  426. ;
  427. NOBODY    CALL    ERRXIT    ;Print 'NO ACCESS' message, then exit to CP/M
  428.     DB    'Sorry, that user area is not available.','$'
  429. ;
  430. ;    Routine to load the password file
  431.     IF    PWFILE
  432. LODPWF    MVI    E,PWUSR
  433.     MVI    C,SETUSR
  434.     CALL    BDOS    ;Set to whatever user number that PWFILE is in
  435.     MVI    A,PWDRV    ;Initialize FCB for selected drive
  436.     STA    LOCFCB
  437.     LXI    H,LOCFCB+12
  438.     MVI    B,21
  439. ZLOOP    MVI    M,0
  440.     INX    H
  441.     DCR    B
  442.     JNZ    ZLOOP
  443.     MVI    C,OPEN    ;Open the file
  444.     LXI    D,LOCFCB
  445.     CALL    BDOS
  446.     INR    A
  447.     JZ    ABORT    ;If A has 0 then no file, so abort
  448. ;
  449. ;    Now load the file
  450. ;
  451.     LHLD    6    ;Check for attempt to load past top of memory
  452.     LXI    D,-80H
  453.     DAD    D
  454.     PUSH    H    ;Save top of memory for later checks
  455. ;
  456.     LXI    D,PWBUF-80H    ;Point to file load area-80H
  457.     LXI    B,0    ;Initialize record counter
  458.     PUSH    B    ; and save it
  459.     PUSH    D    ;Save load address, too
  460. GLOOP    POP    D    ;Get last load address
  461.     LXI    H,80H    ;Point HL to next address to read to
  462.     DAD    D
  463.     POP    B    ;Increment the record counter
  464. ;
  465. ;    Check for attempt to load past top-of-memory
  466. ;
  467.     POP    D    ;Get -(TOP-OF-MEMORY)
  468.     PUSH    D    ;Save again for next time
  469. ;
  470.     MOV    A,E    ;Subtract: (TOP) - (ADRS)
  471.     SUB    L
  472.     MOV    A,D    ;Look at carry to see if out of memory
  473.     SBB    H
  474. ;
  475.     JNC    SIZEOK    ;Jump if enough room
  476.     CALL    ERRXIT    ; Else print message and abort
  477.     DB    '+++DATA AREA TOO SMALL FOR PWFILE','$'
  478. ;
  479. SIZEOK    INX    B    ;Continue loading...
  480.     PUSH    B
  481.     PUSH    H    ;Save load address
  482.     XCHG
  483.     MVI    C,STDMA ;Set DMA address for next read
  484.     CALL    BDOS
  485.     LXI    D,LOCFCB ;Then read the next sector
  486.     MVI    C,READ
  487.     CALL    BDOS
  488.     ORA    A
  489.     JZ    GLOOP    ;If A=0 then more to read
  490.     POP    B
  491.     POP    B    ;Restore record counter
  492.     POP    H
  493.     MOV    A,B
  494.     ORA    C
  495.     JZ    ABORT    ;If 0 then nothing read, so abort
  496.     LXI    D,80H    ;Else, reset DMA address
  497.     MVI    C,STDMA
  498.     CALL    BDOS
  499. INIT    LXI    H,CONBUF    ;Initialize console input buffer
  500.     MVI    C,17
  501. NXINIT    MVI    M,0
  502.     INX    H
  503.     DCR    C
  504.     JNZ    NXINIT
  505.     LXI    H,PWBUF
  506.     SHLD    LASTPW    ;Save pointer to first PW in file
  507.     RET        ; and return
  508. ;
  509. ABORT    CALL    ERRXIT
  510.     DB    '+++CANNOT FIND PW FILE, ACCESS DENIED','$'
  511.     ENDIF
  512. ;
  513. ERRXIT    POP    D
  514.     MVI    C,PRNSTR
  515.     CALL    BDOS    ;PRINT THE ABORT MSG, THEN EXIT
  516.     JMP    WBOOT
  517. ;
  518. ;
  519. ;  Some miscellaneous messages:
  520. ;
  521. MSG    DB    'PW=','$'    ;Msg to ask user for pw
  522. ;
  523. BADMSG    DB    '+++INCORRECT','$'
  524. ;
  525. TUMSG    DB    'You are in USER area $'    ;First part of help msg.
  526. ;
  527. CRLF    DB    CR,LF,'$'    ;Printed to start a new line
  528. ;
  529. ;
  530.     IF    NOT GOCCP
  531. REQUSR    DB    00H    ;Temporary storage area for user area number
  532.     ENDIF
  533. ;
  534. FLAG    DB    0    ;Counter for multiple PW attempts
  535. ;
  536. ;  CONSOLE INPUT BUFFER, USED FOR PASSWORD INPUT
  537. ;
  538. CONBUF    DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  539.         ;Up to 16 characters for password
  540. ;
  541.     IF    NOT PWFILE
  542. ;  PASSWORD TO ALLOW 'RESTRICTED USER AREA' ACCESS GOES HERE
  543. PASSWD    DB    'PASSWORD','$'    ;Must be followed by '$'
  544.     ENDIF
  545. ;
  546.     IF    PWFILE
  547. LOCFCB    DB    0    ;Drive is filled in here
  548.     DB    'PWFILE     '    ;Name of file that contains PW's
  549.     DS    40H    ;Some more room+ for PWFILE
  550. ;
  551. LASTPW    DW    0000H    ;Pointer to current PW in PWFILE
  552. ;
  553. PWBUF    EQU    $    ;Rest of TPA is available for PWFILE
  554.     ENDIF
  555. ;
  556. ;
  557.     END
  558.