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 / VFILR4-2.LBR / VFSUBS3.ZZ0 / VFSUBS3.Z8°
Text File  |  2000-06-30  |  10KB  |  367 lines

  1. ;===========================================================================
  2. ;
  3. ; VFSUBS3.Z80 - file name and mask processing
  4. ;
  5. ;===========================================================================
  6.  
  7.  
  8. ; Get file name from user and process into FCB pted to by DE
  9. ;    returns:    B = disk number
  10. ;            C = user number
  11.  
  12. filename:
  13.     push    de        ; Save fcb ptr
  14.     call    getfspec    ; Get file specification from user
  15.     jr    z,fnamer    ; Exit on null input line.
  16.     pop    de        ; Restore fcb ptr.
  17.     call    fname        ; Call syslib routine.
  18.     ld    a,(hl)        ; Get terminating character.
  19.     cp    ' '        ; Terminated by space?
  20.     ret    z
  21.     or    a        ; Terminated by null?
  22.     ret    z
  23. fnamer:
  24.     call    erclr        ; Clear error message line.
  25.     jp    loop        ; Error - restart command.
  26.  
  27.  
  28. ;---------------------------------------------------------------------------
  29.  
  30. ; Get File specification/Command line from user
  31. ;    On exit - HL -> first character in command line
  32. ;          A   = first character in command line
  33. ;          Z   = Z if null command line,
  34. ;            NZ if significant characters.
  35.  
  36. getfspec:            ; Get file specification
  37.     ld    b,64        ; Length of file specification
  38.     jr    getline        ; Get line from user.
  39.  
  40. getzcmd:            ; Get zcpr3 command
  41.     ld    b,253        ; Length of zcpr3 command line
  42.  
  43. getline:            ; Common code - user line input
  44.     ld    hl,(cmdbuf)    ; Get command line location
  45.     ld    (hl),b        ; Set command line length
  46.     inc    hl        ; Init actual count.
  47.     ld    (hl),0
  48.     push    hl        ; Save ptr to actual count.
  49.     ex    de,hl        ; De pts to buffer
  50.     dec    de        ; Beginning
  51.     ld    c,rdbuf        ; Read line from user
  52.     call    bdos
  53.  
  54.     pop    hl        ; Pt to actual count.
  55.     ld    e,(hl)        ; Get actual count in de
  56.     ld    d,0        ; (zero high-order offset)
  57.  
  58.     inc    hl        ; Pt to first char
  59.     push    hl        ; Save current ptr for later
  60.     add    hl,de        ; Pt to end of string
  61.     ld    (hl),0        ; Store ending zero
  62.  
  63.     pop    hl        ; Pt to first char of command line
  64.     call    sksp        ; Ignore leading spaces.
  65.     ld    a,(hl)        ; Get 1st character.
  66.     or    a        ; Test for empty line.
  67.     ret
  68.  
  69.  
  70. ;---------------------------------------------------------------------------
  71.  
  72. ; FILEMASK - GET/PUT File Selection mask (in system file 4 or on stack)
  73. ;    on entry, A = 0 to PUT file mask from FCB.
  74. ;         otherwise GET file mask to FCB.
  75.  
  76. filemask:
  77.  
  78.      if    usestk        ; If using stack for file mask
  79.  
  80.     push    af        ; Save get/put flag
  81.  
  82.     call    getsh2        ; Get data on shell stack
  83.     ld    de,19        ; Offset into stack entry
  84.     add    hl,de
  85.  
  86.     ld    de,fcb+1    ; Pt to fcb
  87.     ld    b,11        ; Repeat for 11 characters
  88.  
  89.     pop    af        ; Restore get/put flag
  90.     or    a        ; See if get or put
  91.     jr    z,putmask
  92.  
  93. getmask:
  94.     call    jchk        ; Check for no file spec and set pointer
  95. getmask1:
  96.     ld    a,(hl)        ; Get next character in source name
  97.     inc    hl        ; Increment pointer
  98.     and    7fh        ; Strip off flag bit
  99.     ld    (de),a        ; Save in destination
  100.     inc    de
  101.     djnz    getmask1
  102.     ret
  103.  
  104. putmask:
  105.     ex    de,hl        ; HL now has the FCB as source
  106.     call    jchk        ; Check for no file spec and set pointer
  107. putmask1:
  108.     ld    a,(de)        ; Get current option flag (high bit of char)
  109.     and    80h
  110.     ld    c,a        ; Save result in C
  111.     ld    a,(hl)        ; Get new filename character
  112.     inc    hl        ; Increment the pointer
  113.     and    7fh        ; Clear high bit
  114.     or    c        ; OR in the option flag
  115.     ld    (de),a        ; Copy to destination
  116.     inc    de
  117.     djnz    putmask1
  118.     ret
  119.     
  120. jchk:
  121.     ld    a,(hl)        ; Check first character of source file name
  122.     cp    ' '        ; Is it blank?
  123.     jr    z,jchk1
  124.     cp    '/'        ; Help specifier?
  125.     ret    nz        ; Neither, then leave pointer as it is
  126. jchk1:
  127.     ld    hl,joker    ; Else, use joker '????????.???' as file
  128.     ret
  129.  
  130.       else    ; not usestk
  131.  
  132.     push    af        ; Save get/put flag
  133.  
  134.     call    getfn2        ; Pt to first system file name
  135.     ld    de,11*3        ; Pt to 4th file name
  136.     add    hl,de
  137.     ld    de,fcb+1    ; Pt to fcb
  138.  
  139.     pop    af        ; Restore get/put flag
  140.     or    a        ; Test it.
  141.  
  142.     jr    nz,fmask1    ; Br if get.
  143.     ex    de,hl        ; Swap pointers for put.
  144.  
  145. fmask1:
  146.     ld    b,11        ; 11 bytes
  147.     call    moveb
  148.  
  149.     ld    hl,joker    ; Treat as '*.*' with 'joker'..
  150.     ld    b,11        ; # of characters to move
  151.     ld    a,(de)        ; Get first char of file name
  152.     cp    ' '        ; If space, fill with *.*
  153.     call    z,moveb        ; Set file id to *.*
  154.  
  155.     ld    a,(de)        ; Get first char of file name
  156.     cp    '/'        ; If opt, fill with *.*
  157.     call    z,moveb
  158.     ret
  159.     
  160.      endif    ; usestk
  161.  
  162. ;---------------------------------------------------------------------------
  163.  
  164. ; VFY$D$U - Resolve DU or DIR and verify Access
  165. ;    on entry, HL -> file specification
  166. ;    on exit,  HL is unchanged
  167. ;          BC =    DU for DU/DIR
  168. ;          Z  = Z if DU/DIR resolution error,
  169. ;               NZ if DU/DIR resolved ok.
  170. ;          C  = C if access denied,
  171. ;               NC if no password or password OK
  172.  
  173.      if    dupswd
  174.     extrn    dutdir        ; Get dir: for du:
  175.      endif
  176.  
  177. vfy$d$u:
  178.     push    hl        ; Save file spec pointer.
  179.     ld    a,1        ; Look for dir:, then du:
  180.     call    dnscan        ; Resolve dir: or du: form and return du
  181.     jr    nz,vfydu1    ; Br if resolved.
  182.     pop    hl        ; Restore file spec pointer.
  183.     scf            ; Not resolved - return with z, nc
  184.     ccf
  185.     ret
  186.  
  187. vfydu1:
  188.     call    getmdisk    ; Get maximum disk (a=1)
  189.     dec    a        ; Offset to du format (drive a = 0)
  190.     cp    b        ; Compare to requested drive.
  191.     jr    c,vfydu4    ; Br if access denied by env.
  192.  
  193.     call    getmuser    ; Get maximum disk (0-31)
  194.     cp    c        ; Compare to requested user.
  195.     jr    c,vfydu4    ; Br if access denied by env.
  196.  
  197.      if    dupswd
  198.     call    dutdir        ; Get dir: for du:
  199.     jr    z,vfydu3    ; Ok if no dir (or password)
  200.     ld    de,8        ; Pt to password
  201.     add    hl,de
  202.     ld    a,(hl)        ; Get 1st char of password
  203.     cp    ' '        ; No password?
  204.     jr    z,vfydu3    ; Br if no check required.
  205.  
  206.     push    bc        ; Save du:
  207.     push    hl        ; Save ptr to valid password.
  208.     call    cprmpt        ; Prompt to get du: password
  209.     db    'Password: ',0
  210.  
  211.     ld    hl,pswdbuf    ; Get password buffer location
  212.     ld    b,8        ; Get password length
  213.     ld    (hl),b        ; Get command line length
  214.     inc    hl
  215.     inc    hl
  216.     call    fill        ; Initialize buffer to blanks.
  217.  
  218.     ld    de,pswdbuf    ; Get password buffer location again
  219.     ld    c,rdbuf        ; Console read-buffer function
  220.     call    bdos
  221.  
  222.     ld    hl,pswdbuf+2    ; Point to password.
  223.     ld    b,8        ; 8 chars in password.
  224. vfydu2:
  225.     ld    a,(hl)        ; Capitalize character.
  226.     call    caps
  227.     ld    (hl),a        ; Put back into buffer
  228.     inc    hl        ; Point at character to capitalize
  229.     djnz    vfydu2        ; Loop
  230.  
  231.     ld    de,pswdbuf+2    ; Point to password.
  232.     pop    hl        ; And to valid password.
  233.     ld    b,8        ; 8 chars in password.
  234.     call    cmpstr        ; Compare for exact match
  235.     pop    bc        ; Restore du:
  236.     jr    nz,vfydu4    ; Access denied - invalid password.
  237.      endif
  238.  
  239. vfydu3:
  240.     pop    hl        ; Restore file spec pointer.
  241.     or    0ffh        ; Resolved ok, access allowed.
  242.     ret            ; Return with nz, nc
  243.  
  244. vfydu4:
  245.     pop    hl        ; Restore file spec pointer.
  246.     or    0ffh        ; Access denied - return with nz, c
  247.     scf
  248.     ret
  249.  
  250. ;---------------------------------------------------------------------------
  251.  
  252. ; Get pointer to system file name #2
  253.  
  254. sysfn2:
  255.     call    getfn2        ; Get address of system file #1
  256.     ld    de,11
  257.     add    hl,de        ; Now HL points to file #2
  258.     ret
  259.  
  260. ;---------------------------------------------------------------------------
  261.  
  262. ; Record current file pointer and options settings
  263.  
  264. putopt:
  265.     ld    a,(initflag)    ; If initflag set, do not save
  266.     or    a        ; ..file pointer
  267.     jr    nz,putopt0
  268.  
  269.     call    sysfn2        ; Get pointer to system file #2
  270.     ex    de,hl        ; Put pointer into DE
  271.     ld    hl,(ringpos)    ; Point to current file
  272.     inc    hl        ; Increment pointer to file name position
  273.     ld    b,11        ; Copy 11 bytes
  274.     call    movea
  275.     ld    a,0ffh        ; Fool system into using system file #2
  276.     ld    (initflag),a    ; ..as the pointer on next screen update
  277.  
  278. putopt0:
  279.  
  280.      if    usestk        ; If using shell stack to store file mask
  281.  
  282.     call    getsh2        ; Get pointer to shell stack
  283.     ld    de,19        ; Offset into stack entry
  284.     add    hl,de
  285.     ld    de,options    ; We must copy new options into stored name
  286.     ld    b,nopt        ; Number of options to store
  287. putopt1:
  288.     ld    a,(hl)        ; Get file name character
  289.     and    7fh        ; Clear flag bit
  290.     ld    c,a        ; Save it in C
  291.     ld    a,(de)        ; Get option flag
  292.     and    80h        ; Isolate high bit
  293.     or    c        ; Combine with character
  294.     ld    (hl),a        ; Save it
  295.     inc    hl        ; Increment pointers
  296.     inc    de
  297.     djnz    putopt1        ; Loop through (up to) 11 flags
  298.     ret
  299.  
  300.      else    ; not usestk (using stack only for flag byte)
  301.  
  302.     call    getsh2        ; Get data on shell stack
  303.     dec    de
  304.     add    hl,de        ; HL points to last byte in stack entry
  305.     ex    de,hl        ; Now it is in DE
  306.     ld    b,nopt        ; Number of options to copy
  307.     ld    hl,options    ; Start at beginning of options
  308.     xor    a        ; Initialize flags byte
  309. putopt1:
  310.     ld    c,(hl)        ; Get next option flag
  311.     rl    c        ; Move one bit into carry
  312.     rl    a        ; Move that bit into the flag byte
  313.     inc    hl        ; Point to next option
  314.     djnz    putopt1
  315.     ld    (de),a        ; Put byte into shell entry
  316.     ret
  317.  
  318.      endif    ; usestk
  319.  
  320. ;---------------------------------------------------------------------------
  321.  
  322. ; Retrieve current options settings
  323.  
  324. getopt:
  325.  
  326.      if    usestk
  327.  
  328.     call    getsh2
  329.     ld    de,19
  330.     add    hl,de        ; HL points to last byte in stack entry
  331.     ex    de,hl        ; Now it is in DE
  332.     ld    b,nopt        ; Number of options to copy
  333.     ld    hl,options    ; Point to first option
  334. getopt1:
  335.     ld    a,(de)        ; Get filename character
  336.     and    80h        ; Test high bit
  337.     rla            ; A is 0 and CY has condition
  338.     jr    nc,getopt2    ; If no carry, leave A=0
  339.     cpl            ; Else change to FF
  340. getopt2:
  341.     ld    (hl),a        ; Set option
  342.     inc    hl        ; Bump pointers
  343.     inc    de
  344.     djnz    getopt1
  345.     ret
  346.  
  347.      else    ; not usestk
  348.  
  349.     call    getsh2        ; Get data on shell stack
  350.     dec    de
  351.     add    hl,de        ; HL points to last byte in stack entry
  352.     ex    de,hl        ; Now it is in DE
  353.     ld    b,nopt        ; Number of options to copy
  354.     ld    hl,options+nopt-1    ; Start at end of options
  355.     ld    a,(de)        ; Get flag byte from shell stack
  356.     ld    c,a
  357. getopt1:
  358.     xor    a        ; Preset for reset flag
  359.     sra    c        ; Shift flag bit into carry
  360.     jr    nc,getopt2    ; No carry -> leave the 0
  361.     cpl            ; Else turn the 0 into FF
  362. getopt2:
  363.     ld    (hl),a        ; Set the option flag byte
  364.     dec    hl        ; Back up one option
  365.     djnz    getopt1        ; Loop through options
  366.     ret
  367.