MENU  
  Strona startowa
  Newsletter
  Rejestracja
  LOGOWANIE
  Forum
  Systemy
  WAREZ
  Chomikuj.pl
  Darmowy Hosting
  GRAFIKA
  Baner Flash
  Alfabet HTML
  Asembler Kurs
  => Czas i data
  => ADRESOWANIE PAMIĘCI
  => CZAS I RUCH NA EKRANIE
  => DYREKTYWY ASSEMBLERA
  => OBSŁUGA GŁOŚNIKA
  => GENERATOR LICZB LOSOWYCH
  => REJESTRY PROCESORA
  => PĘTLE
  => SZABLON PROGRAMU
  PIERWSZY RAZ HTML
  Hakerstwo
  Świat WWW
  Serwery Proxy
  Galeria
  GRY
  SKÓRKA DO GG
  Lockerz.com
  SKLEP
...
CZAS I RUCH NA EKRANIE

CZAS I RUCH NA EKRANIE


W poprzedniej lekcji poznaliśmy metody wypisywania na ekran w trybach tekstowych.
Znaki wypisywane na ekranie wcale nie muszą być statyczne , mogą się dynamicznie zmieniać.Aby wprowadzić trochę dynamiki trzeba wiedzieć jak zmieniać pozycję kursora tak by w wybranymprzez nas miejscu ekranu wprowadzić zmianę znaku.
Jeżeli chcielibyśmy przemieścić kursor pod wybrane przez nas współrzędne ekranowe należy wpisać poniższy fragment kodu:
MOV AH,02H
MOV BH,nr_strony
MOV DH,wiersz;y
MOV DL,kolumna;x
INT 10H

Możemy również odczytywać pozycję kursora na ekranie. Zrobimy to wpisując poniższy fragment kodu:
MOV AH,03H
MOV BH,nr_strony
INT 10H

Po wykonaniu powyższego kodu w rejestrach CH i CL będziemy mieli informacje o wielkości kursora (CH-początek kursora licząc od góry , CL-Koniec kursora), w rejestrze DH znajdziemy numer wiersza a w rejestrze DL numer kolumny w której znajduje się kursor.
Poniżej przedstawiam kod programu rysującego ramkę z gwiazdek:
progr segment
assume cs:Progr,ds:dane,ss:stosik
gotoxy proc
; x= dh y=dl
mov ah,02h
mov bh,00h
int 10h
ret
endp
writechar proc
mov ah,0Ah
mov Al,'*';
mov bh,00h
mov cx,1;
int 10h
ret
endp;
kbhit proc
mov ah,0bh
int 21h
ret
endp
wait proc
push dx;
push cx;
mov cx,0;
mov dx,50000; mikrosekund
mov ah,86h; funkcja ktora nic nie robi przez CX:DX mikrosekund
int 15h
pop cx
pop dx
ret
endp;

start:
mov ax,dane ;przypisanie wskaznika na segment dane do rejestru AX
mov ds,ax ;przypisanie wartosci AX do rejestru DS
mov ax,stosik ;
mov ss,ax
mov sp,offset szczyt


mov dx,0000h
lewa: call gotoxy
call writechar
call wait;
cmp dh,18h
je dol
inc dh
jmp lewa

dol: call gotoxy
call writechar
call wait;
cmp dl,4Fh
je prawa
inc dl
jmp dol

prawa: call gotoxy
call writechar
call wait;
cmp dh,00h
je gora
dec dh
jmp prawa

gora: call gotoxy
call writechar
call wait;
cmp dl,00h
je czekaj
dec dl
jmp gora

czekaj: call kbhit
cmp al,0 ; porownanie wyniku procedury z zerem
je czekaj; jesli bufor jest pusty to sprawdz ponownie

EXIT:
mov ah,4Ch ;przypisanie do rejestru AH wartosci 4CH
mov al,00h ;przypisanie do rejestru AL wartosci 0
int 21h ;wywolanie przerwania DOS (21H)
progr ends ; koniec segmentu


dane segment

dane ends

stosik segment ;Poczatek segmentu stosu
dw 100h dup(0) ;wypelnienie przestrzeni 100h slowami (16 bitowymi )o wartosci 0
szczyt label word ;
stosik ends ; koniec segmentu stosik

