Code: Select all
;*************************************************************
;* 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
P.S. В rasm при переписывании на си что-то сломалось - он метки назад не разруливает - в ближайшее время исправлю...