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 / SYSLIB / SLIB2.LBR / SFNAME.Z80 < prev    next >
Text File  |  2000-06-30  |  5KB  |  246 lines

  1. ;
  2. ; SYSLIB Module Name:  SFNAME
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    fname
  8.  
  9. ;
  10. ;  FNAME is a file name scanner.  Pointing to the first character
  11. ;    of a file name specification of the form 'du:filename.typ', where
  12. ;    any part of this specification is optional, this routine fills in
  13. ;    an FCB with zeros, properly initializes the FN and FT (File Name and
  14. ;    File Type) fields if 'filename.typ' or any part thereof is present,
  15. ;    and returns the value of d and u if they are specified (or FFH if they
  16. ;    are not).
  17. ;
  18.  
  19. ;
  20. ;  EXTERNALS
  21. ;
  22.     EXT    CAPS    ; CAPITALIZE ROUTINE
  23.  
  24. ;
  25. ;  BASIC EQUATES
  26. ;
  27. MAXDISK    EQU    16    ; MAX NUMBER OF DISKS
  28. MAXUSER    EQU    31    ; MAX USER NUMBER
  29. CPM    EQU    0    ; CP/M ENTRY
  30. CR    EQU    0DH
  31. LF    EQU    0AH
  32.  
  33. ;
  34. ;  MAIN MODULE
  35. ;    ON ENTRY, DE PTS TO FCB TO BE FILLED AND HL PTS TO FIRST BYTE OF
  36. ;        TARGET STRING; FCB IS 36 BYTES LONG
  37. ;    ON EXIT, B=DISK NUMBER (1 FOR A, ETC) AND C=USER NUMBER
  38. ;        HL PTS TO TERMINATING CHAR
  39. ;        A=0 AND Z SET IF ERROR IN DISK OR USER NUMBERS, A=0FFH AND NZ
  40. ;            IF OK
  41. ;
  42. FNAME:
  43.     PUSH    DE    ; SAVE DE
  44.     LD    A,0FFH    ; SET DEFAULT DISK AND USER
  45.     LD    (DISK),A
  46.     LD    (USER),A
  47.     LD    B,36    ; INIT FCB
  48.     PUSH    DE    ; SAVE PTR
  49.     XOR    A    ; A=0
  50. FNINI:
  51.     LD    (DE),A    ; STORE ZERO
  52.     INC    DE    ; PT TO NEXT
  53.     DEC    B    ; COUNT DOWN
  54.     JP    NZ,FNINI
  55.     POP    DE    ; GET PTR BACK
  56. ;
  57. ;  SCAN FOR COLON IN STRING
  58. ;
  59.     PUSH    HL    ; SAVE PTR
  60. COLON:
  61.     LD    A,(HL)    ; SCAN FOR COLON OR SPACE
  62.     INC    HL    ; PT TO NEXT
  63.     CP    ':'    ; COLON FOUND?
  64.     JP    Z,COLON1
  65.     CP    ','    ; COMMA FOUND?
  66.     JP    Z,GETF1
  67.     CP    ' '+1    ; DELIM?
  68.     JP    C,GETF1
  69.     JP    COLON    ; CONTINUE IF NOT END OF LINE
  70. COLON1:
  71.     POP    HL    ; CLEAR STACK
  72.     LD    A,(HL)    ; SAVE POSSIBLE DRIVE SPEC
  73.     CALL    CAPS    ; CAPITALIZE
  74.     CP    'A'    ; DIGIT IF LESS THAN 'A'
  75.     JP    C,USERCK    ; PROCESS USER NUMBER
  76.     SUB    'A'    ; CONVERT TO 0-15
  77.     CP    MAXDISK    ; WITHIN BOUNDS?
  78.     JP    C,SVDISK
  79. ERREXIT:
  80.     XOR    A    ; ERROR INDICATOR
  81.     POP    DE    ; RESTORE DE
  82.     RET
  83.  
  84. ;  LOG IN SPECIFIED DISK
  85. SVDISK:
  86.     INC    A    ; ADJUST TO 1 FOR A
  87.     LD    (DISK),A    ; SAVE FLAG
  88.     INC    HL    ; PT TO NEXT CHAR
  89.  
  90. ;  CHECK FOR USER
  91. USERCK:
  92.     LD    A,(HL)    ; GET POSSIBLE USER NUMBER
  93.     CP    ':'    ; NO USER NUMBER
  94.     JP    Z,GETFILE
  95.     CP    '?'    ; ALL USER NUMBERS?
  96.     JP    NZ,USERC1
  97.     LD    (USER),A    ; SET VALUE
  98.     INC    HL    ; PT TO AFTER
  99.     LD    A,(HL)    ; MUST BE COLON
  100.     CP    ':'
  101.     JP    Z,GETFILE
  102.     JP    ERREXIT    ; FATAL ERROR IF NOT COLON AFTER ?
  103. USERC1:
  104.     XOR    A    ; ZERO USER NUMBER
  105.     LD    B,A    ; B=ACCUMULATOR FOR USER NUMBER
  106. USRLOOP:
  107.     LD    A,(HL)    ; GET DIGIT
  108.     INC    HL    ; PT TO NEXT
  109.     CP    ':'    ; DONE?
  110.     JP    Z,USRDN
  111.     SUB    '0'    ; CONVERT TO BINARY
  112.     JP    C,ERREXIT    ; USER NUMBER ERROR?
  113.     CP    10
  114.     JP    NC,ERREXIT
  115.     LD    C,A    ; NEXT DIGIT IN C
  116.     LD    A,B    ; OLD NUMBER IN A
  117.     ADD    A,A    ; *2
  118.     ADD    A,A    ; *4
  119.     ADD    A,B    ; *5
  120.     ADD    A,A    ; *10
  121.     ADD    A,C    ; *10+NEW DIGIT
  122.     LD    B,A    ; RESULT IN B
  123.     JP    USRLOOP
  124. USRDN:
  125.     LD    A,B    ; GET NEW USER NUMBER
  126.     CP    MAXUSER+1    ; WITHIN RANGE?
  127.     JP    NC,ERREXIT
  128.     LD    (USER),A    ; SAVE IN FLAG
  129.     JP    GETFILE
  130.  
  131. ;  EXTRACT FILE NAME
  132. GETF1:
  133.     POP    HL    ; GET PTR TO BYTE
  134. GETFILE:
  135.     LD    A,(HL)    ; PTING TO COLON?
  136.     CP    ':'
  137.     JP    NZ,GFILE1
  138.     INC    HL    ; SKIP OVER COLON
  139. GFILE1:
  140.     LD    A,(HL)    ; GET NEXT CHAR
  141.     CP    ','    ; DELIM?
  142.     JP    Z,GFQUES
  143.     CP    ' '+1    ; NOT A DELIMITER?
  144.     JP    NC,GFILE2
  145. GFQUES:
  146.     INC    DE    ; FILL WITH '?'
  147.     LD    B,11    ; 11 BYTES
  148.     LD    A,'?'
  149. GFFILL:
  150.     LD    (DE),A    ; PUT ?
  151.     INC    DE    ; PT TO NEXT
  152.     DEC    B    ; COUNT DOWN
  153.     JP    NZ,GFFILL
  154. FNDONE:
  155.     LD    A,(DISK)    ; GET DISK NUMBER
  156.     LD    B,A    ; ... IN B
  157.     LD    A,(USER)    ; GET USER NUMBER
  158.     LD    C,A    ; ... IN C
  159.     POP    DE    ; RESTORE REGS
  160.     LD    A,0FFH    ; NO ERROR
  161.     OR    A    ; SET FLAGS
  162.     RET
  163. ;  GET FILE NAME FIELDS
  164. GFILE2:
  165.     LD    B,8    ; AT MOST 8 BYTES FOR FN
  166.     CALL    SCANF    ; SCAN AND FILL
  167.     LD    B,3    ; AT MOST 3 BYTES FOR FT
  168.     LD    A,(HL)    ; GET DELIMITER
  169.     CP    '.'    ; FN ENDING IN '.'?
  170.     JP    NZ,GFILE3
  171.     INC    HL    ; PT TO CHAR AFTER '.'
  172.     CALL    SCANF    ; SCAN AND FILL
  173.     JP    FNDONE    ; DONE ... RETURN ARGS
  174. GFILE3:
  175.     CALL    SCANF4    ; FILL WITH <SP>
  176.     JP    FNDONE
  177. ;
  178. ;  SCANNER ROUTINE
  179. ;
  180. SCANF:
  181.     CALL    DELCK    ; CHECK FOR DELIMITER
  182.     JP    Z,SCANF4    ; <SP> FILL IF FOUND
  183.     INC    DE    ; PT TO NEXT BYTE IN FN
  184.     CP    '*'    ; ? FILL?
  185.     JP    NZ,SCANF1
  186.     LD    A,'?'    ; PLACE '?'
  187.     LD    (DE),A
  188.     JP    SCANF2
  189. SCANF1:
  190.     LD    (DE),A    ; PLACE CHAR
  191.     INC    HL    ; PT TO NEXT POSITION
  192. SCANF2:
  193.     DEC    B    ; COUNT DOWN
  194.     JP    NZ,SCANF    ; CONTINUE LOOP
  195. SCANF3:
  196.     CALL    DELCK    ; "B" CHARS OR MORE - SKIP TO DELIMITER
  197.     RET    Z
  198.     INC    HL    ; PT TO NEXT
  199.     JP    SCANF3
  200. SCANF4:
  201.     INC    DE    ; PT TO NEXT FN OR FT
  202.     LD    A,' '    ; <SP> FILL
  203.     LD    (DE),A
  204.     DEC    B    ; COUNT DOWN
  205.     JP    NZ,SCANF4
  206.     RET
  207.  
  208. ;
  209. ;  BUFFERS
  210. ;
  211. DISK:    DS    1    ; DISK NUMBER
  212. USER:    DS    1    ; USER NUMBER
  213.  
  214. ;
  215. ;  CHECK CHAR PTED TO BY HL FOR A DELIMITER
  216. ;    RET WITH Z FLAG SET IF DELIMITER
  217. ;
  218. DELCK:
  219.     LD    A,(HL)    ; GET CHAR
  220.     CALL    CAPS    ; CAPITALIZE
  221.     OR    A    ; 0=DELIM
  222.     RET    Z
  223.     CP    ' '+1    ; <SP>+1
  224.     JP    C,DELCK1    ; <SP> OR LESS
  225.     CP    '='
  226.     RET    Z
  227.     CP    5FH    ; UNDERSCORE
  228.     RET    Z
  229.     CP    '.'
  230.     RET    Z
  231.     CP    ':'
  232.     RET    Z
  233.     CP    ';'
  234.     RET    Z
  235.     CP    ','
  236.     RET    Z
  237.     CP    '<'
  238.     RET    Z
  239.     CP    '>'
  240.     RET
  241. DELCK1:
  242.     CP    (HL)    ; COMPARE WITH SELF FOR OK
  243.     RET
  244.  
  245.     END
  246.