;****************************************************************
;*								*
;*	- File - Name = MCUMD_2.SRC				*
;*                                				*		
;*      1. Slave						*
;*								*
;*	-*-*-*-*-Blinker per Schalter				*
;*	-*-*-*-*-Lichthupe					*
;*	-*-*-*-*-Rangierschalter (Schaltet auto-Blinker aus)	*
;*    	17.03.95			  			*
;*    	05.05.95 1. Anpassung					*
;*	01.10.95 Aenderung der Datenuebertragung (Slow)		*
;*	03.05.97 Blinkendes Fernlicht m�glich f. Feuerwehr	*
;*	25.10.98 Fehlerbes. bei Blinker per Schalter (Dummy)	*
;*								*
;*    	f�r PIC 16C54, 1. Slave 	  			*
;*	Decodiert Multinaut 					*
;****************************************************************
;
;
; Device data
		device  xt_osc,wdt_on,protect_on,pic16C54
		ID 	0002h
; 	ID:	First two Digits	No. of Typ	
;	01 = Futaba FM 	02 = Graupner JR 4108
;	03 = Robbe FMSS	04 = MPX Europa-MC
;	ID:	last two Digits		No. of IC
;	01:	Master 	02: 1.Slave  03: 2.Slave  04: 3.Slave
;
;
; Variables and equates
;
; 1 = Input on Direktion
; 0 = Output on Direktion
direction_a     =       0000b
direction_b     =       00000001b
Dummy		=	000h
		org     08h	;Start Variable
;
T1		= ra.1	;Horn
T2		= ra.0	;Hupe
T3		= ra.2
T4		= ra.3
;
T5		= rb.4
T6		= rb.5
T7		= rb.6
T8		= rb.3
T9 		= rb.2
T10 		= rb.1
T11		= rb.7
;
Ser_In		= rb.0		;Serieller Dateneingang
;
Multinaut1	ds 1		;1.Bytes f�r die �bertragung
Multinaut2	ds 1		;2.von PIC 1 Master
Zus1		ds 1		;5.
Zus2		ds 1		;6.
Zus3		ds 1
Zus4		ds 1
Multinaut3	= Zus3
Multinaut4	= Zus4
FLR		ds 1		;7.
Check		ds 1		;8. Byte = Checksumme
;
; 018H
Temp		ds 1
Temp1		ds 1
Bli_Time	ds 1
W_Count		ds 1
Count		= 1EH
Count1		= 1FH
;
;
Standlicht_O	= T9	;Pin    St 5
Fahrlicht_O	= T11	;Nur auf Platine
Fernlicht_O	= T10	;Nur auf Platine
Bli_Rechts_O	= T8	;Pin 5  St 5 
Bli_Links_O	= T3	;Pin 1  ST 5 
Rueckfahr_O	= T5	;Pin 4	St 5
Bremslicht_O	= T4	;Pin 2	St 5
;
Frei1_O		= T1
Frei2_O		= T2
Frei3_O		= T6
Frei4_O		= T7
;
Bremslicht	= FLR.0		;Aus PIC1 Master
Rueckfahr	= FLR.1		;Aus PIC1 Master
Bli_Links	= FLR.2		;Aus PIC1 Master
Bli_Rechts	= FLR.3		;Aus PIC1 Master
Bli_Clock	= FLR.7
; AD/Rundum	= FLR.4 - FLR.7	;4 Bit
;
;
	Include	'Labels.inc'
;	
		org     0       ;Start Objekt-File
		Reset	Start
;
; Power-up entry - init ports
;
start		mov	Count1,#01EH	;Z�hler
CL_Loop		mov	fsr,Count1	;nach File-Select
		clr	Indirect	;l�schen
		dec	Count1		;-1
		cjae	Count1,#010H,Cl_Loop  ;alles ?
		mov     !ra,#direction_a
		mov     !rb,#direction_b
		clr     rb
		clr	ra
		ljmp	Start10
;---------------------------------------;
Input		mov	Count1,#Multinaut1 	;6 Byte empfangen
		mov	Option,#3
		clr	rtcc
:Loop		jb	Ser_In,Input		;Pause abwarten
	clr	wdt	
		cjb	rtcc,#080h,:Loop 	;mind. ca. 1 mSec
;Startbit abwarten
;
IN_0 		mov	FSR,Count1		;1, 2
		mov	Count,#8		;8 Bit 3,4
IN_SB		clr	wdt			; 5
		jnb	Ser_In,IN_SB		;Startbit ? 6, 7
IN_CB		jb	Ser_In,IN_CB		;Startbit ende 8, 9
;
		mov	w_Count,#60		;45
w_Loop0		djnz	w_Count,w_Loop0
;
Data		rl	Temp
		jnb	Ser_In,Data_Low
		setb	Temp.0
		mov	W_Count,#40
w_loop1		djnz	W_Count,w_loop1
		jmp	Data_End
Data_Low	clrb	Temp.0
		mov	W_Count,#41
