
	;****************************************************************
	; Simplex-toistin äänentallennuspiirillä ISD2575                *
	; ja mikro-ohjaimella PIC16F84A@4Mhz radiopuhelimille v1.08     *												
	; ***************************************************************
	; Petri Tarkiainen 2005							                * 
	;                                           				    *
	; Käyttökokemuksista ja paranteluehdotuksista voi kirjoitella:  *
	; petri.tarkiainen@luukku.com  									*
	; Ohjelma on tehty täysin harrastelupohjalta enkä voi näinollen *
	; luvata minkäänlaista takuuta tai tukea ohjelmaan.             *
    ; 																*
	; Käytä ohjelmaa omalla vastuullasi.                            *
	; Use this code at your own risk.                               *
	;**************************************************************** 

	; Toiminnan kuvaus:
	;
	; RB0-nastaan tuleva +5V:n pulssi käynnistää nauhoituksen sekä sytyttää vihreän LED:n.
	; Kun nastan jännite pysyy 0 V:ssa tarpeeksi pitkään, lopetetaan nauhoitus.
	; Jos kanavalla on liikennettä nauhoituksen ja toiston välillä,
	; niin toistin jää odottamaan kanavan vapautumista.
	; Odotusaikana vilkutetaan vihreää RX-lediä. 
	; Jos nauhoitettu viesti ei ole tarpeeksi pitkä, viestiä ei toisteta.
	; Jos viesti toistetaan, niin kytketään päälle radion lähetys, ISD:n audiotoisto sekä punainen LED.
	; Viestin loputtua toistetaan äänimerkki RB3-nastasta.
	; Jos kanavan vapautumista on jouduttu odottamaan, niin lähetetty äänimerkki on toisenlainen.
	; Katkaistaan radion lähetys ja kytketään ISD virransäästötilaan.
	; Noin joka 10. minuutti lähetetään morsemajakka.
	; Jos viestin toiston jälkeen majakan aikaa on jäljellä alle 15 sekuntia, 
	; niin majakan lähetystä siirretään 15 sekunnin päähän.
	; Toiminnat on tehty OVF ja EOM tuloilla ajastinvarmennettuina, 
	; näin voidaan saada aikaan luotettava toiminta kuten myös PTT watchdog.
	; Ajastimet on säädetty PIC:n 4 Mhz:n kellotaajuudelle. 
	; PIC:n virransäästö ei ole mahdollista majakassa tarvittavien ajastimien vuoksi.
	
	; ************************ TULOT JA LÄHDÖT ***************************

	; RA0 =	varalla
	; RA1 = varalla 										
	; RA2 = VIESTIN LOPPU - EOM
	; RA3 = TOISTO / NAUHOITUS - P/R	LÄHTÖ	JOS 1 NIIN TOISTO
	; RA4 = MUISTIN YLIVUOTO - OVF				
	
	; RB0 = VASTAANOTTO					TULO	JOS 1 NIIN NAUHOITUS PÄÄLLE 				
	; RB1 = VALMIUSTILA - PD			LÄHTÖ	JOS 1 NIIN VALMIUSTILA (ISD ei käytössä)
	; RB2 = ISD AKTIVOINTI - CE			TULO	JOS 0 NIIN KÄYTÖSSÄ
	; RB3 = ÄÄNIMERKKI					LÄHTÖ	AUDIOTAAJUUS 		
	; RB4 = TOISTO LED PUNAINEN + PTT   LÄHTÖ	JOS 1 NIIN LED PALAA JA LÄHETYS ON PÄÄLLÄ
	; RB5 =	NAUHOITUS LED VIHREÄ 		LÄHTÖ	JOS 1 NIIN LED PALAA		
	; RB6 = varalla	(clock)							
	; RB7 = varalla (data)

	; ohjelmointiohjelman alustus
	TITLE   	"TOISTIN"
	LIST    	P=PIC16F84A
	INCLUDE 	"P16F84A.INC"
	__FUSES 	_CP_OFF & _WDT_OFF & _XT_OSC

	AIKA		EQU 12			; ajastimia varten
	AIKAB		EQU	13			; viive apumuisti
	AIKA1		EQU 14			; ajastimia varten	
	AIKA1B		EQU 15			; viive apumuisti	
	AIKA2		EQU 16			; ajastimia varten
	PIIP		EQU 17			; äänimerkkiä varten
	ODOTUS		EQU 18			; kanavan odotustieto
	OFFD		EQU 19			; päästöviive 
	PTT			EQU 20			; lähetysaika 1/61s
	PTT1		EQU 21			; lähetysaika 0,5s
	MAJ			EQU 22			; majakan TMR0 ylivuoto
	MAJ1		EQU 23			; majakan sekunnit
	MAJ2		EQU 24			; majakan minuutit
	MAJ3		EQU 25			; majakan aika lopussa 
	KOODI		EQU 26			; morsekoodi
	KIERTOA		EQU 27			; morsekoodi bitit jäljellä
	


	;määritellään rekisterien bitit
  	BCF		STATUS,RP0			; pankin nollaus
	CLRF	TMR0				; ajastin nollaus
 	BSF     STATUS,RP0 			; pankin asetus 
	MOVLW   b'00000100'      	; aseta TMR0 prescaler 32
   	MOVWF   OPTION_REG      	; tallenna se OPTION_REG rekisteriin
  	MOVLW   b'00010100'			; kopioidaan bitit työmuistiin, 0=lähtö, 1=tulo
    MOVWF   TRISA 				; kytketään porta
    MOVLW   b'10000001'			; kopioidaan bitit työmuistiin, 0=lähtö, 1=tulo
    MOVWF   TRISB       		; kytketään portb
	BCF		STATUS,RP0			; pankin nollaus
	
	;kytketään lähdöt 0/1 
	BCF		PORTA,0				; kytketään käyttämättömät pinnit 0V
	BCF		PORTA,1				; kytketään käyttämättömät pinnit 0V
	BCF		PORTA,3				; nauhoitus mode
	BSF 	PORTB,1				; piiri ei käytössä
	BSF		PORTB,2				; piiri ei aktivoitu
	BCF		PORTB,3				; äänimerkki
	BCF		PORTB,4				; toisto led + ptt pois
	BCF		PORTB,5				; nauhoitus led pois
	BCF		PORTB,6				; kytketään käyttämättömät pinnit 0V - clock
	CLRF	ODOTUS				
	CLRF	MAJ3

	;käynnistystesti
	MOVLW	.61					; 61 = 0,5 sekuntia								
	MOVWF	AIKA			
	MOVLW	.1					; 1 
	MOVWF	AIKA1
	BSF		PORTB,5				; nauhoitus led päälle
	CALL 	VIIVE
	BCF		PORTB,5				; nauhoitus led pois
	CALL 	VIIVE
	BSF		PORTB,5				; nauhoitus led päälle
	CALL 	VIIVE
	BCF		PORTB,5				; nauhoitus led pois
	CALL 	VIIVE

	; ********************* MAJAKKA ***********************

	;kytketään radion lähetys
