
;****************************************************************
;*								*
;*  	Rank Strand D54 zu DMX512 Converter			*
;*								*
;*	Uwe Bredemeier (uwe@call-n-deal.de) April 2003		*
;*	Rev. 0x							*
;*	Copyleft, Do Whatever You Want With This Code		*
;*								*
;****************************************************************

MAXCH		EQU	48		;MAX DMXKANAELE 


CL		EQU	P3.4		;PORT CLOCK A/D          
CS		EQU	P3.3		;PORT CHIP SELECT A/D
DATA		EQU	P3.5      	;PORT DATA A/D
TXDPORT		EQU	P3.1		;PORT DMXTRANSMIT
TREN		EQU	P1.5		;PORT 75167 DIR
WDPORT		EQU	P3.7
LED		EQU	P1.7

	DSEG

xxxybit segment bit at 24h

READ_EN		DS	1

xxxreg segment intern byte at 30h 
DATEN		DS	49
STARTCODE	DS	1		
FRAMECOUNTER	DS	1



SPMIN           EQU     $ -1            ;AB HIER STACK   

	CSEG

;*****************************************************************
;*           Interruptsprungleiste initialisieren                *
;*****************************************************************

	ORG	00H
	LJMP    INIT                    ;zum Programmanfang springen

	ORG     03H                     ;Ext. Int. 0
	AJMP	SYNC
	RETI

	ORG     0BH
	RETI                            ;Timer 0 Interrupt

	ORG     13H                     ;Ext. Int. 1  
	RETI

	ORG     1BH                     ;Timer 1 Interrupt
	RETI

	ORG     23H                     ;Interrupt serielle Schnittstelle
	RETI

	ORG     2BH                     ;Timer 2 Interrupt
	RETI

;****************************************************************   

INIT:
    	MOV     SP,#SPMIN 
    
    	MOV	R0,#SP			;SPEICHER LOESCHEN
	MOV	A,#0
MEMLOOP:
	MOV	@R0,A
	DJNZ	R0,MEMLOOP
	
	SETB	EX0			;EXT INTR 0 ENABLE
	SETB	IT0			;FALLENDE FLANKE
    
	MOV	STARTCODE,#0
	MOV	FRAMECOUNTER,#MAXCH
	SETB	TREN	
	
	SETB	EAL			;GENERELLE INTERRUPTFREIGABE


;****************************************************************     

MAINLOOP:
	CPL 	WDPORT
	SJMP 	MAINLOOP    
	 
     
;****************************************************************    
; INTERRUPT SYNC SIGNAL 
; THERE IS NO TIME FOR PUSHING AND POPING....

SYNC:
	CLR	CS  
	MOV	A,#7
	MOV     R4,#9	

LOOP2:               
	DEC	A			;LOOKING FOR NULL
	JZ	NULL
	JNB	P3.2,LOOP2
	
	JNB	READ_EN,RETIJ		;NEED DATA?
	CLR	LED
	SETB	CL			;
	CLR	CL 
            
LOOP:                          	       
	SETB    CL   
	MOV     C,DATA                    	 
	RLC     A            
	CLR     CL                	 
	DJNZ    R4,LOOP                 
	SETB	CS
	MOV	@R0,A
	DEC	R0
	DJNZ	FRAMECOUNTER,RETIJ
	CLR	READ_EN
	ACALL	SEND
	SETB	LED
RETIJ:	
	RETI
	
NULL:
	MOV	FRAMECOUNTER,#MAXCH
	MOV	R0,#DATEN+MAXCH 
	SETB	READ_EN
	RETI

;****************************************************************    

SEND:
	CLR	EAL
	
MARK1:
	MOV	R0,#46	;88us LOW
	CLR	TXDPORT
	
LOOP1:				
	NOP
	NOP
	DJNZ	R0,LOOP1
	SETB	TXDPORT
 	
	MOV	A,STARTCODE
	
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	CLR	TXDPORT
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	SETB	TXDPORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV	R1,#0
	MOV	R0,#DATEN+MAXCH 
	
SEND1:
	MOV	A,@R0
	
	CLR	TXDPORT
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	RRC	A
	MOV	TXDPORT,C
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB	TXDPORT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEC	R0
	MOV	A,R0
	XRL	A,#DATEN
	JNZ	SEND1
	SETB	EAL
	RET
			
;****************************************************************    


	END
