;s tymto sa mi nechcelo babrat tak ako s prvym zadanim, takze je strohe,
;ale funkcne :) ak tam niekto chce mat aj dake frajeriny, nech sa ozve,
;za cokoladu aj vrazdim ;)
;btw, ocenil by som, keby ste zmenili aspon metodu kodovania na prachsprosty
;xor, ktory sa vyskytuje v 75% zdrojakoch :)
;enjoy ;)

;.==================================================================.
;|'================================================================'|
;||                                                                ||
;||                                  .::::.                        ||
;||                                .::::::::.                      ||
;||                                :::::::::::                     ||
;||                                ':::::::::::..                  ||
;||                                 :::::::::::::::'               ||
;||                                  ':::::::::::.                 ||
;||                                    .::::::::::::::'            ||
;||                                  .:::::::::::...               ||
;||                                 ::::::::::::::''               ||
;||                     .:::.       '::::::::''::::                ||
;||                   .::::::::.      ':::::'  '::::               ||
;||                  .::::':::::::.    :::::    '::::.             ||
;||                .:::::' ':::::::::. :::::      ':::.            ||
;||              .:::::'     ':::::::::.:::::       '::.           ||
;||            .::::''         '::::::::::::::       '::.          ||
;||           .::''              '::::::::::::         :::...      ||
;||        ..::::                  ':::::::::'        .:' ''''     ||
;||     ..''''':'                    ':::::.'                      ||
;|'================================================================'|
;|  Zadanie c. 2:                                                   |
;|  Napiste program, ktory precita dany subor, zasifruje            |
;|  jeho obsah a ulozi ho do ineho suboru. Spravnost operacii       |
;|  so suborom potvrdte  prislusnym vystupnym textom na obrazovku   |
;|  Meno: Lubomir Salaj                                             |
;|  Termin odovzdania: 20.04.2007                                   |
;|  Rocnik: 2., akademicky rok: 2006/2007                           |
;'=====overclocker=============================l33t since '84======='


;---------------------------- MAKRO NA VYPIS ------------------------
VYPIS  	      MACRO v                           
	            mov ah,9
	            mov dx,offset v                
	            int 21h
	            endm
;--------------------------------------------------------------------
DATA          SEGMENT
otvor         DB  'vstup.txt',0 ;vstupny subor
kod           DB  'kod.txt',0   ;vystupny subor
vstup         DB  100 DUP('$')  ;nacitany vstupny retazec
sifra         DB  100 DUP('$')  ;zakodovnay retazec
otvorhandle   DW  0     ;ulozi handle vstupneho suboru
kodhandle     DW  0     ;ulozi handle zakodovaneho suboru 
otvoreny      DB  0     ;je subor otvoreny?
zakodovane    DB  0     ;mame zakodovane?
pocetznakov   DB  0     ;pocitadlo nacitanych znakov zo vstupneho suboru
;dalej su uz len vypisy...
MENU0         DB  10,13,'Vyberte jednu z moznosti:$'
MENU1         DB  10,13,'1 - Nacita subor$'
MENU2         DB  10,13,'2 - Zasifruje nacitane data$'
MENU3         DB  10,13,'3 - Zapise zakodovane data do suboru$'
MENU4         DB  10,13,'4 - Skonci program',10,13,10,13,'$'
RIADOK        DB  10,13,'$'
CHYBA00       DB  'Program skonci!$'
CHYBA01       DB  'Subor sa neda otvorit na nacitanie!$'
CHYBA02       DB  'Zo subora sa neda citat!$'
CHYBA04       DB  'V subore nie je ziaden znak! Program nema co sifrovat a zapisovat...$'
CHYBA06       DB  'Subor sa neda vytvorit!$'
CHYBA08       DB  'Do suboru sa neda zapisovat!$'
CHYBA10       DB  'Nepodarilo sa subor uspesne zavriet :-/$'
KONTROLA      DB  'Sprava po zasifrovani: $'
WADDAFAK      DB  'Niet co zapisat, nechavam prazdny subor!$'
OK01          DB  'Subor bol uspesne otvoreny...',10,13,'$'
VYTVORENIE    DB  'Subor bol uspesne vytvoreny...',10,13,'$'
ZAPISANE      DB  'Zasifrovany retazec bol uspesne zapisany do suboru',10,13,'$'
RETAZEC       DB  'Nacitany retazec: $'
MATOZMYSEL    DB  'Co mam sifrovat, ked sa nic nenacitalo?! o.O$'
;ZATVORILOK    DB  'je to v suchu$'  ; <- len na testovacie ucely ;)
DATA          ENDS
;------------------------------------------------------------------------
CODE          SEGMENT
ASSUME        CS:code, DS:data
;---------------------------- VYPIS RETAZCA -------------------------
vypisret      proc                    ;procedura na vypis retazca
              mov ah,2                ;funkcia na vypis 1 znaku
              mov bx, offset vstup    ;odkaz na zaciatok retazca
              xor cx,cx               ;pripravime si CX register
              mov cl, pocetznakov     ;do CL dame pocet prvkov retazca
 zasvyp:      mov dl, [bx]            ;vypisovanie retazca po
              inc bx                  ;po znakoch, aby sa osetril
              int 21h                 ;$ v retazci
              loop zasvyp             ;opakuj az kym to CL neomrzi :) (CL=0)
              ret
              endp
