; Autor reseni:	roman necas xnecasr00 

; Projekt 2 - INP 2024
; Vigenerova sifra na architekture MIPS64

; DATA SEGMENT
                .data
msg:            .asciiz "romannecas" ; sem doplnte vase "jmenoprijmeni"
cipher:         .space  31 ; misto pro zapis zasifrovaneho textu
; zde si muzete nadefinovat vlastni promenne ci konstanty,
; napr. hodnoty posuvu pro jednotlive znaky sifrovacho klice

key:			.asciiz	"nec"

params_sys5:    .space 	8 ; misto pro ulozeni adresy pocatku
                          ; retezce pro vypis pomoci syscall 5
                          ; (viz nize "funkce" print_string)

; CODE SEGMENT
                .text

main:           ; ZDE NAHRATE KOD VASIM RESENIM
               	daddi	r4, r0, msg			;nacitanie msg do r4
				daddi 	r5, r0, cipher		;nacitanie adr. cipher do r5
				daddi 	r6, r0, key			;adr. kluca do r6
				daddi 	r7, r0, 1	;init priz. smeru(1 vpred, -1 vzad)
encrpt_loop:
				lb 		r8, 0(r4)		;nacitanie znaku z msg
				beqz	r8, end_encrpt	; ak 0, tak konec siforvania
										
				lb		r9, 0(r6)		;nacitanie znaku z key
				beqz	r9, reset_key	;ak 0, reset an zacaitok key
				j		continue_encrpt
reset_key:
				daddi	r6, r0, key		;reset adresy kluca na zaciatok
				lb 		r9, 0(r6)		;nacitanie prveho kluca
continue_encrpt:
				daddi   r9, r9, -96      ; prevod znaku kluce na cislo (a=0, b=1, ...)
                mult    r9, r7           ; smeru posuvu
                mflo    r9               ; ziskani vysledku nasobeni
				dadd    r10, r8, r9      ; posuvu na znak zpravy

                slti    r11, r10, 97     ; kontrola, ci je vysledek mensi nez 'a'
                bnez    r11, wrap_forward

                slti    r11, r10, 123    ; kontrola, ci je vysl. vetsi nez 'z'
                beqz    r11, wrap_backward

                j       store_char

wrap_forward:
                daddi   r10, r10, 26     ; wrap zpet do rozsahu
                j       store_char

wrap_backward:
                daddi   r10, r10, -26    ; wrap zpet do rozsahu

store_char:
                sb      r10, 0(r5)       ; ulozeni zasifrovaneho znaku

                daddi   r4, r4, 1        ; posun na dalsi znak zpravy
                daddi   r5, r5, 1        ; posun na dalsiu poziciu v encrpt zprave
                daddi   r6, r6, 1        ; posun na dalsi znak kluca
                dsub    r7, r0, r7       ; zmena smeru z 1 na -1 nebo z -1 na 1
				j       encrpt_loop

end_encrpt:
				sb	 	r0, 0(r5)		;ukonc, 0 do cipher
				daddi   r4, r0, cipher		;priprava pre vypis encprt
				jal 	print_string	;vypis encrpt textu     


; NASLEDUJICI KOD NEMODIFIKUJTE!

                syscall 0   ; halt

print_string:   ; adresa retezce se ocekava v r4
                sw      r4, params_sys5(r0)
                daddi   r14, r0, params_sys5    ; adr pro syscall 5 musi do r14
                syscall 5   ; systemova procedura - vypis retezce na terminal
                jr      r31 ; return - r31 je urcen na return address
