********
* Program ONE_SEC (6811)
*
* Turns lsb of Port B on and off every second.
*
* Timing of is implemented using OC2 interrupt timing.
*
* P. H. Anderson, 27 Nov 90; 19 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 #250		* set time constant
	STAA TIME_CONSTANT
	CLR PORTB,Y		* set lsb to zero
TOP
	BSR TIME		* one sec delay
	BSET PORTB,Y %00000001	* set lsb to one
	BSR TIME
	BCLR TIME
	BCLR PORTB,Y %00000001	* set lsb to zero
	BRA TOP

TIME
* subroutine provides 1 sec delay
	BSET TMSK1,Y %01000000	* mask for OC2
	BCLR TCTL1,Y %11000000	* no change on PA6 on interrupt
	LDAA TIME_CONSTANT
	STAA TEMP
T_TOP
	CLR WAS_OC2
	LDD TOC2,Y
	ADDD #4000*2		   * 4000 usecs * 2
	STD TOC2,Y
L1
	CLI
	WAI
	TST WAS_OC2
	BEQ L1		* interrupt wasn't OC2
	DEC TEMP
	BNE T_TOP
	BCLR TMSK1,Y %01000000	* clear mask
	RTS

OC2_INTSERV
	BCLR TFLG1,Y %10111111	* reset the OC2 int flag
	LDAA #$01		* set the flag to non zero
	STAA WAS_OC2
	RTI

	ORG OC2_VECTOR

	JMP OC2_INTSERV

	ORG DSCT

TIME_CONSTANT	RMB 1
TEMP		RMB 1
WAS_OC2 	RMB 1

