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

;------------------------------------------------------------------------------
  Kapitelbirne_flash "--- Proben und Fehlersuche ---"  
;------------------------------------------------------------------------------     
 

;------------------------------------------------------------------------------
;  Wortbirne Flag_sichtbar, "!stackbalance"
setzestackvergleich:  ; Setzt den Füllstand des Datenstacks zur Probe.
;------------------------------------------------------------------------------       
  mov r4, &Datenstacksicherung
  ret
     
;------------------------------------------------------------------------------
;  Wortbirne Flag_sichtbar, "?stackbalance"
pruefestackvergleich:  ; Prüft den Füllstand des Datenstacks.
;------------------------------------------------------------------------------
  cmp r4, &Datenstacksicherung
  je +
  ;writeln "Stack nicht ausbalanciert."
  writeln " Stack not balanced."
  br #quit
+ ret  
  
     
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, "?comp"
qcomp:  ; Prüft, ob im Compile-Modus.
;------------------------------------------------------------------------------       
  tst &state
  jne +
  pushda #Eingabepuffer ; Ehemals Stringpuffer
  call #schreibestringmitlaenge
  ; writeln " braucht den Compile-Modus."
  writeln " is compile-only"
  br #quit
+ ret     

  ifdef 0 ; Wurde bislang nie benutzt. Entfernt.
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, "?exec"
qexec:  ; Prüft, ob im Execute-Modus.
;------------------------------------------------------------------------------       
  tst &state
  je +
  pushda #Eingabepuffer ; Ehemals Stringpuffer
  call #schreibestringmitlaenge
  writeln " benötigt den Execute-Modus."
  br #quit
+ ret    
  endif 

;------------------------------------------------------------------------------
;  Wortbirne Flag_sichtbar, "?ramdict"
;qramdict:  ; Prüft, ob der Dictionaryzeiger noch im RAM ist.
;------------------------------------------------------------------------------
;  cmp #RamDictionaryEnde, &DictionaryPointer
;  jlo +  ; Solange der DictionaryPointer innerhalb des RAMs ist, ist alles okay.
;  writeln " Die Grenze des Ram-Dictionarys wurde überschritten !"
;  br #quit    
;+ ret


;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar, "?stack"
qstacks:  ; Prüft, ob die Stacks noch innerhalb ihrer Grenzen sind.
;------------------------------------------------------------------------------  
  ; Unter- und Überläufe der Stacks sollten hier abgefangen werden.
  ifdef 0 ; Nur mal zum Schauen, wie voll die Stacks so sind.
    push r10
    mov r4, r10
    write "Datenstack "
    writezahl r10
    writeln " im ram"
    pop r10
    
    write "Returnstack "
    writezahl sp
    writeln " im ram"    
    
    ret
  endif

  ; 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 "Datenstack-Unterlauf"
  writeln " Stack underflow"
  br #quit  
  
+ cmp #datenstackende, r4
  jhs + ; Solange der Stackzeiger oberhalb des Endes liegt, ist alles okay.  
  ;writeln "Datenstack-Überlauf"
  writeln " Stack overflow"
  br #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-Unterlauf"
  br #quit  
  
+ cmp #returnstackende, sp
  jhs + ; Solange der Stackzeiger oberhalb des Endes liegt, ist alles okay.  
  writeln " Returnstack-Überlauf"
  br #quit
  endif

+ ret

     
     
;------------------------------------------------------------------------------
  Kapitelbirne "--- Proben und Fehlersuche ---"  
;------------------------------------------------------------------------------     
 
