home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol084 / findp.asm < prev    next >
Assembly Source File  |  1984-04-29  |  13KB  |  669 lines

  1. ;FIND.ASM 
  2. ;
  3. ;03/Aug/82 ADDED DETECT OF CONTROL X TO SKIP TO NEXT FILE
  4. ;       AFTER DISASSEMBLING A VERSION OF FIND DATED
  5. ;       8/Nov/80 (FOR WHICH I DIDN'T HAVE THE SOURCE)
  6. ;       AND FINDING THAT FEATURE IMPLEMENTED. Bill Bolton
  7. ;
  8. ;01/Aug/82 DOING "FIND *.* [any garbage string]" ON AN RCPM
  9. ;       SYSTEM WOULD GIVE A DIRECTORY OF ALL FILES ON THE
  10. ;       DISK, INCLUDING TAGGED AND SYSTEM FILES WHICH MAY
  11. ;       HAVE BEEN INTENDED TO BE "INVISIBLE". ADDED FILE
  12. ;       TYPE AND ATTRIBUTE CHECKING FROM "DISPLAY" TO
  13. ;       PREVENT THIS HAPPENING. FILES WITH TYPE "ALL" 
  14. ;       (WHICH I USE FOR CATALOGUES) WILL BE SCANNED NO
  15. ;       MATTER WHAT ATTRIBUTES ARE SET. THIS ALLOWS THE
  16. ;       CATALOGUES TO BE "FIND"ed AND "DISPLAY"ed BUT NOT
  17. ;       "TYPE"ed OR "XMODEM"ed. IMPLEMENTED FOR CONDITIONAL
  18. ;       ASSEMBLY. ALSO CHANGED ABORT TO ONLY RESPOND TO
  19. ;       CONTROL-C OR CONTROL-K TO ELIMINATE PROBLEMS ON
  20. ;       REMOTE SYSTEMS WITH SUPRIOUS CHARACTERS OFF THE LINE
  21. ;       PREMATURELY ABORTING A "FIND". CHANGED THE ABORT CHECK
  22. ;       TO DIRECT CONSOLE INPUT (BDOS 6) SO THE A CP/M VERSION
  23. ;       NUMBER CHECK WAS ADDED. Bill Bolton
  24. ;    
  25. ;18/Mar/80 MAKE "_" MATCH A TAB; MAKE "|" AN "OR"
  26. ;       AS IN: FIND B:*.ASM _IN_|_OUT_
  27. ;
  28. ;27/Feb/80 TRANSLATE FILE READ CHARS TO UPPER CASE
  29. ;       SO CASE DOESN'T MATTER IN FILE CONTENTS.
  30. ;       ALSO PUT IN "JUST IN CASE" TEST FOR LINE
  31. ;       LONGER THAN 128.
  32. ;
  33. ;27/Jan/80 PUT IN CTL-C BREAK
  34. ;
  35. ;23/Jun/79 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  36. ;    ----------------
  37. ;USED TO DO A CHARACTER STRING SEARCH
  38. ;OF ONE OR MORE FILES.  ANY ASCII STRING
  39. ;MAY BE SEARCHED FOR.  CASE DOESN'T MATTER.
  40. ;
  41. ;COMMAND FORMAT:
  42. ;
  43. ;    FIND FILENAME STRING
  44. ;
  45. ;FILENAME MAY BE AMBIGUOUS, 
  46. ;    E.G. *.ASM OR CBBS*.ASM
  47. ;
  48. ;"_" IN STRING WILL MATCH A TAB.
  49. ;
  50. CR    EQU    0DH
  51. LF    EQU    0AH
  52. EOF    EQU    1AH
  53. CNTRLC    EQU    3
  54. TAB    EQU    9
  55. CNTRLK    EQU    11
  56. CNTRLS    EQU    19
  57. CNTRLX    EQU    24
  58. ;
  59. FALSE    EQU    0
  60. TRUE    EQU    NOT FALSE
  61. ;
  62. RCPM    EQU    TRUE    ;True for restricted filetype search
  63. ;
  64. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  65. CF    SET    0    ;SHOW COMP NOT REQUESTED
  66. ;
  67. ;(FROM EQU8.LIB...)
  68. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  69. ;
  70. ;DEFINE DATA MOVE MACRO: MOVE from,to,length
  71. ;    from may be addr, or quoted string
  72. ;
  73. MOVE    MACRO    ?F,?T,?L
  74.     IF    NOT NUL ?F
  75.     IRPC    ?C,?F
  76. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  77.     EXITM
  78.     ENDM
  79.     IF    ?Q EQ ''''
  80.     LOCAL    ?B,?Z
  81.     CALL    ?Z
  82. ?B    DB    ?F
  83. ?Z    POP    H    ;GET FROM
  84.     LXI    B,?Z-?B    ;GET LEN
  85.     ELSE
  86.     LXI    H,?F
  87.     ENDIF
  88.     ENDIF
  89.     IF    NOT NUL ?T
  90.     LXI    D,?T
  91.     ENDIF
  92.     IF    NOT NUL ?L
  93.     LXI    B,?L
  94.     ENDIF
  95.     CALL    MOVER
  96. MF    SET    -1    ;;SHOW EXPANSION
  97.     ENDM
  98. ;COMPARE MACRO
  99. COMP    MACRO    ?F,?T,?L
  100.     IF    NOT NUL ?F
  101.     IRPC    ?C,?F
  102. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  103.     EXITM
  104.     ENDM
  105.     IF    ?Q EQ ''''
  106.     LOCAL    ?B,?Z
  107.     CALL    ?Z
  108. ?B    DB    ?F
  109. ?Z    POP    H    ;GET FROM
  110.     LXI    B,?Z-?B    ;GET LEN
  111.     ELSE
  112.     LXI    H,?F
  113.     ENDIF
  114.     ENDIF
  115.     IF    NOT NUL ?T
  116.     LXI    D,?T
  117.     ENDIF
  118.     IF    NOT NUL ?L
  119.     LXI    B,?L
  120.     ENDIF
  121.     IF    NOT NUL ?I
  122.     LOCAL    ?B,?Z
  123.     CALL    ?Z
  124. ?B    DB    ?I
  125. ?Z    POP    D    ;GET TO
  126.     LXI    B,?Z-?B
  127.     ENDIF
  128.     CALL    COMPR
  129. CF    SET    -1    ;;SHOW EXPANSION
  130.     ENDM
  131. ;
  132. ;DEFINE CP/M MACRO - CPM FNC,PARM
  133. ;
  134. CPM    MACRO    ?F,?P
  135.     PUSH    B
  136.     PUSH    D
  137.     PUSH    H
  138.     IF    NOT NUL ?F
  139.     MVI    C,?F
  140.     ENDIF
  141.     IF    NOT NUL ?P
  142.     LXI    D,?P
  143.     ENDIF
  144.     CALL    BDOS
  145.     POP    H
  146.     POP    D
  147.     POP    B
  148.     ENDM
  149. ;
  150.     ORG    100H
  151.     CALL    START
  152.     DB    'FIND.COM '
  153.     DB    '03/Aug/82'
  154.     DB    0DH,0AH,'$'
  155. START    POP    D    ;GET ID
  156.     MVI    C,PRINT
  157.     CALL    BDOS    ;PRINT ID
  158. ;
  159. ;INIT LOCAL STACK
  160. ;
  161.     LXI    H,0
  162.     DAD    SP
  163.     SHLD    STACK
  164.     LXI    SP,STACK
  165. ;
  166. ;START OF PROGRAM EXECUTION
  167. ;
  168.     CPM    VERSION
  169.     MOV    A,L    ;A <---- VERSION NUMBER
  170.     CPI    20H
  171.     JNC    CHECK$NAME
  172.     CALL    ERXIT
  173.     DB    '++ CP/M Version 2.0 or later is required to run FIND$'
  174. ;
  175. CHECK$NAME:
  176.     LDA    FCB+1
  177.     CPI    ' '
  178.     JNZ    GETSTR
  179.     CALL    ERXIT
  180.     DB    '++NO FILE NAME++$'
  181. ;
  182. ;FIND START OF STRING IN TBUFF
  183. ;
  184. GETSTR    LXI    D,80H    ;DE=TBUFF
  185.     LDAX    D    ;LENGTH
  186.     MOV    C,A    ;SAVE LENGTH
  187.     MVI    B,0    ;SETUP BC FOR MOVE
  188.     INX    D    ;PAST LENGTH
  189.     MOV    L,A    ;L=LENGTH
  190.     MVI    H,0    ;HL=LENGTH
  191.     DAD    D    ;HL=LAST CHAR
  192.     MVI    M,0    ;STORE END DELIM
  193. ;
  194. ;SCAN FOR START OF STRING
  195. ;
  196.     XCHG        ;START TO HL
  197. SCAN    INX    H    ;TO NEXT CHAR
  198.     MOV    A,M    ;LOOK FOR ' '
  199.     ORA    A    ;END?
  200.     JZ    BADSTR    ;..YES, BAD
  201.     CPI    ' '
  202.     JNZ    SCAN    ;NOT AT ' '
  203.     INX    H    ;TO STRING
  204. ;
  205.     MOVE    ,STRING, ;HL = FROM, BC=LENGTH
  206. NEXTFL    CALL    MFNAME    ;GET NEXT
  207.     JC    EXIT
  208.     CPM    OPEN,FCB
  209.     INR    A
  210.     JZ    EXIT
  211.  
  212.     IF    RCPM
  213. ;
  214. ;Check for .ALL file, which can always be scanned
  215. ;
  216. ALLCHK:
  217.     LDA    FCB+11    
  218.     CPI    'L'        ;WAS LAST CHAR AN 'L'?
  219.     JNZ    CKFIL        ;IF NOT, TRY NEXT TEST
  220.     LDA    FCB+10        ;CHK NEXT
  221.     ANI    07FH        ;Forget attributes for this test
  222.     CPI    'L'        ;AN 'L'?
  223.     JNZ    CKFIL        ;IF NOT, TRY NEXT TEST
  224.     LDA    FCB+9        ;WAS 'L', CHK NEXT CHAR
  225.     ANI    07FH        ;Forget attributes for this test
  226.     CPI    'A'        ; 'A' AS IN '.ALL'?
  227.     JZ    OK$SCAN        ;YES, GO SCAN IT
  228. ;
  229. ;Check for file protected by CP/M 2.x f2' attribute
  230. ;
  231. CKFIL:    LDA    FCB+2        ;POINT TO TAG FILE ATTR
  232.     ANI    80H        ;IS IT TAGGED?
  233.     JZ    CKFIL2        ;IF NOT, CONTINUE
  234. ;
  235. PROXIT:
  236.     JMP    NEXTFL        ;SEE IF ANOTHER
  237. ;
  238. CKFIL2:    LDA    FCB+10        ;POINT TO SYS FILE ATTR
  239.     ANI    80H        ;IS IT SYS?
  240.     JNZ    PROXIT        ;SYS file, can't print it
  241. ;
  242. ;Check for .COM file, which can't be scanned
  243. ;
  244.     LDA    FCB+11
  245.     CPI    'M'        ;WAS LAST CHAR AN 'M'?
  246.     JNZ    OBJCHK        ;IF NOT, CHK FOR '.OBJ' TYPE
  247.     LDA    FCB+10
  248.     ANI    7FH        ;STRIP CP/M 2.x ATTR
  249.     CPI    'O'        ;AN 'O'?
  250.     JNZ    OK$SCAN        ;IF NOT IT'S OK TO SCAN
  251.     LDA    FCB+9
  252.     ANI    7FH        ;STRIP CP/M 2.x ATTR
  253.     CPI    'C'        ;'C' AS IN '.COM'?
  254.     JNZ    OK$SCAN        ;IF NOT, IT'S OK TO SCAN
  255.     JMP    NEXTFL        ;MORE TO PRINT?
  256. ;
  257. ;Check for .OBJ file, which can't be scanned
  258. ;
  259. OBJCHK:
  260.     CPI    'J'        ;WAS LAST CHAR AN 'J' ?
  261.     JNZ    OK$SCAN        ;IF NOT, OK TO SCAN
  262.     LDA    FCB+10        ;MIGHT BE '.OBJ', CHK NEXT CHR
  263.     ANI    7FH        ;STRIP CP/M 2.x ATTR
  264.     CPI    'B'        ;IS IT A 'B'?
  265.     JNZ    OK$SCAN        ;IF NOT, SCAN
  266.     LDA    FCB+9        ;WAS, CHK FIRST CHAR
  267.     ANI    7FH        ;STRIP CP/M 2.x ATTR
  268.     CPI    'O'        ;'O' AS IN '.OBJ'?
  269.     JNZ    OK$SCAN        ;IF NOT, SCAN THE FILE, IF SO
  270.     JMP    NEXTFL        ;MORE TO SCAN?
  271.  
  272.     ENDIF    ;RCPM
  273. ;
  274. OK$SCAN:
  275.     MOVE    '   0',LINENO
  276.     MOVE    FCB+1,FNAME,8
  277.     MOVE    FCB+9,FNAME+9,3
  278.     CALL    ILPRT
  279.     DB    '----> FILE '
  280. FNAME    DB    'XXXXXXXX.XXX'
  281.     DB    CR,LF,0
  282.     LXI    H,0
  283.     SHLD    EFCBCT    ;ZERO COUNT
  284. ;
  285. ;BUMP ASCII LINE #
  286. ;
  287. NEXTLN    LXI    H,LINENO+3
  288. NEXTADD    MOV    A,M    ;GET DIGIT
  289.     ORI    '0'    ;MAKE ASCII
  290.     INR    A
  291.     MOV    M,A
  292.     CPI    '9'+1    ;CARRY?
  293.     JNZ    NEXTNC
  294.     MVI    M,'0'
  295.     DCX    H
  296.     JMP    NEXTADD
  297. ;
  298. NEXTNC    LXI    H,LINE
  299.     MVI    B,0FFH    ;SO LONG LINE WON'T BLOW
  300. NEXTLC    INR    B
  301.     JM    LONG    ;TOO LONG A LINE
  302.     PUSH    B
  303.     PUSH    H
  304.     LXI    H,EFCB
  305.     CALL    RDBYTE
  306.     POP    H
  307.     POP    B
  308.     MOV    M,A
  309.     INX    H
  310.     CPI    EOF
  311.     JZ    NEXTFL    ;NEXT FILE
  312.     CPI    LF
  313.     JNZ    NEXTLC
  314.     JMP    EOL
  315. ;
  316. ;GOT A LONG LINE - STICK CRLF IN MIDDLE
  317. ;
  318. LONG    MVI    M,0DH
  319.     INX    H
  320.     MVI    M,0AH
  321. EOL    CPM    DIRECT,0FFH    ;TEST FOR USER COMMAND
  322.     ORA    A
  323.     CNZ    CHREXIT        ;PARSE COMMAND
  324.     JC    NEXTFL
  325. ;
  326. ;READ IN A LINE, NOW SCAN FOR THE STRING
  327. ;
  328.     LXI    H,STRING
  329. ORLINE    SHLD    STRPTR
  330.     LXI    H,LINE
  331. NEXTST    XCHG
  332.     LHLD    STRPTR
  333.     XCHG
  334.     PUSH    H
  335. NEXTC    LDAX    D
  336.     CPI    '_'
  337.     JNZ    NOTAB
  338.     MVI    A,TAB
  339. NOTAB    INX    D
  340.     ORA    A    ;END OF STRING?
  341.     JZ    MATCHED
  342.     CPI    '|'
  343.     JZ    MATCHED    ;FIRST PART
  344.     MOV    C,M    ;FOR LOWER CASE TEST
  345.     CMP    M
  346.     INX    H
  347.     JZ    NEXTC
  348.     MOV    B,A    ;SAVE CHAR
  349.     MOV    A,C    ;GET CHAR
  350.     CPI    61H    ;LOWER?
  351.     JC    NOTEQ    ;NO, SO NO MATCH
  352.     CPI    7BH
  353.     JNC    NOTEQ
  354.     ANI    5FH    ;MAKE UPPER CASE
  355.     CMP    B
  356.     JZ    NEXTC    ;MATCHED
  357. NOTEQ    POP    H    ;RESTORE ADDR
  358.     INX    H
  359.     MOV    A,M
  360.     CPI    CR
  361.     JNZ    NEXTST
  362. ;
  363. ;IF AN "OR" (|) IS IN THE LINE, SCAN FOR IT
  364. ;
  365.     LHLD    STRPTR
  366. FINDOR    MOV    A,M
  367.     INX    H
  368.     CPI    '|'
  369.     JZ    ORLINE
  370.     ORA    A
  371.     JNZ    FINDOR
  372.     JMP    NEXTLN
  373. ;
  374. ;GOT MATCH, PRINT IT
  375. ;
  376. MATCHED    POP    H    ;KILL STACKED ADDR
  377.     CALL    ILPRT
  378. LINENO    DB    '    ',TAB,0
  379. ;
  380.     LXI    H,LINE
  381. MATCHLP    MOV    A,M
  382.     MOV    E,A
  383.     CPM    WRCON
  384.     MOV    A,M
  385.     INX    H
  386.     CPI    LF
  387.     JNZ    MATCHLP
  388.     JMP    NEXTLN
  389. ;
  390. ;INLINE PRINT - CALL ILPRT FOLLOWED BY MSG,
  391. ;WHICH ENDS IN A: 0
  392. ;
  393. ILPRT    XTHL        ;GET MSG ADDR, SAVE HL
  394. ILPLP    MOV    E,M
  395.     CPM    WRCON
  396.     INX    H
  397.     MOV    A,M
  398.     ORA    A    ;END?
  399.     JNZ    ILPLP
  400.     XTHL
  401.     RET
  402. ;
  403. BADSTR    CALL    ERXIT
  404.     DB    '++BAD STRING++$'
  405. ;
  406. ;FOLLOWING FROM 'EQU8.LIB'---->
  407. ;
  408. ;MOVE, COMPARE SUBROUTINES
  409. ;
  410.     IF    MF    ;MACRO EXPANSION FLAG SET?
  411. ;
  412. MOVER    MOV    A,M
  413.     STAX    D
  414.     INX    H
  415.     INX    D
  416.     DCX    B
  417.     MOV    A,B
  418.     ORA    C
  419.     JNZ    MOVER
  420.     RET
  421.     ENDIF
  422. ;
  423.     IF    CF    ;MACRO EXPANSION FLAG SET?
  424. COMPR    LDAX    D
  425.     CMP    M
  426.     RNZ
  427.     INX    D
  428.     INX    H
  429.     DCX    B
  430.     MOV    A,B
  431.     ORA    C
  432.     JNZ    COMPR
  433.     RET
  434.     ENDIF
  435. ;
  436. ;    FROM EQU8.LIB: AS OF 05/06/79
  437. ;
  438. ;RDBYTE, HL POINTS TO EXTENDED FCB:
  439. ;
  440. ;    2 BYTE BUFFER ADDR
  441. ;    2 BYTE "BYTES LEFT" (INIT TO 0)
  442. ;    1 BYTE BUFFER SIZE (IN PAGES)
  443. ;    2 BYTE FCB ADDRESS
  444. ;
  445. RDBYTE    MOV    E,M
  446.     INX    H
  447.     MOV    D,M    ;GET BUFFER ADDR
  448.     INX    H
  449.     MOV    C,M
  450.     INX    H
  451.     MOV    B,M    ;BC = BYTES LEFT
  452.     MOV    A,B    ;GET COUNT
  453.     ORA    C
  454.     JNZ    RDBNORD    ;NO READ
  455. ;
  456.     INX    H    ;TO BUFFER SIZE
  457.     MOV    A,M    ;GET COUNT
  458.     ADD    A    ;MULTIPLY BY 2
  459.     MOV    B,A    ;SECTOR COUNT IN B
  460.     INX    H    ;TO FCB
  461.     PUSH    H    ;SAVE FCB POINTER
  462.     MOV    A,M    ;GET..
  463.     INX    H    ;..FCB..
  464.     MOV    H,M    ;..ADDR..
  465.     MOV    L,A    ;..TO HL
  466. ;
  467. RDBLP    MVI    A,1AH    ;GET EOF CHAR
  468.     STAX    D    ;SAVE IN CASE EOF
  469.     PUSH    D    ;SAVE DMA ADDR
  470.     PUSH    H    ;SAVE FCB ADDR
  471.     CPM    STDMA    ;SET DMA ADDR
  472.     POP    D    ;GET FCB
  473.     CPM    READ
  474.     ORA    A
  475.     POP    H    ;HL=DMA, DE=FCB
  476.     JNZ    RDBRET    ;GOT EOF
  477.     MOV    A,L
  478.     ADI    80H    ;TO NEXT BUFF
  479.     MOV    L,A
  480.     MOV    A,H
  481.     ACI    0
  482.     MOV    H,A
  483.     XCHG        ;DMA TO DE, FCB TO HL
  484.     DCR    B    ;MORE SECTORS?
  485.     JNZ    RDBLP    ;YES, MORE
  486. RDBRET    POP    H    ;GET FCB POINTER
  487.     DCX    H    ;TO LENGTH
  488.     MOV    A,M    ;GET LENGTH
  489.     DCX    H    ;TO COUNT
  490.     MOV    M,A    ;SET PAGE COUNT
  491.     DCX    H    ;TO LO COUNT
  492.     DCX    H    ;TO HI FCB
  493.     DCX    H    ;TO EFCB START
  494.     JMP    RDBYTE    ;LOOP THRU AGAIN
  495. ;
  496. RDBNORD    INX    H    ;TO LENGTH
  497.     MOV    A,M    ;GET LENGTH (PAGES)
  498.     XCHG        ;BUFF TO HL
  499.     ADD    H
  500.     MOV    H,A    ;HL = END OF BUFF
  501.     MOV    A,L
  502.     SUB    C
  503.     MOV    L,A
  504.     MOV    A,H
  505.     SBB    B
  506.     MOV    H,A    ;HL = DATA POINTER
  507.     MOV    A,M    ;GET BYTE
  508.     XCHG        ;EFCB BACK TO HL
  509.     CPI    1AH    ;EOF?
  510.     RZ        ;YES, LEAVE POINTERS
  511.     DCX    B    ;DECR COUNT
  512.     DCX    H    ;BACK TO "BYTES LEFT"
  513.     MOV    M,B
  514.     DCX    H
  515.     MOV    M,C    ;STORE BACK COUNT
  516.     RET
  517. ;
  518. ;SAMPLE EFCB:
  519. ;
  520. ;EFCB    DW    BUFF    ;BUFFER ADDR
  521. ;    DW    0    ;BYTES LEFT
  522. ;    DB    20    ;BUFFER SIZE (IN PAGES)
  523. ;    DW    FCB    ;FCB ADDRESS
  524. ;
  525. ;    MUST BE ASSEMBLED BY "MAC"
  526. ;
  527. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  528. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  529. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  530. ;TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  531. ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  532. ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  533. ;MULTIPLE FILES.
  534. ;
  535. ;JUST CALL "MFNAME" (Multiple File NAME) AND THE FCB
  536. ;WILL BE SET UP WITH THE NEXT NAME, READY TO
  537. ;DO NORMAL PROCESSING (OPEN, READ, ETC.)
  538. ;
  539. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  540. ;
  541. ;------------------------------------------------
  542. ;
  543. ;    MULTI-FILE ACCESS SUBROUTINE
  544. ;
  545. ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  546. ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
  547. ;
  548. MFNAME:
  549. ;<<INIT DMA ADDR, FCB>>
  550.  CPM STDMA,80H
  551.  XRA A ! STA FCBEXT ! STA FCBRNO
  552. ;<<IF FIRST TIME>>
  553.  LDA MFFLG1 ! ORA A ! JNZ MFN01
  554. ;  <<TURN OFF 1ST TIME SW>>
  555.  MVI A,1 ! STA MFFLG1
  556. ;  <<SAVE THE REQUESTED NAME>>
  557.  MOVE FCB,MFREQ,12 ;SAVE ORIG REQ
  558.  LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB
  559. ;  <<SRCHF REQ NAME>>
  560.  MOVE MFREQ,FCB,12
  561.  CPM SRCHF,FCB
  562. ;<<ELSE>>
  563.  JMP MFN02
  564. MFN01:
  565. ;  <<SRCHF CURR NAME>>
  566.  MOVE MFCUR,FCB,12
  567.  CPM SRCHF,FCB
  568. ;  <<SRCHN REQ NAME>>
  569.  MOVE MFREQ,FCB,12
  570.  CPM SRCHN,FCB
  571. ;<<ENDIF>>
  572. MFN02:
  573. ;<<RETURN CARRY IF NOT FOUND>>
  574.  INR A ! STC ! RZ
  575. ;<<MOVE NAME FOUND TO CURR>>
  576.  DCR A ! ANI 3 ! ADD A
  577.  ADD A ! ADD A ! ADD A ! ADD A
  578.  ADI 81H ! MOV L,A ! MVI H,0
  579.  PUSH H ;SAVE NAME POINTER
  580.  MOVE ,MFCUR+1,11
  581. ;<<MOVE NAME FOUND TO FCB>>
  582.  POP H ! MOVE ,FCB+1,11
  583. ;<<SETUP FCB>>
  584.  XRA A ! STA FCBEXT
  585. ;<<RETURN>>
  586.  RET
  587. ;
  588. ;MULTI-FILE ACCESS WORK AREA
  589. ;
  590. MFFLG1    DB    0    ;1ST TIME SW
  591. MFREQ    DS    12    ;REQ NAME
  592. MFCUR    DS    12    ;CURR NAME
  593. ;------------------------------------------------
  594. ;
  595. ;EXIT, READING CHAR WHICH WAS TYPED TO INTERRUPT
  596. ;
  597. CHREXIT:
  598.     CPI    CNTRLC    ;ABORT?
  599.     JZ    ABORT
  600.     CPI    CNTRLK    ;ABORT?
  601.     JZ    ABORT
  602.     CPI    CNTRLX    ;SKIP TO NEXT FILE?
  603.     STC
  604.     RZ
  605.     CPI    CNTRLS    ;PAUSE?
  606.     JZ    PLOOP
  607.     ORA    A    ;RESET CARRY FLAG
  608.     RET
  609. ;
  610. PLOOP:
  611.     CPM    DIRECT,0FFH
  612.     ORA    A
  613.     JZ    PLOOP
  614.     JMP    CHREXIT
  615. ;
  616. ABORT:
  617.     CALL    MSGEXIT
  618.     DB    CR,LF,'++ABORT++$'
  619. ;
  620. ;EXIT WITH ERROR MESSAGE
  621. ;
  622. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  623. ERXIT    POP    D    ;GET MSG
  624.     MVI    C,PRINT
  625.     CALL    BDOS
  626. ;
  627. ;EXIT, RESTORING STACK AND RETURN
  628. ;
  629. EXIT    LHLD    STACK
  630.     SPHL
  631.     RET        ;TO CCP
  632. ;
  633. EFCB    DW    BUFF    ;BUFFER ADDR
  634. EFCBCT    DW    0    ;BYTES LEFT
  635.     DB    20    ;BUFFER SIZE (IN PAGES)
  636.     DW    FCB    ;FCB ADDRESS
  637. ;
  638. STRING    DS    30    ;WHAT TO SEARCH FOR
  639.     DS    200    ;STACK AREA
  640. STACK    DS    2
  641. STRPTR    DS    2    ;POINTER FOR "|" SCAN
  642. LINE    DS    133
  643. BUFF    EQU    $    ;DISK READ BUFER
  644. ;
  645. ;BDOS/CBIOS EQUATES (VERSION 8)    
  646. ;
  647. RDCON    EQU    1
  648. WRCON    EQU    2
  649. DIRECT    EQU    6
  650. PRINT    EQU    9
  651. RDCONBF    EQU    10
  652. CONST    EQU    11
  653. VERSION    EQU    12
  654. OPEN    EQU    15
  655. CLOSE    EQU    16
  656. SRCHF    EQU    17
  657. SRCHN    EQU    18
  658. ERASE    EQU    19
  659. READ    EQU    20
  660. WRITE    EQU    21
  661. MAKE    EQU    22
  662. REN    EQU    23
  663. STDMA    EQU    26
  664. BDOS    EQU    5
  665. FCB    EQU    5CH 
  666. FCB2    EQU    6CH
  667. FCBEXT    EQU    FCB+12
  668. FCBRNO    EQU    FCB+32
  669.