home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol146 / find20b.a86 < prev    next >
Encoding:
Text File  |  1984-04-29  |  14.6 KB  |  746 lines

  1. ; DATE 10/06/83  20:06       LAST REVISION
  2.  
  3.     TITLE    'FIND version 2.0B for CP/M-86'
  4.  
  5. ; by: H.M. Van Tassell, 120 Hill Hollow Rd, Watchung NJ  07060  (201)755-5372
  6. ; DATE: 10/06/83
  7. ;
  8. ; This is an XLT86 translation of the original program that was on SIG/M
  9. ; volume 123. It is even more messy than the usual XTL86 translation since
  10. ; it had MACRO's.
  11. ;
  12. ; The only change is to add a HELP screen that is involked with //
  13. ;
  14. ;    TO GENERATE PROGRAM:
  15. ;    ASM86 FIND $SZPZ
  16. ;    GENCMD FIND 8080 CODE[M100]
  17. ;
  18. ; The default file name is at 183h when you load FIND into DDT86
  19. ; To change default file name using DDT86 (SID86):
  20. ; A>DDT86
  21. ; -RFIND.CMD    Loads FIND.CMD into DDT86, keeps header record for rewrite.
  22. ; -D183        Now see default filename - so change it using S command.
  23. ; -WFIND1.CMD   This writes the changed file called FIND1.CMD. 
  24. ;
  25.  
  26.  
  27. ;*    FIND.ASM    VERSION 2.0    10/05/82
  28. ;*
  29. ;*    ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  30. ;*    ENHANCED AND REWRITTEN BY RICH ANGELO - 10-05-82
  31. ;*
  32. ;*    'FIND'S ASCII, CHARACTER STRINGS IN A FILE.
  33. ;* MAY TAKE A GENERIC FILE NAME, THUS MAY SEARCH ALL *.ASM FILES
  34. ;* ON A DISK.  ALSO VERY USEFUL FOR FINDING THINGS IN MAST.CAT - 
  35. ;* FOR EXAMPLE IF YOU ARE LOOKING FOR ALL MODEM OR BYE PROGRAMS
  36. ;* YOU COULD FIND MAST.CAT MOD|BYE TO SEE THEM ALL.
  37. ;*
  38. ;*    ANOTHER USEFUL FUNCTION IS FOR DOCUMENTATION. FOR EXAMPLE;
  39. ;*
  40. ;*    PRINT ALL OF THIS, ENTER:    FIND FIND.ASM ;*
  41. ;*
  42. ;*    PRINT MAINLINE COMMENTS,    FIND FIND.ASM *>
  43. ;*
  44. ;*    PRINT SUBROUTINES,        FIND FIND.ASM *S>
  45. ;*
  46. ;*    OR TRY THIS,            FIND FIND.ASM *>|*S>
  47. ;*
  48. ;*    PRINT MACROS USED,        FIND FIND.ASM *M>
  49. ;*
  50. ;* DOCUMENTING A PROGRAM IN THIS FASHION IS AN EASY WAY TO SEPERATE
  51. ;* COMMENTS FROM CODE. THERE ARE MANY WAYS TO IDENTIFY A PORTION OF
  52. ;* A PROGRAM.  MAYBE A STANDARD CAN BE ESTABLISHED, THAT WE ALL CAN
  53. ;* SHARE. THIS IS THE FIRST STEP IN THAT DIRECTION.
  54. ;*
  55. ;*        ANY COMMENTS USE,
  56. ;*        ONE OF THE POPULAR CHICAGO AREA RBBS OR CBBS SYSTEMS.
  57. ;*
  58. ;*                RICH ANGELO
  59. ;*
  60. ;*    USED WITH  LIST.COM  WHICH  TAKES A STARTING LINE NUMBER,
  61. ;* YOU CAN:  1)  USE  FIND TO FIND A PARTICULAR PART OF THE CODE,
  62. ;* THEN 2) USE LIST SPECIFYING A STARTING LINE NUMBER JUST BEFORE
  63. ;* THE PART OF THE CODE YOU WANTED TO SEE.
  64. ;*
  65. ;*    NOTE THAT  FIND  NOW HAS A DEFAULT FILE NAME AND THE ABILITY
  66. ;* TO PROMPT FOR SEARCH STRING. THIS FEATURE IS HANDY IF YOU WANT TO
  67. ;* SEARCH FOR SPECIFIC CHARACTERS ONLY, WHEREAS ENTERING THE  SEARCH
  68. ;* STRING ON THE COMMAND LINE WILL DISPLAY BOTH UPPER AND LOWER CASE.
  69. ;*
  70. ;*    SPECIAL SEARCH FEATURES OF FIND ARE;
  71. ;*
  72. ;*    1.    MAKE "_" MATCH A TAB
  73. ;*    2.    MAKE "|" AN "OR"
  74. ;*        AS IN: FIND B:*.ASM  _IN_|_OUT_
  75. ;*
  76. ;*
  77. ;*    COMMAND FORMATS;
  78. ;*
  79. ;*    FIND        <--- DEFAULTS TO FILENAME IN DFLTNAM.
  80. ;*            WILL PROMPT FOR SEARCH STRING LOWER CASE VALID.
  81. ;*            ALSO WILL SEARCH FOR ANY CHARACTER SEQ. PASSED
  82. ;*            THRU CPM READ STRING FUNCTION.
  83. ;*
  84. ;*    FIND FN.FT    <--- PROMPT FOR SEARCH STRING.
  85. ;*
  86. ;*    FIND FN.FT STR    <--- WILL DISPLAY UPPER & LOWER CASE OF STRING
  87. ;*            USING FILE SPECIFIED.
  88. ;*
  89. ;*    FN.FT MAY BE AMBIGUOUS, *.ASM OR CBBS*.ASM
  90. ;*
  91. ;*----------------------------------------------------------------------
  92. ;*
  93.  
  94. CLS    EQU    01Ah        ;CLEAR SCREEN
  95.  
  96. M    EQU    Byte Ptr 0[BX]
  97.  
  98. ;THE USUAL EQUATES
  99. RDCON    EQU    1
  100. WRCON    EQU    2
  101. PRINT    EQU    9
  102. RSTRING    EQU    10
  103. CONST    EQU    11
  104. OPEN    EQU    15
  105. CLOSE    EQU    16
  106. SRCHF    EQU    17
  107. SRCHN    EQU    18
  108. ERASE    EQU    19
  109. READ    EQU    20
  110. WRITE    EQU    21
  111. MAKE    EQU    22
  112. REN    EQU    23
  113. STDMA    EQU    26
  114. BDOS    EQU    5
  115. FCB    EQU    5CH
  116. FCB2    EQU    6CH
  117. FCBEXT    EQU    FCB+12
  118. FCBRNO    EQU    FCB+32
  119. TBUFF    EQU    80H
  120. CR    EQU    0DH
  121. LF    EQU    0AH
  122. EOF    EQU    1AH
  123. TAB    EQU    09H
  124.     
  125.     CSEG
  126.     ORG    100H
  127.     JMP    START
  128. L_1    EQU    $
  129.     DSEG
  130.     ORG    Offset L_1
  131. ;*++++++>   DATA AREA
  132. ;
  133. ;
  134. DFLTNAM    DB    'SIG/M   CAT'        ;DEFAULT FILE NAME
  135. ;
  136. HELPMSG    DB    CLS,'FIND - version 2.0B for CP/M-86',CR,LF,LF
  137.     DB    TAB,'Special Search Features of FIND are:',CR,LF
  138.     DB    TAB,'1.    Make "_" match a TAB',CR,LF
  139.     DB    TAB,'2.    Make "|" an "OR"',CR,LF
  140.     DB    TAB,'    as in: FIND B:*.ASM  _IN_|_OUT_',CR,LF,LF
  141.     DB    TAB,'Command Formats:',CR,LF,LF
  142.     DB    TAB,'FIND',TAB,TAB,'<--- Defaults to filename SIG/M.CAT.',CR,LF
  143.     DB    TAB,TAB,TAB,'will prompt for search string lower case valid.',CR,LF
  144.     DB    TAB,TAB,TAB,'also will search for any character seq.',CR,LF
  145.     DB    TAB,TAB,TAB,'passed thru CPM read string function.',CR,LF,LF
  146.     DB    TAB,'FIND FN.FT     <--- prompt for search string.',CR,LF,LF
  147.     DB    TAB,'FIND FN.FT STR    <--- will display upper & lower case of string',CR,LF
  148.     DB    TAB,'        using specified File.',CR,LF,LF
  149.     DB    TAB,'FN.FT may be ambiguous, *.ASM OR CBBS*.ASM',CR,LF,'$'
  150.  
  151. PGMID    DB    'FIND version 2.0B - // for Help'    
  152.     DB    CR,LF,'$'
  153.     DB    EOF
  154. ;
  155. ABORT    DB    CR,LF,'++FIND ABORTED++$'
  156. NOFILE    DB    CR,LF,'++CANNOT FIND'
  157. FILMSG    DB    '----> FILE '
  158. FNAME    DB    'XXXXXXXX.XXX'
  159.     DB    CR,LF
  160. CRLF    DB    CR,LF,'$'
  161. PROMPT    DB    CR,LF,'Enter String>$'
  162. ;RDBYTE FIELDS
  163. EFCB    DW    (Offset BUFF)        ;BUFFER ADDR
  164. EFCBCT    DW    0            ;BYTES LEFT
  165.     DB    20            ;BUFFER SIZE (IN PAGES)
  166.     DW    FCB            ;FCB ADDRESS
  167. ;MFNAME FIELDS
  168. MFFLG1    DB    0            ;1ST TIME SW
  169. MFREQ    RS    12            ;REQ NAME
  170. MFCUR    RS    12            ;CURR NAME
  171. CONBUF    DB    (Offset CONLEN)        ;LENGTH OF CONSOLE BUFFER
  172. CONSIZ    RS    1            ;RESULTING SIZE AFTER READ
  173. STRING    RS    30            ;WHAT TO SEARCH FOR
  174. CONLEN    EQU    (Offset $)-(Offset CONSIZ)
  175. LINENO    DB    '    ',TAB,'$'        ;LINE NUMBER
  176.     RS    32            ;STACK AREA
  177. STACK    RS    2
  178. STRPTR    RS    2            ;POINTER FOR "|" SCAN
  179. LINE    RS    133
  180. L_2    EQU    $
  181.     CSEG
  182.     ORG    Offset L_2
  183. ;------>    END OF DATA AREA
  184. ;******>
  185. ;******>START - PRINT SIGN-ON, LOOK FOR FILE SPEC.
  186. START:
  187.     PUSH    CX
  188.     PUSH    DX
  189.     PUSH    BX
  190.     MOV    CL,PRINT
  191.     MOV    DX,(Offset PGMID)
  192.     INT    224
  193.     POP    BX
  194.     POP    DX
  195.     POP    CX
  196.     MOV    AL,Byte Ptr .FCB+1
  197.     CMP    AL,' '            ;IF A FILE WAS SPECIFIED
  198.     JE    M_1            ;JMP IF NO FILE NAME
  199.     CMP    AL,'/'            ;CHECK FOR HELP REQUEST
  200.     JNZ    SETSTR            ;NO... GO SET UP STRING ENTERED
  201.     MOV    AL,Byte Ptr .FCB+2
  202.     CMP    AL,'/'            ;// = HELP REQUEST
  203.     JNE    SETSTR            ;NO... GO SET UP STRING
  204.     MOV    DX,OFFSET HELPMSG
  205.     MOV    CL,PRINT
  206.     INT    224
  207.     JMP     EXIT
  208. ; ELSE
  209. ; MOVE IN DEFAULT FILENAME
  210.     JMPS    M_1
  211. MMOVE:    MOV    AL,CH
  212.     OR    AL,CL
  213.     JNZ    L_3
  214.     RET
  215. L_3:
  216.     MOV    AL,M
  217.     MOV    SI,DX
  218.     MOV    [SI],AL
  219.     INC    BX
  220.     INC    DX
  221.     DEC    CX
  222.     JMPS    MMOVE
  223. M_1:    MOV    BX,(Offset DFLTNAM)
  224.     MOV    DX,FCB+1
  225.     MOV    CX,11
  226.     CALL    MMOVE
  227.     JMPS    GETSTR            ;   GO PROMPT FOR STRING.
  228. ;******>SETSTR - SET STRING POINTERS, AND END DELIMITER.
  229. SETSTR:    MOV    DX,TBUFF        ;DE=TBUFF
  230.     MOV    SI,DX            ;LENGTH
  231.     MOV    AL,[SI]
  232.     MOV    CL,AL            ;SAVE LENGTH
  233.     MOV    CH,0            ;SETUP BC FOR MOVE
  234.     INC    DX            ;PAST LENGTH
  235.     MOV    BL,AL            ;L=LENGTH
  236.     MOV    BH,0            ;HL=LENGTH
  237.     ADD    BX,DX            ;HL=LAST CHAR
  238.     MOV    M,0            ;STORE END DELIM
  239.     XCHG    BX,DX            ;START TO HL
  240. ;******>SCAN - LOOK FOR STRING, IF FOUND SAVE IT.
  241. SCAN:    INC    BX            ;TO NEXT CHAR
  242.     MOV    AL,M            ;LOOK FOR ' '
  243.     OR    AL,AL            ;END?
  244.     JZ    GETSTR            ;..YES, THEN GET IT FROM THE CONSOLE
  245.     CMP    AL,' '            ;
  246.     JNZ    SCAN            ;NOT AT ' '
  247.     LAHF                ;TO STRING
  248.     INC    BX
  249.     SAHF
  250.     MOV    DX,(Offset STRING)
  251.     CALL    MMOVE
  252.     CALL    FRSTFI            ;SEE IF FILE EXISTS
  253.     JMP    OPFILE            ;GO PROCESS IT
  254. ;******>GETSTR - ACCEPT STRING FROM CONSOLE.
  255. GETSTR:    CALL    FRSTFI            ;LOOK FOR FILE
  256.     PUSH    CX
  257.     PUSH    DX
  258.     PUSH    BX
  259.     MOV    CL,PRINT
  260.     MOV    DX,(Offset PROMPT)
  261.     INT    224
  262.     POP    BX
  263.     POP    DX
  264.     POP    CX
  265.     PUSH    CX
  266.     PUSH    DX
  267.     PUSH    BX
  268.     MOV    CL,RSTRING
  269.     MOV    DX,(Offset CONBUF)
  270.     INT    224
  271.     POP    BX
  272.     POP    DX
  273.     POP    CX
  274.     MOV    AL,Byte Ptr CONSIZ
  275.     OR    AL,AL
  276.     JNZ    L_4    
  277.     JMP    EXIT
  278. L_4:
  279.     MOV    BL,AL            ;STORE DELIMITER
  280.     MOV    BH,0
  281.     MOV    DX,(Offset STRING)
  282.     LAHF
  283.     ADD    BX,DX
  284.     RCR    SI,1
  285.     SAHF
  286.     RCL    SI,1
  287.     MOV    M,0
  288.     PUSH    CX
  289.     PUSH    DX
  290.     PUSH    BX
  291.     MOV    CL,PRINT
  292.     MOV    DX,(Offset CRLF)
  293.     INT    224
  294.     POP    BX
  295.     POP    DX
  296.     POP    CX
  297.     JMPS    OPFILE            ;PROCESS FILE
  298. ;******>FRSTFI - SEARCH FOR INITIAL FILE AND PRINT IT'S NAME.
  299. FRSTFI:    CALL    MFNAME            ;IF FILE DOES NOT EXIST
  300.     JNAE    L_5    
  301.     RET                ; TELL THEM AND EXIT.
  302. L_5:
  303.     MOV    BX,FCB+1
  304.     MOV    DX,(Offset FNAME)
  305.     MOV    CX,8
  306.     CALL    MMOVE
  307.     MOV    BX,FCB+9
  308.     MOV    DX,(Offset FNAME)+9
  309.     MOV    CX,3
  310.     CALL    MMOVE
  311.     PUSH    CX
  312.     PUSH    DX
  313.     PUSH    BX
  314.     MOV    CL,PRINT
  315.     MOV    DX,(Offset NOFILE)
  316.     INT    224
  317.     POP    BX
  318.     POP    DX
  319.     POP    CX
  320.     JMP    EXIT
  321. ;******>NEXTFL - LOOK FOR ANOTHER FILE, IF NONE THEN EXIT.
  322. NEXTFL:        
  323.     PUSH    CX
  324.     PUSH    DX
  325.     PUSH    BX
  326.     MOV    CL,PRINT
  327.     MOV    DX,(Offset CRLF)
  328.     INT    224
  329.     POP    BX
  330.     POP    DX
  331.     POP    CX
  332.     CALL    MFNAME
  333.     JNB    L_6    
  334.     JMP    EXIT
  335. L_6:
  336. ;******>OPFILE - OPEN FILE AND PRINT NAME.
  337. OPFILE:    
  338.     PUSH    CX
  339.     PUSH    DX
  340.     PUSH    BX
  341.     MOV    CL,OPEN
  342.     MOV    DX,FCB
  343.     INT    224
  344.     POP    BX
  345.     POP    DX
  346.     POP    CX
  347.     INC    AL
  348.     JNZ    L_7    
  349.     JMP    EXIT
  350. L_7:
  351.     CALL    M_3
  352. M_2    DB    '   0'
  353. M_3:    POP    BX            ;GET FROM
  354.     MOV    CX,(Offset M_3)-(Offset M_2)    ;GET LEN
  355.     MOV    DX,(Offset LINENO)
  356.     CALL    MMOVE
  357.     MOV    BX,FCB+1
  358.     MOV    DX,(Offset FNAME)
  359.     MOV    CX,8
  360.     CALL    MMOVE
  361.     MOV    BX,FCB+9
  362.     MOV    DX,(Offset FNAME)+9
  363.     MOV    CX,3
  364.     CALL    MMOVE
  365.     PUSH    CX
  366.     PUSH    DX
  367.     PUSH    BX
  368.     MOV    CL,PRINT
  369.     MOV    DX,(Offset FILMSG)
  370.     INT    224
  371.     POP    BX
  372.     POP    DX
  373.     POP    CX
  374.     MOV    BX,0
  375.     MOV    Word Ptr EFCBCT,BX
  376. ;******>NEXTLN - SET UP NEXT LINE NUMBER.
  377. NEXTLN:    MOV    BX,(Offset LINENO)+3
  378. NEXT01:    MOV    AL,M            ;GET DIGIT
  379.     OR    AL,'0'            ;MAKE ASCII
  380.     INC    AL
  381.     MOV    M,AL
  382.     CMP    AL,'9'+1        ;CARRY?
  383.     JNZ    NEXTNC
  384.     MOV    M,'0'
  385.     DEC    BX
  386.     JMPS    NEXT01
  387. ;******>NEXTNC - READ A LINE FROM FILE.
  388. NEXTNC:    MOV    BX,(Offset LINE)
  389.     MOV    CH,0FFH            ;SO LONG LINE WON'T BLOW
  390. NEXT02:    INC    CH
  391.     JS    LONG            ;TOO LONG A LINE
  392.     PUSH    CX
  393.     PUSH    BX
  394.     MOV    BX,(Offset EFCB)
  395.     CALL    RDBYTE
  396.     POP    BX
  397.     POP    CX
  398.     MOV    M,AL
  399.     INC    BX
  400.     CMP    AL,EOF
  401.     JNZ    L_8    
  402.     JMP    NEXTFL            ;NEXT FILE
  403. L_8:
  404.     CMP    AL,LF
  405.     JNZ    NEXT02
  406.     JMPS    EOL
  407. ;******>LONG - GOT A LONG LINE, CHOP IT OFF.
  408. LONG:    MOV    M,CR
  409.     INC    BX
  410.     MOV    M,LF
  411. ;******>EOL - CHECK FOR OPERATOR ABORT, POINT TO STRING.
  412. EOL:
  413.     PUSH    CX
  414.     PUSH    DX
  415.     PUSH    BX
  416.     MOV    CL,CONST
  417.     INT    224
  418.     POP    BX
  419.     POP    DX
  420.     POP    CX
  421.     OR    AL,AL
  422.     JZ    L_9    
  423.     JMP    CHRXIT            ;ABORT REQUESTED
  424. L_9:
  425.     MOV    BX,(Offset STRING)
  426. ;******>XXXXXX - WE HAVE A LINE, NOW SCAN FOR THE STRING.
  427. ORLINE:    MOV    Word Ptr STRPTR,BX
  428.     MOV    BX,(Offset LINE)
  429. NEXTST:    XCHG    BX,DX
  430.     MOV    BX,Word Ptr STRPTR
  431.     XCHG    BX,DX            ;(HL)->LINE - (DE)->STRING
  432.     PUSH    BX
  433. ;******>NEXTC - REPLACE '_' WITH A TAB.
  434. NEXTC:    MOV    SI,DX
  435.     MOV    AL,[SI]
  436.     CMP    AL,'_'
  437.     JNZ    NOTAB
  438.     MOV    AL,TAB
  439. NOTAB:    INC    DX
  440.     OR    AL,AL            ;END OF STRING?
  441.     JZ    MATCHED
  442.     CMP    AL,'|'
  443.     JZ    MATCHED            ;FIRST PART
  444.     MOV    CL,M            ;FOR LOWER CASE TEST
  445.     CMP    AL,M
  446.     LAHF
  447.     INC    BX
  448.     SAHF
  449.     JZ    NEXTC
  450.     MOV    CH,AL            ;SAVE CHAR
  451.     MOV    AL,CL            ;GET CHAR
  452.     CMP    AL,61H            ;LOWER?
  453.     JB    NOTEQ            ;NO, SO NO MATCH
  454.     CMP    AL,7BH
  455.     JNB    NOTEQ
  456.     AND    AL,5FH            ;MAKE UPPER CASE
  457.     CMP    AL,CH
  458.     JZ    NEXTC            ;MATCHED
  459. NOTEQ:    POP    BX            ;RESTORE ADDR
  460.     INC    BX
  461.     MOV    AL,M
  462.     CMP    AL,CR
  463.     JNZ    NEXTST
  464.     MOV    BX,Word Ptr STRPTR
  465. ;******>FINDOR - IF AN "OR" (|) IS IN THE LINE, SCAN FOR IT.
  466. FINDOR:    MOV    AL,M
  467.     INC    BX
  468.     CMP    AL,'|'
  469.     JZ    ORLINE
  470.     OR    AL,AL
  471.     JNZ    FINDOR
  472.     JMP    NEXTLN
  473. ;******>MATCHED - GOT A MATCH PRINT IT.
  474. MATCHED:POP    BX            ;KILL STACKED ADDR
  475.     PUSH    CX
  476.     PUSH    DX
  477.     PUSH    BX
  478.     MOV    CL,PRINT
  479.     MOV    DX,(Offset LINENO)
  480.     INT    224
  481.     POP    BX
  482.     POP    DX
  483.     POP    CX
  484.     MOV    BX,(Offset LINE)
  485. MATCHLP:MOV    AL,M
  486.     MOV    DL,AL
  487.     PUSH    CX
  488.     PUSH    DX
  489.     PUSH    BX
  490.     MOV    CL,WRCON
  491.     INT    224
  492.     POP    BX
  493.     POP    DX
  494.     POP    CX
  495.     MOV    AL,M
  496.     INC    BX
  497.     CMP    AL,LF
  498.     JNZ    MATCHLP
  499.     JMP    NEXTLN
  500. ;******>CHRXIT - READ KEYBOARD, PRINT ABORT MESSAGE.
  501. CHRXIT:        
  502.     PUSH    CX
  503.     PUSH    DX
  504.     PUSH    BX
  505.     MOV    CL,RDCON
  506.     INT    224
  507.     POP    BX
  508.     POP    DX
  509.     POP    CX
  510.     PUSH    CX
  511.     PUSH    DX
  512.     PUSH    BX
  513.     MOV    CL,PRINT
  514.     MOV    DX,(Offset ABORT)
  515.     INT    224
  516.     POP    BX
  517.     POP    DX
  518.     POP    CX
  519. ;******>EXIT - RELEASE MEMORY AND RETURN OS
  520. EXIT:
  521.     MOV    CL,0
  522.     MOV    DL,0
  523.     INT    224
  524.  
  525. ;*****S>  SUBROUTINES
  526. ;*****S>
  527. ;*****S>RDBYTE - READ BYTE FROM FILE.
  528. ;*****S>  HL POINTS TO EFCB:
  529. ;*****S>  EFCB;
  530. ;*****S>      2 BYTE BUFFER ADDR
  531. ;*****S>      2 BYTE "BYTES LEFT" (INIT TO 0)
  532. ;*****S>      1 BYTE BUFFER SIZE (IN PAGES)
  533. ;*****S>      2 BYTE FCB ADDRESS
  534. ;*****S>
  535. RDBYTE:    MOV    DL,M            ;DE = BUFFER ADDR
  536.     INC    BX            ;X
  537.     MOV    DH,M            ;X
  538.     INC    BX            ;BC = BYTES LEFT
  539.     MOV    CL,M            ;X
  540.     INC    BX            ;X
  541.     MOV    CH,M            ;X
  542.     MOV    AL,CH            ;IF BYTE-COUNT NOT = ZERO
  543.     OR    AL,CL            ;   GO READ NEXT BYTE
  544.     JZ    L_10    
  545.     JMP    RDGETB            ; ELSE
  546. L_10:
  547.     INC    BX            ;   READ ANOTHER SECTOR.
  548.     MOV    AL,M            ;GET COUNT
  549.     ADD    AL,AL            ;MULTIPLY BY 2
  550.     MOV    CH,AL            ;SECTOR COUNT IN B
  551.     INC    BX            ;TO FCB
  552.     PUSH    BX            ;SAVE FCB POINTER
  553.     MOV    AL,M            ;GET..
  554.     INC    BX            ;..FCB..
  555.     MOV    BH,M            ;..ADDR..
  556.     MOV    BL,AL            ;..TO HL
  557. RDBLP:    MOV    AL,EOF            ;PUT EOF CHAR IN BUF
  558.     MOV    SI,DX            ;  IN CASE OF EOF.
  559.     MOV    [SI],AL
  560.     PUSH    DX            ;SAVE DMA ADDR
  561.     PUSH    BX            ;SAVE FCB ADDR
  562.     PUSH    CX
  563.     PUSH    DX
  564.     PUSH    BX
  565.     MOV    CL,STDMA
  566.     INT    224
  567.     POP    BX
  568.     POP    DX
  569.     POP    CX
  570.     POP    DX            ;GET FCB
  571.     PUSH    CX
  572.     PUSH    DX
  573.     PUSH    BX
  574.     MOV    CL,READ
  575.     INT    224
  576.     POP    BX
  577.     POP    DX
  578.     POP    CX
  579.     OR    AL,AL            ;CHECK FOR EOF
  580.     POP    BX            ;HL=DMA, DE=FCB
  581.     JNZ    RDBRET            ;GOT EOF
  582.     MOV    AL,BL            ;BUMP BUFFER POINTER
  583.     ADD    AL,80H            ;TO NEXT BUFF
  584.     MOV    BL,AL            ;X
  585.     MOV    AL,BH            ;X
  586.     ADC    AL,0            ;X
  587.     MOV    BH,AL            ;X
  588.     XCHG    BX,DX            ;DMA TO DE, FCB TO HL
  589.     DEC    CH            ;MORE SECTORS?
  590.     JZ    L_11    
  591.     JMP    RDBLP            ;YES, MORE
  592. L_11:
  593. RDBRET:    POP    BX            ;GET FCB POINTER
  594.     DEC    BX            ;TO LENGTH
  595.     MOV    AL,M            ;GET LENGTH
  596.     DEC    BX            ;TO COUNT
  597.     MOV    M,AL            ;SET PAGE COUNT
  598.     DEC    BX            ;TO LO COUNT
  599.     DEC    BX            ;TO HI FCB
  600.     DEC    BX            ;TO EFCB START
  601.     JMP    RDBYTE            ;LOOP THRU AGAIN
  602. RDGETB:    INC    BX            ;POINT TO BUFFER SIZE
  603.     MOV    AL,M            ;GET LENGTH (PAGES)
  604.     XCHG    BX,DX            ;BUFF TO HL
  605.     ADD    AL,BH            ;HL = END OF BUFF
  606.     MOV    BH,AL            ;X
  607.     MOV    AL,BL            ;X
  608.     SUB    AL,CL            ;HL = DATA POINTER
  609.     MOV    BL,AL            ;X
  610.     MOV    AL,BH            ;X
  611.     SBB    AL,CH            ;X
  612.     MOV    BH,AL            ;X
  613.     MOV    AL,M            ;GET BYTE
  614.     XCHG    BX,DX            ;EFCB POINTER BACK TO HL
  615.     CMP    AL,EOF            ;EOF?
  616.     JNZ    L_12    
  617.     RET                ;YES, LEAVE POINTERS
  618. L_12:
  619.     LAHF                ;DECR COUNT
  620.     DEC    CX
  621.     SAHF
  622.     LAHF                ;POINT BACK TO "BYTES LEFT"
  623.     DEC    BX
  624.     SAHF
  625.     MOV    M,CH            ;STORE BACK COUNT
  626.     LAHF                ;X
  627.     DEC    BX
  628.     SAHF
  629.     MOV    M,CL            ;X
  630.     RET                ;RETURN TO CALLER
  631. ;*****S>
  632. ;*****S>
  633. ;*****S>
  634. ;*****S>MFNAME - MULT-FILE ACCESS SUBROUTINE.
  635. ;*****S>
  636. ;*****S> MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  637. ;*****S> OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  638. ;*****S> ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  639. ;*****S> TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  640. ;*****S> IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  641. ;*****S> ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  642. ;*****S> MULTIPLE FILES.
  643. ;*****S> 
  644. ;*****S> JUST CALL "MFNAME" (MULTIPLE FILE NAME) AND THE FCB
  645. ;*****S> WILL BE SET UP WITH THE NEXT NAME, READY TO
  646. ;*****S> DO NORMAL PROCESSING (OPEN, READ, ETC.)
  647. ;*****S> 
  648. ;*****S> CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  649. ;*****S> 
  650. ;*****S> THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  651. ;*****S> EACH PSEUDO CODE STATEMENT IS IN <<...>>
  652. ;*****S> 
  653. MFNAME:    
  654.     PUSH    CX
  655.     PUSH    DX
  656.     PUSH    BX
  657.     MOV    CL,STDMA
  658.     MOV    DX,80H
  659.     INT    224
  660.     POP    BX
  661.     POP    DX
  662.     POP    CX
  663.     XOR    AL,AL
  664.     MOV    Byte Ptr .FCBEXT,AL
  665.     MOV    Byte Ptr .FCBRNO,AL
  666.     MOV    AL,Byte Ptr MFFLG1    ;<<IF FIRST TIME>>
  667.     OR    AL,AL
  668.     JNZ    MFN01
  669.     MOV    AL,1            ;  <<TURN OFF 1ST TIME SW>>
  670.     MOV    Byte Ptr MFFLG1,AL
  671.     MOV    BX,FCB
  672.     MOV    DX,(Offset MFREQ)
  673.     MOV    CX,12
  674.     CALL    MMOVE
  675.     MOV    AL,Byte Ptr .FCB
  676.     MOV    Byte Ptr MFCUR,AL
  677.     MOV    BX,(Offset MFREQ)
  678.     MOV    DX,FCB
  679.     MOV    CX,12
  680.     CALL    MMOVE
  681.     PUSH    CX
  682.     PUSH    DX
  683.     PUSH    BX
  684.     MOV    CL,SRCHF
  685.     MOV    DX,FCB
  686.     INT    224
  687.     POP    BX
  688.     POP    DX
  689.     POP    CX
  690.     JMPS    MFN02            ;<<ELSE>>
  691. MFN01:
  692.     MOV    BX,(Offset MFCUR)
  693.     MOV    DX,FCB
  694.     MOV    CX,12
  695.     CALL    MMOVE
  696.     PUSH    CX
  697.     PUSH    DX
  698.     PUSH    BX
  699.     MOV    CL,SRCHF
  700.     MOV    DX,FCB
  701.     INT    224
  702.     POP    BX
  703.     POP    DX
  704.     POP    CX
  705.     MOV    BX,(Offset MFREQ)
  706.     MOV    DX,FCB
  707.     MOV    CX,12
  708.     CALL    MMOVE
  709.     PUSH    CX
  710.     PUSH    DX
  711.     PUSH    BX
  712.     MOV    CL,SRCHN
  713.     MOV    DX,FCB
  714.     INT    224
  715.     POP    BX
  716.     POP    DX
  717.     POP    CX
  718. MFN02:    INC    AL            ;<<RETURN CARRY IF NOT FOUND>>
  719.     STC
  720.     JNZ    L_13
  721.     RET
  722. L_13:
  723.     DEC    AL            ;<<MOVE NAME FOUND TO CURR>>
  724.     AND    AL,3
  725.     ADD    AL,AL
  726.     ADD    AL,AL
  727.     ADD    AL,AL
  728.     ADD    AL,AL
  729.     ADD    AL,AL
  730.     ADD    AL,81H
  731.     MOV    BL,AL
  732.     MOV    BH,0
  733.     PUSH    BX
  734.     MOV    DX,(Offset MFCUR)+1
  735.     MOV    CX,11
  736.     CALL    MMOVE
  737.     POP    BX            ;<<MOVE NAME FOUND TO FCB>>
  738.     MOV    DX,FCB+1
  739.     MOV    CX,11
  740.     CALL    MMOVE
  741.     XOR    AL,AL            ;<<SETUP FCB>>
  742.     MOV    Byte Ptr .FCBEXT,AL
  743.     RET                ;<<RETURN>>
  744. BUFF    EQU    (Offset $)        ;DISK READ BUFER
  745.     END
  746.