
;
;    Mecrisp - A native code Forth implementation for MSP430 microcontrollers
;    Copyright (C) 2011  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/>.
;

; Hier sind Routinen drin, um Interruptdefinitionen anlegen zu können. 

;------------------------------------------------------------------------------
  Kapitelbirne_flash "--- Interrupts ---"  
;------------------------------------------------------------------------------

  ifdef 0
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, "?flash"
qflash:  ; Prüft, ob im Compile-Modus.
;------------------------------------------------------------------------------       
  tst &WritetoFlash
  jnz +
  pushda #Tokenpuffer
  call #schreibestringmitlaenge
  writeln " funktioniert nur im Flash."
  br #quit
+ ret  
  endif

;------------------------------------------------------------------------------
  Wortbirne Flag_immediate, ";irq"
                   ; Schließt eine Definition ab und macht sie sichtbar.
                   ; Sehr ähnlich wie das normale Definitionsende.
;------------------------------------------------------------------------------  
  call #qcomp

;  pushda #1300h
;  call #qpairs ; Strukturerkennung !!

  call #pruefestackvergleich
  clr &state ; false-Flag in State legen --> Execute-Modus
  pushda #1300h ; Code für reti
  call #komma   ; reti einkompilieren
  br #smudge
  ;call #smudge
  ;ret
  
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, ":irq"
                   ; Holt vom Eingabepuffer einen neuen Namen und
                   ; eröffnet eine Colon-Definition, die mit reti abgeschlossen werden muss.
;------------------------------------------------------------------------------    
  call #definitionsanfang ; Ganz normal beginnen
 
; pushda #1300h  ; Strukturerkennung

  pushda #1202h ; Code für push sr 
  br #komma
;  call #komma   ; push sr einkompilieren
;  ret
  
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, "setirq"
                   ; Schreibt ein Wort an der angegebenen Adresse in die Interrupttabelle.
                   ; ( Adresse -- ) Aufruf: hex fff4 setirq watchdog_irq
;------------------------------------------------------------------------------ 
;  call #qflash ; Niemals ein Wort im Ram in die IRQ-Tabelle brennen ;-)
  ; Suche nach dem angegebenen Wort.
  ; ( Adresse )
  call #token
  call #wortsuche
  ; ( Adresse Einsprung|0 Flags )
  tst 2(r4) ; Wort gefunden ?
  jnz +
;  pushda #Tokenpuffer
;  call #schreibestringmitlaenge
;  writeln " nicht gefunden."
  br #quit ; Habe noch das Ergebnis der Wortsuche auf dem Datenstack, aber Quit löscht Stacks.

+ ; ( Adresse Einsprungadresse Flags )
  drop ; Flags sind egal
  ; ( Adresse Einsprungadresse )
  incd @r4 ; Am Anfang des Wortes ist das push sr. Beim echten IRQ ist das schon geschehen.
  swap
  br #flashstore
;  call #flashstore
;  ret

  ; Mit all den Proben 242 Bytes.
  ; Ohne Proben: 116 Bytes.

;------------------------------------------------------------------------------
  Kapitelbirne "--- Interrupts ---"  
;------------------------------------------------------------------------------