\
\    Mecrisp-Across - A Forth cross compiler for small MSP430 microcontrollers
\    Copyright (C) 2016  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/>.
\


\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\  4. Teil: Konstanten, Variablen und Puffer definieren
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

\ -----------------------------------------------------------------------------
\  Konstanten
\ -----------------------------------------------------------------------------

: t-constant ( n -- ) \ Lege eine Definition an, die eigentlich nur ein Literal zurückgibt und anschließend Faltbarkeit und Inline für diese Definition setzt.
  t:
  t-literal
  t-ret,  
  0 t-foldable
;

' t-constant t-prim: constant t-hostonly \ Kann so zwar keine "Konstenten kompilieren", aber das macht ja nichts - im Target gibt's sowieso keinen Parser.

\ -----------------------------------------------------------------------------
\  Variablen und Puffer
\ -----------------------------------------------------------------------------

: t-variable ( n -- )
  t:
  t-here 2 3 * cells +  \ Eine Adresse auf die kommende "Variablenstelle" anlegen
  t-literal
  t-ret,  
  dup t,       \ Initialisierungswert als ersten Variableninhalt setzen
    t-raminit  \ Vermerke den Initialisierungswert, der im Reset-Vektor geschrieben werden soll
  2 t-ramallot \ Markiere, dass diese Definition bei ihrer Kompilation RAM anfordert.
;

' t-variable t-prim: variable t-hostonly

\ Habe jetzt eine Variable definiert, die im Host ab dieser Adresse zu erreichen ist.
\ Sie muss ein besonderes Flag bekommen, das "ramallot"-Flag.


: cellsforbytes ( u -- u* ) 2 rshift 1 + ; \ Das gilt so streng genommen im ARM.

: t-buffer: ( bytes -- )
  2 umax \ Puffer müssen mindestens zwei Bytes reservieren, sonst gibt's Probleme mit der Ramallot-Logik

  t:
  t-here 2 3 * cells +  \ Eine Adresse auf die kommende "Variablenstelle" anlegen
  t-literal
  t-ret,
  
  dup cellsforbytes 0 ?do 0 t, loop 
  even t-ramallot \ Markiere, dass diese Definition bei ihrer Kompilation RAM anfordert. Vielfache von 2 nötig.
;

' t-buffer: t-prim: buffer: t-hostonly
 
