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

; Logikfunktionen

;------------------------------------------------------------------------------
  Kapitelbirne_flash "--- Logik ---"  
;------------------------------------------------------------------------------ 

;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_faltbar_1, "><" ; Swap Bytes.
  swpb @r4
  ret

; : rshift ( x u -- x ) ( Schiebt ein Bitmuster um die angegene Anzahl von Stellen nach Rechts. )
;   ?dup if 16 min 1 do shr loop then  ;

; : lshift ( x u -- x ) ( Schiebt ein Bitmuster um die angegene Anzahl von Stellen nach Links. )
;   ?dup if 16 min 1 do shl loop then  ;

  ; Probe auf >=16 --> Ergebnis 0  
  ; Null erreicht ? Schieben, erniedrigen, nochmal.

;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar|Flag_faltbar_2, "rshift" ; ( x u -- x ) Schiebt x um u Stellen nach rechts

  push r10
  popda r10 ; Hole den Zähler
  inc r10   ; Um einen vergrößern, damit ich den Test weiter unten benutzen kann.

  cmp #17, r10 ; 16 (+ 1) Schiebezyklen leeren die Zelle.
  jlo +
    clr @r4
    jmp ++
 
- clrc
  rrc @r4
+ dec r10  ; Hier ist der Einsprung am Anfang ! Benutze dies auch gleich als Probe.
  jnz -

+ pop r10
  ret

;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar|Flag_faltbar_2, "lshift" ; ( x u -- x ) Schiebt x um u Stellen nach links

  push r10
  popda r10 ; Hole den Zähler
  inc r10   ; Um einen vergrößern, damit ich den Test weiter unten benutzen kann.

  cmp #17, r10 ; 16 (+ 1) Schiebezyklen leeren die Zelle.
  jlo +
    clr @r4
    jmp ++
 
- rla @r4
+ dec r10  ; Hier ist der Einsprung am Anfang ! Benutze dies auch gleich als Probe.
  jnz -

+ pop r10
  ret

;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_faltbar_1, "shr"
  clrc
  rrc @r4
  ret
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_faltbar_1, "shl"
  rla @r4
  ret    
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_opcodierbar_rechenlogik, "bic" ; Könnte es auch andnot nennen. 
  bic @r4+, 0(r4)
  ret    
  .word 0c0b4h ; Opcode ! bic #Konstante, @r4
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_faltbar_1, "not"
  inv @r4
  ret    

;------------------------------------------------------------------------------
;  Wortbirne Flag_sichtbar_inline|Flag_faltbar_1, "invert" ; Einfach nur ein anderer Name für not
;  inv @r4
;  ret 
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_opcodierbar_rechenlogik, "xor"
  xor @r4+, 0(r4)
  ret    
  .word 0e0b4h ; Opcode ! xor #Konstante, @r4
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_opcodierbar_rechenlogik, "or"
  bis @r4+, 0(r4)
  ret    
  .word 0d0b4h ; Opcode ! bis #Konstante, @r4
    
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar_inline|Flag_opcodierbar_rechenlogik, "and"
  and @r4+, 0(r4)
  ret
  .word 0f0b4h ; Opcode ! and #Konstante, @r4

  ifdef 0
;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar|Flag_faltbar_0, "false"
false_vektor:
;------------------------------------------------------------------------------
  pushda #0
  ret

;------------------------------------------------------------------------------
  Wortbirne Flag_sichtbar|Flag_faltbar_0, "true"
true_vektor:
;------------------------------------------------------------------------------
  pushda #-1
  ret
  endif

;------------------------------------------------------------------------------
  Kapitelbirne "--- Logik ---"  
;------------------------------------------------------------------------------    
 
