;
;    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/>.
;

 cpu msp430 
 include "mspregister.asm"
 include "datastack.asm"
 
 ; Mein erster Wuseldraht-Knoten
 ; Entstanden am 22. August 2009
 
 ; Meine Blumentopfsensor-Messungen eingefügt am 30. August 2009
 
 ; Neu gelötet am sonnigen Sonntagmorgen, 4. Oktober 2009
 
 ; Als Ausprobierknoten für Wuseldraht umgebaut am 15. September 2013

 org 0F800h


;------------------------------------------------------------------------------
ResetStacks macro
              mov #0280h, sp ; Stackpointer setzen
              mov #0260h, r4 ; Pointer für den Datenstack setzen
            endm
;------------------------------------------------------------------------------
Wuselleitung equ 1 ; P1.0

Basiszeit equ 61 ; Basiszeit * 4 Takte bei 1 MHz. 
                 ; Hier also: 61 * 4 us = 244 us.
   
;Adresslaenge equ 3
;               ; 8765432187654321
;Adresse      equ 1010000000000000b ; Adresse muss in diesem Quelltext links ausgerichtet sein

  include "scurrywire.asm"
       
;------------------------------------------------------------------------------
; LED: Anode an P1.2 über Vorwiderstand 220 Ohm
;    Kathode an P1.3
;------------------------------------------------------------------------------

led_anode   equ 4
led_kathode equ 8
      
;------------------------------------------------------------------------------
Reset:      ; Hauptprogramm
;------------------------------------------------------------------------------

  ; grundsätzliche Initialisierung
  mov   #WDTPW+WDTHOLD, &WDTCTL   ; Watchdog aus
  ResetStacks

  mov #0FFFFh, r7 ; Ein bisschen warten, bis die Versorgungsspannung stabil ist.
- dec r7
  jnz -

  ; Ram-Speicher-Karte:
  ; 027F
  ;  |     32 Bytes, Hardwarestack, Pointer: r1/sp
  ; 0260

  ; 025F
  ;  |     32 Bytes, Datenstack, Pointer: r4
  ; 0240

  ; 023F
  ;  |     32 Bytes, frei
  ; 0220

  ; 021F
  ;  |     32 Bytes, ehemals Ringpuffer, in diesem Beispiel nicht verwendet
  ; 0200

  mov.b &CALBC1_1MHZ, &BCSCTL1   ; Set DCO
  mov.b &CALDCO_1MHZ, &DCOCTL    ;   to 1 MHz.  
  
 ; Initialisierung der Portpins

  clr.b &P1OUT ; Für die Led-Anschlüsse
  mov.b #Led_Anode+Led_Kathode, &P1DIR 
  
 ; Wuseldrahtknoten-Basis implementiert das ganze Protokoll und die Adressuche
  include "nodelogic.asm"
 ; Wenn ich hier ankomme, wurde ich adressiert und kann sofort loslegen.
  
  
; Läuft gleich von selbst in den Befehlsinterpreter hinein !
;------------------------------------------------------------------------------
Befehlsinterpreter:  ; Nimmt vom PC Aufgaben an - und macht sich sogleich an die Arbeit !
;------------------------------------------------------------------------------
  pushda #-1 ; Nichts zum Übertragen
  call #Sendeword ; Aber etwas holen !
  
  popda r10 ; Abgeholten Befehl in Register legen  
  ; und prüfen, was gerade gemeint sein könnte:
  
;------------------------------------------------------------------------------    
  
  cmp #0, r10  ; Led aus
  jne +
  bic.b #Led_Anode, &P1OUT
    
+ cmp #1, r10  ; Led an
  jne +  
  bis.b #Led_Anode, &P1OUT

;------------------------------------------------------------------------------
; Beispiele... Nur zum Ausprobieren.
;------------------------------------------------------------------------------

+ cmp #2, r10  ; c!
  jne +
    pushda #-1
    call #sendeword
    pushda #-1
    call #sendeword

    popda r7  ; Hole die Adresse
    mov.b @r4, @r7 ; Lege den gewünschten Inhalt hinein.
    drop
    
+ cmp #3, r10  ; !
  jne +  
    pushda #-1
    call #sendeword
    pushda #-1
    call #sendeword

    popda r7  ; Hole die Adresse
    popda @r7 ; und lege den gewünschten Inhalt hinein.

+ cmp #4, r10  ; c@
  jne +
    pushda #-1
    call #sendeword

    mov @r4, r7  ; Hole die Adresse
    mov.b @r7, r7 ; Hole den Inhalt der Adresse
    mov r7, @r4  ; Lege den addressierten Inhalt auf den Stack

    call #sendeword
    drop

+ cmp #5, r10  ; @
  jne +  
    pushda #-1
    call #sendeword

    mov @r4, r7  ; Hole die Adresse
    mov @r7, @r4 ; Lege den addressierten Inhalt auf den Stack

    call #sendeword
    drop

+ jmp Befehlsinterpreter ; Endlosschleife !  


;------------------------------------------------------------------------------
null_handler: ; Fängt unbenutzte Interrupts auf
;------------------------------------------------------------------------------
            reti

;------------------------------------------------------------------------------
;           Interruptvektoren des F2013
;------------------------------------------------------------------------------
 org 0FFE0h

  .word   null_handler         ; 01: 0FFE0  Unbelegt
  .word   null_handler         ; 02: 0FFE2  Unbelegt
  .word   null_handler         ; 03: 0FFE4  Port 1
  .word   null_handler         ; 04: 0FFE6  Port 2
  .word   null_handler         ; 05: 0FFE8  Unbelegt
  .word   null_handler         ; 06: 0FFEA  Für das Sammeln von Werten aus dem AD-Wandler: Temperatur und Vcc !
  .word   null_handler         ; 07: 0FFEC  Unbelegt
  .word   null_handler         ; 08: 0FFEE  Unbelegt
  .word   null_handler         ; 09: 0FFF0  Für den Überlauf-Interrupt in der Zeitnehmer-Routine.
  .word   null_handler         ; 10: 0FFF2  Für das Wecken nach einer Pause und den Taktlauscher
  .word   null_handler         ; 11: 0FFF4  Für die Zeitzählung
  .word   null_handler         ; 12: 0FFF6  Unbelegt
  .word   null_handler         ; 13: 0FFF8  Unbelegt
  .word   null_handler         ; 14: 0FFFA  Unbelegt
  .word   null_handler         ; 15: 0FFFC  NMI. Vorsichtshalber erstmal nicht rausgeführt.
  .word   Reset                ; 16: 0FFFE  Für den Start

end


; Wie ist dies in den Chip zu bekommen ?
; asl blumenknoten.asm && p2hex blumenknoten.p -r 0x0000-0xffff
; ecrire hex blumenknoten.hex  
