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

; Proben und Fehlersuche

;------------------------------------------------------------------------------
setzestackvergleich:  ; Setzt den Füllstand des Datenstacks zur Probe.
;------------------------------------------------------------------------------       
  mov r4, &Datenstacksicherung
  ret
     
;------------------------------------------------------------------------------
pruefestackvergleich:  ; Prüft den Füllstand des Datenstacks.
;------------------------------------------------------------------------------
  cmp r4, &Datenstacksicherung
  je retsprung
  writeln " Stack not balanced."
  jmp quit

;------------------------------------------------------------------------------
  Wortbirne Flag_visible, "?comp"
qcomp:  ; Prüft, ob im Compile-Modus.
;------------------------------------------------------------------------------       
  tst &state
  jne retsprung
  pushda #Eingabepuffer
  call #schreibestringmitlaenge
  writeln " is compile-only"
  jmp quit

;------------------------------------------------------------------------------
  Wortbirne Flag_visible, "?stack"
qstacks:  ; Prüft, ob die Stacks noch innerhalb ihrer Grenzen sind.
;------------------------------------------------------------------------------  
  ; Unter- und Überläufe der Stacks sollten hier abgefangen werden.

  ; Datenstack.
  cmp #datenstackanfang+2, r4
  jlo + ; Stacks fangen oben an und wachsen nach unten.
        ; Wenn die Adresse kleiner oder gleich der Anfangsadresse ist, ist alles okay.
  writeln " Stack underflow"
  jmp quit  
  
+ cmp #datenstackende, r4
  jhs + ; Solange der Stackzeiger oberhalb des Endes liegt, ist alles okay.  
  writeln " Stack overflow"
  jmp quit
  
  ifdef 0 ; Herausgenommen, da Returnstack-Fehler eigentlich immer zum Absturz führen.
+ ; Returnstack. Ich frage mich: Kann ich das sehen ? 
  ; Normalerweise ist die Verschachtelungstiefe unsichtbar, ich bemerke sie nur,
  ; wenn ein Rücksprung nicht klappt. Dann stürzt aber alles ab.
  cmp #returnstackanfang+2, sp
  jlo + ; Stacks fangen oben an und wachsen nach unten.
        ; Wenn die Adresse kleiner oder gleich der Anfangsadresse ist, ist alles okay.
  writeln " Returnstack underflow"
  jmp quit  
  
+ cmp #returnstackende, sp
  jhs + ; Solange der Stackzeiger oberhalb des Endes liegt, ist alles okay.  
  writeln " Returnstack overflow"
  jmp quit
  endif

retsprung:
+ ret
