Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос скорей теоретический, ламерский... про работу с текстом через BIOS 
:(
    Опции темы
Ruterian
Дата 4.3.2004, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Имеет ли смысл для вывода текста использовать прямую запись в видеопамять? Написал оконный интерфейс для ДОС-проги, которая использует вывод символа через 9-ю функцию int 10h и скроллинг окон 6-й функцией int 10h. Пробовал писать в память - и не заметил никаких переимуществ по скорости... Проц у меня 2,53Ггц, будет ли ОЩУТИМАЯ разница на P1? Или есть более весомые доводы ПРОТИВ использования BIOS?
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 4.3.2004, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



разницы ну никакой через биос или нет
биос тоже потом напрямую пишет


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Ruterian
Дата 4.3.2004, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



oleg1973

> биос тоже потом напрямую пишет

А по скорости? Там же int 10 кучу всего обрабатывает, не будет ли сам обработчик тормозом для первых пней?
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 4.3.2004, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



ну если нортон командеры и на 386 работали то на пнях тем более smile.gif
по мне так удобней напрямую писать


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Serzh
Дата 5.3.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



да... в память писать - руль! но скорость сейчас уже будет не заметна...
хотя если делать какуюнить анимацию в текстовом режиме, то наверное лучше сразу в память! smile.gif
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 5.3.2004, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Да пиши в память, если боишься за быстродействие. Написать процедурки вместо соответствующих функций int-ов - дело 5-10 минут...



--------------------
С уважением, г-н Посол.
PM   Вверх
Jin X
Дата 5.3.2004, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Разницы-то ты не заметишь, однако, если будешь делать прогу для защищённого режима, то тут с прерываниями будет уже сложновато.
Вообще говоря, при записи непосредственно в видеопамять есть один гвоздь: если ты используешь мышку и запишешь на то место, где стоит курсор, то при движении мыши на том месте будет дыра. При использовании int 10h таких проблем не будет, т.к. драйвер мыши перехватывает int 10h и отключает/включает курсор при обращении к нему.
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
Jin X
Дата 5.3.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Да, и ещё одно. При записи непосредственно в видео память, ты можешь выводить любые символы, в т.ч. #7, #8, #13, #10 и т.д, а при использовании int 10h эти символы будут заменяться (по-моему, во всех функциях) на бип, переход назад, возврат корретки и переход на новую строку соответственно.
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
Ruterian
Дата 6.3.2004, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Я пишу скан поверхности жесткого диска, с использованием псевдографики. Там, в отличие от NC, выводится очень много динамических элементов: сам скан+ заполнение таблички "на лету" с сортировкой секторов по времени доступа+индикаторные лампочки ATA-регистров. Окно со сканом постоянно скроллируется вверх.
Поэтому было бы неплохо ускорить быстродействие... но я не знаю, как написать процедуру, выводящую строку символов в окно, чтобы совсем отказаться от прерываний. Чем прокручивать окно? И наверно, превышение границ в памяти вычислять сложней, чем пользоваться функцией 07h INT10 ?

Если не трудно, кинте исходник чего-нибудь, что работает непосредственно с памятью в оконном режиме.
PM MAIL WWW ICQ   Вверх
Serzh
Дата 6.3.2004, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



а у тебя окно какое?
просто если если пару строчек сверху/снизу не трогать, то просто... а если еще и по бокам, то посложнее...

PM MAIL WWW ICQ   Вверх
Ruterian
Дата 6.3.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Окно динамически меняется в зависимости от выполняемой задачи. Это - скан поверхности, в окно выводится псевдографика. Остальное - по фиксированным адресам.user posted image
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 7.3.2004, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



имхо
рисовать в буффере
и кидать в экран


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 7.3.2004, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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,'*.confused.gif',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: confused.gif?  '
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 '@confused.gif?: '
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.
PM MAIL ICQ   Вверх
Ruterian
Дата 8.3.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Chingachguk

Оооооо.... Спасибо!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.