Timer.A51
; This module services the real time interrupt
;
; Get a Real Time interrupt every One millisecond (using SOF interrupt)
;
; Pulse the stepper motor every 10msec (100Hz) if required
;	EZ-USB PortA drives an Allegro 8219
;	Phase A is connected to bits 5,4 & 3, Phase B to bits 2,1 & 0
;	Bits 5 and 2 are PHASE
;	Bits 4:3 and 1:0 are I1:I0 current inputs
;
ServiceTimerRoutine:
	DJNZ    Msec_counter, Done      ; Only need to step every 10msec
	MOV     Msec_counter, #10	; Reinitialize

	MOV	R0, #MotorControl+1	; Point to LS byte of count
	MOV	R1, #MotorControl+2	; Point to MS byte of count
	MOV	A, @R0
	ORL	A, @R1
	JZ	Done			; No stepping required
StepTheMotor:
	DEC	@R0			; Unfortunately, no flags are set
	MOV	A, @R0
	CPL	A			; Test for LS = FF
	JZ	STM1
	DEC	@R1			; Underflow on LS, therefore adjust MS byte
STM1:	MOV	A, MotorControl		; Get the direction indicator
	JNZ	Clockwise
	MOV	A, #-1			; CounterClockwise = backup one
Clockwise:
	ADD	A, CurrentPosition
	ANL	A, #0FH			; Table is only 16 entries long
	MOV	CurrentPosition, A
	MOV	DPTR, #StepperTable
	MOVC	A, @A + DPTR		; Index into table 
	MOV	R0, #Low(PortA_Pins)
	MOVX	@R0, A			; Select the new step position
Done:	RET

StepperTable:
	DB 000111b	;  0 = Up
	DB 000010b	;  1
	DB 001001b	;  2
	DB 010000b	;  3
	DB 011000b	;  4 = Right
	DB 110000b	;  5
	DB 101001b	;  6
	DB 100010b	;  7
	DB 100011b	;  8 = Down
	DB 100110b	;  9
	DB 101101b	; 10
	DB 110100b	; 11
	DB 111100b	; 12 = Left
	DB 010100b	; 13
	DB 001101b	; 14
	DB 000110b	; 15