********
* Program GATE_TN (6811)
*
* Turns lsb of Port B on and off every second.  Also generates
* one sec of 1000 Hz tone followed by one sec of quiet on output
* PA5.
*
* One sec timing of is implemented using OC2 interrupt timing.
* Tone timing by OC3 interrupt.
*
* P. H. Anderson, 27 Nov 90; 19 Jan 93
**********

PSCT    EQU $C000
DSCT    EQU $D000
STACKTP EQU $0045

OC2_VECTOR      EQU $00DC
OC3_VECTOR      EQU $00D9

REG_BASE        EQU $1000

PORTB   EQU $04
TCNT    EQU $0E
TOC2    EQU $18
TOC3    EQU $1A
TMSK1   EQU $22
TFLG1   EQU $23
TCTL1   EQU $20

        ORG PSCT

        SEI
        LDS #STACKTP
        LDY #REG_BASE
        BSET TCTL1,Y %00110000  * config OC3 int for transition

        LDAA #250               * set time constant for one sec delay
        STAA TIME_CONSTANT
        CLR PORTB,Y             * set lsb to zero
TOP
        LDAA #$01               * set TONE to nonzero
        STAA TONE
        BSET PORTB,Y %00000001  * set lsb to one
        BSR TIME                * one sec delay

        CLR TONE                * no tone
        BCLR PORTB,Y %00000001  * set lsb to zero
        BSR TIME

        BRA TOP

TIME
* subroutine provides 1 sec delay and either tone or no tone
        BSET TMSK1,Y %01000000  * mask for OC2
        BCLR TCTL1,Y %11000000  * no change on PA6 on interrupt
        LDAA TIME_CONSTANT
        STAA TEMP

        TST TONE                * tone or no tone
        BNE TONE_ON
        BEQ TONE_OFF
TONE_ON
        BSET TMSK1,Y %00100000   * mask for OC3
        LDD TCNT,Y              * fetch the clock
        ADDD #1000*2            * 1000 usecs * 2
        STD TOC3,Y
        BRA T_TOP
TONE_OFF
        BCLR TMSK1,Y %00100000
        BRA T_TOP
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 %01100000  * clear masks; OC2 and OC3
        RTS

OC2_INTSERV
        BCLR TFLG1,Y %10111111  * reset the OC2 int flag
        LDAA #$01               * set the flag to non zero
        STAA WAS_OC2
        RTI

OC3_INTSERV
        BCLR TFLG1,Y %11011111   * reset the OC3 flag
        LDD TOC3,Y
        ADDD #1000*2            * 1000 usecs
        STD TOC3,Y
        RTI

        ORG OC2_VECTOR

        JMP OC2_INTSERV

        ORG OC3_VECTOR

        JMP OC3_INTSERV

        ORG DSCT

TIME_CONSTANT   RMB 1
TEMP            RMB 1
WAS_OC2         RMB 1
TONE            RMB 1

