home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / cpm / utils / f / freebase.ark / SEARCH.PRN < prev    next >
Encoding:
Text File  |  1988-02-05  |  27.3 KB  |  826 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.  0001 =         RDCON    EQU    1
  32.  0002 =         WRCON    EQU    2
  33.  0009 =         PRINT    EQU    9
  34.  000A =         RSTRING    EQU    10
  35.  000B =         CONST    EQU    11
  36.  000F =         OPEN    EQU    15
  37.  0010 =         CLOSE    EQU    16
  38.  0011 =         SRCHF    EQU    17
  39.  0012 =         SRCHN    EQU    18
  40.  0013 =         ERASE    EQU    19
  41.  0014 =         READ    EQU    20
  42.  0015 =         WRITE    EQU    21
  43.  0016 =         MAKE    EQU    22
  44.  0017 =         REN    EQU    23
  45.  001A =         STDMA    EQU    26
  46.                 
  47.  0005 =         BDOS    EQU    5
  48.  005C =         FCB    EQU    5CH 
  49.  006C =         FCB2    EQU    6CH
  50.  0068 =         FCBEXT    EQU    FCB+12
  51.  007C =         FCBRNO    EQU    FCB+32
  52.  0080 =         TBUFF    EQU    80H
  53.                 
  54.  000D =         CR    EQU    0DH
  55.  000A =         LF    EQU    0AH
  56.  001A =         EOF    EQU    1AH
  57.  0009 =         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.  0100               ORG    100H
  179.                 
  180.                 ;- FIND - 
  181.  0100 C32C05        JMP    START
  182.                 
  183.                 ;DATA AREA
  184.                 
  185.  0103 5345415243PGMID:    DB    'SEARCH - Version 1.0 7/2/84'    ;*>DAVID BROWN
  186.  011E 0D0A24        DB    CR,LF,'$'
  187.  0121 1A            DB    EOF
  188.                 
  189.  0122 4C49425241DFLTNAM:DB    'LIBRARY DAT'        ;DEFAULT FILE NAME
  190.                 
  191.  012D 0D0A2B2B46ABORT:    DB    CR,LF,'++FIND ABORTED++$'
  192.  0140 0D0A2B2B43NOFILE:    DB    CR,LF,'++CANNOT FIND'
  193.  014F 2D2D2D2D3EFILMSG:    DB    '----> FILE '
  194.  015A 5858585858FNAME:    DB    'XXXXXXXX.XXX'
  195.  0166 0D0A          DB    CR,LF
  196.  0168 0D0A24    CRLF:    DB    CR,LF,'$'
  197.  016B 1B2A      PROMPT: DB     27,42    ;BLOW AWAY SCREEN
  198.  016D 1B77          DB    27,119  ; SET UP FOR SETTING INTENSITY PER CHAR
  199.  016F 1B5D38            DB      27,93,56 ;ROW 1, COL 25 -- TO CENTER, I HOPE
  200.  0172 1B4734            DB      27,71,52 ; SET INTENSITY TO FULL BLAST
  201.  0175 4620522045    DB    'F R E E  B A S E  II'
  202.  0189 1B4730            DB      27,71,48 ; SHUT OFF INTENSITY
  203.  018C 0D0A          DB    CR,LF
  204.  018E 0D0A          DB    CR,LF
  205.  0190 0D0A              DB      CR,LF
  206.  0192 0D0A              DB      CR,LF
  207.  0194 1B5D38            DB      27,93,56 ;ROW 1, COL 25, TOO
  208.  0197 2020534541        DB      '  SEARCH  PROGRAM '
  209.  01A9 0D0A              DB      CR,LF
  210.  01AB 0D0A413E53    DB    CR,LF,'A>SEARCH File.Type [String]'
  211.  01C8 0D0A              DB      CR,LF
  212.  01CA 0D0A202020        DB      CR,LF,'          ^     ^     ^    '
  213.  01E7 0D0A202020        DB      CR,LF,'          |     |     |    ' 
  214.  0204 0D0A202020        DB      CR,LF,'          |     |     |_Object of Search'
  215.  022E 0D0A202020        DB      CR,LF,'          |     |_Type - can be *'
  216.  0251 0D0A202020        DB      CR,LF,'          |_Filename - can be *'
  217.  0272 0D0A202020        DB      CR,LF,'            Default = Library.Dat'
  218.  0295 0D0A0D0A          DB      CR,LF,CR,LF
  219.  0299 0D0A413E53    DB      CR,LF,'A>SEARCH  <-- Without Parameters for prompt.'
  220.  02C7 0D0A          DB      CR,LF
  221.  02C9 0D0A557070        DB      CR,LF,'Upper case locates Upper & Lower case Occurrences'
  222.  02FC 0D0A0D0A          DB      CR,LF,CR,LF  
  223.  0300 0000000000        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.  031D 0000000000        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.  033A 0000000000        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.  0351 0000000000        DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0
  227.  035F 1B71              DB      27,113     ; TURN ON READOUT
  228.  0361 0D0A576F72        DB    CR,LF,'Word or Phrase to Search For>'
  229.  0380 1B72              DB      27,114     ; TURN OFF READOUT
  230.  0382 0000000000        DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  231.  0391 07                DB      7      ; BLOW THE HORN  
  232.  0392 24                DB      '$'
  233.                     ;RDBYTE FIELDS
  234.  0393 5408      EFCB:    DW    BUFF        ;BUFFER ADDR
  235.  0395 0000      EFCBCT:    DW    0        ;BYTES LEFT
  236.  0397 14            DB    20        ;BUFFER SIZE (IN PAGES)
  237.  0398 5C00          DW    FCB        ;FCB ADDRESS
  238.                 
  239.                     ;MFNAME FIELDS
  240.  039A 00        MFFLG1:    DB    0        ;1ST TIME SW
  241.  039B           MFREQ:    DS    12        ;REQ NAME
  242.  03A7           MFCUR:    DS    12        ;CURR NAME
  243.                 
  244.  03B3 C9        CONBUF:    DB    CONLEN        ;LENGTH OF CONSOLE BUFFER
  245.  03B4           CONSIZ:    DS    1        ;RESULTING SIZE AFTER READ
  246.  03B5           STRING:    DS    200             ;WHAT TO SEARCH FOR
  247.  00C9 =         CONLEN    EQU    $-CONSIZ
  248.  047D 2020202009LINENO:    DB    '    ',TAB,'$'    ;LINE NUMBER
  249.                 
  250.  0483               DS    32        ;STACK AREA
  251.  04A3           STACK:    DS    2
  252.  04A5           STRPTR:    DS    2        ;POINTER FOR "|" SCAN
  253.  04A7           LINE:    DS    133
  254.                 
  255.                 ;END OF DATA AREA
  256.                 
  257.                 
  258.                 
  259.                 ;- SAVE STACK, PRINT SIGN-ON, LOOK FOR FILE SPEC.
  260.  052C 210000    START:    LXI    H,0        ;SAVE STACK
  261.  052F 39            DAD    SP
  262.  0530 22A304        SHLD    STACK
  263.  0533 31A304        LXI    SP,STACK
  264.                     CPM    PRINT,PGMID    ;PRINT SIGNON
  265.  0536+C5            PUSH    B
  266.  0537+D5            PUSH    D
  267.  0538+E5            PUSH    H
  268.  0539+0E09          MVI    C,PRINT
  269.  053B+110301        LXI    D,PGMID
  270.  053E+CD0500        CALL    BDOS
  271.  0541+E1            POP    H
  272.  0542+D1            POP    D
  273.  0543+C1            POP    B
  274.  0544 3A5D00        LDA    FCB+1
  275.  0547 FE20          CPI    ' '        ;IF A FILE WAS SPECIFIED
  276.  0549 C26905        JNZ    SETSTR        ;   GO SET UP STRING ENTERED
  277.                                 ; ELSE
  278.                     MOVE    DFLTNAM,FCB+1,11;   MOVE IN DEFAULT FILENAME
  279.  054C+C35A05        JMP    ??0001
  280.  054F+78        ?MOVE:    MOV    A,B
  281.  0550+B1            ORA    C
  282.  0551+C8            RZ
  283.  0552+7E            MOV    A,M
  284.  0553+12            STAX    D
  285.  0554+23            INX    H
  286.  0555+13            INX    D
  287.  0556+0B            DCX    B
  288.  0557+C34F05        JMP    ?MOVE
  289.  055A+212201        LXI    H,DFLTNAM
  290.  055D+115D00        LXI    D,FCB+1
  291.  0560+010B00        LXI    B,11
  292.  0563+CD4F05        CALL    ?MOVE
  293.  0566 C39005        JMP    GETSTR        ;   GO PROMPT FOR STRING.
  294.                 
  295.                 ;- SET STRING POINTERS, AND END DELIMITER.
  296.  0569 118000    SETSTR:    LXI    D,TBUFF        ;DE=TBUFF
  297.  056C 1A            LDAX    D        ;LENGTH
  298.  056D 4F            MOV    C,A        ;SAVE LENGTH
  299.  056E 0600          MVI    B,0        ;SETUP BC FOR MOVE
  300.  0570 13            INX    D        ;PAST LENGTH
  301.  0571 6F            MOV    L,A        ;L=LENGTH
  302.  0572 2600          MVI    H,0        ;HL=LENGTH
  303.  0574 19            DAD    D        ;HL=LAST CHAR
  304.  0575 3600          MVI    M,0        ;STORE END DELIM
  305.  0577 EB            XCHG            ;START TO HL
  306.                 
  307.                 ;SCAN - LOOK FOR STRING, IF FOUND SAVE IT.
  308.  0578 23        SCAN:    INX    H        ;TO NEXT CHAR
  309.  0579 7E            MOV    A,M        ;LOOK FOR ' '
  310.  057A B7            ORA    A        ;END?
  311.  057B CA9005        JZ    GETSTR        ;..YES, THEN GET IT FROM THE CONSOLE
  312.  057E FE20          CPI    ' '        ;
  313.  0580 C27805        JNZ    SCAN        ;NOT AT ' '
  314.  0583 23            INX    H        ;TO STRING
  315.                     MOVE    ,STRING,     ;HL = FROM, BC=LENGTH
  316.  0584+11B503        LXI    D,STRING
  317.  0587+CD4F05        CALL    ?MOVE
  318.  058A CDD005        CALL    FRSTFI        ;SEE IF FILE EXISTS
  319.  058D C31106        JMP    OPFILE        ;GO PROCESS IT
  320.                 
  321.                 ;GETSTR - ACCEPT STRING FROM CONSOLE.
  322.  0590 CDD005    GETSTR:    CALL    FRSTFI        ;LOOK FOR FILE
  323.                     CPM    PRINT,PROMPT    ;DISPLAY PROMPT
  324.  0593+C5            PUSH    B
  325.  0594+D5            PUSH    D
  326.  0595+E5            PUSH    H
  327.  0596+0E09          MVI    C,PRINT
  328.  0598+116B01        LXI    D,PROMPT
  329.  059B+CD0500        CALL    BDOS
  330.  059E+E1            POP    H
  331.  059F+D1            POP    D
  332.  05A0+C1            POP    B
  333.                     CPM    RSTRING,CONBUF    ;GET STRING
  334.  05A1+C5            PUSH    B
  335.  05A2+D5            PUSH    D
  336.  05A3+E5            PUSH    H
  337.  05A4+0E0A          MVI    C,RSTRING
  338.  05A6+11B303        LXI    D,CONBUF
  339.  05A9+CD0500        CALL    BDOS
  340.  05AC+E1            POP    H
  341.  05AD+D1            POP    D
  342.  05AE+C1            POP    B
  343.  05AF 3AB403        LDA    CONSIZ
  344.  05B2 B7            ORA    A
  345.  05B3 CA3D07        JZ    EXIT
  346.  05B6 6F            MOV    L,A        ;STORE DELIMITER
  347.  05B7 2600          MVI    H,0
  348.  05B9 11B503        LXI    D,STRING
  349.  05BC 19            DAD    D
  350.  05BD 3600          MVI    M,0
  351.                     CPM    PRINT,CRLF
  352.  05BF+C5            PUSH    B
  353.  05C0+D5            PUSH    D
  354.  05C1+E5            PUSH    H
  355.  05C2+0E09          MVI    C,PRINT
  356.  05C4+116801        LXI    D,CRLF
  357.  05C7+CD0500        CALL    BDOS
  358.  05CA+E1            POP    H
  359.  05CB+D1            POP    D
  360.  05CC+C1            POP    B
  361.  05CD C31106        JMP    OPFILE        ;PROCESS FILE
  362.                 
  363.                 ;FRSTFI - SEARCH FOR INITIAL FILE AND PRINT IT'S NAME.
  364.  05D0 CDA707    FRSTFI:    CALL    MFNAME        ;IF FILE DOES NOT EXIST
  365.  05D3 D0            RNC            ; TELL THEM AND EXIT.
  366.                     MOVE    FCB+1,FNAME,8
  367.  05D4+215D00        LXI    H,FCB+1
  368.  05D7+115A01        LXI    D,FNAME
  369.  05DA+010800        LXI    B,8
  370.  05DD+CD4F05        CALL    ?MOVE
  371.                     MOVE    FCB+9,FNAME+9,3
  372.  05E0+216500        LXI    H,FCB+9
  373.  05E3+116301        LXI    D,FNAME+9
  374.  05E6+010300        LXI    B,3
  375.  05E9+CD4F05        CALL    ?MOVE
  376.                     CPM    PRINT,NOFILE
  377.  05EC+C5            PUSH    B
  378.  05ED+D5            PUSH    D
  379.  05EE+E5            PUSH    H
  380.  05EF+0E09          MVI    C,PRINT
  381.  05F1+114001        LXI    D,NOFILE
  382.  05F4+CD0500        CALL    BDOS
  383.  05F7+E1            POP    H
  384.  05F8+D1            POP    D
  385.  05F9+C1            POP    B
  386.  05FA C33D07        JMP    EXIT
  387.                 
  388.                 ;NEXTFL - LOOK FOR ANOTHER FILE, IF NONE THEN EXIT.
  389.                 NEXTFL:    CPM    PRINT,CRLF
  390.  05FD+C5            PUSH    B
  391.  05FE+D5            PUSH    D
  392.  05FF+E5            PUSH    H
  393.  0600+0E09          MVI    C,PRINT
  394.  0602+116801        LXI    D,CRLF
  395.  0605+CD0500        CALL    BDOS
  396.  0608+E1            POP    H
  397.  0609+D1            POP    D
  398.  060A+C1            POP    B
  399.  060B CDA707        CALL    MFNAME
  400.  060E DA3D07        JC    EXIT
  401.                 
  402.                 ;OPFILE - OPEN FILE AND PRINT NAME.
  403.                 OPFILE:    CPM    OPEN,FCB
  404.  0611+C5            PUSH    B
  405.  0612+D5            PUSH    D
  406.  0613+E5            PUSH    H
  407.  0614+0E0F          MVI    C,OPEN
  408.  0616+115C00        LXI    D,FCB
  409.  0619+CD0500        CALL    BDOS
  410.  061C+E1            POP    H
  411.  061D+D1            POP    D
  412.  061E+C1            POP    B
  413.  061F 3C            INR    A
  414.  0620 CA3D07        JZ    EXIT
  415.                     MOVE    '   0',LINENO
  416.  0623+CD2A06        CALL    ??0003
  417.  0626+20202030  ??0002    DB    '   0'
  418.  062A+E1        ??0003    POP    H    ;GET FROM
  419.  062B+010400        LXI    B,??0003-??0002    ;GET LEN
  420.  062E+117D04        LXI    D,LINENO
  421.  0631+CD4F05        CALL    ?MOVE
  422.                     MOVE    FCB+1,FNAME,8
  423.  0634+215D00        LXI    H,FCB+1
  424.  0637+115A01        LXI    D,FNAME
  425.  063A+010800        LXI    B,8
  426.  063D+CD4F05        CALL    ?MOVE
  427.                     MOVE    FCB+9,FNAME+9,3
  428.  0640+216500        LXI    H,FCB+9
  429.  0643+116301        LXI    D,FNAME+9
  430.  0646+010300        LXI    B,3
  431.  0649+CD4F05        CALL    ?MOVE
  432.                     CPM    PRINT,FILMSG    ;SAY WHICH FILE
  433.  064C+C5            PUSH    B
  434.  064D+D5            PUSH    D
  435.  064E+E5            PUSH    H
  436.  064F+0E09          MVI    C,PRINT
  437.  0651+114F01        LXI    D,FILMSG
  438.  0654+CD0500        CALL    BDOS
  439.  0657+E1            POP    H
  440.  0658+D1            POP    D
  441.  0659+C1            POP    B
  442.  065A 210000        LXI    H,0
  443.  065D 229503        SHLD    EFCBCT
  444.                 
  445.                 ;NEXTLN - SET UP NEXT LINE NUMBER.
  446.  0660 218004    NEXTLN:    LXI    H,LINENO+3
  447.  0663 7E        NEXT01:    MOV    A,M        ;GET DIGIT
  448.  0664 F630          ORI    '0'        ;MAKE ASCII
  449.  0666 3C            INR    A
  450.  0667 77            MOV    M,A
  451.  0668 FE3A          CPI    '9'+1        ;CARRY?
  452.  066A C27306        JNZ    NEXTNC
  453.  066D 3630          MVI    M,'0'
  454.  066F 2B            DCX    H
  455.  0670 C36306        JMP    NEXT01
  456.                 
  457.                 ;NEXTNC - READ A LINE FROM FILE.
  458.  0673 21A704    NEXTNC:    LXI    H,LINE
  459.  0676 06FF          MVI    B,0FFH        ;SO LONG LINE WON'T BLOW
  460.  0678 04        NEXT02:    INR    B
  461.  0679 FA9506        JM    LONG        ;TOO LONG A LINE
  462.  067C C5            PUSH    B
  463.  067D E5            PUSH    H
  464.  067E 219303        LXI    H,EFCB
  465.  0681 CD4207        CALL    RDBYTE
  466.  0684 E1            POP    H
  467.  0685 C1            POP    B
  468.  0686 77            MOV    M,A
  469.  0687 23            INX    H
  470.  0688 FE1A          CPI    EOF
  471.  068A CAFD05        JZ    NEXTFL        ;NEXT FILE
  472.  068D FE0A          CPI    LF
  473.  068F C27806        JNZ    NEXT02
  474.  0692 C39A06        JMP    EOL
  475.                 
  476.                 ;LONG - GOT A LONG LINE, CHOP IT OFF.
  477.  0695 360D      LONG:    MVI    M,CR
  478.  0697 23            INX    H
  479.  0698 360A          MVI    M,LF
  480.                 
  481.                 ;EOL - CHECK FOR OPERATOR ABORT, POINT TO STRING.
  482.                 EOL:    CPM    CONST        ;TEST FOR ABORT
  483.  069A+C5            PUSH    B
  484.  069B+D5            PUSH    D
  485.  069C+E5            PUSH    H
  486.  069D+0E0B          MVI    C,CONST
  487.  069F+CD0500        CALL    BDOS
  488.  06A2+E1            POP    H
  489.  06A3+D1            POP    D
  490.  06A4+C1            POP    B
  491.  06A5 B7            ORA    A
  492.  06A6 C22407        JNZ    CHRXIT        ;ABORT REQUESTED
  493.  06A9 21B503        LXI    H,STRING
  494.                 
  495.                 ;XXXXXX - WE HAVE A LINE, NOW SCAN FOR THE STRING.
  496.  06AC 22A504    ORLINE:    SHLD    STRPTR
  497.  06AF 21A704        LXI    H,LINE
  498.  06B2 EB        NEXTST:    XCHG
  499.  06B3 2AA504        LHLD    STRPTR
  500.  06B6 EB            XCHG            ;(HL)->LINE - (DE)->STRING
  501.  06B7 E5            PUSH    H
  502.                 
  503.                 ;NEXTC - REPLACE '_' WITH A TAB.
  504.  06B8 1A        NEXTC:    LDAX    D
  505.  06B9 FE5F          CPI    '_'
  506.  06BB C2C006        JNZ    NOTAB
  507.  06BE 3E09          MVI    A,TAB
  508.  06C0 13        NOTAB:    INX    D
  509.  06C1 B7            ORA    A        ;END OF STRING?
  510.  06C2 CAFB06        JZ    MATCHED
  511.  06C5 FE7C          CPI    '|'
  512.  06C7 CAFB06        JZ    MATCHED        ;FIRST PART
  513.  06CA 4E            MOV    C,M        ;FOR LOWER CASE TEST
  514.  06CB BE            CMP    M
  515.  06CC 23            INX    H
  516.  06CD CAB806        JZ    NEXTC
  517.  06D0 47            MOV    B,A        ;SAVE CHAR
  518.  06D1 79            MOV    A,C        ;GET CHAR
  519.  06D2 FE61          CPI    61H        ;LOWER?
  520.  06D4 DAE206        JC    NOTEQ        ;NO, SO NO MATCH
  521.  06D7 FE7B          CPI    7BH
  522.  06D9 D2E206        JNC    NOTEQ
  523.  06DC E65F          ANI    5FH        ;MAKE UPPER CASE
  524.  06DE B8            CMP    B
  525.  06DF CAB806        JZ    NEXTC        ;MATCHED
  526.                 
  527.  06E2 E1        NOTEQ:    POP    H        ;RESTORE ADDR
  528.  06E3 23            INX    H
  529.  06E4 7E            MOV    A,M
  530.  06E5 FE0D          CPI    CR
  531.  06E7 C2B206        JNZ    NEXTST
  532.  06EA 2AA504        LHLD    STRPTR
  533.                 
  534.                 ;FINDOR - IF AN "OR" (|) IS IN THE LINE, SCAN FOR IT.
  535.  06ED 7E        FINDOR:    MOV    A,M
  536.  06EE 23            INX    H
  537.  06EF FE7C          CPI    '|'
  538.  06F1 CAAC06        JZ    ORLINE
  539.  06F4 B7            ORA    A
  540.  06F5 C2ED06        JNZ    FINDOR
  541.  06F8 C36006        JMP    NEXTLN
  542.                 
  543.                 ;MATCHED - GOT A MATCH PRINT IT.
  544.  06FB E1        MATCHED:POP    H        ;KILL STACKED ADDR
  545.                     CPM    PRINT,LINENO    ;PRINT LINE NUMBER
  546.  06FC+C5            PUSH    B
  547.  06FD+D5            PUSH    D
  548.  06FE+E5            PUSH    H
  549.  06FF+0E09          MVI    C,PRINT
  550.  0701+117D04        LXI    D,LINENO
  551.  0704+CD0500        CALL    BDOS
  552.  0707+E1            POP    H
  553.  0708+D1            POP    D
  554.  0709+C1            POP    B
  555.  070A 21A704        LXI    H,LINE
  556.  070D 7E        MATCHLP:MOV    A,M
  557.  070E 5F            MOV    E,A
  558.                     CPM    WRCON
  559.  070F+C5            PUSH    B
  560.  0710+D5            PUSH    D
  561.  0711+E5            PUSH    H
  562.  0712+0E02          MVI    C,WRCON
  563.  0714+CD0500        CALL    BDOS
  564.  0717+E1            POP    H
  565.  0718+D1            POP    D
  566.  0719+C1            POP    B
  567.  071A 7E            MOV    A,M
  568.  071B 23            INX    H
  569.  071C FE0A          CPI    LF
  570.  071E C20D07        JNZ    MATCHLP
  571.  0721 C36006        JMP    NEXTLN
  572.                 
  573.                 ;CHRXIT - READ KEYBOARD, PRINT ABORT MESSAGE.
  574.                 CHRXIT:    CPM    RDCON
  575.  0724+C5            PUSH    B
  576.  0725+D5            PUSH    D
  577.  0726+E5            PUSH    H
  578.  0727+0E01          MVI    C,RDCON
  579.  0729+CD0500        CALL    BDOS
  580.  072C+E1            POP    H
  581.  072D+D1            POP    D
  582.  072E+C1            POP    B
  583.                     CPM    PRINT,ABORT
  584.  072F+C5            PUSH    B
  585.  0730+D5            PUSH    D
  586.  0731+E5            PUSH    H
  587.  0732+0E09          MVI    C,PRINT
  588.  0734+112D01        LXI    D,ABORT
  589.  0737+CD0500        CALL    BDOS
  590.  073A+E1            POP    H
  591.  073B+D1            POP    D
  592.  073C+C1            POP    B
  593.                 
  594.                 ;EXIT - RESTORE STACK AND RETURN TO CP/M.
  595.  073D 2AA304    EXIT:    LHLD    STACK
  596.  0740 F9            SPHL
  597.  0741 C9            RET            ;TO CCP
  598.                 
  599.                 ;SUBROUTINES
  600.                 ;
  601.                 ;RDBYTE - READ BYTE FROM FILE.
  602.                 ;  HL POINTS TO EFCB:
  603.                 ;  EFCB;
  604.                 ;      2 BYTE BUFFER ADDR
  605.                 ;      2 BYTE "BYTES LEFT" (INIT TO 0)
  606.                 ;      1 BYTE BUFFER SIZE (IN PAGES)
  607.                 ;      2 BYTE FCB ADDRESS
  608.                 ;
  609.  0742 5E        RDBYTE:    MOV    E,M        ;DE = BUFFER ADDR
  610.  0743 23            INX    H        ;X
  611.  0744 56            MOV    D,M        ;X
  612.  0745 23            INX    H        ;BC = BYTES LEFT
  613.  0746 4E            MOV    C,M        ;X
  614.  0747 23            INX    H        ;X
  615.  0748 46            MOV    B,M        ;X
  616.  0749 78            MOV    A,B        ;IF BYTE-COUNT NOT = ZERO
  617.  074A B1            ORA    C        ;   GO READ NEXT BYTE
  618.  074B C29107        JNZ    RDGETB        ; ELSE
  619.  074E 23            INX    H        ;   READ ANOTHER SECTOR.
  620.  074F 7E            MOV    A,M        ;GET COUNT
  621.  0750 87            ADD    A        ;MULTIPLY BY 2
  622.  0751 47            MOV    B,A        ;SECTOR COUNT IN B
  623.  0752 23            INX    H        ;TO FCB
  624.  0753 E5            PUSH    H        ;SAVE FCB POINTER
  625.  0754 7E            MOV    A,M        ;GET..
  626.  0755 23            INX    H        ;..FCB..
  627.  0756 66            MOV    H,M        ;..ADDR..
  628.  0757 6F            MOV    L,A        ;..TO HL
  629.                 
  630.  0758 3E1A      RDBLP:    MVI    A,EOF        ;PUT EOF CHAR IN BUF
  631.  075A 12            STAX    D        ;  IN CASE OF EOF.
  632.  075B D5            PUSH    D        ;SAVE DMA ADDR
  633.  075C E5            PUSH    H        ;SAVE FCB ADDR
  634.                     CPM    STDMA        ;SET DMA ADDR
  635.  075D+C5            PUSH    B
  636.  075E+D5            PUSH    D
  637.  075F+E5            PUSH    H
  638.  0760+0E1A          MVI    C,STDMA
  639.  0762+CD0500        CALL    BDOS
  640.  0765+E1            POP    H
  641.  0766+D1            POP    D
  642.  0767+C1            POP    B
  643.  0768 D1            POP    D        ;GET FCB
  644.                     CPM    READ        ;READ SECTOR
  645.  0769+C5            PUSH    B
  646.  076A+D5            PUSH    D
  647.  076B+E5            PUSH    H
  648.  076C+0E14          MVI    C,READ
  649.  076E+CD0500        CALL    BDOS
  650.  0771+E1            POP    H
  651.  0772+D1            POP    D
  652.  0773+C1            POP    B
  653.  0774 B7            ORA    A        ;CHECK FOR EOF
  654.  0775 E1            POP    H        ;HL=DMA, DE=FCB
  655.  0776 C28607        JNZ    RDBRET        ;GOT EOF
  656.  0779 7D            MOV    A,L        ;BUMP BUFFER POINTER
  657.  077A C680          ADI    80H        ;TO NEXT BUFF
  658.  077C 6F            MOV    L,A        ;X
  659.  077D 7C            MOV    A,H        ;X
  660.  077E CE00          ACI    0        ;X
  661.  0780 67            MOV    H,A        ;X
  662.  0781 EB            XCHG            ;DMA TO DE, FCB TO HL
  663.  0782 05            DCR    B        ;MORE SECTORS?
  664.  0783 C25807        JNZ    RDBLP        ;YES, MORE
  665.  0786 E1        RDBRET:    POP    H        ;GET FCB POINTER
  666.  0787 2B            DCX    H        ;TO LENGTH
  667.  0788 7E            MOV    A,M        ;GET LENGTH
  668.  0789 2B            DCX    H        ;TO COUNT
  669.  078A 77            MOV    M,A        ;SET PAGE COUNT
  670.  078B 2B            DCX    H        ;TO LO COUNT
  671.  078C 2B            DCX    H        ;TO HI FCB
  672.  078D 2B            DCX    H        ;TO EFCB START
  673.  078E C34207        JMP    RDBYTE        ;LOOP THRU AGAIN
  674.                 
  675.  0791 23        RDGETB:    INX    H        ;POINT TO BUFFER SIZE
  676.  0792 7E            MOV    A,M        ;GET LENGTH (PAGES)
  677.  0793 EB            XCHG            ;BUFF TO HL
  678.  0794 84            ADD    H        ;HL = END OF BUFF
  679.  0795 67            MOV    H,A        ;X
  680.  0796 7D            MOV    A,L        ;X
  681.  0797 91            SUB    C        ;HL = DATA POINTER
  682.  0798 6F            MOV    L,A        ;X
  683.  0799 7C            MOV    A,H        ;X
  684.  079A 98            SBB    B        ;X
  685.  079B 67            MOV    H,A        ;X
  686.  079C 7E            MOV    A,M        ;GET BYTE
  687.  079D EB            XCHG            ;EFCB POINTER BACK TO HL
  688.  079E FE1A          CPI    EOF        ;EOF?
  689.  07A0 C8            RZ            ;YES, LEAVE POINTERS
  690.  07A1 0B            DCX    B        ;DECR COUNT
  691.  07A2 2B            DCX    H        ;POINT BACK TO "BYTES LEFT"
  692.  07A3 70            MOV    M,B        ;STORE BACK COUNT
  693.  07A4 2B            DCX    H        ;X
  694.  07A5 71            MOV    M,C        ;X
  695.  07A6 C9            RET            ;RETURN TO CALLER
  696.                 
  697.                 
  698.                 
  699.                 
  700.                 ;MFNAME - MULT-FILE ACCESS SUBROUTINE.
  701.                 ;
  702.                 ; MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  703.                 ; OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  704.                 ; ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  705.                 ; TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  706.                 ; IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  707.                 ; ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  708.                 ; MULTIPLE FILES.
  709.                 ; 
  710.                 ; JUST CALL "MFNAME" (MULTIPLE FILE NAME) AND THE FCB
  711.                 ; WILL BE SET UP WITH THE NEXT NAME, READY TO
  712.                 ; DO NORMAL PROCESSING (OPEN, READ, ETC.)
  713.                 ; 
  714.                 ; CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  715.                 ; 
  716.                 ; THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  717.                 ; EACH PSEUDO CODE STATEMENT IS IN <<...>>
  718.                 ; 
  719.                 MFNAME:    CPM    STDMA,80H    ;<<INIT DMA ADDR, FCB>>
  720.  07A7+C5            PUSH    B
  721.  07A8+D5            PUSH    D
  722.  07A9+E5            PUSH    H
  723.  07AA+0E1A          MVI    C,STDMA
  724.  07AC+118000        LXI    D,80H
  725.  07AF+CD0500        CALL    BDOS
  726.  07B2+E1            POP    H
  727.  07B3+D1            POP    D
  728.  07B4+C1            POP    B
  729.  07B5 AF            XRA    A 
  730.  07B6 326800        STA    FCBEXT
  731.  07B9 327C00        STA    FCBRNO
  732.                 
  733.  07BC 3A9A03        LDA    MFFLG1        ;<<IF FIRST TIME>>
  734.  07BF B7            ORA    A
  735.  07C0 C2F707        JNZ    MFN01
  736.  07C3 3E01          MVI    A,1        ;  <<TURN OFF 1ST TIME SW>>
  737.  07C5 329A03        STA    MFFLG1
  738.                     MOVE    FCB,MFREQ,12    ;  <<SAVE THE REQUESTED NAME>>
  739.  07C8+215C00        LXI    H,FCB
  740.  07CB+119B03        LXI    D,MFREQ
  741.  07CE+010C00        LXI    B,12
  742.  07D1+CD4F05        CALL    ?MOVE
  743.  07D4 3A5C00        LDA    FCB
  744.  07D7 32A703        STA    MFCUR
  745.                     MOVE    MFREQ,FCB,12    ;  <<SRCHF REQ NAME>>
  746.  07DA+219B03        LXI    H,MFREQ
  747.  07DD+115C00        LXI    D,FCB
  748.  07E0+010C00        LXI    B,12
  749.  07E3+CD4F05        CALL    ?MOVE
  750.                     CPM    SRCHF,FCB
  751.  07E6+C5            PUSH    B
  752.  07E7+D5            PUSH    D
  753.  07E8+E5            PUSH    H
  754.  07E9+0E11          MVI    C,SRCHF
  755.  07EB+115C00        LXI    D,FCB
  756.  07EE+CD0500        CALL    BDOS
  757.  07F1+E1            POP    H
  758.  07F2+D1            POP    D
  759.  07F3+C1            POP    B
  760.  07F4 C32B08        JMP    MFN02        ;<<ELSE>>
  761.                 
  762.                 MFN01:    MOVE    MFCUR,FCB,12    ;  <<SRCHF CURR NAME>>
  763.  07F7+21A703        LXI    H,MFCUR
  764.  07FA+115C00        LXI    D,FCB
  765.  07FD+010C00        LXI    B,12
  766.  0800+CD4F05        CALL    ?MOVE
  767.                     CPM    SRCHF,FCB
  768.  0803+C5            PUSH    B
  769.  0804+D5            PUSH    D
  770.  0805+E5            PUSH    H
  771.  0806+0E11          MVI    C,SRCHF
  772.  0808+115C00        LXI    D,FCB
  773.  080B+CD0500        CALL    BDOS
  774.  080E+E1            POP    H
  775.  080F+D1            POP    D
  776.  0810+C1            POP    B
  777.                     MOVE    MFREQ,FCB,12    ;  <<SRCHN REQ NAME>>
  778.  0811+219B03        LXI    H,MFREQ
  779.  0814+115C00        LXI    D,FCB
  780.  0817+010C00        LXI    B,12
  781.  081A+CD4F05        CALL    ?MOVE
  782.                     CPM    SRCHN,FCB    ;<<ENDIF>>
  783.  081D+C5            PUSH    B
  784.  081E+D5            PUSH    D
  785.  081F+E5            PUSH    H
  786.  0820+0E12          MVI    C,SRCHN
  787.  0822+115C00        LXI    D,FCB
  788.  0825+CD0500        CALL    BDOS
  789.  0828+E1            POP    H
  790.  0829+D1            POP    D
  791.  082A+C1            POP    B
  792.                                 
  793.  082B 3C        MFN02:    INR    A        ;<<RETURN CARRY IF NOT FOUND>>
  794.  082C 37            STC
  795.  082D C8            RZ
  796.                 
  797.  082E 3D            DCR    A        ;<<MOVE NAME FOUND TO CURR>>
  798.  082F E603          ANI    3
  799.  0831 87            ADD    A
  800.  0832 87            ADD    A
  801.  0833 87            ADD    A
  802.  0834 87            ADD    A
  803.  0835 87            ADD    A
  804.  0836 C681          ADI    81H
  805.  0838 6F            MOV    L,A
  806.  0839 2600          MVI    H,0
  807.  083B E5            PUSH    H
  808.                     MOVE    ,MFCUR+1,11
  809.  083C+11A803        LXI    D,MFCUR+1
  810.  083F+010B00        LXI    B,11
  811.  0842+CD4F05        CALL    ?MOVE
  812.                 
  813.  0845 E1            POP    H        ;<<MOVE NAME FOUND TO FCB>>
  814.                     MOVE    ,FCB+1,11
  815.  0846+115D00        LXI    D,FCB+1
  816.  0849+010B00        LXI    B,11
  817.  084C+CD4F05        CALL    ?MOVE
  818.                 
  819.  084F AF            XRA    A        ;<<SETUP FCB>>
  820.  0850 326800        STA    FCBEXT
  821.  0853 C9            RET            ;<<RETURN>>
  822.                 
  823.  0854 =         BUFF    EQU    $        ;DISK READ BUFER
  824.                 
  825.  0854               END
  826.