1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
| .386
assume ds:data, cs:code
data segment use16
min_x dq -7.36 ; дійсне мінімальне значення по осі х
max_x dq 7.36 ; дійсне максимальне значення по осі х
max_crt_x dw 320 ; максимальна кількість точок
;на екрані по осі х
crt_x dw 0 ; екранна координата по осі х ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
scale_x dq ? ; масштаб по осі х
;y
min_y dq -4.6
max_y dq 4.6
max_crt_y dw 200
crt_y dw 0 ;;;;;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;
scale_y dq ?
tmp dq ?
data ends
code segment use16
start:
mov ax, data
mov ds, ax
finit ;Инициализируем сопроцессор
;;;;;;;;;;;;;;;;
scale macro p1
; обчислення масштабного коефіцієнта по осі p1
; наприклад, для осі х: (max_x - min_x) / max_crt_x
; top=0
fld max_&p1 ; st0=max_&p1; top=7
fsub min_&p1 ; st0=max_&p1 - min_&p1; ;top=7
fild max_crt_&p1 ; st0=max_crt_&p1, st1=max_&p1-min_&p1; top=6
fdivp st (1), st (0) ; 1-й крок st1=st1/st0
; 2-й крок st1 стає st0; top=7
; і містить масштаб
fstp scale_&p1 ; top=0
endm
;;;;;;;;;;;;;;;;
;задаём граф режим
mov ax, 13h
int 10h
;заносимо початкову адресу відеосторінки в ES
mov ax, 0a000h
mov es, ax
; coordinates
mov cx,200
mov bx,160
Y:
mov byte ptr es:[bx],2
add bx,320
loop Y
mov cx,320
mov ax,320
mov bx,100
mul bx
mov bx,ax
X:
mov byte ptr es:[bx],2
add bx,1
loop X
;Макрокоманди доцільно задати поза циклом обчислення функцій.
scale x
scale y
;цикл
loop1:
; перетворення екранної координати в дійсну. ; top=0
fld scale_x ; st0 - масштаб
fild crt_x ; st0=crt_x, st1-масштаб ;top=6
fmulp st (1), st (0) ; top=7
fadd min_x ; st0 - реальне зн. Х; top=7
;.................
;function y=x/cosx;
fst tmp
fld tmp
fcos
fdivp
;.................
; контроль діапазону (top не змінюється)
fcom min_y; порівняння ST (0) та min_y
fstsw ax; результат порівняння в ax
sahf ; результат порівняння
;ST (0) та min_y в регістр Flags
jc @minus ; st0 < min_y
; поза видимим діапазоном
; по @minus забезпечити top=0 і
; crt_y=max_crt_y
fcom max_y ; порівняння ST (0) та max_y
fstsw ax
sahf
ja @plus ; st0 > max_y (zf=cf=0)
; поза видимим діапазоном
; по @plus - забезпечити top=0
; і встановити crt_y=0
fsub min_y
fdiv scale_y
frndint ; округлення до цілого
fistp crt_y ; TOP=0!!!
mov ax,max_crt_y
sub ax,crt_y
mov crt_y,ax ; дзеркальне відображення
;вивід на екран
print:
mov cx, crt_x ;x
mov si, crt_y ;y
;ax = повне зміщення відповідного байта в графічній відеопам’яті
mov ax, 320
mul si
add ax, cx
;регістрі es міститься сегментна адреса відеосторінки, а в регістрі dl знаходиться код кольору точки
mov bx,ax
mov byte ptr es:[bx], 13
jmp continue
;.....................
@minus:
fstp ; TOP=0!!!
jmp continue
@plus:
fstp ; TOP=0!!!
;;;;;;;;;;
continue:
add crt_x, 1 ; крок
cmp crt_x, 320
jne loop1
end_loop1:
;- Обчислення масштабних коефіцієнтів по осі "х" і "у"
;- Перерахунок екранної координати "х" у дійсне значення координати
;- Обчислення значення функції по значенню аргументу, одержаного на попередньому кроці.
;- Перерахунок значення функції в екранну координату "у"
;- Виведення точки на екран згідно з п. 1.1.
mov ah,01h
int 21h
mov ax,3
int 10h
mov ax,4c00h
int 21h
code ends
end start |