;███████████████████████████████████████████████████████████████████████████████ ; Program sp.com (Sparrow) ; Author Афанасьев Валерий Геннадьевич ; Begin 12.12.1992 ; End 02.10.1995 ; ;███████████████████████████████████████████████████████████████████████████████ xor_byte equ 0aah ;байт кодировки sp.hlp max_files_in_dir equ 1024 ;не превышать 1024 файлов в директории begin_buf equ 0b0h ;начало первого буфера клавиатуры в CS size_wind equ 9a0h ;максим. размер окна met_stack equ offset stack0+0b9h ;смещение к стеку com_line equ offset stack0+0c0h ;смещение буфера клавиатуры com_line1 equ offset stack0+142h ;смещение доп.буфера клавиатуры path0 equ offset stack0+1d3h ;смещение пути к левой панели path1 equ offset stack0+21ch ;смещение пути к правой панели path_sp equ offset stack0+265h ;смещение к sp.com array_drive equ offset stack0+2b0h ;смещение к массиву дисков one_begin_wind equ offset stack0+2c8h ;смещение к началу экрана begin_wind_mem equ 3680 ;начало буфера окна в памяти cseg SEGMENT LOCALS ASSUME cs:cseg,ds:cseg,es:cseg,ss:cseg ORG 100h start: ;начальная настройка системы mov sp,met_stack mov dx,offset phrase_ver call phrase1 mov cl,4 mov bx,one_begin_wind ;смещение к началу экрана shr bx,cl inc bx mov ah,4ah int 21h call set_segm_data mov ax,2524h ;новый вектор 24h mov dx,offset int_24 int 21h mov ah,19h ;отчет о текущем дисководе int 21h add al,"A" mov si,path_sp mov ds:[si],al ;заслать текущий дисковод в путь0 mov word ptr ds:[si+1],"\:" mov di,si add si,3 mov ah,30h int 21h mov ch,80h cmp al,2 ja met_300 version2: ;версия 2.x mov di,si mov ah,47h cwd int 21h lodsb or al,al jz met_303 xor ax,ax repnz scasb jmp short met_303 met_300: mov ax,ds:[002ch] or ax,ax jz version2 mov ds,ax sub si,si met_301: lodsb cmp al,1 jnz met_301 inc si lodsb and al,11011111b met_302: stosb lodsb or al,al jnz met_302 mov al,"\" std repnz scasb cld inc di inc di met_303: push cs pop ds dec di dec di mov al,"\" scasb jz met_304 stosb met_304: mov word ptr ds:[ path_sp_end ],di mov al,"*" stosb ;Вторичный цикл при запуске внешних программ body: call indic mov ah,19h ;отчет о текущем дисководе int 21h add al,"A" mov di,word ptr cs:met_path[bp] stosb mov si,path_sp + 1 movsw mov si,di mov ah,47h cwd int 21h xor al,al mov cx,64 repnz scasb dec di dec di mov al,"\" scasb jz met_305 stosb met_305: cmp [ met_keep_line ],0 jnz met_06 call indic mov si,met_path[bp] xor bp,2 mov di,met_path[bp] mov cx,64 rep movsb met_06: ;сдвиг экрана ; mov dx,3d4h ; mov al,2 ; out dx,al ; inc dx ; mov al,54h ; out dx,al call set_dta cmp byte ptr ds:video_mode,7 jz met_02 call change_palette met_02: sub di,di mov es,ds:segm_data mov ds,ds:segm_wind call mov_wind met_002: xor dx,dx dec dx xor bx,bx met_a7: inc dx cmp dl,26 ;last drive jae @@met mov ah,0eh int 21h mov ah,19h int 21h cmp al,dl jnz met_a7 mov byte ptr cs:[array_drive + bx],al inc bx jmp met_a7 @@met: dec bx mov byte ptr cs:act_drive[1],bl ;всего драйверов met_0101: push cs pop ds call clear_buf_key call key_bar call indic call set_panel met_080: xor bp,2 met_80: call set_panel xor ax,ax call met_cur15 ;функция cursor, без провер. режима экрана ;ядро системы call command_path mov byte ptr ds:keep_file,0ffh ;запрет поиска выделен. cmp byte ptr ds:act_screen,0 jz met_0 met_088: ;смена 1-ой и 2-ой страниц экрана call begin_param8 sub si,si met30: mov cx,153 met31: call cga @@cycle: mov ax,es:[di] movsw mov [si-2],ax loop @@cycle cmp di,153*24 jb met30 mov cl,(160*23-153*24)/2 jz met31 met_0: call halt met_00: xor cx,cx push cs pop ds or al,al ;функциональные клавиши jz met_201 cmp al,8 ;backspace jz met_200 cmp al,9 ;tab jz met_201 cmp al,27 ;esc jz met_200 cmp al,0dh ;Enter jnz met_03 cmp ah,28 jnz met_03 call key_enter jmp short met_0 met_201: jmp met_2 met_200: jmp met_1 met_03: cmp al,32 jae met_200 cmp ah,24 ;Ctr+"O" jnz met_01 not byte ptr ds:act_screen jmp short met_088 met_01: cmp ah,49 ;Ctr+"N" ;снег jnz met_0150 not byte ptr ds:met_cga jmp short met_0 met_0150: cmp ah,44 ;Ctr+"Z" ;halt процессора jnz met_101 not byte ptr ds:hlt_ass jmp short met_0 met_101: cmp ah,18 ;Ctr+"E" jnz met_04 cmp ds:[ met_keep_line ],cl jz met_0 push cs pop es mov si,com_line1 mov di,com_line mov bx,di mov cl,ds:[di-3] add di,cx add cl,ds:[si-1] mov ch,cl mov ds:[bx-2],cx sub cx,cx mov cl,ds:[si-1] inc cx rep movsb call command_path met_102: jmp short met_0 met_04: cmp byte ptr ds:act_screen,cl jnz met_102 cmp ah,37 ;Ctr+"K" - смена сортировок jnz met_05 ;сменить кодировку рамки mov si,offset ds:wind mov di,offset ds:winda call coder not byte ptr ds:met_convert jmp short met_0103 met_05: cmp ah,47 ;Ctr+"V" ;смена видов сортировок jnz met_0100 not byte ptr ds:met_sort met_0103: mov ds:keep_file,cl jmp met_0101 met_0100: cmp ah,28 ;Ctr+Enter jnz met_07 call ctr_enter jmp short met_102 met_07: cmp ah,38 ;Ctr+"L" jnz met_08 not byte ptr ds:met_info cmp byte ptr ds:met_info,cl jz met_007 call info jmp short met_102 met_007: call indic mov byte ptr ds:keep_file,cl jmp met_080 met_08: cmp ah,19 ;Ctr+"R" jnz met_102 call indic mov ds:[70h],cl jmp met_80 met_2: cmp ah,75 ;стрелка влево jz met_3 cmp ah,77 ;стрелка вправо jz met_3 cmp ah,83 ;удаление jz met_3 cmp ah,68 ;F10 ja met_simbol jz met_f10 cmp ah,59 jb met_simbol ;F1 ;нажаты клавиши доп. клавиатуры или функции F1-F10 cmp ds:act_screen,cl jnz met_f1 xchg al,ah sub al,59 ;F1 shl ax,1 mov bx,ax call ds:met_func[bx] mov byte ptr cs:met_renmov,0 met_f1: jmp short met_sim4 met_1: cmp ah,15 jz met_simbol cmp ah,74 ;- jz met_simbol cmp ah,78 ;+ jz met_simbol ;набор в командной строке имени файла met_3: mov di,com_line call accept jmp short met_sim4 met_simbol: ;нажаты комбинации с ALT или управление курсором cmp ah,16 ;управл. курсором jb met_sim3 cmp ah,51 ;Alt + (Q - M) jb met_sim2 cmp ah,83 ;управл. курсором jbe met_sim3 cmp ds:act_screen,cl jnz met_sim4 cmp ah,120 ;Alt + (1 - =) jb met_sim0 cmp ah,131 ja met_sim4 met_sim2: call alt_key met_sim4: jmp met_0 met_sim3: call cursor jmp short met_sim4 met_sim0: cmp ah,87 ;Shift+F4 jnz met_sim1 call new_edit jmp short met_sim4 met_sim1: cmp ah,92 ;Shift+F9 jnz met_sim5 call setup jmp short met_sim4 met_sim5: call change_pos jmp short met_sim4 met_f10: ;функция выхода с запросом mov di,offset phrase_quit mov si,offset sparrow call needs jc met_sim4 call flign mov ah,4ch int 21h needs: ;запрос ;входные ; si - сообщение над рамкой , di - в рамке mov cx,0512h mov dx,093eh mov al,ds:[ fon4 ] mov ah,al call window xchg si,di mov dh,07h call print_name mov bl,ds:[ fon3 ] mov bh,al met_quit20: mov al,bl mov si,offset phrase_yes mov dx,0823h call phrase mov al,bh mov dl,29h mov si,offset phrase_no call phrase xchg bl,bh met_quit: call halt cmp ah,1 jz @@met cmp ah,77 jz met_quit20 cmp ah,75 jz met_quit20 cmp ah,21 ;Yes jz quit cmp ah,49 ;No jz @@met cmp ah,28 jnz met_quit cmp bl,ds:[ fon4 ] jz quit @@met: stc quit: jmp met_e762 change_palette: push ds push es push ax xor ax,ax mov ds,ax mov al,ds:[449h] mov cs:video_mode,al cmp al,7 jz met_pal2 ;нет cmp al,3 jz met_pal6 cmp al,2 jz met_pal6 mov al,3 int 10h jmp short met_pal6 met_pal2: push cs pop ds mov si,offset param_mda mov di,offset segm_wind call coder met_pal6: pop ax pop es pop ds ret coder: push cx push cs pop es mov cx,11 @@cycle: mov al,es:[di] movsb mov [si-1],al loop @@cycle pop cx ret set_panel: cmp byte ptr ds:keep_file,0 jnz met_81 call locat_name call search_curs met_81: call inst_dir1 met_alt10: ret alt_key: call scan_xlat mov ah,al or al,20h call indic mov bx,num_pos0[bp] call locat_name sub si,48 call seg_dat dec bx met_alt1: inc bx cmp bx,max_pos0[bp] jae met_alt10 add si,48 cmp ds:[si],al jz met_alt2 cmp ds:[si],ah jnz met_alt1 met_alt2: mov num_pos0[bp],bx call write_pan do_cursor: sub ax,ax jmp cursor ;сращивание ret scan_xlat: push ds push cs pop ds push bx mov al,ah mov bx,offset scan_tabl sub bx,16 cmp al,120 jb met_scan1 sub bx,120-(16+35) met_scan1: xlat pop bx pop ds ret mov_wind: mov ax,4 sub si,si @@met: mov cx,460 call cga rep movsw ;сделать копию экрана в буфере dec ax jnz @@met ret ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE NEW_EDIT ;создание нового файла для редактирования ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ new_edit proc near mov si,offset dat_edit mov di,offset create_file call begin_param10 met_edit1: call accept call halt met_edit2: cmp ah,1 jz met_edit9 cmp ah,28 jnz met_edit1 mov dx,begin_buf mov si,dx call search_file jnc met_e03 call create_new_file jc met_edit4 mov bx,ax mov ah,3eh int 21h call clear_window jmp short met_e1 met_edit4: call error met_edit9: call clear_window call command_path ret search_file: mov cl,00100111b mov ah,4eh call int_21 met_edit3: ret new_edit endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE EDIT ;редактирование файла длиной до 64K ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ edit proc near call this_subdir mov dx,si jnz met_edit3 met_e1: call search_file jc met_e4 met_e03: ;переместить редактир. имя в область внешнего редактора ds:si - перемещаем. имя push cs pop es mov di,offset cs:ext_edit+2 mov bx,di mov al," " mov cx,64 @@cycle: scasb jae met_e04 loop @@cycle mov di,bx inc di met_e04: mov byte ptr cs:[di-1],al mov cs:drive_file,di mov cs:name_disp,80h+30 met_e02: lodsb stosb or al,al jnz met_e02 push cs pop ds cmp word ptr ds:drive_file,offset cs:ext_edit+3 jz met_e05 xchg bx,di sub bx,di mov cl,bl mov si,di jmp common_edit ;запуск через Menu met_e05: ;если ошибка,то сменить атрибуты или создать файл mov si,offset ds:dat_edit call begin_view ;ds = cs внутри функции mov si,offset ds:dat_save mov di,160*24+18 mov cl,4 met_e2: movsb inc di loop met_e2 mov al,ds:[ fon3 ] mov si,offset ds:dat_line mov dx,0039h call phrase mov si,offset ds:dat_col mov dl,45h call phrase mov si,offset ds:dat_char mov dl,30h call phrase call insert mov dx,ds:drive_file mov ax,3d00h ;открыть файл для чтения int 21h jnc met_e3 met_e4: call error jmp short met_e999 met_e3: ;проверить наличие памяти для загрузки cmp word ptr ds:[80h+28],0 jnz met_e5 mov cx,ds:[80h+26] cmp cx,ds:size_block jbe met_e6 met_e5: mov al,8 jmp short met_e4 met_e6: ;считать файл mov ds:handle0,ax mov word ptr ds:long_view_file,cx ;запомнить длину файла mov bp,cx call beg_free_m cwd mov bx,ax mov ah,3fh int 21h jc met_e4 call close_file call clear_window push cs pop es xor ax,ax mov di,offset cs:begin_txt mov cx,9 rep stosw ;обнулить некоторые данные mov dx,0100h mov cs:[begin_buf-2],al mov cs:pos_curs,dx sub si,si call seg_win call set_pos_curs met_e50: call edit_screen met_e899: call set_cursor call halt push ax call clear_cursor ;чтобы небыло видно, как тормозит вывод pop ax cmp ah,1 ;Esc jnz met_e900 cmp word ptr cs:met_edit,0 ;небыло редактирования jz met_e999 call begin_param4 call edit_quit jc met_e899 jz met_e999 call save_file met_e999: jmp met_v30 ;выход через view met_e900: cmp ah,68 ;F10 jz met_e999 cmp ah,65 ;F7 jnz met_e798 call begin_param4 jmp edit_search met_e798: cmp ah,90 ;Shift+F7 jnz met_e904 call begin_param4 push cs pop ds jmp met_e784 met_e904: cmp ah,60 ;F2 jnz met_e902 call begin_param4 call save_file jmp short met_e899 met_e902: cmp ah,132 ;ctr+PgUp jnz met_e940 call begin_param4 jmp met_e680 met_e940: cmp ah,83 ;удалить символ справа jnz met_e906 mov cs:met_edit,ax call move_txt call edit_delete jc met_e907 jmp short met_e899 met_e906: cmp ah,14 ;backspase jnz met_e911 cmp al,8 jnz met_e911 mov cs:met_edit,ax jmp met_e607 met_e911: cmp ah,82 ;Insert jnz met_e908 not byte ptr cs:met_ins call insert jmp short met_e912 met_e908: cmp al,19h ;Ctr + Y jnz met_e905 cmp ah,15h ;скан-код " Y " jnz met_e905 call begin_param3 call ctr_y met_e907: mov si,cs:begin_pos_wind jmp met_e50 met_e905: cmp al,0bh ;Ctr + K jnz met_e975 cmp ah,25h ;скан-код " K " jnz met_e975 call begin_param3 call ctr_k met_e912: jmp met_e899 met_e975: or al,al ;не введена буква jz met_e903 mov cs:met_edit,ax jmp met_e600 met_e903: xchg al,ah cmp al,119 ja met_e912 sub al,71 jc met_e912 cmp al,81-71 jbe met_e639 sub al,115-71 jc met_e912 add al,11 met_e639: shl ax,1 mov bx,ax call begin_param4 call out_dx_curs jmp cs:key_tabl_edit[bx] met_e640: cmp si,1 ja met_e642 jz met_e648 jmp short met_e912 met_e642: sub bx,bx ;условие выхода std dec si call mean_simbol met_e643: mov di,si dec di call mean_simbol jnz met_e647 jnc met_e644 ;не начало файла cmp word ptr ds:[si],0a0dh jnz met_e646 jmp short met_e644 met_e647: cmp di,si jz met_e643 mov si,di met_e644: inc si met_e648: inc si met_e646: cld jmp short met_e654 met_e650: mov bx,bp ;условие окончания поиска met_e653: mov di,si inc di call mean_simbol jz met_e654 ;обнаружен конец строки или файла cmp di,si jz met_e653 dec si met_e654: call set_pos_simbol call check or al,al jz met_e652 jmp met_e541 met_e652: jmp met_e549 met_e680: sub si,si mov dx,100h mov word ptr cs:begin_line,0 jmp met_e532 begin_param3: mov cs:met_edit,ax begin_param4: call move_erase call move_txt ret ;--------------------------------- поиск фразы ------------------------------- edit_search: mov si,offset cs:dat_edit call accept_search jc met_e789 met_e784: mov si,offset cs:dat_edit call print_search push cs pop es call out_dx_curs mov bl,dh xor bh,bh sub cx,cx mov dl,cs:[di-2] mov dh,13 inc di ;подогнать под стандарт нач. условия met_e785: mov cl,dl sub di,begin_buf dec di sub si,di mov di,begin_buf met_e799: dec cx js met_e797 cmp si,bp jae met_e786 lodsb cmp al,dh jz met_e783 met_e791: scasb jnz met_e785 jmp short met_e799 met_e783: cmp byte ptr ds:[si],0ah jnz met_e791 inc bx inc si mov di,begin_buf jmp short met_e791 ;не найден совсем met_e786: mov si,offset cs:dat_edit call no_found call halt met_e789: call clear_window call out_dx_curs jmp met_e503 ;найден met_e797: call clear_window cmp bx,23 ja met_e792 mov dh,bl jmp met_e654 met_e792: push bx mov bx,12 push si xor al,al met_e721: or al,al jnz met_e722 call str_search dec bx jnz met_e721 met_e722: pop si pop ax sub ax,bx sub ax,12 add cs:begin_line,ax push bx call set_pos_simbol call check pop bx add bx,12 mov dh,bl call set_pos_curs call set_old_param call reversi_search dec bx met_e723: dec si dec si call reversi_search dec bx jnz met_e723 met_e724: jmp met_e50 ;------------------------ поиск значащего символа --------------------------- mean_simbol: cmp si,bx jz end_mean1 cmp word ptr ds:[si],0a0dh jz end_mean lodsb cmp al,"0" jb mean_simbol cmp al,"9"+1 jb end_mean cmp al,"A" jb mean_simbol cmp al,"Z"+1 jb end_mean cmp al,"a" jb mean_simbol cmp al,"z"+1 jb end_mean cmp byte ptr cs:met_convert,0ffh jz mean_conv cmp al,"А" jb mean_simbol cmp al,"п"+1 jb end_mean cmp al,"р" jb mean_simbol met_mean: cmp al,"ё"+1 ;основная "ё" jae mean_simbol end_mean1: stc end_mean: ret mean_conv: cmp al,"░" ;основная "А" jb mean_simbol jmp short met_mean ;----------------------------- запрос на выход ------------------------------ edit_quit: push cs pop ds mov al,ds:[ fon5 ] mov ah,al mov cx,0611h mov dx,093fh mov si,offset dat_edit + 1 call window mov dh,07h mov si,offset last_save call print_name inc dh mov bl,al mov bh,ds:[ fon4 ] mov cl,1 met_e755: mov al,bh test cl,1 jnz e11 mov al,bl e11: mov si,offset ds:dat_save mov dl,21 call phrase mov al,bh test cl,2 jnz e12 mov al,bl e12: mov si,offset not_save mov dl,29 call phrase mov al,bh test cl,4 jnz e13 mov al,bl e13: mov si,offset cont_edit mov dl,42 call phrase call halt cmp ah,1 ;esc jz e16 cmp ah,28 ;enter jz met_e757 cmp ah,75 jnz e14 test cl,1 jz e19 or cl,8 e19: shr cl,1 jmp short met_e755 e14: cmp ah,77 jnz met_e755 shl cl,1 test cl,7 jnz met_e755 mov cl,1 jmp short met_e755 met_e757: test cl,1 ;save jnz met_e762 test cl,4 ;cont jz met_e762 ;установлен zf - not save ,clc e16: or cl,cl ;сбросить zf stc met_e762: pushf call clear_window popf ret ;------------------- изменение режима вставки/удаления -------------------- insert: push ds push cs pop ds mov dx,0018h mov si,offset ds:dat_ins cmp ds:met_ins,dh ;0 jz met_e611 mov si,offset ds:dat_over met_e611: mov al,ds:[ fon3 ] call phrase pop ds ret ;---------------------------- удаление символа ---------------------------- edit_delete: call out_dx_curs cmp si,bp jz met_e691 cmp word ptr ds:[si],0a0dh jz met_e690 call erase_sim call set_pos_curs met_e691: clc ret met_e690: push si sub ax,ax xchg word ptr cs:pos_backspace,ax mov di,si inc si inc si mov cx,bp sub cx,si add si,ax call movsb_cld dec bp dec bp pop si call set_pos_curs stc ret str_search: push dx mov cx,bp sub cx,si mov dx,0a0dh call scasb_cld pop dx ret ;---------------------------- удалить строку ---------------------------- ctr_y: call out_dx_curs mov word ptr cs:begin_colon,0 xor dl,dl call set_old_param mov di,si call reversi_search push si xchg di,si call str_search sub bp,si mov cx,bp add bp,di call movsb_cld pop si met_e976: call set_pos_curs ret ;----------------------- удалить до конца строки ---------------------- ctr_k: call out_dx_curs push si mov di,si call str_search or al,al jnz met_e977 dec si dec si met_e977: sub bp,si mov cx,bp add bp,di call movsb_cld pop si call edit_line jmp short met_e976 ;----------------------------- записать файл ----------------------- save_file: sub cx,cx ;обычные атрибуты call met_e681 call create_new_file jc met_e770 mov bx,ax call beg_free_m cwd mov cx,bp mov ah,40h int 21h cmp ax,cx jz met_e651 mov al,8 met_e770: call error met_e651: mov ah,3eh int 21h mov word ptr cs:met_edit,0 xor ch,ch mov cl,cs:[80h+21] ;старые атрибуты met_e681: push cs pop ds mov dx,ds:drive_file mov ax,4301h int 21h ret create_new_file: xor cx,cx mov ah,3ch call int_21 ret ;----------------------- ввод буквы в буфер ---------------------------- met_e600: mov cx,cs:size_block dec cx dec cx cmp bp,cx jb met_e601 mov al,8 call error met_e605: jmp met_e899 met_e601: mov dl,byte ptr cs:pos_curs call set_old_param call seg_dat ;в сегменте окна mov si,cs:pos_simbol add si,begin_wind_mem ;------------------------- введена Enter ------------------------- call move_erase cmp ah,28 jnz met_e610 cmp al,13 jnz met_e610 mov ah,0ah mov ds:[si],ax inc bp inc bp add word ptr cs:pos_simbol,2 ;переход на стрелка вправо call move_txt sub word ptr cs:begin_txt,2 mov cs:begin_colon,ax ;только бы <> 0 call out_dx_curs jmp met_e550 met_e610: ;ввести символ в буфер cmp byte ptr cs:met_ins,0 jz met_e631 call over jnc met_e634 ;не сдвигать экран jmp short met_e613 met_e631: mov ds:[si],al inc word ptr cs:pos_simbol inc bp call out_dx_curs mov cx,1 cmp al,9 jnz met_e645 call move_txt call reversi_search mov ah,dl ;сохранить call e558 inc cx call e559 or al,al jz met_e649 xor al,al mov cl,dl sub cl,ah xor ch,ch dec dx ;чтобы компенсировать дальн. увеличение met_e645: ;отобразить символ на экране cmp dl,79 jb met_e602 add word ptr cs:begin_colon,10h sub dl,0fh met_e649: call move_txt met_e634: jmp met_e549 ;сдвинуть экран ;ввести символы в текст и сдвинуть экран met_e602: call e602 mov ah,cs:[ fon0 ] mov bl,dl shl bl,1 add di,bx push ax push cx push di mov si,cs:begin_txt call edit_line pop di pop cx pop ax std rep stosw cld met_e613: jmp met_e541 ;не сдвигать экран ;-------------------- удаление одного символа на экране ---------------- met_e607: call out_dx_curs call move_txt or si,si jz met_e501 dec si mov cs:begin_txt,si or dl,dl jnz met_e630 cmp word ptr cs:begin_colon,0 jz met_e620 inc dx met_e630: dec dx call erase_sim or al,al jz met_e613 call move_erase call check jmp short met_e634 met_e620: call move_erase dec si call reversi_search mov cx,0fffeh call e559 ;удалить символы 0dh и 0ah push si mov di,si inc si inc si mov cx,bp sub cx,di call movsb_cld pop si dec bp dec bp cmp dh,1 jz met_e619 dec dh jmp short met_e634 met_e619: call set_pos_curs dec word ptr cs:begin_line jmp short met_e663 ;------------------------ на строку вверх ------------------------------- met_e510: call reversi_search or si,si jz met_e514 dec si dec si met_e514: call reversi_search call check_pos_cursor2 cmp dh,1 jz met_e512 dec dh met_e606: or al,al jz met_e545 met_e503: call set_pos_curs met_e501: jmp met_e899 met_e512: mov bx,cs:begin_pos_wind cmp bx,2 jb met_e501 dec word ptr cs:begin_line push bx call set_pos_curs pop si dec si dec si met_e663: call reversi_search jmp short met_e662 ;-------------------------- к началу строки --------------------------- met_e585: call reversi_search xor dl,dl jmp short met_e586 met_e555: ;переход на строка вниз mov word ptr cs:begin_colon,0 met_e502: inc word ptr cs:begin_line call set_pos_curs mov si,cs:begin_pos_wind call str_search jmp short met_e662 ;------------------------ на строку вниз ------------------------------- met_e500: call str_search or al,al jnz met_e501 ;конец файла call check_pos_cursor2 cmp dh,23 jae met_e502 inc dh jmp short met_e606 ;------------------------------- вправо ------------------------------- met_e550: cmp si,bp jz met_e541 cmp word ptr ds:[si],0a0dh jnz met_e552 ;обнаружен конец строки inc si inc si xor dl,dl cmp dh,23 jae met_e555 inc dh met_e586: ;переход из "к началу строки" cmp word ptr cs:begin_colon,0 jz met_e541 mov word ptr cs:begin_colon,0 met_e549: call set_old_param met_e545: ;есть переходы call set_pos_curs mov si,cs:begin_pos_wind met_e662: jmp met_e50 met_e552: ;---------- некорректное действие (возможо dl=80), контролир. внутри функции inc dx inc si cmp dl,80 jae met_e570 cmp byte ptr ds:[si-1],9 jnz met_e541 ;сдвинуть met_e570: push si call set_old_param call reversi_search call check_pos_cursor pop si met_e558: or al,al jz met_e549 ;сдвигать met_e541: call set_old_param jmp met_e503 ;-------------------------------- влево ------------------------------- met_e540: or si,si jz met_e541 dec si or dl,dl jz met_e542 dec dx cmp byte ptr ds:[si],9 jnz met_e541 call e400 jmp short met_e558 met_e542: mov cx,cs:begin_colon or cx,cx jz met_e543 mov dl,10h-1 sub cx,10h jae met_e401 add cx,10h dec cx mov dl,cl sub cx,cx met_e401: mov cs:begin_colon,cx call e400 jmp short met_e549 met_e543: dec si cmp dh,1 jnz met_e544 call reversi_search dec word ptr cs:begin_line mov cs:begin_pos_wind,si mov cx,0fffeh ;нельзя определить точно call e559 jmp met_e549 met_e544: dec dh ;------------------------- к концу строки ------------------------------- met_e580: call reversi_search mov cx,0fffeh ;внутри функции контроль call e559 ;внутри check_pos_curs jmp short met_e558 ;------------------------ к концу файла --------------------------------- met_e660: mov bx,17h mov dl,bl sub dl,dh inc dx mov al,bh mov cs:end_pos_wind,bp cmp word ptr ds:[bp-2],0a0dh jnz met_e978 dec bx met_e978: or al,al jnz met_e520 call str_search dec dl ;было dl jnz met_e978 met_e661: or al,al jnz met_e522 call str_search inc word ptr cs:begin_line jmp short met_e661 ;------------------------ на экран вниз --------------------------------- met_e520: mov dx,0a0dh mov bx,17h cmp byte ptr cs:pos_curs[1],23 ;нижняя строка jz met_e525 mov cx,bp xor al,al ;нач. условие ;определить последнюю строку, куда поместить курсор mov si,cs:begin_pos_wind sub cx,si met_e527: or al,al jnz met_e529 call scasb_cld dec bx jnz met_e527 met_e529: mov dx,1700h sub dh,bl mov si,cs:begin_point cmp word ptr cs:begin_colon,0 jz met_e537 ;не сдвигать экран mov word ptr cs:begin_colon,0 jmp met_e549 met_e525: call str_search mov cs:end_pos_wind,si or al,al jz met_e521 jmp met_e899 met_e521: or al,al jnz met_e522 call scasb_cld inc word ptr cs:begin_line dec bx jnz met_e521 met_e522: mov si,cs:begin_point mov dx,1700h push bx call set_begin pop bx mov si,cs:end_pos_wind or bx,bx jz met_e524 met_e523: dec si dec si call reversi_search dec bx jnz met_e523 met_e524: jmp met_e50 ;------------------------ на экран вверх --------------------------------- met_e530: mov dx,100h mov si,cs:begin_pos_wind cmp byte ptr cs:pos_curs[1],1 ;верхняя строка jz met_e535 cmp word ptr cs:begin_colon,0 jnz met_e532 met_e537: jmp met_e541 met_e535: mov bx,cs:begin_line cmp bx,23 jbe met_e534 mov bx,23 met_e534: sub cs:begin_line,bx met_e531: or si,si jz met_e532 dec si dec si call reversi_search dec bx jnz met_e531 met_e532: call set_begin jmp met_e50 ;------------------------------- установка параметров --------------- set_begin: ;dx - должен содержать позицию курсора mov word ptr cs:begin_colon,0 call set_old_param call set_pos_curs ret ;------------------------ построение экрана ----------------------------- edit_screen: cld mov dx,0a0dh call seg_win call beg_free_m mov cs:begin_pos_wind,si mov ah,cs:[ fon0 ] mov di,160 xor bl,bl met_e18: mov byte ptr cs:cga_wait,0 met_e14: cmp di,160*24 jae met_e25 mov cx,cs:begin_colon jcxz met_e16 call scasb_tab call cga cmp si,bp ;не переставлять, контроль длинной строки jae met_e11 or al,al jnz met_e221 inc si inc si mov cx,80 rep stosw jmp short met_e14 met_e221: push bx sub bx,cx mov cx,bx ;база (не ставить cl,bl) mov bh,80 sub bh,cl ;сохранить остаток cx xor al,al rep stosw mov cl,bh ;восстановить pop bx add bx,7 and bx,0fff8h sub bx,cs:begin_colon jmp short met_e17 ;--------выход ---------------------------------- met_e11: ; mov cx,160*24 ; sub cx,di ; shr cx,1 call clear_screen ; xor al,al rep stosw ; call set_screen met_e25: ; ret ; ;------------------------------------------------ met_e16: mov cl,1 call wait_cga mov cx,80 met_e17: cmp si,bp jae met_e11 lodsb cmp al,dl ;enter jz met_e8 cmp al,9 ;tab jz met_e9 met_e10: stosw loop met_e17 met_e12: mov cx,bp sub cx,si call scasb_cld jmp met_e18 met_e8: cmp ds:[si],dh jnz met_e10 inc si xor al,al rep stosw jmp met_e14 met_e9: call tab_sm jbe met_e224 rep stosw mov cl,bh jmp short met_e17 met_e224: add cl,bh rep stosw jmp short met_e12 ;---------------------- смещение от символа tab ------------------------- tab_sm: mov bh,cl add cl,bl mov al,cl dec ax ;al and al,0f8h sub cl,al xor al,al sub bh,cl ret ;--------------------- текущая позиция курсора -------------------------- ;zf=1 - конец файла ;cf=1 - конец строки out_dx_curs: mov dx,cs:pos_curs mov si,cs:begin_txt beg_free_m: mov ds,cs:begin_free_memory ret ;------------- переместить курсор в заданную позицию ------------------- set_pos_curs: ;изменяется ax mov cs:pos_curs,dx mov cs:begin_txt,si call seg_win push bx push bp sub bx,bx mov ah,02h int 10h pop bp pop bx call cga ;колонка с курсором mov di,156 call color1 mov ax,dx xor ah,ah cwd add ax,cs:begin_colon inc ax call number ;строка с курсором mov di,134 call color1 mov al,byte ptr cs:pos_curs[1] cbw cwd add ax,cs:begin_line call number ;символ с курсором mov di,110 mov cl,3 call color2 call beg_free_m cmp si,bp jb met_out mov byte ptr ds:[bp],26 ;последний символ файла met_out: mov al,ds:[si] xor ah,ah cwd call number ;длина файла mov di,78 call color1 mov ax,bp sub dx,dx call number ret color1: mov cx,5 color2: std push di mov ah,cs:[ fon3 ] mov al," " rep stosw pop di cld ret ;-------- поиск конца строки прямой ---------------------------- ;входные si - начало поиска, cx - длина поиска ;выходные si - конец поиска scasb_cld: push es mov cs:begin_point,si mov es,cs:begin_free_memory xchg di,si mov al,dl met_e13: repnz scasb jcxz met_e23 cmp es:[di],dh jnz met_e13 xor al,al ;метка обнаружения dec cx scasb met_e23: xchg si,di pop es ret ;-------- поиск конца строки (только прямой) с учетом табуляции ----- ;входные si - начало поиска, cx - длина поиска ;выходные si - конец поиска, bx - смещение от начала поиска с учетом tab scasb_tab: push di push bp sub bx,bx xchg bp,cx sub cx,si jcxz met_e210 met_e206: cmp bp,bx jbe met_e203 inc bx mov di,bx lodsb cmp al,dl jz met_e204 cmp al,9 jz met_e228 met_e229: loop met_e206 xor al,al jmp short met_e211 met_e228: mov di,bx add bx,7 and bx,0fff8h jmp short met_e229 met_e204: cmp ds:[si],dh jnz met_e229 dec si dec bx met_e210: xor al,al jmp short met_e214 met_e203: mov al,dl ;al <> 0 jz met_e214 ;равенство предыдущего сравнения met_e211: cmp byte ptr cs:pred_point,0 jz met_e214 mov bx,di dec bx dec si met_e214: mov cx,bp pop bp pop di ret ;-------------- занести строку из буфера в текст ---------------- ;на выходе si - новая позиция в тексте move_txt: cmp word ptr cs:pos_simbol,0 jz move_txt01 push ds push es call beg_free_m push ds pop es mov di,bp mov si,bp sub si,cs:pos_simbol mov cx,si inc cx sub cx,cs:begin_txt std rep movsb cld call seg_dat mov si,begin_wind_mem mov di,cs:begin_txt mov cx,cs:pos_simbol add cs:begin_txt,cx rep movsb xchg si,di mov word ptr cs:pos_simbol,0 pop es pop ds move_txt01: ret ;------------------------- контроль позиции курсора ----------------------- check_pos_cursor2: not byte ptr cs:pred_point ;установить 0 - перем. на след. call check_pos_cursor not byte ptr cs:pred_point ret e558: mov cx,cs:old_begin_colon add cx,cs:old_pos_curs ret ;определяет допустимa-ли позиция курсора в строке. Если нет, исправляет ее. ;входные: si- начало строки check_pos_cursor: call e558 e559: ;внешний переход из "курсор влево" push bx push dx mov dx,0a0dh call scasb_tab pop dx call check pop bx ret check: mov al,1 ; <> 0 mov cx,cs:old_begin_colon sub bx,cx jb met_e232 cmp cs:begin_colon,cx jnz met_e232 mov dl,bl cmp bx,79 jbe met_e505 met_e232: xor al,al add bx,cx mov word ptr cs:begin_colon,0 mov dl,bl sub bx,80 jb met_e505 add bx,11h mov cs:begin_colon,bx mov dl,79-10h met_e505: ret this_subdir: call indic call locat_name call seg_dat test byte ptr ds:[si-9],10h ret e400: push si call set_old_param call reversi_search call check_pos_cursor2 pop si ret set_old_param: push cs:begin_colon pop cs:old_begin_colon mov byte ptr cs:old_pos_curs,dl ;только колонку ret ;обратный поиск reversi_search: or si,si jz met_e399 push dx mov dx,0d0ah mov cx,si std call scasb_cld pop dx or si,si jnz met_e546 dec si cmp word ptr ds:[si+1],0a0dh jz met_e546 dec si dec si met_e546: add si,3 met_e399: cld ret e602: mov bl,dh xor bh,bh mov di,bx call mul_80 shl di,1 ret erase_sim: push si push es push ds pop es mov di,si mov cx,bp sub cx,si inc si met_e609: lodsb stosb cmp al,0ah jz met_e614 loop met_e609 jmp short met_e615 met_e614: cmp byte ptr ds:[si-3],0dh jnz met_e609 met_e615: dec bp inc word ptr cs:pos_backspace pop es pop si ; !!!сращивание хвостов!!! ;вывести на экран строку начиная с si edit_line: push si push bp call e602 call set_pos_simbol add bx,cs:pos_simbol ;new mov ax,bx sub ax,cs:begin_colon jb met_e629 ;необходим сдвиг экрана sub bp,cs:pos_simbol mov dl,al mov cx,80 sub cl,al add bx,8 and bx,0fff8h sub bx,cs:begin_colon and bl,7 shl al,1 add di,ax mov ah,cs:[ fon0 ] call cga met_e622: cmp si,bp jae met_e627 lodsb cmp al,0dh ;enter jz met_e623 cmp al,9 ;tab jz met_e625 met_e624: stosw loop met_e622 jmp short met_e627 met_e623: cmp byte ptr ds:[si],0ah jnz met_e624 inc si jmp short met_e627 met_e625: call tab_sm jbe met_e626 rep stosw mov cl,bh jmp met_e622 met_e626: add cl,bh met_e627: xor al,al rep stosw met_e629: pop bp pop si ret set_pos_simbol: push bp mov bp,si call reversi_search push dx mov dx,0a0dh mov cx,0fffeh call scasb_tab pop dx pop bp ret move_erase: push bx mov bx,cs:pos_backspace or bx,bx jz met_e616 push ax push dx push si push ds call beg_free_m mov si,cs:begin_txt mov dx,0a0dh mov cx,bp sub cx,si add cx,bx call scasb_cld cmp si,bp jae met_e621 mov cx,bp sub cx,si mov di,si add si,bx call movsb_cld met_e621: mov word ptr cs:pos_backspace,0 pop ds pop si pop dx pop ax met_e616: pop bx ret movsb_cld: push es push ds pop es rep movsb pop es ret ;------------------ замена одного символа в тексте --------------------- over: call beg_free_m call out_dx_curs call move_txt cmp word ptr ds:[si],0a0dh jnz met_e635 push si mov ds:[si],al inc si mov di,si mov cx,bp sub cx,si inc si call movsb_cld pop si call met_e632 dec bp clc ret met_e635: mov ds:[si],al cmp si,bp jnz met_e637 inc bp met_e637: call edit_line met_e632: inc si inc dx cmp dl,80 jb met_e633 dec dx add word ptr cs:begin_colon,10h sub dl,0fh clc met_e633: ret edit endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE VIEW ;просмотр файла ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ view proc near call this_subdir jnz met_e633 mov si,offset dat_view mov word ptr cs:name_disp,0 call begin_view mov si,offset dat_cnv mov di,160*24+82 mov cl,6 met_v78: movsb inc di loop met_v78 call seg_dat mov ax,3d00h ;открыть файл для чтения call int_21 jnc met_v2 call error jmp met_v30 met_v2: push cs pop ds mov ds:handle0,ax mov al,02h ;указатель на конец call file_indic mov word ptr ds:long_view_file,ax;запомнить длину файла mov word ptr ds:long_view_file[2],dx xor al,al ;указатель на начало call file_indic sub si,si sub bp,bp ;считать файл в буфер call read_view_file jnc met_v5 call clear_window jmp met_v30 met_v5: mov byte ptr cs:[begin_buf-2],0 ;нач. усл. F7 call clear_window call convert_file met_v3: call view_screen mov bx,word ptr cs:size_file push ds pop es met_v14: call halt cmp ah,1 jz met_v30 cmp ah,64 ;F6 jnz met_v76 jmp met_v69 met_v76: cmp ah,65 ;F7 jnz met_v90 jmp met_v75 met_v90: cmp ah,90 ;Shift+F7 jnz met_v95 push cs pop ds cmp byte ptr ds:[begin_buf-2],0 ;ничего не введено jz met_v14 mov ax,ds:begin_pos_wind mov di,ds:old_pos_wind cmp ax,di ja met_v106 cmp si,di jb met_v106 xchg ax,di met_v106: xchg si,ax jmp met_v82 met_v95: cmp ah,68 ;F10 jz met_v30 cmp ah,81 ;на экран вниз jz met_v70 cmp ah,73 ;на экран вверх jnz met_v20 jmp met_v72 met_v20: cmp ah,80 ;на строку вниз jz met_v71 cmp ah,72 ;на строку вверх jnz met_v25 jmp met_v73 met_v25: cmp ah,71 ;к началу файла jnz met_v37 or bx,bx jnz met_v94 sub si,si jmp short met_v3 met_v37: cmp ah,79 ;to end jnz met_v14 jmp met_v74 met_v30: call clear_cursor push cs pop ds call mov_out_wind mov cx,80 mov ax,0720h rep stosw call close_file mov word ptr ds:keep_file,0 ;объедин. keep и size pop ax jmp met_0101 met_v94: not byte ptr cs:met_convert jmp short met_v69 ;--------------------------------F6------------------------------- met_v69: xor al,al ;файловый манипулятор на начало файла call file_indic not byte ptr cs:met_convert mov word ptr cs:size_file,0 call read_view_file jc met_v30 jmp short met_v166 ;---------------------на экран вниз------------------------------- met_v70: cmp si,bp jb met_v53 call read_view_file jc met_v30 jnz met_v16 ;флаг установлен в функции met_v59: jmp met_v14 met_v53: push si mov si,bp call search_wind pop di cmp di,si jae met_v23 mov si,di met_v23: jmp met_v3 ;---------------------на строку вниз------------------------------- met_v71: cmp si,bp jb met_v43 call read_view_file met_v130: jc met_v30 jz met_v59 ;флаг установлен внутри функии met_v16: inc word ptr cs:size_file met_v166: call convert_file jmp short met_v23 met_v43: mov cx,80 mov si,cs:begin_pos_wind met_v26: lodsb cmp al,0dh ;enter jz met_v118 cmp al,9 ;tab jnz met_v110 dec cx and cl,0f8h inc cx met_v110: loop met_v26 jmp short met_v23 met_v118: cmp byte ptr ds:[si],0ah jnz met_v26 inc si jmp short met_v23 ;---------------------на экран вверх------------------------------- met_v72: mov si,cs:begin_pos_wind or si,si jnz met_v61 met_v52: call move_forward jz met_v23 met_v22: ;переход из ---строка вверх--- call read_view_file jc met_v130 call convert_file met_v108: mov si,bp met_v61: call search_wind jmp short met_v23 ;---------------------на строку вверх------------------------------- met_v73: mov si,cs:begin_pos_wind or si,si jnz met_v33 call move_forward jnz met_v22 jmp short met_v23 met_v33: mov di,2 call search_wind1 jmp short met_v23 ;---------------------to end file------------------------------- met_v74: mov dx,word ptr cs:long_view_file[2] mov ax,word ptr cs:long_view_file mov cx,cs:size_block or dx,dx jnz met_v50 cmp ax,cx ja met_v50 mov ax,dx jmp short met_v58 met_v50: div cx met_v58: cmp bx,ax ;на экране уже отображен конец jz met_v108 ;yes inc ax mov word ptr cs:size_file,ax jmp short met_v52 ;-------------------------------F7------------------------------- met_v75: mov si,offset cs:dat_view call accept_search mov si,ds:begin_pos_wind jc met_v92 met_v82: mov ds:[ old_size_file ],bx push ds:[ begin_colon ] pop ds:[ old_begin_colon ] push ds:[ begin_line ] pop ds:[ old_begin_line ] push si mov si,offset cs:dat_view call print_search pop si met_v84: push cs ;не убирать -цикл pop ds mov dx,si mov si,begin_buf xor bx,bx mov bl,ds:[si-2] dec bx lodsb met_v85: mov si,begin_buf+1 mov di,dx mov cx,bp sub cx,di jcxz met_v97 repnz scasb jnz met_v97 mov dx,di mov cx,bx rep cmpsb jnz met_v85 mov si,di ;найден call clear_window mov ds:[ old_pos_wind ],si not byte ptr ds:met_view_color push es pop ds call search_wind met_v124: jmp met_v3 ;не найден совсем met_v96: mov si,offset dat_view call no_found mov ax,ds:[ old_size_file ] mov word ptr ds:[ size_file ],ax mov dx,ds:[ old_begin_colon ] mov cx,ds:[ old_begin_line ] mov bx,ds:[ handle0 ] mov ax,4200h int 21h call read_view_file jz met_v123 call convert_file met_v123: call halt met_v92: mov si,cs:[ begin_pos_wind ] call clear_cursor call clear_window jmp short met_v124 met_v97: ;не найден пока call read_view_file jz met_v96 call check_esc jc met_v96 call convert_file inc word ptr cs:[ size_file ] jmp met_v84 ;set short check_esc: ; cf=1 - была нажата "esc" mov ah,1 int 16h jz met_v98 cmp ah,1 jnz met_v98 stc met_v98: ret search_window: ;si - смещение к фразе view или edit push bx mov cx,071dh mov dx,0a33h mov di,begin_buf mov bl,ds:[di-2] shr bl,1 cmp bl,7 jna met_v83 sub bl,7 sub cl,bl add dl,bl met_v83: mov ah,al inc si call window mov dh,9 mov si,begin_buf call print_name pop bx ret clear_cursor: mov cx,200dh jmp short met_set_curs set_cursor: mov cx,cs:size_cursor met_set_curs: push bp mov ah,1 int 10h pop bp ret begin_param10: call long_window mov si,di mov dx,0807h call phrase begin_param1: push cs pop es mov di,begin_buf-3 sub ax,ax stosb stosw ret accept_search: push cs pop ds call set_cursor mov di,offset search_for call begin_param10 met_v81: call accept call halt cmp ah,28 jz met_v91 met_v107: cmp ah,1 jnz met_v81 met_v87: stc ret met_v91: cmp byte ptr ds:[di-2],0 ;ничего не введено jz met_v87 call clear_window clc ret print_search: call clear_cursor mov al,ds:[ fon4 ] call search_window mov dh,8 mov si,offset searching_for call print_name mov es,ds:[ begin_free_memory ] ret no_found: push cs pop ds call clear_window mov al,ds:[ fon5 ] call search_window mov dh,8 mov si,offset not_found call print_name ret ;---------------------отображение на экране------------------------------- view_screen: call beg_free_m mov cs:begin_pos_wind,si call seg_win mov ah,cs:[ fon0 ] mov di,160 call clear_screen mov dx,0a0dh cmp word ptr cs:met_view_color,0 ;выделять? jz met_v4 ;нет mov bx,bp mov bp,cs:old_pos_wind mov cs:old_pos_wind,bx mov bx,begin_buf mov bl,cs:[bx-2] mov cs:met_view_color,bx sub bp,bx met_v4: cmp di,160*24 jae met_v11 mov cx,80 met_v7: cmp si,bp jae met_v11 lodsb cmp al,dl ;enter jz met_v8 cmp al,9 ;tab jz met_v9 met_v10: stosw loop met_v7 jmp short met_v4 met_v8: cmp ds:[si],dh jnz met_v10 inc si mov al," " rep stosw jmp short met_v4 met_v9: mov al," " mov bl,cl dec bx and bl,0f8h sub cl,bl rep stosw mov cl,bl jcxz met_v4 jmp short met_v7 met_v11: mov bx,cs:met_view_color or bx,bx ;выделять? jz met_v104 ;нет cmp bx,0ffh jnz met_v103 ;конец выделения mov bx,cs:old_pos_wind mov cs:old_pos_wind,bp mov bp,bx mov ah,cs:[ fon0 ] mov word ptr cs:met_view_color,0 xor bh,bh jmp short met_v7 ;начало выделения met_v103: add bp,cs:met_view_color mov ah,cs:[ fon3 ] mov word ptr cs:met_view_color,0ffh jmp short met_v7 met_v104: mov al," " mov cx,160*24 sub cx,di shr cx,1 rep stosw ;отображение количество пройденных байт std mov di,78*2 mov cx,10 mov ah,cs:[ fon3 ] rep stosw mov ax,cs:begin_colon mov dx,cs:begin_line add ax,si adc dx,0 mov di,78*2 call number call set_screen mov al,cs:[ fon3 ] call color ret clear_screen: call cga mov al,25h jmp short met_vi_1 set_screen: mov al,2dh met_vi_1: cmp byte ptr cs:met_cga,0 jz met_vi_2 mov dx,3d8h out dx,al met_vi_2: ret search_wind: mov di,23 ;исправл. на 24 приведет к неполному просмотру search_wind1: mov dx,0a0dh std dec si jz met_v45 cmp ds:[si-1],dx jz met_v294 met_v44: dec di jz met_v41 met_v294: mov cx,80 met_v47: or si,si jz met_v45 lodsb cmp al,dh ;конец строки jz met_v48 cmp al,9 ;tab jnz met_v40 dec cx and cl,0f8h inc cx met_v40: loop met_v47 jmp short met_v44 met_v48: cmp ds:[si],dl jnz met_v40 or si,si jnz met_v241 dec di jz met_v242 jmp short met_v45 met_v241: dec si jmp short met_v44 met_v41: inc si jcxz met_v45 met_v242: inc si inc si met_v45: cld ret view_window: push bp push ds mov cx,061ah mov dx,0a36h mov al,cs:[ fon4 ] mov ah,al inc si call window cmp word ptr cs:name_disp,0 jz met_vw0 mov si,cs:name_disp jmp short met_vw1 met_vw0: call indic call locat_name call seg_dat met_vw1: mov dh,9 mov al,cs:[ fon4 ] call print_name pop ds pop bp ret read_view_file: push bx push es push di call check_end jz met_v6 mov cs:begin_colon,ax mov cs:begin_line,dx mov cx,cs:size_block call beg_free_m push ds pop es mov ah,3fh ;чтение файла cwd int 21h jc met_verror or ax,ax ;была ошибка при считывании jz met_v6 mov bp,ax ;предварит. длина файла mov si,ax push si mov di,2 call search_wind1 ;не показывать последн. строку pop di call check_end ;файл вместился весь ? jz met_v56 ;да mov bp,si ;установить длину файла sub di,si ;длина удаляемой части mov cx,dx mov dx,ax sub dx,di ;уменьшить файловый манипулятор mov ax,4200h int 21h met_v56: sub si,si inc bx ; clear ZF met_v6: pop di pop es pop bx ret met_verror: pop ax jmp met_v30 check_end: mov al,1 call file_indic cmp word ptr cs:long_view_file[2],dx jnz met_v55 cmp word ptr cs:long_view_file,ax met_v55: ret ;Kонвертировать файл ;bp - длина файла convert_file: cmp byte ptr cs:met_convert,0 jz met_v54 or bp,bp jz met_v54 push ds push es push cs push ds pop es pop ds mov si,offset dat_view call view_window mov al,ds:[ fon4 ] mov si,offset dat_conv mov dh,8 call print_name mov bx,offset tabl - 128 mov si,bp met_v17: dec si mov al,es:[si] cmp al,128 jb met_v18 xlat mov es:[si],al met_v18: or si,si jnz met_v17 call clear_window pop es pop ds met_v54: ret move_forward: передвинуть файловый манипулятор на один блок вперед mov cx,word ptr cs:size_file jcxz met_v54 dec cx mov ax,cs:size_block mul cx xchg ax,dx mov cx,ax push bx mov bx,cs:handle0 mov ax,4200h int 21h dec word ptr cs:size_file inc bx ;close ZF pop bx ret begin_view: ;не сохраняет ds call clear_cursor call seg_win mov al," " mov ah,cs:[ fon3 ] mov cx,80 sub di,di call cga rep stosw mov ah,cs:[ fon0 ] mov cx,11*80 rep stosw mov cx,12*80 call cga rep stosw call view_window ;исправить нижнюю линию push si mov al,cs:[ fon3 ] mov dx,0003h call phrase mov ax,ds:[si-4] mov dx,ds:[si-2] mov di,78 call number push cs pop ds mov al,ds:[ fon3 ] call color mov dx,40 mov si,offset bytes call phrase mov al,ds:[ fon4 ] mov si,offset dat_vie mov dh,8 call print_name pop dx ;обмен значениями mov bx,9 mov ah,ds:[ fon3 ] mov al," " mov di,160*24-2 met_v77: mov cx,6 add di,4 rep stosw dec bx jnz met_v77 mov si,offset dat_search mov di,160*24+98 mov cl,6 met_v79: movsb inc di loop met_v79 ret mov_out_wind: push ds call begin_param8 call mov_wind pop ds ret begin_param8: sub di,di call seg_dat seg_win: mov es,cs:segm_wind ret seg_dat: mov ds,cs:segm_data ret file_indic: mov bx,cs:handle0 file_indic1: xor cx,cx mov ah,42h cwd int 21h ret view endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE INT_24 ;обработка критических ошибок, вызываемая DOS ;заменяет int 24h ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ int_24 proc far mov ax,di add ax,19 ;преобразование кода ошибки mov byte ptr cs:met_int_24,0 call error mov al,1 jnc met_error51 mov byte ptr cs:met_int_24,al add sp,6 push cs pop ds call set_dta pop ax pop bx pop cx pop dx pop si pop di pop bp pop ds pop es mov al,83 ;фатальная ошибка stc met_error51: retf 0002 int_24 endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE INT_21 ;вызов функций ;перехватывает int 21h ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ int_21 proc near push bx push es sub bx,bx mov es,bx test byte ptr es:[410h],11000000b ;дисковых устройств два ? jnz met_b4 ;да push ax push dx cmp ah,0eh ;выбор дискового устройства int 21h jnz met_b0 cmp dl,1 ;устройство A или B ja met_b5 ;нет mov bl,dl jmp short met_b1 met_b0: mov bx,dx mov bx,ds:[bx] cmp bh,":" jnz met_b5 or bl,20h sub bl,"a" cmp bl,1 ;устройсво A или B ja met_b5 ;нет met_b1: cmp bl,es:[504h] ;дисковод А или В выбран jz met_b5 ;да mov es:[504h],bl mov al,0f0h ;вывести сообщение о смене драйвера ;в bl находится имя драйвера, на которое надо перейти- A или B add bl,"A" call error met_b5: pop dx pop ax met_b4: pop es pop bx int 21h ret int_21 endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE ACCEPT ;обработка клавиш ;входные;di-начало буфера ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ accept proc near ;ds должен быть равен cs cmp ah,1 ;Esc jnz met_acc0 mov byte ptr cs:met_com,0 call command_path ret met_acc0: push bx push si push di push bp push es push ds mov bx,cs mov ds,bx mov es,bx sub bx,bx mov bl,ds:[di-2] mov byte ptr ds:[di+bx],bh ;отметитить конец фразы push di mov dx,ds:[di-3] xchg dl,dh ;dl - конец фразы, dh - конец пути mov cl,ds:[di-1] xor ch,ch mov bp,127 ;определить размер буфера mov bh,79 ;длина экрана cmp di,begin_buf jnz met_acc01 mov bp,63 ;определить размер буфера mov bh,63 cmp ah,79 ;в конец jnz met_acc50 mov dh,dl jmp met_acc10 met_acc50: cmp ah,71 ;в начало jnz met_acc01 jmp met_acc10 met_acc01: ;обработка клавиши BACKSPACE cmp ah,14 ;клавиша забой jnz met_acc1 cmp dh,cl ;dh-конец пути, cl-положение курсора jnz met_acc02 jmp acc_quit met_acc02: dec dx mov dh,cl dec dh ;dx-содер. новое полож. курсора и конца add di,cx mov si,di dec di sub cx,bp neg cx ;места в буфере rep movsb jmp short met_acc10 met_acc1: cmp ah,83 ;клавиша удаление jnz met_acc2 cmp cl,dl jnz met_acc11 jmp acc_quit met_acc11: dec dx mov dh,cl ;dx-содер. новое полож. курсора и конца add di,cx mov si,di inc si sub cx,bp neg cx ;места в буфере dec cx rep movsb jmp short met_acc10 ;обработка клавиши стрелка вправо met_acc2: cmp ah,77 jnz met_acc4 cmp dl,cl ;длина фразы и положение курсора ja met_acc21 jmp acc_quit met_acc21: mov dh,cl inc dh jmp short met_acc10 ;обработка клавиши стрелка влево met_acc4: cmp ah,75 jnz met_acc8 cmp dh,cl ;dh-конец пути, cl-положение курсора jb met_acc41 jmp acc_quit met_acc41: mov dh,cl dec dh ;dh-полож. курсора, dl-конeц фразы jmp short met_acc10 ;обработка других клавиш met_acc8: mov dh,cl ;положение курсора старое xchg ax,bp cmp dl,al ;длина фразы и размер буфера jb met_acc81 mov dl,al xchg ax,bp jmp short met_acc10 met_acc81: xchg ax,bp or al,al ;символ-признак только вывода jz met_acc10 inc dx inc dh ;новое add di,bp dec di mov si,di dec si sub cx,bp neg cx dec cx std rep movsb cld mov byte ptr ds:[si+1],al met_acc10: pop di mov ah,byte ptr ds:[di-3] ;конец пути cmp dh,dl ;положение курсора и длина фразы jb met_acc17 mov dh,dl met_acc17: cmp dh,bh ;сравн. полож.курсора с размер. экрана jbe met_acc16 mov bl,dh sub bl,bh add bl,ah ;начало фразы jmp short met_acc18 met_acc16: mov bl,ah met_acc18: mov ds:[di-2],dx mov al,dl ;сохранить длину фразы mov dl,dh ;положение символа с курсором sub dl,bl ;положение курсора новое на экране add dl,ah mov cl,bl call seg_win mov di,160*23 mov si,com_line mov dh,23 cmp bp,127 jz met_acc83 mov di,160*9+16 mov si,begin_buf mov dh,9 met_acc83: add si,cx sub cl,al ;длина выводимой фразы neg cl cmp al,bh ;если длина фразы больше bh, то равна bh jb met_acc12 mov cl,bh sub cl,ah met_acc12: ;очистить строку push cx mov cl,ah ;длина пути shl cl,1 add di,cx mov cl,bh sub cl,ah inc cx push di mov ax,0720h cmp bh,63 jnz met_acc19 mov ah,ds:[ fon3 ] add dl,8 ;начальное положение курсора met_acc19: call cga rep stosw pop di pop cx jcxz met_acc15 met_acc13: movsb inc di loop met_acc13 met_acc15: mov ah,2 xor bh,bh int 10h ;переместить курсор ;------------------------- push di acc_quit: pop di ;------------------------- pop ds pop es pop bp pop di pop si pop bx met_ent: ret accept endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE KEY_ENTER ;обработка клавиши Enter ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ key_enter proc near push cs pop es call indic mov si,com_line sub ax,ax mov al,ds:[si-2] cmp ds:[si-3],al ;длина строки и начало директории jnz met_ent3 cmp byte ptr ds:act_screen,ah jnz met_ent ;выход, если на экране не оболочка mov di,met_path[bp] call seg_dat mov dx,di call locat_name mov bl,ds:[si-9] ;атрибут inc di ;определение конца пути к файлу met_ent0: inc di cmp byte ptr cs:[di-2],"\" jnz met_ent01 mov cx,di dec cx ;смещение к след. символу после "\" met_ent01: cmp byte ptr cs:[di],"*" jnz met_ent0 ;сохранить предыдущую директорию jcxz met_ent1 cmp byte ptr ds:[si],"." ;выход из поддиректории? jnz met_ent1 ;нет push si push di push ds push cs pop ds mov di,71h mov si,cx sub cx,cx met_ent02: movsb inc cx cmp byte ptr ds:[si],"\" jnz met_ent02 inc cx mov ds:[70h],cl mov es:[di],ch pop ds pop di pop si ;записать имя в path met_ent1: test bl,10h ;это директория jz met_ent3 met_ent23: lodsb stosb or al,al jnz met_ent23 ;перейти в новую директорию push cs pop ds mov ah,3bh ;установить новую директорию call int_21 jnc met_ent111 call error met_ent111: call read_drive jmp do_cursor ;сращивание ret met_ent3: push cs pop ds call locat_name call search_curs sub cx,cx mov si,com_line mov bx,offset ds:param_block mov ds:[bx+4],cs cmp ds:[si-3],al ;длина строки и начало директории jz met_ent18 ;запуск будет производиться через command.com met_ent4: push cs pop ds call keep_line mov si,com_line mov cl,ds:[si-3] add si,cx sub ax,cx sub si,4 add ax,4 mov bp,ax mov ah,"/" mov ds:[si],ax mov word ptr ds:[si+2]," c" mov word ptr [si+bp],0dh ;Enter mov ds:[bx+2],si mov ax,ds:[002ch] ;сегмент окружения mov dx,002ch ;указатель на 0 or ax,ax jz met_ent9 mov ds,ax sub si,si met_ent8: mov cx,8 mov di,offset comspec rep cmpsb mov dx,si ;смещ. к имени command.com jcxz met_ent9 jmp short met_ent8 ;в коммандной строке ничего не вводилось, ввести из таблицы файлов met_ent18: mov word ptr ds:[bx+2],offset ds:no_param call indic call locat_name mov di,com_line mov al,ds:[di-2] add di,ax call seg_dat dec cx met_ent10: inc cx movsb cmp ds:[si-1],ah jnz met_ent10 mov di,com_line mov dx,di mov ch,cl add es:[di-2],cx add al,cl sub si,4 cmp byte ptr ds:[si-1],"." jnz met_ent12 met_ent22: mov di,offset dat_com call compare jz met_ent21 mov di,offset dat_exe call compare jz met_ent21 mov di,offset dat_bat call compare jnz met_ent12 call command_path jmp met_ent4 met_ent12: call clear_path ret met_ent21: call command_path push cs pop ds call keep_line met_ent9: push ds push cs pop ds call flign push dx mov dx,offset return call phrase1 mov es,ds:segm_data mov ah,49h int 21h pop dx pop ds push cs pop es push dx mov cs:handle1,sp mov ax,4b00h ;выполнить программу int 21h mov dx,cs mov ds,dx cli mov ss,dx mov sp,ds:handle1 sti pop dx jnc met_ent20 cmp dx,com_line jz met_error0f1 mov al,0f1h ;нет command.com met_error0f1: call error met_ent20: mov dx,offset cs:[ return ] call phrase1 call phrase1 call clear_path call command_path call set_segm_data pop ax jmp body set_segm_data: mov ah,48h mov bx,0ffffh int 21h push cs pop ds cmp bh,3 jae met_set1 mov dx,offset quit_no_mem call phrase1 mov ah,4ch int 21h met_set1: mov ah,48h int 21h mov ds:segm_data,ax ret flign: cmp ds:act_screen,0 jnz met_ent25 ;на экране не оболочка call mov_out_wind met_ent25: mov ax,0720h ;!!! не переставлять !!! call seg_win mov di,160*24 mov cx,80 rep stosw ret phrase1: mov ah,9 int 21h ret compare: push si mov cx,4 rep cmpsb pop si ret clear_path: push cs pop ds sub ax,ax mov si,com_line mov al,ds:[si-3] mov bp,ax mov byte ptr [si+bp],ah ;0 mov ah,al mov ds:[si-2],ax ret ;сохранить введенную строку в com keep_line: push si push di push cx mov si,com_line mov di,si sub cx,cx mov cl,ds:[si-3] add si,cx sub cl,ds:[di-2] neg cl mov di,com_line1 mov byte ptr ds:[di-1],cl inc cx rep movsb mov byte ptr ds:met_keep_line ,0ffh pop cx pop di pop si ret key_enter endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE CURSOR ;клавиши управления курсором ;входные:ax - код нажатой клавиши, сгенерированный int 16h ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ cursor proc near cmp byte ptr cs:act_screen,0 jz met_cur15 ;выход, если на экране не оболочка ret met_cur15: push ds push es call begin_param8 call indic ;проверка правильности положения курсора на панели mov dx,num_pos0[bp] or dx,dx jz met_contr5 cmp dx,max_pos0[bp] jb met_contr5 mov dx,max_pos0[bp] dec dx mov bx,dx sub bx,17 jns met_contr4 sub bx,bx met_contr4: mov high_pos0[bp],bx met_contr5: mov bx,met_dir0[bp] ;определяем обсолютное смещение строки с курсором на экране mov si,dx call mul_48 mov al,cs:[ fon0 ] call cga cmp word ptr max_pos0[bp],0 jz met_cur1 cmp ah,82 ;Insert jnz met_cur01 test byte ptr ds:[bx+si+1],10h jnz met_cur35 not byte ptr ds:[bx+si] call select_stat met_cur35: mov ah,80 ;эмулируем нажатие стрелки вниз met_cur01: cmp byte ptr ds:[bx+si],0ffh ;файл выделен? jnz met_cur1 ;нет mov al,cs:[ fon1 ] met_cur1: call change_cursor cmp byte ptr cs:met_info,0 jnz met_cur13 cmp ah,15 ;Табуляция jnz met_cur13 xor bp,2 mov bx,met_dir0[bp] mov dx,num_pos0[bp] shr bp,1 mov word ptr cs:[ act_pan ],bp mov cx,bp mov byte ptr cs:act_drive,cl shl bp,1 call write_path call command_path call set_new_dir mov ah,15 call cga met_cur13: mov cx,high_pos0[bp] ;---------------------------------------------- sub si,si ;подготовка к roll_screen or bp,bp jz met_cur11 add si,80 met_cur11: mov di,si ;---------------------------------------------- cmp ah,80 ;стрелка вниз jnz met_cur4 or dx,dx jz met_cur12 inc dx cmp dx,word ptr max_pos0[bp] pushf dec dx popf jae met_cur40 met_cur12: inc dx add cx,18 cmp dx,cx jb met_cur40 inc word ptr high_pos0[bp] call roll_up met_cur40: jmp met_cur8 met_cur4: cmp ah,72 ;стрелка вверх jnz met_cur5 or dx,dx jz met_cur50 dec dx cmp dx,cx jae met_cur50 dec word ptr high_pos0[bp] call roll_down met_cur50: jmp short met_cur40 met_cur5: cmp ah,71 ;к началу jnz met_cur18 cwd jmp short met_cur24 met_cur18: cmp ah,79 ;к концу jnz met_cur19 mov dx,max_pos0[bp] dec dx jmp short met_cur24 met_cur19: cmp ah,73 ;на страницу вверх jnz met_cur23 sub dx,17 ja met_cur22 cwd jmp short met_cur24 met_cur22: cmp dx,17 ja met_cur24 mov dx,17 jmp short met_cur24 met_cur23: mov cx,max_pos0[bp] ;используется далее !!! cmp ah,81 ;на страницу вниз jnz met_cur25 add dx,17 dec cx cmp dx,cx jbe met_cur24 mov dx,cx met_cur24: jmp short met_cur48 met_cur25: cmp ah,78 ;"+" jnz met_cur27 jcxz met_cur20 met_cur37: mov si,2 call func_select cmp ah,1 ;Esc jz met_cur20 cmp ah,28 ;Enter jnz met_cur37 met_cur26: test byte ptr ds:[bx+si+1],10h jnz met_cur36 cmp byte ptr ds:[bx+si],0 jnz met_cur36 not byte ptr ds:[bx+si] met_cur36: add si,48 loop met_cur26 call select_stat met_cur20: jmp short met_cur48 met_cur27: cmp ah,74 ;"-" jnz met_cur8 jcxz met_cur28 met_cur39: sub si,si call func_select cmp ah,1 ;Esc jz met_cur28 cmp ah,28 ;Enter jnz met_cur39 met_cur29: mov byte ptr ds:[bx+si],0 add si,48 loop met_cur29 met_cur28: call select_stat met_cur48: mov num_pos0[bp],dx cmp word ptr max_pos0[bp],1 jbe met_cur21 call write_pan met_cur8: cmp word ptr max_pos0[bp],1 ja met_cur16 met_cur21: jz met_cur17 jmp short cur_quit met_cur17: sub dx,dx met_cur16: mov si,dx call mul_48 mov al,cs:[ fon3 ] cmp byte ptr ds:[bx+si],0ffh ;файл выделен? jnz met_cur9 ;нет mov al,cs:[ fon6 ] met_cur9: call change_cursor mov num_pos0[bp],dx cur_quit: pop es pop ds ret ;функция запроса select/unselect func_select: push dx push cx push ds push cs pop ds mov cx,061ch mov dx,0a34h lea si,ds:select[si] mov al,ds:[ fon4 ] mov ah,al call window mov dh,08 add si,9 call print_name sub si,si call halt call clear_window pop ds pop cx pop dx ret change_cursor: push cx mov di,dx sub di,high_pos0[bp] add di,2 call mul_80 shl di,1 or bp,bp jz met_cur0 add di,80 met_cur0: add di,3 ;фон второго символа в строке call cga1 mov cx,38 met_cur3: stosb inc di loop met_cur3 pop cx ret ;прокрутка экрана вверх roll_up: push ds mov ds,cs:segm_wind add di,160*2 add si,160*3 sub ax,ax met_cur6: dec ax jns met_cur_a mov ax,8 call cga met_cur_a: mov cx,40 rep movsw add si,80 add di,80 cmp si,160*20 jb met_cur6 mov si,dx call write_line pop ds ret ;прокрутка экрана вниз roll_down: push ds mov ds,cs:segm_wind add si,160*18 add di,160*19 sub ax,ax met_cur7: dec ax jns met_cur_b mov ax,8 call cga met_cur_b: mov cx,40 rep movsw sub si,160+80 sub di,160+80 cmp si,160*2 jae met_cur7 mov si,dx call write_line pop ds ret cursor endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE COMMAND_PATH ;построение в 24 строке пути, вывод его в буфер, указатель на конец строки ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ command_path proc near push ax push bx push cx push dx push si push di push ds push es push bp call indic push cs push cs pop ds pop es mov bx,begin_buf met_com7: mov di,bx mov si,met_path[bp] ;записать путь к файлу в буфер sub dx,dx met_com01: inc si inc dx cmp byte ptr ds:[si-1],0 jz met_com03 cmp byte ptr ds:[si-1],"*" jnz met_com01 met_com03: dec dx sub ax,ax cmp byte ptr ds:met_com,al jnz met_com05 mov dh,dl mov byte ptr ds:[bx-3],dl ;номер символа после пути mov word ptr ds:[bx-2],dx ;всего символов введено met_com05: mov si,bx mov dh,[bx-3] ;конец директории sub ax,ax sub cx,cx mov cl,[bx-2] ;положение последнего символа cmp cl,dh jae met_com82 mov cl,dh ;положение послед. символа и конец дир. mov [bx-2],cl met_com82: cmp dl,dh jbe met_com5 ;обратный сдвиг mov cl,127 cmp di,begin_buf jnz met_com06 mov cl,79 met_com06: push cx add si,cx mov di,si mov al,dl sub al,dh ;разность sub si,ax sub cl,dl inc cx std rep movsb cld pop cx mov ah,al mov si,ds:[bx-2] add ax,si cmp ah,79 jbe met_com12 mov ah,79 met_com12: cmp al,cl jb met_com14 mov al,cl met_com14: mov ds:[bx-2],ax ;символ с курсором и последний jmp short met_com6 met_com5: ;прямой сдвиг mov al,dh add si,ax mov di,si sub al,dl ;разность sub di,ax sub cl,dh rep movsb mov ah,al sub word ptr ds:[bx-2],ax cmp byte ptr ds:[bx-1],79 jb met_com6 add byte ptr ds:[bx-1],al ;символ с курсором ;записать новый путь met_com6: mov byte ptr ds:[bx-3],dl ;номер символа после пути mov si,word ptr met_path[bp] mov di,bx mov cl,dl rep movsb cmp bx,begin_buf jnz met_com8 mov bx,com_line jmp met_com7 ;очистить 24 строку met_com8: mov byte ptr ds:met_com,1 ;метка, что проход не первый ;переслать путь на экран в 24 строку mov cl,dl call seg_win mov di,160*23 mov si,com_line mov al,ds:fon2 call cga met_com02: movsb stosb loop met_com02 cmp byte ptr es:[di-2],"\" jnz met_com04 mov byte ptr es:[di-2],">" met_com04: xor al,al ;метка вывода только строки mov di,com_line call accept pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax ret command_path endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE SET_NEW_DIR ;установление текущей директории ;необходимо ставить после command_path ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ set_new_dir proc near push ax push dx push si push ds push cs pop ds mov si,com_line call set_drive sub ax,ax mov al,ds:[si-3] add si,ax cmp byte ptr ds:[si-2],":" jz met_com15 dec si met_com15: mov al,ds:[si] mov ds:[si],ah ;0 mov dx,com_line push ax mov ah,3bh ;установить новую директорию int 21h pop ax mov ds:[si],al pop ds pop si pop dx pop ax ret set_new_dir endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE MAKDIR ;создание директории на активной панели ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ makdir proc near mov si,offset dat_mkdir mov di,offset create_dir call begin_param10 met_mak1: call accept call halt met_mak2: cmp ah,1 jz met_mak9 cmp ah,28 jnz met_mak1 mov dx,di mov ah,39h ;создать директорию call int_21 jnc met_mak10 call error met_mak9: call clear_window call command_path ret met_mak10: call clear_window mov cx,10h ;поиск директории call indic mov ah,4eh call int_21 mov dx,80h+30 ;смещение к имени в DTA mov ah,4eh int 21h jnc met_mak8 mov ds:keep_file,ch ;0 pop ax jmp met_080 met_mak8: mov si,dx mov ax,offset met_de15 push ax push ds jmp met_de777 locat_name: mov si,num_pos0[bp] call mul_48 add si,met_dir0[bp] add si,10 ret long_window: mov cx,0704h mov dx,0b4ch mov al,ds:[ fon4 ] mov ah,al inc si call window ret makdir endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE HELP ;построение помощи ;выходные :прерывание 16h ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ help proc near int 3 mov si,offset ds:sp_hlp call load_sp_file jnc met_hlp0 mov al,92h ; не обнаружен sp.mnu call error ret met_hlp0: mov cx,0306h mov dx,134ah mov si,offset sparrow mov ah,cs:[ fon3 ] mov al,ah call window call seg_win mov di,160*4+16 sub si,si mov bx,15 met_hlp1: mov cx,40h test bl,2 jz met_hlp2 call cga met_hlp2: lodsb xor al,xor_byte stosb inc di loop met_hlp2 add di,160-40h*2 inc si ;пропустить перевод строки и возврат к. inc si dec bx jnz met_hlp1 call halt call clear_window ret help endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE MENU ;выбор из меню ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ menu proc near ;найти на диске файл sp.mnu и загрузить его mov si,offset ds:sp_mnu call load_sp_file jnc met_us8 met_us48: mov al,91h ; не обнаружен sp.mnu call error ret met_us8: sub si,si sub dx,dx mov ds:[bp],dl mov bx,20 met_us9: call scasb_menu or al,al jnz met_us10 inc dx push si call str_search pop cx sub cx,si neg cx cmp cx,bx jbe met_us9 mov bx,cx jmp short met_us9 met_us10: ;определить размер файла и вывести рамку с содержимым or dx,dx jz met_us48 add bx,4 cmp bx,80 jbe met_us11 mov bx,80 met_us11: mov cs:[6eh],bl ;длина окна sub byte ptr cs:[6eh],3 ;запомнить длину фразы ;определить размер окна shl bl,1 mov cx,bx sub ax,ax ;определить, сколько будет строчек в окне met_us30: add cx,bx cmp cx,size_wind jae met_us32 inc ax cmp al,dl jb met_us30 inc ax met_us32: shr bl,1 mov cx,0350h cmp al,17 jbe met_us14 xor ch,ch cmp al,22 jbe met_us14 mov al,22 met_us14: mov cs:[6fh],al ;запомнить количество строк dec byte ptr cs:[6fh] mov dh,ch add dh,al sub cl,bl shr cl,1 mov dl,cl add dl,bl mov si,offset user_menu mov al,cs:[ fon3 ] mov ah,al call window ;определить начало вывода на экран mov dl,ch xor dh,dh mov di,dx call mul_80 mov dl,cl add di,dx shl di,1 add di,164 ;сдвинуть на след. строку и две позиции push di ;запомнить начальную позицию на зкране mov dx,di call seg_win sub si,si mov bh,cs:[6fh] ;вывод на экран met_us15: call cga met_us20: xor cx,cx mov cl,byte ptr cs:[6eh] met_us16: cmp si,bp jae met_us50 lodsb cmp al,0dh jz met_us17 sub al,9 jz met_us18 add al,9 met_us18: stosb inc di loop met_us16 met_us17: call scasb_menu or al,al jnz met_us50 add dx,160 mov di,dx cmp di,160*22 jae met_us50 dec bh jz met_us50 test bh,1 jz met_us15 jmp short met_us20 met_us50: pop di ;восстановить начальн. позиц. inc di mov dx,di ;сохранить начальн. позиц. sub bx,bx ;установить курсор на верхний файл и отслеживая нажатие клавиш перемещать его met_us52: sub cx,cx call set_fon_line call halt call clear_fon_line sub si,si cmp ah,28 ;Enter jnz met_us63 jmp met_us64 met_us63: cmp ah,1 ;Esc jnz met_us80 call clear_window ret met_us80: cmp ah,80 ;стрелка вниз jnz met_us54 add di,160 inc bx cmp bl,cs:[6fh] jb met_us52 xor bl,bl mov di,dx jmp short met_us52 met_us54: cmp ah,72 ;стрелка вверх jnz met_us60 sub di,160 dec bx jns met_us52 mov bl,cs:[6fh] xor bh,bh dec bx mov di,bx call mul_80 shl di,1 add di,dx jmp short met_us52 met_us60: or al,al jnz met_us74 ;поиск F1 - F10 sub ah,59-"1" ;получим число cmp ah,"1" ;F1 jb met_us52 cmp ah,":" ;F10 ja met_us52 sub si,si mov cx,"fF" met_us31: call scasb_menu or al,al jnz met_us52 call func_key jnc met_us2 add si,4 jmp short met_us31 met_us45: jmp met_us52 met_us74: ;поиск буквы cmp al," " jb met_us45 xor ah,ah mov cl,al mov ch,cl cmp al,"A" jb met_us41 cmp al,"Z" jbe met_us44 cmp al,"a" jb met_us41 cmp al,"z" ja met_us41 met_us44: or cl,20h and ch,11011111b met_us41: call scasb_menu or al,al jnz met_us45 call key jnc met_us2 add si,4 jmp short met_us41 ;определить функ. клавишу по ah, если соотв., то bh - номер строки и clc func_key: cmp [si],cl jz met_fk1 cmp [si],ch jnz met_fk8 met_fk1: cmp [si+1],ah jz met_fk6 cmp [si+3],ah ;определить F10 jnz met_fk8 met_fk6: mov bl,al shr bl,1 ret met_fk8: stc ret key: cmp [si],cl jz met_k1 cmp [si],ch jnz met_fk8 met_k1: cmp byte ptr [si+1],":" jnz met_fk8 mov bl,ah shr bl,1 ret ;файл выбран, запустить через command.com met_us64: call clear_window met_us66: call scasb_menu add si,4 dec bx jns met_us66 met_us2: sub bx,bx call str_search dec si met_us69: inc si cmp byte ptr ds:[si]," " jbe met_us69 common_edit: push cs pop es mov di,com_line mov bp,di mov bl,es:[di-3] add di,bx cmp cx,127 jb met_us70 mov cx,127 sub cl,bl met_us70: cmp byte ptr ds:[si]," " jb met_us72 inc bx movsb loop met_us70 met_us72: push cs pop ds mov byte ptr ds:[di],0 mov bh,bl mov [bp-2],bx call command_path pop ax call key_enter ;запуск set_fon_line: mov al,cs:fon2 mov cl,cs:[6eh] ;длина строки call cga1 met_us91: stosb inc di loop met_us91 ret clear_fon_line: push ax mov al,cs:[ fon3 ] mov cl,cs:[6eh] inc cx std call cga met_us90: stosb dec di loop met_us90 inc di inc di pop ax cld ret ;занести в путь в окружение один из файлов mnu или hlp ;входной ds:si - смещение к имени файла ;выходной ds:dx - смещение к пути bp - длина считанная файла load_sp_file: call save_sp_name mov ax,3d00h call int_21 mov cs:handle0,ax jc met_us7 call beg_free_m cwd mov bx,ax mov cx,cs:size_block mov ah,3fh int 21h mov bp,ax close_file: mov bx,cs:handle0 close_file3: pushf mov ah,3eh int 21h popf met_us7: ret save_sp_name: push cs pop es mov dx,path_sp mov di,ds:path_sp_end mov cx,7 rep movsb ret scasb_menu: push bx push cx xor al,al xor bx,bx met_us3: inc bx cmp bl,4 jae met_us5 cmp byte ptr ds:[si+bx],":" jnz met_us3 inc bx cmp byte ptr ds:[si+bx]," " jz met_us4 cmp byte ptr ds:[si+bx],9 ;tab jz met_us4 met_us5: xor bl,bl call str_search or al,al jz met_us3 met_us4: pop cx pop bx ret menu endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE SETUP ;запись текущего состояния программы на диск ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ setup proc near mov si,offset ds:dat_setup mov di,offset ds:phrase_setup call needs jc met_set10 mov si,offset ds:sp_com call save_sp_name call create_new_file jc met_set5 mov bx,ax push cs pop ds mov dx,100h xor bp,bp xchg word ptr ds:met_com,bp call change_palette mov cx,offset ds:stack0 sub cx,dx mov ah,40h int 21h pushf call change_palette popf xchg word ptr ds:met_com,bp jc met_set5 cmp ax,cx jz met_set10 mov al,8 met_set5: call error met_set10: mov ah,3eh int 21h call command_path ret setup endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE EXEDIT ;выбор из меню ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ exedit proc near mov si,offset dat_menu+1 mov di,offset extern_edit call needs jnc met_change1 mov di,offset ext_edit+2 jmp short met_change2 met_change1: mov si,offset dat_edit mov di,offset extern_edit+23 call begin_param10 met_men1: call accept call halt met_men2: cmp ah,1 jz met_change cmp ah,28 jnz met_men1 xchg si,di mov di,offset ext_edit+2 push cs pop es sub cx,cx mov cl,ds:[si-2] rep movsb met_change2: mov byte ptr ds:[di]," " met_change: call command_path call clear_window met_change3: ret exedit endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE CHANGE_POS ;смена текущего диска ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ change_pos proc near ;вывести окно на сменяемую панель с общим числом дисководов ;определить необходимую длину рамки call mul_2 cmp bl,6*2 ja met_cd10 mov bl,6*2 met_cd10: sub bp,bp mov cx,0514h mov dx,0914h cmp ah,104 ;Alt + F1 jz met_cd11 cmp ah,105 ;Alt + F2 jnz met_change3 ;quit mov bp,40 met_cd11: mov bh,byte ptr ds:act_drive[1] ; all drives sub cl,bl jae met_cd16 add bl,bh add bl,5 or bp,bp jz met_cd13 mov dl,80 mov cl,dl sub cl,bl jmp short met_cd17 met_cd13: xor cl,cl mov dl,bl jmp short met_cd17 met_cd16: add dl,bl add cx,bp add dx,bp met_cd17: mov si,offset drive_letter mov al,ds:[ fon4 ] mov ah,al call window or bp,bp jz met_cd14 mov bp,2 met_cd14: mov di,ds:met_path[bp] sub dl,cl sub dl,bh sub dl,bh sub dl,bh shr dl,1 add dl,cl dec dx ;dx - begin position drive A: sub dh,2 mov ch,dl mov al,ds:[di] sub al,"A" push cx push bx xor cx,cx mov cl,bh xor bx,bx @@cycle1: cmp byte ptr ds:[array_drive+bx],al jz @@exit_cycle1 inc bx loop @@cycle1 @@exit_cycle1: mov al,bl pop bx pop cx mov bl,al met_cd2: mov dl,ch xor cl,cl mov si,array_drive push si met_cd19: ;bl - выделенный драйвер, cl - выводимый на экран драйвер bh - всего драйв. mov al,byte ptr ds:[si] push si mov si,offset drive add al,"A" mov ds:[si],al mov al,ds:[ fon4 ] cmp bl,cl jnz met_cd20 mov al,ds:[ fon3 ] met_cd20: call phrase pop si add dl,3 inc si inc cx cmp cl,bh jbe met_cd19 pop si call halt cmp ah,1 ;Esc jz met_cd_quit cmp ah,28 ;Enter jz met_cd4 cmp ah,75 ;стрелка влево jnz met_cd3 dec bl ;имя драйвера равно "A" jns met_cd2 mov bl,bh jmp short met_cd2 met_cd3: cmp ah,77 ;стрелка вправо jnz met_cd5 cmp bl,bh ;имя драйвера равно максимум. jnz met_cd7 ;да, увеличивать нельзя-повтор. xor bl,bl jmp short met_cd2 met_cd7: inc bx ;увеличить jmp short met_cd2 met_cd5: call scan_xlat sub al,"A" push cx push bx xor cx,cx mov cl,bh xor bx,bx inc cx @@cycle: cmp byte ptr ds:[si+bx],al jz @@exit_cycle inc bx loop @@cycle @@exit_cycle: mov al,bl pop bx or cx,cx pop cx jz met_cd2 mov bl,al met_cd4: xor bh,bh mov al,byte ptr ds:[si+bx] add al,"A" mov ds:[di],al ;вызвать функцию просмотра и отображения на экране директории call clear_window sub ax,ax cmp ds:met_info,al jz met_cd30 mov al,byte ptr ds:act_pan shl al,1 cmp bp,ax jz met_cd30 not byte ptr ds:met_info met_cd30: call inst_dir1 jmp do_cursor met_cd_quit: call clear_window ret mul_2: mov bl,byte ptr ds:act_drive[1] shl bl,1 met_c00: ret change_pos endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE COPY ;копирование файлов с активной панели на другую ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ren_mov: not byte ptr ds:met_renmov copy proc near call indic cmp max_pos0[bp],cx jz met_c00 mov met_overwrite,cl call begin_param8 call locat_name mov di,sum_sel0[bp] or di,di jnz met_c2 test byte ptr ds:[si-9],10h ;директория jz met_c2 cmp byte ptr cs:met_renmov,0ffh jnz met_c00 cmp byte ptr ds:[si],"." ;корневая директория jz met_c00 met_c2: push si push cs pop ds cmp byte ptr ds:met_renmov,0ffh jnz met_c13 mov si,offset dat_renmov call long_window mov si,offset dat_move jmp short met_c16 met_c13: mov si,offset dat_copy call long_window met_c16: mov dx,0807h call phrase or di,di jz met_cop30 mov si,offset dat_delete_files mov dl,0eh call phrase push ax mov ax,sum_sel0[bp] cwd mov di,160*8+32 call number pop ax mov dx,0817h jmp short met_c7 met_cop30: call seg_dat mov dl,0ch pop si push si sub bx,bx call phrase met_c3: inc bx cmp byte ptr ds:[si+bx-1],0 jnz met_c3 add dx,bx met_c7: push cs push cs pop ds pop es mov si,offset dat_to call phrase xor bp,2 mov si,met_path[bp] xor bp,2 mov di,begin_buf mov bx,di met_c4: lodsb stosb or al,al jz met_c5 sub al,"*" jnz met_c4 mov ds:[di-1],al met_c5: sub di,bx dec di mov ds:[bx-2],di mov ds:[bx-3],al pop si mov di,begin_buf call seg_dat cmp word ptr sum_sel0[bp],0 jnz met_c50 test byte ptr ds:[si-9],10h jnz met_c51 met_c50: call accept call halt cmp ah,1 ;esc jz met_c10 cmp ah,28 ;enter jz met_c52 cmp ah,59 ;не функциональная jae met_c6 met_c51: push ax call begin_param1 pop ax met_c6: call accept call halt met_c8: cmp ah,1 jz met_c10 cmp ah,28 jnz met_c6 met_c52: call clear_window ;сделать курсор невидимым call clear_cursor cmp word ptr sum_sel0[bp],0 jz met_c9 mov cx,max_pos0[bp] mov si,met_dir0[bp] add si,10 met_c18: cmp byte ptr ds:[si-10],0ffh jnz met_c28 call copy_file jnc met_c20 cmp ah,1 jz met_c12 cmp ah,31 ;skip jz met_c28 call error jmp short met_c12 met_c20: mov byte ptr ds:[si-10],0feh ;файл удален met_c28: add si,48 loop met_c18 jmp short met_c12 met_c9: call copy_file jnc met_c39 cmp ah,1 jz met_c10 cmp ah,31 jz met_c10 call error met_c10: call clear_window call command_path jmp short met_c31 met_c39: mov byte ptr ds:[si-10],0feh met_c12: mov byte ptr cs:keep_file,0 call memory_free call locat_name cmp byte ptr cs:met_renmov,0ffh jnz met_c26 ;определить позицию курсора на активной панели mov cx,1 cmp word ptr sum_sel0[bp],0 jz met_c30 mov cx,max_pos0[bp] sub cx,num_pos0[bp] jcxz met_c33 met_c37: cmp byte ptr ds:[si-10],0feh ;файл удален jnz met_c33 met_c30: add si,48 loop met_c37 jmp short met_c33 met_c26: xor bp,2 call locat_name met_c33: call inst_dir call inst_dir2 ;определить положение курсора, если переименовывалась директория test byte ptr cs:attrib_file,10h jz met_c34 call indic cmp num_pos0[bp],0 jz met_c34 dec word ptr num_pos0[bp] met_c34: call do_cursor not byte ptr cs:keep_file met_c31: call set_cursor ret inst_dir2: xor bp,2 call locat_name inst_dir: call search_curs inst_dir1: mov si,met_path[bp] sub ax,ax cmp cs:met_info,al jz met_infoend mov al,byte ptr cs:act_pan add al,al cmp ax,bp jnz met_read call set_drive call info met_infoend: push ds push cs pop ds mov dx,si mov bl,"*" met_c14: inc si cmp byte ptr ds:[si],bl jnz met_c14 cmp byte ptr ds:[si-2],":" jz met_c15 dec si mov bl,"\" met_c15: mov byte ptr ds:[si],0 mov ah,3bh ;установить новую директорию call int_21 jnc met_c116 cmp al,83 jnz met_c116 mov ds:noread,al met_c116: mov byte ptr ds:[si],bl call read_drive pop ds met_read: ret copy endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE COPY_FILE ;копирование одного файла на противоположную панель ;si должен содержать смещение к старому имени файла ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ copy_file proc near push es push ds push bx push cx push dx push si mov al,ds:[si-9] mov cs:attrib_file,al ;занести информацию о рабочих дисках mov di,met_path[bp] mov bl,cs:[di] sub bl,"A" mov bh,bl mov word ptr cs:drive_file,bx mov di,begin_buf cmp byte ptr cs:[di+1],":" jnz met_cop02 test al,10h ;директория jz met_cop40 mov byte ptr cs:[di],bl add byte ptr cs:[di],"A" jmp short met_cop02 met_cop40: mov bh,byte ptr cs:[di] or bh,20h sub bh,"a" mov byte ptr cs:drive_file[1],bh met_cop02: ;записать имя выходного файла, если он принят по умолчанию mov ah,0eh mov dl,bl call int_21 push si sub ax,ax mov al,cs:[di-2] add di,ax cmp byte ptr cs:[di-1],"\" jnz met_cop1 met_cop01: lodsb stosb or al,al jnz met_cop01 met_cop1: mov cx,061ah mov dx,0b36h mov al,cs:[ fon4 ] mov ah,al cmp byte ptr cs:met_renmov,0ffh jnz met_c27 mov si,offset cs:dat_renmov+1 call window mov si,offset dat_mov cmp bl,bh ;хранятся имена рабочих дисков jnz met_c29 ;если не равны, то делать move ;сделать переименование pop si mov dh,9 mov al,cs:[ fon4 ] call print_name push cs pop ds push si mov si,offset dat_ren mov dh,8 call print_name pop si call check_esc jc met_cop13 mov dx,begin_buf mov cx,00110111b mov ah,4eh ;поиск файла int 21h jc met_cop19 cmp byte ptr cs:met_overwrite,0ffh jz met_cop25 call compare_prn jbe met_cop13 mov al,80 call error ;файл существует jc met_cop13 met_cop25: call compare_file jc met_cop13 call delete_copy_file met_cop19: call seg_dat mov dx,si ;старое имя mov di,begin_buf ;новое имя mov ah,56h ;переименовать int 21h pushf xor bp,2 call test_max_file ja no_inc_file2 inc word ptr max_pos0[bp] ;для определения выдел. файлов no_inc_file2: xor bp,2 popf met_cop13: jmp met_cop20 met_c27: mov si,offset dat_copy+1 call window mov si,offset dat_cop met_c29: mov dh,8 push ds push cs pop ds call print_name pop ds ;изобразить полоску mov ah,al mov al,cs:wind[10] mov cx,24 mov di,1600+56 call seg_win call cga1 rep stosw pop si ;написать имя файла в рамке mov dh,9 mov al,cs:[ fon4 ] call print_name mov dx,si mov ax,3d00h ;открыть файл для чтения int 21h jc met_cop13 mov cs:handle0,ax mov al,2 ;указатель на конец call file_indic mov si,ax ;запомнить длину файла di:si mov di,dx mov word ptr cs:[long_view_file],ax mov word ptr cs:[long_view_file + 2],dx xor al,al ;указатель на начало call file_indic ;считать файл в буфер call seg_win call end_save call beg_free_m mov ah,3fh ;чтение файла cwd int 21h jc met_cop6 push cs pop ds call read_indic mov dx,begin_buf mov cx,00110111b mov ah,4eh ;поиск файла call int_21 jc met_cop44 cmp byte ptr cs:met_overwrite,0ffh jz met_cop41 call compare_prn jc met_cop6 ;con jz met_cop44 ;prn mov al,80 call error ;файл существует jc met_cop6 met_cop41: mov bx,cs:drive_file cmp bh,bl jnz met_cop4 push si mov si,sp mov si,[si+2] call compare_file pop si jc met_cop6 met_cop4: test byte ptr ds:[80h+21],00000111b jz met_cop44 call change_attrib jc met_cop6 met_cop44: call create_new_file jc met_cop6 cycle: mov cs:handle1,ax mov bx,ax call check_esc jnc met_cop167 met_con1: call delete_nocopy stc met_cop6: jmp short met_cop18 ;указатель на конец met_cop167: mov al,2 call file_indic1 call beg_free_m xor dx,dx call end_save mov ah,40h int 21h jc met_con1 met_cop32: call write_indic cmp ax,cx jz met_cop34 ;нехватает памяти mov al,8 jmp short met_con1 met_cop34: sub si,ax ja met_cop10 dec di js met_cop23 met_cop10: call close_file3 mov bx,cs:handle0 call end_save call set_drive0 mov ah,3fh ;чтение файла cwd int 21h jc met_con1 call read_indic call set_drive1 push cs pop ds mov dx,begin_buf mov ax,3d02h ;открыть для записи int 21h jc met_con1 jmp short cycle met_cop23: push cs pop ds xor bp,2 call test_max_file ja no_inc_file1 inc word ptr max_pos0[bp] ;для определения выдел. файлов no_inc_file1: xor bp,2 call close_file1 cmp byte ptr ds:met_renmov,0 jz met_cop18 call close_file0 pop dx push dx call seg_dat call delete_copy_file met_cop18: call close_file0 met_cop20: call met_e762 ;clear_window pop si pop dx pop cx pop bx pop ds pop es ret end_save: mov cx,cs:size_block or di,di ja met_cop12 cmp si,cx ja met_cop12 mov cx,si met_cop12: ret delete_copy_file: call change_attrib mov ah,41h ;удалить фаил int 21h ret change_attrib: sub cx,cx mov ax,4301h ;изменить атрибуты call int_21 met_cop21: ret delete_nocopy: push ax push cs pop ds call close_file1 mov dx,begin_buf call delete_copy_file pop ax ret close_file0: pushf push ax cmp byte ptr cs:met_renmov,0 jz met_cop117 call set_drive0 met_cop117: call close_file jmp short met_close0 close_file1: pushf push ax call set_drive1 mov bx,ds:handle0 mov ax,5700h int 21h mov bx,ds:handle1 mov ax,5701h int 21h call close_file3 test byte ptr cs:attrib_file,7 jz met_close0 push ds push cs pop ds mov dx,begin_buf mov ax,4301h ;изменить атрибуты xor cx,cx mov cl,ds:attrib_file int 21h pop ds met_close0: pop ax popf ret set_drive0: mov dl,byte ptr cs:drive_file jmp short met_sd0 set_drive1: mov dl,byte ptr cs:drive_file[1] met_sd0: mov ah,0eh call int_21 ret compare_file: ;dx - begin_buf ; si- смещение имени файла push ds push dx mov ax,4300h ;считать атрибуты int 21h xor cl,20h mov ax,4301h ;изменить атрибуты int 21h call seg_dat mov dx,si mov ax,4300h int 21h cmp cl,cs:attrib_file jz met_cop43 xor cl,20h mov ax,4301h int 21h mov al,090h ;попытка удалить самого себя stc met_cop43: pop dx pop ds ret ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE WRITE_INDIC, READ_INDIC ;изображение движущейся полоски копирования файла ;входные: long_view_file - длина файла, al - добавка длины ;di:si - сколько байт осталось считать ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ read_indic: push ax shr ax,1 jmp short met_indic write_indic: push ax met_indic: push cx push dx push si push di sub si,ax sbb di,0 ;проверить на переход через 0 ???? ;умножение на 24 di:si xchg ax,di ;сначала старший разряд di mov cx,24 ;24 - количество символов в полоске mul cx or dx,dx ;число больше ffff,ffff jnz no_indic xchg di,ax xchg si,ax ;затем младший разряд si mul cx add di,dx ;складываю два результата xchg si,ax mov ax,word ptr cs:[long_view_file] mov dx,word ptr cs:[long_view_file + 2] xchg ax,si ;используем di:si для хранения dx:ax xchg dx,di or di,di ;число не очень большое? jz no_inc ;да, уменьшать не будем mov cx,0ffffh ;разделим числа на общий делитель div cx xchg si,ax ;возвратим в dx:ax длину файла xchg di,dx div cx ;cx=65535 xchg ax,si xor dx,dx no_inc: or si,si jz no_div div si ;di:si*24 / dx:ax ;where dx=0 no_div: mov cx,24 sub cx,ax jb no_indic mov di,1600+56 mov ax,0720h call cga1 rep stosw no_indic: pop di pop si pop dx pop cx pop ax ret compare_prn: push si push di push es push cs pop es mov di,offset cs:dat_prn mov si,80h+30 call compare jz met_prn mov di,offset cs:dat_con call compare clc jnz met_prn mov ah,1 stc met_prn: pop es pop di pop si ret copy_file endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE TEST_MAX_FILE ;контроль максимального количества файлов в панели. ;при переполнении cf=1 ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ test_max_file proc near cmp word ptr cs:max_pos0[bp],max_files_in_dir ret test_max_file endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE MEMORY_FREE ;определить размер свободной памяти. ;сохранить количество 16 байтных блоков в [ memory ] ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ memory_free proc near push si push cx push ds push cs pop ds mov si,max_pos0 cmp si,max_pos1 ja met_mem0 mov si,max_pos1 met_mem0: call mul_48 add si,ds:met_dir1 add si,48 ;запас на 1 файл mov ds:met_data,si mov cl,4 shr si,cl add si,ds:segm_data ;первый свободный 16 байтный блок mov ds:begin_free_memory,si int 12h ;размер памяти mov cl,6 shl ax,cl sub ax,si cmp ax,1000h jb met_mem3 mov ax,0ffffh jmp short met_mem2 met_mem3: mov cl,4 shl ax,cl met_mem2: mov ds:size_block,ax pop ds pop cx pop si met_de60: ret memory_free endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE DELETE ;удаление директории или файлов на активной панели ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ delete proc near call indic cmp max_pos0[bp],cx jz met_de60 call locat_name call seg_dat cmp sum_sel0[bp],cx jnz met_de4 cmp byte ptr ds:[si],"." ;текущая директория jz met_de60 met_de4: push si push ds push cs pop ds call window_delete mov dx,081dh mov si,offset phrase_delete call phrase pop ds pop si mov dh,9 cmp word ptr sum_sel0[bp],0 jnz met_de9 call print_name call delete_halt cmp ah,1 ;Esc jz met_de6 mov dx,si test byte ptr ds:[si-9],10h ;директория jz met_de5 ;удалить директорию mov ah,3ah ;удалить поддиректорию int 21h mov al,6 ;директория не пустая jc delete_error ;записать файл для поиска, следующий за позицией курсора met_de2: mov byte ptr ds:[si-10],0feh ;метка удаления 0feh add si,48 mov ax,num_pos0[bp] inc ax cmp ax,max_pos0[bp] jb met_de222 sub si,96 met_de222: call clear_window call search_curs jmp met_de15 ;удалить один файл met_de5: call delete_file jnc met_de2 delete_error: call error jmp short met_de222 ;удалить группу файлов met_de9: ;вывести в окно сообщение о удалении файлов mov si,offset dat_delete_files push ds push cs pop ds call print_name pop ds mov ax,sum_sel0[bp] cwd mov di,160*9+74 call number call delete_halt cmp ah,1 ;Esc jnz met_de112 met_de6: call clear_window ret met_de112: ;определить новую позицию курсора mov si,met_dir0[bp] add si,10 mov cx,max_pos0[bp] mov bx,0ffffh met_de10: call clear_window ;найти удаляемый файл met_de11: call check_esc jc met_de15 inc bx mov al,ds:[si-10] cmp bx,max_pos0[bp] jae met_de15 cmp bx,num_pos0[bp] ja met_de114 jz met_de113 cmp al,0ffh jz met_de12 met_de113: cmp al,0ffh jnz met_de13 inc word ptr num_pos0[bp] jmp short met_de12 met_de13: call search_curs jmp short met_de115 met_de114: cmp al,0ffh jz met_de12 met_de115: add si,48 jmp short met_de11 met_de12: call wind_delete ;удалить call delete_file jc met_de19 ;установить в следующий файл позицию курсора mov byte ptr ds:[si-10],0feh ;метка удаления 0feh add si,48 ;повторить поиск jmp short met_de10 met_de19: call clear_window call error met_de15: mov byte ptr cs:keep_file,0 call inst_dir1 ;сравнить панели, если одинаковые, то прочитать и вторую push cs push cs pop ds pop es mov si,path0 mov di,path1 met_de16: cmp byte ptr ds:[si],0 jz met_de17 ;панели одинаковые? cmpsb jnz met_de18 ;нет jz met_de16 ;пока да met_de17: call inst_dir2 met_de18: not byte ptr cs:keep_file jmp do_cursor delete_file: mov dx,si mov al,ds:[si-9] mov cs:attrib_file,al call delete_copy_file ret search_curs: ; в si установить имя разыскиваемого файла push ds call seg_dat met_de777: push si push ax mov di,071h push cs pop es met_de7: lodsb stosb cmp di,71h+12 ja met_de8 or al,al jnz met_de7 met_de8: sub di,71h xchg ax,di mov es:[70h],al pop ax pop si pop ds ret delete_halt: push si push ds push cs pop ds mov bl,ds:[ fon3 ] mov bh,ds:[ fon4 ] met_de20: mov al,bl mov si,offset dat_delete+1 mov dx,0a20h call phrase mov al,bh mov dl,28h mov si,offset dat_cansel call phrase xchg bl,bh met_de23: call halt cmp ah,1 jz met_de22 cmp ah,77 jz met_de20 cmp ah,75 jz met_de20 cmp ah,28 jnz met_de23 cmp bl,ds:[ fon4 ] jz met_de22 ;истинно mov ah,1 ;ложно met_de22: pop ds pop si ret wind_delete: push si push ds call window_delete mov dh,8 mov si,offset dat_del call print_name pop ds pop si mov dh,9 call print_name ret window_delete: push cs pop ds mov cx,0619h mov dx,0b37h mov al,ds:[ fon4 ] mov ah,al mov si,offset ds:dat_delete+1 call window ret delete endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE PRINT_NAME ;записать в рамке имя файла с центровкой в центре экрана ;входные:si- путь к имени, заканчиващийся нулем, dh-строка, al - фон ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ print_name proc near push bx sub bx,bx met_print0: inc bx cmp byte ptr ds:[si+bx-1],0 jnz met_print0 mov dl,80 sub dl,bl shr dl,1 call phrase pop bx ret print_name endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE READ_DRIVE ;входные: должен быть указан путь для поиска, bp - активная панель ;чтение текущего диска или директории и отображение его содержимого на панели ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ read_drive proc near push bx push cx push dx push si push di push ds push es ;сделать курсор невидимым call clear_cursor call frame call seg_dat push ds pop es sub ax,ax ;записать имена всех выделенныех файлов текущей директории в область данных, ;если требуется оставить выделение cmp byte ptr cs:keep_file,al jnz met_keep3 mov bx,met_dir0[bp] mov di,cs:met_data mov cx,max_pos0[bp] add bx,10 mov byte ptr ds:[di],0ffh ;только бы не 0 jcxz met_keep003 met_keep0: mov si,bx cmp byte ptr ds:[si-10],0ffh jnz met_keep2 met_keep1: lodsb stosb or al,al jnz met_keep1 met_keep2: add bx,48 loop met_keep0 met_keep003: mov word ptr ds:[di],ax dec di mov word ptr cs:keep_number,di met_keep3: push cs pop ds mov word ptr max_pos0[bp],ax mov word ptr num_pos0[bp],ax mov word ptr high_pos0[bp],ax mov si,met_path[bp] mov di,met_dir0[bp] mov word ptr ds:[si+1],"\:" mov word ptr ds:[si+3],002ah ;"*",0 call set_dta cmp ds:noread,al jnz met_exit_r2 ;драйв. не читался call set_drive add si,3 mov ah,47h ;записать текущую директорию в path cwd ;дисковод текущий int 21h jnc met_r39 met_exit_r2: jmp met_rd2 met_r39: mov bx,100h ;метка продолжения поиска поддиректор. cmp byte ptr ds:[si],bl ;нахожусь в корневом каталоге jz met_r00 xor bh,bh ;поиск конца path met_r0: lodsb or al,al jnz met_r0 mov byte ptr ds:[si-1],"\" dec word ptr max_pos0[bp] sub di,48 ;начальное смещение таблицы DIR умен. на 1 поз. met_r00: mov byte ptr ds:met_root,bh mov word ptr ds:[si],".*" mov word ptr ds:[si+2],002ah mov dx,met_path[bp] mov ah,4eh ;поиск первого совпадающего файла mov cx,00110111b ;атрибуты поиска int 21h jnc met_r42 cmp bh,1 ;нахожусь в корне jz met_exit_r2 cmp al,12h ;нет файлов jnz met_exit_r2 mov byte ptr ds:met_error,0ffh call insert_dir jmp short met_r53 met_r42: cmp byte ptr ds:[80h +30 ],"." jz met_r40 cmp bh,1 ;нахожусь в корне jz met_r54 call insert_dir jmp short met_rd3 met_r40: cmp bh,1 ;нахожусь в корне jz met_rd5 met_rd4: call save_name add di,24 ;пропустить место под табл. друг. диска met_rd5: mov ah,4fh ;поиск след. совпадающего файла mov cx,00110111b ;атрибуты поиска int 21h jnc met_r52 mov byte ptr ds:met_error,0ffh jmp short met_r53 met_r52: cmp byte ptr ds:met_root,1 ;нахожусь в корне jnz met_rd6 cmp byte ptr ds:[80h +30 ],"." jz met_r1 jmp short met_r54 met_rd6: cmp byte ptr ds:[80h +30 ],"." jz met_r54 met_rd3: call insert_dir jmp short met_r54 met_r53: call insert_dir cmp byte ptr ds:met_error,0ffh jz met_rd2 met_r1: mov ah,4fh ;поиск следующей совпадающей директории mov cx,00110111b ;атрибуты поиска int 21h jc met_rd2 met_r54: cmp di,ds:met_data jb met_r100 mov byte ptr ds:keep_file,0ffh ;запретить поиск выделений met_r100: call save_name add di,24 ;пропустить место под табл. друг. диска call test_max_file jbe met_r1 met_rd2: push es pop ds call sort call write_pan call write_path call select_stat call command_path cmp byte ptr cs:noread,0 jnz met_rd22 call set_new_dir met_rd22: mov byte ptr cs:noread,0 call memory_free call set_cursor pop es pop ds pop di pop si pop dx pop cx pop bx ret insert_dir: call save_netware add di,48 mov si,offset dir_net mov cx,13 push di rep movsb pop di mov byte ptr es:[di+23],cl ret ;функция записи информации о файле, увеличение указателя save_name: mov si,80h+20 ;смещение имени файла в DTA mov ah,byte ptr ds:[80h+21] mov cx,10 rep movsb mov cl,14 test ah,6 jnz met_r43 met_r44: test ah,10h ;это директория jnz met_r43 ;да mov al,byte ptr ds:[si] cmp al,"A" jb met_r43 cmp al,"Z" ja met_r43 add byte ptr ds:[si],"a"-"A" met_r43: movsb loop met_r44 save_netware: xor al,al cmp byte ptr ds:keep_file,al ;разрешен поиск выделений jnz met_keep9 push di mov di,ds:met_data met_keep4: mov si,80h+30 met_keep5: cmpsb jnz met_keep6 cmp ds:[si-1],al jnz met_keep5 not al jmp short met_keep8 met_keep6: dec di mov cl,13 repnz scasb cmp di,ds:keep_number jb met_keep4 met_keep8: pop di met_keep9: mov byte ptr es:[di-24],al inc word ptr max_pos0[bp] or bl,bl ;bl = 1 -найдена позиция курсора jnz met_r21 cmp bh,1 ;пропустить две позиции ja met_r23 inc bh jmp short met_r24 met_r23: inc word ptr num_pos0[bp] met_r24: mov cl,byte ptr ds:[70h] jcxz met_r25 push di mov si,71h sub di,14 rep cmpsb pop di jnz met_r21 met_r25: inc bx met_r21: ret ;функция вывода содержимого таблицы директории на экран write_pan: push cx call seg_dat mov si,num_pos0[bp] sub cx,cx cmp si,17 jb met_r15 mov cx,si sub cx,17 met_r15: mov high_pos0[bp],cx mov si,cx mov cx,18 met_r4: test cl,1 jnz met_r_a call cga met_r_a: call write_line inc si loop met_r4 pop cx ret set_drive: mov dl,cs:[si] ;имя драйвера sub dl,"A" mov ah,0eh ;назначение активного устройства call int_21 ret read_drive endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE WRITE_LINE ;вывод на экран имени файла с параметрами ;входные:si-позиция в DIR bp - активная панель ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ write_line proc near push ax push bx push cx push dx push si push di push ds push es call begin_param8 mov di,si sub di,high_pos0[bp] mov cx,si ;используется для хранения поз. файла call mul_48 add si,met_dir0[bp] ;смещение к файлу в таблице DIR mov bx,bp shr bx,1 add di,2 shl di,1 add di,bx mov al," " ;пробел mov ah,cs:wind[8] call one_line cmp cx,max_pos0[bp] ;используется для очистки экрана jb met_r9 jmp met_r80 met_r9: call mul_80 ;смещение к точке вывода имени add di,2 ;отступ вывода имени push di ;для заполнения следующей графы mov bx,si ;сохраним базу add si,10 ;смещение к имени в таблице DIR mov dl,byte ptr ds:[bx+1] mov al,cs:[ fon0 ] cmp byte ptr ds:[bx],0ffh ;файл выделен? jnz met_r45 ;выделить строку push di mov al,cs:[ fon1 ] mov cx,38 met_r47: inc di stosb loop met_r47 pop di met_r45: mov cx,12 ;длина имени + атрибут, не ставить cl cmp word ptr ds:[si],".." jnz met_r5 movsb inc di movsb xor ah,ah jmp short met_r49 met_r5: lodsb or al,al jz met_r49 cmp cl,3 jz met_r49 cmp al,"." jnz met_r8 lodsb sub cl,3 shl cl,1 add di,cx mov cl,3 met_r8: stosb inc di loop met_r5 met_r49: pop di ;начало вывода test dl,6 ;файл скрытый или системный jz met_r11 mov dh,cs:wind[10] mov byte ptr es:[di+16],dh met_r11: push di add di,26 ;следующая колонка test dl,10h ;это директория jz met_r50 ;нет push cs pop ds mov cl,9 mov si,offset ds:dat_sub_dir or ah,ah jnz met_r10 mov si,offset ds:dat_up_dir met_r10: movsb inc di loop met_r10 call seg_dat jmp short met_r51 met_r50: ;вывод длины файла add di,16 mov ax,ds:[bx+6] mov dx,ds:[bx+8] call number met_r51: ;вывод даты pop di add di,48 mov al,ds:[bx+4] and ax,00011111b cwd call space mov ax,ds:[bx+4] and ah,1 mov cl,5 shr ax,cl call space xor ah,ah mov al,ds:[bx+5] shr al,1 add al,80 cmp al,100 jb met_r16 sub al,100 met_r16: call number add di,6 mov byte ptr es:[di+4],"0" mov al,ds:[bx+3] and al,11111000b mov cl,3 shr al,cl cbw cwd call number mov byte ptr es:[di+2],":" add di,6 mov ax,ds:[bx+2] and ax,0000011111100000b mov cl,5 shr ax,cl cwd call number met_r80: pop es pop ds pop di pop si pop dx pop cx pop bx pop ax ret space: call number mov byte ptr es:[di+2],"-" mov byte ptr es:[di+4],"0" add di,6 sub dx,dx ret write_line endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE FRAME ;построение панели ;входные; bp - указатель панели ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ frame proc near push ds push bp shr bp,1 sub bx,bx or bp,bp jz met_fr2 mov bl,40 met_fr2: push cs pop ds mov cx,bx ;первый столбец,первая строка mov dx,1628h ;23 строка,40 столбец add dl,bl mov si,offset sparrow mov ah,byte ptr ds:[ fon0 ] mov al,ah ;фон сообщения = фону поля call window mov di,bp mov ah,byte ptr ds:wind[6] mov al,byte ptr ds:wind[1] call one_line inc di inc di mov ah,byte ptr ds:wind[8] mov al," " call one_line mov di,40 add di,bp mov ah,byte ptr ds:wind[7] mov al,byte ptr ds:wind[9] call one_line ;построение mini_status линии mov al,byte ptr ds:[ fon1 ] mov dx,0104h ;положение выводимой фразы add dl,bl mov si,offset dat_name call phrase ;построить надпись "Name" add dl,12 ;передвинуть позицию вывод. фразы mov si,offset dat_size call phrase add dl,9 mov si,offset dat_date call phrase add dl,8 mov si,offset dat_time call phrase pop bp pop ds ret frame endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE _WINDOW ;построение окна с рамкой и запоминание символов под окном в буфере ;входные:CH-строка начала;CL-колонка начала;DH-строка конца;DL-колонка конца ; SI-смещение к началу фразы,помещаемой в середине окна,которая дол- ; жна заканчиваться ASCII 0; AH-фон окна и символов,AL-фон фразы ;Внимание! Минимальный размер окна 3*3 ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ window proc near push bx push cx push dx push si push di push ds push es push ax ;запомнить байт атрибутов push si ;запомнить смещение фразы sub bx,bx mov bl,ch ;строка начала окна mov di,bx call mul_80 shl di,1 ;смещ. начала строки на экране mov bl,cl shl bl,1 ;смещ. начала окна в строке add di,bx ;смещ. начала окна на экране mov word ptr cs:[ begin_wind ],di shr bl,1 sub dl,bl ;длина окна sub dh,ch ;высота окна mov word ptr cs:[ long_wind ],dx ;размеры окна ;запомнить окно в буфере mov si,di ;начало окна на экране mov di,word ptr cs:[ begin_buffer_wind ] mov bx,80 ;длина строки экрана sub bl,dl ;длина незаполненного окна shl bl,1 ;длина незаполненного окна в байтах sub cx,cx mov es,cs:segm_data mov ds,cs:segm_wind mov byte ptr cs:[ cga_wait ],cl met_a0: mov cl,6 call wait_cga mov cl,dl ;длина окна rep movsw add si,bx dec dh ;запомнены все строчки jns met_a0 ;нет ;построение окна push cs pop ds call seg_win mov di,ds:begin_wind ;начало окна на экране mov si,di ;запомнить начало окна add si,160 ;начало следующ. строки mov al,byte ptr ds:wind ;символ рамки "╔" stosw mov cl,dl ;длина окна sub cl,2 ;без крайних элементов mov al,byte ptr ds:wind[1] ;символ "═" rep stosw mov al,byte ptr ds:wind[2] ;символ "╗" stosw mov di,si ;начало следующей строки mov dh,byte ptr ds:long_wind[1] ;высота окна sub dh,1 ;без верхних и нижних строчек mov al,byte ptr ds:wind[3] ;символ "║" met_a1: mov cl,6 call wait_cga stosw mov cl,dl ;длина окна sub cl,2 ;без крайних элементов mov al," " ;пробел rep stosw mov al,byte ptr ds:wind[3] ;символ "║" stosw add si,160 mov di,si ;начало следующей строки dec dh ;построены все строки окна jnz met_a1 ;нет mov al,byte ptr ds:wind[4] ;символ "╚" stosw mov cl,dl ;длина окна sub cl,2 ;без крайних элементов mov al,byte ptr ds:wind[1] ;символ "═" rep stosw mov al,byte ptr ds:wind[5] ;символ "╝" stosw pop si ;восстановить смещение заголовка pop ax ;восстановить байт атрибутов xor bx,bx met_a2: inc bx cmp byte ptr ds:[si+bx],0 ;последний байт фразы jnz met_a2 ;нет mov cl,bl ;длина фразы sub dl,bl ;начало фразы в первой строке окна and dl,not 1 ;сделать число четным mov di,word ptr ds:[ begin_wind ] add di,dx ;начало фразы на экране mov byte ptr es:[di-2]," " met_a3: movsb stosb ;байт атрибутов loop met_a3 mov byte ptr es:[di]," " pop es pop ds pop di pop si pop dx pop cx pop bx ret window endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE CLEAR_WINDOW ;восстановление окна ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ clear_window proc near push cx push dx push si push di push ds push es ;востановить окно из буфера call begin_param8 mov di,cs:begin_wind mov si,cs:begin_buffer_wind mov dx,cs:long_wind sub cx,cx mov cs:cga_wait,cl met_a15: mov cl,6 call wait_cga mov cl,dl ;длина окна rep movsw mov cl,80 sub cl,dl shl cl,1 add di,cx dec dh ;запомнены все строчки jns met_a15 ;нет pop es pop ds pop di pop si pop dx pop cx ret clear_window endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE MUL_80 ;умножение di на 80 ;входные:di,выходные:di*80 ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ mul_80 proc near push cx mov cl,4 shl di,cl ;умножить на 16 mov cx,di ;запомнить результат в cx shl di,1 ;умножить на 2 shl di,1 ;умножить на 2 add di,cx ;получить в di номер строки * 80 pop cx ret mul_80 endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE SELECT_STAT ;вывод в статусную линию количества выделенных файлов ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ select_stat proc near push ax push bx push cx push dx push si push di push ds push es call begin_param8 sub si,si sub ax,ax cwd mov bx,met_dir0[bp] mov cx,max_pos0[bp] jcxz met_sel5 ;прибавить длину выделенного файла met_cur53: cmp byte ptr ds:[bx+si],0ffh jnz met_cur54 inc di add ax,ds:[bx+si+6] adc dx,ds:[bx+si+8] met_cur54: add si,48 loop met_cur53 met_sel5: push cs pop ds mov dat_sel_ax0[bp],ax mov dat_sel_dx0[bp],dx mov sum_sel0[bp],di mov al,ds:[ fon1 ] or di,di jnz met_sel0 mov al,ds:[ fon0 ] met_sel0: mov si,offset select_line mov di,21*160+22 mov dx,1501h or bp,bp jz met_sel1 add di,80 add dl,40 met_sel1: call phrase mov ax,dat_sel_ax0[bp] mov dx,dat_sel_dx0[bp] call number add di,22 mov ax,sum_sel0[bp] cwd call number sel_quit: pop es pop ds pop di pop si pop dx pop cx pop bx pop ax ret select_stat endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE HALT ;остановка процессора перед вводом с клавиатуры, аналог int 16h ;выходные:ax - как в int 16h ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ halt proc near sti cld sub ax,ax mov cs:met_int_24,al cmp cs:hlt_ass,al jnz met_halt0 int 16h ret met_halt0: push ds push dx mov ds,ax mov dx,3f2h mov al,00001111b out dx,al mov byte ptr ds:[043fh],ah ;двигатели выключены add word ptr ds:[046ch],72 ;измен. таймер met_halt1: in al,21h or al,1 out 21h,al ;запретить прерывания таймера hlt ;остановить процессор and al,not 1 ;разрешить таймер out 21h,al mov ah,1 int 16h jz met_halt1 call clear_buf_key pop dx pop ds ret halt endp ;--------------------- очистить буфер клавиатуры ------------------------ clear_buf_key: push ax push ds sub ax,ax mov ds,ax mov al,ds:[41ah] mov ds:[41ch],al pop ds pop ax ret ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE NUMBER ;представление шестнадцатиричного числа в десятичном виде и вывод на экран ;входные:dx,ax- число; di- смещение на экране к концу числа ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ number proc near cmp dx,2710h jbe met_n1 mov al,"?" stosb dec di ret met_n1: push cx push bx push si push di push es call seg_win mov cx,10000 div cx xchg ax,dx or dx,dx jz met_cc10 mov bx,dx call conv_bin_10 mov ax,bx met_cc9: dec di dec di mov byte ptr es:[di],"0" dec si jnz met_cc9 met_cc10: call conv_bin_10 pop es pop di pop si pop bx pop cx met_cc8: ret conv_bin_10: mov cx,10 mov si,4 cc20: cmp ax,10 jb cc30 dec si sub dx,dx div cx or dl,"0" mov es:[di],dl dec di dec di jmp short cc20 cc30: or al,"0" mov es:[di],al ret number endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE MUL_48 ;умножение si на 48 ;входные:si,выходные:si*48 ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ mul_48 proc near push cx mov cl,4 shl si,cl ;умножить на 16 mov cx,si ;запомнить результат в cx shl si,1 ;умножить на 32 add si,cx pop cx ret mul_48 endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE CGA ;ожидание, когда можно выводить на экран CGA изображение без ряби ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ cga proc near cmp byte ptr cs:met_cga,0 jz met_cga2 push ax push cx push dx mov dx,3dah ;порт состояния видео c44d0: in al,dx ror al,1 jc c44d0 c44d5: sti mov cx,14h cli c44da: in al,dx ror al,1 jnc c44d5 loop c44da pop dx pop cx pop ax met_cga2: ret cga1: cmp byte ptr cs:met_cga,0 jz met_cga2 push ax push dx mov dx,3dah ;порт состояния видео cli met_cga1: in al,dx test al,8 jz met_cga1 pop dx pop ax ret ;входные; cl - задержка перед запуском wait_cga: sub byte ptr cs:cga_wait,1 jnc met_e19 mov byte ptr cs:cga_wait,cl call cga met_e19: ret cga endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE INDIC ;если текущая панель левая, то bp=0; если правая, то bp=2 ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ indic proc near mov bp,cs:[ act_pan ] shl bp,1 ret indic endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE WRITE_PATH ;записать путь над активной панелью bp- активная панель ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ write_path proc near push bx push cx push dx push bp push si push di push ds push cs pop ds mov si,met_path[bp] mov bx,bp shr bl,1 mov byte ptr ds:act_drive,bl mov bp,0ffffh mov bh,"*" met_w0: inc bp cmp byte ptr [si+bp],bh ;определить длину пути jnz met_w0 sub cx,cx cmp bp,3 jz met_w1 dec bp mov bh,"\" cmp bp,36 ;длина пути больше ширины панели jbe met_w1 ;нет mov cl,byte ptr ds:[si] ;запомнить имя драйвера sub bp,36 add si,bp ;сдвинуть начало фразы к концу mov bp,36 met_w1: mov byte ptr [si+bp],0 push bp mov dx,20 ;середина панели shr bp,1 inc bp sub dx,bp ;начало вывода пути на экран sub di,di mov bl,byte ptr ds:act_drive or bl,bl jz met_w2 add dx,40 ;правая панель inc di met_w2: mov al,ds:wind[1] mov ah,ds:wind[6] call cga call one_line mov al,ds:[ fon0 ] cmp bl,byte ptr ds:act_pan jnz met_w3 call seg_win xor di,1 call mul_80 mov ah,ds:wind[0] xchg al,ah scasw jnz met_w9 mov al,ah push cx mov cx,39 inc di met_w4: stosb ;закрасить верхнюю строку активн. панели inc di loop met_w4 pop cx met_w9: mov al,cs:[ fon3 ] met_w3: mov bl,al call phrase pop bp mov byte ptr [si+bp],bh jcxz met_w5 mov al,bl mov si,offset dat_path mov byte ptr ds:[si],cl call phrase met_w5: pop ds pop di pop si pop bp pop dx pop cx pop bx ret write_path endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE KEY_BAR ;вывод на экран строки ключевых клавиш ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ key_bar proc near push ds push es push cs pop ds call seg_win mov si,offset dat_help mov di,160*24 ;смещение последней строки mov cx,80 ;длина строки call cga met_kb1: lodsb mov ah,ds:[ fon3 ] cmp al,"9" ;не изменять фон букв ja met_kb2 or al," " cmp byte ptr ds:[si],"0" ;изменить фон перед цифрой jb met_kb2 mov ah,ds:[ fon2 ] met_kb2: stosw loop met_kb1 pop es pop ds ret key_bar endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE ONE_LINE ;вывод на экран одной строки,атрибуты: синий фон,голубые символы ;входные;di-позиция строки (0,1,2..),al-основной,ah-промежуточный байт ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ one_line proc near push di push es push cx push bx mov bl,ah mov ah,cs:[ fon0 ] mov bh,ah call seg_win call mul_80 mov cx,12 call step_line mov cl,9 call step_line mov cl,8 call step_line inc di inc di mov cl,6 rep stosw pop bx pop cx pop es pop di ret step_line: inc di ;пропустить первый символ рамки inc di rep stosw mov word ptr es:[di],bx ;вывести символ "│" ret one_line endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE SORT ;сортировка файлов в алфавитном порядке ;входные: bp - номер панели, bl - 0 курсор установить на первом файле ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ sort proc near sub ax,ax mov bh,al or bl,bl jz met_srt33 cmp cs:[70h],al jnz met_srt3 xor bl,bl met_srt33: mov num_pos0[bp],ax met_srt3: mov cs:[6fh],bx ;cs:[70h]=0 cmp cs:met_sort,al jnz met_srt1 ret met_srt1: mov dx,met_dir0[bp] add dx,10 mov bx,dx call locat_name mov cx,max_pos0[bp] cmp cx,1 ;количество файлов меньше 2 jbe met_srt12 ;yes - quit push bp mov bp,cx mov byte ptr ds:[si+13],27 ;метка файла с курсором met_srt2: dec bp jz met_srt10 mov si,dx add dx,48 met_srt4: mov di,si add di,48 ;сравнить mov cx,12 met_srt6: cmp word ptr ds:[si],".." jz met_srt2 test byte ptr ds:[si-9],10h jz met_srt5 test byte ptr ds:[di-9],10h jz met_srt2 jmp short met_srt11 met_srt5: test byte ptr ds:[di-9],10h jnz met_srt7 met_srt11: rep cmpsb jbe met_srt2 ;не переставлять ;переставить met_srt7: sub si,22 add si,cx mov di,si add di,48 ;если верхний файл директория, то не переставлять mov cl,12 met_srt8: mov ax,es:[di] movsw mov ds:[si-2],ax loop met_srt8 sub si,14+48 cmp si,bx jb met_srt2 jmp short met_srt4 met_srt10: pop bp sub cx,cx cmp cs:[06fh],cl ;не искать место курсора jz met_srt12 dec cx met_srt9: inc cx add bx,48 cmp byte ptr ds:[bx+13-48],27 jnz met_srt9 met_srt12: mov num_pos0[bp],cx ret sort endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE PHRASE ;вывод на экран фразы, заканчивающейся ASCII 0 ;входные;dh-строка,dl-столбец,al-фон,si-смещение к фразе ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ phrase proc near push ax push dx push si push di push ds push es xchg al,ah call seg_win sub di,di xchg dh,dl ;поменять местами строку и столбец mov al,dh ;сохранить столбец xor dh,dh mov di,dx ;строка call mul_80 mov dl,al ;восстановить столбец add di,dx shl di,1 ;абсолютное смещение на экране mov al," " call cga1 met_ph1: stosw lodsb or al,al jnz met_ph1 mov al," " stosw pop es pop ds pop di pop si pop dx pop ax ret phrase endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE INFO ;вывод информационной панели ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ info proc near push ds push cs pop ds sub cx,cx call seg_win mov di,8 cmp byte ptr ds:act_pan,cl jnz met_inf0 mov cl,40 inc di met_inf0: mov dl,cl add dl,40 mov dh,22 mov si,offset dat_info mov al,ds:[ fon0 ] mov ah,al call window sub dl,38 mov dh,1 mov si,offset phrase_ver call phrase mov dh,2 mov si,offset phrase_copyright call phrase mov dh,3 mov si,offset phrase_town call phrase mov al,ds:wind[9] mov ah,al call one_line add dx,030fh mov al,ds:[ fon0 ] mov si,offset byte_mem call phrase int 12h mov bx,1024 mul bx mov di,cx shl di,1 add di,160*6+32 call number mov al,ds:[ fon1 ] call color mov dx,0712h add dx,cx mov al,ds:[ fon0 ] mov si,offset byte_free call phrase int 12h mov bx,40h mul bx mov bx,ds:segm_data sub ax,bx mov bx,16 mul bx mov di,cx shl di,1 add di,160*7+34 call number mov al,ds:[ fon1 ] call color mov dx,0812h add dx,cx mov al,ds:[ fon0 ] mov si,offset byte_drive call phrase inc dh dec dx call phrase sub dl,5 mov si,offset free call phrase dec dh mov si,offset total call phrase mov ah,19h int 21h mov dx,ax add al,"A" inc dx mov di,cx shl di,1 add di,160*8+68 mov ah,ds:[fon1] mov bl,":" stosw xchg al,bl stosw add di,154 xchg al,bl stosw xchg al,bl stosw sub di,160+48 mov ah,36h ;свободное пространство на диске int 21h mov si,dx mul cx mov dx,si mov si,ax mul dx call cga call number mov al,ds:[ fon1 ] call color add di,160 mov ax,si mul bx call number mov al,ds:[ fon1 ] call color pop ds ret ;закраска в al цвет, di-конец цифры color: std push cx push di mov cx,9 inc di call cga1 met_color0: stosb dec di loop met_color0 pop di pop cx cld met_ent5: ret info endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE CTR+ENTER ;вывод в командную строку имени файла, выделенного курсором ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ctr_enter proc near ;определить положение выделенного символа, если директория, то выход call this_subdir ; jnz met_ent5 ;да sub bx,bx met_ent6: inc bx cmp byte ptr ds:[si+bx-1],0 jnz met_ent6 mov cx,bx mov ax,127 mov di,com_line ;сравнить длину со свободным местом add bl,byte ptr cs:[di-2] cmp bl,al ja met_ent5 mov bx,di ;сдвинуть от курсора на длину имени+1 в коммандной линии push si add di,ax mov si,di sub si,cx sub al,cs:[bx-1] ;положение курсора xchg ax,cx sub cx,ax inc cx push cs push cs pop es pop ds std rep movsb cld mov di,si inc di ;сдвинуть курсор на длину имени mov ah,al add word ptr ds:[bx-2],ax ;символ с курсором и последний pop si ;записать выделенный файл call seg_dat mov cl,al rep movsb mov byte ptr es:[di-1]," " mov di,com_line xor al,al call accept ret ctr_enter endp ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ; SUBROUTINE ERROR ;выдача соовщения о ошибке ;входные:al - код ошибки ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ error proc near cmp byte ptr cs:met_int_24,0;фатальная ошибка уже обработана jz met_error83 mov byte ptr cs:met_int_24,0 stc ret met_error83: push bx push cx push dx push si push ds sti cld call clear_buf_key push cs pop ds push ds:begin_wind push ds:long_wind add word ptr ds:begin_buffer_wind,size_wind-270h ;смест. буфер окна mov si,offset ds:dat_error cmp al,80 ;файл существует jz met_errorf0 cmp al,0f0h ;вставить дискету jnz met_error84 met_errorf0: mov si,offset ds:dat_warning met_error84: push ax mov al,ds:[ fon5 ] mov ah,al mov cx,0a12h mov dx,0f3eh call window pop ax mov dh,0ch mov si,offset create met_error13: cmp al,13h ;усторойство защищено от записи jnz met_error15 mov si,offset no_write jmp short met_error53 met_error15: cmp al,15h ;дисковое усторойство не готово jnz met_error1b mov si,offset not_ready jmp short met_error53 met_error1b: cmp al,1bh ;диск не форматирован jnz met_error1c mov si,offset not_format jmp short met_error53 met_error1c: cmp al,1ch ;нет бумаги в принтере jnz met_error1d mov si,offset not_paper jmp short met_error53 met_error1d: cmp al,1dh ;no write jnz met_error1e mov si,offset not_write jmp short met_error53 met_error1e: cmp al,1eh ;диск не читаем jb met_error53 cmp al,1fh ja met_error53 mov si,offset not_read jmp short met_error53 ;определение кода ошибки met_error53: cmp al,80 jz met_error58 jmp met_error54 met_error58: mov al,ds:[ fon5 ] mov si,offset already_exists call print_name inc dh mov si,offset write_old call print_name inc dh mov bl,al mov bh,ds:[ fon4 ] mov cl,1 met_error55: mov al,bh test cl,1 jnz e1 mov al,bl e1: mov si,offset overwrite mov dl,27 call phrase mov al,bh test cl,2 jnz e2 mov al,bl e2: mov si,offset all mov dl,39 call phrase mov al,bh test cl,4 jnz e3 mov al,bl e3: mov si,offset skip mov dl,45 call phrase call halt cmp ah,1 ;esc jz e6 cmp ah,28 ;enter jz met_error57 cmp ah,75 jnz e4 test cl,1 jz e9 or cl,8 e9: shr cl,1 jmp short met_error55 e4: cmp ah,77 jnz met_error55 shl cl,1 test cl,7 jnz e0 mov cl,1 e0: jmp short met_error55 met_error57: test cl,1 jnz e17 test cl,4 jz e7 mov ah,31 ;skip e6: stc jmp short e17 e7: not byte ptr ds:met_overwrite e17: jmp met_error62 met_error54: cmp al,2 jnz met_error73 mov si,offset not_file jmp short met_error63 met_error73: cmp al,8 jnz met_error64 mov si,offset enough jmp short met_error63 met_error64: cmp al,90h ;удаление самого себя jnz met_error65 mov si,offset inself jmp short met_error63 met_error65: cmp al,91h ;нет sp.mnu jnz met_error66 mov si,offset phrase_user jmp short met_error63 met_error66: cmp al,92h ;нет sp.hlp jnz met_error67 mov si,offset phrase_help jmp short met_error63 met_error67: cmp al,6 ;попытка удаления не пустой директории jnz met_errorf1 mov si,offset empty jmp short met_error63 met_errorf1: cmp al,0f1h jnz met_error71 mov si,offset not_command jmp short met_error63 met_error71: cmp al,0f0h jnz met_error59 mov si,offset insert_disk mov ds:[si+26],bl met_error63: mov al,ds:[ fon5 ] call print_name mov si,offset ok mov dh,0eh mov al,ds:[ fon4 ] call print_name call halt jmp short met_error62 met_error59: mov bl,ds:[ fon4 ] mov bh,ds:[ fon5 ] mov al,bh call print_name met_error60: mov al,bl mov si,offset dat_retry mov dx,0e20h call phrase mov al,bh mov dl,29h mov si,offset dat_abort call phrase xchg bl,bh met_error61: call halt cmp ah,77 jz met_error60 cmp ah,75 jz met_error60 cmp ah,28 jnz met_error61 cmp bl,ds:[ fon5 ] jz met_error62 ;retry stc ;abort met_error62: pushf call clear_window sub word ptr ds:begin_buffer_wind,size_wind-270h popf pop ds:long_wind pop ds:begin_wind pop ds pop si pop dx pop cx pop bx ret error endp set_dta: mov dx,80h mov ah,1ah ;установка области DTA cs:80h int 21h ret ;положения символов 012 3 45 6 7 8 9 10 wind db "╔═╗","║","╚╝","╤","┴","│","─","░" winda db "РФС","Х","УТ","В","и","е","д","Ы" tabl db "░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀" db "ЫЬЭезГДЕЖЧХСТЛМбгижйдкНОУРШЦЩФЪА" db "БВЗИЙКПЮЯвалмнопрстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■" scan_tabl db "QWERTYUIOP[] ASDFGHJKL;'` \ZXCVBNM1234567890-=" key_tabl_edit dw offset met_e585 ;"7" dw offset met_e510 ;"8" dw offset met_e530 ;"9" dw offset met_e899 ;"-" dw offset met_e540 ;"4" dw offset met_e899 ;"5" dw offset met_e550 ;"6" dw offset met_e899 ;"+" dw offset met_e580 ;"1" dw offset met_e500 ;"2" dw offset met_e520 ;"3" dw offset met_e640 ;ctr+"4" dw offset met_e650 ;ctr+"6" dw offset met_e660 ;ctr+"1" dw offset met_e660 ;ctr+"3" dw offset met_e680 ;ctr+"7" met_func dw offset help dw offset menu dw offset view dw offset edit dw offset copy dw offset ren_mov dw offset makdir dw offset delete dw offset exedit segm_wind dw 0b800h ;сегмент экрана cga size_cursor dw 0607h ;форма курсора: 0a0bh - MDA ;****************************** цветной режим ***************************** fon0 db 00011011b ;синий фон, голубые символы fon1 db 00011110b ;синий фон, желтые символы fon2 db 00000111b ;черный фон, белые символы fon3 db 00110000b ;голубой фон, черные символы-инвер. MDA fon4 db 01110000b ;белый фон, черные символы fon5 db 01001111b ;красный фон, белые символы fon6 db 00111110b ;голубой фон, желтые символы ;**************************** черно - белый режим ************************* ;fon0 db 07h ;fon1 db 0fh ;fon2 db 07h ;fon3 db 70h ;fon4 db 07h ;fon5 db 70h ;fon6 db 01111111b ;белый фон, ярко-белые символы ;07h -обычный ; 0fh -выделенный; 9-подчеркнутый; 70h -инверсия для MDA ;7fh - выделенный для черно-белого режима param_mda dw 0b000h ;MDA экран dw 0a0bh ;размер курсора dw 0f07h ;смена фона выводимых символов dw 7007h dw 7007h db 09h phrase_help db "There is no file " sp_hlp db "SP.HLP",0 ;код ошибки 92h phrase_user db "There is no file " sp_mnu db "SP.MNU",0 ;код ошибки 91h sp_com db "SP.COM",0 quit_no_mem db "Out of memory$" phrase_menu db "External editor",0 phrase_ver db "The Sparrow Commander, Version 1.20",0,8,", " phrase_copyright db "Copyright (C) 1994 by Afanasyev V.",0,10,13 return db 10,13,"$" phrase_town db "Severodvinsk, Truda 20-76, 4-16-48.",0 not_ready db "Drive or device not ready",0 no_write db "Write protect error in drive",0 not_format db "The disk may not be formatted",0 not_read db "Can't read the drive",0 not_write db "Can't write the drive",0 not_paper db "Printer out of paper",0 not_command db "Can't find command.com",0 not_file db "Can't find the file",0 already_exists db "The file already exists.",0 write_old db "Do you wish to write over the old file?",0 last_save db "You've made changes since the last save.",0 empty db "Subdirectory it is not empty",0 inself db "You can't copy a file to inself",0 enough db "There isn't enough room to copy",0 create db "Can't open the file",0 phrase_quit db "Do you want to quit the Sparrow?",0 extern_edit db "Do you want to use the external editor?",0 phrase_setup db "Do you wish to save the current setup?",0 insert_disk db "Insert diskette for drive " drive db "A",0 ok db "Ok",0 phrase_yes db "Yes",0 phrase_no db "No",0 sparrow db "The Sparrow",0 drive_letter db "Drive letter",0 select db "unselect",0 dat_select db "unselect all files?",0 select_line db " bytes selected files",0 dat_delete_files db " files",0 create_dir db "Create the directory",0 create_file db "Edit the file",0 search_for db "Search for the string",0 phrase_delete db "Do you wish to delete",0 not_save db "Don't save",0 cont_edit db "Continue editing",0 dat_del db "deleting the file",0 dat_cop db "copying the file",0 dat_mov db "moving the file",0 dat_ren db "renaming the file",0 dat_vie db "reading the file",0 dat_conv db "converting the file",0 searching_for db "searching for",0 not_found db "string not found",0 byte_free db "Bytes Free",0 byte_mem db "Bytes Memory",0 byte_drive db "bytes on drive",0 user_menu db "User Menu",0 bytes db "bytes",0 total db "total",0 free db "free",0 dat_path db "A:\..",0 dat_to db "to",0 overwrite db "Overwrite",0 skip db "Skip",0 all db "All",0 no_param dw 0d00h dat_sub_dir db "SUB-DIR" dat_up_dir db "UP--DIR" dat_help db "1Help",0,0,0 dat_user db "2Menu",0,0,0 dat_view db "3View",0,0,0 dat_edit db "4Edit",0,0,0 dat_copy db "5Copy",0,0,0 dat_renmov db "6RenMov",0 dat_mkdir db "7Mkdir",0,0 dat_delete db "8Delete",0 dat_menu db "9ExEdit",0 dat_quit db "10Quit",0,0,0 dat_cnv db "Convrt",0 dat_search db "Search",0 dat_name db "Name",0 dat_size db "Size",0 dat_date db "Date",0 dat_time db "Time",0 dat_cansel db "Cansel",0 dat_error db "Error",0 dat_warning db "Warning",0 dat_retry db "Retry",0 dat_abort db "Abort",0 dat_info db "Info",0 dat_move db "Move",0 dat_save db "Save",0 dat_col db "Col:",0 dat_line db "Line:",0 dat_char db "Ch:",0 dat_ins db "Ins",0 dat_over db "Over",0 dat_setup db "Setup",0 dat_com db "com",0 dat_exe db "exe",0 dat_bat db "bat",0 dat_prn db "PRN",0 dat_con db "CON",0 comspec db "COMSPEC=" met_cga db 0 ;0ffh - гасить снег cga noread db 0 ;0ffh - ошибка при чтении диска met_error db 0 ;0ffh - признак ошибки int 21h met_root db 0 ;1 - признак ошибки int 21h met_info db 0 ;0ffh - включена информац. панель video_mode db 0 ;текущий видеорежим met_int_24 db 0 ;<>0 - происходил вызов 24h cga_wait db 0 ;задержка запуска функции cga met_ins db 0 ;0 - ins ; 1 - over; в view-мет. поиска pred_point db 0 ;0ffh - на предыдущ. символ перед tab ;совместное использование met_com db 0 ;если равно 0, то первый проход прогр. met_keep_line db 0 ;0ffh - запускалась хоть одна программа met_sort db 0ffh ;0ffh - сортировка по именам, 0 - нет met_view_color dw 0 ;0ffh - выделять найденную комбинацию met_convert db 0 ;0ffh - конвертор работает met_overwrite db 0 ;0ffh - перезаписывать все файлы met_renmov db 0 ;0ffh - удалять файлы после копирования keep_file db 0ffh ;0 - сохранять выделение, 0ffh - нет size_file dw 0 ;сколько раз перемещ. файл. манипулятор keep_number dw 0 ;смещение к концу выделенных файлов end_pos_wind dw 0 ;конец экрана при view и edit name_disp dw 0 ;смещ. имени в буфере 0b0h drive_file dw 0 ;хранит имена драйверов при копировании ;смещ. к редактируемому имени файла ;совместное использование begin_txt dw 0 ;смещ. курсора в тексте begin_colon dw 0 ;начальная колонка на экране edit old_begin_colon dw 0 ;предыдущ. значение начальн. колонки begin_line dw 0 ;линия с курсором на экране edit begin_pos_wind dw 0 ;начало экрана при view и edit pos_simbol dw 0 ;смещение введеного символа в буфере old_pos_curs dw 0 ;предыдущ. колонка курсора pos_backspace dw 0 ;колич. символов удаления backspace met_edit dw 0 ;0 - редактирование не производилось old_begin_line dw 0 ;линия с курсором на экране edit begin_point dw 0 ;начальная точка поиска в строке pos_curs dw 0 ;позиция курсора на экране old_pos_wind dw 0 ;последнее положение при поиске view begin_wind dw 0 ;смещение окна на экране act_screen db 0 ;0-на экране оболочка, 0ffh-исходн. hlt_ass db 0 ;0-нормально, 0ffh-состояние ожидания old_size_file dw 0 ;последняя позиция при поиске long_wind dw 0 ;размеры окна: low-длина,high-ширина segm_data dw 0 ;сегмент данных программы path_sp_end dw 0 ;место, куда вставить имя (SP.HLP ...) met_path dw path0 ;смещение пути к левой панели dw path1 ;смещение пути к правой панели begin_buffer_wind dw begin_wind_mem ;смещ. стертого окна met_dir0 dw begin_wind_mem+size_wind ;смещ. таблицы dir0 met_dir1 dw begin_wind_mem+size_wind+18h ;смещ. таблицы dir1 met_data dw 0 ;смещение данных max_pos0 dw 0 ;всего строк на левой панели max_pos1 dw 0 ;всего строк на правой панели num_pos0 dw 0 ;номер файла,содер. курсор на левой пан num_pos1 dw 0 ;номер файла,содер.курсор на правой пан act_pan dw 1 ;панель, в которой находится курсор act_drive dw 0 ;low:0,1-акт. позиц.;high-всего дисков high_pos0 dw 0 ;номер файла в верхней поз. экрана high_pos1 dw 0 ;номер файла в верхней поз. экрана sum_sel0 dw 0 ;количество выделенных файлов sum_sel1 dw 0 ;количество выделенных файлов dat_sel_ax0 dw 0 ;колич. байт в выделенных файлах dat_sel_ax1 dw 0 dat_sel_dx0 dw 0 dat_sel_dx1 dw 0 begin_free_memory dw 0 ;первый 16 байтный свободный блок size_block dw 0 ;размер блока для копирования handle0 dw 0 ;номер открытого файла handle1 dw 0 ;номер открытого файла attrib_file db 0 ;атрибут копируемого файла long_incomp dw 0 ;длина скопированной части long_view_file dd 0 ;длина просматриваемого файла param_block dw 0,0,0,0,0,0,0 ;вать корень '.'и '..' dir_net db 01,10h,0ah,49h,0e8h,01ch,0,0,0,0,'.','.',0 ;активная позиция - панель, с которой происходит дисковая операция ext_edit db 13,10 db 0,27,27,0,"Здесь вставляется имя внешнего редактора для команды ExEdit." stack0: cseg ends end start