MAJAKKA	
	BSF		PORTB,4				; toisto led + ptt päälle

	;odotetaan että lähetys on päällä ennen audion toistamista 
	MOVLW	.122				; 122 = 1 sekunti 								
	MOVWF	AIKA			
	CALL	VIIVE


	; ***************** MORSEKOODIT ; MORSE CODES *****************  

	; ka -.-.-  01010100 , aloitusmerkki = starting signal
	; as .-...  11101100 , odota = wait
	; sk ...-.- 01011110 , yhteyden viimeinen lähetys = end of work
	; ar .-.-.  10101100 , viesti loppuu tai + = end of message or +
	; bt -...-  01110100 , yhtäsuuri merkki = double dash =
	; / -..-.   10110100   
	; 0 -----   00000100   
	; 1 .----   00001100   
	; 2 ..---   00011100   
	; 3 ...--   00111100   
	; 4 ....-   01111100   
	; 5 .....   11111100   
	; 6 -....   11110100   
	; 7 --...   11100100   
	; 8 ---..   11000100   
	; 9 ----.   10000100  
	; a .-      01100000   
	; b -...    11101000   
	; c -.-.    10101000  
	; d -..     11010000   
	; e .       11000000    
	; f ..-.    10111000   
	; g --.     10010000 
	; h ....    11111000   
	; i ..      11100000  
	; j .---    00011000   
	; k -.-     01010000   
	; l .-..    11011000   
	; m --      00100000   
	; n -.      10100000   
	; o ---     00010000   
	; p .--.    10011000   
	; q --.-    01001000   
	; r .-.     10110000  
	; s ...     11110000   
	; t -       01000000   
	; u ..-     01110000   
	; v ...-    01111000   
	; w .--     00110000   
	; x -..-    01101000   
	; y -.--    00101000   
	; z --..    11001000   
	; ä .-.-	01011000
	; ö ---.	10001000

	; *******************  MAJAKKA MORSEVIESTI, MORSE BEACON MESSAGE *******************

	; muokkaa oma viestisi näin ; modify your own message like this
	; CQ RPT 
	MOVLW	b'10101000'			; C	kirjain ; C letter
	MOVWF	KOODI 
	CALL	MORSE
	
	MOVLW	b'01001000'			; Q kirjain ; Q letter
	MOVWF	KOODI 
	CALL	MORSE

	MOVLW 	.52					; 52 sanojen välinen viive 7x13-39=52 ; waiting time between words  
	MOVWF 	AIKA				
	MOVLW 	.1					; 1 älä muuta ; do not modify
	MOVWF 	AIKA1
	CALL 	VIIVE
	
	MOVLW	b'10110000'			; R kirjain ; R letter
	MOVWF	KOODI 
	CALL	MORSE
	
	MOVLW	b'10011000'			; P kirjain ; P letter
	MOVWF	KOODI 
	CALL	MORSE

	MOVLW	b'01000000'			; T kirjain ; T letter
	MOVWF	KOODI 
	CALL	MORSE
	
	; *******************  MAJAKKA MORSEVIESTI LOPPU, END OF MORSE BEACON MESSAGE *******************
	
	;odotetaan 
	MOVLW	.61					; 61 = 0,5 sekuntia 								
	MOVWF	AIKA
	MOVLW	.1					; 1 
	MOVWF	AIKA1			
	CALL	VIIVE

	;lähetys pois päältä
	BCF		PORTB,4				; toisto led + ptt pois
	
	;odotetaan hetki, että radio ehtii palata RX-vastaanottotilaan,
	;muuten nauhoitus kytkeytyy päälle, koska kohinasalpa ei ehdi sulkeutua
	MOVLW	.100				; 100					
	MOVWF	AIKA
	CALL	VIIVE

	; majakan ajan asetus ; time between morse beacon
