;=====================================================================
;
; DIGIamp
; Volldigitaler Vorverstrker
;
; Version 1.62
; Fernsteuermodul fr RC5-Code
;
; (C) SCHMID electronic 1993, 1996
;
;
; DIE GEWERBLICHE NUTZUNG DES NACHFOLGENDEN QUELLTEXTES (AUCH IN TEILEN)
; IST OHNE VORHERIGE SCHRIFTLICHE ZUSTIMMUNG DES ENTWICKLERS AUSDRCKLICH
; UNTERSAGT.
;
;=======================================================================

;=======================================================================
; Folgende Konstanten und Speicherbereiche mssen definiert sein:
; remPORT      - Port, an dem die IR-Daten anliegen
; remBIT       - Akkumulatorbit, das den IR-Daten entspricht
; ctrRc5bit    - Bitzhler
; fRc5toggle   - RC5-Toggleflag
; fRc5new      - Flag zur Meldung eines neuen Befehls
; fRc5complete - Flag: Empfang eines Datenwortes abgeschlossen
; fRc5progress - Flag: Empfangsprozeá im Gange
; fRc5temp     - Flag: Temporre Speicherung von fRc5new
; fRc5first    - Flag: Erstmaliges Einlesen nach Reset,
;                      altes Toggle-Bit nicht beachten
; bRc5bit      - temporres eingelesenenes Bit
; rc5state     - Zustand des Decoder-Automaten (0 bis 50)
; rc5address   - RAM-Zelle fr decodierte RC5-Adresse
; rc5command   - RAM-Zelle fr decodierten RC5-Befehl
;=======================================================================


;=======================================================================
; RC5-Einlese- und Prfroutine
;=======================================================================
;
; Aufgabe: Liest ein RC5-Signal ein, berprft dessen Gltigkeit und
;          extrahiert die enthaltene Adresse und den Befehl
;
; Rckgabe:
;       rc5address:   Adreáteil des RC5-Befehls
;       rc5command:   Befehlsteil des RC5-BEfehls
;       fRc5toggle:   RC5-Toggle-Bit
;       fRc5complete: Anzeige, daá RC5-Kommando eingetroffen
;       fRc5new:      Anzeige, daá NEUES RC5-Kommando eingetroffen
;       fRc5progress: Anzeige, daá Empfangsprozeá im Gange
;
; Registerverwendung:
;       keine
;=======================================================================

remote:         ; Bit einlesen
                ; und Automat um einen Zustand fortschalten
                lcall   nextremote

                ; Ist ein '1-Bit' eingetroffen?
                mov     a, rc5state
                cjne    a, #42, _rem3

                ; ja
                setb    bRc5bit
                sjmp    _rem5

_rem3:          ; Ist ein '0'-Bit eingetroffen?
                cjne    a, #50, _rem4

                ; ja
                clr     bRc5bit
                sjmp    _rem5

_rem4:          ; Ist eine Startsequenz erkannt worden?
                cjne    a, #33, _rem16

                ; ja
                mov     ctrRc5bit, #0
                setb    fRc5progress
                sjmp    _rem16

_rem5:          ; Gltiges Bit eingetroffen
                mov     a, ctrRc5bit

                ; Ist es das Toggle-Bit?
                jnz     _rem10

                ; ja - prfen, ob erstmaliges Einlesen nach Reset
                jb      fRc5first, _rem5a

                ; ja - also grundstzlich Eingang einer neuen Information
                ; signalisieren
                setb    fRc5first       ; damit nchstes Mal nicht wieder
                setb    fRc5temp
                sjmp    _rem9

_rem5a:         ; nein - also aus neuem und bisherigem Toggle-Bit-Zustand
                ; auf den Eingang einer neuen Information schlieáen
                jb      fRc5toggle, _rem8

                ; Toggle-Bit bis jetzt nicht gesetzt
                jb      bRc5bit, _rem7

_rem6:          ; Toggle-Bit wurde nicht verndert
                clr     fRc5temp
                sjmp    _rem9

_rem7:          ; Toggle-Bit wurde verndert
                ; also neue Information eingetroffen
                setb    fRc5temp
                sjmp    _rem9

_rem8:          ; Toggle-Bit bis jetzt gesetzt
                jnb     bRc5bit, _rem7
                sjmp    _rem6

_rem9:          ; Altes Toggle-Bit durch neues ersetzen
                mov     c, bRc5bit
                mov     fRc5toggle, c

                ; fertig
                sjmp    _rem15

_rem10:         ; Ist es das erste Adreábit?
                cjne    a, #1, _rem11

                ; ja
                clr     a
                mov     c, bRc5bit
                rlc     a
                mov     rc5address, a

                ; fertig
                sjmp    _rem15

