home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol009 / find3-18.asm < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  545 lines

  1. ;FIND.ASM 
  2. ;
  3. ;    06/23/79
  4. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  5. ;    01/27/80
  6. ;PUT IN CTL-C BREAK
  7. ;    02/27/80
  8. ;TRANSLATE FILE READ CHARS TO UPPER CASE
  9. ;SO CASE DOESN'T MATTER IN FILE CONTENTS.
  10. ;ALSO PUT IN "JUST IN CASE" TEST FOR LINE
  11. ;LONGER THAN 128.
  12. ;    03/18/80
  13. ;MAKE "_" MATCH A TAB; MAKE "|" AN "OR"
  14. ;AS IN: FIND B:*.ASM _IN_|_OUT_
  15. ;    ----------------
  16. ;USED TO DO A CHARACTER STRING SEARCH
  17. ;OF ONE OR MORE FILES.  ANY ASCII STRING
  18. ;MAY BE SEARCHED FOR.  CASE DOESN'T MATTER.
  19. ;
  20. ;COMMAND FORMAT:
  21. ;
  22. ;    FIND FILENAME STRING
  23. ;
  24. ;FILENAME MAY BE AMBIGUOUS, 
  25. ;    E.G. *.ASM OR CBBS*.ASM
  26. ;
  27. ;"_" IN STRING WILL MATCH A TAB.
  28. ;
  29. CR    EQU    0DH
  30. LF    EQU    0AH
  31. EOF    EQU    1AH
  32. TAB    EQU    9
  33. ;
  34. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  35. CF    SET    0    ;SHOW COMP NOT REQUESTED
  36. ;
  37. ;(FROM EQU8.LIB...)
  38. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  39. ;
  40. ;DEFINE DATA MOVE MACRO: MOVE from,to,length
  41. ;    from may be addr, or quoted string
  42. ;
  43. MOVE    MACRO    ?F,?T,?L
  44.     IF    NOT NUL ?F
  45.     IRPC    ?C,?F
  46. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  47.     EXITM
  48.     ENDM
  49.     IF    ?Q EQ ''''
  50.     LOCAL    ?B,?Z
  51.     CALL    ?Z
  52. ?B    DB    ?F
  53. ?Z    POP    H    ;GET FROM
  54.     LXI    B,?Z-?B    ;GET LEN
  55.     ELSE
  56.     LXI    H,?F
  57.     ENDIF
  58.     ENDIF
  59.     IF    NOT NUL ?T
  60.     LXI    D,?T
  61.     ENDIF
  62.     IF    NOT NUL ?L
  63.     LXI    B,?L
  64.     ENDIF
  65.     CALL    MOVER
  66. MF    SET    -1    ;;SHOW EXPANSION
  67.     ENDM
  68. ;COMPARE MACRO
  69. COMP    MACRO    ?F,?T,?L
  70.     IF    NOT NUL ?F
  71.     IRPC    ?C,?F
  72. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  73.     EXITM
  74.     ENDM
  75.     IF    ?Q EQ ''''
  76.     LOCAL    ?B,?Z
  77.     CALL    ?Z
  78. ?B    DB    ?F
  79. ?Z    POP    H    ;GET FROM
  80.     LXI    B,?Z-?B    ;GET LEN
  81.     ELSE
  82.     LXI    H,?F
  83.     ENDIF
  84.     ENDIF
  85.     IF    NOT NUL ?T
  86.     LXI    D,?T
  87.     ENDIF
  88.     IF    NOT NUL ?L
  89.     LXI    B,?L
  90.     ENDIF
  91.     IF    NOT NUL ?I
  92.     LOCAL    ?B,?Z
  93.     CALL    ?Z
  94. ?B    DB    ?I
  95. ?Z    POP    D    ;GET TO
  96.     LXI    B,?Z-?B
  97.     ENDIF
  98.     CALL    COMPR
  99. CF    SET    -1    ;;SHOW EXPANSION
  100.     ENDM
  101. ;
  102. ;DEFINE CP/M MACRO - CPM FNC,PARM
  103. ;
  104. CPM    MACRO    ?F,?P
  105.     PUSH    B
  106.     PUSH    D
  107.     PUSH    H
  108.     IF    NOT NUL ?F
  109.     MVI    C,?F
  110.     ENDIF
  111.     IF    NOT NUL ?P
  112.     LXI    D,?P
  113.     ENDIF
  114.     CALL    BDOS
  115.     POP    H
  116.     POP    D
  117.     POP    B
  118.     ENDM
  119. ;
  120.     ORG    100H
  121.     CALL    START
  122.     DB    'FIND.COM '
  123.     DB    '03/18/80'
  124.     DB    0DH,0AH,'$'
  125. START    POP    D    ;GET ID
  126.     MVI    C,PRINT
  127.     CALL    BDOS    ;PRINT ID
  128. ;
  129. ;INIT LOCAL STACK
  130. ;
  131.     LXI    H,0
  132.     DAD    SP
  133.     SHLD    STACK
  134.     LXI    SP,STACK
  135. ;
  136. ;START OF PROGRAM EXECUTION
  137. ;
  138.     LDA    FCB+1
  139.     CPI    ' '
  140.     JNZ    GETSTR
  141.     CALL    ERXIT
  142.     DB    '++NO FILE NAME++$'
  143. ;
  144. ;FIND START OF STRING IN TBUFF
  145. ;
  146. GETSTR    LXI    D,80H    ;DE=TBUFF
  147.     LDAX    D    ;LENGTH
  148.     MOV    C,A    ;SAVE LENGTH
  149.     MVI    B,0    ;SETUP BC FOR MOVE
  150.     INX    D    ;PAST LENGTH
  151.     MOV    L,A    ;L=LENGTH
  152.     MVI    H,0    ;HL=LENGTH
  153.     DAD    D    ;HL=LAST CHAR
  154.     MVI    M,0    ;STORE END DELIM
  155. ;
  156. ;SCAN FOR START OF STRING
  157. ;
  158.     XCHG        ;START TO HL
  159. SCAN    INX    H    ;TO NEXT CHAR
  160.     MOV    A,M    ;LOOK FOR ' '
  161.     ORA    A    ;END?
  162.     JZ    BADSTR    ;..YES, BAD
  163.     CPI    ' '
  164.     JNZ    SCAN    ;NOT AT ' '
  165.     INX    H    ;TO STRING
  166. ;
  167.     MOVE    ,STRING, ;HL = FROM, BC=LENGTH
  168. NEXTFL    CALL    MFNAME    ;GET NEXT
  169.     JC    EXIT
  170.     CPM    OPEN,FCB
  171.     INR    A
  172.     JZ    EXIT
  173.     MOVE    '   0',LINENO
  174.     MOVE    FCB+1,FNAME,8
  175.     MOVE    FCB+9,FNAME+9,3
  176.     CALL    ILPRT
  177.     DB    '----> FILE '
  178. FNAME    DB    'XXXXXXXX.XXX'
  179.     DB    CR,LF,0
  180.     LXI    H,0
  181.     SHLD    EFCBCT    ;ZERO COUNT
  182. ;
  183. ;BUMP ASCII LINE #
  184. ;
  185. NEXTLN    LXI    H,LINENO+3
  186. NEXTADD    MOV    A,M    ;GET DIGIT
  187.     ORI    '0'    ;MAKE ASCII
  188.     INR    A
  189.     MOV    M,A
  190.     CPI    '9'+1    ;CARRY?
  191.     JNZ    NEXTNC
  192.     MVI    M,'0'
  193.     DCX    H
  194.     JMP    NEXTADD
  195. ;
  196. NEXTNC    LXI    H,LINE
  197.     MVI    B,0FFH    ;SO LONG LINE WON'T BLOW
  198. NEXTLC    INR    B
  199.     JM    LONG    ;TOO LONG A LINE
  200.     PUSH    B
  201.     PUSH    H
  202.     LXI    H,EFCB
  203.     CALL    RDBYTE
  204.     POP    H
  205.     POP    B
  206.     MOV    M,A
  207.     INX    H
  208.     CPI    EOF
  209.     JZ    NEXTFL    ;NEXT FILE
  210.     CPI    LF
  211.     JNZ    NEXTLC
  212.     JMP    EOL
  213. ;
  214. ;GOT A LONG LINE - STICK CRLF IN MIDDLE
  215. ;
  216. LONG    MVI    M,0DH
  217.     INX    H
  218.     MVI    M,0AH
  219. EOL    CPM    CONST    ;TEST FOR ABORT
  220.     ORA    A
  221.     JNZ    CHREXIT    ;ABORT REQUESTED
  222. ;
  223. ;READ IN A LINE, NOW SCAN FOR THE STRING
  224. ;
  225.     LXI    H,STRING
  226. ORLINE    SHLD    STRPTR
  227.     LXI    H,LINE
  228. NEXTST    XCHG
  229.     LHLD    STRPTR
  230.     XCHG
  231.     PUSH    H
  232. NEXTC    LDAX    D
  233.     CPI    '_'
  234.     JNZ    NOTAB
  235.     MVI    A,TAB
  236. NOTAB    INX    D
  237.     ORA    A    ;END OF STRING?
  238.     JZ    MATCHED
  239.     CPI    '|'
  240.     JZ    MATCHED    ;FIRST PART
  241.     MOV    C,M    ;FOR LOWER CASE TEST
  242.     CMP    M
  243.     INX    H
  244.     JZ    NEXTC
  245.     MOV    B,A    ;SAVE CHAR
  246.     MOV    A,C    ;GET CHAR
  247.     CPI    61H    ;LOWER?
  248.     JC    NOTEQ    ;NO, SO NO MATCH
  249.     CPI    7BH
  250.     JNC    NOTEQ
  251.     ANI    5FH    ;MAKE UPPER CASE
  252.     CMP    B
  253.     JZ    NEXTC    ;MATCHED
  254. NOTEQ    POP    H    ;RESTORE ADDR
  255.     INX    H
  256.     MOV    A,M
  257.     CPI    CR
  258.     JNZ    NEXTST
  259. ;
  260. ;IF AN "OR" (|) IS IN THE LINE, SCAN FOR IT
  261. ;
  262.     LHLD    STRPTR
  263. FINDOR    MOV    A,M
  264.     INX    H
  265.     CPI    '|'
  266.     JZ    ORLINE
  267.     ORA    A
  268.     JNZ    FINDOR
  269.     JMP    NEXTLN
  270. ;
  271. ;GOT MATCH, PRINT IT
  272. ;
  273. MATCHED    POP    H    ;KILL STACKED ADDR
  274.     CALL    ILPRT
  275. LINENO    DB    '    ',TAB,0
  276. ;
  277.     LXI    H,LINE
  278. MATCHLP    MOV    A,M
  279.     MOV    E,A
  280.     CPM    WRCON
  281.     MOV    A,M
  282.     INX    H
  283.     CPI    LF
  284.     JNZ    MATCHLP
  285.     JMP    NEXTLN
  286. ;
  287. ;INLINE PRINT - CALL ILPRT FOLLOWED BY MSG,
  288. ;WHICH ENDS IN A: 0
  289. ;
  290. ILPRT    XTHL        ;GET MSG ADDR, SAVE HL
  291. ILPLP    MOV    E,M
  292.     CPM    WRCON
  293.     INX    H
  294.     MOV    A,M
  295.     ORA    A    ;END?
  296.     JNZ    ILPLP
  297.     XTHL
  298.     RET
  299. ;
  300. BADSTR    CALL    ERXIT
  301.     DB    '++BAD STRING++$'
  302. ;
  303. ;FOLLOWING FROM 'EQU8.LIB'---->
  304. ;
  305. ;MOVE, COMPARE SUBROUTINES
  306. ;
  307.     IF    MF    ;MACRO EXPANSION FLAG SET?
  308. ;
  309. MOVER    MOV    A,M
  310.     STAX    D
  311.     INX    H
  312.     INX    D
  313.     DCX    B
  314.     MOV    A,B
  315.     ORA    C
  316.     JNZ    MOVER
  317.     RET
  318.     ENDIF
  319. ;
  320.     IF    CF    ;MACRO EXPANSION FLAG SET?
  321. COMPR    LDAX    D
  322.     CMP    M
  323.     RNZ
  324.     INX    D
  325.     INX    H
  326.     DCX    B
  327.     MOV    A,B
  328.     ORA    C
  329.     JNZ    COMPR
  330.     RET
  331.     ENDIF
  332. ;
  333. ;    FROM EQU8.LIB: AS OF 05/06/79
  334. ;
  335. ;RDBYTE, HL POINTS TO EXTENDED FCB:
  336. ;
  337. ;    2 BYTE BUFFER ADDR
  338. ;    2 BYTE "BYTES LEFT" (INIT TO 0)
  339. ;    1 BYTE BUFFER SIZE (IN PAGES)
  340. ;    2 BYTE FCB ADDRESS
  341. ;
  342. RDBYTE    MOV    E,M
  343.     INX    H
  344.     MOV    D,M    ;GET BUFFER ADDR
  345.     INX    H
  346.     MOV    C,M
  347.     INX    H
  348.     MOV    B,M    ;BC = BYTES LEFT
  349.     MOV    A,B    ;GET COUNT
  350.     ORA    C
  351.     JNZ    RDBNORD    ;NO READ
  352. ;
  353.     INX    H    ;TO BUFFER SIZE
  354.     MOV    A,M    ;GET COUNT
  355.     ADD    A    ;MULTIPLY BY 2
  356.     MOV    B,A    ;SECTOR COUNT IN B
  357.     INX    H    ;TO FCB
  358.     PUSH    H    ;SAVE FCB POINTER
  359.     MOV    A,M    ;GET..
  360.     INX    H    ;..FCB..
  361.     MOV    H,M    ;..ADDR..
  362.     MOV    L,A    ;..TO HL
  363. ;
  364. RDBLP    MVI    A,1AH    ;GET EOF CHAR
  365.     STAX    D    ;SAVE IN CASE EOF
  366.     PUSH    D    ;SAVE DMA ADDR
  367.     PUSH    H    ;SAVE FCB ADDR
  368.     CPM    STDMA    ;SET DMA ADDR
  369.     POP    D    ;GET FCB
  370.     CPM    READ
  371.     ORA    A
  372.     POP    H    ;HL=DMA, DE=FCB
  373.     JNZ    RDBRET    ;GOT EOF
  374.     MOV    A,L
  375.     ADI    80H    ;TO NEXT BUFF
  376.     MOV    L,A
  377.     MOV    A,H
  378.     ACI    0
  379.     MOV    H,A
  380.     XCHG        ;DMA TO DE, FCB TO HL
  381.     DCR    B    ;MORE SECTORS?
  382.     JNZ    RDBLP    ;YES, MORE
  383. RDBRET    POP    H    ;GET FCB POINTER
  384.     DCX    H    ;TO LENGTH
  385.     MOV    A,M    ;GET LENGTH
  386.     DCX    H    ;TO COUNT
  387.     MOV    M,A    ;SET PAGE COUNT
  388.     DCX    H    ;TO LO COUNT
  389.     DCX    H    ;TO HI FCB
  390.     DCX    H    ;TO EFCB START
  391.     JMP    RDBYTE    ;LOOP THRU AGAIN
  392. ;
  393. RDBNORD    INX    H    ;TO LENGTH
  394.     MOV    A,M    ;GET LENGTH (PAGES)
  395.     XCHG        ;BUFF TO HL
  396.     ADD    H
  397.     MOV    H,A    ;HL = END OF BUFF
  398.     MOV    A,L
  399.     SUB    C
  400.     MOV    L,A
  401.     MOV    A,H
  402.     SBB    B
  403.     MOV    H,A    ;HL = DATA POINTER
  404.     MOV    A,M    ;GET BYTE
  405.     XCHG        ;EFCB BACK TO HL
  406.     CPI    1AH    ;EOF?
  407.     RZ        ;YES, LEAVE POINTERS
  408.     DCX    B    ;DECR COUNT
  409.     DCX    H    ;BACK TO "BYTES LEFT"
  410.     MOV    M,B
  411.     DCX    H
  412.     MOV    M,C    ;STORE BACK COUNT
  413.     RET
  414. ;
  415. ;SAMPLE EFCB:
  416. ;
  417. ;EFCB    DW    BUFF    ;BUFFER ADDR
  418. ;    DW    0    ;BYTES LEFT
  419. ;    DB    20    ;BUFFER SIZE (IN PAGES)
  420. ;    DW    FCB    ;FCB ADDRESS
  421. ;
  422. ;    MUST BE ASSEMBLED BY "MAC"
  423. ;
  424. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  425. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  426. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  427. ;TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  428. ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  429. ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  430. ;MULTIPLE FILES.
  431. ;
  432. ;JUST CALL "MFNAME" (Multiple File NAME) AND THE FCB
  433. ;WILL BE SET UP WITH THE NEXT NAME, READY TO
  434. ;DO NORMAL PROCESSING (OPEN, READ, ETC.)
  435. ;
  436. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  437. ;
  438. ;------------------------------------------------
  439. ;
  440. ;    MULTI-FILE ACCESS SUBROUTINE
  441. ;
  442. ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  443. ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
  444. ;
  445. MFNAME:
  446. ;<<INIT DMA ADDR, FCB>>
  447.  CPM STDMA,80H
  448.  XRA A ! STA FCBEXT ! STA FCBRNO
  449. ;<<IF FIRST TIME>>
  450.  LDA MFFLG1 ! ORA A ! JNZ MFN01
  451. ;  <<TURN OFF 1ST TIME SW>>
  452.  MVI A,1 ! STA MFFLG1
  453. ;  <<SAVE THE REQUESTED NAME>>
  454.  MOVE FCB,MFREQ,12 ;SAVE ORIG REQ
  455.  LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB
  456. ;  <<SRCHF REQ NAME>>
  457.  MOVE MFREQ,FCB,12
  458.  CPM SRCHF,FCB
  459. ;<<ELSE>>
  460.  JMP MFN02
  461. MFN01:
  462. ;  <<SRCHF CURR NAME>>
  463.  MOVE MFCUR,FCB,12
  464.  CPM SRCHF,FCB
  465. ;  <<SRCHN REQ NAME>>
  466.  MOVE MFREQ,FCB,12
  467.  CPM SRCHN,FCB
  468. ;<<ENDIF>>
  469. MFN02:
  470. ;<<RETURN CARRY IF NOT FOUND>>
  471.  INR A ! STC ! RZ
  472. ;<<MOVE NAME FOUND TO CURR>>
  473.  DCR A ! ANI 3 ! ADD A
  474.  ADD A ! ADD A ! ADD A ! ADD A
  475.  ADI 81H ! MOV L,A ! MVI H,0
  476.  PUSH H ;SAVE NAME POINTER
  477.  MOVE ,MFCUR+1,11
  478. ;<<MOVE NAME FOUND TO FCB>>
  479.  POP H ! MOVE ,FCB+1,11
  480. ;<<SETUP FCB>>
  481.  XRA A ! STA FCBEXT
  482. ;<<RETURN>>
  483.  RET
  484. ;
  485. ;MULTI-FILE ACCESS WORK AREA
  486. ;
  487. MFFLG1    DB    0    ;1ST TIME SW
  488. MFREQ    DS    12    ;REQ NAME
  489. MFCUR    DS    12    ;CURR NAME
  490. ;------------------------------------------------
  491. ;
  492. ;EXIT, READING CHAR WHICH WAS TYPED TO INTERRUPT
  493. ;
  494. CHREXIT    CPM    RDCON
  495.     CALL    MSGEXIT
  496.     DB    CR,LF,'++ABORT++$'
  497. ;
  498. ;EXIT WITH ERROR MESSAGE
  499. ;
  500. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  501. ERXIT    POP    D    ;GET MSG
  502.     MVI    C,PRINT
  503.     CALL    BDOS
  504. ;
  505. ;EXIT, RESTORING STACK AND RETURN
  506. ;
  507. EXIT    LHLD    STACK
  508.     SPHL
  509.     RET        ;TO CCP
  510. ;
  511. EFCB    DW    BUFF    ;BUFFER ADDR
  512. EFCBCT    DW    0    ;BYTES LEFT
  513.     DB    20    ;BUFFER SIZE (IN PAGES)
  514.     DW    FCB    ;FCB ADDRESS
  515. ;
  516. STRING    DS    30    ;WHAT TO SEARCH FOR
  517.     DS    100    ;STACK AREA
  518. STACK    DS    2
  519. STRPTR    DS    2    ;POINTER FOR "|" SCAN
  520. LINE    DS    133
  521. BUFF    EQU    $    ;DISK READ BUFER
  522. ;
  523. ;BDOS/CBIOS EQUATES (VERSION 8)    
  524. ;
  525. RDCON    EQU    1
  526. WRCON    EQU    2
  527. PRINT    EQU    9
  528. RDCONBF    EQU    10
  529. CONST    EQU    11
  530. OPEN    EQU    15
  531. CLOSE    EQU    16
  532. SRCHF    EQU    17
  533. SRCHN    EQU    18
  534. ERASE    EQU    19
  535. READ    EQU    20
  536. WRITE    EQU    21
  537. MAKE    EQU    22
  538. REN    EQU    23
  539. STDMA    EQU    26
  540. BDOS    EQU    5
  541. FCB    EQU    5CH 
  542. FCB2    EQU    6CH
  543. FCBEXT    EQU    FCB+12
  544. FCBRNO    EQU    FCB+32
  545.