MAJAIKA							; 2 x 61 = 122 x 256 TMR0 = 31232 / TMR0 TOIF								
	MOVLW	.61					; 4000000Mhz : 4 = 1000000 : 32 prescaler = 31250/sek 								
	MOVWF	MAJ					; 31232 : 31250 = 0,999424 sek tarkkuus
	MOVLW	.120				; 120s x 0,5 sekuntia = 1 minuutti
	MOVWF	MAJ1
	MOVLW	.10					; 10 minuuttia - muuta vain tätä ; 10 minutes - modify only this
	MOVWF	MAJ2

	;********************* MAJAKKAVIIVE *********************

MAJAKKA1
	BTFSC	PORTB,0				; onko VOX tieto päällä?
	GOTO 	NAUH
    BTFSS   INTCON, T0IF    	; ylivuoto TMR0
 	GOTO    MAJAKKA1         	; ei, odotetaan        
    BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
  	DECFSZ  MAJ,1      		
    GOTO    MAJAKKA1      	
	MOVLW	.61					; ajan laskentaa varten 61 = 0,5 sekuntia
	MOVWF	MAJ
	DECFSZ  MAJ1,1				; vähennetään sekunti
	GOTO	MAJAKKA1
	MOVLW	.61					; ajan laskentaa varten 61 = 0,5 sekuntia
	MOVWF	MAJ
	MOVLW	.120				; 120 x 0,5 sekuntia = 1 min
	MOVWF	MAJ1
	DECFSZ  MAJ2,1				; vähennetään minuutti
	GOTO 	MAJAKKA1
	GOTO	MAJAKKA				; aloitetaan uusi majakka
	
	;**** MAJAKKAVIIVEEN LASKENTA VASTAANOTOSSA, ODOTUSAIKANA JA LÄHETYKSESSÄ ****

