| Code: ;************************************************************* ;* INKEY char - ожидание нажатия клавиши * ;* KEYB char - проверка на нажатие клавиши * ;* INPUT char - ожидание нажатия и вывод на экран * ;* KEYPRESSED - ожидание нажатия клавиши * ;* PUTP char - вывод символа на принтер * ;* DISP char - вывод символа на экран * ;* STATE - чтение состояние принтера в AH * ;* BUSY - принтер занят ( JZ ZANYAT ) * ;* CONFI - нет подтверждения от принтера (JZ NET_PODTV) * ;* INIT - инициализация принтера * ;* PRINT char - печать символа * ;* MOV_STR str1,str2,len - копирование строк * ;* MOV_STT str1_reg,str2_reg,len * ;* BEEP - звуковой сигнал * ;* OPENR name,handle - открытие для чтения ( JC ERR ) * ;* OPENW name,handle - открытие для записи ( JC ERR ) * ;* READ handle,buffer,len,real_num - чтение ( JC ERR ) * ;* WRIT handle,buffer,len,real_num - запись ( JC ERR ) * ;* CLOSE handle - закpытие файла * ;* CREATE file,attribut,handle - создание файла(JC ERR) * ;* SET_PAG page - установка номера страницы для вывода * ;* IS_PAGE - считать номер страницы для вывода * ;* MODEC mode - установка режима дисплея * ;* PAG page - установка активной страницы * ;* IS_MODE mode,page,num - узнать текущий режим * ;* INIT_M - адаптировать программы к дисплею * ;* CUR row,columns - позициирование курсора * ;* PUTC char - вывод символа на экран в цвете * ;* PUTCN char,num - вывод символа несколько раз * ;* COLOR attrbut - установка атрибутов символов * ;* FILL r0,c0,rlen,clen - закрашивание части экрана * ;* HEX byte - вывод байта в шестнадцатиричном виде * ;* NUM nnn - вывод десятичного числа (байт,слово и др.) * ;* UP - курсор вверх * ;* DOWN - курсор вниз * ;* LEFT - курсор влево * ;* RIGHT - курсор вправо * ;* FRAME r0,c0,rlen,clen - рисование одиночной рамки * ;* WRITE str - вывод строки в цвете * ;* FIND name,attr - поиск файла по шаблону * ;* FINDR - повторный поиск * ;* CALL INI_DTA - установить свою DTA * ;* CALL RET_DTA - восстановить старую DTA * ;* PIXEL x,y,color - установить графическую точку * ;* NEW size,segment,real - выделение блока памяти * ;* DELETE segment - освобождение блока памяти * ;************************************************************* putp macro putc_ mov ah,0 mov al,putc_ mov dx,0 int 17h endm disp macro disp_ mov ah,02 mov dl,disp_ int 21h endm state macro mov ah,02 mov dx,0 int 17h endm busy macro state test ah,10000000b endm confi macro state test ah,01000000b endm init macro mov ah,1 mov dx,0 int 17h endm print macro print_ mov al,print_ call pri_ endm ; Ошибка через флаг С ;------------ ПЕЧАТЬ СИМВОЛА ------------------------------ pri_ proc push ax pri1: mov ah,2 ; Проверка состояния порта принтера mov dx,0 int 17h test ah,00101001b jnz ex_pr1 ; Если принтер не готов то выйти test ah,10000000b jz pri1 ; Принтер занят pop ax mov ah,0 ; Печать символа mov dx,0 int 17h test ah,8 jnz ex_pr ; Ошибка clc ret ex_pr1: pop ax ex_pr: stc ret pri_ endp ;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ ----------------- mov_str macro str1,str2,nnnn ; str1=str2 mov ax,ds mov es,ax lea si,str2 lea di,str1 mov cx,nnnn rep movsb endm ;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ 2---------------- mov_stt macro str1,str2,nnnn ; str1=str2 mov ax,ds mov es,ax mov si,str2 mov di,str1 mov cx,nnnn rep movsb endm ;------------ ЗВУКОВОЙ СИГНАЛ ------------------ beep macro local bee local l0 local l1 in al,61h and al,11111110b mov bx,500 bee: or al,00000010b out 61h,al mov cx,1000 l0: loop l0 and al,11111101b out 61h,al mov cx,1000 l1: loop l1 dec bx jnz bee endm ;------------ ОТКРЫТИЕ ФАЙЛА ДЛЯ ЧТЕНИЯ ------------------ openr macro op_file_,op_hndl_ mov al,0 lea dx,op_file_ mov ah,3Dh int 21h mov op_hndl_,ax endm ; Ошибка через флаг С ;------------ ОТКРЫТИЕ ФАЙЛА ДЛЯ ЗАПИСИ ------------------ openw macro op_file_,op_hndl_ mov al,1 lea dx,op_file_ mov ah,3Dh int 21h mov op_hndl_,ax endm ; Ошибка через флаг С ;------------ СОЗДАНИЕ ФАЙЛА ----------------------------- create macro file_,attr_,hndl_ mov ah,3Ch mov cx,attr_ lea dx,file_ int 21h mov hndl_,ax endm ; Ошибка через флаг С ;------------ ЗАПИСЬ В ФАЙЛ ------------------------------ writ macro hndl_,buff_,len_,lenr_ mov ah,40h mov bx,hndl_ mov cx,len_ lea dx,buff_ int 21h mov lenr_,ax endm ; Ошибка через флаг С ;------------ ЧТЕНИЕ ДИСКОВОЙ ЗАПИСИ --------------------- read macro hndl_,buff_,len_,buffr_ mov bx,hndl_ mov ah,3Fh mov cx,len_ lea dx,buff_ int 21h mov buffr_,ax endm ; Ошибка через флаг C ;----------------- ЗАКРЫТИЕ ФАЙЛА ------------------------ close macro hndl_c mov ah,3eh mov bx,hndl_c int 21h endm ;-------- Данные для второй прерывающей программы --- pg db 0 ; Номер страницы видеопамяти key db 0 ; Признак нажатия клавиши char db 0 ; Код нажатой клавиши s1 db 0 ; Вспомогательные переменные s2 db 0 s3 db 0 s4 db 0 s5 db 0 atr db 15 ; Атрибуты символов leng db 0 ; Длина выведенной строки rrr db 0 ; Переменные для работы FILL и FRAME ccc db 0 rrl db 0 ccl db 0 ;---------- МАКРОСЫ ДЛЯ РАБОТЫ С ЭКРАНОМ ----------------- modec macro mmm mov al,mmm mov ah,0 int 10h endm pag macro ppp mov al,ppp mov ah,5 int 10h endm is_mode macro mmm,ppp,nnn mov ah,0Fh int 10h mov nnn,ah mov mmm,al mov ppp,bh endm init_m macro is_mode bl,bl,bl set_pag bl endm set_pag macro ppp mov ah,ppp call spg_ endm is_page macro ppp call pg_ mov ppp,ah endm cur macro r,c ; Установка курсора is_page bh mov ah,2 mov dh,r mov dl,c int 10h endm putc macro pp ; Вывод символа putcn pp,1 endm putcn macro pp,nn ; Вывод символа несколько раз mov al,pp is_page bh mov ah,9 mov bl,atr mov cl,nn mov ch,0 int 10h endm color macro aa ; Установка атрибутов символов mov atr,aa endm up macro ; Сдвиг курсора вверх mov ah,255 mov al,0 move_ endm down macro ; Сдвиг курсора вниз mov ah,1 mov al,0 move_ endm left macro ; Сдвиг курсора влево mov ah,0 mov al,255 move_ endm right macro ; Сдвиг курсора вправо mov ah,0 mov al,1 move_ endm frame macro r0,c0,ro,co ; Рисование рамки mov cs:rrr,r0 mov cs:ccc,c0 mov cs:rrl,ro mov cs:ccl,co call frame_ endm write macro stt ; Вывод строки на экран lea dx,stt call prs_ endm inkey macro char ; Ожидание нажатия клавиши mov ah,7 int 21h mov char,al endm keypressed macro ; Ожидание нажатия любой клавиши inkey al endm keyb macro char,key ; Проверка на нажатие клавиши local no_chr local endk mov ah,6 mov dl,0FFh int 21h jz no_chr mov char,al jmp endk no_chr: mov char,0FFh endk: nop endm input macro char,key ; Ожидание и вывод на экран mov ah,1 int 21h mov char,al endm fill macro rr,cc,rl,cl ; Закрашивание части экрана local f0,f00 local rrl,rrr jmp f00 rrl db 0 rrr db 0 f00: mov al,rr mov cs:rrr,al mov al,rl mov cs:rrl,al f0: cur rrr,cc putcn 219,cl inc cs:rrr dec cs:rrl jnz f0 endm move_ macro ; Сдвиг курсора push ax is_page bh mov ah,3 int 10h pop ax add ah,dh add al,dl mov dx,ax is_page bh mov ah,2 int 10h endm frame_ proc ; Рисование рамки push ds mov ax,cs mov ds,ax mov ah,ccl dec ah add ah,ccc mov s3,ah cur rrr,ccc putc 218 right dec ccl dec ccl dec rrl dec rrl putcn 196,ccl cur rrr,s3 putc 191 f1: inc rrr cur rrr,ccc putc 179 cur rrr,s3 putc 179 dec rrl jnz f1 mov ah,rrr add ah,rrl inc ah mov s2,ah cur s2,ccc putc 192 right putcn 196,ccl cur s2,s3 putc 217 pop ds ret frame_ endp prs_ proc ; Вывод строки на экран mov cs:leng,0 mov si,dx prr: mov al,[si] inc si inc cs:leng cmp al,0 je eee putc al right jmp prr eee: ret prs_ endp pg_ proc mov ah,cs:pg ret pg_ endp spg_ proc mov cs:pg,ah ret spg_ endp ;============ МАКРОСЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ =============== ;--------------- ПОИСК ФАЙЛА ПО ШАБЛОНУ ------------------ find macro fil,a_a mov ah,4Eh ; Функция поиска lea dx,fil mov cx,a_a ; Атрибут int 21h endm ;------------ ПОВТОРНЫЙ ПОИСК ФАЙЛА ПО ШАБЛОНУ ----------- findr macro mov ah,4Fh ; Функция повторного поиска int 21h endm ;------------ ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С ФАЙЛАМИ ------------ disk db 'C:\',0 driv db 3 ; Номер дисковода dta_o dw 0 ; Старый буфер DTA dta_o2 dw 0 dta label byte ;--------DTA------------- db 21 dup(0) attr db 0 time dw 0 date dw 0 siz dw 0 siz_h dw 0 nam db 13 dup(0) ;------------ ИНИЦИАЛИЗАЦИЯ НОВОЙ DTA -------------------- ini_dta proc push es mov ah,2Fh ; Выдача буфера DTA int 21h ; в ES:BX mov cs:dta_o,bx ; Запоминание старого DTA mov cs:dta_o2,es mov dx,offset dta push ds mov ax,cs mov ds,ax mov ah,1Ah ; Установка буфера DTA int 21h ; из DS:DX pop ds pop es ret ini_dta endp ;------------ ВОЗВРАЩЕНИЕ СТАРОЙ DTA --------------------- ret_dta proc push ds mov dx,cs:dta_o ; Восстановление старого DTA mov ds,cs:dta_o2 mov ah,1Ah ; Установка буфера DTA int 21h pop ds ret ret_dta endp ;------------ ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО ДИСКА ----------------- disk_ proc mov ah,19h int 21h mov cs:driv,al add al,65 mov byte ptr cs:disk,al ret disk_ endp ;-------------- ГРАФИКА ---------------------------------- pixel macro xx,yy,cc is_page bh mov ah,12 mov dx,yy mov cx,xx mov al,cc int 16 endm ;------------- ВЫДЕЛЕНИЕ БЛОКА ПАМЯТИ -------------------- new macro siz_,seg_,reals_ mov bx,siz_ mov ah,48h int 21h mov seg_,ax mov reals_,bx endm ;------------- ОСВОБОЖДЕНИЕ БЛОКА ПАМЯТИ ----------------- delete macro seg_ push es mov es,seg_ mov ah,49h int 21h pop es endm ;------------ ВЫВОД БАЙТА В ШЕСТНАДЦАТИРИЧНОМ ВИДЕ ------ hex macro byte_ mov ah,byte_ mov al,ah and ah,0F0h mov cl,4 shr ah,cl and al,0Fh push ax call hex0 right pop ax mov ah,al call hex0 right endm ;------------ ПОДПРОГРАММА ВЫВОДА ПОЛУБАЙТА -------------- hex0 proc cmp ah,0Ah jae h_0 add ah,30h jmp h_1 h_0: add ah,37h h_1: putc ah ret hex0 endp ;----------- ВЫВОД ДЕСЯТИЧНОГО ЧИСЛА ---------------------- www0 dw 0 www1 dw 0 nnnn db 10 dup(0) num macro nnn local num_0 local num_1 local num_2 local num_e mov cx,type nnn lea bx,nnn cmp cx,1 jne num_0 call num1 jmp num_e num_0: cmp cx,2 jne num_1 call num2 jmp num_e num_1: cmp cx,4 jne num_2 call num4 jmp num_e num_2: nop num_e: nop endm ;-------------- ВЫВОД БАЙТА ----------------------- num1 proc mov al,[bx] mov ah,0 lea bx,nnnn call num_ ret num1 endp ;-------------- ВЫВОД СЛОВА ----------------- num2 proc mov al,[bx] inc bx mov ah,[bx] test ax,8000h jz num2_0 neg ax push ax putc '-' right pop ax num2_0: lea bx,nnnn call num_ ret num2 endp ;-------------- ВЫВОД ЧИСЛА ----------------------- num_ proc num1_0: mov dh,10 div dh add ah,30h mov cs:[bx],ah mov ah,0 inc bx cmp al,0 jne num1_0 num1_1: dec bx push bx putc cs:[bx] right pop bx lea cx,nnnn cmp bx,cx jne num1_1 ret num_ endp ;-------------- ВЫВОД ДВ.СЛОВА -------------- num4 proc
ret num4 endp
| |