;ZADANIE c.4
;Vytvorte program, ktory:
;a) pomocou direktivy  STRUC vytvori  tabulku 4x5  (4 riadky a 5 stlpcov)
;b) naplni tabulku hodnotami mocnin tak, ze v prvom riadku sa bude nachadzat prvych 5 
;   mocnin cisla 2, v druhom riadku cisla 8, v tretom cisla 10 a vo stvrtom cisla 16
;c) spristupni a vypise lubovolnu polozku tabulky.
;Termin odovzdania: na cviceni do 12. tyzdna semestra
;Hodnotenie: maximalne 4 body
;
;Vypracoval: STASAK Ivan
;Kruzok:     B 09
;Datum:      5.12.1999

zas segment stack 'stack'
	dw 20 dup (0)
zas ends

dat segment

mocniny	struc                       ;definicia struktury
moc	dw 10 dup(0)
mocniny	ends

tabulka	mocniny	4 dup( )            ;definicia tabulky

zaklad  dw 	2,8,10,16
text1	db      13,10,'Zadajte riadok (1 az 4): $'
text2	db	13,10,'Zadajte stlpec (1 az 5): $'
text3 	db	13,10,'Na danej pozicii sa nachadza prvok: $'
text4   db      13,10,'Program vypocita mocniny cisiel'
	db	13,10,13,10,'V kazdom riadku sa nachadzaju mocniny cisiel 2,8,10,16',13,10,'$'
text5   db      13,10,13,10,'Chcete pokracovat (a=ano, n=nie)',13,10,'$'
new_line   db	13,10 
dat ends

code segment 
	assume cs:code, ss:zas, ds:dat

;***************** PROCEDURA PRE VYPIS 8 BIT CISLA ******************
vypis8 proc                        ;procedura pre vypis desiatkoveho cisla
        xor cx,cx
        xor ax,ax                 ;vynulovanie registra cx
        mov dx,si
        xor dh,dh
s100:   cmp dx,100                 ; je dx >= 100 ?
        jb s10
        sub dx,100                 ;bude v cykle odcitavat od dx 10 az dovtedy kym dx<10
        inc al                    ;v al je zapisany pocet stoviek
        jmp s100
s10:    cmp dx,10                 ; je dx >= 100 ?
        jb s1
        sub dx,10                 ;bude v cykle odcitavat od dx 10 az dovtedy kym dx<10
        inc cl                    ;v cl je zapisany pocet desiatok
        jmp s10
s1:     mov bl,dl
        add al,30h
        mov ch,al
        add bl,30h                ;pripocitanim 30h k cislu ziskame jeho ASCII kod
        add cl,30h
        mov ah,2h                  ;funkcia pre vypis retazca
	cmp ch,30h
	jz nula100
        mov dl,ch                 ;vypis stoviek
        int 21h
nula100:mov dl,cl
        int 21h                  ;vypis desiatky
        mov dl,bl                 ;vypis jednotky
        int 21h
        ret
        endp

;******************* PROCEDURA PRE VYPIS 32 BIT CISLA ******************
vypis32  proc
	mov bx,10000                   ;dane cislo vydelim cislom 10000 cim ziskam ako vysledok
	div bx                         ;8 bitove cislo 
	mov si,ax
	push dx 
	call vypis8                    ;toto cislo vypisem pomocou proc na vypis cisla < 1000
	pop dx
	mov ax,dx
	mov bl,100                     ;zvysok vydelim cislom 100, vysledok je cislo < 1000
	div bl
	mov bl,al
	xor bh,bh
	mov si,bx
	push ax
	call vypis8                   ;vypis vysledku
	pop ax
	mov al,ah
	xor ah,ah
	mov si,ax
	call vypis8                   ;vypis zvysku po deleni
	ret 
	endp

;*********************** NAPLNENIE TABULKY ******
napl_tab  proc
	xor ax,ax                 ;vynulovanie registrov
	xor bx,bx
	xor cx,cx
	xor dx,dx
	xor si,si

skok2:	xor di,di
	mov cl,5                  ;do cl sa ulozi pocet stlpcov tabulky
	add di,si                 ;posunutie v tabulke
	mov ax,1                   

skok1:	mul zaklad[bx]            ;zakladom sa prenasobi register ax
	mov tabulka.moc[di],dx    ;najskor sa do tabulky ulozi hornych 8 bitov
	mov tabulka.moc[di+2],ax  ;a nasledne spodnych 8 bitov
	add di,4                  ;posunutie v tabulke o jeden prvok v riadku
	loop skok1                ;opakuje dovtedy kym cl nie je nula
	add bx,2                  
	add si,20                 ;pripocita 20 aby sa dostal na dalsi riadok tabulky
	cmp bx,8                  ;zistuje ci uz neboli pouzite vsetky zaklady
	jb skok2
	
	sub di,4                  ;ulozenie 5 mocniny cisla 16 do tabulky
	mov ax,4096
	mov bx,256
	mul bx
	mov tabulka.moc[di],dx    ;najskor sa do tabulky ulozi hornych 8 bitov
	mov tabulka.moc[di+2],ax  ;a nasledne spodnych 8 bitov	

	ret
	endp

;************* SPRISTUPNENIE HLADANEHO PRVKU  **********
hlad_prvok  proc
	xor cx,cx
	mov dx,offset text1
	mov ah,09h                  ;nacitanie cisla riadku
	int 21h
	mov ah,01h
	int 21h
	sub al,31h                  ;upravenie ASCII znaku na cislo
	mov cl,al
	push cx
	mov dx,offset text2         ;nacitanie cisla stlpca
	mov ah,09h
	int 21h
	mov ah,01h
	int 21h
	push ax
	mov dx,offset text3         ;vypis textu
	mov ah,09h
	int 21h
	pop ax cx
	sub al,31h
	xor ah,ah	
	mov dl,4                    ;vynasobenie cisla stlpca cislom 4 (4 byty)
	mul dl
	xchg al,cl                  ;vymena obsahov registra al a cl
	mov dl,20                    
	mul dl                      ;vynasobenie cisla riadku cislom 20 (20 bytov) 
	add ax,cx                   ;scitanie posunutia v riadku a stlpci  
	mov si,ax
	mov dx,tabulka.moc[si]      ;nacitanie prvku z tabulky z danym posunutim      
	mov ax,tabulka.moc[si+2]
	call vypis32                ;vypis cisla na obrazovku
	ret
	endp

;****************** TELO PROGRAMU ***************
start:  mov ax,seg dat  
	mov ds,ax
	
	mov dx,offset text4         ;vypis uvodneho textu
	mov ah,09h
	int 21h

	call napl_tab               ;proc pre vyplnenie tabulky
znova:	call hlad_prvok             ;proc pre vyhladanie prvku
	
	mov dx,offset text5         ;otazka ci sa este bude pokracovat
	mov ah,09h	
	int 21h
	mov ah,08h
	int 21h
	cmp al,'a'
	jz znova

	mov ah,4ch                  ;koniec programu
	int 21h
code    ends
end 	start	
	
;Zhodonotenie programu
;Program funguje podla zadaneho zadania. Tabulka je tvorena strukturou v ktorej polozkou je pole
;10 slov (sluzia pre ulozenie 5 stvorbytovych cisiel). Procedura sluziaca pre vypis 32 bitovych 
;cisiel je schopna spracovat najvacsie cislo o velkosti 9 999 999. Inak program pracuje bez
;bez nejakych dalsich viditelnych chyb. 
