Intelligent Video Conferencing

MC68HC11 Assembly Code for Tracking Subsystem


TMSK1	EQU $22
TFLG1	EQU $23
TCTL2	EQU $21
TIC1	EQU $10
TIC2	EQU $12
INPUT	EQU $FFAC
PORTC	EQU $1003	;WE WILL USE PORT C FOR HORIZONTAL ROTATION
DDRC	EQU $1007
PORTB	EQU $1004
	ORG $C000
	LDAA #$06
	STAA VTOT
	LDAA #$10
	STAA HTOT
	LDAA #$FF
	STAA DDRC	;END OF OUTPUT INITIALIZATION

INIT:	LDX #BSEQ	;THIS INITIALIZES THE POINTER TO THE SEQUENCE
	LDAA 0,X
	STAA PORTC
	STX HROT
	LDX #BSEQ
	LDAA 0,X
	STAA PORTB
	STX VROT

	LDAA #$7E
	STAA $00E5
	STAA $00E8
	LDD #CAPT1A	; INITIALIZE PSEUDO VECTORS FOR IC1 AND IC2
	STD $00E9
	LDD #CAPT2A
	STD $00E6
	LDX #$1000	; INITIALIZE INDEX REGISTER
START:	CLR COUNT
	LDAB #$28	; CAPTURE FALLING EDGES FOR IC PINS 1 AND 2
	STAB TCTL2,X
	BCLR TFLG1,X $F8	;CLEAR FLAGS
	BCLR TMSK1,X $FF
	BSET TMSK1,X $06	; ENABLE INTERRUPTS

MAIN:	BCLR TFLG1,X $F8
	BSET TMSK1,X $06
	CLI
	WAI
	SEI
	LDAB STATUS
	BEQ MAIN

ON:	LDY #$2F
	LDAB #$28	; CAPTURE FALLING EDGES FOR IC PINS 1 AND 2
	STAB TCTL2,X
	BCLR TFLG1,X $F8  ;CLEAR FLAGS
NULL1:	DEY
	BEQ START
	LDAB #$FF	; DELAY FOR ABOUT 1 SECOND AFTER USER RELEASES SWITCH
NULL2:	BRSET TFLG1,X $04 ON
	BRSET TFLG1,X $02 ON
	BRSET TFLG1,X $06 ON
	BRSET TFLG1,X $05 ON
	BRSET TFLG1,X $01 ON
	BRSET TFLG1,X $07 ON
	BRSET TFLG1,X $03 ON
	DECB
	BNE NULL2
	BRA NULL1


;***************** INTERRUPT ROUTINES **************

CAPT1A:	CLR TMSK1,X	; DISABLE INTERRUPTS
	LDY #15000
DELAY1:	DEY
	BNE DELAY1
	BCLR TFLG1,X $F8	;CLEAR FLAGS
CHECK:	BRSET TFLG1,X $04 ONE
	BRSET TFLG1,X $02 TWO
	BRA CHECK
ONE:	LDAA #2
	BRA DONE
TWO:	LDAA #1
DONE:	CLR TCTL2,X	; DISABLE CAPTURES 
	LDAB COUNT
	BEQ FIRST
	BRA OTHER
FIRST:	INC COUNT
	STAA PREV
OTHER:	CMPA PREV
	BNE SWEEP
	BRA NOSWEEP
SWEEP:	LDAB #1	; 1 MEANS STOP MOVEMENT
	STAB STATUS
	CLR COUNT
	BRA FINISH
NOSWEEP:	LDAB #0	; 0 MEANS CONTINUE MOVEMENT
	STAB STATUS
	DECA	; CONVERT 2 TO 1 , 1 TO 0
	STAA HDIR	; MOVE MOTOR
	PSHX
	JSR HOROT
	PULX
	BCLR TFLG1,X $F8	;CLEAR FLAGS
	LDAB #$28
	STAB TCTL2,X	; CAPTURE ON FALLING EDGES
FINISH:	RTI

CAPT2A:	CLR TMSK1,X	; DISABLE INTERRUPTS 
	LDY #15000
DELAY2: DEY	; DELAY NEEDED TO GET OVER FIRST PSEUDO
	BNE DELAY2	; TRANSIENT
	BCLR TFLG1,X $F8	;CLEAR FLAGS
CHECK2:	BRSET TFLG1,X $04 ONEB
	BRSET TFLG1,X $02 TWOB
	BRA CHECK2
ONEB:	LDAA #2
	BRA DONEB
TWOB:	LDAA #1
DONEB:	CLR TCTL2,X	; DISABLE CAPTURES 
	LDAB COUNT
	BEQ FIRSTB
	BRA OTHERB
FIRSTB:	INC COUNT
	STAA PREV
OTHERB:	CMPA PREV
	BNE SWEEPB
	BRA NOSWEEPB
SWEEPB:	LDAB #1	; 1 MEANS STOP MOVEMENT
	STAB STATUS
	CLR COUNT
	BRA FINISHB
NOSWEEPB:	LDAB #0	; 0 MEANS CONTINUE MOVEMENT
	STAB STATUS
	DECA	; CONVERT 2 TO 1 , 1 TO 0
	STAA HDIR	; MOVE MOTOR
	PSHX
	JSR HOROT
	PULX
	BCLR TFLG1,X $F8	;CLEAR FLAGS
	LDAB #$28
	STAB TCTL2,X	; CAPTURE ON FALLING EDGES