MAJAKKA2
	BTFSC	MAJ3,1				; majakan aika lopussa?
	RETURN						; on loppunut, palataan
	DECFSZ  MAJ1,1				; vähennetään 0,5 sekuntia
	RETURN
	MOVLW	.120				; 120 x 0,5 sekuntia = 1 min
	MOVWF	MAJ1
	DECFSZ  MAJ2,1				; vähennetään minuutti
	RETURN

	; majakan aika on loppunut nauhoituksessa/odotusaikana/toistossa
	BSF		MAJ3,3				; asetetaan MAJ3 majakan aika lopussa
	MOVLW	.30					; laitetaan 30 x 0,5 sekuntia
	MOVWF	MAJ1	
	MOVLW	.1					; 1
	MOVWF	MAJ2 				
	RETURN

	; *************** NAUHOITUS ***************		
	
	;ISD:n päällekytkentä			
NAUH
	BCF		PORTB,1				; ISD päälle
	BCF		PORTA,3				; nauhoitus mode
	BSF		PORTB,5				; nauhoitus led päälle
	BCF 	PORTB,2				; nauhoitus alkaa
	
	;vastaanoton kohinasalvan aika ja vastaanoton ajan asetukset	

	MOVLW 	.61					; 61
	MOVWF 	AIKA				
	MOVLW 	.148				; 148 x 0,5 = RX watchdog
	MOVWF 	AIKA1
	MOVLW	.61					; 61 päästöviive
	MOVWF	OFFD
	BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
	CALL 	VAST

	;lopetetaan nauhoitus
	BSF 	PORTB,2				; piiri ei käytössä - nauhoitus loppuu
	BCF		PORTB,5				; nauhoitus led pois
	BSF 	PORTB,1				; piiri ei käytössä

	;tutkitaan onko nauhoitusaika tarpeeksi pitkä, jos on, niin toistetaan
	MOVFW	AIKA1
	MOVWF	PTT1
	ADDLW	.110				; 110 isompi aika -> viestin tulee olla pidempi, jotta se toistetaan
  	SKPC						; hyppy jos epätosi
  	GOTO 	TOISTO				; toistetaan viesti  
	
	;odotetaan hetki, että radio ehtii palata RX-vastaanottotilaan,
	;muuten nauhoitus kytkeytyy uudestaan päälle, koska kohinasalpa ei ehdi sulkeutua
	MOVLW 	.100				; 100
	MOVWF 	AIKA				
	MOVLW 	.1					 
	MOVWF 	AIKA1
	CALL 	VIIVE

	;jatketaan majakan ajan laskentaa
	CLRF	MAJ3 				; nollataan MAJ3 majakan aika lopussa muistipaikka
	GOTO	MAJAKKA1			; majakka ja RB0-nastan tutkiminen

	; **************** TOISTO ******************

