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