home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG036.ARK / FIND.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  465 lines

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