home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol098 / szfname.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  16.7 KB  |  777 lines

  1. ;
  2. ; SYSLIB Module Name:  SZFNAM
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  2.2
  5. ; Module Version Number:  1.1
  6. ; Module Entry Points:
  7. ;    ZFNINIT        ZFNAME        ZDNAME        ZDNFIND
  8. ;    ZCPRQ2
  9. ; Module External References:
  10. ;    CAPS        FI3$CLOSE    FI3$OPEN    F3$GET
  11. ;    INITFCB        MOVEB        ZPFIND        BDOS
  12. ;
  13. ;*
  14. ;*  ZFNAME is a file name scanner.  Pointing to the first character
  15. ;*    of a file name specification of the form 'dir:filename.typ', where
  16. ;*    any part of this specification is optional, this routine fills in
  17. ;*    an FCB with zeros, properly initializes the FN and FT (File Name and
  18. ;*    File Type) fields if 'filename.typ' or any part thereof is present,
  19. ;*    and returns the value of disk and user if they are specified
  20. ;*    (or FFH if they are not).
  21. ;*  The directory indicator 'dir:', if specified, may be of one of two forms:
  22. ;*        DIRECT -- A named directory, of up to 8 chars in length
  23. ;*        d      -- A disk drive letter
  24. ;*        u      -- A user number
  25. ;*        du     -- A disk drive letter and a user number
  26. ;*    The named directory form is checked first, so if a directory named
  27. ;*        A or A10 exists, it matches, as opposed to Drive A or
  28. ;*        drive/user A/10.
  29. ;*    Examples:
  30. ;*        HELP:*.HLP
  31. ;*        A5:TEST.TXT
  32. ;*        C?:ABC.*
  33. ;*        PASCAL:*.COM
  34. ;*    NOTE:  It is the programmer's responsibility to have called and
  35. ;*        properly initialized the buffers in the ZCPRINIT routine
  36. ;*        in the SZCPR module
  37. ;*
  38.  
  39.  
  40. ;*
  41. ;*  EXTERNALS
  42. ;*
  43.     EXT    BDOS    ; BDOS UTILITY
  44.     EXT    MOVEB    ; COPY UTILITY
  45.     EXT    INITFCB    ; INIT FCB UTILITY
  46.     EXT    CAPS    ; CAPITALIZE ROUTINE
  47.     EXT    ZPFIND    ; FIND FILE ALONG PATH
  48.     EXT    FI3$OPEN    ; BYTE-ORIENTED FILE I/O
  49.     EXT    FI3$CLOSE
  50.     EXT    F3$GET
  51.  
  52.  
  53. ;*
  54. ;*  BASIC EQUATES
  55. ;*
  56. MAXDISK    EQU    16    ; MAX NUMBER OF DISKS
  57. MAXUSER    EQU    31    ; MAX USER NUMBER
  58. MAXNAME    EQU    64    ; MAX NUMBER OF NAMES IN DIR FILE
  59. CPM    EQU    0    ; CP/M ENTRY
  60. BENTRY    EQU    CPM+5    ; BDOS ENTRY
  61. CR    EQU    0DH
  62. LF    EQU    0AH
  63.  
  64.  
  65. ;*
  66. ;*  INIT MODULE
  67. ;*    IF THE USER WISHES TO CHANGE THE NAME OF THE DIRECTORY FILE TO LOOK
  68. ;*    FOR, HE CALLS THIS ROUTINE, WITH THE FCB PTR IN DE
  69. ;*
  70. ;*    IF THE USER WISHES TO CHANGE THE ADDRESS OF THE MEMORY-RESIDENT
  71. ;*    DISK NAMES BUFFER, HE CALLS THIS ROUTINE WITH THE ADDRESS IN HL
  72. ;*
  73. ;*    IF THE USER WISHES TO CHANGE THE NUMBER OF DIRECTORY NAMES PERMITTED
  74. ;*    IN THE DIRECTORY FILE, HE CALLS THIS ROUTINE, WITH THE NEW NAME
  75. ;*    COUNT IN C
  76. ;*
  77. ;*    THE SPECIFIC BUFFERED VALUES TO CHANGE ARE INDICATED BY THE A
  78. ;*    REGISTER AS FOLLOWS:
  79. ;*        BIT 7 -- SET NAME OF DIR FILE TO FCB PTED TO BY DE
  80. ;*        BIT 6 -- SET MAX NUMBER OF DIRECTORY NAMES PERMITTED
  81. ;*        BIT 5 -- SET ADDRESS OF MEMORY-RESIDENT BUFFER
  82. ;*
  83. ;*    IF THIS MODULE IS NOT CALLED, THE FOLLOWING DEFAULT VALUES ARE
  84. ;*    ASSUMED:
  85. ;*        NAME OF DIRECTORY NAMES FILE -- NAMES.DIR
  86. ;*        MAX NUMBER OF DIRECTORY NAMES -- 64
  87. ;*        NO MEMORY-RESIDENT NAMES BUFFER
  88. ;*
  89. ;*    NO REGS ARE AFFECTED
  90. ;*    ON INPUT, DE PTS TO NEW FCB
  91. ;*          HL IS THE ADDRESS OF THE MEMORY-RESIDENT NAMES BUFFER
  92. ;*          C IS THE MAX NUMBER OF DIRECTORY NAMES
  93. ;*          A IS FLAG --
  94. ;*            BIT 7 SET (1) - LOAD DEFAULT FCB FROM DE
  95. ;*            BIT 6 SET (1) - LOAD NAME COUNT FROM C
  96. ;*
  97. ZFNINIT::
  98.     PUSH    H    ; SAVE REGS
  99.     PUSH    D
  100.     PUSH    B
  101.     PUSH    PSW
  102.     MOV    B,A    ; SAVE FLAG IN B
  103.     ANI    20H    ; LOOK AT BIT 5
  104.     JZ    ZFNIN0    ; SKIP ADDRESS LOAD IF BIT 5 = 0
  105.     SHLD    NDADR    ; SET ADDRESS FROM HL
  106. ZFNIN0:
  107.     MOV    A,B    ; GET FLAG BYTE
  108.     ANI    80H    ; LOOK AT BIT 7
  109.     JZ    ZFNIN1    ; SKIP FCB LOAD IF BIT 7 = 0
  110.     PUSH    B    ; SAVE FLAG IN B
  111.     XCHG        ; HL PTS TO FCB
  112.     LXI    D,FNFCB    ; PT TO MY FCB
  113.     MVI    B,12    ; COPY 12 BYTES
  114.     CALL    MOVEB    ; COPY
  115.     POP    B    ; GET FLAG IN B
  116. ZFNIN1:
  117.     MOV    A,B    ; GET FLAG
  118.     ANI    40H    ; LOOK AT BIT 6
  119.     JZ    ZFNIN2    ; SKIP NAMES LOAD IF BIT 6 = 0
  120.     MOV    A,C    ; GET COUNT
  121.     STA    MAXN    ; STORE IN BUFFER
  122. ZFNIN2:
  123.     POP    PSW    ; RESTORE REGS
  124.     POP    B
  125.     POP    D
  126.     POP    H
  127.     RET
  128.  
  129.  
  130. ;*
  131. ;*  ZCPRQ2 -- RETURN POINTER TO BUFFER AREA IN 2ND ZCPR2 MODULE
  132. ;*    ON RETURN, HL PTS TO FIRST BYTE OF BUFFER AREA
  133. ;*
  134. ZCPRQ2::
  135.     LXI    H,MAXN    ; 1ST BYTE
  136.     RET
  137.  
  138. ;
  139. ;  FCB USED BY ZFNAME
  140. ;
  141. MAXN:
  142.     DB    MAXNAME                ; INIT TO MAXNAME
  143. NDADR:
  144.     DW    0                ; INIT TO NO BUFFER
  145. FNFCB:
  146.     DB    0,'NAMES   DIR',0,0,0,0        ; INIT TO NAMES.DIR
  147.     DS    16
  148.     DS    4
  149.  
  150. ;*
  151. ;*  MAIN MODULE
  152. ;*    ON ENTRY, DE PTS TO FCB TO BE FILLED AND HL PTS TO FIRST BYTE OF
  153. ;*        TARGET STRING; FCB IS 36 BYTES LONG
  154. ;*    ON EXIT, B=DISK NUMBER (1 FOR A, ETC) AND C=USER NUMBER
  155. ;*        HL PTS TO TERMINATING CHAR
  156. ;*        A=0 AND Z SET IF ERROR IN DISK OR USER NUMBERS, A=0FFH AND NZ
  157. ;*            IF OK
  158. ;*
  159. ZFNAME::
  160.     PUSH    D    ; SAVE DE
  161.     PUSH    H    ; SAVE HL
  162.     XCHG        ; SAVE PTR TO FCB
  163.     SHLD    FCBPTR
  164.     XCHG        ; DE PTS TO FCB
  165.     POP    H    ; GET HL
  166.     MVI    A,0FFH    ; SET DEFAULT DISK AND USER
  167.     STA    DISK
  168.     STA    USER
  169. ;  FILL TARGET FCB WITH ZEROES
  170.     MVI    B,36    ; INIT FCB
  171.     XRA    A    ; A=0
  172. FNINI:
  173.     STAX    D    ; STORE ZERO
  174.     INX    D    ; PT TO NEXT
  175.     DCR    B    ; COUNT DOWN
  176.     JNZ    FNINI
  177. ;  SCAN FOR COLON IN STRING
  178.     PUSH    H    ; SAVE PTR TO TARGET STRING
  179. COLON:
  180.     MOV    A,M    ; SCAN FOR COLON OR SPACE
  181.     CPI    ':'    ; COLON FOUND?
  182.     JZ    COLON1
  183.     CALL    DELCK    ; DELIMITER FOUND?
  184.     JZ    GETF1
  185.     INX    H    ; PT TO NEXT
  186.     JMP    COLON    ; CONTINUE IF NOT END OF LINE
  187. ;  WE HAVE FOUND A COLON, SO THERE IS A DIR: PREFIX
  188. COLON1:
  189.     POP    H    ; GET PTR TO FIRST CHAR
  190.     MVI    A,0FFH    ; ALLOW DU: FORM
  191.     CALL    ZDNFIND    ; SCAN FOR DIRECTORY NAME; RETURN DISK IN DISK,
  192.     JNZ    GETFILE        ;   USER IN USER, NZ IF OK, HL PTS TO COLON
  193.     XRA    A    ; ERROR INDICATOR
  194.     POP    D    ; RESTORE DE
  195.     RET
  196.  
  197. ;  EXTRACT FILE NAME
  198. GETF1:
  199.     POP    H    ; GET PTR TO BYTE
  200. GETFILE:
  201.     XCHG        ; GET PTR TO FCB
  202.     LHLD    FCBPTR
  203.     XCHG        ; HL PTS TO TARGET STRING, DE PTS TO FCB
  204.     MOV    A,M    ; PTING TO COLON?
  205.     CPI    ':'
  206.     JNZ    GFILE1
  207.     INX    H    ; SKIP OVER COLON
  208. GFILE1:
  209.     CALL    DELCK    ; GET NEXT CHAR AND CHECK FOR A DELIMITER
  210.     JNZ    GFILE2    ; PROCESS SINCE NOT A DELIMITER
  211.     CPI    '.'    ; WAS DELIMITER A '.'?
  212.     JZ    GFILE2    ; PROCESS SINCE FN MISSING
  213. ;  NO NAME SPECIFIED, SO MAKE IT WILD
  214. GFQUES:
  215.     INX    D    ; FILL WITH '?'
  216.     MVI    B,11    ; 11 BYTES
  217.     MVI    A,'?'
  218. GFFILL:
  219.     STAX    D    ; PUT ?
  220.     INX    D    ; PT TO NEXT
  221.     DCR    B    ; COUNT DOWN
  222.     JNZ    GFFILL
  223. ;  EXIT ZFNAME
  224. FNDONE:
  225.     LDA    DISK    ; GET DISK NUMBER
  226.     CPI    0FFH    ; CURRENT DISK?
  227.     JZ    FNDN1
  228.     INR    A    ; ADD 1 SO IN THE RANGE FROM 1 TO 16
  229. FNDN1:
  230.     MOV    B,A    ; ... IN B
  231.     LDA    USER    ; GET USER NUMBER
  232.     MOV    C,A    ; ... IN C
  233.     POP    D    ; RESTORE REGS
  234.     MVI    A,0FFH    ; NO ERROR
  235.     ORA    A    ; SET FLAGS
  236.     RET
  237. ;  GET FILE NAME FIELDS
  238. GFILE2:
  239.     MVI    B,8    ; AT MOST 8 BYTES FOR FN
  240.     CALL    SCANF    ; SCAN AND FILL
  241.     MVI    B,3    ; AT MOST 3 BYTES FOR FT
  242.     MOV    A,M    ; GET DELIMITER
  243.     CPI    '.'    ; FN ENDING IN '.'?
  244.     JNZ    GFILE3
  245.     INX    H    ; PT TO CHAR AFTER '.'
  246.     CALL    SCANF    ; SCAN AND FILL
  247.     JMP    FNDONE    ; DONE ... RETURN ARGS
  248. ;  FT FIELD NOT GIVEN, SO <SP> FILL FT FIELD IN FCB
  249. GFILE3:
  250.     CALL    SCANF4    ; FILL WITH <SP>
  251.     JMP    FNDONE
  252. ;
  253. ;  SCANNER ROUTINE
  254. ;
  255. SCANF:
  256.     CALL    DELCK    ; CHECK FOR DELIMITER
  257.     JZ    SCANF4    ; <SP> FILL IF FOUND
  258.     INX    D    ; PT TO NEXT BYTE IN FN
  259.     CPI    '*'    ; ? FILL?
  260.     JNZ    SCANF1
  261.     MVI    A,'?'    ; PLACE '?'
  262.     STAX    D
  263.     JMP    SCANF2
  264. SCANF1:
  265.     STAX    D    ; PLACE CHAR
  266.     INX    H    ; PT TO NEXT POSITION
  267. SCANF2:
  268.     DCR    B    ; COUNT DOWN
  269.     JNZ    SCANF    ; CONTINUE LOOP
  270. SCANF3:
  271.     CALL    DELCK    ; "B" CHARS OR MORE - SKIP TO DELIMITER
  272.     RZ
  273.     INX    H    ; PT TO NEXT
  274.     JMP    SCANF3
  275. SCANF4:
  276.     INX    D    ; PT TO NEXT FN OR FT
  277.     MVI    A,' '    ; <SP> FILL
  278.     STAX    D
  279.     DCR    B    ; COUNT DOWN
  280.     JNZ    SCANF4
  281.     RET
  282.  
  283. ;*
  284. ;*  ZDNAME -- LOAD THE CONTENTS OF THE NAMES.DIR FILE INTO THE MEMORY
  285. ;*    BUFFER PTED TO BY HL
  286. ;*    ON ENTRY, HL PTS TO THE MEMORY BUFFER EXTENDING TO THE BASE OF
  287. ;*        THE BDOS
  288. ;*    ON EXIT, HL PTS TO THE FIRST ENTRY IN THE NAMES.DIR FILE, BC IS
  289. ;*        THE NUMBER OF VALID ENTRIES, A IS THE ERROR FLAG (A=0FFH
  290. ;*        AND NZ IF NO ERROR, A=0 AND Z IF ERROR)
  291. ;*            ERRORS MAY BE EITHER MEMORY OVERFLOW OR NAMES.DIR
  292. ;*            NOT FOUND
  293. ;*    EACH NAMES.DIR ENTRY IS 10 BYTES LONG, STRUCTURED AS FOLLOWS:
  294. ;*        BYTE 0: DISK NUMBER (A=0)
  295. ;*        BYTE 1: USER NUMBER
  296. ;*        BYTES 2-9: DIRECTORY NAME, 8 CHARS MAX, <SP> FILL AT END
  297. ;*
  298. ZDNAME::
  299.     PUSH    D    ; SAVE UNCHANGED REG
  300.     SHLD    DIRNAME    ; SAVE PTR TO BUFFER
  301.     SHLD    CURNAME    ; SAVE PTR TO FIRST ENTRY
  302.     LXI    D,FNFCB    ; PT TO FCB WHICH CONTAINS DIR FILE NAME
  303.     CALL    INITFCB    ; INIT FCB
  304.     MVI    B,0FFH    ; SEARCH CURRENT USER
  305.     CALL    ZPFIND    ; LOOK FOR NAMES.DIR FILE
  306.     JZ    DIRNERR    ; FILE NOT FOUND ERROR
  307. ;
  308. ;  FOUND NAMES.DIR, SO LOAD IT
  309. ;
  310.     CALL    PUTUD    ; SAVE CURRENT USER/DISK
  311.     CALL    LOGUD    ; LOG IN NEW USER/DISK
  312.     LXI    D,FNFCB    ; PT TO FCB
  313.     CALL    FI3$OPEN    ; OPEN FOR INPUT
  314. ;
  315. ;  LOAD NAMES.DIR FILE
  316. ;
  317.     MVI    C,0    ; SET ENTRY COUNT
  318.     LDA    MAXN    ; GET MAX NUMBER OF NAMES
  319.     MOV    B,A    ; ... IN B
  320. ZDNA1:
  321.     LXI    H,ENTRY    ; PT TO ENTRY BUFFER
  322.     CALL    GETNAME    ; GET NAME FROM DISK
  323.     JNZ    ZDNA3    ; DONE?
  324.     LDA    ENTRY+2    ; LOOK AT FIRST LETTER OF DIR NAME
  325.     ORA    A    ; NO ENTRY?
  326.     JZ    ZDNA2
  327.     LHLD    DIRNAME    ; PT TO BUFFER ENTRY
  328.     LXI    D,ENTRY    ; PT TO NEW ENTRY
  329.     INR    C    ; INCREMENT ENTRY COUNTER
  330.     PUSH    B    ; SAVE COUNTERS
  331.     XCHG        ; HL PTS TO NEW ENTRY, DE PTS TO DEST
  332.     MOV    A,M    ; GET DISK NUMBER
  333.     STAX    D    ; STORE DISK NUMBER
  334.     INX    H    ; PT TO USER NUMBER
  335.     INX    D
  336.     MOV    A,M    ; GET USER
  337.     STAX    D    ; PUT USER
  338.     MVI    B,8    ; AT MOST 8 MORE BYTES
  339. ZDNA1A:
  340.     INX    H    ; PT TO NEXT BYTE
  341.     INX    D
  342.     MOV    A,M    ; GET NEXT BYTE
  343.     ORA    A    ; END OF NAME?
  344.     JZ    ZDNA1B    ; <SP> FILL
  345.     STAX    D    ; PUT BYTE
  346.     DCR    B    ; COUNT DOWN
  347.     JNZ    ZDNA1A
  348.     INX    D    ; PT TO FIRST BYTE OF NEXT ENTRY
  349.     JMP    ZDNA1C
  350. ZDNA1B:
  351.     MVI    A,' '    ; <SP> FILL
  352.     STAX    D    ; PLACE <SP>
  353.     INX    D    ; PT TO NEXT
  354.     DCR    B    ; COUNT DOWN
  355.     JNZ    ZDNA1B
  356. ZDNA1C:
  357.     POP    B    ; RESTORE COUNTERS
  358.     LHLD    BENTRY+1    ; PT TO BDOS ADDRESS
  359.     MOV    A,H    ; CHECK FOR PAGE BEFORE BDOS
  360.     DCR    A    ; PAGE BEFORE
  361.     CMP    D    ; ARE WE THERE?
  362.     JZ    DNSC2A    ; ERROR IF SO, BUT RESTORE UD
  363.     JC    DNSC2A
  364.     XCHG        ; HL PTS TO NEXT BUFFER POSITION
  365.     SHLD    DIRNAME    ; SAVE PTR
  366. ;
  367. ;  CONTINUE LOOPING
  368. ;
  369. ZDNA2:
  370.     DCR    B    ; COUNT DOWN
  371.     JNZ    ZDNA1
  372. ;
  373. ;  COMPLETION EXIT
  374. ;
  375. ZDNA3:
  376.     CALL    FI3$CLOSE    ; CLOSE FILE
  377.     CALL    GETUD    ; RESTORE USER/DISK
  378.     MVI    B,0    ; SET HIGH-ORDER BYTE
  379.     LHLD    CURNAME    ; GET PTR TO FIRST ENTRY
  380.     MVI    A,0FFH    ; SET NO ERROR
  381.     ORA    A    ; SET FLAGS
  382.     POP    D    ; RESTORE DE
  383.     RET
  384.  
  385. ;*
  386. ;*  ZDNFIND -- SCAN FOR POSSIBLE DISK DIRECTORY NAME
  387. ;*    THIS ROUTINE EXAMINES THE DIR: PREFIX FOR EITHER A DIRECTORY NAME
  388. ;*        OR THE DU FORM
  389. ;*    ON ENTRY, HL PTS TO DIRECTORY NAME ENDING IN ANY VALID DELIMITER
  390. ;*        AND A=0 IF DU: FORM NOT ALLOWED (JUST DIR: FORM ALLOWED)
  391. ;*    RETURN DISK IN B, USER IN C, NZ IF OK, HL PTS TO COLON
  392. ;*    DE IS NOT AFFECTED
  393. ;*
  394. ZDNFIND::
  395.     PUSH    D    ; SAVE DE
  396.     SHLD    DIRNAME    ; SAVE DIRECTORY NAME AWAY
  397.     ORA    A    ; DU: FORM ALLOWED?
  398.     JNZ    SVDISK    ; SCAN FOR DU: FORM FIRST
  399. ;
  400. ;  LOOK FOR DIR: FORM
  401. ;
  402. NAME:
  403. ;
  404. ;  SCAN MEMORY-RESIDENT BUFFER IF ONE IS AVAILABLE
  405. ;
  406.     LHLD    NDADR    ; GET ADDRESS
  407.     MOV    A,L    ; CHECK FOR ZERO
  408.     ORA    H
  409.     JZ    NAME2
  410.     INX    H    ; PT TO ENTRY COUNT
  411.     MOV    A,M    ; GET ENTRY COUNT
  412.     ORA    A    ; CHECK FOR NO ENTRIES
  413.     JZ    NAME2    ; GOTO DISK IF NO ENTRIES IN MEMORY
  414.     MOV    B,A    ; ENTRY COUNT IN B
  415.     INX    H    ; PT TO FIRST ENTRY
  416.     XCHG        ; DE PTS TO FIRST ENTRY IN MEMORY
  417. ;
  418. ;  MAIN SCANNING LOOP FOR MEMORY-RESIDENT BUFFER
  419. ;
  420. NAME0:
  421.     LHLD    DIRNAME    ; HL PTS TO DIR NAME
  422.     PUSH    D    ; SAVE PTR TO CURRENT MEMORY ENTRY
  423.     MVI    C,8    ; SCAN UP TO 8 BYTES
  424.     INX    D    ; SKIP DISK
  425.     INX    D    ; SKIP USER
  426. NAME1:
  427.     CALL    DELCK    ; CHECK FOR DELIMITER IN DIR NAME
  428.     JZ    NAME1B
  429.     LDAX    D    ; GET CHAR IN BUFFER
  430.     CMP    M    ; COMPARE AGAINST TARGET NAME
  431.     JNZ    NAME1A
  432.     INX    H    ; PT TO NEXT
  433.     INX    D
  434.     DCR    C    ; COUNT DOWN
  435.     JNZ    NAME1
  436.     JMP    NAME1C    ; FOUND
  437. NAME1A:
  438.     POP    H    ; GET PTR TO CURRENT BUFFER ENTRY
  439.     LXI    D,10    ; SKIP TO NEXT ENTRY
  440.     DAD    D    ; HL PTS TO NEXT ENTRY
  441.     XCHG        ; DE PTS TO NEXT ENTRY
  442.     DCR    B    ; COUNT DOWN
  443.     JNZ    NAME0
  444.     JMP    NAME2    ; COMPLETE FAILURE -- DISK SCAN NOW
  445. ;
  446. ;  DELIM ENCOUNTERED ON TARGET NAME, SO CHECK FOR SPACE ON BUFFER ENTRY
  447. ;    FOR A MATCH
  448. ;
  449. NAME1B:
  450.     LDAX    D    ; DELIM ENCOUNTERED, SO MUST BE <SP> TO MATCH
  451.     CPI    ' '    ; CHECK FOR SPACE
  452.     JNZ    NAME1A    ; NOT SPACE, SO SKIP TO NEXT
  453. ;
  454. ;  ENTRY FOUND
  455. ;
  456. NAME1C:
  457.     POP    H    ; GET PTR TO ENTRY
  458.     JMP    DNSC3A    ; EXTRACT DATA AND CONTINUE
  459. ;
  460. ;  LOOK FOR DIR NAME FILE
  461. ;
  462. NAME2:
  463.     LXI    D,FNFCB    ; PT TO FCB WHICH CONTAINS DIR FILE NAME
  464.     CALL    INITFCB    ; INIT FCB
  465.     MVI    B,0FFH    ; SEARCH CURRENT USER
  466.     CALL    ZPFIND    ; LOOK FOR NAME FILE
  467.     JZ    DIRNERR    ; ERROR IF NOT FOUND
  468. ;
  469. ;  FOUND DIR NAME FILE, SO LOAD IT AND SCAN IT FOR TARGET NAME
  470. ;
  471.     CALL    PUTUD    ; SAVE CURRENT USER/DISK
  472.     CALL    LOGUD    ; LOG IN NEW USER/DISK
  473.     LXI    D,FNFCB    ; PT TO FCB
  474.     CALL    FI3$OPEN    ; OPEN FOR INPUT
  475. ;
  476. ;  LOAD DIR NAME FILE ENTRIES
  477. ;
  478.     LDA    MAXN    ; GET MAXIMUM NUMBER OF NAMES
  479.     MOV    B,A    ; ... IN B
  480. DNSC1:
  481.     LXI    H,ENTRY    ; PT TO ENTRY BUFFER
  482.     CALL    GETNAME    ; GET NAME FROM DISK
  483.     JNZ    DNSC2    ; ERROR EXIT?
  484.     CALL    SCANAME    ; SCAN FOR DIR NAME
  485.     JZ    DNSC3    ; FOUND ENTRY, SO GET VALUES
  486.     DCR    B    ; COUNT DOWN
  487.     JNZ    DNSC1
  488. DNSC2:
  489.     CALL    FI3$CLOSE    ; CLOSE FILE
  490. DNSC2A:
  491.     CALL    GETUD    ; RESTORE CURRENT USER/DISK
  492.     JMP    DIRNERR    ; ERROR SINCE NO ENTRY FOUND
  493. ;
  494. ;  DIR NAME FOUND, SO GET DISK AND USER INFORMATION
  495. ;
  496. DNSC3:
  497.     CALL    FI3$CLOSE    ; CLOSE FILE
  498.     CALL    GETUD    ; RESTORE CURRENT USER/DISK
  499. DNSC3A:
  500.     MOV    A,M    ; GET DISK (HL PTS TO CURRENT ENTRY)
  501.     STA    DISK    ; SAVE DISK
  502.     INX    H    ; PT TO USER
  503.     MOV    A,M    ; GET USER
  504.     STA    USER    ; SAVE USER
  505. ;
  506. ;  SKIP TO COLON AFTER DIR NAME
  507. ;
  508.     LHLD    DIRNAME    ; PT TO DIR NAME
  509. DNSC4:
  510.     CALL    DELCK    ; SKIP TO DELIMITER
  511.     JZ    DIRNX    ; EXIT IF SO
  512.     INX    H    ; PT TO NEXT
  513.     JMP    DNSC4
  514. ;
  515. ;  LOOK AT START OF DU: FORM
  516. ;    ON ENTRY, HL PTS TO FIRST CHAR OF DIRECTORY NAME
  517. ;
  518. SVDISK:
  519.     MOV    A,M    ; GET DISK LETTER
  520.     CALL    CAPS    ; CAPITALIZE LETTER
  521.     CPI    'A'    ; DIGIT?
  522.     JC    USERCK    ; IF NO DIGIT, MUST BE USER OR COLON
  523.     SUI    'A'    ; CONVERT TO NUMBER
  524.     CPI    MAXDISK    ; LIMIT?
  525.     JNC    NAME    ; NAME IF OUT OF LIMIT
  526.     STA    DISK    ; SAVE FLAG
  527.     INX    H    ; PT TO NEXT CHAR
  528. ;
  529. ;  CHECK FOR USER
  530. ;
  531. USERCK:
  532.     MOV    A,M    ; GET POSSIBLE USER NUMBER
  533.     CPI    ':'    ; NO USER NUMBER
  534.     JZ    DIRNX    ; EXIT IF SO
  535.     CPI    '?'    ; ALL USER NUMBERS?
  536.     JNZ    USERC1
  537.     STA    USER    ; SET VALUE
  538.     INX    H    ; PT TO AFTER
  539.     MOV    A,M    ; MUST BE COLON
  540.     CPI    ':'
  541.     JZ    DIRNX    ; EXIT
  542.     JMP    DIRNERR    ; FATAL ERROR IF NOT COLON AFTER ?
  543. USERC1:
  544.     XRA    A    ; ZERO USER NUMBER
  545.     MOV    B,A    ; B=ACCUMULATOR FOR USER NUMBER
  546. USRLOOP:
  547.     MOV    A,M    ; GET DIGIT
  548.     INX    H    ; PT TO NEXT
  549.     CPI    ':'    ; DONE?
  550.     JZ    USRDN
  551.     SUI    '0'    ; CONVERT TO BINARY
  552.     JC    NAME    ; NAME IF USER NUMBER ERROR
  553.     CPI    10
  554.     JNC    NAME
  555.     MOV    C,A    ; NEXT DIGIT IN C
  556.     MOV    A,B    ; OLD NUMBER IN A
  557.     ADD    A    ; *2
  558.     ADD    A    ; *4
  559.     ADD    B    ; *5
  560.     ADD    A    ; *10
  561.     ADD    C    ; *10+NEW DIGIT
  562.     MOV    B,A    ; RESULT IN B
  563.     JMP    USRLOOP
  564. USRDN:
  565.     MOV    A,B    ; GET NEW USER NUMBER
  566.     CPI    MAXUSER+1    ; WITHIN RANGE?
  567.     JNC    NAME    ; NAME IF OUT OF RANGE
  568.     STA    USER    ; SAVE IN FLAG
  569. ;
  570. ;  VALID EXIT -- FOUND IT, SO LOAD BC AND EXIT FLAG; ON ENTRY, HL PTS TO :
  571. ;
  572. DIRNX:
  573.     LDA    USER    ; RETURN USER IN C, DISK IN B
  574.     MOV    C,A
  575.     LDA    DISK
  576.     MOV    B,A
  577.     INR    B    ; DISK A = 1
  578.     MVI    A,0FFH    ; SET NO ERROR
  579.     ORA    A    ; SET FLAGS
  580.     POP    D    ; RESTORE DE
  581.     RET
  582. ;
  583. ;  INVALID EXIT -- NOT FOUND OR ERROR
  584. ;    NO VALID RETURN PARAMETERS (BC, HL)
  585. ;
  586. DIRNERR:
  587.     XRA    A    ; ERROR CODE
  588.     POP    D    ; RESTORE DE
  589.     RET
  590.  
  591. ;*
  592. ;*  BUFFERS
  593. ;*
  594. FCBPTR:    DS    2    ; PTR TO FCB
  595. DISK:    DS    1    ; DISK NUMBER
  596. USER:    DS    1    ; USER NUMBER
  597. ENTRY:
  598.     DS    11    ; ENTRY FROM DISK FILE (DISK, USER, DIR NAME)
  599. DIRNAME:
  600.     DS    2    ; PTR TO DIRECTORY NAME
  601. CURNAME:
  602.     DS    2    ; PTR TO CURRENT LOCATED NAME
  603.  
  604. ;
  605. ;  SCAN DIRECTORY ENTRY PTED TO BY HL FOR DIRECTORY NAME STARTING AT DIRNAME
  606. ;    RETURN WITH Z IF FOUND; DO NOT AFFECT BC
  607. ;
  608. SCANAME:
  609.     PUSH    B    ; SAVE BC
  610.     SHLD    CURNAME    ; SET CURRENT NAME PTR
  611.     INX    H    ; SKIP DISK
  612.     INX    H    ; SKIP USER
  613.     MVI    B,9    ; UP TO 9 CHARS
  614.     XCHG        ; CURRENT PTR IN DE
  615.     LHLD    DIRNAME    ; PT TO TARGET NAME
  616. SCANL:
  617.     LDAX    D    ; GET CHAR
  618.     ORA    A    ; END OF STRING?
  619.     JZ    SCANL2
  620.     MOV    C,A    ; SAVE IN C
  621.     MOV    A,M    ; GET TARGET NAME CHAR
  622.     CALL    CAPS    ; CAPITALIZE IT
  623.     CMP    C    ; COMPARE
  624.     JNZ    SCANL1    ; ABORT IF NO MATCH
  625.     CALL    DELCK    ; END OF TARGET NAME?
  626.     JZ    SCANL1    ; ABORT IF SO
  627.     INX    H    ; PT TO NEXT
  628.     INX    D
  629.     DCR    B    ; COUNT DOWN
  630.     JNZ    SCANL
  631. ;  NOT FOUND RETURN
  632. SCANL1:
  633.     LHLD    CURNAME    ; PT TO CURRENT ENTRY
  634.     LXI    B,11    ; SKIP 11 BYTES
  635.     DAD    B    ; PT TO NEXT ENTRY
  636.     POP    B    ; RESTORE BC
  637.     MVI    A,0FFH    ; NOT FOUND FLAG
  638.     ORA    A    ; SET FLAGS
  639.     RET
  640. ;  FOUND RETURN
  641. SCANL2:
  642.     CALL    DELCK    ; MUST PT TO DELIMITER IF MATCH
  643.     JNZ    SCANL1    ; ABORT IF NOT
  644.     LHLD    CURNAME    ; PT TO FOUND ENTRY
  645.     POP    B    ; RESTORE BC
  646.     XRA    A    ; FOUND
  647.     RET    
  648.  
  649. ;
  650. ;  GET NAME FROM FILE 3 INTO BUFFER PTED TO BY HL
  651. ;    DO NOT AFFECT BC OR HL; RET W/NZ IF ERROR
  652. ;
  653. GETNAME:
  654.     PUSH    B    ; SAVE BC
  655.     PUSH    H    ; SAVE HL
  656.     CALL    F3$GET    ; GET DISK LETTER
  657.     JNZ    GNERR    ; ERROR?
  658.     SUI    'A'    ; CONVERT TO NUMBER
  659.     MOV    M,A    ; STORE IT
  660.     INX    H    ; PT TO NEXT
  661.     MVI    B,10    ; GET USER AND DIRECTORY NAME
  662. GETN1:
  663.     CALL    F3$GET    ; GET BYTE
  664.     JNZ    GNERR    ; ERROR?
  665.     MOV    M,A    ; STORE IT
  666.     INX    H    ; PT TO NEXT
  667.     DCR    B    ; COUNT DOWN
  668.     JNZ    GETN1
  669.     XRA    A    ; OK
  670. GNERR:
  671.     POP    H    ; RESTORE HL
  672.     POP    B    ; RESTORE BC
  673.     RET
  674.  
  675. ;
  676. ;  CHECK CHAR PTED TO BY HL FOR A DELIMITER
  677. ;    RET WITH Z FLAG SET IF DELIMITER
  678. ;
  679. DELCK:
  680.     MOV    A,M    ; GET CHAR
  681.     CALL    CAPS    ; CAPITALIZE
  682.     ORA    A    ; 0=DELIM
  683.     RZ
  684.     CPI    ' '+1    ; <SP>+1
  685.     JC    DELCK1    ; <SP> OR LESS
  686.     CPI    '='
  687.     RZ
  688.     CPI    5FH    ; UNDERSCORE
  689.     RZ
  690.     CPI    '.'
  691.     RZ
  692.     CPI    ':'
  693.     RZ
  694.     CPI    ';'
  695.     RZ
  696.     CPI    ','
  697.     RZ
  698.     CPI    '<'
  699.     RZ
  700.     CPI    '>'
  701.     RET
  702. DELCK1:
  703.     CMP    M    ; COMPARE WITH SELF FOR OK
  704.     RET
  705.  
  706. ;
  707. ;  PUTUD -- SAVE CURRENT USER/DISK FOR LATER RESTORE
  708. ;    NO REGS AFFECTED
  709. ;
  710. PUTUD:
  711.     PUSH    B    ; SAVE REGS
  712.     PUSH    PSW
  713.     PUSH    D
  714.     PUSH    H
  715.     MVI    C,25    ; GET CURRENT DISK
  716.     CALL    BDOS
  717.     STA    CDISK    ; SET CURRENT DISK
  718.     MVI    E,0FFH    ; GET USER
  719.     MVI    C,32    ; GET CURRENT USER
  720.     CALL    BDOS
  721.     STA    CUSER    ; SET CURRENT USER
  722.     POP    H    ; RESTORE REGS
  723.     POP    D
  724.     POP    PSW
  725.     POP    B
  726.     RET
  727.  
  728. ;
  729. ;  BUFFERS
  730. ;
  731. CDISK:
  732.     DS    1    ; CURRENT DISK
  733. CUSER:
  734.     DS    1    ; CURRENT USER
  735.  
  736. ;
  737. ;  GETUD -- RESTORE USER/DISK FROM PREVIOUS PUTUD
  738. ;
  739. GETUD:
  740.     PUSH    H    ; SAVE REGS
  741.     PUSH    D
  742.     PUSH    B
  743.     PUSH    PSW
  744.     LDA    CDISK    ; SELECT DISK
  745.     MOV    E,A
  746.     MVI    C,14    ; SELECT
  747.     CALL    BDOS
  748.     LDA    CUSER    ; SELECT USER
  749.     MOV    E,A
  750.     MVI    C,32    ; SELECT
  751.     CALL    BDOS
  752. DONE:
  753.     POP    PSW    ; GET REGS
  754.     POP    B
  755.     POP    D
  756.     POP    H
  757.     RET
  758.  
  759. ;
  760. ;  LOGUD -- LOG IN USER/DISK, WHICH C=USER AND B=DISK
  761. ;
  762. LOGUD:
  763.     PUSH    H    ; SAVE REGS
  764.     PUSH    D
  765.     PUSH    B
  766.     PUSH    PSW
  767.     MOV    E,C    ; SELECT USER
  768.     MVI    C,32
  769.     CALL    BDOS
  770.     MOV    E,B    ; SELECT DISK
  771.     MVI    C,14
  772.     CALL    BDOS
  773.     JMP    DONE
  774.  
  775.  
  776.     END
  777.