TOISTO
	;lasketaan lähetysaika
	MOVFW	PTT
	SUBLW	.61					; 61 - aikaa jäljellä = lähetysaika  
	MOVWF	PTT					; lähetysaika

	MOVFW	AIKA1
	SUBLW	.148				; 148 - aikaa jäljellä = lähetysaika  
	MOVWF	PTT1				; lähetysaika

	BSF		PORTA,3				; toisto mode
	
	;pieni viive, odotetaan että kohinasalpa sulkeutuu
	MOVLW 	.61					; 61
	MOVWF 	AIKA				
	MOVLW 	.1					; 1
	MOVWF 	AIKA1
	CALL 	VIIVE

	;odotetaan kanavan vapautumista
	MOVLW 	.61					; 61 = 0,5 sekuntia	
	MOVWF 	AIKA	
	MOVLW	.1					; 1 
	MOVWF	OFFD
	BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
	CALL 	ODOTA
	BCF     PORTB,5    			; vihreä LED pois 

	;kytketään radion lähetys
	BSF		PORTB,4				; toisto led + ptt päälle
	BCF 	PORTB,1				; piiri käytössä
	;pieni viive
	MOVLW 	.30					; 30
	MOVWF 	AIKA				
	MOVLW 	.1					; 1
	MOVWF 	AIKA1
	CALL 	VIIVE

	;aloitetaan ISD:n audiotoisto
	BCF 	PORTB,2 			; toisto alkaa CE-pulssilla -> 0V

	;CE-pulssin aika
	MOVLW 	.1					; 1 
	MOVWF 	AIKA				
	CALL 	VIIVE
	
	;CE-pulssi pois
	BSF 	PORTB,2 			; CE-pulssi pois -> 5V

	;lähetys
	BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF			
	CALL 	LAHE
	
	;sammutetaan ISD-piiri
	BSF 	PORTB,1				; piiri ei käytössä
	BSF 	PORTB,2				; ISD valmiustilaan
	
	;pieni viive
	MOVLW 	.30					; 30
	MOVWF 	AIKA				
	CALL 	VIIVE

	;toiston äänimerkin valinta
	BTFSS	ODOTUS,1			; jos on jouduttu odottamaan kanavan vapautumista
	GOTO	VAPAA				; normaali äänimerkki

	;toistetaan tämä äänimerkki, jos on jouduttu odottamaan kanavan vapautumista
	CALL	KE
	CALL	YL
	CALL	KE
	CALL	YL
	CALL	KE
	GOTO	TOISTETTU	

	;normaali äänimerkki toiston jälkeen
VAPAA
	CALL	AL
	CALL	KE
	CALL	YL

TOISTETTU
	;pieni viive
	MOVLW 	.30					; 30 
	MOVWF 	AIKA				
	MOVLW 	.1					; 1
	MOVWF 	AIKA1
	CALL 	VIIVE
	
	BCF		PORTB,4				; toisto led + ptt pois
	CLRF	ODOTUS				; nollataan odotus muistipaikka
	CLRF	MAJ3				; nollataan majakan aika lopussa muistipaikka

	;pieni viive
	MOVLW 	.100				; 100
	MOVWF 	AIKA				
	CALL 	VIIVE	

	;tutkitaan onko majakan aikaa tarpeeksi jäljellä, jos aikaa jäljellä alle 15 sekuntia 
	;niin asetetaan majakka 15 sekunnin päähän
	MOVFW	MAJ2
	ADDLW	.254				; 254
  	SKPNC						; hyppy jos alle 1 minuutti jäljellä
  	GOTO 	MAJAKKA1			; jatketaan majakkaa entisellä ajalla
	MOVFW	MAJ1
	ADDLW	.241				; 241 
  	SKPNC						; hyppy jos alle 15 sekuntia jäljellä 
  	GOTO 	MAJAKKA1			; jatketaan majakkaa entisellä ajalla

	;asetetaan majakka 15 sekunnin päähän 
	MOVLW	.30					; 30 x 0,5 sekuntia
	MOVWF	MAJ1
	GOTO 	MAJAKKA1			; jatketaan majakkaa uudella ajalla

