********
* Program FULLWAVE (6811)
*
* Synthesizes a full wave sinusoid at output of D/A connected
* to output port PORTB using 16 digital samples stored in memory.
*
* Timing of is implemented using OC2 interrupt timing.
*
* P. H. Anderson, 15 Nov 90; Verified 16 Nov 90; 15 Jan 93
**********

PSCT	EQU $C000
DSCT	EQU $D000
IDSCT	EQU $D300

STACKTP EQU $0045

OC2_VECTOR	EQU $00DC
REG_BASE	EQU $1000

PORTB	EQU $04
TCNT	EQU $0E
TOC2	EQU $18
TMSK1	EQU $22
TFLG1	EQU $23
TCTL1	EQU $20

	ORG PSCT

	SEI
	LDS #STACKTP
	LDY #REG_BASE
	LDAA #$04		* set time constant
	STAA TIME_CONSTANT
	LDX #FULL_WAVE
OUT
	LDAA 00,X		* get the sample
	STAA PORTB,Y		* out to D/A
	BSR TIME		* 256 usec delay
	INX
	CPX #FULL_WAVE+$10	* past last sample?
	BNE OUT
	LDX #FULL_WAVE		* otherwise set back to initial
	BRA OUT

TIME
* subroutine provides 256 usec delay
	BSET TMSK1,Y %01000000	* mask for OC2
	BCLR TCTL1,Y %11000000	* no change on PA6 on interrupt
	LDAA TIME_CONSTANT
	STAA TEMP
TOP
	LDD TOC2,Y
	ADDD #128		* 64 usecs * 2
	STD TOC2,Y
	CLI
	WAI
	DEC TEMP
	BNE TOP
	BCLR TMSK1,Y %01000000	* clear mask
	RTS

OC2_INTSERV
	BSET TFLG1,Y %01000000	* reset the OC2 int flag
	RTI

	ORG OC2_VECTOR

	JMP OC2_INTSERV

	ORG DSCT

TIME_CONSTANT	 RMB 1
TEMP		 RMB 1

	ORG IDSCT

FULL_WAVE
	FCB  $19, $4A, $79, $A2
	FCB  $C6, $E2, $F5, $FF
	FCB  $FF, $F5, $E2, $C6
	FCB  $A2, $79, $4A, $19


