home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / PASCALZ4.ZIP / D3 / FILNAM.SRC < prev    next >
Text File  |  1999-04-05  |  4KB  |  178 lines

  1. ;DECODES A STRING FROM THE TEXT BUFFER AS A FILE SPECIFICATION
  2. ;
  3.     NAME FILNAM
  4.     ENTRY .FILNAM
  5.     EXT .TIN,.NAMERR,.TXTYP,.POPHDB,.PUSHBD
  6.     INCLUDE DEFLT.SRC
  7. ;
  8. ;
  9. ;IT STORES THE CORRESPONDING CP/M FILE CONTROL BLOCK (FCB) IN A 34 BYTE
  10. ;BLOCK STAR.TING AT HL.  THE 34TH BYTE IS THE DRIVE NUMBER AND IS NOT
  11. ;LOOKED AT BY CP/M (IT IS LOOKED AT BY SELDSK).
  12. .FILNAM    CALL    .PUSHBD        ;SAVE ALL REGISTERS EXCEPT A
  13.     PUSH    PSW
  14.     MVI    M,0        ; MAKE FIRST BYTE OF FCB ZERO.
  15.     DCX    H
  16.     DCX    H
  17.     DCX    H        ; FILE BUFFER ADDRESS
  18.     MVI    M,0        ; SET ALL FLAGS TO ZERO
  19.     LXI    B,4
  20.     DAD    B
  21.     PUSH    H        ; HL POINTS TO START OF FCB NAME FIELD.
  22. ;FILL THE NAME FIELD WITH SPACES (THE DEFAULT CHARACTER).
  23.     MVI    B,11        ; 8 CHARACTERS FOR FILE NAME + 3 FOR FILE TYPE.
  24. DEFSP    MVI    M,' '        ; STUFF A SPACE.
  25.     INX    H
  26.     DJNZ    DEFSP
  27.  
  28. ;MAKE THE REST OF THE FCB ZERO.
  29.     MVI    B,DEVNUM-11-1    ;NUMBER OF BYTES TO ZERO.
  30. ZEROLP    MVI    M,0
  31.     INX    H
  32.     DJNZ    ZEROLP
  33.  
  34. SKIPSP    CALL    FTIN        ; GET A CHARACTER FROM THE TEXT BUFFER.
  35.     JRZ    SKIPSP        ; IGNORE SPACES.
  36.     JRC    FILNER        ; Error if no characters in buffer.
  37. ; CHECK FOR LST: OR CON:
  38.     PUSH    PSW        ; SAVE CHAR.
  39.     PUSH    H
  40.     LHLD    6        ; HL POINTS TO TOP OF MEMORY
  41.     LXI    D,-GETP
  42.     DAD    D        ; TEXT-IN POINTER
  43.     XRA    A
  44.     MOV    B,A
  45.     MOV    D,A
  46.     MOV    E,M        ;LOCATION OF FIRST CHAR
  47.     DAD    D
  48. NXTCHR:    INR    B        ;CHAR COUNTER
  49.     MOV    A,M        ;GET CHAR
  50.     CPI    CR        ;IS IT A CARRIAGE RETURN
  51.     INX    H        ;NEXT POSITION
  52.     JRNZ    NXTCHR        ;NOT A CR
  53.     MVI    A,3
  54.     CMP    B        ;IS LENGTH 3 OR LESS
  55.     JRNC    NOTCL1        ;TOO SHORT TO BE CON: OR LST:
  56.     LHLD    6
  57.     LXI    D,-GETP
  58.     DAD    D        ;LENGTH >=4 - IS IT CON: OR LST:
  59.     MVI    A,3
  60.     ADD    M
  61.     MOV    E,A
  62.     MVI    D,0
  63.     DAD    D        ; FOURTH CHAR OF FILE NAME
  64.     MOV    A,M
  65.     CPI    ':'        ; IS IT A ':'
  66.     POP    H
  67.     JRZ    LSTCON        ; YES, CHECK FOR LST: OR CON:
  68. ; CHECK FOR SPECIFIED DRIVE
  69. NOTCL:    POP    PSW        ; GET CHAR.
  70.     SUI    'A'        ; A..P ===> 0..15
  71.     MOV    B,A
  72.     PUSH    H        ; SAVE 34th BYTE
  73.     LHLD    6
  74.     LXI    D,-GETP
  75.     DAD    D        ; TEXT_IN_POINTER
  76.     MVI    A,1
  77.     ADD    M
  78.     MOV    E,A
  79.     MVI    D,0
  80.     DAD    D        ; LOOK AT NEXT CHARACTER
  81.     MOV    A,M
  82.     CPI    CR        ; IS IT A CARRIAGE RETURN?
  83.     JRNZ    DLET        ; NO
  84.     MVI    A,' '        ; FILENAME IS 1 CHAR, ADD A SPACE
  85. DLET:    POP    H        ; 34th BYTE OF FCB
  86.     CPI    ':'        ; IS A DRIVE SPECIFIED?
  87.     JRZ    DRVSP
  88.     PUSH    H
  89.     LHLD    6        ; HL POINTS TO TOP OF MEMORY.
  90.     LXI    D,-GETP
  91.     DAD    D        ; HL POINTS TO TEXT IN POINTER.
  92.     DCR    M        ; PUSH IT BACK 1 CHARACTER.
  93.  
  94.     LHLD    6
  95.     DCX    H        ; HL POINTS TO DEFAULT DRIVE #.
  96.     MOV    A,M
  97.     POP    H
  98.     JR    DRVNSP        ; Drive not specified
  99. NOTCL1:    POP    H
  100.     JR    NOTCL
  101.  
  102. ;CHARACTER IN A SHOULD BE THE DRIVE LETTER.
  103. DRVSP:    CALL    FTIN        ; read past the :
  104.     MOV    A,B        ; DRIVE LETTER ===> A
  105. DRVNSP:    CPI    MAXDRV        ; IS IT A VALID DRIVE NUMBER?
  106.     JRC    DRVOK
  107. ;RETURN AN ERROR CODE.
  108. FILNER    POP    H        ; CLEAN UP THE STACK.
  109. NAMER    LXI    H,.NAMERR
  110.     CALL    .TXTYP        ; 'Bad filename'
  111.     POP    PSW
  112.     STC
  113.     JMP    .POPHDB
  114.  
  115. LSTCON:    POP    PSW        ; GET CHAR.
  116.     CPI    'L'         ; CHECKING FOR LST:
  117.     JRZ    LST1
  118.     CPI    'C'        ; CHECKING FOR CON:
  119.     JRNZ    NAMER        ; NEITHER, BAD FILE NAME
  120.     CALL     FTIN
  121.     CPI    'O'        ; SECOND LETTER OF CON:
  122.     JRNZ    NAMER        ; NO, BAD FILE NAME
  123.     CALL     FTIN
  124.     CPI    'N'        ; THIRD LETTER OF CON:
  125.     JRNZ    NAMER
  126.     POP    H        ; CON:!
  127.     LXI    B,-4
  128.     DAD    B        ; FBA
  129.     BSET    7,M        ; SET FLAG FOR CONSOLE FILE
  130.     JR    LST2
  131. LST1:    CALL    FTIN
  132.     CPI    'S'        ; SECOND LETTER OF LST:
  133.     JRNZ    NAMER
  134.     CALL     FTIN
  135.     CPI    'T'        ; THIRD LETTER
  136.     JRNZ    NAMER
  137.     POP     H
  138.     LXI    B,-4
  139.     DAD    B        ; FBA
  140.     BSET    6,M        ; SET FLAG FOR LIS.TING DEVICE
  141. LST2:    CALL     FTIN        ; READ THE ':'
  142.  
  143. NOMORE:    POP    PSW
  144.     ORA    A
  145.     JMP    .POPHDB
  146.  
  147. DRVOK    MOV    M,A        ; STORE DRIVE NUMBER IN 34TH BYTE OF FCB
  148.     POP    H        ; START OF FCB NAME FIELD
  149.     MVI    B,9        ; LIMIT + 1 TO # OF CHARS IN FILE NAME.
  150. SKSP    CALL    FTIN
  151.     JRC    NOMORE        ; Branch if the text in buffer is empty.
  152.     JRZ    SKSP        ; Skip spaces.
  153.     CPI    '.'
  154.     JRZ    NXTPT        ; Branch if we have reached the type field.
  155.     MOV    M,A        ; STORE THE CHARACTER IN THE FCB.
  156.     INX    H        ; INCREMENT THE FCB POINTER.
  157.     DJNZ    SKSP
  158.     JMPR    NAMER        ;TOO MANY CHARACTERS IN A FIELD.
  159.  
  160. NXTPT    MOV    C,B
  161.     MVI    B,4        ; LIMIT +1 OF # OF CHARS IN FILE TYPE.
  162. NOIMAG    DCR    C
  163.     JRZ    SKSP
  164.     INX    H
  165.     JMPR    NOIMAG
  166.  
  167. ;
  168. ; FTIN -- FILE .TIN, CONVERTS ALL LETTERS TO UPPER CASE
  169. FTIN:    CALL    .TIN
  170.     CPI    'a'        ; is it >= 'a'
  171.     JRC    FTIN1        ; YES,
  172.     CPI    'z'+1        ; IS IT <= 'z'
  173.     JRNC    FTIN1        ; YES,
  174.     ANI    5FH        ; THEN CONVERT TO UPPER CASE
  175. FTIN1:    CPI    ' '        ; COMPARE TO A SPACE
  176.     RET            ; AND RETURN
  177. ;
  178.