;	*************** VASTAANOTTOAIKA *****************

VAST
	BTFSS   INTCON, T0IF    	; ylivuoto TMR0
 	GOTO    VAST	         	; ei, odotetaan        
    BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
	BTFSS	PORTA,4				; OVF ISD:n muistin ylivuotomerkki?
	RETURN				
	BTFSC	PORTB,0				; vieläkö vastaanotetaan?
	CALL	LISAA
	DECFSZ  OFFD,1				; vähennetään päästöviivettä 
	GOTO	$+2
	RETURN						; palataan jos päästöviive lopussa	
	DECFSZ  AIKA,1     			; ei, vähennetään aikaa 61 asti 
    GOTO    VAST
	MOVLW	.61					; 61 ajan laskentaa varten  
	MOVWF	AIKA
	CALL	MAJAKKA2			; vähennetään majakan aikaa
	DECFSZ  AIKA1,1				; vähennetään aikaa max. 74 sekuntiin asti: RX-WATCHDOG	
	GOTO    VAST
	RETURN						; palataan jos 74 sekuntia kulunut

LISAA
	MOVFW	AIKA
	MOVWF	PTT
	MOVLW	.61					; 61 päästöhidastusaika
	MOVWF	OFFD
	RETURN


; ************* ODOTETAAN KANAVAN VAPAUTUMISTA *************

ODOTA
	BTFSS   INTCON, T0IF    	; ylivuoto TMR0
 	GOTO    ODOTA	         	; ei, odotetaan        
    BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
	BTFSC	PORTB,0				; onko kanava vapaa?
	CALL	LISAA1				; ei, lisätään aikaa
	DECFSZ  AIKA,1     			; vähennetään aikaa 61 asti = 0,5 sekuntia 
    GOTO    ODOTA
	CALL	MAJAKKA2			; vähennetään majakan aikaa odotusaikana
	DECFSZ  OFFD,1				; vähennetään päästöviivettä  
	GOTO    $+2					; hyppy 2 riviä kun päästöviivettä on vielä jäljellä
	RETURN					
	MOVLW	.61					; 61 = 0,5 sekuntia	 		
	MOVWF 	AIKA

	;vilkutetaan vihreää lediä kun odotetaan 
	BTFSS   PORTB,5		    	; jos LED on päällä niin laitetaan pois
    GOTO    $+3             	; jos LED on pois niin hyppy 3 riviä
    BCF     PORTB,5    			; vihreä LED pois
	GOTO	ODOTA
    BSF     PORTB,5		    	; vihreä LED päälle
	GOTO	ODOTA

LISAA1
	BSF		ODOTUS,1
	MOVLW	.2					; jos kanavalla on puhuttu, lisätään aikaa  
	MOVWF 	OFFD
	RETURN

; **************** YLEINEN VIIVE  ******************

VIIVE
	MOVFW	AIKA						
	MOVWF	AIKAB				
	MOVFW	AIKA1				
	MOVWF	AIKA1B
				
KIERTO
	BTFSS   INTCON, T0IF    	; ylivuoto TMR0
 	GOTO    KIERTO         	    ; ei, odotetaan        
    BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
  	DECFSZ  AIKAB,1      
    GOTO    KIERTO        	
	MOVFW	AIKA			
	MOVWF	AIKAB
	DECFSZ  AIKA1B,1
	GOTO 	KIERTO
	RETURN

;********************* LÄHETYSAIKA *********************

LAHE
	BTFSS   INTCON, T0IF    	; ylivuoto TMR0
 	GOTO    LAHE	         	; ei, odotetaan        
    BCF     INTCON, T0IF    	; nollaa TMR0:n TOIF
	BTFSS	PORTA,2				; jos EOM on 0, niin viesti on toistettu loppuun?
	RETURN					
	DECFSZ  PTT,1     			; vähennetään aikaa  
    GOTO    LAHE	
	MOVLW	.61					; 61 ajan laskentaa varten 
	MOVWF	PTT
	CALL	MAJAKKA2			; vähennetään majakan aikaa lähetysaikana
	DECFSZ  PTT1,1				; vähennetään lähetysaikaa 
	GOTO	LAHE
	RETURN					 


