Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Program linie.asm
- ; Wyswietlanie znaków * w takt przerwan zegarowych Uruchomienie w trybie rzeczywistym procesora x86 lub na maszynie wirtualnej
- ; zakonczenie programu po nacisnieciu dowolnego klawisza asemblacja (MASM 4.0): masm gwiazdki.asm,,,; konsolidacja (LINK 3.60): link gwiazdki.obj;
- .386
- rozkazy SEGMENT use16
- ASSUME cs:rozkazy
- linia PROC
- ; przechowanie rejestrów
- push ax
- push bx
- push es
- mov ax, 0A000H ; adres pamieci ekranu dla trybu 13H
- mov es, ax
- mov bx, cs:adres_piksela ; adres biezacy piksela
- mov al, cs:kolor
- mov es:[bx], al ; wpisanie kodu koloru do pamieci ekranu
- cmp cl, 80 ; dol
- jne dalej2
- add bx, 320
- dalej2:
- cmp cl, 72 ; gora
- jne dalej3
- sub bx, 320
- dalej3:
- cmp cl, 75 ; lewo
- jne dalej4
- sub bx, 1
- dalej4:
- cmp cl, 77 ; prawo
- jne koniec
- add bx, 1
- ; przejscie do nastepnego wiersza na ekranie
- koniec:
- ; sprawdzenie czy cała linia wykreslona
- cmp bx, 320*200
- jne dalej ; skok, gdy linia jeszcze nie wykreslona
- ; kreslenie linii zostało zakonczone - nastepna linia bedzie kreslona w innym kolorze o 10 pikseli dalej
- add word PTR cs:przyrost, 10
- mov bx, 0
- add bx, cs:przyrost
- inc cs:kolor ; kolejny kod koloru
- ; zapisanie adresu biezacego piksela
- dalej:
- mov cs:adres_piksela, bx
- ; odtworzenie rejestrów
- pop es
- pop bx
- pop ax
- ; skok do oryginalnego podprogramu obsługi przerwania zegarowego
- jmp dword PTR cs:wektor8
- ; zmienne procedury
- kolor db 1 ; biezacy numer koloru
- adres_piksela dw 0 ; biezacy adres piksela
- przyrost dw 0
- wektor8 dd ?
- linia ENDP
- ; INT 10H, funkcja nr 0 ustawia tryb sterownika graficznego
- zacznij:
- mov ah, 0
- mov al, 13H ; nr trybu
- int 10H
- mov bx, 0
- mov es, bx ; zerowanie rejestru ES
- mov eax, es:[32] ; odczytanie wektora nr 8
- mov cs:wektor8, eax; zapamitanie wektora nr 8
- ; adres procedury 'linia' w postaci segment:offset
- mov ax, SEG linia
- mov bx, OFFSET linia
- cli ; zablokowanie przerwa
- ; zapisanie adresu procedury 'linia' do wektora nr 8
- mov es:[32], bx
- mov es:[32+2], ax
- sti ; odblokowanie przerwa
- mov cl, 80
- aktywne_oczekiwanie:
- mov ah,1
- int 16H
- ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
- ; naciśnięto jakiś klawisz
- jz aktywne_oczekiwanie
- ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
- ; do rejestru AL
- mov ah, 0
- int 16H
- in al, 60h
- cmp al, 45 ; porównanie z kodem litery 'x'
- mov cl, al
- jne aktywne_oczekiwanie ; skok, gdy inny znak
- ; deinstalacja procedury obsługi przerwania zegarowego
- mov ah, 0
- mov al, 3h
- int 10h
- ; odtworzenie oryginalnej zawartoci wektora nr 8
- mov eax, cs:wektor8
- mov es:[32], eax
- ; zakoczenie wykonywania programu
- mov ax, 4C00H
- int 21H
- rozkazy ENDS
- stosik SEGMENT stack
- db 256 dup (?)
- stosik ENDS
- END zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement