*************
* Program INT_TIME
*
*
* Program alternately winks $F0 and $0F every 50 msecs.  Uses Interrupts.
*
* P. H. Anderson, MSU, 15 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
        OPT c                   * turn on cycle counter

        SEI
        LDS #STACKTP
        LDY #REG_BASE
        LDD #500                * 500 * 100 usecs = 50 msecs
        STD TIME_CONSTANT
TOP
        LDAA #$F0
        STAA PORTB,Y
        BSR TIME
        LDAA #$0F
        STAA PORTB,Y
        BSR TIME
        BRA TOP
TIME
* subroutine provides TIME_CONSTANT * 100 usec delay
        PSHX
        LDD TCNT,Y
        ADDD #500*2
        STD TOC2,Y

        BSET TMSK1,Y %01000000  * mask for OC2
        BCLR TCTL1,Y %11000000  * no change on PA6 on interrupt

        LDX TIME_CONSTANT
        STX TEMP
L1
        LDX TEMP
        DEX
        BEQ DONE
        STX TEMP
        CLI
        WAI
        LDD TOC2,Y
        ADDD #100*2               * 100 usecs * 2
        STD TOC2,Y
        BRA L1
DONE
        BCLR TMSK1,Y %01000000  * clear mask
        PULX
        RTS


OC2_INTSERV
        BCLR TFLG1,Y %10111111  * reset the OC2 int flag
        RTI

        ORG OC2_VECTOR

        JMP OC2_INTSERV

        ORG DSCT

TIME_CONSTANT   RMB 2
TEMP            RMB 2