;********************* ÄÄNIMERKKI *********************

YL
	MOVLW 	.64					; 64
	MOVWF 	PIIP
	MOVLW 	.192				; 192
	MOVWF 	AIKA1				; äänen kestoaika
	GOTO	TILU
KE
	MOVLW 	.128				; 128
	MOVWF 	PIIP
	MOVLW 	.96					; 96
	MOVWF 	AIKA1				; äänen kestoaika
	GOTO	TILU

AL
	MOVLW 	.255				; 255
	MOVWF 	PIIP
	MOVLW 	.48					; 48
	MOVWF 	AIKA1				; äänen kestoaika

TILU
	NOP
	DECFSZ 	AIKA,1
	GOTO	TILU
	MOVFW 	PIIP				; PIIP = äänen korkeus, pieni arvo on korkeampi 
	MOVWF 	AIKA				; siirretään AIKA:aan
	BTFSS   PORTB,3		    
    GOTO    $+3             
    BCF     PORTB,3    		
	GOTO	TILU
    BSF     PORTB,3		    
	DECFSZ 	AIKA1,1				; AIKA1 = äänen kestoaika, riippuu myös PIIP:n pituudesta
	GOTO	TILU
	RETURN

	; *************** MORSE MAJAKKA *****************
MORSE

	MOVLW	.8					; luetaan bittejä 8 kertaa
	MOVWF	KIERTOA				
	
	;ohitetaan nollat ennen ensimmäistä ykköstä
OHITA0
	BTFSC	KOODI,0				; onko bitti 0 ?
	GOTO	OHITA1				
	RRF		KOODI,1				; kierrätetään bittejä
	DECFSZ	KIERTOA,1			; vähennetään 
	GOTO	OHITA0
	RETURN						; koodivirhe, palataan jos ei tullut ykköstä
	

	;ohitetaan ensimmäinen ykkönen 
OHITA1
	RRF		KOODI,1				; kierrätetään bittejä
	DECFSZ	KIERTOA,1			; vähennetään 
	GOTO	SEURAAVA			; luetaan ensimmäinen oikea 0/1
	RETURN						; koodivirhe, palataan jos ainoastaan viimeinen on ykkönen

	; *************** tutkitaan, onko 0 vai 1 *****************

SEURAAVA		
	BTFSC	KOODI,0				; onko bitti 0 ?
	GOTO	YKSI				; bitti on yksi

	;merkki on nolla _
	MOVLW 	.128				; 128
	MOVWF 	PIIP
	MOVLW 	.256				; 256 = 3
	MOVWF 	AIKA1
	CALL	TILU
	GOTO	KIERRA
	
YKSI
	;merkki on yksi	.
	MOVLW 	.128				; 128
	MOVWF 	PIIP
	MOVLW 	.85					; 85 = 1
	MOVWF 	AIKA1
	CALL	TILU

KIERRA
	;merkkien välinen viive  
	MOVLW 	.13					; 13 = 1x 
	MOVWF 	AIKA				
	MOVLW 	.1					; 1
	MOVWF 	AIKA1
	CALL 	VIIVE		
	
	RRF		KOODI,1				; kierrätetään bittejä oikealle
	DECFSZ	KIERTOA,1			; vähennetään 
	GOTO	SEURAAVA			; vielä on lukemattomia bittejä jäljellä

	;kirjaimien välinen viive  
	MOVLW 	.26					; 3x13 = 39, 26+13= 39
	MOVWF 	AIKA				
	MOVLW 	.1					; 1
	MOVWF 	AIKA1
	CALL 	VIIVE
	RETURN						; luetaan seuraava kirjain


	END