FINISHB:	RTI


;**************** SUBROUTINES FOR MOTION  ***********************

HOROT:	LDX HROT	; THIS STARTS THE ROTATION WHERE IT LEFT OFF 
	LDAB HNUM	; KEEPS TRACK OF WHERE WE ARE IN SEQUENCE
	LDAA HDIR	; THIS WILL GET DIRECTION
		; ASSUME 1 IS POS AND 0 IS NEG
	BEQ HRSTEP	; IF DIR IS NEG GO TO REVERSE STEP


;;;;;;;  This is the forward horizontal movement.
HFSTEP:	LDY #$04	; THIS IS NUMBER OF STEPS TO TAKE
	LDAA HTOT ; THIS CHECKS FOR TOO MANY STEPS
	CMPA #72
	BEQ ENDH
LOOP1:	INC HTOT
	INX
	INCB
	CMPB #$04
	BEQ RESET1
CONT1:	LDAA 0,X	; THIS IS FOR FORWARD HORIZONTAL ROTATION
	STAA PORTC	;SENDS BIT PATTERN TO THE HORIZONTAL MOTOR
	STY DELAY
	LDY #$00FF ; this determines the delay time between steps
TIME1:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEY
	BNE TIME1
	LDY DELAY
	DEY
	BEQ ENDH
	BRA LOOP1
RESET1:	CLRB	; INITIALIZES THE STEP SEQUENCE AGAIN
	LDX #BSEQ
	BRA CONT1	; GOES BACK AT BEGINNING OF SEQUENCE


;;;;; This is the reverse horizontal movement.
HRSTEP: LDY #$04	; THIS IS FOR REVERSE HORIZONTAL ROTATION
	LDAA HTOT
	BEQ ENDH
LOOP2:	DEC HTOT
	DEX
	DECB
	BMI RESET2
CONT2:	LDAA 0,X  
	STAA PORTC
	STY DELAY
	LDY #$00FF	; this determines the delay time between steps
TIME2:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEY
	BNE TIME2
	LDY DELAY
	DEY
	BEQ ENDH
	BRA LOOP2
RESET2:	LDAB #$03
	LDX #ESEQ
	BRA CONT2
ENDH:	STX HROT
	STAB HNUM
	RTS
; END OF HORIZONTAL, PUT RETURN SUBROUTINE HERE

VEROT:	LDX VROT	; THIS STARTS THE ROTATION WHERE IT LEFT OFF 
	LDAB VNUM	; KEEPS TRACK OF WHERE WE ARE IN SEQUENCE
	LDAA VDIR	; THIS WILL GET DIRECTION
		; ASSUME 1 IS POS AND 0 IS NEG
	BEQ VRSTEP	; IF DIR IS NEG GO TO REVERSE STEP
VFSTEP:	LDY #$02	; THIS IS NUMBER OF STEPS TO TAKE
	LDAA VTOT	; THIS CHECKS FOR TOO MANY STEPS
	CMPA #$0C
	BEQ ENDV
LOOP3:	INC VTOT
	INX
	INCB
	CMPB #04
	BEQ RESET3
CONT3:	LDAA 0,X	; THIS IS FOR FORWARD VERTICAL ROTATION
	STAA PORTB	; SENDS BIT PATTERN TO THE VERTICAL MOTOR
	STY DELAY
	LDY #$0FFF	; This determines the delay time
TIME3:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEY
	BNE TIME3
	LDY DELAY
	DEY
	BEQ ENDV
	BRA LOOP3	; THIS LOOKS FOR THE END OF ONE CYCLE OF THE STEP SEQ.
RESET3:	CLRB	; INITIALIZES THE STEP SEQUENCE AGAIN
	LDX #BSEQ
	BRA CONT3
VRSTEP:	LDY #$02	; THIS IS FOR REVERSE VERTICAL ROTATION
	LDAA VTOT	; THIS CHECKS FOR TOO MANY STEPS
	BEQ ENDV
LOOP4:	DEC VTOT
	DEX
	DECB
	BMI RESET4
CONT4:	LDAA 0,X
	STAA PORTB
	STY DELAY
	LDY #$0FFF
TIME4:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEY
	BNE TIME4
	LDY DELAY
	DEY
	BEQ ENDV
	BRA LOOP4	; THIS LOOKS FOR THE END OF ONE CYCLE
RESET4:	LDAB #$03
	LDX #ESEQ
	BRA CONT4
ENDV:	STX VROT
	STAB VNUM
	RTS
; END OF VERTICAL PUT RETURN SUBROUTINE HERE


	NOP
PREV:	BSZ 1
STATUS:	BSZ 1
POINTER1:	BSZ 1
POINTER2:	BSZ 1
POINTER3:	BSZ 1
POINTER4:	BSZ 1
COUNT:	BSZ 1
COUNTER:	BSZ 2 
COUNTER2:	BSZ 2
BSEQ:	FCB $0C
	FCB $06
	FCB $03
ESEQ:	FCB $09
HROT:	FDB $0000
HNUM:	FCB $00
HDIR:	FCB $01
VROT:	FDB $0000
VNUM:	FCB $00
VDIR:	FCB $01
DELAY:	FDB $0000
HTOT:	FCB $24
VTOT:FCB $06
	BSZ 500
BOT:BSZ 1