format mz
;;;;;;;;;;;;;;;
macro print str,color {
local go
local exit
mov si,str
go:
mov al,[si]
cmp al,'$'
je exit
MOV AH,0eh;функция вывода на экран
mov bh,00;страница
mov bl,color;0dah;атрибут цвета
int 10h
inc si
jmp go
exit:
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;???????????????????????????
macro setcursor x,y{
mov dh,x
mov dl,y
mov ah,2
mov bx,0
int 10h
}
;;;;;;;;;;;;;;;;;;
begin:
mov ax,cs
mov ds,ax
;mov es,ax
mov ax,0004h ; ;???????????????????????????
int 10h ;
;call vvod_trg
;jmp exit
;gets 5,20
call print_menu
@@:
;9= tab
;27=esc
;0=del
;13=enter
;8 = backs..
mov ah,00;команда на ввод символа который будет помещен в AL
int 16h;
cmp al,9 ;
jne notab
mov al,[m_exit_cvet]
mov ah,[m_plosh_cvet]
xchg al,ah
mov [m_exit_cvet],al
mov [m_plosh_cvet],ah
mov ax,0004h ;;???????????????????????????
int 10h ;;???????????????????????????
call print_menu
notab:
cmp al,13
jne noenter
cmp [m_exit_cvet],1
je exit
;вызываем процедуру для ввода сторон треугольника
;call vvod_tr
call vvod_trg
mov ax,0004h ;
int 10h
call print_menu
noenter:
jmp @r
exit:
mov ax, 4c00h ;
int 21h
;==============
msg db 10, 56 dup (?) ;Set msg array
m_plosh db "Ploshad $"
m_plosh_cvet db 1
m_exit db " EXIT$"
m_exit_cvet db 3
menuCoor1 db " 10|15 coor1$"
menuCoor2 db " 07|05 coor2$"
menuCoor3 db " 17|05 coor3$"
menuRezult db " Rezult="
msgS db "$$$$$$$$$$$$$$$$$$$$$$"
menu_color db 1,3,3,3,3
x dw 10,7,17
y dw 15,5,5
endl db 10,13,'$'
temp db 0
;AB dw 0
;AC dw 0
S db "S=$"
;метод рисует меню
print_menu:
;сначало рисуем меню площядь
print m_plosh,[m_plosh_cvet]
;затем выход
print m_exit,[m_exit_cvet]
ret
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
strTodgt: ; строку в число, принимает строку в si , вывод в ах
;метод который переводит с строки в числовой формат
mov dx,0
;mov si,%1
@@: ;начало цикла
mov ax,0
mov cx,0
mov al,[si] ;???????????????????????????
cmp al,'$' ;???????????????????????????
je @f
sub al,30h ;для получения самой цифры по ее коду мы должны вычесть 30h,; вычитаем из содержимому регистра AL 30H(H значит, что число в 16-тиричной системе счисления)
mov cx,ax ;???????????????????????????
mov bx,10 ;???????????????????????????
mov ax,0 ;???????????????????????????
mov ax,dx ;???????????????????????????
mul bx ; ;???????????????????????????
add ax,cx
mov dx,ax
inc si
jmp @r
@@:
mov ax,dx
ret
;;;;;;;;;;;;;;;;;;;
dgtTostr: ;число в строку
;ax=число
;si=строка
mov dl,'$' ;???????????????????????????
push dx
vuv_chisla_s:
mov dx,0
mov bx,10
div bx
add dl,30h
push dx
cmp ax,0
jne vuv_chisla_s
; ;теперь числа вынимаеи из стека
gopop:
pop dx
mov [si],dl ;???????????????????????????
cmp dl,'$'
pushf
inc si ;???????????????????????????
popf
jne gopop
ret
;=====================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vvod_trg:
;вход в подменю
;рисуем 5 строк выход, 3 координа ввода и выход
;переключение между ними таб
setcursor 1,0
;menu_color db 1,3,3,3,3
mov [menu_color],1
mov [menu_color+1],3
mov [menu_color+2],3
mov [menu_color+3],3
mov [menu_color+4],3
call print_pod_menu
xor bx,bx
xor si,si; указатель строки
xor di,di
vcikl:
push bx
push si
mov ah,00;команда на ввод символа который будет помещен в AL
int 16h;
cmp al,27
jne @f
pop ax
pop ax
ret
@@:
cmp al,9
jne vnotab
call cls
setcursor 0,0
call print_menu
setcursor 1,0
call next_menu
call print_pod_menu
pop si
pop bx
inc bx
add si,15
cmp bx,4
jne @f
pusha
call vu4islitS;вычисляем площядь треугольника
popa
xor bx,bx
xor si,si
jmp vcikl
@@:
cmp bx,0
je @f
push bx
;вызываем обработцик ввода координат
push si
inc bx
call vvod_chisel
pop si
pop bx
cmp al,27
je vexit
@@:
jmp vcikl
;если выбрано меню то идем туда
vnotab:
pop si
pop bx
;проверим может нажали энтер
cmp al,13
jne @f
cmp bx,0
jne @f
ret
@@:
jmp vcikl
vexit:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cls:
mov ax,0600h
mov bh,00
mov cx,0000 ;верхняя левая позиция
mov dx,184fh
int 10h
ret
;====================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
next_str:
mov ah,9
mov dx,endl
int 21h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
next_menu:
;увеличиваем цвета
;0=3 3=2 2=1
;pusha
xor ax,ax
mov ah,[menu_color+3]
mov al,[menu_color]
mov [menu_color],ah
mov ah,[menu_color+1]
mov [menu_color+1],al
mov al,[menu_color+2]
mov [menu_color+2],ah
mov ah,[menu_color+3]
mov [menu_color+3],al
;popa
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
print_pod_menu:
print m_exit,[menu_color]
call next_str
print menuCoor1,[menu_color+1]
call next_str
print menuCoor2,[menu_color+2]
call next_str
print menuCoor3,[menu_color+3]
call next_str
print menuRezult,[menu_color+4]
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vvod_chisel:
;выделяем площядь для вывода
;два числа вписуем в строку
;если пользователь не нажал на цифры то поле не меняем
;если нажал то обнуляем все
add di,2
cmp di,6
jl @f
xor di,di
@@:
sub si,15
add si,3
;ставим курсор
push bx
setcursor bl,3
;закрашиваем два символа
call set_color_did
;вводим занчения туда
pop bx
push bx
setcursor bl,3 ;???????????????????????????
mov [msg],'$'
mov [msg+1],'$' ;???????????????????????????
mov [msg+2],'$'
call get_didgit
cmp al,0 ;del
jne @f
mov [menuCoor1+si],'0'
mov [menuCoor1+si+1],'0'
mov [menuCoor1+si+3],'0'
mov [menuCoor1+si+4],'0'
; mov
pop bx ;очищяем стек
push bx
sub si,3
call vvod_chisel_pressDel
pop bx ;очищяем стек
push bx
setcursor bl,3
;цвет возврящяем прежний
call set_color_norm_did
pop bx
;востанавливаем si
add si,15
jmp vvod_chisel
@@:
;---------
cmp al,27
jne @f
pop bx ;очищяем стек
ret
@@:
;---------
cmp [msg],'$'
je @f
push si
mov si,msg
call strTodgt
mov word [x+di],ax ;???????????????????????????
pop si
@@:
pop bx
push bx
setcursor bl,3
;цвет возврящяем прежний
call set_color_norm_did
;начинаем заполнять У
pop bx
push bx
setcursor bl,6
call set_color_did
pop bx
push bx
setcursor bl,6 ;???????????????????????????
add si,3
mov [msg],'$'
mov [msg+1],'$' ;???????????????????????????
mov [msg+2],'$'
call get_didgit
cmp al,0 ;del
jne @f
mov [menuCoor1+si],'0'
mov [menuCoor1+si+1],'0'
mov [menuCoor1+si-2],'0'
mov [menuCoor1+si-3],'0'
; mov
pop bx ;очищяем стек
push bx
sub si,6
call vvod_chisel_pressDel
pop bx ;очищяем стек
push bx
setcursor bl,6
;цвет возврящяем прежний
call set_color_norm_did
pop bx
;востанавливаем si
add si,15
jmp vvod_chisel
@@:
cmp al,27
jne @f
pop bx ;очищяем стек
ret
@@:
;-------------
cmp [msg],'$'
je @f
mov si,msg
call strTodgt
mov word[y+di],ax
@@:
pop bx
push bx
setcursor bl,6
;цвет возврящяем прежний
call set_color_norm_did
pop bx
ret
vvod_chisel_pressDel:
mov [di+x],0
mov [di+y],0
;также обнуляем строки
;вернее выводим обнуленные
push si
mov ax,si
mov si,menuCoor1
add si,ax
setcursor bl,0
print si,3
pop si
cmp di,0
je @f
sub di,2
ret
@@:
mov di,4
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;=======================================
set_color_did:
;и закрашиваем два символа вправо
mov ah,8
mov bx,0
int 10h
MOV AH,09h;функция вывода на экран
;mov al,' ';символ который выводим
mov bh,00;страница
mov bl,02h;атрибут цвета
mov cx,01;число повторений
int 10h
;смотрим положение курсора
mov ah,3
xor bx,bx
int 10h
inc dl
setcursor dh,dl
mov ah,8
mov bx,0
int 10h
;выделяем символы
;и только выделить а не стереть
MOV AH,09h;функция вывода на экран
;mov al,' ';символ который выводим
mov bh,00;страница
mov bl,02h;атрибут цвета
mov cx,01;число повторений
int 10h
ret
;========================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;========================================
get_didgit:
;водим два числа
mov ah,00
int 16h
cmp al,13 ;enter
je get_didgit_exit
cmp al,9 ;tab
je get_didgit_exit
cmp al,27 ;esc
je get_didgit_exit
cmp al,0 ;del
je get_didgit_exit
;одниляем два элемента
push ax
MOV AH,09h;функция вывода на экран
mov al,' ';символ который выводим
mov [menuCoor1+si+1],al
mov bh,00;страница
mov bl,02h;атрибут цвета
mov cx,02;число повторений
int 10h
pop ax
mov [menuCoor1+si],al
mov [msg],al
;вывели сивол
MOV AH,0eh;функция вывода на экран
mov bh,00;страница
mov bl,2;атрибут цвета
int 10h
mov ah,00
int 16h
cmp al,13 ;enter
je get_didgit_exit
cmp al,9 ;tab
je get_didgit_exit
cmp al,27 ;esc
je get_didgit_exit
cmp al,0 ;del
je get_didgit_exit
mov [msg+1],al
mov [menuCoor1+si+1],al ;???????????????????????????
;вывели сивол
MOV AH,0eh;функция вывода на экран
mov bh,00;страница
mov bl,2;атрибут цвета
int 10h
get_didgit_exit:
ret
;========================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;=======================================
set_color_norm_did:
;и закрашиваем два символа вправо
mov ah,8
mov bx,0
int 10h
MOV AH,09h;функция вывода на экран
;mov al,' ';символ который выводим
mov bh,00;страница
mov bl,01h;атрибут цвета
mov cx,01;число повторений
int 10h
;смотрим положение курсора
mov ah,3
xor bx,bx
int 10h
inc dl
setcursor dh,dl
mov ah,8
mov bx,0
int 10h
;выделяем символы
;и только выделить а не стереть
MOV AH,09h;функция вывода на экран
;mov al,' ';символ который выводим
mov bh,00;страница
mov bl,01h;атрибут цвета
mov cx,01;число повторений
int 10h
ret
;========================================
vu4islitS:
;сначало смотрим все занчения координат
xor ax,ax
xor dx,dx
;вычисляем площядь треугольника
mov ax,word[x]
mov bx,word[x+4]
sub ax,bx
mov cx, word[y+2]
mov dx, word[y+4]
sub cx,dx
imul cx
push ax
mov ax,word[x+2]
mov bx,word[x+4]
sub ax,bx
mov cx, word[y]
mov dx, word[y+4]
sub cx,dx
imul cx
mov bx,ax
pop ax
sub ax,bx
cmp ax,0
jge @f
neg ax
@@:
xor dx,dx
xor bx,bx
mov bx,2 ;???????????????????????????
div bx ;???????????????????????????
;
mov si,msgS
call dgtTostr
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;------------------------------------------
;------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|