; wczytywanie i wyswietlanie tekstu wielkimi literami
; (inne znaki sie nie zmieniaja)
.686
.model flat
extern _ExitProcess@4 : PROC
extern __write : PROC ; (dwa znaki podkreslenia)
extern __read : PROC ; (dwa znaki podkreslenia)
extrn _MessageBoxA@16 : near
extrn _MessageBoxW@16 : near
public _main

.data
tekst_pocz		db 10, 'Prosze napisac jakis tekst '
				db 'i nacisnac Enter', 10
koniec_t		db ?
magazyn			db 80 dup (?)
nowa_linia		db 10
liczba_znakow	dd ?
;tytul			db 'Wynik',0

.code
_main:

; wyswietlenie tekstu informacyjnego

; liczba znaków tekstu
	mov ecx,(OFFSET koniec_t) - (OFFSET tekst_pocz)
	push ecx
	
	push OFFSET tekst_pocz							; adres tekstu
	push 1											; nr urzadzenia (tu: ekran - nr 1)
	call __write									; wyswietlenie tekstu poczatkowego
	
	add esp, 12 ; usuniecie parametrów ze stosu

; czytanie wiersza z klawiatury
	push 80											; maksymalna liczba znaków
	push OFFSET magazyn
	push 0											; nr urzadzenia (tu: klawiatura - nr 0)
	call __read										; czytanie znaków z klawiatury
	add esp, 12										; usuniecie parametrów ze stosu

; kody ASCII napisanego tekstu zostały wprowadzone
; do obszaru 'magazyn'

; funkcja read wpisuje do rejestru EAX liczbe
; wprowadzonych znaków
	
	mov liczba_znakow, eax

; rejestr ECX pełni role licznika obiegów petli
		mov ecx, eax
		mov ebx, 0										; indeks poczatkowy
ptl:	mov dl, magazyn[ebx]							; pobranie kolejnego znaku
									; pobranie kolejnego znaku

		cmp dl, 0A5H									;ą
		je a
		cmp dl, 86H										;ć
		je ci
		cmp dl, 0A9H									;ę
		je e
		cmp dl, 88H										;ł
		je l
		cmp dl, 0E4H									;ń
		je n
		cmp dl, 0A2H									;ó
		je o
		cmp dl, 98H										;ś
		je s
		cmp dl, 0ABH									;ź
		je z1
		cmp dl, 0BEH									;ż
		je z2

		cmp dl, 20H										;spacja
		je spacja

		cmp dl, 5CH										;nowa linia
		je linia

		cmp dl, 'a'
		jb dalej										; skok, gdy znak nie wymaga zamiany
		cmp dl, 'z'
		ja dalej										; skok, gdy znak nie wymaga zamiany
		sub dl, 20H										; zamiana na wielkie litery
		
		jmp zmiana

		spacja: mov dl, 2EH
		jmp zmiana

		linia: 
			mov dh, magazyn[ebx+1]
			cmp dh, 6EH
			je zmiana2
			jmp zmiana


		zmiana2:
		mov dl, 0AH
		jmp zmiana

		a: mov dl, 0A4H
		jmp zmiana
		ci: mov dl, 8FH
		jmp zmiana
		e: mov dl, 0A8H
		jmp zmiana
		l: mov dl, 9DH
		jmp zmiana
		n: mov dl, 0E3H
		jmp zmiana
		o: mov dl, 0E0H
		jmp zmiana
		s: mov dl, 97H
		jmp zmiana
		z1: mov dl, 8DH
		jmp zmiana
		z2: mov dl, 0BDH
		jmp zmiana
zmiana:
; odesłanie znaku do pamieci
			mov magazyn[ebx], dl
dalej:		inc ebx										; inkrementacja indeksu
			cmp dl, 0AH
			jnz dalej_2
			inc ebx
dalej_2:	dec ecx
			jnz ptl										; sterowanie petla

; wyswietlenie przekształconego tekstu
		push liczba_znakow
		push OFFSET magazyn
		push 1
		call __write					; wyswietlenie przekształconego tekstu
		add esp, 12						; usuniecie parametrów ze stosu
		push 0
		call _ExitProcess@4				; zakonczenie programu
END