home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol098 / sfname.mac < prev    next >
Text File  |  1984-04-29  |  5KB  |  246 lines

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