;----------------------------------------------------------------------
start:        ;a tu to vsetko zacina ;)
              mov ax,seg data
	            mov ds,ax
menu:
              vypis menu0               ;vypisy menu
              vypis menu1
              vypis menu2
              vypis menu3
              vypis menu4
              ;vypis riadok
vyber:        
              mov AH, 08H               ;nacitanie znaku, pre vyber z menu
              int 21H
              cmp AL, '1'              
              je  M1
              cmp AL, '2'             
              je  ME2 
              cmp AL, '3' 
              je  ME3
              cmp AL, '4'             
              je  FINITO
              jmp VYBER
ME2:          jmp M2                  ;kvoli podmienenym skokom mam taketo srandy
ME3:          jmp M3
FINITO:       jmp KONIEC
;-------------------------------------------------------------------------           
M1:
              mov pocetznakov, 0      ;vynulujem pocitadlo (ak som uz nacitaval)
              mov ah,3dh              ;fcia na otvorenie suboru
	            mov al,0                ;000-read-only, 001-write-only, 010-read/write
	            mov dx,offset otvor     ;otvori "vstup.txt"
	            int 21h
	            jc  nedasaotvorit       ;ak je carry flag, nastala chyba
              mov otvoreny, 1         ;subor sme uspesne otvorili
              mov dx,offset vstup     ;budeme ukladat do retazca VSTUP
              mov cx,1                ;po jednom znaku
	            mov otvorhandle,ax      ;ulozime handler do premennej
	            mov bx, otvorhandle     ;3fh chce mat handle v BX, tak mu vyhovieme
citaj:	
              mov ah,3fh              ; citaj subor
	            int 21h
              jc  nedasacitat         ;carry = chyba
              inc dx	                ;dalsi znak
       	      inc pocetznakov         ;kolko znakov sme skutocne nacitali?
              cmp ax,0                ;bol EOF?
	            jne citaj		            ;ak nie, citaj dalsi znak zo suboru
              dec pocetznakov         ;lebo enter robi sarapatu :)
              vypis OK01              
              vypis riadok
	            cmp pocetznakov, 0       ;nacitali sme vobec nieco?
              je  CHYBA03              ;ak nie, tak smola...
              vypis retazec
              call vypisret
              vypis riadok
              
              mov BX, otvorhandle      ;do bx dame handle otvoreneho suboru
              mov ah,3eh                    ;zatvori subor
              int 21h
              jnc dalsisub              ;ak je to v pohode, ideme dalej
              vypis CHYBA10             ;ak nie, tak sa len vypise hlaska
dalsisub:     ;vypis zatvorilok         ;a ide sa i tak dalej :)  
              jmp MENU
nedasaotvorit:                          ;dalej su len chybove hlasky
	            vypis CHYBA01
	            vypis riadok
	            vypis CHYBA00
	            vypis riadok
              jmp KONIEC
nedasacitat:
              vypis CHYBA02
              vypis riadok
              vypis CHYBA00
              vypis riadok
              jmp KONIEC
chyba03: 
              vypis CHYBA04
              vypis riadok
              vypis CHYBA00
              vypis riadok
              jmp KONIEC
;-------------------------------------------------------
M2:                                 ;sifrovanie
              cmp otvoreny, 0       ;podarilo sa nam subor otvorit?
              jz  nacopracovat
              cmp pocetznakov, 0    ;podarilo sa nam nieco nacitat?
              jz  nacopracovat      ;(aj zbytocne, lebo ak nie, tak sa ukonci program)
              mov zakodovane,1      ;tak ideme kodovat
              mov si, offset vstup  ;adresu vstupneho retazca dam do si
	            mov di, offset sifra  ;a sifrovaneho do di
	            xor cx,cx             ;cx potrebujem, vynulujem ho
              mov cl, 1             ;pocitam, kolko som uz zasifroval znakov
              ;mov ch, pocetznakov             
