******** * 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