\documentclass[11pt,a4paper]{article}
\usepackage[german]{babel}
%\usepackage{german}
\usepackage[utf8]{inputenc} % can use Umlauts now ü instead of "u
%\usepackage{lmodern} % better fonts
%\usepackage{pslatex} % use native PostScript fonts
%\usepackage{cm-super}

\usepackage{url} % \url{} \path{} with correct "hyphenation"

% \voffset-10mm
% \pagestyle{empty}
% \pagestyle{plain}
% \pagestyle{headings}
% \renewcommand{\baselinestretch}{1.08}
%\usepackage{xspace}
\parindent=0pt
%\newcommand{\amforth}{\texttt{amforth}}
%\newcommand{\zB}{z.\,B.\ }
\begin{document}

\title{Fort\emph{h}bildung}
\ifx\shorttitle\undefined\else
\shorttitle{Fort\emph{h}bildung}
\fi
\author{Erich Wälde, Martin Bitter, David Kühling, Carsten Strotmann}

\maketitle


\label{ch:forthbildung}

\begin{abstract}\itshape
  In den vergangenen Wochen waren einige Forth--Aktive unterwegs in Sachen
  \emph{Forth für alle}. Dazu boten der Brandenburger Linux-Infotag in
  Potsdam (5.11.) [\ref{ref:blit}], die OpenRheinRuhr in Oberhausen
  (12./13.11.) [\ref{ref:ORR}] sowie eine Einladung an die Hochschule in
  Augsburg (7.11.) [\ref{ref:hs-a}] hervorragende Gelegenheiten. In allen
  drei Workshops wurde die gleiche Aufgabe bearbeitet: Schreibe ein
  Programm, welches einen beliebigen Text als Morsecode ausgibt, via
  Piepser oder LED.
\end{abstract}

\begin{multicols}{2}

% --------------------------------------------------------------------
\section{Brandenburger Linux--Infotag 2011}


\parpic[l]{\includegraphics[width=0.2\textwidth]{2011-04/Forthbildung_BLIT_logo}}
Samstag Morgen um halb neun kamen Gido und ich an das Institut für
Informatik der Universität Potsdam, Campus Griebnitzsee. Die erste
Überraschung erwartete uns schon: Carstens Flieger fiel aus, also waren
wir am Vormittag erstmal nur zu zweit und Carsten war ganz umsonst so früh
aufgestanden.

Damit unser Stand ohne Carstens Forth--Poster nicht so kahl aussah,
puzzelten wir uns erstmal ein Ersatzposter aus A4--Ausdrucken zusammen.
Glücklicherweise hatte die BeLUG (Berlin Linux User Group) einen
Farb--Laserdrucker zum BLIT mitgebracht.

Ich hatte zur Standdekoration und Demonstration von Forth einen alten TI-92
[\ref{ref:ti92}] Taschenrechner mit installiertem Forth92
[\ref{ref:forth92}] am Stand (ein Uralt--Projekt aus meiner Schulzeit), und
dazu einen NanoNote aus der Neuzeit mit installiertem Gforth und der
Mandelbrot--Fraktal--Demo, wie in der VD 4/2010 \textit{Forth auf dem Ben
  NanoNote} beschrieben [\ref{ref:vd2010-04}]. Auf meinem Laptop lief die
ganze Zeit Gforth mit dem Schachprogramm Brainless [\ref{ref:brainless}],
welches eifrig gegen sich selbst Schach spielte. Es sollte zeigen, dass
Forth auch für rechenintensive Aufgaben geeignet ist; aber so ein normaler
Laptop war offenbar ganz und gar ungeeignet, irgenwelche Aufmerksamkeit auf
sich zu ziehen. Auf Gidos Forth--losem Rechner wurde noch schnell ein
Win32Forth [\ref{ref:win32forth}] installiert, aber leider blieb bis zum
Ende keine Zeit mehr, etwas Sinnvolles damit anzufangen.

