;zadanie 5 Michcal Mikláš TLK 5 Os:35794

ZAS    SEGMENT STACK  			;prikaz pre assembler (zaciatok zasobnikoveho segmentu)

	DW      1024 DUP(?)
	ZAS     ENDS   			;prikaz pre ukoncenie zasobnikoveho segmentu

DATA    SEGMENT   			;zaciatok datoveho segmentu

	
	INPUT db 'INPUT.TXT',0
	HANDLE1 DW ?
	HANDLE2 DW ?
	PR DB 100 DUP(?)
	OUTPUT DB 'OUTPUT.TXT',0

	POCET DB 1
	chyba1 	db 10, 13,'Chyba. Nepodarilo sa otvorit subor INPUT.TXT. (asi neexistuje)'		,10, 13,'$'
	vpohode	db 10, 13,'Zasifrovanie prebehlo vpohode :)'		,10, 13,'$'


DATA ENDS


vypis   MACRO t             		;zobraz - vypise text na obrazovku
        mov dx, offset t    		;vloz do registra DX posunutie retazca txt
        mov ah,09h            		;vloz do registra AH (spodna cast registra AX) cislo sluzby
        int 21h               		;prikaz na vypis na obrazovku
endm                          		;ukonci makro

CODE	SEGMENT        			; zaciatok segmentu instrukcii
assume cs:code,ss:zas, ds:data


clrscr:
	mov ax, 3h  			; sluzba VIDEO BIOSu (mazanie obrazovky)
	int 10h
	ret

zasifruj: 
	mov al,ds:[bx]  		;nacitaj znak z pola pr
	add al,15                       ;prpipocitaj konstantu 15
	add al,dl   			;al+dl takze kazdy znak bude mat k sebe pripocitanu konstantu v zavislosti od pozicie (hodnota poctu znakou do konca odznaku co sifrujeme )
	mov ds:[bx],al		  	;uloz znak na povodne miesto
	inc bx				;posunie sa na dalsi znak
	dec dl 				;zniz pocet znakov o 1

	cmp dl,0h   			;ak je pocet znakov 0 tak chod na vytvorenie noveho suboru
	jz vytvor

	jmp zasifruj   			;ak pocet znakov nie je 0, tak pokracuj v nacitani
	ret







Start:
	
	mov ax,seg data
	mov ds,ax

	call clrscr			;procedura na vymazanie obrazovky

;---------------------------------------------- otvorenie suboru INPUT ------------------------------

	mov ah,3DH 			;sluzba BIOSu na otvorenie suboru
	xor al,al   			;open mode, 0 - read only atributa
	mov dx,offset INPUT		;nastavenie subor, ktory sa bude otvrat
	int 21h
	jnc pokracuj   			;ak nenastala chyba pokracuj v citani
	jmp koniec1			;ak nastala chyba skoc na koniec1
	
pokracuj:  
	mov handle1,ax  		;uloz handle otvoreneho (citaneho) suboru
	xor cx,cx  			;vynuluj cx, kvoli citaniu potrebujeme vynnulovat


;---------------------------------------------- citanie zo suboru INPUT ------------------------------

 
	mov ah, 3FH   			;sluzba BIOSu na citanie zo suboru
	mov bx, handle1  		;nacitaj handle suboru, z ktoreho chceme citat

	mov cl,100 			;pocet znakov, ktore chceme citat Ak je ax=0, tak si na konci suboru
	mov dx,offset pr  		;miesto v pamati, kam chceme citat
	int 21h

	mov pocet,al   			;uloz pocet nacitanych znakov

	mov dl,pocet 			;uloz pocet nacitanych znakov
	mov bx,offset pr 		;nacitaj si zaciatok pola, kde mas ulozene znaky
	
	call zasifruj   		;zavolaj si zasifrovanie


;---------------------------------------------- vytvorenie suboru OUTPUT ------------------------------


vytvor:
	mov ah,3ch   			;sluzba BIOSu na vytvorenie suboru
	mov cx,0h   			;atribut pre vytvorenie 0-normal
	mov dx,offset OUTPUT  		;nazov suboru
	int 21h
	mov HANDLE2,ax   		;handle suboru sa ulozi


;---------------------------------------------- zapis do suboru OUTPUT ------------------------------

	xor cx,cx   			;vynuluje sa cx
	mov cl,pocet   			;pocet znakov, ktore sa maju zapisat
	mov ah,40h   			;sluzba BIOSu na zapis
	mov bx,HANDLE2   		;handle suboru do ktoreho zapisat


	mov dx,offset pr  		;adresa odkial zapisat
	int 21h

;---------------------------------------------- zatvorenie citaneho suboru INPUT ------------------------------	

	mov ah,3eh   			;sluzba BIOSu na zatvorenie suboru
	mov BX,HANDLE1   		;handle suboru, ktory chcem zatvorit
	int 21H

;---------------------------------------------- zatvorenie noveho suboru OUTPUT ------------------------------

	mov AH,3EH   			;sluzba BIOSu na zatvorenie suboru
	mov BX,HANDLE2   		;handle suboru, ktory chcem zatvorit
	int 21H

koniec: 
	vypis vpohode
	mov ax,4c00h         		;koniec normalny
	int 21h	


koniec1: 
	vypis chyba1
	mov ax,4c00h         		;koniec ze sa nenasiel subor
	int 21h

CODE ENDS
END START   				;program bude spusteny od navestia start







;Program bol navrhnuty pod systemom Windows Vista. Skompilovany s tasm 32 a tlink v prikazovom riadku,
;Program nacita obsah suboru input.TXT, vytvori subor OUTPUT.TXT kde zasifruje obsah vstupneho suboru.
;Na nacitanie suboru INPUT.TXT bola pouzita BIOS sluzba 3Dh, na citanie z tohto suboru bola pouzita sluzba 3FH, na vytvorenie noveho suboru sluzba 3CH a na zapis sluzba 40H. Dalsi ich popis aj vstupne a vystupne parametre sa opisane v ng.exe
;Na sifrovanie som pouzil proceduru zasifruj, ktora vyberie kazdy znak z pola, kde je nacitany subor a ku kazdemu znakju pripocita konstantu 15 a pocet zostavajucich znakou od sifrowaneho zmnaku do konca subora input. 


