home *** CD-ROM | disk | FTP | other *** search
- ;
- ;FIND.ASM
- ;
- ;06/23/79 BY WARD CHRISTENSEN
- ;
- ;USED TO DO A CHARACTER STRING SEARCH
- ;OF ONE OR MORE FILES. ONLY SIMPLE STRINGS
- ;MAY BE SEARCHED FOR: ONES WHICH CAN APPEAR
- ;AS A FILE NAME.
- ;
- ;COMMAND FORMAT:
- ;
- ; FIND FILENAME STRING
- ;
- ;FILENAME MAY BE AMBIGUOUS, I.E. *.ASM OR
- ; CBBS*.ASM
- ;
- CR EQU 0DH
- LF EQU 0AH
- EOF EQU 1AH
- TAB EQU 9
- ;
- MF SET 0 ;SHOW MOVE NOT REQUESTED
- CF SET 0 ;SHOW COMP NOT REQUESTED
- ;
- ;(FROM EQU8.LIB...)
- ;DEFINE SOME MACROS TO MAKE THINGS EASIER
- ;
- ;DEFINE DATA MOVE MACRO: MOVE from,to,length
- ; from may be addr, or quoted string
- ;
- MOVE MACRO ?F,?T,?L
- IF NOT NUL ?F
- IRPC ?C,?F
- ?Q SET '&?C&?C' ;;TEST FOR QUOTE
- EXITM
- ENDM
- IF ?Q EQ ''''
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?F
- ?Z POP H ;GET FROM
- LXI B,?Z-?B ;GET LEN
- ELSE
- LXI H,?F
- ENDIF
- ENDIF
- IF NOT NUL ?T
- LXI D,?T
- ENDIF
- IF NOT NUL ?L
- LXI B,?L
- ENDIF
- CALL MOVER
- MF SET -1 ;;SHOW EXPANSION
- ENDM
- ;COMPARE MACRO
- COMP MACRO ?F,?T,?L
- IF NOT NUL ?F
- IRPC ?C,?F
- ?Q SET '&?C&?C' ;;TEST FOR QUOTE
- EXITM
- ENDM
- IF ?Q EQ ''''
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?F
- ?Z POP H ;GET FROM
- LXI B,?Z-?B ;GET LEN
- ELSE
- LXI H,?F
- ENDIF
- ENDIF
- IF NOT NUL ?T
- LXI D,?T
- ENDIF
- IF NOT NUL ?L
- LXI B,?L
- ENDIF
- IF NOT NUL ?I
- LOCAL ?B,?Z
- CALL ?Z
- ?B DB ?I
- ?Z POP D ;GET TO
- LXI B,?Z-?B
- ENDIF
- CALL COMPR
- CF SET -1 ;;SHOW EXPANSION
- ENDM
- ;
- ;DEFINE CP/M MACRO - CPM FNC,PARM
- ;
- CPM MACRO ?F,?P
- PUSH B
- PUSH D
- PUSH H
- IF NOT NUL ?F
- MVI C,?F
- ENDIF
- IF NOT NUL ?P
- LXI D,?P
- ENDIF
- CALL BDOS
- POP H
- POP D
- POP B
- ENDM
- ;
- ORG 100H
- CALL START
- DB 'FIND.COM '
- DB '06/23/79'
- DB 0DH,0AH,'$'
- START POP D ;GET ID
- MVI C,PRINT
- CALL BDOS ;PRINT ID
- ;
- ;INIT LOCAL STACK
- ;
- LXI H,0
- DAD SP
- SHLD STACK
- LXI SP,STACK
- ;
- ;START OF PROGRAM EXECUTION
- ;
- MOVE FCB2+1,STRING,8
- NEXTFL CALL MFNAME ;GET NEXT
- JC EXIT
- CPM OPEN,FCB
- INR A
- JZ EXIT
- MOVE ' 0',LINENO
- MOVE FCB+1,FNAME,8
- MOVE FCB+9,FNAME+9,3
- CALL ILPRT
- DB '----> FILE '
- FNAME DB 'XXXXXXXX.XXX'
- DB CR,LF,0
- LXI H,0
- SHLD EFCBCT ;ZERO COUNT
- ;
- ;BUMP ASCII LINE #
- ;
- NEXTLN LXI H,LINENO+3
- NEXTADD MOV A,M ;GET DIGIT
- ORI '0' ;MAKE ASCII
- INR A
- MOV M,A
- CPI '9'+1 ;CARRY?
- JNZ NEXTNC
- MVI M,'0'
- DCX H
- JMP NEXTADD
- ;
- NEXTNC LXI H,LINE
- NEXTLC PUSH H
- LXI H,EFCB
- CALL RDBYTE
- POP H
- MOV M,A
- INX H
- CPI EOF
- JZ NEXTFL ;NEXT FILE
- CPI LF
- JNZ NEXTLC
- ;
- ;READ IN A LINE, NOW SCAN FOR THE STRING
- ;
- LXI H,LINE
- NEXTST LXI D,STRING
- PUSH H
- NEXTC LDAX D
- INX D
- CPI ' ' ;END OF STRING?
- JZ MATCHED
- CMP M
- INX H
- JZ NEXTC
- POP H ;RESTORE ADDR
- INX H
- MOV A,M
- CPI CR
- JNZ NEXTST
- JMP NEXTLN
- ;
- ;GOT MATCH, PRINT IT
- ;
- MATCHED POP H ;KILL STACKED ADDR
- CALL ILPRT
- LINENO DB ' ',TAB,0
- ;
- LXI H,LINE
- MATCHLP MOV A,M
- MOV E,A
- CPM WRCON
- MOV A,M
- INX H
- CPI LF
- JNZ MATCHLP
- JMP NEXTLN
- ;
- ;INLINE PRINT - CALL ILPRT FOLLOWED BY MSG,
- ;WHICH ENDS IN A: 0
- ;
- ILPRT XTHL ;GET MSG ADDR, SAVE HL
- ILPLP MOV E,M
- CPM WRCON
- INX H
- MOV A,M
- ORA A ;END?
- JNZ ILPLP
- XTHL
- RET
- ;
- ;FOLLOWING FROM 'EQU8.LIB'---->
- ;
- ;MOVE, COMPARE SUBROUTINES
- ;
- IF MF ;MACRO EXPANSION FLAG SET?
- ;
- MOVER MOV A,M
- STAX D
- INX H
- INX D
- DCX B
- MOV A,B
- ORA C
- JNZ MOVER
- RET
- ENDIF
- ;
- IF CF ;MACRO EXPANSION FLAG SET?
- COMPR LDAX D
- CMP M
- RNZ
- INX D
- INX H
- DCX B
- MOV A,B
- ORA C
- JNZ COMPR
- RET
- ENDIF
- ;
- ; FROM EQU8.LIB: AS OF 05/06/79
- ;
- ;RDBYTE, HL POINTS TO EXTENDED FCB:
- ;
- ; 2 BYTE BUFFER ADDR
- ; 2 BYTE "BYTES LEFT" (INIT TO 0)
- ; 1 BYTE BUFFER SIZE (IN PAGES)
- ; 2 BYTE FCB ADDRESS
- ;
- RDBYTE MOV E,M
- INX H
- MOV D,M ;GET BUFFER ADDR
- INX H
- MOV C,M
- INX H
- MOV B,M ;BC = BYTES LEFT
- MOV A,B ;GET COUNT
- ORA C
- JNZ RDBNORD ;NO READ
- ;
- INX H ;TO BUFFER SIZE
- MOV A,M ;GET COUNT
- ADD A ;MULTIPLY BY 2
- MOV B,A ;SECTOR COUNT IN B
- INX H ;TO FCB
- PUSH H ;SAVE FCB POINTER
- MOV A,M ;GET..
- INX H ;..FCB..
- MOV H,M ;..ADDR..
- MOV L,A ;..TO HL
- ;
- RDBLP MVI A,1AH ;GET EOF CHAR
- STAX D ;SAVE IN CASE EOF
- PUSH D ;SAVE DMA ADDR
- PUSH H ;SAVE FCB ADDR
- CPM STDMA ;SET DMA ADDR
- POP D ;GET FCB
- CPM READ
- ORA A
- POP H ;HL=DMA, DE=FCB
- JNZ RDBRET ;GOT EOF
- MOV A,L
- ADI 80H ;TO NEXT BUFF
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A
- XCHG ;DMA TO DE, FCB TO HL
- DCR B ;MORE SECTORS?
- JNZ RDBLP ;YES, MORE
- RDBRET POP H ;GET FCB POINTER
- DCX H ;TO LENGTH
- MOV A,M ;GET LENGTH
- DCX H ;TO COUNT
- MOV M,A ;SET PAGE COUNT
- DCX H ;TO LO COUNT
- DCX H ;TO HI FCB
- DCX H ;TO EFCB START
- JMP RDBYTE ;LOOP THRU AGAIN
- ;
- RDBNORD INX H ;TO LENGTH
- MOV A,M ;GET LENGTH (PAGES)
- XCHG ;BUFF TO HL
- ADD H
- MOV H,A ;HL = END OF BUFF
- MOV A,L
- SUB C
- MOV L,A
- MOV A,H
- SBB B
- MOV H,A ;HL = DATA POINTER
- MOV A,M ;GET BYTE
- XCHG ;EFCB BACK TO HL
- CPI 1AH ;EOF?
- RZ ;YES, LEAVE POINTERS
- DCX B ;DECR COUNT
- DCX H ;BACK TO "BYTES LEFT"
- MOV M,B
- DCX H
- MOV M,C ;STORE BACK COUNT
- RET
- ;
- ;SAMPLE EFCB:
- ;
- ;EFCB DW BUFF ;BUFFER ADDR
- ; DW 0 ;BYTES LEFT
- ; DB 20 ;BUFFER SIZE (IN PAGES)
- ; DW FCB ;FCB ADDRESS
- ;
- ; MUST BE ASSEMBLED BY "MAC"
- ;
- ;MULTI-FILE ACCESS SUBROUTINE. ALLOWS PROCESSING
- ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK. THIS
- ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
- ;TIME IT IS CALLED. THIS COMMAND WOULD BE USED
- ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
- ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
- ;MULTIPLE FILES.
- ;
- ;JUST CALL "MFNAME" (Multiple File NAME) AND THE FCB
- ;WILL BE SET UP WITH THE NEXT NAME, READY TO
- ;DO NORMAL PROCESSING (OPEN, READ, ETC.)
- ;
- ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
- ;
- ;
- ;------------------------------------------------
- ;
- ; MULTI-FILE ACCESS SUBROUTINE
- ;
- ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
- ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
- ;
- MFNAME:
- ;<<INIT DMA ADDR, FCB>>
- CPM STDMA,80H
- XRA A ! STA FCBEXT ! STA FCBRNO
- ;<<IF FIRST TIME>>
- LDA MFFLG1 ! ORA A ! JNZ MFN01
- ; <<TURN OFF 1ST TIME SW>>
- MVI A,1 ! STA MFFLG1
- ; <<SAVE THE REQUESTED NAME>>
- MOVE FCB,MFREQ,12 ;SAVE ORIG REQ
- LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB
- ; <<SRCHF REQ NAME>>
- MOVE MFREQ,FCB,12
- CPM SRCHF,FCB
- ;<<ELSE>>
- JMP MFN02
- MFN01:
- ; <<SRCHF CURR NAME>>
- MOVE MFCUR,FCB,12
- CPM SRCHF,FCB
- ; <<SRCHN REQ NAME>>
- MOVE MFREQ,FCB,12
- CPM SRCHN,FCB
- ;<<ENDIF>>
- MFN02:
- ;<<RETURN CARRY IF NOT FOUND>>
- INR A ! STC ! RZ
- ;<<MOVE NAME FOUND TO CURR>>
- DCR A ! ANI 3 ! ADD A
- ADD A ! ADD A ! ADD A ! ADD A
- ADI 81H ! MOV L,A ! MVI H,0
- PUSH H ;SAVE NAME POINTER
- MOVE ,MFCUR+1,11
- ;<<MOVE NAME FOUND TO FCB>>
- POP H ! MOVE ,FCB+1,11
- ;<<SETUP FCB>>
- XRA A ! STA FCBEXT
- ;<<RETURN>>
- RET
- ;
- ;MULTI-FILE ACCESS WORK AREA
- ;
- MFFLG1 DB 0 ;1ST TIME SW
- MFREQ DS 12 ;REQ NAME
- MFCUR DS 12 ;CURR NAME
- ;------------------------------------------------
- ;
- ;MOVE SUBROUTINE
- ;
- MOVER MOV A,M
- STAX D
- INX H
- INX D
- DCX B
- MOV A,B
- ORA C
- JNZ MOVER
- RET
- ;
- ;EXIT WITH ERROR MESSAGE
- ;
- MSGEXIT EQU $ ;EXIT W/"INFORMATIONAL" MSG
- ERXIT POP D ;GET MSG
- MVI C,PRINT
- CALL BDOS
- ;
- ;EXIT, RESTORING STACK AND RETURN
- ;
- EXIT LHLD STACK
- SPHL
- RET ;TO CCP
- ;
- EFCB DW BUFF ;BUFFER ADDR
- EFCBCT DW 0 ;BYTES LEFT
- DB 20 ;BUFFER SIZE (IN PAGES)
- DW FCB ;FCB ADDRESS
-
- STRING DS 8 ;WHAT TO SEARCH FOR
- DB ' ' ;END OF STRING
- DS 40H ;STACK AREA
- STACK DS 2
- LINE DS 128
- BUFF EQU $ ;DISK READ BUFER
- ;
- ;BDOS/CBIOS EQUATES (VERSION 8)
- ;
- RDCON EQU 1
- WRCON EQU 2
- PRINT EQU 9
- RDCONBF EQU 10
- CONST EQU 11
- OPEN EQU 15
- CLOSE EQU 16
- SRCHF EQU 17
- SRCHN EQU 18
- ERASE EQU 19
- READ EQU 20
- WRITE EQU 21
- MAKE EQU 22
- REN EQU 23
- STDMA EQU 26
- BDOS EQU 5
- FCB EQU 5CH
- FCB2 EQU 6CH
- FCBEXT EQU FCB+12
- FCBRNO EQU FCB+32
-