	.model small		;kozeli eljaras hivasok hasznalata (egy kodszegmens)
	.stack				;szukseg lesz a veremre
	.code				;kodszegmens. Innentol jon a program kodja
	;konstansok felvetele
	cr		= 13		;carrige return (kocsi vissza)
	lf		= 10		;line feed (új sor)
	bckspc	= 8			;backspace karakter

exit macro				;Program megszakítasa. Ez mindig kell a program vegen
	mov ah, 04ch		;hexa 4C az AH regiszterben utasit a kilepesre
	int 21h				;Megszakitas. dos funkciok hivasa
endm

clrscr macro			;DOS kepernyo torlese
	push ax				;ax mentese
	mov ax, 3			;3-as bekerul ah-ba. Utasitas keperyno torlesere
	int 10h				;hexa 10-es megszakitas. Kepernyo driver hivasara
	pop ax
endm

write_char macro chr	;egy karakter kiirasa
	push ax				;regiszterek mentese
	push dx

	mov dl, chr			;dl-be keruljon a karakter 
	mov ah, 2			;2-es bekerul ah-ba. Utasitas karakter kiirasara
	int 21h				;megszakitas hivas. DOS funkciok eleresere

	pop dx				;regiszterek visszatoltese
	pop ax
endm

linebreak macro			;sortores
	write_char cr		;kocsivissza karakter
	write_char lf		;uj sor karakter
endm

read_char proc			;egy karakter beolvasasa
	push ax				;ax regiszter mentese
	
	mov ah, 1			;karakter bekeres kodja
	int 21h				;hexa 21 -es megszakitas DOS-funkciok hivasahoz
						;A karakter ekkor AL regiszterbe kerül
	
	mov dl, al			;A karakter-t a DL regiszterbe tesszuk

	pop ax				;ax visszatoltese
	ret					;visszateres subrutinbol
read_char endp

readw proc
	push dx				;regiszterek tartalmanak elmentese
	push ax
	push cx

	xor cx, cx 			;szamlalo register torlese
  readw_r_start:		;karakterek olvasasanak kezdete
	call read_char		;egy karakter beolvasasa. Eredmeny a dl regiszterbe kerul

	cmp dl, cr			;Ha enter volt a karakter
	je readw_r_end 		;akkor fejezze be az olvasast
	push dx				;egyebkent karakter mentese verembe
	inc cx				;szamlalo register novelese (A loop ciklusvaltozoja)
	cmp dl, bckspc		;ha nem backspace-t nyomtuk meg
	jne readw_r_start	;akkor olvasas ciklus folytatasa
	write_char ' '		;egyebkent az elozo karakter torlese a kepernyon
	write_char bckspc	;majd visszapozicionalas a torolt karakter helyere
	pop dx				;backspace kivetele a verembol
	pop dx				;torolt karakter kivetele a verembol
	dec cx				;ciklusvaltozo csokentese kettovel
	dec cx

	jmp readw_r_start	;ciklus vege. Ha eddig eljut, kezdi elolrol

  readw_r_end:
	linebreak			;sortores a beolvasas utan
	
	cmp cx, 0			;Ha nincs megjelenitendo karakter
	je readw_end		;akkor ugorjon az eljaras vegere. Kuondben a ciklusban
						;cx 255 lesz dekrementalas utan, es kiir 255 karaktert
	
	mov ax, cx			;cx -et elmentjuk ax-be, mert 
	
  readw_spc_start:		;space-ekkel hely előkészitese a szovegnek 
	write_char ' '
	loop readw_spc_start	
	
	mov cx, ax			;cx most nulla, ezert ujra vissza kell
						;adni neki a string hosszat
	
  readw_w_start:		;szoveg kiirasa visszafele
	write_char bckspc	;ugras a kovetkezo karakterre a szoveg vegetol szamitva
	pop dx				;verembol a karakter kivetele
	write_char dl		;majd kiiratasa
	write_char bckspc	;ujra ra kell allni a kiirt karakterre
	loop readw_w_start	;ciklus vege
	
  readw_end:
	
	pop cx				;regiszterek visszaallitasa a verembol
	pop ax
	pop dx
	
	ret					;kilepes a subrutinbol
readw endp

main proc				;foprogram kezdete
	clrscr				;keperyno torlese
	call readw			;karakterek beolvasasa. Enter utan kiirasa. 
						;kozben vissza lehet torolni backspace -el.
	exit				;kilepes a programbol
main endp


end main				;A teljes program vege. Meg kell adni, hogy melyik 
						;eljaras lesz a foprogram