Der Vormittag begann sehr ruhig mit gefühlt maximal 2--stelliger
Besucherzahl auf dem ganzen BLIT, eher 1--stellig am Forth--Stand.
Auffallend viele Besucher interessierten sich für Forth auf Controllern,
also Carstens Schiene, und mussten auf den Nachmittag vertröstet werden.

Carsten kam mit einer Kiste Arduinos, pünktlich eine halbe Stunde vor
Beginn seines 2--stündigen Forth--Workshops [\ref{ref:blit:ws}], der sehr
gut besucht war.

Nachmittags wurde es merklich voller, die meisten Besucher interessierten
sich nach wie vor für Carstens Arduinos. Am lebenden Exemplar führte er
später Besuchern vor, wie er einfach per Forth--Konsole ein paar LEDs
blinken lassen konnte --- sogar mit dem Multi--Tasker. Einige Besucher
(Studenten!) wollten ihren Augen kaum trauen, offenbar ist man ein derartig
einfaches Arbeiten in der Welt monströser,  sogenannter integrierter
Entwicklungsumgebungen mit \textsc{jtag}--Debugger nicht mehr gewohnt.

Auch (Noch--)Nicht--Programmierer wurden vom Forth--Stand angezogen. Sie
zeichneten sich dadurch aus, dass sie Forth gegenüber sehr offen waren und
das auch blieben, nachdem sie die Forth-Code--Beispiele auf dem Poster
betrachtet hatten.

Einem konnte ich auch schnell mal am TI--92 zeigen, wie diese \textit{interaktive}
Programmierung aussieht. Zu meiner Überraschung konnte er mir sogar folgen,
als wir ein kleines Miniprogramm an der Forth--Konsole zusammenbastelten.
Ausführung links nach rechts, wie man es eingibt, nur ein Datentyp (was ein
Datentyp ist, wäre wahrscheinlich sowieso schwer zu erklären gewesen) ---
mehr muss man ja eigentlich nicht wissen um nachzuvollziehen, was passiert.

Gegen Ende kam ich auch noch mit einigen der Organisatoren ins Gespräch.
Offenbar war der BLIT ehrenamtlich von Brandenburger und Berliner
Linux--User--Groups organisiert. Einer der Organisatoren (wahrscheinlich
von der Brandenburger Linux User Group [\ref{ref:bralug}]), packte
am Ende noch seinen Laptop aus, und zeigte mir ein Gforth--Programm, das er
geschrieben hatte, um Forth kennenzulernen: eine Implementierung von
Conways Game of Life [\ref{ref:life}]. Ich durfte auch mal durch den Quellcode
gucken, aber leider blieb keine Zeit, mir eine Kopie zu ziehen, denn wir
mussten uns langsam ans Aufräumen und Abbauen machen.

Alles in allem ein interessanter Tag. Fazit: Forth weckt Interesse und hat
einen erkennbaren Bekanntheitsgrad, zumindest in Linux--Geek/Nerd--Kreisen.
\hfill David



\section{OpenRheinRuhr}


\parpic[l]{\includegraphics[width=0.2\textwidth]{2011-04/Forthbildung_ORR_logo}}
Kurzfristig sprang ich als Helfer bei der Standbetreuung der
Forth--Gesellschaft e.V.\ bei der OpenRheinRuhr [\ref{ref:ORR}] in
Oberhausen ein. 
Ich war sogar pünktlich! Abbildung \ref{pic:blit:ausweis} zeigt mein erstes
Namensschild. 
Netterweise bekam ich einen verbesserten Ausweis. Am Stand wurde ich sofort
von Carsten und Gido gefragt, ob ich einen Rechner dabei hätte. Hatte ich
nicht! Carsten hatte zwar einen, benötigte den aber für seinen Workshop
\emph{Arduino --- Ausbruch aus dem Compile--Upload--Debug--Kreislauf}
[\ref{ref:ORR:ws}] und verschwand. Gido lernte an seinem Rechner
(Fernstudium), Carstens Frau las papierne (!) Literatur. Ich lehnte mich
zurück und dachte: \textit{Mist\ldots hätte ich mir doch was zu arbeiten
  mitgebracht!} Ich befürchtete ernsthaft Langeweile. Es kam anders.

