% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol,babel} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \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} \begin{document} % \renewcommand{\figurename}{Tabelle} \newcommand{\amforth}{{amforth}} \title{Dump — Kleine Helfer fürs \amforth} \author{Michael Kalus} \maketitle \begin{multicols}{2} In Microcontrollern wie dem AVR--Atmega gibt es drei verschiedene Speicherbereiche --- Ram, Flash und Eeprom --- die unterschiedlich organisiert sind. Auf das Ram kann byteweise zugegriffen werden. Das Flash wird zellenweise angesprochen, ebenso wie das Eeprom. So braucht jeder Speicherbereich sein eigenes fetch, um daraus einen Wert zu lesen und auf den Forth--Daten--Stack zu holen. \texttt{i@} \texttt{e@} und \texttt{@} erledigen das im \amforth\footnote{Das \texttt{i} im \texttt{i@} stammt aus der Bezeichnung des Flash als \emph{instruction memory}.}. Für allzu kompliziert formulierte \emph{Dumper} ist da z.~B.\ im Butterfly kein Platz. Üppigere Versionen von \texttt{dump}, wie für Ram--basierte Systeme, kann man nicht importieren. Deshalb macht man sich seine eigenen kleinen Helfer. Für jeden Bereich ist ein eigenes \texttt{dump} schnell gemacht; je ein \texttt{idump} für das Flash, \texttt{edump} für das Eeprom und \texttt{dump} für das Ram. Gut ausfaktorisiert hat der Code dann zwar zunächst mehr Header, liefert dafür aber gleich die Minitools wie das \texttt{?} (Fragezeichen) mit. Mit dem Fragezeichen wird bekanntlich der Inhalt einer Adresse angezeigt. Hier gibt es dann naturgemäß ein \texttt{i?} \texttt{e?} und \texttt{?} sozusagen gratis dazu. Da \texttt{dump} traditionell auch die ASCII--Werte der Daten mit anzeigt, aus Platzgründen aber auf komplizierte Aufbauten hier im \amforth\ verzichtet wird, gibt es zumindest ein \texttt{i??} \texttt{e??} und \texttt{??}, welche neben dem Wert in einer Adresse auch seine ASCII--Werte wiedergibt. Dargestellt wird immer der Wert einer Zelle (cell), also 2 Bytes. Dies geschieht, weil im Flash jede Adresse einer Zelle entspricht und der Einfachheit halber im Forth mit \texttt{@} auch aus dem Ram und Eeprom gleich eine Zelle geholt wird. Das folgende Beispiel illustriert die Verwendung. Die Dumper liegen auch als Assemblerquelle vor. \begin{verbatim} > : test ." hallo" ; test hallo ok > ' test 10 - 20 idump C58 4B2 1E98 1DC3 1E63 1E63 797 1C8D 72 C60 98 1E98 1EAD 1DC3 1E5C 1E5C 797 1C41 C68 7404 7365 74 1FEB 1C0A 235 6805 6C61 C70 6F6C 261 1C41 FFFF FFFF FFFF FFFF FFFF C78 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ok > c68 i?? 7404 t. ok > c70 i?? 6F6C ol ok \end{verbatim} \end{multicols} \subsection*{Wörter} \texttt{i?} \texttt{e?} \texttt{?} \texttt{i??} \texttt{e??} \texttt{??} \texttt{idump} \texttt{edump} \texttt{dump} \\ Die übrigen Wörter dieser Quelle können auch headerless gehalten werden, wenn man mag. \section*{Quellen} \url{http://amforth.sourceforge.net/}\\ \url{http://www.forth-ev.de/wiki/doku.php/words:dump} %\newpage \section*{Listing} \begin{quote} \listinginput[1]{1}{2008-04/dumper.fs} \end{quote} % \end{document}