; DDS generator
; x-tal frequency 12000 kHz


; D6: D/A bit6


.nolist
.include "tn2313Adef.inc"
.list

; main program register variables


.def    DDSreg0    =r0     ;DDS register 
.def    DDSreg1    =r1     ;DDS register 
.def    DDSreg2    =r2     ;DDS register 
.def    DDSreg3    =r3     ;DDS register 

.def    SUMreg0    =r4     ;Sum register 
.def    SUMreg1    =r5     ;Sum register
.def    SUMreg2    =r6     ;Sum register
.def    SUMreg3    =r7     ;Sum register
.def	Rout0      =r10		;out 0 to port	
.def	RoutF	  =r11		;out F to port	

.def    SetPort    =r14    ;Input/output settings
.def    Zero       =r15    ;Zero



.def    varX       =r16    ;General variable


; code      


RESET:  

;ldi r20, RAMEND
;out spl,r20

Clear_var:                       ;Clear all variables
        clr     varX             ;Make varX Zero
        ldi     ZL,29            ;From reg 29 to 0
Clear_varloop:
        st      Z,varX           ;Clear register with value in ZL (r30)
        dec     ZL               ;Decrement ZL (r30)
        brne    Clear_varloop    ;r30 not cleared, is ZL



Set_ports:
        ldi     varX,0b11111111 
        mov     SetPort,varX
        out     DDRB,SetPort     ;Set B1-7 to output
        out     PORTB,Zero       ;Set outputs and pull up resistors
        out     DDRD,SetPort     ;Set D0-D7 as output

Initialize_freq:                 
        ldi     varX,0x12        ;Store for 67.00001 kHz
        mov     SUMreg3,varX     ;MSB
        ldi     varX,0x94
        mov     SUMreg2,varX
        ldi     varx,0xD2
        mov     SUMreg1,varX
        ldi     varx,0x43
        mov     SUMreg0,varX     ;LSB
		clr		Rout0
		clr		RoutF
        ldi     varX,0x40
        mov     RoutF,varX 

		



;=============================================================================
Main_loop0:
        nop	                 ;Time correction for 13 cycli
Main_loop0a:
	nop	                 ;Time correction for 13 cycli
Main_loop:
        add     DDSreg0,SUMreg0  ;Add the sumregisters to the DDS register 
        adc     DDSreg1,SUMreg1
        adc     DDSreg2,SUMreg2
        adc     DDSreg3,SUMreg3  ;MSB
        mov     varX,DDSreg3     ;MSByte in varX 
        sbrc    varX,7           ;Generate down ramp if bit7=1
		rjmp	foo
		out		PORTD,Rout0
		nop
        rjmp    Main_loop0       ;If not zero then Main_loop0
foo:
        com     varX
 		out		PORTD,RoutF
		nop
        rjmp    Main_loop       ;If not zero then Main_loop0

