Source file: /~heha/basteln/Konsumgüter/Kram/GF22.zip/dds.S

#define __SFR_OFFSET 0
#include <avr/io.h>

// Registerbelegung
#define	Freq0	r2
#define	Freq1	r3
#define	Freq2	r4
#define	Freq3	r5		// 32 Nutzbits
#define saveSREG r6
#define	Phase0	r7
#define	Phase1	r8
#define	Phase2	r9
#define	Phase3	r10		// muss gerade sein
#define Phase4	r11		// 34 Nutzbits
#define saveZL	r12
#define saveZH	r13

.global TIMER0_COMPA_vect

TIMER0_COMPA_vect:
// ISR: „Überlauf“ Timer0 mit (bis zu) 20 MHz/64 = 312 kHz
	in	saveSREG,SREG
	add	Phase0,Freq0
	adc	Phase1,Freq1
	adc	Phase2,Freq2
	adc	Phase3,Freq3
	brcc	1f
	inc	Phase4
1:	movw	saveZL,ZL
	movw	ZL,Phase3
	ori	ZH,0xFC		// in den hintersten Flash-Bereich (400..7FF) eingrenzen
	out	SREG,saveSREG
	lpm	saveSREG,Z
	out	OCR1A,saveSREG	// das verändert keine Flags mehr
	movw	ZL,saveZL
	reti			// = 4+16+4 = 24 Takte
Detected encoding: UTF-80