\begin{figure}
  \centering
  \includegraphics[width=0.9\textwidth]{2011-04/Bitter_OpenRheinRuhr_Ausweis}
  \caption{Manchmal fühle ich mich wie ein Holzfäller.}\label{pic:blit:ausweis}
\end{figure}


Carsten hat ein schönes, sehr gut lesbares Textposter drucken lassen, das
von einigen Menschen gelesen wurde. Blickkontakt --- \textit{Hast Du
  Fragen?} Und es ging los! Eine junge Dame: \textit{Jahrelang begleite ich
  meinen Liebsten zu Opensource--Veranstaltungen, aber das hier ist das
  erste Programm, bei dem ich etwas verstehe. Dass hier eine Waschmaschine
  gesteuert wird, verstehe sogar ich.} 20 Minuten über die
\textit{Einfachheit} von Forth geredet. Wie die Zeit doch verfliegt! Der
nächste Besucher hatte Zeit und Lust, sich die Sprache erklären zu lassen,
Beispiele zu verfolgen und über Low--Level und High--Level zu diskutieren. Er
\textit{verquatscht} sich sogar und kommt zu seinem Termin zu spät.

Dann jemand, der Forth aus seiner Jugend kennt und es toll findet, dass es
immer noch Leute gibt, die sich damit beschäftigen. Danach ein Fachmann,
der über Sicherheitsaspekte diskutiert. Ein Compiler bei anderen Sprachen
fängt jede Menge Fehler ab. Das macht doch Programme sicherer! Diskussion
darüber, dass Sicherheit beim Codieren vom Programmierer abhängt. Zwei
Menschen, die es einfach nicht fassen können, dass eine Sprache ohne
Variablentypen und Typwandlung auskommt. Schnell mit

\texttt{variablenname  @ dup . dup emit .bin} 

gezeigt, dass es von meiner Entscheidung abhängt, was was ist. Langsames
Begreifen in den Augen --– ein Hauch von Freiheit! Hilfreich ist, dass
Carsten mir seinen NanoNote dagelassen hat. Zum einen läuft darauf Gforth,
zum anderen ist das Ding ein Blickfang. Man muss nicht wie früher
aufpassen, dass man keinen Kaffee über die Tastatur schüttet, sondern man
muss aufpassen, dass man das Ding nicht komplett in der Kaffeetasse
versenkt. Falls es ein nächstes Mal gibt, werde ich mir das NanoNote wieder
ausleihen und ein Arduinoboard dranhängen. Vielleicht auch einen kleinen
Roboter?

Der Workshop war mit zeitweise 24 Teilnehmern bestens belegt.
Die 3.5 Stunden waren genug, um das erste Morseprogramm im Detail zu
besprechen. Die Teilnehmer waren sehr aufmerksam und stellten eine Menge
guter Fragen.

Kurz vor 14\,h wird es voll am Stand. Carsten kommt vom Workshop zurück und
jede Menge Leute folgen ihm zum Stand. Einige Arduino-Boards wechseln den
Besitzer. Einer kommt vorbei, sieht die mitgebrachten Exemplare der Vierten
Dimension und erkennt: \textit{Das ist mit \LaTeX\ gemacht!} Später zeige
ich die Vierte Dimension zwei Betreuern des \textsc{dante}--Projekts
(Deutsche Anwendervereinigung \TeX). Große Freude in ihren Gesichtern, ein
Beispiel für \LaTeX\ in Aktion zu sehen. Besonders freut der Wechsel von
ein-- und zweispaltigem Satz. Auch sie sagen: \textit{Wir erkennen \LaTeX\
  an den Schrifttypen.} (Anmerkung der Redaktion: Wir benutzen zum Satz der
Vierten Dimension sogar eine abgewandelte Version der \LaTeX--Makros, mit
denen die \textsc{dante}--Zeitschrift \textit{Die \TeX nische Komödie}
hergestellt wird --- ohne das Konzept Free Software wäre das nicht möglich!)