_rem11:         ; Ist es ein anderes Adreábit?
                cjne    a, #6, _rem12

                ; nein, es ist das erste Datenbit
                clr     a
                mov     c, bRc5bit
                rlc     a
                mov     rc5command, a

                ; fertig
                sjmp    _rem15

_rem12:         ;es ist weder das erste Daten-, noch das erste Adreábit
                jnc     _rem13

                ; es ist ein anderes Adreábit
                mov     a, rc5address
                mov     c, bRc5bit
                rlc     a
                mov     rc5address, a

                ; fertig
                sjmp    _rem15

_rem13:         ; es ist ein anderes Datenbit
                mov     a, rc5command
                mov     c, bRc5bit
                rlc     a
                mov     rc5command, a

                ; War dies das letzte Datenbit?
                mov     a, ctrRc5bit
                xrl     a, #11
                jnz     _rem15

                ; ja - neues Fernbedienkommando ankndigen
                clr     fRc5progress
                mov     c, fRc5temp
                mov     fRc5new, c
                sjmp    _rem16

_rem15:         ; Bitzhler erhhen
                inc     ctrRc5bit

_rem16:         ; das war's
                ret



;=======================================================================
; RC5-Automat
;=======================================================================
;
; Aufgabe: Decodiert ein RC5-Signal nach dem Prinzip eines
;          Endlichen Automaten
;
; Rckgabe:
;       rc5state: Automatenzustand (0 bis 50)
;
; Registerverwendung:
;       DPTR - Zustandstabelle
;=======================================================================

nextremote:     ; Register sichern
                push    dph
                push    dpl

                ; nchsten Automatenzustand berechnen
                mov     dptr, #_stblRemote
                mov     a, remPORT
                mov     c, remBIT
                mov     a, rc5state
                rlc     a
                movc    a, @a+dptr
                mov     rc5state, a

                ; Register wiederherstellen
                pop     dpl
                pop     dph
                ret

                ; Folgezustnde bei     ; Zustands- ;Fehler
                ;      IR=0  IR=1       ;  nummer
_stblRemote:    ; Pausenerkennung
                db      0, 1            ; Zustand 0
                db      0, 2            ; Zustand 1
                db      0, 3            ; Zustand 2
                db      0, 4            ; Zustand 3
                db      0, 5            ; Zustand 4
                db      0, 6            ; Zustand 5
                db      0, 7            ; Zustand 6
                db      0, 8            ; Zustand 7
                db      0, 9            ; Zustand 8
                db      0, 10           ; Zustand 9
                db      0, 11           ; Zustand 10
                db      0, 12           ; Zustand 11
                db      0, 13           ; Zustand 12
                db      0, 14           ; Zustand 13
                db      0, 15           ; Zustand 14
                db      0, 16           ; Zustand 15
                db      0, 17           ; Zustand 16
                db      0, 18           ; Zustand 17
                db      0, 19           ; Zustand 18
                db      0, 20           ; Zustand 19
                db      21, 20          ; Zustand 20

                ; Startsequenz-Erkennung
                db      22, 0           ; Zustand 21  F
                db      23, 0           ; Zustand 22  F
                db      24, 26          ; Zustand 23
                db      25, 26          ; Zustand 24
                db      0, 26           ; Zustand 25  F
                db      0, 27           ; Zustand 26  F
                db      0, 28           ; Zustand 27  F
                db      31, 29          ; Zustand 28
                db      31, 30          ; Zustand 29
                db      31, 0           ; Zustand 30  F
                db      32, 0           ; Zustand 31  F
                db      33, 0           ; Zustand 32  F
                db      34, 35          ; Zustand 33

                ; Routing
                db      43, 35          ; Zustand 34

                ; Erkennung eines '1'-Bits
                db      43, 36          ; Zustand 35
                db      0, 37           ; Zustand 36  F
                db      40, 38          ; Zustand 37
                db      40, 39          ; Zustand 38
                db      40, 0           ; Zustand 39  F
                db      41, 0           ; Zustand 40  F
                db      42, 0           ; Zustand 41  F
                db      34, 35          ; Zustand 42

                ; Erkennung eines '0'-Bits
                db      44, 35          ; Zustand 43
                db      45, 0           ; Zustand 44  F
                db      46, 48          ; Zustand 45
                db      47, 48          ; Zustand 46
                db      0, 48           ; Zustand 47  F
                db      0, 49           ; Zustand 48  F
                db      0, 50           ; Zustand 49  F
                db      43, 34          ; Zustand 50
