Эксперт
  
Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва
Репутация: нет Всего: 18
|
Когда-то давно я написал прогу, которая ищет файлы по маске (в поддиректориях тоже). Ее отличие от обычного ALT+F7 в том, что можно искать файло по вхождению трех строк (в режиме AND или OR). Текст здоровый, но в нем есть скроллинг - вся работа напрямую через видеопамять: | Цитата | .286 text segment byte public assume cs:text,ds:text org 100h FALSE EQU 0 ; SET ZIRO AS FALSE TRUE EQU 1 ; AND UNIE AS TRUE BUFFER_SIZE EQU 50000 ; WE'LL READ 50000 BYTES AT ONES begin: MOV AX,0003H ; V_REGIM=03H, 80/25, TEXT INT 10H ; OPEN SCREEN, PAGE=0 CALL SHOW_INFO ; USER REQUEST FOR HELP ? JNZ @N_HLP JMP @EXIT ; SHOW HELP MESSAGES AND EXIT... @N_HLP: MOV BYTE PTR F_STR,64 MOV BYTE PTR S_STR,64 MOV BYTE PTR T_STR,64 MOV BYTE PTR PATH,64 MOV BYTE PTR TYPE,16 MOV BYTE PTR OR_STR,2 mov byte ptr Undo_Str,1 CALL ASK_USER ; CALL ENTRY MENU FOR FILLING PARAMETRS TEST AL,AL JZ @RUN ; RUN PROCESS ! JMP @DONE ; WORK DONE @RUN: MOV BX,OFFSET READ_PARAMETR PUSH OFFSET F_STR ; READ FIRST STRING CALL BX PUSH OFFSET S_STR ; READ SECOND STRING CALL BX PUSH OFFSET T_STR ; READ THIRD STRING CALL BX PUSH OFFSET PATH ; READ PATH TO FILES CALL BX PUSH OFFSET TYPE ; READ FILE'S MASK CALL BX PUSH OFFSET OR_STR ; READ TYPE OF SEACHING CALL BX CMP WORD PTR OR_STR+1,'RO' JNZ @NO_OR MOV OR_FLAG,TRUE @NO_OR: PUSH OFFSET MESSAGE6 CALL SHOW_MESS call Stop CMP AL,27 JZ @EXIT MOV OLD_SP,SP CALL CHECK_PARAMETRS ; look FOR SETUP PARAMETRS CALL SET_PATH ; SET PATH FOR DOS CALL OPEN_RESULT ; OPEN RESULT FILE (RESULT.TXT) JC @EXIT ; DONE IF ERROR CALL DETECT_DTA ; DETECT ADDRESS OF RESULT BUFFER FOR FINDNEXT PUSH OFFSET MESSAGE8 ; CALL SHOW_MESS ; SHOW MESSAGE - PROCESS BEGUN call Manager ; Do It ! @Done: call Close_Result ; CLOSE RESULT-FILE push offset MESSAGE2 call Show_Mess ; SHOW PROMPT (WORK DONE) call Stop ; WAIT FOR KEYPRESSED @EXIT: mov ax,0003h ; RESTORE SCREEN, PAGE=0 int 10h mov ax,4C00h int 21H ; BACK TO DOS ! ;*************************************************************************** SChar db 1,'\' GoBack db 3,'..',0 UndoChk db 1,'Y' Manager Proc Near push 1 push 255 push offset DirInd call Fill_MasW ; DirInd[1..255]: = 1 push offset StartDir call Get_Curr_Dir ; Save Start Dir push offset Path call Set_Disk ; Set New Disk push offset Path call Set_Dir push offset WorkDir call Get_Curr_Dir ; Set Start Dir mov bx,1 ; Level = 1 call Scan_Files ; Find Files ! mov di,offset Undo_Str mov si,offset UndoChk call Comp_Up_Down jnz @@NUndo @@ShowDir: mov si,bx dec si shl si,1 push DirInd[si] ; push Index push offset FoundDir call Find_Dirs jc @@NotFound inc DirInd[si] ;inc(DirInd[Level]); inc bx ;inc(Level); push offset WorkDir ;WorkDir:=WorkDir+'\'+FoundDir+#0; push offset SChar ;dec(WorkDir[0]); call Add_Str push offset WorkDir ;WorkDir:=WorkDir+'\'+FoundDir+#0; push offset FoundDir ;dec(WorkDir[0]); call Add_Str push offset WorkDir call Set_Dir ; Set New Dir push offset WorkDir call Show_Mess call Scan_Files ; Find Files ! jmp short @@Stop @@NotFound: ;if Level>1 then Set_Dir(ofs(GoBack)); cmp bx,1 ;Get_Curr_Dir(ofs(WorkDir)); jbe @@LastLev ;DirInd[Level]:=1; push offset GoBack ;dec(Level); call Set_Dir @@LastLev: push offset WorkDir call Get_Curr_Dir mov DirInd[si],1 dec bx @@Stop: test bx,bx jnz @@ShowDir @@NUndo: push offset StartDir call Set_Disk push offset StartDir call Set_Dir ; Save Start Dir @@ManagerDone: ret Manager Endp ;*************************************************************************** DirMask EQU 16 Only_Directory db 5,'*. ',0 Find_Dirs Proc Near ; (Index,Res_Str_Addr:word):boolean push bp mov bp,sp pusha push offset Only_Directory push DirMask push word ptr [bp+4] ; Res_Str_Addr call Find_First ; Find_First(FileType,Mask,Res_File); - '.\' push offset Only_Directory push DirMask push word ptr [bp+4] ; Res_Str_Addr call Find_Next ; Find_Next(FileType,Mask,Res_File); - '..\' @@Next: push offset Only_Directory push DirMask push word ptr [bp+4] ; Res_Str_Addr call Find_Next ; Find_Next(FileType,Mask,Res_File); - '..\' jc @@Done ; Find Next Real File/Dir les bx,Dta_Address ; Get DTA Address cmp byte ptr ES:[BX+21],DirMask jnz @@Next ; Skip file dec word ptr [bp+6] ; dec(Index) jnz @@Next clc popa pop bp ret 4 @@Done: popa pop bp ret 4 Find_Dirs Endp FMask EQU 0 Scan_Files Proc Near pusha push es push offset Type push FMask push offset Exec_Path ; Res_Str_Addr call Find_First ; TRY TO FIND FIRST FILE jnc @@FIND_ONE ; CONTINUE IF OK push offset MESSAGE9 call Show_Mess ; DISPLAY - THERE AIN"T FILES JMP @@DONE_Scan @@FIND_ONE: @@NXT_F: push offset Exec_Path ; SHOW FINDED FILE call Show_Mess call Abort ; Check For User Interrupt call Scan_File ; LOOK AT THE CURRENT FILE push offset Type push FMask push offset Exec_Path ; Res_Str_Addr call Find_Next ; TRY TO FIND NEXT FILE jnc @@NXT_F ; REPEAT IF OK @@DONE_Scan: pop es popa ret Scan_Files Endp ; 17.--------------------------------------------------------------------------- MENU STRUC NUMBER_PROMPTS DW 7 START_X DB 10 END_X DB 60 START_Y DB 10 END_Y DB 20 MENU_COLOR DB 15+16 ENTRY_STR_ADDR DW 0 Y_STR DB 6 X_STR DB 10 ENTRY2_STR DW 0 Y_STR2 DB 10 X_STR2 DB 10 ENTRY3_STR DW 0 Y_STR3 DB 10 X_STR3 DB 10 ENTRY4_STR DW 0 Y_STR4 DB 10 X_STR4 DB 10 ENTRY5_STR DW 0 Y_STR5 DB 10 X_STR5 DB 10 ENTRY6_STR DW 0 Y_STR6 DB 10 X_STR6 DB 10 ENTRY7_STR DW 0 Y_STR7 DB 10 X_STR7 DB 10 BUTTONS_NUMBER DW 3 BUTTON1 DB 13,' SAVE & RUN ' BUTTON_Y1 DB 23 BUTTON_X1 DB 14 BUTTON2 DB 13,' SAVE & EXIT ' BUTTON_Y2 DB 23 BUTTON_X2 DB 34 BUTTON3 DB 13,' EXIT ' BUTTON_Y3 DB 23 BUTTON_X3 DB 54 ZAGL_NUMBER DW 7+1 ZAGL1 DB 12,'First string' ZAGL_Y1 DB 4 ZAGL_X1 DB 12 ZAGL2 DB 13,'Second string' ZAGL_Y2 DB 7 ZAGL_X2 DB 12 ZAGL3 DB 12,'Third string' ZAGL_Y3 DB 10 ZAGL_X3 DB 12 ZAGL4 DB 26,'DOS-PATH to scanning files' ZAGL_Y4 DB 13 ZAGL_X4 DB 12 ZAGL5 DB 9,'File mask' ZAGL_Y5 DB 16 ZAGL_X5 DB 12 ZAGL6 DB 37,'Type of seaching (use "OR" or ommit):' ZAGL_Y6 DB 19 ZAGL_X6 DB 12 ZAGL7 DB 32,'Scanning in Subdirectorys (Y/N):' ZAGL_Y7 DB 21 ZAGL_X7 DB 12 MAIN_ZAGL DB 27,'Enter Of Seaching Parametrs' MAIN_Y DB 2 MAIN_X DB 30 MENU ENDS USER_MENU MENU <7,2,78,1,24,15+16,F_STR,5,10,S_STR,8,10,T_STR,11,10,PATH,14,10,TYPE,17,10,OR_STR,19,50,Undo_Str,21,45,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,> X_CURSOR DB ? ; CURSOR POSITION IN STRING CURRENT_PROMPT DB ? ; CURRENT EDIT FIELD DOWN_BUTTON DB ? ASK_USER PROC NEAR PUSH 0B800H POP ES CLD CALL SAVE_SCREEN MOV BX,OFFSET USER_MENU MOV AL,[BX].START_Y MOV AH,[BX].START_X PUSH AX MOV AL,[BX].END_Y MOV AH,[BX].END_X PUSH AX CALL BAR SUB SP,4 CALL RECTANGLE CALL SHOW_PROMPTS CALL SHOW_ZAGL CALL SHOW_BUTTONS MOV CURRENT_PROMPT,0 MOV DOWN_BUTTON,0 @UP_FIELDS: MOV AL,4 MUL CURRENT_PROMPT MOV SI,AX PUSH [BX+SI].ENTRY_STR_ADDR PUSH WORD PTR [BX+SI].Y_STR CALL READ_STRING MOV CL,CURRENT_PROMPT CMP AH,72 ; UP KEY ? JNZ @N_UP DEC CL JNS @N_UP INC CL @N_UP: CMP AH,80 ; DOWN KEY ? JNZ @N_DOWN INC CL @N_DOWN:CMP AL,13 ; ENTER KEY ? JNZ @N_ENTR INC CL @N_ENTR:CMP CL,BYTE PTR [BX].NUMBER_PROMPTS JAE @UP_DONE CMP AL,27 jnz @@NExUp mov cl,BYTE PTR [BX].NUMBER_PROMPTS dec cl mov CURRENT_PROMPT,CL jmp @Up_Done @@NExUp: MOV CURRENT_PROMPT,CL JMP @UP_FIELDS @UP_DONE: MOV DL,100 CALL GOTOXY ; CURSOR HIDE @DOWN_M:CALL SHOW_SWITCH_BUTTON call Stop PUSH AX CALL SHOW_BUTTONS ; CLEAR PREVIOUS BUTTON POP AX CMP AH,72 JZ @UP_FIELDS MOV CL,DOWN_BUTTON CMP AH,75 JNZ @N_LFT DEC CL JNS @N_LFT MOV CL,2 @N_LFT: CMP AH,77 JNZ @N_RGT INC CL CMP CL,2 JBE @N_RGT XOR CL,CL @N_RGT: CMP AL,13 JZ @DOWN_DONE CMP AL,27 jnz @@NoExDown mov Down_Button,3 jmp short @Down_Done @@NoExDown: MOV DOWN_BUTTON,CL JMP @DOWN_M @DOWN_DONE: call Restore_Screen CMP DOWN_BUTTON,2 ; EXIT BUTTON ? JZ @AB_ASK CALL SAVE_SETUP JC @AB_ASK @ASK_OK:MOV AL,DOWN_BUTTON RET ; CREATE SETUP FILE ! @AB_ASK:MOV AL,2 RET ASK_USER ENDP SAVE_SCREEN PROC NEAR PUSH ES POP DS XOR SI,SI MOV DI,1000H MOV CX,80*25 REP MOVSW PUSH CS POP DS RET SAVE_SCREEN ENDP RESTORE_SCREEN PROC NEAR PUSH ES POP DS XOR DI,DI MOV SI,1000H MOV CX,80*25 REP MOVSW PUSH CS POP DS RET RESTORE_SCREEN ENDP WRITE_TO_BUF PROC NEAR PUSH CX LODSW LEA BX,[SI+2] MOV SI,AX LODSB CBW MOV CX,AX TEST AX,AX JZ @END_WR MOV AL,' ' STD PUSH DI LEA DI,[SI-1] ADD DI,CX REP SCASB POP DI CLD JZ @END_WR INC CX @END_WR:MOV [SI-1],CL MOV SI,BX POP CX RET WRITE_TO_BUF ENDP PROC_NAME DB 'FIND3STR.COM',0 ERROR_SAVE DB 25,'ERROR AT SAVING PARAMETRS' SAVE_SETUP PROC NEAR PUSH DS POP ES MOV BX,OFFSET USER_MENU MOV CX,[BX].NUMBER_PROMPTS LEA SI,[BX].ENTRY_STR_ADDR @WR_BUF:CALL WRITE_TO_BUF LOOP @WR_BUF MOV AX,3D02H XOR CX,CX MOV DX,OFFSET PROC_NAME INT 21H JC @ERR_CR MOV BX,AX MOV DX,OFFSET PARAMETRS-100H XOR CX,CX MOV AX,4200H INT 21H MOV CX,PARAM_SIZE MOV DX,OFFSET PARAMETRS MOV AH,40H INT 21H JC @ERR_CR MOV AH,3EH INT 21H CLC RET @ERR_CR:PUSH OFFSET ERROR_SAVE CALL SHOW_MESS call Stop STC RET SAVE_SETUP ENDP READ_STRING PROC NEAR ; X,Y=[BP+4], ADDR_STR=[BP+6] PUSH BP MOV BP,SP PUSH BX MOV DX,WORD PTR [BP+4] ; DL=Y, DH=X MOV BX,[BP+6] XOR DI,DI @REPEAT:PUSH BX PUSH 1+16+32 PUSH WORD PTR [BP+4] CALL GOTOXY CALL OUT_STR call Stop CMP AL,27 JZ @D_READ CMP AH,72 JZ @D_READ CMP AH,80 JZ @D_READ CMP AL,13 JZ @D_READ CMP AH,75 JNZ @N_L_T CALL LEFT_CURSOR @N_L_T: CMP AH,77 JNZ @N_RGH CALL RIGHT_CURSOR @N_RGH: CMP AL,8 JNZ @N_BKSP CALL BACKSPACE @N_BKSP:CMP AH,'S' JNZ @N_DLT CALL DELETE @N_DLT: CMP AH,'O' JNZ @N_END CALL END_POS @N_END: CMP AH,'G' JNZ @N_HOME CALL HOME @N_HOME:TEST AL,AL JZ @REPEAT CALL PUT_SYMBOL JMP @REPEAT @D_READ:POP BX POP BP RET 4 READ_STRING ENDP HOME PROC NEAR MOV CX,80 @HOME: CALL LEFT_CURSOR LOOP @HOME XOR AX,AX RET HOME ENDP END_POS PROC NEAR MOV CX,80 @STAY_END: CALL RIGHT_CURSOR LOOP @STAY_END CMP BYTE PTR [BX+DI+1],' ' JNZ @D_END @NXT_L: CMP BYTE PTR [BX+DI],' ' JNZ @D_END TEST DI,DI JZ @D_END CALL LEFT_CURSOR JMP @NXT_L @D_END: XOR AX,AX RET END_POS ENDP DELETE PROC NEAR MOV BYTE PTR [BX+DI+1],' ' CALL DEL_RIGHT XOR AX,AX RET DELETE ENDP DEL_RIGHT PROC NEAR MOV CL,[BX] ; CL=TOTAL BYTES IN STR XOR CH,CH DEC CX SUB CX,DI TEST CX,CX JZ @LAST PUSH DI PUSH ES PUSH DS POP ES LEA DI,[BX+DI+1] LEA SI,[DI+1] REP MOVSB MOV BYTE PTR [DI],' ' POP ES POP DI @LAST: RET DEL_RIGHT ENDP BACKSPACE PROC NEAR MOV SI,DI CALL LEFT_CURSOR CMP SI,DI JZ @N_BACK MOV CL,[BX] ; CL=TOTAL BYTES IN STR CALL DEL_RIGHT @N_BACK:XOR AX,AX RET BACKSPACE ENDP PUT_SYMBOL PROC NEAR PUSH DI PUSH DX PUSH AX CALL END_POS ; STAY AT THE END CMP BYTE PTR [BX+DI+1],' ' ; IS THERE FREE PLACE ? POP AX POP DX POP DI JNZ @N_PUT PUSH DI PUSH ES PUSH DS POP ES MOV CL,[BX] XOR CH,CH DEC CX MOV SI,CX SUB CX,DI TEST CX,CX JZ @N_MVI LEA SI,[BX+SI+1] MOV DI,SI DEC SI STD REP MOVSB CLD @N_MVI: POP ES POP DI MOV [BX+DI+1],AL CALL RIGHT_CURSOR @N_PUT: RET PUT_SYMBOL ENDP LEFT_CURSOR PROC NEAR PUSH AX TEST DI,DI ; LEFT-END POSITION ? JZ @Y_L DEC DH ; CURSOR MOVED LEFT DEC DI ; POS IN STR @Y_L: POP AX RET LEFT_CURSOR ENDP RIGHT_CURSOR PROC NEAR PUSH AX MOV AL,[BX] CBW ; AX=LENGHT OF STR DEC AX ; FROM ZIRO CMP AX,DI JZ @Y_R INC DI INC DH @Y_R: POP AX RET RIGHT_CURSOR ENDP ;------------------------------------------------------------------------------- SHOW_MENU_STRINGS PROC NEAR @SHOW_STRINGS: PUSH CX PUSH BX PUSH DX ADD BL,[BX] ADC BH,0 INC BX PUSH WORD PTR [BX] CALL OUT_STR ADD BX,2 POP CX LOOP @SHOW_STRINGS RET SHOW_MENU_STRINGS ENDP SHOW_ZAGL PROC NEAR PUSH BX MOV CX,[BX].ZAGL_NUMBER MOV BX,OFFSET USER_MENU.ZAGL1 MOV DL,USER_MENU.MENU_COLOR CALL SHOW_MENU_STRINGS POP BX RET SHOW_ZAGL ENDP SHOW_SWITCH_BUTTON PROC NEAR MOV CL,DOWN_BUTTON LEA SI,[BX].BUTTON1 @S_PRM: TEST CL,CL JZ @FIND_PROMPT LODSB ADD AL,2 CBW ADD SI,AX DEC CL JMP @S_PRM @FIND_PROMPT: PUSH SI PUSH 15+64 LODSB CBW ADD SI,AX PUSH WORD PTR [SI] CALL OUT_STR RET SHOW_SWITCH_BUTTON ENDP SHOW_BUTTONS PROC NEAR PUSH BX MOV CX,[BX].BUTTONS_NUMBER MOV BX,OFFSET USER_MENU.BUTTON1 MOV DL,1+16+32+64 CALL SHOW_MENU_STRINGS POP BX RET SHOW_BUTTONS ENDP SHOW_PROMPTS PROC NEAR PUSH BX MOV CX,[BX].NUMBER_PROMPTS @SHOW_PROMTS: PUSH CX PUSH [BX].ENTRY_STR_ADDR PUSH 1+16+32 PUSH WORD PTR [BX].Y_STR CALL OUT_STR ADD BX,4 POP CX LOOP @SHOW_PROMTS POP BX RET SHOW_PROMPTS ENDP OUT_STR PROC NEAR ; ADDR=[BP+8], COLOR=[BP+6], X,Y=[BP+4] PUSH BP MOV BP,SP PUSH DI MOV AL,160 MUL BYTE PTR [BP+4] MOV CL,[BP+5] XOR CH,CH SHL CX,1 ADD AX,CX MOV DI,AX MOV SI,[BP+8] LODSB CBW MOV CX,AX MOV AH,[BP+6] @SHOW_STR: LODSB STOSW LOOP @SHOW_STR POP DI POP BP RET 6 OUT_STR ENDP GOTOXY PROC NEAR ; DL=Y, DH=X PUSH BX PUSH DX MOV AH,02H XOR BH,BH XCHG DL,DH INT 10H POP DX POP BX RET GOTOXY ENDP BAR PROC NEAR ; X1,Y1=[BP+6], X2,Y2=[BP+6] PUSH BP MOV BP,SP PUSH BX MOV BX,[BP+6] MOV DX,[BP+4] MOV AL,160 MUL BL ADD AL,BH ADC AH,0 ADD AL,BH ADC AH,0 MOV DI,AX SUB DL,BL ; DL=STEPS BY Y SUB DH,BH INC DH ; DH=STEPS BY X MOV CL,DH XOR CH,CH MOV AL,219 MOV AH,USER_MENU.MENU_COLOR SHR AH,4 @BAR: PUSH DI PUSH CX REP STOSW POP CX POP DI ADD DI,160 DEC DL JNZ @BAR POP BX POP BP RET 4 BAR ENDP ; X1,Y1=[BP+6], X2,Y2=[BP+4] RECTANGLE PROC NEAR PUSH BP MOV BP,SP PUSH BX MOV BX,[BP+6] MOV DX,[BP+4] SHL BH,1 SHL DH,1 MOV AL,160 MUL BL ADD AL,BH ADC AH,0 MOV DI,AX MOV SI,AX MOV CL,DH SUB CL,BH SHR CL,1 INC CL XOR CH,CH MOV AH,USER_MENU.MENU_COLOR MOV AL,196 PUSH AX PUSH CX REP STOSW POP CX MOV AL,DL SUB AL,BL MOV AH,160 MUL AH MOV DI,SI ADD DI,AX POP AX PUSH AX REP STOSW LEA DI,[SI+160] MOV AL,DL SUB AL,BL DEC AL CBW MOV CX,AX MOV BL,DH SUB BL,BH XOR BH,BH POP AX MOV AL,218 MOV ES:[DI-160],AX MOV AL,191 MOV ES:[BX+DI-160],AX MOV AL,179 @DOWN: MOV ES:[BX+DI],AX STOSW ADD DI,158 LOOP @DOWN MOV AL,192 MOV ES:[DI],AX MOV AL,217 MOV ES:[BX+DI],AX POP BX POP BP RET 4 RECTANGLE ENDP ; 17: END ; 16.--------------------------------------------------------------------------- STR_MESS_COUNT EQU 16 ; HOW MUCH STRINGS IN HELP HELP_MESSAGE DB 50,' Как использовать FIND3STR: небольшая инструкция. ' DB 50,' Эта программа ищет файлы в указанной директории, ' DB 50,'которые содержат в себе сразу 3 строки. ' DB 50,' Вы должны определить все три строки для поиска, ' DB 50,'либо пропустить некоторые из них(пустые строки не ' DB 50,'ищутся), DOS-путь до нужной директории(не нужно ' DB 50,'ставить символ "\" в конце), маску отбора файлов ' DB 50,'типа *.dat и т.п., и определить, если это необхо- ' DB 50,'димо, тип поиска как OR-поиск хотя бы одной строки' DB 50,'из всех указанных, либо пропустить этот параметр. ' DB 50,'Для поиска в текущей директории можно использовать' DB 50,'параметр "CURRENT". ' DB 50,' Программа использует чтение 50-Kb блоков, что и ' DB 50,'отражается на экране. Результаты поиска помещаются' DB 50,'в файл RESULT.TXT в текущей директории. ' DB 46,' DEAD WORLD INC.',1,' 1999. THANK YOU. ' SHOW_INFO PROC CMP WORD PTR DS:[0082H],'?/'; USER REQUEST (/?) -? JZ @S_HLP% CMP BYTE PTR DS:[0082H],'?' ; USER REQUEST ? JNZ @NO_SHOW_HELP @S_HLP%:PUSHF MOV CX,STR_MESS_COUNT MOV BX,OFFSET HELP_MESSAGE @S_HLP: PUSH BX CALL SHOW_MESS ADD BX,51 LOOP @S_HLP PUSH OFFSET MESSAGE2 CALL SHOW_MESS PUSH 0B800H POP ES OR BYTE PTR ES:[160*0FH+33*2+1],128+2 call Stop POPF ; ZF MUST BE SET ! @NO_SHOW_HELP: RET SHOW_INFO ENDP ; END:16 COMP_UP_DOWN PROC ; si and di = s1 and s2 PUSH SI PUSH DI LODSB ; LOAD BYTES OF STR1 CBW ; AX=AL MOV CX,AX ; CX=BYTES OF STR1 CMP [DI],CL ; EQUAL BYTES OF STR2 ? JNZ @BAD_COMP ; NO EQUAL - EXIT (ZF IS SET) INC DI ; TO FIRST BYTE @C_UP: LODSB CALL U_CHAR MOV AH,AL MOV AL,[DI] INC DI CALL U_CHAR CMP AL,AH JNZ @BAD_COMP LOOP @C_UP CMP CL,CH ; SET ZF ! @BAD_COMP: POP DI POP SI RET COMP_UP_DOWN ENDP ; END:15 ; 14.--------------------------------------------------------------------------- NONE_FLAG1 DB FALSE NONE_FLAG2 DB FALSE NONE_FLAG3 DB FALSE ; SI=OFFSET TESTING PARAM. STR, BX=INDEX_NONE_FLAG CHECK_NONE PROC CMP BYTE PTR [SI],BH JNZ @DONE_C MOV NONE_FLAG1[BX],TRUE @DONE_C:INC BX RET CHECK_NONE ENDP NO_PATH DB 7,'CURRENT' OR_SIGN DB 2,'OR' CHECK_PARAMETRS PROC NEAR XOR BX,BX MOV SI,OFFSET F_STR CALL CHECK_NONE MOV SI,OFFSET S_STR CALL CHECK_NONE MOV SI,OFFSET T_STR CALL CHECK_NONE MOV SI,OFFSET NO_PATH MOV DI,OFFSET PATH CALL COMP_UP_DOWN JNZ @N_CURR MOV SI,OFFSET TYPE MOV BYTE PTR [DI],1 ; ONE CHAR IN PATH = FIRST OF TYPE INC DI LODSB CBW MOV CX,AX ; NUMBER BYTES IN TYPE LODSB ; AL=FIRST CHAR IN TYPE STOSB ; PUT HIM TO PATH DEC CX JZ @N_CURR ; ONLY ONE CHAR IN TYPE DEC BYTE PTR [SI-2] ; MINUS ONE CHAR FOR TYPE LEA DI,[SI-1] ; POINT TO PREVIOUS CHAR REP MOVSB @N_CURR:CMP OR_FLAG,TRUE JNZ @OR MOV OR_FLAG,FALSE MOV SI,OFFSET OR_STR MOV DI,OFFSET OR_SIGN CALL COMP_UP_DOWN JNZ @OR MOV OR_FLAG,TRUE @OR: RET CHECK_PARAMETRS ENDP ; END:14 ; 13.--------------------------------------------------------------------------- ; [BP+4]=ADDR OF RESULT MESSAGE LINE DB 80,80 DUP('-'),13,10 Res_Number DW 0 Divisor db 1,'\' Write_Found Proc mov di,offset Found_File push di push di push di push di mov byte ptr [di],6 inc di mov al,' ' mov cx,6 rep stosb inc Res_Number push Res_Number push offset Found_File+1 call Get_Decimal_Str mov byte ptr [di],'.' push offset WorkDir call Add_Str push offset Divisor call Add_Str push offset Exec_Path call Add_Str call Write_Result RET WRITE_FOUND ENDP WRITE_RESULT PROC NEAR PUSH BP MOV BP,SP MOV SI,[BP+4] LODSB CBW MOV DX,SI ADD SI,AX MOV WORD PTR [SI],0A0DH ; CR AND LF MOV CX,AX ADD CL,2 MOV AH,40H PUSH BX MOV BX,DESCR_RES INT 21H POP BX POP BP RET 2 WRITE_RESULT ENDP ; END:13 ; 12.--------------------------------------------------------------------------- END_RES_MESSAGE DB 19,'TOTAL FOUNDED: ? ' CLOSE_RESULT PROC NEAR push Res_Number push offset END_RES_MESSAGE+16 call Get_Decimal_Str push offset END_RES_MESSAGE call Write_Result MOV AH,3EH MOV BX,DESCR_RES INT 21H RET CLOSE_RESULT ENDP ; END:12 ; 11.--------------------------------------------------------------------------- RES_FILE DB 'RESULT.TXT',0 DESCR_RES DW ? MESSAGE_ERR DB 43,'CAN"T CREATE RESULT-FILE... PRESS ANY KEY...',' ' ZAGL_RES DB 40,'FIND3STR PROTOCOL FILE. DEAD WORLD INC.',1,' ' ZAGL_FOR DB 15,'YOU LOOKED FOR:',' ' ZAGL_RES_END DB 11,'YOU FINDED:',' ' ADDRESS_AREA DW OFFSET ZAGL_RES DW OFFSET LINE DW OFFSET ZAGL_FOR DW OFFSET PATH DW OFFSET F_STR DW OFFSET S_STR DW OFFSET T_STR DW OFFSET LINE DW OFFSET ZAGL_RES_END OPEN_RESULT PROC NEAR MOV AH,3CH XOR CX,CX MOV DX,OFFSET RES_FILE INT 21H JC @ERR_R MOV DESCR_RES,AX MOV SI,OFFSET ADDRESS_AREA MOV CX,9 @WR_ZAGL: LODSW PUSH CX PUSH SI PUSH AX CALL WRITE_RESULT POP SI POP CX JC @ERR_R LOOP @WR_ZAGL RET @ERR_R: PUSH OFFSET MESSAGE_ERR CALL SHOW_MESS call Stop STC RET OPEN_RESULT ENDP ; END:11 ; 10.--------------------------------------------------------------------------- ; DI=ADDR OF STR, WHICH MUST BE FOUND INTO FILE_BUFFER, CX=NUMBER OF SCANNING ; BYTES THERE. F_FIND_FLAG DB FALSE S_FIND_FLAG DB FALSE T_FIND_FLAG DB FALSE SAVE_POINTER DD ? READ_FOR_COMPARE PROC PUSH BX PUSH DX PUSH CX MOV BX,DATA_DESCR ; DESCR OF DATA FILE MOV DX,AX ; DX=POINT TO NEW CHAR MOV CX,1 ; TRY TO READ ONE CHAR MOV AH,3FH INT 21H TEST AX,AX ; CHECK NUMBER OF READING BYTES STC ; SET ERROR FLAG JZ @LAST_C ; THERE AIN"T CHARS POP CX ; RESTORE CONTER INC CX ; PLUS ONE CHAR PUSH CX ; SAVE COUNTER AGAIN CLC @LAST_C:POP CX POP DX POP BX RET READ_FOR_COMPARE ENDP COMPARE_STRINGS PROC NEAR PUSH BX PUSH CX PUSH SI PUSH DI MOV BX,DATA_DESCR MOV AX,4201H XOR DX,DX PUSH CX MOV CX,DX INT 21H ; GET DATA_FILE POINTER (DX:AX) MOV WORD PTR SAVE_POINTER,AX MOV WORD PTR SAVE_POINTER+2,DX POP CX MOV DL,[DI] ; DL=NUMBER OF CHARS MOV DH,DL ; DH'S TOO INC DI ; DI=OFS(STR) MOV SI,OFFSET FILE_BUFFER MOV BP,SI ; BP=FILE_BUFFER ADD BP,CX ; BP=FILE_BUFFER+LENG_BUFFER DEC BP ; BP=POINT TO LAST CHAR XOR BX,BX ; LOOK TO THE FIRST CHAR IN STR @SEE: MOV AL,[BX+SI] ; LOAD CURRENT CHAR CMP AL,96 JB @UP CMP AL,122 JA @UP SUB AL,32 @UP: CMP [BX+DI],AL ; CHARS IS EQUAL ? JNZ @NEXT_C ; NO-NEXT CHAR INC BX MOV AX,BX ADD AX,DI ; AX=BX+DI CMP AX,BP ; OUT OF BOUNDARY ? JBE @IN_BOUND ; NO - LET"S NEXT CHAR CALL READ_FOR_COMPARE ; TRY TO GET NEXT CHAR FROM FILE JC @END_ ; DONE IF ERROR @IN_BOUND: DEC DL JNZ @SEE JMP @OK ; FOUND ! @NEXT_C:INC SI ; GO TO NEXT CHAR INTO BUFFER MOV DL,DH ; RESTORE NUMBER LOOKING CHARS XOR BX,BX ; LOOK FROM FIRST CHAR IN STR LOOP @SEE ; SEE ALL CHARS FROM STRING STC ; DIDN'T FIND JMP @END_ @OK: CLC ; YES ! @END_: MOV BX,DATA_DESCR MOV AX,4200H MOV DX,WORD PTR SAVE_POINTER MOV CX,WORD PTR SAVE_POINTER+2 PUSHF INT 21H ; RESORE FILE POINTER POPF POP DI POP SI POP CX POP BX RET COMPARE_STRINGS ENDP ; END:10 ; 9.--------------------------------------------------------------------------- Set_Path Proc Near push bx mov bx,offset Type inc word ptr [bx] add bl,[bx] adc bh,0 mov byte ptr [bx],0 mov bx,offset Path inc word ptr [bx] add bl,[bx] adc bh,0 mov byte ptr [bx],0 pop bx ret Set_Path Endp ; END:9 ; 8.--------------------------------------------------------------------------- ; [BP+4]=ADDRES OF STRING FOR SAVE PARAMETR READ_PARAMETR PROC NEAR PUSH BP MOV BP,SP MOV SI,[BP+4] LODSB CBW MOV DI,SI MOV CX,AX TEST AX,AX JZ @GOOD_P @GET_P: LODSB CALL U_CHAR STOSB LOOP @GET_P @GOOD_P: POP BP RET 2 READ_PARAMETR ENDP ; END:8 ; 6.--------------------------------------------------------------------------- CHECK_AS_OR PROC NEAR MOV AL,F_FIND_FLAG ; SET FIND STATUS XOR AL,NONE_FLAG1 ; CLEAR IF NONE MOV AH,S_FIND_FLAG ;... XOR AH,NONE_FLAG2 MOV DL,T_FIND_FLAG XOR DL,NONE_FLAG3 ADD AL,AH ; ADD 2-STR FINDING STATUS ADD AL,DL ; ADD 3-STR FINDING STATUS TEST AL,AL ; SET ZF RET CHECK_AS_OR ENDP SCAN_FILE PROC NEAR MOV AX,3D00H ; ONLY READING XOR CX,CX MOV DX,OFFSET EXEC_PATH+1 INT 21H JNC @OP_GOOD JMP @B_SCAN @OP_GOOD: MOV BL,NONE_FLAG1 MOV F_FIND_FLAG,BL ; SET FLAG=FIRST STRING NOT FOUND / NONE MOV BL,NONE_FLAG2 MOV S_FIND_FLAG,BL ; SET FLAG=SECOND STRING NOT FOUND / NONE MOV BL,NONE_FLAG3 MOV T_FIND_FLAG,BL ; SET FLAG=THIRD STRING NOT FOUND / NONE MOV BX,AX MOV DATA_DESCR,AX ; SAVE DESCRIPTOR MOV BLOCK_NUMBER,0 PUSH OFFSET MESSAGE11 CALL SHOW_MESS @LOOK: call Abort ; CHECK USER INTERRUPT (IF BACKSPACE IS PRESSED) NO_AB: MOV DX,BLOCK_NUMBER MOV AL,160 MUL CURSOR MOV DI,AX ADD DI,44-160 CALL DEBUG MOV AH,3FH MOV CX,BUFFER_SIZE MOV DX,OFFSET FILE_BUFFER INT 21H jc @B_Scan TEST AX,AX JZ @D_SCAN MOV CX,AX INC BLOCK_NUMBER MOV SI,OFFSET F_FIND_FLAG MOV DI,OFFSET F_STR @FIND_3:CMP BYTE PTR [SI],TRUE JZ @FINDED CALL COMPARE_STRINGS JC @FINDED MOV BYTE PTR [SI],TRUE @FINDED:ADD DI,65 INC SI CMP SI,3+OFFSET F_FIND_FLAG JB @FIND_3 CMP OR_FLAG,TRUE JNZ @OR_NO CALL CHECK_AS_OR JZ @LOOK JMP @OK_F @OR_NO: CMP F_FIND_FLAG,TRUE JNZ @LOOK CMP S_FIND_FLAG,TRUE JNZ @LOOK CMP T_FIND_FLAG,TRUE JNZ @LOOK @OK_F: PUSH OFFSET MESSAGE15 CALL SHOW_MESS CALL Write_Found @D_SCAN:MOV AH,3EH INT 21H @G_SCAN:CLC RET @B_SCAN:PUSH OFFSET MESSAGE10 CALL SHOW_MESS MOV AH,3EH INT 21H PUSH OFFSET MESSAGE2 CALL SHOW_MESS call Stop STC RET SCAN_FILE ENDP ; END:6 ; Keyboard Functions ******************************************************** Stop Proc Near xor ah,ah int 16h ret Stop Endp Abort Proc Near push ax in al,60h cmp al,57 pop ax jz @@Abort ret @@ABORT:mov sp,OLD_SP ; RESTORE STACK call Stop jmp @DONE ; String Functions ******************************************************** U_CHAR PROC NEAR CMP AL,96 JB @UP_CHAR CMP AL,122 JA @UP_CHAR SUB AL,32 @UP_CHAR: ret U_CHAR ENDP Fill_MasW Proc Near ; Fill_MasW(WChar,Num,Addr) push bp mov bp,sp pusha push es push ds pop es cld mov di,[bp+4] ; Addr mov cx,[bp+6] ; Num mov ax,[bp+8] ; WChar rep stosw pop es popa pop bp ret 6 Fill_MasW Endp Add_Str Proc Near ; s1:=s1+s2; push bp mov bp,sp pusha push es push ds pop es cld mov si,[bp+6] ; S1 mov bx,si lodsb cbw add si,ax mov di,[bp+4] ; S2 mov cl,[di] xor ch,ch add [bx],cl inc di xchg di,si rep movsb mov [di],cl pop es popa pop bp ret 4 Add_Str Endp Get_Decimal_Str Proc Near ; Word,OFS(STR_DEST): Word push bp mov bp,sp mov ax,[bp+6] MOV DI,[BP+4] ; Str_Address MOV WORD PTR [DI],' ' MOV WORD PTR [DI+2],' ' MOV SI,10000 MOV CX,10 XOR BP,BP @NUMERICAL: XOR DX,DX DIV SI TEST AL,AL ; DEC. VAL=0 ? JZ @SKIP INC BP ; SET FLAG FOR OUTPUT @SKIP: ADD AL,'0' TEST BP,BP JZ @SKIP_OUT ; NO DISPLAY STOSB @SKIP_OUT: PUSH DX MOV AX,SI XOR DX,DX DIV CX MOV SI,AX POP AX ; RESTORE AX TEST SI,SI JNZ @NUMERICAL TEST BP,BP JNZ @WAS_OUT MOV AL,'0' STOSB @WAS_OUT: POP BP RET 4 RET GET_DECIMAL_STR ENDP Debug Proc Near ; ES:DI=SCREEN POSITION, DX=CONV_WORD. push es push 0b800h pop es mov cx,4 @@N_M: rol dx,4 mov al,dl and al,0FH cmp al,10 sbb al,69h das mov ah,9 stosw loop @@N_M pop es ret Debug Endp ; SHOW STRING ON DISPLAY: PUSH ADDR_STRING, CALL SHOW_MESS. ; AUTO SCROLLING AND NUMERICAL DISPLAYING MESSAGES ! COLOR = 9 AND 12. ; SAVING ALL REGISTERS. MESS_CURS DB '@ ?: ' Show_Mess Proc Near push bp mov bp,sp PUSHA PUSH ES PUSH DS PUSH 0B800H POP ES CLD MOV AL,160 MUL CURSOR MOV DI,AX MOV AH,9 MOV CX,6 MOV SI,OFFSET MESS_CURS @FILL: LODSB STOSW LOOP @FILL SUB DI,5*2 MOV DX,COUNT CALL DEBUG ADD DI,2*2 MOV SI,[BP+4] LODSB XOR CH,CH MOV CL,AL MOV AH,15 @SHOW: LODSB STOSW LOOP @SHOW MOV BX,DI INC COUNT INC CURSOR CMP CURSOR,24 JB @GOOD_CURSOR JE @F_CUR XOR DI,DI LEA SI,[DI+160] PUSH ES POP DS MOV CX,160*24 REP MOVSB XOR AX,AX MOV CL,80 REP STOSW PUSH CS POP DS @F_CUR: MOV CURSOR,24 @GOOD_CURSOR: MOV SI,[BP+4] MOV DL,[SI] ADD DL,6 MOV DH,CURSOR DEC DH MOV AH,02H XOR BX,BX INT 10H POP DS POP ES POPA pop bp ret 2 Show_Mess Endp ; Find Files Functions ****************************************************** Find_First Proc Near ; Find_First(FileType,Mask,Res_File); push bp mov bp,sp pusha mov ah,4EH mov cx,[bp+6] ; Mask mov dx,[bp+8] ; FileType inc dx int 21H jc @@NoFirst pushf push [bp+4] ; Res_File call File_Name popf @@NoFirst: popa pop bp ret 6 Find_First Endp Find_Next Proc Near ; Find_Next(FileType,Mask,Res_File); push bp mov bp,sp pusha mov ah,4FH mov cx,[bp+6] ; Mask mov dx,[bp+8] ; FileType inc dx int 21H jc @@NoNext pushf push [bp+4] ; Res_File call File_Name popf @@NoNext: popa pop bp ret 6 Find_Next Endp File_Name Proc Near ; File_Name(Str_Addr) push bp mov bp,sp les bx,Dta_Address ; Get DTA Address lea si,[bx+1eh] mov bx,[bp+4] ; Res_File lea di,[bx+1] mov byte ptr [bx],0 @@Move_Str: mov al,es:[si] inc si test al,al jz @@Done_M inc byte ptr [bx] mov [di],al inc di jmp @@Move_Str @@Done_M: mov [di],al ; 0 at the end pop bp ret 2 File_Name EndP Set_Dir Proc Near ; (Addr_Str:word) push bp mov bp,sp pusha mov AH,3Bh mov DX,[bp+4] inc DX int 21h popa pop bp ret 2 Set_Dir Endp Get_Curr_Dir Proc Near ; (Addr_Str:word) push bp mov bp,sp pusha mov si,[bp+4] inc si mov AH,19h int 21h add AL,65 mov [SI],AL mov word ptr [SI+1],'\:' add SI,3 mov AH,47h mov DL,0 int 21h push DS pop ES cld mov AL,0 mov CX,255 mov DI,SI repne scasb sub CL,254 jnz @@N_D inc CL @@N_D: neg CL add CL,3 mov [SI-4],CL popa pop bp ret 2 Get_Curr_Dir Endp Set_Disk Proc Near push bp mov bp,sp mov si,[bp+4] cmp byte ptr [si+2],':' jnz @@NoDisk mov al,[si+1] call U_Char sub al,'A' mov dl,al mov ah,0eh int 21h @@NoDisk: pop bp ret 2 ret Set_Disk Endp Detect_Dta Proc Near PUSH ES MOV AH,2FH INT 21H MOV WORD PTR DTA_ADDRESS+2,ES MOV WORD PTR DTA_ADDRESS,BX POP ES RET Detect_Dta Endp ; END:2 ; DATA SECTION SETUP_FILE DB 'SETUP.DAT',0 COUNT DW 0000H CURSOR DB 0 MESSAGE2 DB 17,'PRESS ANY KEY... ' MESSAGE6 DB 57,'BEGIN SEACHING: ESC=EXIT, ANY KEY=GO ! (BACKSPACE=ABORT) ' MESSAGE8 DB 17,'PROCESS BEGUN... ' MESSAGE9 DB 15,'NO FILE FOUND !' MESSAGE10 DB 31,'DISK READ ERROR: PROCESS BREAK. ' MESSAGE11 DB 20,'READING BLOCK: 0000 '; MESSAGE15 DB 53,'SEACHING GOOD: THERE"RE ALL STRINGS IN THESE FILE !!!' OR_FLAG DB FALSE EXEC_PATH DB 16,16 DUP(' ') PARAMETRS: F_STR DB 64,64 DUP(' ') S_STR DB 64,64 DUP(' ') T_STR DB 64,64 DUP(' ') PATH DB 64,64 DUP(' ') TYPE DB 16,16 DUP(' ') OR_STR DB 2,'??' Undo_Str db 1,'Y' PARAM_SIZE EQU $-OFFSET PARAMETRS BLOCK_NUMBER dw 0 Dta_Address dd ? DATA_DESCR dw ? ; Scanning File Descriptor OLD_SP dw ? Found_File db 256 dup(?) WorkDir db 256 dup(?) StartDir db 256 dup(?) FoundDir db 256 dup(?) DirInd dw 255 dup(?) FILE_BUFFER db 50000 DUP (?) ; END: DATA SECTION TEXT ENDS end begin
|
--------------------
I don't like the drugs (but the drugs like me). M.Manson.
|