Beim fünften Gespräch merke ich, dass sich einige meiner Argumente
wiederholen:
\begin{itemize} 
\item Forth ist anfangs leicht zu lernen, man kann sich steigern bis zu
  hochkomplexen Anwendungen.
\item Forth läuft auf Raumsonden (Near), Gepäcksystemen (Dubai),
  Überwachungssystemen (Atomenergieüberwachung), Prüfständen.
\item Unternehmerargumente: Forth passt in einen Mikroprozessor und
  dokumentiert sich selbst. Das erspart (erleichtert) Versionspflege. Die
  Hardware vor Ort hat eben ihr eigenes System an Bord. Forth macht meine
  Entwicklungsabteilung so schnell, dass ich den Mitbewerbern mindestens
  ein halbes Jahr voraus bin. Patente kann ich mir deshalb sparen.
\item Für mich persönlich hat Forth fast Suchtcharakter, es macht einfach
  Spaß.
\end{itemize}

Gegen 15\,h muss Carsten weg nach Rom. Gegen 16\,h fährt Gido zurück nach
Leipzig. Schade. Gido wollte mir doch noch etwas über Bayes--Filter zeigen
--– keine Zeit gehabt! Kurz nach 17\,h endet der offizielle Teil der
Veranstaltung. Ich packe meine Sachen und das, was Carsten dagelassen hat,
und fahre. Fazit: Mit einer Handvoll Menschen über Forth geredet, ein
NanoNote kennen gelernt und absolut keine Pause gehabt. Von Langeweile weit
und breit keine Spur!\hfill Martin


\section{Hochschule Augsburg}

\parpic[l]{\includegraphics[width=0.2\textwidth]{2011-04/Forthbildung_HSAugsburg_logo}}
Auf dem Vintage Computer Festival Europe [\ref{ref:vcfe}] in München traf
Carsten auf Prof.\ Dr.--Ing.\ Thorsten Schöler von der Hochschule Augsburg
[\ref{ref:hs-a}]. Dieser hatte seine Nase in den
Forth--Benchmarking--Contest [\ref{ref:benchmark}] gesteckt und war so
begeistert, dass er beschloss, seine Studierenden mit Forth bekannt zu
machen. Und so nahm die Fort\emph{h}bildung ihren Lauf.

Am Sonntagabend reisten Carsten und ich aus getrennten Richtungen nach
Augsburg. Neben einem ordentlichen Abendessen (\textit{Wer nichts isst,
  soll auch nicht arbeiten!}) haben wir die vom BLIT kommenden
Arduino--Boards mit neuestem amforth (Version 4.6) [\ref{ref:amforth}] bespielt und getestet,
und viel und lange über Forth, die Welt und den ganzen Rest philosophiert.

Am Montagmorgen fuhren wir zur Hochschule, wo wir von Thorsten herzlich
empfangen wurden. Alles war vorbildlich organisiert: Raum, Projektor,
Strom, Kaffee --- keine unerwarteten Klimmzüge in letzter Minute. Lediglich
eine Tafel mit Kreide gab es in diesem Raum nicht --- also auch keine
Kreidestauberinnerungen. 

Gegen 10\,h kamen die Studierenden mit erwartungsvollen Gesichtern und
machten sich an den Tischen breit. Neben Thorsten hatten sich 12
Studierende der Fachrichtungen Informatik und Technische Informatik
eingefunden. Jeder erhielt ein paar Blätter und ein Exemplar der Vierten
Dimension (AVR Sonderheft), welche uns dankenswerterweise vom Vorstand
zugesandt worden waren. Dazu verteilten wir die inzwischen wohlbekannten
Arduino--\textit{Duemilanove}--Platinen [\ref{ref:duemilanove}] mit dem
knallroten Danger--Shield [\ref{ref:dangershield}] und USB--Kabel. Ein
USB--Stick machte die Runde. Jeder erhielt ein Archiv mit amforth-4.6
[\ref{ref:amforth}], den verwendeten Demo--Programmen und einigen,
nützlichen Progrämmchen und Dateien. Dann konnte es losgehen.

