;*******************************************************************************
;*Dekodovani
;*******************************************************************************
;Algorytmus pro dekodovaci proces. Vstupni parametr je Pismeno a tabulka sloupecku.
;Kazdé písmeno je kodovavano jako 3 dvojce sloupeèkù. Ka¾dá dvojce je kodovana 4 bitami. 
;První a druhá dvojce je je ulo¾ena v jednom bajtu, posunutém od 00h o hodnotu písmene
;poslední dvojce je ulo¾ená v bajtu zaèínajícím od 20h, sudá písmena v dolních itech, lichá v horních
;
;*******************************************************************************
; dodelat: adresy písmen nemohou být od 00h
;*******************************************************************************

;*Deklarace HW promìnných
;************************
f0                              equ 0x00    ;registr neprimeho adresovani
pcl       equ 0x02
status          equ 0x03        
fsr                             equ 0x04    ;registr adresy neprimeho adresovani


w equ 0             ; Výsledek ince jde do rW, registr f nezmìnìn.
f equ 1             ; Výsledek ince jde do registru f, rW nezmìnìn.

;*Deklarace systémových promìnných
;*********************************
RamZ equ 30h     ;Zacatek pro pgmove promenne
RamK equ 4Fh     ;Zacatek pro systemove promenne (roste nahoru)

;Pamì» pro stavový vektor
pismeno                                 equ     RamZ    ;aktualni pismeno k nacteni
buffer                                  equ     RamZ+1  ;zacatek vykreslovaciho bufferu

sloupek1                                equ                     RamK-1 ;jeden sloupecek z navratu
sloupek2                                equ                     RamK-1 ;druhy sloupecek z navratu
uBuffer                                 equ                     RamK-4  ;ukazatel na pozici v bufferu
dekbajt                                 equ                     RamK-5  ;bajt, který je práve dekodovan
zalohaFsr                               equ                     RamK-6  ;zaloha fsr v podprogramech

;*******************************************************************************
;*MAKRA
;*******************************************************************************
MBank0  macro
        bcf status,5    ; makro pro bank0
        endm

MBank1  macro
        bsf status,5    ; makro pro bank1
        endm



;*******************************************************************************
;*KONFIGURACE A PREKLAD
;*******************************************************************************

        list    p = 16F84
        __config 0x3FF1         ;nastaveni konfigurace


;*******************************************************************************
;ZACATEK PROGRAMU
;*******************************************************************************
        org     0x0000          ;adresa zacatku programu
        goto    ZInit           ;skoci na zacatek hlavniho programu


;*******************************************************************************
;*INICIALIZACE
;*******************************************************************************


ZInit   nop


;*******************************************************************************
;*ZAKLADNI CYKL - OBSLUHY PROCESù 
;*******************************************************************************
Main:   nop
                movlw B'00000001'
                call pDekoduj

Stuj:   nop
        goto    Stuj


pDekoduj:       
                        clrf  uBuffer                           ;vynulovani ukazatele bufferu
                        
                        movf pismeno, w                 ;ziskani adresy pismene
                        movwf fsr
                        movf f0,w
                        movwf   dekbajt                         ;ulozeni prave dekodovaneho bajtu do promenne
                        
                        call pPriprav                           ; vymaskuje bity a vynasobi 4ma
                        call tTabulka1;                 ; dekoduje první 2 sloupky
                        call pUloz                                      ;ulozi vystup z tabulky na prislusna mista v bufferu

                        swapf f0,w
                        movwf   dekbajt                         ;ulozeni horni casti dekodovaneho bajtu do promene

                        call pPriprav                           ; vymaskuje bity a vynasobi 4ma
                        call tTabulka2;                 ; dekoduje druhé 2 sloupky
                        call pUloz

                        rlw                     fsr,f                           ;sloupecky 5+6 jsou ulozeny na bajtech o 20h posunutých, a na jendom bajtu jsou v¾dy 2 kody
                        movlw           0x20                            
                        addwf  fsr,f                    
                        
                        movf f0,w
                        movwf   dekbajt                         ;ulozeni prave dekodovaneho bajtu do promenne
                        
                        btfsc pismeno,0                 ; licha pismena jsou ulozena v horních 4 bitech
                        swapf dekbajt
                        
                        call pPriprav                           ; vymaskuje bity a vynasobi 4ma
                        call tTabulka3;                 ; dekoduje poslední 2 sloupky
                        call pUloz
return


pUloz:  movwf sloupek2          ;ulozime druhy sloupek z W do promenne

                                movf fsr,w                              ;uschovame FSR
                                movwf zalohaFsr
                                
                                
                                movlw buffer                    ;nastaveni fsr na pozici v bufferu
                          addwf uBuffer, w
                          movwf fsr
                          
                          movf  sloupek1,w      ;ulozeni prvnoho sloupecku
                          movwf f0
                          
                          incf fsr, f                           ;posun ukazatele
                          
                                movf    sloupek2,w      ;ulozeni druheho sloupecku
                          movwf f0                                      
                         
                                incf fsr,w                              ;ulozeni ukazatele, tak aby ukazaoval na dasli polozku
                                movwf uBuffer
                        
                                movf zalohaFsr,w        ;obnovicme stare fsr
                                movwf fsr       
return


pPriprav:               movlw           B'00001111'                     ;zajimaji nas jenom prvni 4 bity
                                                andwf dekbajt,f
                                                rlw dekbajt,f                                   ;vynásobíme zádost 4, takze skok bude po 4 instrukcíh
                                                rlw dekbajt,w
                                                return

tTabulka1:      addwf   pcl,f           ;pricte W k citaci instrukci
                                                movlw           B'00000000'                     ;prvni kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop
                                                movlw           B'00000000'                     ;pruha kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop     
                                                movlw           B'00000000'                     ;treti kombinace...
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W


tTabulka2:      addwf   pcl,f           ;pricte W k citaci instrukci
                                                movlw           B'00000000'                     ;prvni kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop
                                                movlw           B'00000000'                     ;pruha kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop     
                                                movlw           B'00000000'                     ;treti kombinace...
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W


tTabulka3:      addwf   pcl,f           ;pricte W k citaci instrukci
                                                movlw           B'00000000'                     ;prvni kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop
                                                movlw           B'00000000'                     ;pruha kombinace
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W
                                                nop     
                                                movlw           B'00000000'                     ;treti kombinace...
                                                movwf           sloupek1                                        ;ulozi prvni sloupecek do promene
                                                retlw   B'11000000'     ; ulozi druhy sloupecek do W