		org	100h
		segment	.text

		xor	SI, SI		; v SI se bude tvorit císlo ktere budu vypisovat
begin:		mov	AH, 8
		int	21h		; klavesa -> AL
		cmp	AL, 27		
		jz	finish		; ESC -> konec
		cmp	AL, '9'		
		ja	vyp_znak	; AL>'9' -> neni cislo -> skok na vyp_znak
		cmp	AL, '0'		
		jb	vyp_znak	; AL<'0' -> neni cislo -> skok na vyp_znak

		mov	BL, 1		; BX je switch jestli uzivatel zadal pred aktualnim znakem cislo
		push	AX		; ulozime ASCII cisla

		mov	AH, 00h
		sub	AL, '0'
		push	AX		; ulozim vlastni cislo 0..9

		mov	AX, SI
		shl	AX, 3	
		shl	SI, 1	
		add	AX, SI		; AX <- SI * 10

		pop	SI	
		add	SI, AX		; SI <- AX + cislo z klavesnice
		pop	AX		; nacte ASCII cisla pro vypis
		jmp	vyp_AL		

vyp_znak:	cmp	BX, 0		; vypisovala se sekvence cislic?
		jnz	vypisSI		; ano - vypis cislo z registru SI v hexa

vyp_AL:		int	29h		; vypis co je v AL
		jmp	begin

vypisSI:	push	AX		; ulozim ASCII znaku, ktery je po cislu
		mov	AH, 9		
		mov 	DX, Zac		
		int	21h		; ' ('

;VYPIS SI V HEXA
;---------------

		mov	CX, 4		; budu cyclovat po 4
next:		mov	AX, SI
		call	rotaceAX	; rotace AX o CX se zachovanim CX
		shr	AX, 12		; vypis od nejvyssiho radu
		cmp	AL, 10		; 
		jb	num1to9		; AL < 10? - staci pricist k cislici '0'
		add	AL, 7		; ne  - musim pricist jeste 7 znaku mezi '9' a 'A'

num1to9:	add	AL, '0'
		int	29h		; vypise znak v AL
		loop	next		; mame 4 hexa cifry

		mov	AH, 9	
		mov	DX, Kon		
		int	21h		; 'h) '

		xor	BX, BX		; vynuluj switch
		xor	SI, SI		; vynuluj nove cislo
		pop	AX		; nacti ASCII znaku po cislu
		jmp	vyp_AL

finish:		ret

rotaceAX:	push	CX		; udelam rol AX, (16-4*CX)
		shl	CX, 2		; CX <- CX * 4
		neg	CX	
		add	CX, 16		; CX <- 16 - CX
		rol	AX, CL		; rotovani o CL
		pop	CX		; puvodni CX pred rol
		ret


Zac	db	' ($'
Kon	db	'h) $'
