home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / cpm / utils / f / freebase.ark / SEARCH.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-02-05  |  12.0 KB  |  600 lines

  1. ;    SEARCH.ASM                      
  2. ;
  3. ;
  4. ;         * * *  Requires MAC for Assembly  * * * 
  5. ;
  6. ;
  7. ;    'SEARCHES ASCII, character strings in a file.
  8. ; May take a generic file name, thus may search all *.ASM files
  9. ; on a disk.  Also very useful for finding things in MAST.CAT - 
  10. ; for example if you are looking for all MODEM or BYE Programs
  11. ; you could SEARCH LIBRARY.DAT TIME|ROBOTS To see all entries 
  12. ; containing references to either "TIME" or "ROBOTS."  
  13. ;
  14. ;
  15. ;                           IMPORTANT
  16. ;
  17. ;    This is Ward Christensen's 'FIND.ASM'.  I have noodled
  18. ;    a little with it -- especially the db statements -- so
  19. ;    it can be used with the Freebase data management system, 
  20. ;    but Christensen should be given credit for creating it!
  21. ;    David Brown, Studio City, CA
  22. ;
  23. ;
  24. ;                           CAUTION:
  25. ;
  26. ;    CONTAINS TERMINAL SPECIFIC STUFF AIMED AT FREEDOM 50
  27. ;
  28. ;
  29. ;THE USUAL EQUATES
  30.  
  31. RDCON    EQU    1
  32. WRCON    EQU    2
  33. PRINT    EQU    9
  34. RSTRING    EQU    10
  35. CONST    EQU    11
  36. OPEN    EQU    15
  37. CLOSE    EQU    16
  38. SRCHF    EQU    17
  39. SRCHN    EQU    18
  40. ERASE    EQU    19
  41. READ    EQU    20
  42. WRITE    EQU    21
  43. MAKE    EQU    22
  44. REN    EQU    23
  45. STDMA    EQU    26
  46.  
  47. BDOS    EQU    5
  48. FCB    EQU    5CH 
  49. FCB2    EQU    6CH
  50. FCBEXT    EQU    FCB+12
  51. FCBRNO    EQU    FCB+32
  52. TBUFF    EQU    80H
  53.  
  54. CR    EQU    0DH
  55. LF    EQU    0AH
  56. EOF    EQU    1AH
  57. TAB    EQU    09H
  58.  
  59. ;START OF MACRO DEFINITIONS
  60. ;
  61. ; DATA MOVE MACRO: MOVE from,to,length
  62. ; may be addr, or quoted string
  63. ;
  64. MOVE    MACRO    FROM,TO,LEN
  65.     LOCAL    SKIP
  66.     JMP    SKIP
  67.  
  68. ?MOVE:    MOV    A,B
  69.     ORA    C
  70.     RZ
  71.     MOV    A,M
  72.     STAX    D
  73.     INX    H
  74.     INX    D
  75.     DCX    B
  76.     JMP    ?MOVE
  77.  
  78. MOVE    MACRO    ?F,?T,?L
  79.     IF    NOT NUL ?F
  80.     IRPC    ?C,?F
  81. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  82.     EXITM
  83.     ENDM
  84.     IF    ?Q EQ ''''
  85.     LOCAL    ?B,?Z
  86.     CALL    ?Z
  87. ?B    DB    ?F
  88. ?Z    POP    H    ;GET FROM
  89.     LXI    B,?Z-?B    ;GET LEN
  90.     ELSE
  91.     LXI    H,?F
  92.     ENDIF
  93.     ENDIF
  94.     IF    NOT NUL ?T
  95.     LXI    D,?T
  96.     ENDIF
  97.     IF    NOT NUL ?L
  98.     LXI    B,?L
  99.     ENDIF
  100.     CALL    ?MOVE
  101.     ENDM
  102. SKIP:    MOVE    FROM,TO,LEN
  103.     ENDM
  104.  
  105. ; COMPARE MACRO: COMPAR from,to,length
  106. ; may be addr, or quoted string.
  107. ;
  108. COMPAR    MACRO    FROM,TO,LEN
  109.     LOCAL    SKIP
  110.     JMP    SKIP
  111.  
  112. ?COMPAR:MOV    A,B
  113.     ORA    C
  114.     RZ
  115.     LDAX    D
  116.     CMP    M
  117.     RNZ
  118.     INX    D
  119.     INX    H
  120.     DCX    B
  121.     JMP    ?COMPAR
  122.  
  123. COMPAR    MACRO    ?F,?T,?L
  124.     IF    NOT NUL ?F
  125.     IRPC    ?C,?F
  126. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  127.     EXITM
  128.     ENDM
  129.     IF    ?Q EQ ''''
  130.     LOCAL    ?B,?Z
  131.     CALL    ?Z
  132. ?B    DB    ?F
  133. ?Z    POP    H    ;GET FROM
  134.     LXI    B,?Z-?B    ;GET LEN
  135.     ELSE
  136.     LXI    H,?F
  137.     ENDIF
  138.     ENDIF
  139.     IF    NOT NUL ?T
  140.     LXI    D,?T
  141.     ENDIF
  142.     IF    NOT NUL ?L
  143.     LXI    B,?L
  144.     ENDIF
  145.     IF    NOT NUL ?I
  146.     LOCAL    ?B,?Z
  147.     CALL    ?Z
  148. ?B    DB    ?I
  149. ?Z    POP    D    ;GET TO
  150.     LXI    B,?Z-?B
  151.     ENDIF
  152.     CALL    COMPARR
  153.     ENDM
  154. SKIP:    COMPAR    FROM,TO,LEN
  155.     ENDM
  156.  
  157. ; CP/M MACRO - CPM fnc,parm
  158. ;
  159. CPM    MACRO    ?F,?P
  160.     PUSH    B
  161.     PUSH    D
  162.     PUSH    H
  163.     IF    NOT NUL ?F
  164.     MVI    C,?F
  165.     ENDIF
  166.     IF    NOT NUL ?P
  167.     LXI    D,?P
  168.     ENDIF
  169.     CALL    BDOS
  170.     POP    H
  171.     POP    D
  172.     POP    B
  173.     ENDM
  174. ;
  175. ; END OF MACRO DEFINITIONS
  176. ;
  177.  
  178.     ORG    100H
  179.  
  180. ;- FIND - 
  181.     JMP    START
  182.  
  183. ;Data Area
  184.  
  185. PGMID:    DB    'SEARCH - Version 1.0 7/2/84'    ;*>David Brown
  186.     DB    CR,LF,'$'
  187.     DB    EOF
  188.  
  189. DFLTNAM:DB    'LIBRARY DAT'        ;DEFAULT FILE NAME
  190.  
  191. ABORT:    DB    CR,LF,'++FIND ABORTED++$'
  192. NOFILE:    DB    CR,LF,'++CANNOT FIND'
  193. FILMSG:    DB    '----> FILE '
  194. FNAME:    DB    'XXXXXXXX.XXX'
  195.     DB    CR,LF
  196. CRLF:    DB    CR,LF,'$'
  197. PROMPT: DB     27,42    ;BLOW AWAY SCREEN
  198.     DB    27,119  ; SET UP FOR SETTING INTENSITY PER CHAR
  199.         DB      27,93,56 ;ROW 1, COL 25 -- TO CENTER, I HOPE
  200.         DB      27,71,52 ; SET INTENSITY TO FULL BLAST
  201.     DB    'F R E E  B A S E  II'
  202.         DB      27,71,48 ; SHUT OFF INTENSITY
  203.     DB    CR,LF
  204.     DB    CR,LF
  205.         DB      CR,LF
  206.         DB      CR,LF
  207.         DB      27,93,56 ;ROW 1, COL 25, TOO
  208.         DB      '  SEARCH  PROGRAM '
  209.         DB      CR,LF
  210.     DB    CR,LF,'A>SEARCH File.Type [String]'
  211.         DB      CR,LF
  212.         DB      CR,LF,'          ^     ^     ^    '
  213.         DB      CR,LF,'          |     |     |    ' 
  214.         DB      CR,LF,'          |     |     |_Object of Search'
  215.         DB      CR,LF,'          |     |_Type - can be *'
  216.         DB      CR,LF,'          |_Filename - can be *'
  217.         DB      CR,LF,'            Default = Library.Dat'
  218.         DB      CR,LF,CR,LF
  219.     DB      CR,LF,'A>SEARCH  <-- Without Parameters for prompt.'
  220.     DB      CR,LF
  221.         DB      CR,LF,'Upper case locates Upper & Lower case Occurrences'
  222.         DB      CR,LF,CR,LF  
  223.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  224.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  225.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  226.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0
  227.         DB      27,113     ; TURN ON READOUT
  228.         DB    CR,LF,'Word or Phrase to Search For>'
  229.         DB      27,114     ; TURN OFF READOUT
  230.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  231.         DB      7      ; BLOW THE HORN  
  232.         DB      '$'
  233.     ;RDBYTE FIELDS
  234. EFCB:    DW    BUFF        ;BUFFER ADDR
  235. EFCBCT:    DW    0        ;BYTES LEFT
  236.     DB    20        ;BUFFER SIZE (IN PAGES)
  237.     DW    FCB        ;FCB ADDRESS
  238.  
  239.     ;MFNAME FIELDS
  240. MFFLG1:    DB    0        ;1ST TIME SW
  241. MFREQ:    DS    12        ;REQ NAME
  242. MFCUR:    DS    12        ;CURR NAME
  243.  
  244. CONBUF:    DB    CONLEN        ;LENGTH OF CONSOLE BUFFER
  245. CONSIZ:    DS    1        ;RESULTING SIZE AFTER READ
  246. STRING:    DS    200             ;WHAT TO SEARCH FOR
  247. CONLEN    EQU    $-CONSIZ
  248. LINENO:    DB    '    ',TAB,'$'    ;LINE NUMBER
  249.  
  250.     DS    32        ;STACK AREA
  251. STACK:    DS    2
  252. STRPTR:    DS    2        ;POINTER FOR "|" SCAN
  253. LINE:    DS    133
  254.  
  255. ;END OF DATA AREA
  256.  
  257.  
  258.  
  259. ;- Save stack, print Sign-on, Look for file spec.
  260. START:    LXI    H,0        ;SAVE STACK
  261.     DAD    SP
  262.     SHLD    STACK
  263.     LXI    SP,STACK
  264.     CPM    PRINT,PGMID    ;PRINT SIGNON
  265.     LDA    FCB+1
  266.     CPI    ' '        ;IF A FILE WAS SPECIFIED
  267.     JNZ    SETSTR        ;   GO SET UP STRING ENTERED
  268.                 ; ELSE
  269.     MOVE    DFLTNAM,FCB+1,11;   MOVE IN DEFAULT FILENAME
  270.     JMP    GETSTR        ;   GO PROMPT FOR STRING.
  271.  
  272. ;- Set String pointers, and end delimiter.
  273. SETSTR:    LXI    D,TBUFF        ;DE=TBUFF
  274.     LDAX    D        ;LENGTH
  275.     MOV    C,A        ;SAVE LENGTH
  276.     MVI    B,0        ;SETUP BC FOR MOVE
  277.     INX    D        ;PAST LENGTH
  278.     MOV    L,A        ;L=LENGTH
  279.     MVI    H,0        ;HL=LENGTH
  280.     DAD    D        ;HL=LAST CHAR
  281.     MVI    M,0        ;STORE END DELIM
  282.     XCHG            ;START TO HL
  283.  
  284. ;SCAN - Look for String, If found save it.
  285. SCAN:    INX    H        ;TO NEXT CHAR
  286.     MOV    A,M        ;LOOK FOR ' '
  287.     ORA    A        ;END?
  288.     JZ    GETSTR        ;..YES, THEN GET IT FROM THE CONSOLE
  289.     CPI    ' '        ;
  290.     JNZ    SCAN        ;NOT AT ' '
  291.     INX    H        ;TO STRING
  292.     MOVE    ,STRING,     ;HL = FROM, BC=LENGTH
  293.     CALL    FRSTFI        ;SEE IF FILE EXISTS
  294.     JMP    OPFILE        ;GO PROCESS IT
  295.  
  296. ;GETSTR - Accept String from console.
  297. GETSTR:    CALL    FRSTFI        ;LOOK FOR FILE
  298.     CPM    PRINT,PROMPT    ;DISPLAY PROMPT
  299.     CPM    RSTRING,CONBUF    ;GET STRING
  300.     LDA    CONSIZ
  301.     ORA    A
  302.     JZ    EXIT
  303.     MOV    L,A        ;STORE DELIMITER
  304.     MVI    H,0
  305.     LXI    D,STRING
  306.     DAD    D
  307.     MVI    M,0
  308.     CPM    PRINT,CRLF
  309.     JMP    OPFILE        ;PROCESS FILE
  310.  
  311. ;FRSTFI - Search for Initial file and print it's name.
  312. FRSTFI:    CALL    MFNAME        ;IF FILE DOES NOT EXIST
  313.     RNC            ; TELL THEM AND EXIT.
  314.     MOVE    FCB+1,FNAME,8
  315.     MOVE    FCB+9,FNAME+9,3
  316.     CPM    PRINT,NOFILE
  317.     JMP    EXIT
  318.  
  319. ;NEXTFL - Look for another file, If none then exit.
  320. NEXTFL:    CPM    PRINT,CRLF
  321.     CALL    MFNAME
  322.     JC    EXIT
  323.  
  324. ;OPFILE - Open file and print name.
  325. OPFILE:    CPM    OPEN,FCB
  326.     INR    A
  327.     JZ    EXIT
  328.     MOVE    '   0',LINENO
  329.     MOVE    FCB+1,FNAME,8
  330.     MOVE    FCB+9,FNAME+9,3
  331.     CPM    PRINT,FILMSG    ;SAY WHICH FILE
  332.     LXI    H,0
  333.     SHLD    EFCBCT
  334.  
  335. ;NEXTLN - Set up next line number.
  336. NEXTLN:    LXI    H,LINENO+3
  337. NEXT01:    MOV    A,M        ;GET DIGIT
  338.     ORI    '0'        ;MAKE ASCII
  339.     INR    A
  340.     MOV    M,A
  341.     CPI    '9'+1        ;CARRY?
  342.     JNZ    NEXTNC
  343.     MVI    M,'0'
  344.     DCX    H
  345.     JMP    NEXT01
  346.  
  347. ;NEXTNC - Read a line from file.
  348. NEXTNC:    LXI    H,LINE
  349.     MVI    B,0FFH        ;SO LONG LINE WON'T BLOW
  350. NEXT02:    INR    B
  351.     JM    LONG        ;TOO LONG A LINE
  352.     PUSH    B
  353.     PUSH    H
  354.     LXI    H,EFCB
  355.     CALL    RDBYTE
  356.     POP    H
  357.     POP    B
  358.     MOV    M,A
  359.     INX    H
  360.     CPI    EOF
  361.     JZ    NEXTFL        ;NEXT FILE
  362.     CPI    LF
  363.     JNZ    NEXT02
  364.     JMP    EOL
  365.  
  366. ;LONG - Got a long line, chop it off.
  367. LONG:    MVI    M,CR
  368.     INX    H
  369.     MVI    M,LF
  370.  
  371. ;EOL - Check for operator abort, point to String.
  372. EOL:    CPM    CONST        ;TEST FOR ABORT
  373.     ORA    A
  374.     JNZ    CHRXIT        ;ABORT REQUESTED
  375.     LXI    H,STRING
  376.  
  377. ;XXXXXX - We have a line, now Scan for the String.
  378. ORLINE:    SHLD    STRPTR
  379.     LXI    H,LINE
  380. NEXTST:    XCHG
  381.     LHLD    STRPTR
  382.     XCHG            ;(HL)->LINE - (DE)->STRING
  383.     PUSH    H
  384.  
  385. ;NEXTC - Replace '_' with a TAB.
  386. NEXTC:    LDAX    D
  387.     CPI    '_'
  388.     JNZ    NOTAB
  389.     MVI    A,TAB
  390. NOTAB:    INX    D
  391.     ORA    A        ;END OF STRING?
  392.     JZ    MATCHED
  393.     CPI    '|'
  394.     JZ    MATCHED        ;FIRST PART
  395.     MOV    C,M        ;FOR LOWER CASE TEST
  396.     CMP    M
  397.     INX    H
  398.     JZ    NEXTC
  399.     MOV    B,A        ;SAVE CHAR
  400.     MOV    A,C        ;GET CHAR
  401.     CPI    61H        ;LOWER?
  402.     JC    NOTEQ        ;NO, SO NO MATCH
  403.     CPI    7BH
  404.     JNC    NOTEQ
  405.     ANI    5FH        ;MAKE UPPER CASE
  406.     CMP    B
  407.     JZ    NEXTC        ;MATCHED
  408.  
  409. NOTEQ:    POP    H        ;RESTORE ADDR
  410.     INX    H
  411.     MOV    A,M
  412.     CPI    CR
  413.     JNZ    NEXTST
  414.     LHLD    STRPTR
  415.  
  416. ;FINDOR - If an "OR" (|) is in the line, Scan for it.
  417. FINDOR:    MOV    A,M
  418.     INX    H
  419.     CPI    '|'
  420.     JZ    ORLINE
  421.     ORA    A
  422.     JNZ    FINDOR
  423.     JMP    NEXTLN
  424.  
  425. ;MATCHED - Got a match print it.
  426. MATCHED:POP    H        ;KILL STACKED ADDR
  427.     CPM    PRINT,LINENO    ;PRINT LINE NUMBER
  428.     LXI    H,LINE
  429. MATCHLP:MOV    A,M
  430.     MOV    E,A
  431.     CPM    WRCON
  432.     MOV    A,M
  433.     INX    H
  434.     CPI    LF
  435.     JNZ    MATCHLP
  436.     JMP    NEXTLN
  437.  
  438. ;CHRXIT - Read Keyboard, Print Abort message.
  439. CHRXIT:    CPM    RDCON
  440.     CPM    PRINT,ABORT
  441.  
  442. ;EXIT - Restore Stack and Return to CP/M.
  443. EXIT:    LHLD    STACK
  444.     SPHL
  445.     RET            ;TO CCP
  446.  
  447. ;SUBROUTINES
  448. ;
  449. ;RDBYTE - READ BYTE FROM FILE.
  450. ;  HL POINTS TO EFCB:
  451. ;  EFCB;
  452. ;      2 BYTE BUFFER ADDR
  453. ;      2 BYTE "BYTES LEFT" (INIT TO 0)
  454. ;      1 BYTE BUFFER SIZE (IN PAGES)
  455. ;      2 BYTE FCB ADDRESS
  456. ;
  457. RDBYTE:    MOV    E,M        ;DE = BUFFER ADDR
  458.     INX    H        ;X
  459.     MOV    D,M        ;X
  460.     INX    H        ;BC = BYTES LEFT
  461.     MOV    C,M        ;X
  462.     INX    H        ;X
  463.     MOV    B,M        ;X
  464.     MOV    A,B        ;IF BYTE-COUNT NOT = ZERO
  465.     ORA    C        ;   GO READ NEXT BYTE
  466.     JNZ    RDGETB        ; ELSE
  467.     INX    H        ;   READ ANOTHER SECTOR.
  468.     MOV    A,M        ;GET COUNT
  469.     ADD    A        ;MULTIPLY BY 2
  470.     MOV    B,A        ;SECTOR COUNT IN B
  471.     INX    H        ;TO FCB
  472.     PUSH    H        ;SAVE FCB POINTER
  473.     MOV    A,M        ;GET..
  474.     INX    H        ;..FCB..
  475.     MOV    H,M        ;..ADDR..
  476.     MOV    L,A        ;..TO HL
  477.  
  478. RDBLP:    MVI    A,EOF        ;PUT EOF CHAR IN BUF
  479.     STAX    D        ;  IN CASE OF EOF.
  480.     PUSH    D        ;SAVE DMA ADDR
  481.     PUSH    H        ;SAVE FCB ADDR
  482.     CPM    STDMA        ;SET DMA ADDR
  483.     POP    D        ;GET FCB
  484.     CPM    READ        ;READ SECTOR
  485.     ORA    A        ;CHECK FOR EOF
  486.     POP    H        ;HL=DMA, DE=FCB
  487.     JNZ    RDBRET        ;GOT EOF
  488.     MOV    A,L        ;BUMP BUFFER POINTER
  489.     ADI    80H        ;TO NEXT BUFF
  490.     MOV    L,A        ;X
  491.     MOV    A,H        ;X
  492.     ACI    0        ;X
  493.     MOV    H,A        ;X
  494.     XCHG            ;DMA TO DE, FCB TO HL
  495.     DCR    B        ;MORE SECTORS?
  496.     JNZ    RDBLP        ;YES, MORE
  497. RDBRET:    POP    H        ;GET FCB POINTER
  498.     DCX    H        ;TO LENGTH
  499.     MOV    A,M        ;GET LENGTH
  500.     DCX    H        ;TO COUNT
  501.     MOV    M,A        ;SET PAGE COUNT
  502.     DCX    H        ;TO LO COUNT
  503.     DCX    H        ;TO HI FCB
  504.     DCX    H        ;TO EFCB START
  505.     JMP    RDBYTE        ;LOOP THRU AGAIN
  506.  
  507. RDGETB:    INX    H        ;POINT TO BUFFER SIZE
  508.     MOV    A,M        ;GET LENGTH (PAGES)
  509.     XCHG            ;BUFF TO HL
  510.     ADD    H        ;HL = END OF BUFF
  511.     MOV    H,A        ;X
  512.     MOV    A,L        ;X
  513.     SUB    C        ;HL = DATA POINTER
  514.     MOV    L,A        ;X
  515.     MOV    A,H        ;X
  516.     SBB    B        ;X
  517.     MOV    H,A        ;X
  518.     MOV    A,M        ;GET BYTE
  519.     XCHG            ;EFCB POINTER BACK TO HL
  520.     CPI    EOF        ;EOF?
  521.     RZ            ;YES, LEAVE POINTERS
  522.     DCX    B        ;DECR COUNT
  523.     DCX    H        ;POINT BACK TO "BYTES LEFT"
  524.     MOV    M,B        ;STORE BACK COUNT
  525.     DCX    H        ;X
  526.     MOV    M,C        ;X
  527.     RET            ;RETURN TO CALLER
  528.  
  529.  
  530.  
  531.  
  532. ;MFNAME - MULT-FILE ACCESS SUBROUTINE.
  533. ;
  534. ; MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  535. ; OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  536. ; ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  537. ; TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  538. ; IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  539. ; ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  540. ; MULTIPLE FILES.
  541. ; JUST CALL "MFNAME" (Multiple File NAME) AND THE FCB
  542. ; WILL BE SET UP WITH THE NEXT NAME, READY TO
  543. ; DO NORMAL PROCESSING (OPEN, READ, ETC.)
  544. ; CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  545. ; THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  546. ; EACH PSEUDO CODE STATEMENT IS IN <<...>>
  547. MFNAME:    CPM    STDMA,80H    ;<<INIT DMA ADDR, FCB>>
  548.     XRA    A 
  549.     STA    FCBEXT
  550.     STA    FCBRNO
  551.  
  552.     LDA    MFFLG1        ;<<IF FIRST TIME>>
  553.     ORA    A
  554.     JNZ    MFN01
  555.     MVI    A,1        ;  <<TURN OFF 1ST TIME SW>>
  556.     STA    MFFLG1
  557.     MOVE    FCB,MFREQ,12    ;  <<SAVE THE REQUESTED NAME>>
  558.     LDA    FCB
  559.     STA    MFCUR
  560.     MOVE    MFREQ,FCB,12    ;  <<SRCHF REQ NAME>>
  561.     CPM    SRCHF,FCB
  562.     JMP    MFN02        ;<<ELSE>>
  563.  
  564. MFN01:    MOVE    MFCUR,FCB,12    ;  <<SRCHF CURR NAME>>
  565.     CPM    SRCHF,FCB
  566.     MOVE    MFREQ,FCB,12    ;  <<SRCHN REQ NAME>>
  567.     CPM    SRCHN,FCB    ;<<ENDIF>>
  568.                 
  569. MFN02:    INR    A        ;<<RETURN CARRY IF NOT FOUND>>
  570.     STC
  571.     RZ
  572.  
  573.     DCR    A        ;<<MOVE NAME FOUND TO CURR>>
  574.     ANI    3
  575.     ADD    A
  576.     ADD    A
  577.     ADD    A
  578.     ADD    A
  579.     ADD    A
  580.     ADI    81H
  581.     MOV    L,A
  582.     MVI    H,0
  583.     PUSH    H
  584.     MOVE    ,MFCUR+1,11
  585.  
  586.     POP    H        ;<<MOVE NAME FOUND TO FCB>>
  587.     MOVE    ,FCB+1,11
  588.  
  589.     XRA    A        ;<<SETUP FCB>>
  590.     STA    FCBEXT
  591.     RET            ;<<RETURN>>
  592.  
  593. BUFF    EQU    $        ;DISK READ BUFER
  594.  
  595.     END
  596.