Wir stellten kurz uns selbst vor, dann die Sprache Forth und wo sie
herkommt. Als Nächstes zeigte ich mein Lieblingsthema: \emph{Interaktiv}
auf dem Kontroller rumfuhrwerken und mit den LEDs blinzeln. Das war der
richtige Zeitpunkt, um alle mitgebrachten Notebooks mit den Arduinos zu
verbinden. Es wurden serielle Konsolen (minicom, screen) und
USB--RS232--Treiber von FTDI [\ref{ref:ftdi}] installiert, die Information
von \texttt{8N1, none} enträtselt und Reset gedrückt. Nur die Sache mit der
unwilligen Korrekturtaste (backspace) in screen wurde nicht
gelöst\footnote{Ctrl-h funktioniert.}. Am Ende bekamen alle den ersehnten
\texttt{ok}--Prompt zu sehen.

Als Übung zum Warmwerden und Mittippen führten wir die Benutzung des Stacks
vor: \texttt{dup}, \texttt{drop}, \texttt{over}, \texttt{rot}, \texttt{.s},
\texttt{.}, das Wort Stack--Effekt und eine unbekümmerte Heiterkeit machten
die Runde. Merke: die Stack--Effekt--Kommentare sehen zwar aus wie eine
Argumentliste, sind aber keine!

Die zweite Übung galt den (schon aufgespielten) Worten \texttt{portpin:},
\texttt{pin\_output}, \texttt{high} und \texttt{low}. Damit lässt es sich
prächtig mit den beiden LEDs blinken. Mit Hilfe von \texttt{ms} und ein
paar neu definierten Worten lässt es sich nicht nur blinken, sondern
auch piepsen --- der Lärm und die Heiterkeit stiegen um ein paar Dezibel.

Wir hatten eine Aufgabe mitgebracht: Schreibe ein Programm, welches einen
Text als Morsecode ausgibt, piepsend oder blinkend. Das Problem kann sehr
schön vom kleinen her gelöst und in übersichtliche Funktionen zerlegt
werden. Morsezeichen bestehen aus langen und kurzen Zeichen (Strich und
Punkt), kurzen und langen Pausen.

{\small
\begin{verbatim}
\ 2 ms T_period =^= 500 Hz
: buzz ( cycles -- )
  0 ?do bz low  1ms bz high 1ms loop
;
: gap  ( cycles -- )
  0 ?do bz high 1ms bz high 1ms loop
;
\end{verbatim}
}

Dass man eine Pause (\texttt{gap}) so umständlich gestaltet, habe ich damit begründet, dass
ich damit eben genau gleich lange Zeichen und Pausen generieren kann. Und
ganz klar kann man das auch anders lösen. Kurze und lange Zeichen/Pausen
werden durch unterschiedliche Parameter erzeugt.


Um ein weiteres Forth--Konzept zu demonstrieren, führten wir vor, dass man
den Namen einer Funktion gar nicht braucht, wenn man die Adresse der
\textit{Einsprungadresse} XT und das Wort \texttt{execute} kennt. Gepaart
mit \texttt{Edefer} entstanden zwei Worte, die zur Laufzeit zwischen
Blinken und Piepsen umschalten können:

