Source file: /~heha/basteln/m/Kram/dccrail-avrgcc.zip/binärgleich/DCC_Decode.S

/****************************************************************************************
 * DCC Wagen Decoder Software V1.1							*
 * Copyright 2011 Toralf Wilhelm							*
 *											*
 * private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung!	*
 * Datei:	DCC_Decoder.inc                                                         *
 * Kontakt:	toralfwilhelm@web.de                                                    *
 * Webseite:	www.toralfwilhelm.de                                                    *
 * Version:	01/2011 Version 1 Start                                                 *
 *		01/2013 Fehler bei langer Adressierung und Decoderreset beseitigt       *
 * Beschreibung: Decodiert das DCC Telegramm und verzweigt dann zur Verarbeitung zu:	*
 *		"Programmierung.inc"	Programmiert den Dekoder			*
 *		"Funktionsbefehle.inc"	ermittelt die Funktionen der Funktionsausgänge	*
 *		"Fahrbefehle.inc"	ermittelt die Fahrbefehle			*
 *					(Geschwindigkeit + Richtung + Licht)		*
 ****************************************************************************************/

#include "definitionen.h"

/*******************************
 * DCC Telegramm entschlüsseln *
 *******************************/
DCC_DECODER:
	sbrs	flag,resetbit	// wenn 1 war reset da gehe zu
	 rjmp	1f		// sonst normal weiter
	rcall	SERVICE_MODE	// Programmiermodus CV-Lesen, Schreiben, Bitmanipulation
	ret
1:		// eigene Adresse ist angesprochen
	tst	byteB		// Vergleich auf dcc reset
	brne	1f		// wenn ungleich 1x springen
	rjmp	DCCreset	// sonst Reset machen (ret nicht nötig da SP init)

1:	sbrs	DCCreg,erwAdresse	// hier erst noch auf lange Adresse testen
	 rjmp	2f		// wenn nicht gleich weiter
	lds	w,AdresseLow	// sonst erst noch auf richtiges LowAdressbyte testen
	cp	byteB,w
	breq	1f		// wenn ja 3x springen
	cbr	flag,(1<<neuerBefehl); sonst Daten bearbeitet Empfangsspeicher wieder freigeben
	ret			// und fertig
1:	mov	byteB,byteC	// wenn gleich alle datenBytes an die position
	mov	byteC,byteD	// für 7bit addressen verschieben
	mov	byteD,byteE
	mov	byteE,byteF
//AN_ALLE:			// alle Decoder sind angesprochen
2:
//hier je nach Datenformat verzweigen
	mov	w,byteB		// Daten sichern
	andi	w,0b11100000	// Datenbits ausblenden
//ERWEITERTE_OPERATION:
	cpi	w,0b00100000	// Vergleiche auf erweiterte Operation (enthält befehl für 128 Fahrstufen)
	brne	2f		// wenn ungleich zu BASISFORMAT rückwärts springen
	mov	w2,byteB	// w2 mit inst Byte laden
	mov	w,byteC		// w mit Daten laden
	cbr	flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
	rcall	ERW_OPERATION	// wenn gleich gehe zu..
	ret
2:
	cpi	w,0b01000000	// Vergleiche mit V Rückwärts einfaches Format
	brne	2f		// wenn ungleich zu BASISFORMAT vorwärts springen
	mov	w,byteB		// w mit Daten laden
	cbr	flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
	rcall	V_BASIS		// wenn ja gehe zu
	ret
2:
	cpi	w,0b01100000	// Vergleiche mit V Vorwärts einfaches Format
	brne	1f		// wenn ungleich zu FUNKTIONSGRUPPE_1 springen
	mov	w,byteB		// w mit Daten laden
	cbr	flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
	rcall	V_BASIS		// wenn ja gehe zu..
	ret
1:
	cpi	w,0b10000000	// Vergleiche mit Funktionsgruppe F1-F4
	brne	2f		// wenn ungleich zu FUNKTIONSGRUPPE_2 springen
	mov	w,byteB	// w mit Funktionsdaten laden
	cbr	flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
	rcall	F_GRUPPE_1	// und dann gehe zu..
	ret
2:
	cpi	w,0b10100000	// Vergleiche mit Funktionsgruppe F5-F8
	brne	1f		// wenn ungleich zu PROGRAMMIERUNG springen
	mov	w,byteB		// w mit Funktionsdaten laden
	cbr	flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
	rcall	F_GRUPPE_2	// und dann gehe zu..
	ret
1:
	cpi	w,0b11100000	// Vergleich auf CV reg Manipulation
	brne	1f		// wenn ungleich 1x springen
	rcall	CV_edit		// wenn gleich gehe zu..
	ret
1:
	cbr	flag,(1<<neuerBefehl); Daten bearbeitet Empfangsspeicher wieder freigeben
	ret			// alles andere wird nicht unterstüzt -> verwerfen und zurück
Detected encoding: UTF-80