268
186 01C5 8A D8 |
mov bl,al | ||
187 01C7 |
2E: A0 01BER |
mov al.aktywny | |
188 01CB |
OACO |
or al.al |
: testowanie semafora aktywności |
189 01CD |
74 18 |
jz nie aktywny |
; programu |
190 | |||
191 01CF |
80FB4A |
cmp bl.SCAN CODE l; czy naciśnięto klawisz? | |
192 01D2 |
74 03 |
je wyłącz |
; tak. wyłączyć program |
193 01D4 |
EB1F90 |
jmp retint |
; nic, obsłuż przerwanie |
194 | |||
195 01D7 |
2E: C6 06 01 BE R 00 wyłącz mov aktywny.0 |
; wyłączenie programu | |
196 01DD |
2E: C7 06 01BFR0000 |
mov wskaźnik,u | |
197 01E4 |
EB0F90 |
jmp retint | |
198 | |||
199 01E7 |
nieaktywny: | ||
200 01E7 |
80FB4E |
cmp bl,SCAN_CODE_2; czy naciśnięto klawisz " + " ? | |
201 01EA |
74 03 |
je zalacz |
; tak, włącz program |
202 01EC |
EB 1A 90 |
jmp stare_09H |
; powrót przez stare przerwanie |
203 | |||
204 01EF 2E: C6 06 01BE R 01 zalacz: mov aktywny,! | |||
205 | |||
206 01F5E4 61 retint: |
in al.KBCTL |
; zerowanie bitu kontrolnego | |
207 01F7 8AE0 |
movah,aI |
; klawiatury | |
208 01F9 0C80 |
or al.SOH |
• ♦ | |
209 01FBE6 61 |
out KB CTL.al |
; (powtórzenie standardowej sekwencji | |
210 01FD 86 EO |
xchg ah,al |
; z BIOS) | |
211 01FFE6 61 |
out KB CTL.al | ||
212 | |||
213 0201 5B |
pop bx | ||
214 0202 58 |
popax | ||
215 0203 BO 20 |
mov al.20h |
; zerowanie przerwania od klawiatury | |
216 0205 E6 20 |
out 20h.al | ||
217 0207 |
CF |
iret |
; ominięcie starego przerwania |
218 | |||
219 0208 |
stare 09H: | ||
220 0208 5B |
popbx | ||
221 020958 |
pop ax | ||
222 020A 2E: FF 2E 01B9 R 223 |
jmp int09H |
; skok do starego przerwania | |
224 |
klawiatura |
endp | |
duch" |
Page |
1-5 | |
225 | |||
227 |
; nowa procedura obsługi przerwania z zegara, symulująca uprowadzanie | ||
228 |
; znaków z klawiatury | ||
230 |
• | ||
231 020F |
duszek |
proc far | |
232 020F |
50 |
push ax | |
233 0210 |
53 |
push bx | |
234 0211 |
51 |
push cx | |
235 0212 |
1E |
push ds | |
236 0213 |
2E: A0 01BER |
mov a 1, aktywny |
; test semafora aktywności programu |
237 0217 |
OACO |
or al.al | |
238 0219 |
74 OE |
jz powrot |
: powrót do starego przerwania |
239 |
; program jest nieaktywny | ||
240 021B |
2& A0 01BDR |
mov al,licznik |
; 8 razy nic nie rób - pętla |
241 021F |
FE CO |
inc al | |
242 0221 |
3C08 |
cmp al,8 |
; jeśli równe 8, zacznij "pisać" |
243 0223 |
74 07 |
jz pisanie |
; wykonuj dalej |
244 0225 |
2E: A2 01BD R |
mov licznik,al |
; nowa zawartość licznika |
245 | |||
246 0229 247 |
E9 02ADR powrot: |
jmp koniec |
: zakończenie przez stare przerwanie |
248 022C |
2E: C6 06 01BD R 00 pisanie:: mov Iicznik.O |
; znaki będą wprowadzane do bufora | |
249 0232 |
B8 0040 |
mov ax.DOS_DS |
: klawiatury |
250 0235 |
8E D8 |
mov ds,ax |
; ds = 40H |
251 | |||
252 0237 |
BB001A |
movbx,BUFFER HEAD | |
253 023A |
8A 07 |
mov al,[bx] |
; czytaj położenie "głowicy" |
254 023C |
33 C9 |
xor cx,cx | |
255 023E |
BB001C |
mov bx,BUFFER TAIŁ; czytaj | |
256 0241 |
8A OF |
mov cl,[bx] |
; położenie końca tekstu w buforze |
257 0243 |
3A Cl |
cmp al,cl | |
258 0245 259 |
75 66jnc |
koniec |
; powrót, gdy są równe |
260 0247 |
2E: 8B1E01BFR |
mov bx |
.wskaźnik |
261 024C |
2E 8A A7 0103R |
mov ah.byte ptr tablica[bx]; czytaj kod ASCII znaku | |
262 0251 |
43 inc bx | ||
263 0252 |
2E- 8A 87 0103 R |
mov al.byte ptr tablica[bxl; czytaj Scan-code znaku | |
264 0257 |
OBCO |
or ax,ax |
; test. czy koniec tabeli |
265 0259 |
75 OD |
jne dalej |
; nie. rób dalej |
266 025B |
2E: A3 01BFR |
mov wskaźnik, ax |
; tak |
267 025F |
2E: C6 06 01BE R 00 |
mov aktywny ,0 |
: po jednokrotnym wykonaniu |
268 |
; program będzie nieaktywny | ||
269 0265 |
EB46 90 |
jmp koniec | |
270 | |||
271 0268 |
3D 0101 dalej: |
cmp ax,101H |
; czy jest pauza ? |
272 026B |
75 OD |
jne wprowadzznaki |
; nie. wprowadzaj znaki |
273 026D |
2E: Al 01BF R |
mov ax,wskaznik |
; tak. uaktualnij wskaźnik |
274 027 |
140 |
incax |
; i zakończ program bez |
275 0272 |
40 |
incax |
; wprowadzania znaków |
276 0273 |
2E: A301BFR |
mov wskaznik,ax | |
277 0277 |
EB 34 90 |
jmp koniec |
; powrót |
278 | |||
279 027A |
wprowadź znaki: | ||
280 027A |
8BD9 |
mov bx,cx | |
duch" |
Page |
1-6 | |
281 027C |
88 27 |
movbyte ptr [bx], ah |
; nowy kod ASCII do bufora |
282 027E |
43 |
inc bx | |
283 027F |
88 07 |
movbyte ptr [bx],a! |
; nowy Scan-code do bufora |
284 0281 |
43 |
inc bx | |
285 0282 |
E4 61 |
in al.KB CTL |
; zrób mały "klik-klak" |
286 0284 |
OC 03 |
or al,3H |
; symulujący uderzenie w klawisz |
287 0286 |
E6 61 |
out KB CTUal | |
288 | |||
289 0288 |
B9 0350 |
mov cx.350H | |
290 028B |
90 pauza 1: |
nop |
; i czekaj |
291 028C |
E2FD |
loop pauza 1 |