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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
| stck segment stack
dw 10h dup(0) ;16 слов, инициализированных нулем
stck ends
data segment
atmp db 0h
btmp db 0h
сtmp dw 0h
bol dw 0h
x dw (?)
massiv dw 4 dup (?)
massiv2 dw 4 dup (?)
i db 11b
data ends
PrcCode segment
podproc proc far
push bp ;—Сохранение регистра BP
mov bp,sp
mov bx,[bp+4]
cmp bl,al
JNe mNE;
mov bx, offset massiv2
mov [bx+di],si
inc di
mNE:
inc si
pop bp
ret 2
podproc endp
PrcCode ends ;конец сегмента подпрограммы
code segment
assume cs:code, ds:data,ss:stck
main:
mov dx, data
mov ds, dx
call input
;-------------------------------основна¤ программа-------------------------
GO:
call mainproc
call outtoscreen2
pause: in al, 60h
cmp al, 01h
jne pause
quit: mov ax, 4C00h
int 21h
;--------------------------------------------------------------------------
beep proc
mov atmp,al
mov btmp,bl
mov сtmp,cx
mov bx,bol
cmp bol,1h
je next
mov bol,0h
jmp endbeep
next:
mov al, 24h
out 42h, al
mov al, 0Eh
out 42h, al
in al, 61h
or al, 00000011b
out 61h, al
xor cx, cx
l1: mov bx, cx
mov cx, 4h
l2: loop l2
mov cx, bx
loop l1
in al, 61h
and al, 11111100b
out 61h, al
mov al,atmp
mov bl,btmp
mov cx,сtmp
mov bol,0h
jmp inloop
endbeep:
ret
beep endp
;--------------------------------------------------------------------------
outtoscreen proc
mov bx, 8000h
mov di, 80*2
mov si,0h
beg:
mov bx, 8000h
cmp si,4h
je bye
outloop:
push bx
xor bx,bx
xor ax,ax
mov bx, offset massiv
mov ax, [bx+si]
pop bx
test ax, bx
jnz bit1
mov es:[di], 0730h ;если 0, вывести 0
jmp NxtBit
bit1: mov es:[di], 0731h ;если 1, вывести 1
NxtBit: inc di
inc di
shr bx, 1
jnc outloop
inc si
mov es:[di], 0720h
inc di
inc di
jmp beg
bye:
ret
outtoscreen endp
;--------------------------------------------------------------------
outtoscreen2 proc
mov bx, 8000h
mov di, 80*4
mov si,0h
beg2:
cmp si,4h
je bye2
outloop2:
mov es:[di], 0720h
push bx
xor bx,bx
xor ax,ax
mov bx, offset massiv2
mov al, [bx+si]
pop bx
shr al,4
add al,'0'
mov es:[di], al
inc di
push bx
xor bx,bx
xor ax,ax
mov bx, offset massiv2
mov al, [bx+si]
pop bx
and al,0Fh
add al,'0'
inc di
mov es:[di], al
inc di
inc di
inc si
mov es:[di], 0720h
inc di
inc di
jmp beg2
bye2:
ret
outtoscreen2 endp
;----------------------------------input-------------------------------
input proc
mov dx, 0B800h
mov es, dx
xor di, di
xor dx, dx
mov ax, 0720h
mov cx, 80*25
rep stosw
xor di, di
push si
mov si,0
opanki:
mov cx, 2h
inloop:
call beep
in al, 60h
cmp al, bl
je inloop
mov bl, al
cmp al, 01h
jne NotEsc
jmp quit
NotEsc: cmp al, 02h
je num1
cmp al, 39h
je space
cmp al, 0Bh
jne notlegal
shl dx, 1
mov es:[di], 0730h
mov bol,1h
jmp NxtNum
notlegal:
mov bol,0h
jmp inloop
space:
mov es:[di], 0720h
mov bol,1h
inc di
inc di
jmp inloop
num1: shl dx, 1
or dx, 1
mov es:[di], 0731h
mov bol,1h
jmp NxtNum
NxtNum:
inc di
inc di
dec cx
jnz inloop
mov dh,0h
mov x, dx
mov atmp,al
mov btmp,bl
mov bx, offset massiv
mov [bx+si],dl
mov dx,0b
mov bl,btmp
mov al,atmp
inc si
cmp si,4h
jl menche
;call outtoscreen
jmp GO
menche: jmp opanki
exitforinput:
ret
input endp
;---------------------------------------mainproc------------------------------
mainproc proc
obrab:
mov al,i
mov di,0h ;счЄтчик второго массива
mov cx,4h
mov si,0h;счЄтчик первого массива
LP:
mov bx, offset massiv
mov dl,[bx+si]
push dx
call far ptr podproc
loop LP
mov cx,4h
mov dl,99h
LP2:
mov bx, offset massiv2
mov [bx+di],dl
inc di
loop LP2
ret
mainproc endp
;----------------------------------------------------------------------
code ends
end main |