\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}