; ********************************************************************
; Program MALDUZ.ASM 
; Zamienia male litery na duze i konczy sie nacisnieciem klawisza ESC
; w przypadku nacisniecia litery duzej lub innego znaku bez zmian
; ********************************************************************
; Cwicz1. K. R.

Assume	CS:code, ds:code	   	; dyrektywa
					; inform. dla asemblera,
					; ze CS i DS zawiera nr
					; segmentu kodu
					; odwolania do etykiet
					; z segm. kodu poprzez
					; rejestr segment CS,

					; program typu COM;
					; sklada sie z 1 segm. - kodu <=64KB

code	segment				; tworzenie segmentu kodu
	org 100h			; przesun poczatek o 100h bajtow
start:	jmp begin			; poczatek programu	

zacheta db 'Nacisnij klawisz', 0dh, 0ah	; deklar. lanc. znakow	
					; kazde pole ma bajt
	db '<ESC> konczy dzialanie', 0dh, 0ah, '$' ; 
					; powrot do nowej linii
					; $ konczy string dla DOS

begin:	mov	dx, offset zacheta 	; przeslij do dx  offset
					; zmiennej zacheta
	mov	ah, 09h			; funkcja DOS 09h - wyswietl
					; zawartosc lancucha na ekran
	int	21h			; wywolanie funkcji systemu DOS
					; (wyswietl zachete)

petla:	mov	ah, 08h			; funkcja DOS 08h, wczytaj znak
					; (w Al kod ASCII znaku)
	int 	21h			; wywolanie funkcji DOS
	cmp	al, 'a'			; CMP - compare
					; porownanie czy lewy argument - w al 
					; nie mniejszy niz a (nie litera)
	jl	bez_zm			; jump if less (do bez_zm)
					; skok wzgledny gdy mniejszy do bez_zm 	
					
	cmp	al, 'z'			; porownanie czy nie wiekszy niz z
	jg 	bez_zm			; skok wzgledny gdy wiekszy
					; (jump if greater)
	sub 	al, 20h			; subtract - odejmowanie
					; (lewy arg=lewy_arg-prawy_arg)
					; zamien na duza - odjecie 32 (20h)

bez_zm:	cmp 	al, 1bh			; porowan. rej. AL z kodem ESC (27d)
	jne	wyswietl		; jump if not equall - skok do wyswietl
	jmp	koniec			; jump - zwykly skok bezwar. do koniec

wyswietl: mov	dl, al			; przeslanie zawartosci al do dl
	mov	ah, 02h			; przeslanie zawartosci 02h do ah
					; funkcja DOS - wyswietl znak
	int 	21h			; skok do obslugi przerwania 
	jmp 	petla			; skok do petla

					; wyjscie z programu
koniec:	mov	al, 0			; kod powrotu 0
	mov	ah, 4ch			; funkcja DOS - zakoncz proces
	int	21h			; skok do obslugi przerwania 3
					; te 3 rozkazy koncza program

code ends				; konczy segment kodu

end start				; koniec programu z informacja
					; skad rozpoczac wykonanie
