; Program Mysz2.ASM
; Obsluga myszy w trybie tekstowym
; Cwiczenie 3 z LABORATORIUM PROGRAMOWANIA W JEZ. SYMBOL.
; K R, D R, M R
; 16.05.1998


Assume	CS:Code 		   	; dyrektywa
					; inform. dla asemblera,
					; ze CS bedzie wskaz. na segm. kodu


code	segment				; tworzenie segmentu kodu
start:	jmp start1                      ; skok do start1

komunikat1 db 'Brak myszy', 0dh,0ah,'$' ; define byte, nowa linia, koniec
                                        ; stringu

start1:
	mov	ax, 0000h 		; sprawdz czy jest ster myszy
	int 	33h			; odczyt stanu: funkcja 0h
                                        ; przerwanua 33h
                                        ; AX=0000h - mysz nie zainstalowana
                                        ; AX=0ffffh-nysz zainstalowana
                                        ; w BX liczba przyciskow myszy
	jz 	fin			; skok do etykiety fin gdy brak myszy


	mov dx,	0b800h			; adres poczatku pamieci karty VGA
	mov es,dx			; przepis adresu do rej. segm ES

	mov di,0			; ustawienie 0 w Destination Index
                                        ; Register (rej. indeks. DI)
	; xor di,di                     ; inny sposob zerowania
	mov cx,2000			; ustawienie w liczniku CX (Counter)
                                        ; ile razy petla kasow ekranu ma
                                        ; sie wykonac
	mov ax,0720h			; atrybut 07 (zwykly tryb ekranu)
	cld				; clear direction flag - 
					; czyszczenie flagi kierunku

petla:	
					; kasow ekranu
	stosw
	loop petla			; loop dziala na CX


	mov 	ax,0001h		; wyswietl. kursora myszy
	int 33h				; funkcja 1h, przerw. 33h
                                        ; nic nie zwraca;
                                        ; pojawia sie kursor tekstowy
                                        ; lub strzalka w tryb. graf
	mov dx,	0b800h			; adres pocz pamieci karty

Rysuj:                                  ; eykieta poczatku rysowania
                                        ;
	mov	ax, 0003h		; inform o wspolrz kursora
	int 	33h			; i stanie przyciskow
                                        ; BX = stan przyciskow:
                                        ; bit 0=1 - wcisn. lewy przycisk
                                        ; bit 1=1 - wcisn. prawy przycisk
                                        ; bit 2=1 - wcisn. srodk przycisk
                                        ; CX = kolumna gdzie jest kursor
                                        ; DX = wiersz gdzie jest kursor

	test	bx,1			; czy nacisniety klawisz lewy
	jz 	Nie_stawiaj_pktu	; jesli 0 czyli nie nacisniety
                                        ; to skok do etykiety
                                        ; jesli nie to ponizsze instrukcje
	push bx	                        ; zachowaj BX

	mov ax,dx			; Y - do AX wiersz kursora
	mov bx, 20                      ; do BX 20
	mul bx				; Y*20 - wynik w AX
	shr cx,1			; przelicz cx=cx div 2
	shr cx,1			; przelicz cx=cx div 2
					; w CX jest X/4
	add ax,cx			; Y+X/4
	mov di,	ax			; offset

	mov 	ax,0002h		; skasowanie kursora myszy
	int 33h				; funkcja 2h przerwania 33h

	mov byte ptr es:[di],'A'	; litera 'A' w pamieci ekranu
					; przesylanie bajtu
					; slowo - word

	mov ax,0001h		        ; wyswietl kursora
	int 33h				; myszy

					; wyswietla sie,
					; znika po przesun myszy
	                                ; gdy brak push i pop

	pop bx				; odtworz BX

Nie_stawiaj_pktu:			; klawisz prawy
	test bx,2			; do BX 10 = 2
	jnz koniec			; skok do koniec
                                        ; gdy nacisniety prawy klawisz
	jmp Rysuj			; powrot do rysuj gdy nie nacisniety

Koniec:
	mov ax,4c01h
	int 21h				; zakonczy program

Fin:   	mov dx, offset komunikat1
        mov ah,09h                      ; wypis komunikatu
	int 21h	                        ; Brak myszy

	mov ax,4c01h                    ; koniec progr
	int 21h                         ;

code ends				; konczy segment kodu

stack_ segment stack 'stack'		; defin. stosu - sposob laczenia
	db	299h dup (?)		; rezerwacja pamieci
stack_ ends

end start				; konczy program zrodl, podaje skad
					; ma sie zaczynac wykonanie programu