w_Loop2		djnz	W_Count,w_loop2
Data_End	djnz	Count,Data
		mov	Indirect,Temp	;Speichern
		inc	Count1
		cjbe	Count1,#Check,IN_0
;
; Checksumme errechnen und vergleichen
;
InCheck		clr	Temp			;vorbereiten
		mov	Count,#Multinaut1	;Checksumme, addition
Intcheck_1	mov	FSR,Count		;Adresse f. Indirekt
		add	Temp,Indirect		;errechnen ohne
		inc	Count			;�bertrag
		cjbe	Count,#Check-1,Intcheck_1 ;alle Bytes ?
		cjne	Check,Temp,Input	;Stimmts ?, nein, nochmal
;Daten aktuell �bernehmen
In_End		ret
;---------------------------------------;
Blinker		jb	Warn_I,Wa_Bli
		jb	Bli_Off,Blioff		;Auto-Blinker off
Blinker_1	jb	Bli_Links,Bli_Li
		jb	Bli_Rechts,Bli_Re
;
Blioff		nop
		jb	Bli_Li_I,Bli_Li
		jb	Bli_Re_I,Bli_Re
;		
Blioff1		clrb	Bli_Rechts_O
		clrb	Bli_Links_O
		jmp	Bli_End
;
Wa_Bli		jb	Bli_Clock,Wa_Bli1
		clrb	Bli_Links_O
		clrb	Bli_Rechts_O
		jmp	Bli_End
Wa_Bli1		setb	Bli_Links_O
		setb	Bli_Rechts_O
		jmp	Bli_End
;
Bli_Li		jb	Bli_Clock,Bli_Li1
		clrb	Bli_Links_O
		clrb	Bli_Rechts_O
		jmp	Bli_End
Bli_Li1		setb	Bli_Links_O
		clrb	Bli_Rechts_O
		jmp	Bli_End
;
Bli_Re		jb	Bli_Clock,Bli_Re1
		clrb	Bli_Rechts_O
		clrb	Bli_Links_O
		jmp	Bli_End
Bli_Re1		setb	Bli_Rechts_O
		clrb	Bli_Links_O
		jmp	Bli_End
;
Bli_End		NOP
;---------------------------------------;
Licht		mov	temp,#FernBlink_I	;Enthaelt Dummy ?
		cje	temp,#0,Licht_0		;ja
;
; Blinkendes Fernlicht f. Feuerwehr
		jnb	FernBlink_I,Licht_0	;Schalter nicht an
		jb	Bli_Clock,FB_1		;sonst test clock
		clrb	Fernlicht_O		;bei 0 = 0
		jmp	FB_2		
FB_1		setb	Fernlicht_O		;sonst 1
FB_2		jmp	Licht_2			;Ueberspringe Fernlicht
;
Licht_0		jb	Fernlicht_I,Fernlicht_An
		jb	Lichthupe_I,Fernlicht_An
		clrb	Fernlicht_O
		jmp	Licht_1
Fernlicht_An	setb	Fernlicht_O
Licht_1		jb	Fahrlicht_I,Fahrlicht_An
		clrb	Fahrlicht_O
		jmp	Licht_2
Fahrlicht_An	setb	Fahrlicht_O
Licht_2		jb	Standlicht_I,Standlicht_An
		clrb	Standlicht_O
		jmp	Licht_3
Standlicht_An	setb	Standlicht_O
Licht_3		jb	Rueckfahr,Rueck_An
		clrb	Rueckfahr_O
		jmp	Licht_4
Rueck_An	setb	Rueckfahr_O
Licht_4		jb	Bremslicht,Brems_An
		clrb	Bremslicht_O
		Jmp	Licht_5
Brems_An	setb	Bremslicht_O
Licht_5		nop
; --------------  Standlicht Slave
Licht_10	jb	Fahrlicht_I,Set_Standlicht
		jb	Fernlicht_I,Set_Standlicht
		jb	Standlicht_I,Set_Standlicht
		clrb	Standlicht_O
		jmp	Licht_End
Set_Standlicht	setb	Standlicht_O
Licht_End	Ret
;---------------------------------------;
Multi		jnb	Frei1_I,Multi_1
		setb	Frei1_O
		jmp	Multi_2
Multi_1		clrb	Frei1_O
Multi_2		jnb	Frei2_I,Multi_3
		setb	Frei2_O
		jmp	Multi_4
Multi_3		clrb	Frei2_O
Multi_4		jnb	Frei3_I,Multi_5
		setb	Frei3_O
		jmp	Multi_6
Multi_5		clrb	Frei3_O
Multi_6		jnb	Frei4_I,Multi_7
		setb	Frei4_O
		jmp	Multi_8
Multi_7		clrb	Frei4_O
Multi_8		ret
;---------------------------------------;
Start10		nop	;debug
		call	Blinker
		Call	Input
		call	Licht
		call	Multi
		jmp	Start10
		end