end start ; koniec programu z zaznaczeniem od ktorego miejsca program sie ma zaczac


Dla skrócenia programu zastosowałem w nim procedury. Dla pokazania ruchu opóżniłem każde wyświetlenie gwiazdki o 5000 mikrosekund. Aby to zrobić zastosowałem funkcję 86H przerwania 15H. Funkcja ta nic nie robi(czeka) przez tyle czasu ile odczytuje z pary rejestrów CX DX. Czas trwania tej funkcji podawany jest w mikrosekundach(1/1000000 s) w taki sposób że młodsza część znajduje się w DX a starsza w CX.
Czas ten można więc wyrazić wzorem T:=(65536*CX)+DX, czyli może być liczbą 32-bitową.
Dokładniej omówię tą funkcję w lekcji czwartej.

W programie przedstawionym powyżej wykorzystałem też możliwość reakcji na zapełnienie bufora klawiatury. Program tak długo chodzi w pętli kbhit, aż nie zostanie naciśnięty jakikolwiek klawisz. Wówczas program przechodzi dalej i kończy się. Używa się tego np. do zobaczenia wyników działania programu przed jego zakończeniem. Aby takie coś wykonać należy wpisać:

czekaj:
mov ah,0bh
int 21h
cmp al,0 ; porownanie wyniku funkcji z zerem
je czekaj; jesli bufor jest pusty to sprawdz ponownie


Funkcja 0Bh przerwania DOSowskiego sprawdza czy w buforze klawiatury jest jakiś znak. Jeśli bufor jest pusty to w rejestrze AL jest 0 w przeciwnym wypadku jest 0FFh.

Czasami chcemy by migający kursor nie był widoczny. Możemy tego dokonać funkcją 01H przerwania 10H. Funkcja ta ustawia rozmiar i kształt kursora.Aby kursor był widoczny początkowa i kończowa linia kursora powinna mieścić sie w przedziale 0-1Fh. Podanie 20H powoduje ukrycie kursora. MOV AH,01H
MOV CH,linia początkowa
MOV CL,linia końcowa
INT 10H

Aby przećwiczyć nabyte umiejętności przeanalizujemy teraz program rysujący spiralę z gwiazdek na ekranie.
progr segment
assume cs:Progr,ds:dane,ss:stosik
gotoxy proc
mov ah,02h
mov bh,00h
int 10h
ret
endp
writechar proc
mov ah,0Ah
mov Al,'*'
mov bh,00h
mov cx,1;
int 10h
ret
endp;
kbhit proc
mov ah,0bh
int 21h
ret
endp
wait proc
push dx;
push cx;
mov cx,0;
mov dx,50000;
mov ah,86h;
int 15h
pop cx
pop dx
ret
endp;


start:
mov ax,dane
mov ds,ax
mov ax,stosik
mov ss,ax
mov sp,offset szczyt


mov ah,01h
mov cl,20h;
mov ch,20h;
int 10h;

mov dx,0000h
lewa: call gotoxy
call writechar
call wait;
cmp dh,ymax;
je dol
inc dh
jmp lewa

dol: call gotoxy
call writechar
call wait;
cmp dl,xmax;
je prawa
inc dl
jmp dol

prawa: call gotoxy
call writechar
call wait;
cmp dh,ymin
je gora
dec dh
jmp prawa

gora: call gotoxy
call writechar
call wait;
cmp dl,xmin;
je rawa
dec dl
jmp gora

rawa:
dec xmax;
dec ymax;
inc xmin;
inc ymin;
cmp ymax,12
je czekaj
jmp lewa;


czekaj: call kbhit
cmp al,0
je czekaj;
EXIT:
;Kursor
mov ah,01h
mov cl,1Eh;
mov ch,20h;
int 10h;

mov ah,4Ch
mov al,00h
int 21h
progr ends

dane segment
xmax db 4fh;
ymax db 18h;
xmin db 01h;
ymin db 00h;
dane ends

stosik segment
dw 100h dup(0)
szczyt label word
stosik ends

end start


Teraz 11195 odwiedzający (26022 wejścia)
Logowanie  
 
Nazwa użytkownika:
Hasło:
 
 
 
 
 
   
Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja