;*******************************************************************************
;*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


