% Content-encoding: UTF-8
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage{multicol}
% \usepackage{babel}
\usepackage{xspace}
\setcounter{secnumdepth}{0}
\setcounter{tocdepth}{0}
\usepackage{german}

%\newcommand{\code}[1]{\texttt{#1}}
%\newcommand{\ret}{\textsf{$<$ret$>$}\xspace}
%\newcommand{\ret}{$\hookleftarrow$\xspace}

\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}
\renewcommand{\reftextfaraway}[1]{auf Seite \pageref{#1}}
\renewcommand{\figurename}{Listing}

\title{Über Flags in Forth}
\ifx\shorttitle\undefined\else
\shorttitle{Über Flags in Forth}
\fi
\author{Fred Behringer}


% \begin{document}

\vfill 

\maketitle

Willi Stricker hat in einer sehr interessanten Arbeit [S1] gezeigt, wie
man mit lediglich 26 Primitives (Code--Definitionen) ein Forth--System
hochziehen kann, das im Übrigen nur High--Level--Worte enthält. (Eine
ähnliche Arbeit zum Thema ist die bekannte Internet--Notiz von Bernd
Paysan [BP]. Weitere Arbeiten zum Thema: [RA],[FB].) 
Willi Stricker
benötigt zum Aufbau der Colon--Definition \texttt{d+} aus Low-- und
High--Bestandteil das Carry--Flag. \emph{In Forth gibt es keine Flags.}
(Wirklich? Implizit schon!) Willi Stricker führt eigens für dieses
Problem \texttt{+c} in seinen Basis--Satz von Primitives ein, aus welchem man sich
neben dem carry--Flag auch das übliche \texttt{+} (per High--Level--drop)
herausholen kann. Das carry--Flag ist implizit in \texttt{d+} enthalten! Albert
Nijhof hat gezeigt [AN], wie carry aus \texttt{d+} herausgeholt werden kann. 
\texttt{+c}
ist in Forth unüblich und nimmt sich überdies als unverzichtbares
Basis--Wort (Primitive) etwas fremd aus. 

Ich zeige im gleich folgenden Listing, dass man \texttt{+c} (mit allen
Strickerschen Eigenschaften) als Colon--Definition fassen kann, wenn man
statt seiner \texttt{d+} als Primitive aufnimmt.

Ich beschränke mich auf einen PC--Kompatiblen mit einem Prozessor ab
80486.

Aus \texttt{+c} als Colon--Definition kann man (siehe Listing) neben carry auch \texttt{+}
genau so herausholen wie in Willi Strickers Kernel--Vorschlag angegeben.
Ansonsten wird \texttt{+c} in Willi Strickers Kernel nicht weiter benötigt und es
fällt daher leicht einzusehen, dass durch diesen Austausch (\texttt{+c} Kernel,
\texttt{d+} Primitive statt \texttt{+c} Primitive, \texttt{d+} Kernel) nichts verloren ist.
Gewonnen wird: \texttt{d+} ist in Forth--Systemen üblich, \texttt{+c} nicht.

\section{Quellen}
\begin{tabular}{lp{15cm}}
[AN] &Nijhof, Albert: E--Mail an [FB], wiedergegeben in Übersetzung.
       Vierte Dimension 1/2006, S.10.\\

[BP] &Paysan, Bernd: Beitrag 'aus dem Netz', besprochen in [RA].\\

[FB] &Behringer, Fred: Drei Primitives weniger in Willi Strickers
       Forth--Minimalbasis. Vierte Dimension 4/2009.\\

[RA] &Allwright, Ray: From the Net -- Minimal Word Sets.
       Forthwrite (FIGUK) 95, März 1998.\\

[S1] &Stricker, Willi: Minimaler Basis--Befehlssatz für ein Forth--System.
       Vierte Dimension 3/2009.\\

[S2] &Stricker, Willi: Von der virtuellen Forth--Maschine zum realen
       Forth--Prozessor. Vierte Dimension 4/2010.
\end{tabular}

\newpage

\section{Listing}
\begin{quote}
\begin{listing}{1}

hex

: opsize: 66 c, ;      \ Praefix, das aus ax (16 Bit) eax (32 Bit) macht
usw.

code d+   ( d1 d2 -- d1+d2 )  \ Alles Punktzahlen (doppelt genau)
         ax pop       \ d2-hi
         bx pop       \ d2-lo
         cx pop       \ d1-hi
         dx pop       \ d1-lo
         cx push      \ d1-hi
         dx push      \ d1-lo
         ax push      \ d2-hi
         bx push      \ d2-lo
 opsize: ax pop       \ d2-lo..hi    im  Reg eax   (little endian)
 opsize: bx pop       \ d1-lo..hi    im  Reg ebx   (little endian)
 opsize: ax bx add    \ d1+d2-lo..hi im  Reg ebx   (little endian)
 opsize: bx push      \ d1+d2-lo..hi auf den Stack (vom TOS her nach oben)
         ax pop       \ d1+d2-lo     von dem Stack
         bx pop       \ d1+d2-hi     von dem Stack
         ax push      \ d1+d2-lo     auf den Stack
         bx push      \ d1+d2-hi     auf den Stack
         \  Jetzt liegt d1+d2-hi..lo auf dem Stack (vom TOS her nach oben)
         next end-code

\ Man haette auch mit (dem ueber opsize: erweiterten) Assembler-Befehl rol
\ arbeiten koennen. 

\ Bildung der Summe zweier einfachgenauer Ganzzahlen n1 und n2 mit Anzeige
\ des Uebertrags, carry (= 0 oder 1). carry ist der Inhalt des carry-Flags
\ NACH der Operation + in +c. Nicht zu verwechseln mit adc (add WITH carry),
\ das das carry-Flag VOR Beginn der Operation zum Ergebnis der Operation
\ addiert. Das carry-Flag interpretiert n1 und n2 als vorzeichenlos, so wie
\ es beim Zusammenstueckeln der Addition zweier doppeltgenauer Zahlen aus
\ zwei Additionen aus je zwei einfachgenauen Zahlen benoetigt wird.

: +c ( n1 n2 -- n1+n2 carry ) >r 0 r> 0 d+ ;

\ Und um die Sache perfekt zu machen, noch schnell die +-Operation aus +c
\ heraus, jetzt als Colon-Definition:

: +  ( n1 n2 -- n1+n2 ) +c drop ;

\ Das stimmt mit dem Kernel-Vorschlag von Willi Stricker [S2] ueberein. Man
\ pruefe nach, dass alle Ergebnisse richtig herauskommen, und ueberlege sich,
\ warum.

\end{listing}
\end{quote}

\end{document}
