; VCXO1251.ASM 
;
;This program loads the PMB2306 PLL with divider and status data. 
;RB0 is used as CLOCK, RB1 is used as DATA and RB2 is used as ENABLE
;
;Rdiv=45, Ndiv=1126, PD=1mA, Single HFmode, 1.3ns antibacklash,
;PD pos
;
;Used to lock 125.111 111 MHz to 5 MHz, Fref=111.11111... kHz
;LO for P3D 23 cm uplink and 13 cm downlink
;
        LIST            P=16C84
        __CONFIG        15H     ;XT OSC, WATCHDOG
        __IDLOCS        1234
;
;   
;
PORTB   EQU     0x06 
TRISB   EQU     0x86
OPTREG  EQU     0x81
STATUS  EQU     0x03
RP0     EQU     0x05
NO_O_B  EQU     0x0c            ;No of bits 
STAT1   EQU     0x0d            ;data for pll status register
STAT2   EQU     0x0e            ;data for pll status register
NA_CNT1 EQU     0x0f            ;data for pll N/A counter 
NA_CNT2 EQU     0x10            ;data for pll N/A counter
NA_CNT3 EQU     0x11            ;data for pll N/A counter
R_CNT1  EQU     0x12		;data for pll R counter
R_CNT2  EQU     0x13		;data for pll R counter
R_CNT3  EQU     0x14		;data for pll R counter		   
;
;       Loading of RAM registers with synth data
;       LSB appears as first bit at portB
;
	MOVLW   0x3E            ;first byte of status2 reg data. 	        
	MOVWF	STAT1		;0011 1110
	MOVLW   0xAC            ;second byte of status2 reg data.	        
	MOVWF	STAT2		;1010 1100
;
	MOVLW   0x00            ;first byte of N/A counter data	        
	MOVWF	NA_CNT1		;0000 0000
	MOVLW   0x00            ;second byte of N/A counter data	        
	MOVWF	NA_CNT2		;0000 0000
	MOVLW   0xED            ;third byte of N/A counter data	        
	MOVWF	NA_CNT3		;1110 1101
;
	MOVLW   0x00            ;first byte of R counter data	        
	MOVWF	R_CNT1		;0000 0000
	MOVLW   0x11            ;second byte of R counter data	        
	MOVWF	R_CNT2		;0001 0001
	MOVLW   0x59            ;third byte of R counter data	        
	MOVWF	R_CNT3		;0101 1001
;
;	Init of port and WDT
;
        CLRF    PORTB           ;all outputs zero
        BSF     STATUS,RP0      ;SELECT REGISTER BANK 1   
        CLRF    TRISB^80H       ;SET PORTB TO ALL OUTPUTS
        MOVLW   08H             ;load w-acc with 00001000b
        MOVWF   OPTREG^80H      ;ASSIGN PRESCALER (1:1) TO WDT
        BCF     STATUS,RP0      ;SELECT REGISTER BANK 0
;       
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP1   MOVF	STAT1,0	   	;MOVE STAT1 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	STAT1,1		;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP1		;HOPPA TILLBAKA
				;ANNARS KLAR MED FIRSTA BYTEN
;
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP2   MOVF	STAT2,0	   	;MOVE STAT1 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	STAT2,1		;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP2		;HOPPA TILLBAKA
				;ANNARS KLAR FÖR ATT LÄGGA UT ENABLE
;
	MOVLW	0x04		;load w-acc with 00000100
	MOVWF	PORTB		;LÄGG UT ENABLE HIGH TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	CLRW			;NOLLSTÄLL W-ACC
	MOVWF	PORTB		;LÄGG UT NOLL PÅ PORT B
;
;	LÄGG UT NA-COUNTER DATA 
;     
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP3   MOVF	NA_CNT1,0	;MOVE STAT1 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	NA_CNT1,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP3		;HOPPA TILLBAKA
				;ANNARS KLAR MED FIRSTA BYTEN
;
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP4   MOVF	NA_CNT2,0  	;MOVE STAT1 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	NA_CNT2,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP4		;HOPPA TILLBAKA
				;ANNARS KLAR FÖR ATT LÄGGA UT ENABLE
;
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP5   MOVF	NA_CNT3,0  	;MOVE NA_CNT3 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	NA_CNT3,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP5		;HOPPA TILLBAKA
				;ANNARS KLAR FÖR ATT LÄGGA UT ENABLE
;
	MOVLW	0x04		;load w-acc with 00000100
	MOVWF	PORTB		;LÄGG UT ENABLE HIGH TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	CLRW			;NOLLSTÄLL W-ACC
	MOVWF	PORTB		;LÄGG UT NOLL PÅ PORT B
;
;	LÄGG UT R-COUNTER DATA 
;     
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP6   MOVF	R_CNT1,0	;MOVE R_CNT1 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	R_CNT1,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP6		;HOPPA TILLBAKA
				;ANNARS KLAR MED FIRSTA BYTEN
;
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP7   MOVF	R_CNT2,0  	;MOVE R_CNT2 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	R_CNT2,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP7		;HOPPA TILLBAKA
				;ANNARS KLAR FÖR ATT LÄGGA UT ENABLE
;
	MOVLW   08H             ;load NO_O_B with 08H	        
	MOVWF	NO_O_B
LOOP8   MOVF	R_CNT3,0  	;MOVE R_CNT3 TILL W-ACC
	ANDLW   0x01		;MASKA BORT ALLT UTOM BIT 0
	IORLW   0x02		;LÄGG CLK HÖG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	ANDLW	0x01		;LÄGG CLK LÅG
	MOVWF	PORTB		;LÄGG UT TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	RRF	R_CNT3,1	;ROTERA BYTE FOR NXT DATA	
	DECFSZ	NO_O_B,1	;MINSKA O KOLLA OM ALLA KLARA
	GOTO    LOOP8		;HOPPA TILLBAKA
				;ANNARS KLAR FÖR ATT LÄGGA UT ENABLE
;
	MOVLW	0x04		;load w-acc with 00000100
	MOVWF	PORTB		;LÄGG UT ENABLE HIGH TILL PORT B
	SLEEP			;WAIT FOR WDT TIMEOUT
	CLRW			;NOLLSTÄLL W-ACC
	MOVWF	PORTB		;LÄGG UT NOLL PÅ PORT B
;
;
ENDLOOP SLEEP                   ;WAIT FOR WDT TIMEOUT
	SLEEP
	SLEEP
	SLEEP
	SLEEP
	SLEEP
	SLEEP
	SLEEP
	SLEEP
        GOTO    ENDLOOP         ;START NEW CYCLE
;
        ORG     2100H
;
        DE      "Copyright (C) 1998 Hannes Illipe, SM6PGP"
        END

