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