\documentclass[11pt,a4paper]{article} % save as utf-8-emacs-unix % language support \usepackage[german]{babel} %\usepackage{german} \usepackage[utf8]{inputenc} % can use Umlauts now ü instead of "u \usepackage{url} % \url{} \path{} with correct "hyphenation" %\usepackage{xspace} \parindent=0pt %\newcommand{\amforth}{\texttt{amforth}} %\newcommand{\zB}{z.\,B.\ } \begin{document} \title{Nachtrag: Morse4 repariert} %\ifx\shorttitle\undefined\else %\shorttitle{Funksensoren belauschen} %\fi \author{Erich Wälde} \maketitle %\begin{multicols}{2} % -------------------------------------------------------------------- %\section{Intro} %\label{sec:intro} \begin{abstract}\itshape Die in Heft 4/2011 der Vierten Dimension erwähnte vierte Variante des Morseprogramms war leider fehlerhaft. Hier eine korrigierte Version. \end{abstract} \begin{multicols}{2} % -------------------------------------------------------------------- %\section{Vorrede} In Heft 4/2011 der VD [\ref{Forthbildung}] wurden drei Versionen eines Morseprogramms vorgestellt, die Carsten und ich in den Fort\textit{h}bildungen verwendet hatten. Eine vierte Version, die die Zeichentabelle dauerhaft im Flashspeicher ablegt, hatte ich zwar erwähnt, war aber nur zum Herunterladen verfügbar. In der Zwischenzeit fand ich heraus, dass die Funktion \texttt{morseemit} zwei Fehler beinhaltet. Zum einen war die Behandlung des Leerzeichens fehlerhaft, und zum anderen funktionierte das folgende Programmschnippselchen nicht richtig: {\small \begin{verbatim} > : msg ." abs" cr ; ok > morse msg endmorse abs ok \end{verbatim} } Zwar wurden alle drei Zeichen auf der seriellen Konsole ausgegeben, aber \emph{gemorst} wurde nur das finale \texttt{s}. Sehr merkwürdig. \section{Fehlersuche} Diverse Variationen von \texttt{msg} ließen kein Muster erkennen. Also bohrte ich die Funktion \texttt{morseemit} mit zusätzlichen Ausgaben auf: {\small \begin{verbatim} : morseemit ( key -- ) dup o-emit @ execute [char] . o-emit @ execute \ debug dup bl = if \ Leerzeichen == Wortende Wend drop else \ Grosse [A-Z] -> kleine Zeichen [a-z] dup $40 > over $5b < and if $20 + then \ debug ['] emit defer@ >r o-emit @ is emit dup . r> is emit \ Argument auf [a-z] begrenzen dup $60 > over $7b < and if [char] _ o-emit @ execute \ debug \ index - TabellenOffset $60 - \ gepackten Wert holen mtable + @i \ entpacken und ausgeben unpack domorse else \ ungueltigen Code verwerfen drop then then ; \end{verbatim} } Das erzeugte die folgende Ausgabe: {\small \begin{verbatim} > init hex morse s" abs" type endmorse a.61 _b.62 _s.73 _ ok > morse msg endmorse a.6261 b.6162 s.73 _ ok \end{verbatim} } Das sah verdächtig danach aus, dass \texttt{itype} zwei Bytes als cell auf den Stapel legt, und damit zu große Werte an \texttt{morseemit} verfüttert. Nachdem das Problem soweit seziert war, war Abhilfe denkbar einfach. {\small \begin{verbatim} : morseemit ( key -- ) $00ff and \ fix itype \ altes emit ausfuehren dup o-emit @ execute ... ; \end{verbatim} }%$ Mit einer einzigen, zusätzlichen Zeile verschwand das Phänomen. Damit war mir geholfen. Und damit verstand ich auch im Nachhinein, warum in der anderen Version von \texttt{morseemit} ein \texttt{\$00ff and} % $ enthalten ist. \section{Gegenrede} Man fragt sich aber, ob das nicht doch ein Fehler in \texttt{itype} ist, die Bytes nicht schön einzeln auf den Stapel zu legen. Matthias Trute hat schnell und unbürokratisch die Funktion \texttt{itype} korrigiert. Die Korrektur ist im \texttt{trunk} und später ab der Version 4.8 von amforth enthalten. Mein Dank geht an Matthias Trute und die Teilnehmer des mittwöchlichen IRC--chats. \end{multicols} % -------------------------------------------------------------------- \section{Referenzen} \begin{enumerate} \item \label{Forthbildung} Fort\textit{h}bildung --- Wälde et al., Vierte Dimension 4/2011, Jahrgang 27, S.\ 9f \end{enumerate} \newpage % -------------------------------------------------------------------- \section{Listings} \begin{quote} \begin{small} \begin{multicols}{2} \listinginput[1]{1}{2012-01/base.fs} \listinginput[1]{1}{2012-01/morse4.fs} \end{multicols} \end{small} \end{quote} \vfill %Abbildung: Morsecode Tree“ \begin{figure*}[h] \begin{center} \includegraphics[width=1.0\textwidth]{2012-01/forth-Morse_code_tree3} \caption{\label{Bild1}Morse Code Baum} \end{center} \end{figure*} \vfill \end{document}