;**********************************************************************
;HAPPY BIRTHDAY TUNE                                                  *
;  11-5-2010                                                          *
;                                             *
;**********************************************************************


	list	p=12F629
	radix	dec
	include	"p12f629.inc"
	
		errorlevel	-302	; Dont complain about BANK 1 Registers 
		
	__CONFIG	_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.


;=====================================
;
;       Configuration Bits
;
;=====================================


note	equ		21h	;value of HIGH and LOW for note
gap		equ		22h ;gap between notes - uses "gap_1" delay
loops	equ		23h ;loops of HIGH/LOW 
temp1	equ		24h ;temp file for note 
jump	equ		25h
D1		equ		26h	;used in 250mS delay
D2		equ		27h	;used in 250mS delay
D3		equ		28h	;used in 250mS delay
gapDela	equ		29h	;used in gap delay
tempA	equ		2Ah	;used in gap delay



;************************************
;Beginning of program
;************************************
		org		0x00
		nop
		nop
		nop
		nop
		nop			
SetUp	bsf		status, rp0 	;Bank 1		
		call    0x3FF       	;retrieve calibration value 
		movwf   OSCCAL      	; 
       	movlw	b'00001011'		;Set TRIS  
		movwf	TRISIO	   	    ;GP2,4 outputs			
		bcf		status, rp0		;bank 0		
		movlw   07h         	;turn off Comparator 
        movwf   CMCON       	;must be placed in bank 0 
        clrf	jump			;jump value for table					
		goto 	M1		


;*************************************
;* Delays 			*
;*************************************
	
		
		;gap_1 produces the gap between notes - 3rd byte in table
		
		
gap_1	movlw	.2
		movwf	gapDela
gap_1a	decfsz	tempA
		goto	gap_1a
		decfsz	gapDela,1 ;produces loops
		goto	gap_1a
		decfsz	gap,1	;
		goto	gap_1
		retlw	00	

	
		;250mS second delay
		
_250mS	nop
		goto	$+1		
		decfsz 	D1,1
		goto 	_250mS
		decfsz 	D2,1
		goto 	_250mS		
		retlw 	00	
		

;********************
;* Table			*
;********************
		
table1	addwf   pcl,f   ;02h,1  add W to program counter
		nop				;
		
		retlw   .100    ;loops - cycles of HIGH/LOW "G" -Hap
		retlw   .142 	;note - value of HIGH/LOW
        retlw   .50     ;gap between notes             
          
        retlw   .100		;"G"-py
        retlw   .142
        retlw   .50        
        
        retlw   .220		;"A"  birth
        retlw   .126
        retlw   .50                
       
        retlw   .200		;"G"   day
        retlw   .142
        retlw   .50       
        
        retlw   .240		;"C"   to
        retlw   .105    
        retlw   .50        
        
        retlw   .240		;"B"   you
        retlw   .113
        retlw   .240        
        
		retlw   .97     ; "G" -Hap
		retlw   .142 	
        retlw   .20              
          
        retlw   .97		;"G"-py
        retlw   .142
        retlw   .20       
        
         retlw   .220		;"A"  birth
        retlw   .126
        retlw   .20                
       
        retlw   .200		;"G"   day
        retlw   .142
        retlw   .20        
         
        retlw   .240		;"D"  to 
        retlw   .94    
        retlw   .20        
         
        retlw   .240		;"C"  you 
        retlw   .105    
        retlw   .240        
        
        retlw   .97     ; "G" -Hap
		retlw   .142 	
        retlw   .20              
          
        retlw   .97		;"G"-py
        retlw   .142
        retlw   .20        
        
        retlw   .240		;"G+"- BIRTH
        retlw   .71
        retlw   .1  
        
        retlw   .240		;"G+"- BIRTH
        retlw   .71
        retlw   .20          
        
        retlw   .240		;"E"-day
        retlw   .84
        retlw   .20           
              
        retlw   .240		;"C"   
        retlw   .105    
        retlw   .20        
        
        retlw   .240		;"B"   
        retlw   .113
        retlw   .20
        
        retlw   .220		;"A"  
        retlw   .126
        retlw   .240 
                
        retlw   .240		;"F"  
        retlw   .80
        retlw   .2 
        
        retlw   .240		;"F"  
        retlw   .80
        retlw   .2 
        
        retlw   .240		;"E"
        retlw   .84
        retlw   .2           
        
        retlw   .240		;"C"   
        retlw   .105    
        retlw   .2        
           
        retlw   .240		;"D"  to 
        retlw   .94    
        retlw   .2
        
        retlw   .240		;"C"   
        retlw   .105    
        retlw   .2
                     
		retlw   0FFh
        

M1		call	_250mS
		call	_250mS
		
Main	incf	jump,1  ;increment pointer 
		movf	jump,w		
		call	table1
		movwf	loops		;first value from table	
		movlw	0ffh
		xorwf	loops,w		;see if value is "0ffh"
		btfsc	status,z
		goto	SetUp			
		incf	jump,1
		movf	jump,w
		call	table1
		movwf	temp1	;temp for note for HIGH/LOW
		
ttt		movf	temp1,w
		movwf	note		
		bsf		gpio,2
		bcf		gpio,4
		goto	$+1
		goto	$+1
		goto	$+1
		decfsz	note,1
		goto	$-4		
		movf	temp1,w
		movwf	note		
		bcf		gpio,2
		bsf		gpio,4
		goto	$+1
		goto	$+1
		goto	$+1
		decfsz	note,1
		goto	$-4
		decfsz	loops,f
		goto	ttt
		incf	jump,1 ;look for gap value
		movf	jump,w			
		call	table1
		movwf	gap
		bcf		gpio,2	;to produce silence
		bcf		gpio,4	;to produce silence
		call	gap_1	;mS gap
		goto	Main
				
		
		END
		
		
		
		
		
		
		
		