sifruj:       mov al, byte ptr[si]  ;do al hodime znaky z "vstup"u
              cmp al, 64            ;porovname ascii hodnotu
              jg viac               ;ak je v hornej polovici tabulky, skoci na viac
              add al, 128           ;ak je v spodnej polovici, pricita 128
viac:         sub al, 64            ;a od vsetkych odcita 64
              mov byte ptr[di],al   ;takto zasifrovany znak zapisem do di
              inc cl                ;a zvysim pocitadlo
	            inc di                ;aj adresy retazcov
	            inc si
	            cmp cl, pocetznakov   ;az kym nemam vsetky znaky zasifrovane
	            jbe sifruj                        
              vypis kontrola         ;vypisem si sifru, ci to nezbabral :)
              mov ah,2                ;funkcia na vypis 1 znaku
              mov bx, offset sifra    ;odkaz na zaciatok retazca
              xor cx,cx               ;pripravime si CX register
              mov cl, pocetznakov     ;do CL dame pocet prvkov retazca
zasvyp2:      mov dl, [bx]            ;vypisovanie retazca po
              inc bx                  ;po znakoch, aby sa osetril
              int 21h                 ;$ v retazci
              loop zasvyp2
              vypis riadok
              jmp menu
              
nacopracovat:                         ;chybova hlaska
              vypis matozmysel
              vypis riadok
              vypis CHYBA00
              jmp koniec
;------------------- ZAPIS DO SUBORU ------------------------------------------
M3:
              cmp pocetznakov,0    ;mam vobec co zapisovat?
              jz  nietcopisat
              mov ah, 3ch         ;fcia na vytvorenie suboru
              mov dx, offset kod  ;vytvor subor schovany za "kod"om
              mov cx, 0           ;0=normal, 1=read-only, 2=hidden, 4=system
              int 21h
              jc  CHYBA05
              mov kodhandle,ax    ;schovam si handle suboru
              vypis vytvorenie
              mov bx,kodhandle
              xor cx, cx
              mov cl,pocetznakov
              mov ah,40h          ;funkcia na zapis do suboru
              mov dx,offset sifra ; zapis do suboru
              int 21h   
              jc  CHYBA07
              vypis zapisane
              mov BX, kodhandle
              mov ah,3eh                    ;zatvori subor
              int 21h
              jnc mozebytkoniec
              vypis CHYBA10
mozebytkoniec: ;vypis zatvorilok 
              jmp MENU
nietcopisat:                          ;chybove hlasky
              vypis waddafak
              jmp koniec
chyba05:      
              vypis CHYBA06
              vypis riadok
              vypis CHYBA00
              jmp koniec
chyba07:
              vypis CHYBA08
              vypis riadok
              vypis CHYBA00
              jmp koniec
;-----------------------------------------------------------------------------             
KONIEC:
              mov ax,4c00h
	            int 21h
	            ends
	            end start



;Zaver:
;Program funguje vramci zadanych specifikacii. Napriek tomu, zo zadania je
;postupnost krokov zjavna, i tak som zvolil menu, pretoze dava uzivatelovi
;aspon pocit moznosti slobodneho vyberu. Tento pocit ho ale prejde hned
;ako zisti, ze program sa ukonci po kazdom nekorektnom vstupe :P
;Vsetky pouzite funkcie na pracu so suborom pouzivaju carry flag v pripade
;chyby, program teda testuje carry flag a ak je nastavany na 1, patricne
;uzivatelovi vynada (a ukonci program).
;Technicke vybavenie:
;napriek tomu, ze som mal k dispozicii instrukcne sady MMX, SSE, SSE2 i SSE3,
;cielom zadania bolo naucit nas pracovat s instrukcnou sadou zhodnou pre vsetky
;procesory radu x86, preto som vyuzival len tu.
;na kompilaciu som pouzil Turbo Assembler Ver 2.02, na linkovanie suborov som
;pouzil Turbo Link vo verzii 3.01.
;Moznych vylepseni je kopec, keby som v praci nemal toho tolko vela, este by
;som popracoval na moznosti vyberu z viacerych druhov kodovania, zaujimava
;by bola aj moznost vyberu zdrojoveho suboru alebo priamo moznost editacie
;zdrojoveho suboru (alebo textu nacitaneho z klavesnice). Na taketo finty, zial,
;cas nemam, tak program robi len to, co robit ma a ani macny mak viac ;)
;neodpustim si este taky vtipek na koniec:
;3x12=36
;2x12=24
;1x12=12
;0x12=18
; ^^
