% Content-encoding: UTF-8
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage{multicol}
% \usepackage{babel}
\usepackage{xspace}
\setcounter{secnumdepth}{0}
\setcounter{tocdepth}{0}
\usepackage{german}

%\newcommand{\code}[1]{\texttt{#1}}
%\newcommand{\ret}{\textsf{$<$ret$>$}\xspace}
%\newcommand{\ret}{$\hookleftarrow$\xspace}

\renewcommand{\reftextbefore}{auf der vorherigen Seite}
\renewcommand{\reftextfacebefore}{auf der gegenüberliegenden Seite}
\renewcommand{\reftextafter}{auf der nächsten Seite}
\renewcommand{\reftextfaceafter}{auf der gegenüberliegenden Seite}
\renewcommand{\reftextfaraway}[1]{auf Seite \pageref{#1}}
\renewcommand{\figurename}{Bild}

\title{4e4th auf dem TI--LaunchPad im MSP430G2553}
\ifx\shorttitle\undefined\else
\shorttitle{4e4th auf dem LaunchPad}
\fi
\author{M.Kalus}

\parskip4pt

\begin{document}

\maketitle

4E4th ist ein kleines Forth, das auf dem Texas--Instruments--LaunchPad abläuft. Es steckt in der MCU MSP430G2553. Du kommunizierst mit dem 4E4th mit Hilfe eines Zeilen--Editors. der über einen Terminal--Emulator betrieben wird. 4E4th basiert auf der MSP430--CamelForth--Version 0.3 von Brad Rodriguez, welches er für das TI--Tini430--Board mit dem MSP430F1611 geschrieben hatte. Es ist ein ANS--Forth, und belegt knapp 8K im FLASH der MSP430G2553--MCU (0xE000-0xFFFF). Weitere 8K (0xC000-0xDFFF) sind frei für eigene Experimente. 4E4th ist, wie das CamelForth auch, freie Software (GNU General Public License).

%Abbildung 1: LaunchPad
\begin{figure*}[b]
\begin{center}
\includegraphics[width=6.8cm]{2012-01/4e4th-LaunchPadBild}
\caption{\label{4e4th-LaunchPadBild}Das TI--LaunchPad mit Forth Inside}
\end{center}
\end{figure*}

\begin{multicols}{2}

\section{Das LaunchPad von TI}

Derzeit stark beworben wird das LaunchPad genannte Platinchen MSP-EXP430G2 von TI. Im Gegensatz zu seinem etwas größeren Bruder, dem MSP-EXP430FR mit dem FRAM, kostet das LaunchPad grad mal 4,30 US\$, ist also quasi geschenkt. Die Platine hat einen klassischen 20DIL--Sockel für die MCUs. Der MSP430G2553 steckt schon. Das LaunchPad hat auch den \textit{Emulation} genannten Teil an Bord, in dem die beiden Funktionen USB-serieller Wandler und BSL (boot strap loader) realisiert sind. Über den BSL wird die MCU mit einem Programm beladen, in unserem Falle mit dem 4e4th. Dieses kleine Forth funktioniert dann klassisch über den UART der MCU und die serielle Schnittstelle via USB am Terminal. Versorgt wird die Platine auch gleich über den USB. Sehr praktisch das Ganze --- einfach USB anstöpseln, fertig.

\vspace{-2ex}

\section{Making of 4e4th}

Die Schritte, um vom CamelForth zum 4e4th zu kommen, waren ähnlich wie beim Bruderchip mit dem FRAM. Aber weil die MSP430G553--MCU Flash als Hauptspeicher hat, waren andere Maßnahmen nötig, das Forth darin vernünftig handhabbar zu machen. Denn das Flash lässt sich nur dann zellenweise beschreiben, wenn es \$FFFF ist, also erased, Bits können nur von H auf L gesetzt werden. Umkehren, also zurücksetzen auf \$FFFF, kann man es hingegen nur sektorenweise. Die Sektorgröße ist 256 Byte. So lässt sich das Forth--Dictionary wohl im Flash aufbauen, aber ein \texttt{FORGET} ist nicht möglich, und auch \texttt{MARKER} geht nur auf Flashsektorgrenzen. Darum gibt es ein \texttt{WIPE}, um das komplette User--Flash zurückzusetzen. Der Forth--Kern residiert schreibgeschützt im oberen Teil des Flash.

So musste auch sichergestellt werden, dass die User-Area im RAM und der Stand des Forth im User--Flash übereinstimmen. Und, da man nicht in den Forth--Kern im oberen Flash schreiben kann, muss die User-Area woanders hin gerettet werden können. Dafür gibt es das INFO-Flash in der MCU. Diese 32 Zellen kleinen Bereiche infoA bis infoD lassen sich einzeln löschen und wieder beschreiben und sind daher ideal dafür. Ein \texttt{SAVE} sichert die User--Area dorthin. Beim Booten kann dann anhand des \texttt{CRC}--Wertes aus dem User--Flash und der User--Area festgestellt werden, ob Übereinstimmung besteht. So kommt man nach einem Reset immer in den zuletzt gesicherten Zustand zurück. Über die 
User--Variable \texttt{APP} kann dabei ein Autostart erreicht werden. 

Das 4e4th selbst ist grad mal knapp über 7K klein, so dass 8K für eigene Experimente bleiben. Darin enthalten sind neben dem ANS core word set schon einige Worte für die Peripherie des LaunchPad. So lassen sich mit \texttt{SET} und \texttt{CLR} und \texttt{TOGGLE} einzelne Bits wortweise stellen, und mit \texttt{CSET CLCR} und \texttt{CTOGGLE} auch byteweise. Die beiden Ports \texttt{P1} und \texttt{P2} sind damit sehr einfach zu bedienen und damit auch die beiden LEDs auf dem Board. Es gibt die Abfrage des Tasters \texttt{S2?} und auch ein \texttt{AT-XY} und \texttt{PAGE} für VT-100--Terminals, so dass mit etlichen Experimenten sogleich losgelegt werden kann. Ein Programm, um zu morsen, ist damit ein Klacks.

Das 4e4th wird im forth-ev-wiki unterstützt. Wer LaunchPads haben will, wende sich an den Autor, es sind noch einige auf Lager. Aber immer mehr Händler haben es inzwischen auch im Sortiment. 

\end{multicols}

\section{Links}
\url{http://www.forth-ev.de/wiki/doku.php/projects:4e4th:start}\\
\url{http://www.4e4th.eu/}\\
\url{http://www.camelforth.com/}\\


\section{4e4th auf dem Launchpad}
\begin{quote}
\begin{large}
\begin{verbatim}
4E4th v0.34 Apr 15 2012|110001110 Cold
 ok
cr cr words cr cr

S2? S2 GREEN RED P3 P2 P1 UNUSED MEM MEMTOP MEMBOT CGET CTOGGLE CCLR CLR
CSET SET MS 1MS BIN PAGE AT-XY BELL .VER \ 2CONSTANT WIPE FACTORY COLD WARM
BOOT SAVE VALID? APPCRC ITHERE crc (crc ccrc .S DUMP U.R WORDS MARKER 
FLALIGNED NOOP ENVIRONMENT? DEPTH MOVE WITHIN LEAVE +LOOP LOOP ENDLOOP DO L>
>L REPEAT WHILE AGAIN UNTIL BEGIN ELSE THEN IF POSTPONE ['] ; : IMMEDIATE
REVEAL HIDE ] [ RECURSE DOES> (DOES>) CREATE <BUILDS HEADER ( [CHAR] CHAR ' 
ABORT" ?ABORT ABORT QUIT EVALUATE INTERPRET ?NUMBER >NUMBER ?SIGN DIGIT? 
LITERAL FIND IMMED? NFA>CFA NFA>LFA WORD >COUNTED /STRING SOURCE IC, I, 
IALLOT IHERE C, , ALLOT HERE HEX DECIMAL . U. SIGN #> #S # >DIGIT <# HOLD 
UD* UD/MOD IWORD ." IS" (S") (IS") TYPE ACCEPT UMAX UMIN SPACES SPACE CR 
COUNT 2OVER 2SWAP 2DUP 2DROP 2! 2@ MIN MAX */ */MOD MOD / /MOD * FM/MOD 
SM/REM M* DABS ?DNEGATE DNEGATE ABS ?NEGATE S>D APPU0 INFOB COR #INIT UINIT 
BL TIBSIZE TIB S0 R0 L0 PAD CAPS APP NEWEST IDP LP HP LATEST 'SOURCE DP STATE
BASE >IN U0 ,NONE !DEST ,DEST ,BRANCH ,EXIT !COLON ,JMP ,CALL ,CF !CF COMPILE,
>BODY CHARS CHAR+ CELLS CELL+ CELL ALIGNED ALIGN ZERO KEY? KEY EMIT N= S= SCAN
SKIP I->D CMOVE> CMOVE FILL UM/MOD UM* UNLOOP J I (+loop) (loop) (do) ?branch
branch U> U< > < <> = 0< 0= RSHIFT LSHIFT 2/ 2* >< 1- 1+ NEGATE INVERT XOR OR
AND - M+ +! + D->I IC! I! FLERASE C! C@ ! @ TUCK RP! RP@ SP! SP@ R@ R> >R NIP
ROT OVER SWAP DROP ?DUP DUP USER CONSTANT VARIABLE EXIT lit EXECUTE 

ok
green .s <2> 64 33 ok 
green ctoggle ( grüne LED ändern ) ok 
red cclr ( rote LED hell ) ok 
green cset ( grüne LED dunkel ) ok 
s2? . 0 ( Taster gedrückt? ) ok
ok
: combined ( mask1 addr1 mask2 addr2 -- mask3 addr3 ) 
   rot over - Abort" not the same address" 
   rot rot or swap ; ok
ok     
: blink ( -- )
   BEGIN  s2? 0=  WHILE 100 ms  red green combined ctoggle  REPEAT ; ok 
ok
blink ( wildes Geblinke bis zum Drücken des Tasters ) ok
\end{verbatim}
\end{large}
\end{quote}

\end{document}

