; Program G.asm (grafika w asemblerze)
; Wersja programu czysto asemblerowa

; Cwiczenia laboratoryjne z programowania w jezykach symbolicznych
; Cwiczenie 4      30.05.1998
; 

; PROCEDURY GRAFICZNE
; Wykorzystanie najprostszych procedur graficznych, by byly dostepne 
; w jezyku C 

; 1) Wersja asemblerowa

;    Program wprowadza karte grafiki w tryb graficzny 13h 
;    rysuje 2 linie poziome na szerokosc calego ekranu 
;    oczekuje na nacisniecie klawisza, przechodzi w tryb tekstowy 03h
;    i konczy dzialanie 


Dane SEGMENT                    ; tworzenie segmentu danych
	kolor dw 63             ; zadeklar. zmiennej kolor o rozm. slowa
                                ; i poczatk. wartosci 63 - nr koloru
	y dw 100                ; deklar. zmienn. y typu word o wartosci 100
                                ; wspolrzedna y na ekranie - odl. od gory
                                ; ekranu
Dane ENDS                       ; koniec segm. danych

ASSUME CS:CODE, DS:Dane         ; przypisanie segm. do rejestrow
                                ; rejestr CS wskazuje segm kodu (program)
                                ; DS wskazuje na segm. danych

CODE Segment                    ; deklaracja segm. kodu

Start:                          ; etykieta o nazwie Start, skad zaczyna sie
                                ; wykonyw. programu
	mov ax,Dane             ; laduj segm. Dane do ax
	mov ds,ax	        ; nastepnie ax do ds czyli Dane do ds

	mov ah,00h              ; wybor trybu pracy sterownika - nr funkcji
	mov al,13h              ; nr trybu 13h
                                ; tryb graf. 320x200, 256 kolor, MCGA
	int 10h		        ; wywolanie przerwania

	push kolor              ; wstaw na stos zawartosc zmiennej kolor
       	push y                  ; -"-                              y

	call _RysujPoz          ; wywolanie procedury _RysujPoz
                                ; rysowanie linii poziomej (y=100)
	add sp,4                ; calkow rozmiar parametr
                                ; dodanie 4 do rejestru wskazn. stosu
	; lub pop y  pop kolor - zdejmij ze stosu y oraz kolor
                               ; dluzej wykonywane niz add sp,4

	mov y,150	       ; wspolrzedna y teraz = 150
	mov kolor,100          ; kolor 100
	push kolor             ; wstaw na stos kolor (100)
	push y                 ; -"-           y     (150)
	call _RysujPoz         ; ponowne wywolanie procedury rysowaniw
                               ; linii poziomej (y=150, kolor=100)
	add sp,4	       ; zwiekszenie wskaznika SP o 4
                               ; zamiast pop y  pop kolor

	mov ah,08h	       ; funkcja 8 przerw 21
                               ;  czeka na znak z klawiat
	int 21h		       ; przerwania 21h

	; Wprowadzenie w tryb 3 - tekstowy
	mov ah,00h             ; nr funkcji
	mov al,03h             ; nr trybu
	int 10h		       ; wywolanie przerrwania - ustaw tekst. trybu

        ; Wyjscie do DOS
	mov ah,4ch 	       ; nr funkcji
	mov al,00h             ;
	int 21h		       ; wywolanie przerwania - wyjscie do dos


; Procedura rysowania linii poziomej na wysokosci y w kolorze kolor
_RysujPoz proc		; procedura rys linii poziomej
	push bp		; tworzenie ramki stosu
                        ; zapis zawart. BP (base pointer) na stosie
	mov bp,sp	; zapis Stack Pointer do BP
	mov ax,0a000h   ; zaladowanie poczatku segm. obrazu do AX
	mov es,ax       ; zaladowanie -"- do ES (rejestr segm. dodatk)
	mov bx,[bp+4]   ;  y
	mov ax,320      ; ilosc pikseli w poziomie
       	mul bx          ; BX*AX = y*320 - wynik mnozenia w AX
	mov bx,ax       ; AX -> BX {320*y}
	mov dx,[bp+6]   ; kolor
	mov cx,320      ; laduj 320 (ilosc pktow w poziomie) do licznika CX
petla:
	mov es:[bx],dx  ; laduj pod adres poczatku segm. obrazu 0a000h
                        ; offset bx - kolor
	inc bx          ; inkrementacja rejestru bazowego BX
	loop petla      ; powtorzenie sekwencji rozkazow jesli CX<>0
                        ; - skok do etykiety petla
	pop bp          ; zdejmij ze stosu BP - odtworzenie zawartosci BP
	ret             ; powrot z podprogramu
endp                    ; koniec procedury


CODE ENDS               ; koniec segmentu kodu
END start               ; koniec programu, wykonanie ma sie zaczac
                        ; od etykiety start


	