
;*************************      	 1CHANNEL        ***************************
;*************************  DMX 512 RECIVER PROGRAM  ***************************
;*************************     	11 BIT OUTPUT     ***************************
;*************************     BY KATHY QUINLAN      ***************************
;*************************    K.A.Q. ELECTRONICS     ***************************
;*************************    WRITTEN 05-09-1997     ***************************
;************************* LAST MODIFIED  26-01-2001 ***************************
;*************************      COPYRIGHT 2001       ***************************
;
;MESSAGE FROM THE CREATOR ABOUT LIFE.......
;
;... AT LEAST MY PROGRAMMING IS NOT AS BAD AS MY SPELLING. SORRY ABOUT THE 
;	COMMENT FIELDS.
;
;
;
;
$mod51					;ASM DIRECTIVE FOR USE 8051 COMMAND SET

;*************************  DATA EQU AND DEF STATEMENTS ************************

CNT1		EQU	7FH		;WE HAVE A BREAK PULSE
TEMP		EQU	7EH		;THROW RUBBISH HERE
IADDRESS	EQU	7DH		;BASE ADDRESS OF UNIT
TEMP2		EQU	7CH		;
CUR_BYTE	EQU	7BH		;CURRENT BYTE #
TIME2		EQU	7AH
DMX1		EQU	79H		;DMX BYTE 1


;************************** INTERRUPT VECTOR LIST ******************************

ORG 0000H				;RESET VECTOR
		SJMP	START		

ORG 0003H				;EXTERNAL INTERRUPT ZERO
		RETI

ORG 000BH				;TIMER ZERO OVERFLOW
		RETI

ORG 0013H				;EXTERNAL INTERRUPT ONE
		RETI
	
ORG 001BH				;TIMER ONE OVERFLOW
		RETI

ORG 0023H				;COMBINED TX AND RX INTERRUPT
		SJMP	REC_BYTE




;**************************  START OF MAIN PROGRAMM *****************************

ORG 002BH				;START OF MAIN ROUTINE
START:
		SJMP	SETUP		;SETUP CPU FOR SERIAL,ONLY AT START-UP
RUN:		SJMP	RUN		;WAIT FOR  BYTE REQUIRED

		
				

		



;**************************  SETUP ROUTINE  ************************************



SETUP:
		MOV 	R0,#7FH		;THIS + NEXT 3 LINES CLEAR ALL DATA 
		CLR	A		;LOCATIONS
CLEAR_LOOP:	MOV	@R0,A
		DJNZ	R0,CLEAR_LOOP
		MOV	CNT1,#00H	;RESET DMX STATUS REG
		MOV	PCON,#00H	;SETS BAUD RATE TO 250Kb (16 Mhz XTAL)
		MOV	SCON,#98H	;SETS UP THE SERIAL PORT (MODE 2)
		MOV	IADDRESS,P0	;LOADS UNIT BASE ADDRESS FROM DIP'S
		MOV	IE,#90H		;ENABLE RECIEVE INTERUPT
		SJMP	RUN		;RETURN TO MAIN PROGRAM



;**************************  RECIVE DMX BYTES  *********************************

REC_BYTE:
		PUSH	PSW		;PUSHED TO STOP OVER WRITE
		PUSH	ACC		;PUSHED TO STOP OVER WRITE
		CLR	RI		;CLEAR THE RECIVE FLAG
		JB	RB8,REC
		MOV	CUR_BYTE,#00H	;WE HAVE A BREAK 
		SJMP	OUTI
REC:		MOV	A,CUR_BYTE
		CJNE	A,#00H,RECD	;IF CURRENT DMX BYTE GREATER THAN 0 WE HAVE DETECTED START BYTE
		MOV	A,SBUF		;MOVES CURRENT DMX BYTE TO ACC
		CJNE	A,#00H,OUTI	;CHECK IF BYTE ZERO 
		INC	CUR_BYTE	;WE HAVE BYTE ZERO !!!!!!!
		SJMP	OUTI
RECD:		MOV	A,CUR_BYTE	;MOV CURRENT DMX BYTE TO A
		CJNE	A,IADDRESS,NOT_A	;COMP UNIT ADRESS AND CURRENT
		ACALL	OUTPUT		;GO TO SAVE BYTE ROUTINE
NOT_A:		INC 	CUR_BYTE	;INC READEY FOR NEXT DMX BYTE
OUTI:		POP 	ACC		;RETURNED FROM STACK
		POP	PSW		;RETURNED FROM STACK
		RETI			;PROC GO HOME !!!!




;************************** OUTPUT BYTE *************************************

OUTPUT:		MOV	P2,SBUF	
		RET			;JD
 
;**************************  THE END  ******************************************


END					;ASM DIRECTIVE FOR END OF FILE