;
;    Wuseldraht - Scurry Wire - A field bus
;    Copyright (C) 2013  Matthias Koch
;
;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;    (at your option) any later version.
;
;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.
;
;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
;
 
;------------------------------------------------------------------------------
Busfehler: ; Bei einem Busfehler wird die Leitung elektrisch losgelassen.
  call #entgleisen ; Vielleicht wäre das auch gut, damit ein einzelner Knoten
                   ; nicht den Bus mit N's überflutet ?
;------------------------------------------------------------------------------
Suche_N:   ; Dies ist eine Endlosschleife, wuselbit springt bei einem N heraus.

  call #wuselbit_lesen
  jmp Suche_N

;------------------------------------------------------------------------------  
Finde_N:   ; Ein N in der Leitung gesehen !
  
  ; Adressvergleich vorbereiten !
  mov #Adresslaenge, r10
  mov #Adresse,      r11
    
  ; Prüfe, welche Art unseres Dienstes gewünscht wird.
  call #wuselbit_lesen
  jc Erste_Eins
;------------------------------------------------------------------------------
; Adressvergleich: N0
- rlc r11
  jc +
  call #wuselbit_lesen
  jc suche_n
  jmp ++
+ call #wuselbit_lesen
  jnc suche_n    
+ dec r10
  jnz -          
  jmp Auserwaehlt
;------------------------------------------------------------------------------            
Erste_Eins:             ; Sonderfunktionen.
  call #wuselbit_lesen  ; Gleich noch eine Eins ?
  jc Auserwaehlt        ; Wenn ja: Das ist der Aufrug an Alle: N11
;------------------------------------------------------------------------------            
  ; N10 - Adressuche. Ein Adressvergleich mit Rückmeldung.
- rlc r11
  jc +  
    clrc                        ; Aktuelles Adressbit (false) wahr
    call #wuselbit_senden
    setc                        ; Aktuelles Adressbit (false) invertiert
    call #wuselbit_senden
    call #wuselbit_lesen        ; Wie soll es weitergehen ?
    jc suche_n
  jmp ++
+   setc                        ; Aktuelles Adressbit (true) wahr
    call #wuselbit_senden
    clrc                        ; Aktuelles Adressbit (true) invertiert
    call #wuselbit_senden
    call #wuselbit_lesen
    jnc suche_n    
+ dec r10
  jnz -          
;------------------------------------------------------------------------------
Auserwaehlt:         ; Ich wurde auserwählt !
  setc                      ; Melde mich glücklich
  call #wuselbit_senden     ; zur Stelle
    
  ; call #wuselbit_lesen      ; Dies ist wichtig, damit die Suche auch gleich mit N weiterlaufen kann !
  ; Wenn nur Sendeword benutzt wird, ist das erste wieder eine Bit-Leseoperation.
  ; Kann dies also für das Such-N benutzen.
  
  ; Tue etwas gescheites !    