{\small
\begin{verbatim}
Edefer transmit
: piepser   ['] buzz  is transmit ;
: blinker   ['] blink is transmit ;
\end{verbatim}
} 

Es zeigte sich aber, dass Blinken zu langweilig ist. Piepsen blieb
verbreitet. Die Funktionen für kurze und lange Zeichen und Pausen werden
nach diesen Vorarbeiten sehr übersichtlich:

{\small
\begin{verbatim}
decimal
: kurz    50 transmit 50 gap ;  \ Punkt
: lang   150 transmit 50 gap ;  \ Strich
: Zend   100 gap ;           \ Pause zwischen Zeichen
: Wend   300 gap ;           \ Pause zwischen Worten
\end{verbatim}
}

Solchermaßen ausgerüstet kann man Worte definieren, die einzelne Zeichen
ausgeben:

{\small
\begin{verbatim}
: _S  kurz kurz kurz Zend ;
: _O  lang lang lang Zend ;
\end{verbatim}
} 

Allerdings ist das Definieren aller Zeichen und das Ausgeben eines
beliebigen Textes sehr umständlich. Bequemere Lösungen sind erwünscht.
Ungefähr zu dieser Zeit sind wir auch in die Mensa essen gegangen. Für mich
ein etwas nostalgischer Moment ca.\ 20 Jahre nach dem letzten Mensabesuch.


Ein weiterer Baustein, um die Aufgabe mit dem Morsen zu lösen, ist das Wort
\texttt{emit}. Wir argumentieren, dass wir am \texttt{ok}--Prompt gerne so
etwas schreiben wollen:
{\small
\begin{verbatim}
> morse s" hier kommt das sos" type endmorse
 ok
\end{verbatim}
}
Und dann soll alles richtig funktionieren. Den Rest der Zeit verbrachten
wir damit, eine bessere Repräsentation der Daten (einzelner Morsecode für
ein Zeichen) und eine schlaue Funktion \texttt{morseemit} zu produzieren. 

Die eine Lösung besteht aus einer Tabelle, deren Index (0--255) dem
ASCII--Wert des zu übertragenden Zeichens entspricht. Der Wert zu diesem
Index ist entweder null (nichts zu tun) oder enthält das XT des Wortes (2
Byte), welches dieses eine Zeichen überträgt. Die Werte der Tabelle müssen
also vorher ordentlich gelöscht werden, alle Worte, die ein Zeichen
ausgeben, müssen ebenfalls generiert werden. Erst definiert man für jedes
Morsezeichen ein Wort:

{\small
\begin{verbatim}
: _A  kurz lang           Zend ;
: _B  lang kurz kurz kurz Zend ;
: _C  lang kurz lang kurz Zend ;
...
\end{verbatim}
}

Dann erstellt man die Tabelle, löscht ordentlich den Inhalt, und füllt die
Tabelle unter Verwendung des Hilfswortes \texttt{>mtable}. Das Leerzeichen
wird als Wortendepause befüllt.

{\small
\begin{verbatim}
variable mtable 256 2 * allot

mtable 256 2 * erase

: >mtable ( xt c -- )
  2 * mtable + !
;

\ Tabelle zur Kompilierzeit fuellen
' _A char a >mtable
' _B char b >mtable
' _C char c >mtable
...
' Wend   bl >mtable
\end{verbatim}
}

\texttt{morseemit} holt also den Wert aus der
Tabelle und ruft damit \texttt{execute} auf.

{\small
\begin{verbatim}
variable o-emit \ XT vom normalen "emit"
: morseemit ( key -- )
  \ altes emit ausfuehren
  dup o-emit @ execute
  \ Argument auf 0-255 begrenzen
  255 and
  \ XT aus Tabelle lesen
  2 * mtable + @
  \ XT > 0 ?
  dup if
    \ ausfuehren
    execute
  else
    \ sonst wegwerfen
    drop
  then
;
\end{verbatim}
}

Testen kann man diese Worte, indem man beliebige Zeichen mit
\texttt{morseemit} ausgibt:

{\small
\begin{verbatim}
> char s morseemit  char o morseemit
...
\end{verbatim}
}



Die andere Lösung besteht aus einer ähnlichen Tabelle. Die Bedeutung des
Indexes ist gleich, der Wert ist aber eine gepackte Information: 3 Bit
enthalten die Anzahl der Morsezeichen (Punkt oder Strich), die übrigen 5
Bit enthalten Null für Punkt und Eins für Strich. Diese Tabelle hat nur ein
Byte pro Eintrag und ist damit nur noch halb so groß. \texttt{morseemit} holt
den Wert aus der Tabelle, entpackt ihn und ruft in einer Schleife die
Funktionen \texttt{kurz} und \texttt{lang} auf, und spendiert eine
\texttt{Zend}--Pause am Ende. Die Werte der Tabelle müssen hier ebenso
aufgebaut und gepackt werden, aber wir sparen alle Worte, die einen
einzelnen Morsecode ausgeben.

Die Tabelle wird angelegt und gelöscht. Zwei Worte \texttt{pack} und
\texttt{unpack} zaubern Länge und Code Bits zusammen und wieder
auseinander. Danach wird die Tabelle gefüllt.

{\small
\begin{verbatim}
variable mtable 256 allot
mtable 256 erase

: >mtable ( gepackter-morsecode c -- )
  mtable + c!
;

\ Hilfsworte zum Ent-/Packen von Morse Code
: pack ( #zeichen code -- pcode )
  3 lshift swap 7 and or
;

: unpack ( pcode -- #zeichen code )
  dup 7 and swap 3 rshift 
;

\ Zahlenbasis auf "2" setzen
: binary ( -- ) 2 base ! ;

\ Tabelle zur Kompilierzeit fuellen
binary 00010  decimal 2 pack  char a >mtable
binary 00001  decimal 4 pack  char b >mtable
binary 01010  decimal 4 pack  char c >mtable
...
\end{verbatim}
}

\texttt{domorse} gibt ein einzelnes Morsezeichen aus inclusive der Pause
am Zeichenende. \texttt{morseemit} holt das gepackte Morsezeichen aus der
Tabelle und ruft dann \texttt{domorse} auf.

{\small
\begin{verbatim}
variable o-emit \ XT des Original "emit"
: domorse ( code #zeichen -- )
  \ Schleife Anzahl der Signale
  0 ?do
    dup           \ Kopie anlegen
    1 and         \ erstes Bit maskieren
    if            \ ist Bit gesetzt? dann
      lang        \   Strich
    else          \ sonst
      kurz        \   Punkt
    then          \
    \ verbleibende Bits nach rechts schieben
    2/
  loop
  drop            \ Argument loeschen
  Zend            \ Pause Zeichenende
;
: morseemit ( key -- )
  \ altes emit ausfuehren
  dup o-emit @ execute
  \ Argument auf 0-255 begrenzen
  255 and
  dup bl = if     \ Leerzeichen? dann
    Wend          \   Pause Wortende
  then

  mtable + c@     \ morse code holen
  unpack          \ entpacken
  domorse         \ Signale ausgeben
;
\end{verbatim}
}

Wenn das alles soweit funktioniert, dann kann man das auch in Aktion
erleben. Ein unbedachtes

{\small
\begin{verbatim}
piepser
' morseemit is emit
\end{verbatim}
}

sorgt dafür, dass alle Tastendrücke und Ausgaben des Kontrollers eifrig mit
Piepsen kommentiert werden, \verb|- - -   - . -| verkündet den \texttt{ok}--Prompt!

Nachtrag: Diese beiden Lösungen haben einen störenden Makel, denn die
mühselig aufgebaute Tabelle mit den Morse--Zeichen verschwindet ins
Daten--Nirwana, wenn der Strom unterbrochen wird. Das ist schade. Um die
Tabelle dauerhaft zu speichern, muss sie im Flash--Speicher abgelegt
werden. Die Worte \texttt{,} (Komma) und \texttt{@i} (fetch from
instruction memory) schreiben bzw.\ lesen 2\,Byte im Flash--Speicher. Eine
solche, etwas eingeschränkte Lösung findet der interessierte Leser auf dem
Webserver der Forth--Gesellschaft unter [\ref{ref:morse4}].


Die Zeit ging viel zu schnell herum. Um etwa 16\,h endete die
Veranstaltung. Mit einem kleinen Präsent (u.\,a.\ ein USB--Stick, der als
Flaschenöffner taugt!) wurden wir verabschiedet. Die Teilnehmer zogen
diskutierend und mit zufriedenem Grinsen von dannen. Wir sammelten unsere
Sachen wieder ein und beantworteten letzte Fragen. Einer fragte
tatsächlich, was er davon hätte, in die Forth--Gesellschaft einzutreten ---
wir hatten ganz listig Aufnahmeformulare in die Hefte gelegt. Meine
Antwort: \textit{Du bekommst das Heft auf Papier, es gibt einmal im Jahr
  eine Tagung und wenn Du willst, lernst Du Leute wie Carsten und mich
  kennen.}

Fazit: So eine Fort\textit{h}bildung ist anstrengend und etwas aufwändig.
Aber es macht eine Menge Spaß. Die Wissbegierde der Teilnehmer treibt
mich ständig voran. Antworten auf Fragen zu geben, bringt mich dazu, Dinge
nachzulesen und besser zu verstehen. Deswegen gilt unser Dank den
Teilnehmern, ohne die der Ausflug nach Augsburg wahrscheinlich nicht
stattgefunden hätte.

\end{multicols}



\section{Siehe auch}
\begin{enumerate}
\item \label{ref:blit}      \url{blit.org} \quad Brandenburger Linux--Infotag
\item \label{ref:blit:ws}   \url{http://www.blit.org/2011/zeitplan/events/151.de.html} Forth Workshop
\item \label{ref:ti92}      \url{en.wikipedia.org/wiki/TI-92_series}
\item \label{ref:forth92}   \url{sourceforge.net/projects/forth92}
\item \label{ref:vd2010-04} VD 2010/04 \url{forth-ev.de/filemgmt/visit.php?lid=337}
\item \label{ref:brainless} \url{sourceforge.net/projects/forth-brainless}
\item \label{ref:win32forth} \url{win32forth.sourceforge.net/}
\item \label{ref:bralug}    BraLUG \url{bralug.de}
\item \label{ref:life}      \url{de.wikipedia.org/wiki/Conways_Spiel_des_Lebens}

\item \label{ref:ORR}       \url{openrheinruhr.org} \quad Ein Pott voll Software
\item \label{ref:ORR:ws}    \url{http://programm.openrheinruhr.de/2011/track/Open Hardware/83.de.html} Forth Workshop
\item \label{ref:dante}     \url{dante.de} \quad Deutsche Anwendervereinigung \TeX

\item \label{ref:hs-a}      \url{hs-augsburg.de} \quad Hochschule Augsburg
\item \label{ref:vcfe}      \url{vcfe.org} \quad Vintage Computer Festival Europe
\item \label{ref:benchmark} \url{theultimatebenchmark.org}
\item \label{ref:duemilanove} \url{arduino.cc/en/Main/ArduinoBoardDuemilanove}
\item \label{ref:dangershield} \url{www.sparkfun.com/products/10428} Danger Shield
\item \label{ref:ftdi}      \url{ftdi-chip.com/}
\item \label{ref:amforth}   \url{amforth.sourceforge.net}
\item \label{ref:morse4}    \url{www.forth-ev.de/repos/vd/2011-04/Forthbildung/morse4.fs}
\end{enumerate}


\section{Listing}

\begin{quote}
  \begin{small}
    \begin{multicols}{2}
      \listinginput[1]{1}{2011-04/Forthbildung/base.fs}
      \listinginput[1]{1}{2011-04/Forthbildung/morse2.fs}
      \listinginput[1]{1}{2011-04/Forthbildung/morse3.fs}
    \end{multicols}
  \end{small}
\end{quote}

\vfill
\centerline{\includegraphics[width=0.75\textwidth]{2011-04/Forthbildung_usbstick}}
\vfill
\end{document}