; SOJ - zadanie c.2
; Martin Cernicka, kruzok 16
; vypise, ci je zadane cislo prvocislo; ak ano, vypise delitele a zisti, ci
;  je cislo ich suctom
; sprievodna hudba - Ludwig van Beethoven ;-)

MODEL SMALL
JUMPS

CR	equ	0Ah, 0Dh

DATA	SEGMENT
Prompt	DB	"Zadajte hexadecimalne cislo (max 16 bit): $"
Riadok	DB	CR, "$"
Ano	DB	"Cislo ma nejake delitele:", CR, "$"
Nie	DB	"To cislo nema jediny rozumny delitel.", CR, "$"
Pretiekol DB	"Sucet delitelov pretiekol, nemozno rozhodnut, ci je cislo dokonale.", CR, "$"
Dokon	DB	"Cislo je dokonale.", CR, "$"
Nedok	DB	"Cislo nie je dokonale.", CR, "$"
Over	DB	0
Vstup	DB	5, 0, 6 DUP(?)
Cislo	DB	4 DUP (0)
	DB	CR, "$"
Pocet	DB	0
Sucet	DW	0
Zadane	DW	?
Nacitane DW	?
Delitele DB	32767 DUP (?)
DATA	ENDS

CODE	SEGMENT
ASSUME	CS:CODE, DS:DATA

; skonvertuje cislo dlhe CL bajtov z DS:SI na text ES:DI
Hex2Str	proc near
	xor	CH, CH
	add	SI, CX
	dec	SI
HexLoop:std
	lodsb
	mov	AH, AL
	shr	AL, 1
	shr	AL, 1
	shr	AL, 1
	shr	AL, 1
	add	AL, 90h
	daa
	adc	AL, 40h
	daa
	cld
	stosb
	mov	AL, AH
	and	AL, 0Fh
	add	AL, 90h
	daa
	adc	AL, 40h
	daa
	stosb
	loop	HexLoop
	ret
Hex2Str	ENDP

; skonvertuje retazec (hexa) DS:SI na cislo do BX
Str2Hex	proc	near
	push	AX
	xor	BX, BX

	mov	CX, 4
	add	SI, CX
	dec	SI
	xchg    CH, CL
	std

next_ch:xor	AH, AH
	lodsb
	cmp	AL, 'A'
	jl	not_a

	cmp	AL, 'a'
	jge	odcitaj
	or	AL, 20h
odcitaj:sub	AL, 57h
	jmp	short contin

not_a:	sub	AL, 30h
contin:	rol	AX, CL
	add	CL, 4
	add	BX, AX

	dec	CH
	cmp	CH, 0
	jne	next_ch
	pop	AX
	ret
Str2Hex	endp

start:	mov	AX, seg DATA
	mov	DS, AX
	mov	ES, AX

	mov	AH, 9
	push	AX
	mov	DX, offset Prompt
	int	21h
	mov	AH, 0Ah			; cislo musi byt dlhe 4 bajty!
	mov	DX, offset Vstup
	int	21h
	pop	AX
	mov	DX, offset Riadok
	int	21h

	mov	SI, offset Vstup+2	 ; konverzia na cislo
	call	Str2Hex
	mov	[Zadane], BX

	mov	DI, offset Delitele
	cld
	mov	CX, BX			; pozistujeme delitele
	dec	CX
zisti:	cmp	CX, 1
	jle	zistene
	mov	AX, BX
	xor	DX, DX
	div	CX
	cmp	DX, 0
	je	uloz
	loop	zisti

uloz:	stosw
	inc	[Pocet]
	cmp	[Over], 0
	jne	dalej
	add	[Sucet], CX
	jnc	dalej		 	; ak sucet pretiekol, je nezmyselny
	mov	[Over], 1
dalej:	loop	zisti

zistene:mov	CL, [Pocet]
	mov	CH, 0
	cmp	CL, 0
	jne	napis

	mov	AH, 9
	mov	DX, offset Nie
	int	21h
	jmp	koniec


napis:	mov	AH, 9
	mov	DX, offset Ano
	int	21h

	cmp	[Over], 0
	je	nepretiekol
	mov	DX, offset Pretiekol
	jmp	pokrac
nepretiekol:
	mov	AX, [Zadane]
	cmp	[Sucet], AX
	je	dokonale
	mov	DX, offset Nedok
	jmp	pokrac
dokonale:mov	DX, offset Dokon
pokrac:	mov	AH, 9
	int	21h

	mov	SI, offset Delitele	 ; vypis delitelov
vypis:	push	CX
	mov	CL, 2
	mov	DI, offset Cislo
	push	SI
	call	Hex2Str
	pop	SI
	add	SI, 2
	mov	AH, 9
	mov	DX, offset Cislo
	int	21h
	pop	CX
	loop	vypis

koniec:	mov	AX, 4C00h
	int	21h

CODE	ENDS
END	start

