Timer.A51
; This module services the real time interrupt
;
; Get a Real Time interrupt every 40 microseconds (from Timer 0)
;
; This routine generates a 40usec pulse which turns on a Triac (via an opto-isolator)
; The 10msec LINE half cycle is divided into 250 40usec 'slots'
; The position of the TurnON pulse will vary the phase angle of the power control
;
; The PC Host provides 6 "brightness" values, these are counted down each half-cycle
;
; The Triacs are on Port A bits [5:0]
; A Line zero-cross detector is on Port C bit 0
; 
ServiceTimerRoutine:
	MOV	DPTR, #PortC_Pins	; First check if we have just changes cycles
	MOVX	A, @DPTR
	MOV	DPTR, #PortA_OUT	; Will need this later
	MOV	C, LastCycle
	JNB	ACC.0, PositiveCycle    ; Need an XRL C, but we don't have one!
	CPL	C
PositiveCycle:
	JC	SameCycle
CycleChange:
	MOV	C, ACC.0		; Retreive current cycle
	MOV	LastCycle, C		; Save it for next time
	MOV	A, #10000000b		; Ensure all TurnON signals are low
	MOVX	@DPTR, A		; Trigger the 'scope on Bit 7
	MOV	R0, #LightValues
	MOV	R1, #WorkingValues	
	MOV	R7, #6
CCLoop:	MOV	A, @R0			; Get the Light Values
	CPL	A			; Since we count down
	MOV	@R1, A			; Update the Working Values
	INC	R0
	INC	R1
	DJNZ	R7, CCLoop		; Copy all six values
SameCycle:				; Check to see if any counters have expired
	MOV	R0, #WorkingValues
	MOV	Mask, #0		; Allow for XCH
	MOV	A, #00100000b		; Turn on signal for a Triac
NextTriac:
	XCH	A, Mask			; Accumulate TurnON signals in A
	MOV	Temp, @R0
	DJNZ	Temp, KeepOFF
	ORL	A, Mask			; Set a TurnON bit
KeepOFF:MOV	@R0, Temp
	INC	R0			; Ready for next loop
	XCH	A, Mask
	RR	A			; Rotate Mask pattern
        JNZ	NextTriac
	MOV	A, Mask			; Retrieve TurnON pattern
	MOVX	@DPTR, A		; TurnON triac(s) if required
	RET