% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \begin{document} \title{Das FOCUS–Zahlensystem} \author{Rafael Deliano} \maketitle Es hat sich später zwar herausgestellt, dass einige technische Details bereits in [6] vorweggenommen waren. Das tut seiner Bedeutung für die Popularisierung von LNS auf Mikroprozessoren aber keinen Abbruch. \begin{figure*}[b] \begin{center} \includegraphics[width=0.7\textwidth]{2007-0304/bild7}\\ \label{Bild7}Bild 7: Addition \end{center} \end{figure*} \begin{figure*}[t] \begin{center} \includegraphics[width=0.3\textwidth]{2007-0304/bild9a}\hspace{1cm} \includegraphics[width=0.3\textwidth]{2007-0304/bild9b}\\ \label{Bild9}Bild 9: Multiplikation und Division \end{center} \end{figure*} \begin{multicols}{2} Von den verschiedenen Publikationen ist [2] besonders ergiebig, da auf 40 Seiten auch Listings für den 8080 enthalten sind. Dort ist alternativ zum 8--Bit-- auch ein 16--Bit--Format beschrieben, das aber auf dekadischem Logarithmus beruht, was für heutige LNS untypisch ist. \section{8--Bit} Von der Mantisse existiert nur das Vorzeichen (Bild 1). Der 7--Bit--Exponent besteht aus Integer (Tabelle 1) und Fraction (Tabelle 2). In der logarithmischen Darstellung entspricht der Offset 1000,000b dem Exponenten 0,0 und dem realen Wert 1,0 (Bild 2). Der Offset kompensiert den Verlauf des Logarithmus (Bild 3), der ja unterhalb 1,0 problematisch ist. \begin{center} \includegraphics[width=0.5\columnwidth]{2007-0304/bild1}\\ \label{Bild1}Bild 1: Zahlenformat \end{center} \section{I/O} Im Originaltext wurde angenommen, dass die Zahlen manuell gewandelt passend eingegeben werden (Tabelle 3). Negative Zahlen erhält man dann mit FNEGATE simpel durch Invertierung des obersten Bits. Rudimentäre Ausgabe ist durch einen Befehl F. möglich (Bild 4). Zumindest für Tests ist das gangbar. \begin{footnotesize} \begin{center} \begin{minipage}[b]{0.4\columnwidth} \begin{tabular}{lll} 1111 &=& 7\\ 1110 &=& 6\\ 1101 &=& 5\\ 1100 &=& 4\\ 1011 &=& 3\\ 1010 &=& 2\\ 1001 &=& 1\\ 1000 &=& 0\\ 0111 &=& -1\\ 0110 &=& -2\\ 0101 &=& -3\\ 0100 &=& -4\\ 0011 &=& -5\\ 0010 &=& -6\\ 0001 &=& -7\\ 0000 &=& -8 \end{tabular}\\ \label{Tabelle1}Tabelle 1: Integer \end{minipage}\hspace{5mm} \begin{minipage}[b]{0.4\columnwidth} \begin{tabular}{lll} 111 &=& 7/8\\ 110 &=& 6/8\\ 101 &=& 5/8\\ 100 &=& 4/8\\ 011 &=& 3/8\\ 010 &=& 2/8\\ 001 &=& 1/8\\ 000 &=& 0/8 \end{tabular}\\ \label{Tabelle2}Tabelle 2: Fraction \end{minipage} \end{center} \end{footnotesize} \section{ROMs} Für die Einbindung in Applikationen ist aber typisch Umwandlung in lineares Format nötig. Die Dynamik entspricht einem linearen 16--bis--17--Bit--Datenwort. Damit sind für die Ein--/Ausgabe 32--Bit--Datenworte nötig. Der Wert 234,75 wurde hier mit 10'000d skaliert und passt dann noch in 24 Bit. Berechnung der Tabelle erfolgt mit Mathcad. Wegen des Vorzeichenbits verkürzen sich der Adressbereich der Tabellen um je 1 Bit, da sie für positive Zahlen genügen. Die invlog--Tabelle ist mit 0,7k Byte vom Speicherverbrauch unkritisch (Bild 5). \begin{center} \includegraphics[width=0.5\columnwidth]{2007-0304/bild2}\\ \label{Bild2}Bild 2: Beispielwerte \end{center} \begin{center} \includegraphics[width=0.8\columnwidth]{2007-0304/rlog1plot}\\ \label{Bild3}Bild 3: ld(x) \end{center} Eine direkte log--Tabelle wäre deswegen jedoch unrealistisch (Bild 6). Hier wird deshalb ersteinmal mit der Funktion SCANBIT die Position des obersten gesetzten Bits gesucht [7]. Es ergeben sich Werte von 5 ... 21d im Dynamikbereich, außerhalb greift eine Sättigungslogik. SCANBIT zerlegt die krumme Kurve also bereits in 17 Teilabschnitte, die selbst fast linear sind. Mit den folgenden 5 Bit wird eine Tabelle für die Feinauflösung angesteuert. Diese ist dreifach vorhanden, weil im Eingangsbereich Block 5 und 6 wegen der Kappung am Dezimalpunkt sich von Block 7 -- 21 leicht unterscheiden. LOG ist prinzipiell nicht verlustfrei. Es ist unklar, ob das Rundungsverhalten der gewählten Routine optimal ist, hier stand Geschwindigkeit im Vordergrund. \begin{center} \begin{tabular}{lcl} --- --- --- & | & 50 $\backslash$ 4,0\\ --- --- 0050 & | & F.\\ \verb|+2^0+0/8| & & \\ --- --- --- & | & 50 FNEGATE F.\\ \verb|-2^0+0/8| & & \\ --- --- --- & | & \\ \end{tabular}\\ \label{Bild4}Bild 4: Simple I/O \end{center} \section{Befehle} Subtraktion lässt sich hier durch Invertierung des Vorzeichens eines Operanden auf Addition zurückführen (Bild 8). Diese benötigt wegen der 4 Vorzeichen--Varianten, und da sie Addition und Subtraktion gleichzeitig behandelt, eine umfangreiche Fallunterscheidung (Bild 7). Normalerweise sind in LNS Additions-- und Subtraktionstabelle getrennt, hier wurden sie in eine 256--Byte--Additions--Tabelle zusammengefasst. Die letzten Operationen dienen jeweils der Implementierung einer Sättigungslogik. \begin{center} \includegraphics[width=0.4\columnwidth]{2007-0304/bild5}\\ \label{Bild5}Bild 5: invlog--Tabelle \end{center} Multiplikation und Division (Bild 9) beruhen auf 2er--Komplement--Addition und --Subtraktion. Die magische Zahl 40 entspricht dem Offsetwert „1,0“. Anders als bei Addition gibt es hier keine Rundungsfehler. \begin{figure*}[t] \begin{center} \hfill \includegraphics[width=0.3\textwidth]{2007-0304/bild10a}\hfill \includegraphics[width=0.15\textwidth]{2007-0304/bild10b}\hfill \includegraphics[width=0.2\textwidth]{2007-0304/bild10c}\hspace*{\fill}\\ \label{Bild10}Bild 10: Quadrat, Wurzel, 1/X \end{center} \end{figure*} \begin{center} \includegraphics[width=0.2\columnwidth]{2007-0304/bild6}\\ \label{Bild6}Bild 6: unrealistische log--Tabelle \end{center} \section{Implementierung} In Applikationen wird man immer die Assemblerroutinen verwenden. Für Portierung ist aber eine FORTH--Variante nützlich, die der Assemblerversion möglichst ähnlich sein sollte. Timing und Speicherbedarf für einen 2,45MHz--68HC908GP32 in Tabelle 4, 5. \begin{center} \includegraphics[width=0.2\columnwidth]{2007-0304/bild8a}\hfill \includegraphics[width=0.2\columnwidth]{2007-0304/bild8b}\hfill \includegraphics[width=0.2\columnwidth]{2007-0304/bild8c}\\ \label{Bild8}Bild 8: einfache Operationen \end{center} \end{multicols} \begin{multicols}{2} \begin{center} \begin{tabular}{lcc} & FORTH & Assembler\\ INVLOG & 150--250 & 25--40\\ LOG & 200--1000 & 30--120\\ F+ & 300 & 27\\ F* F/ & 100--150 & 15--20 \end{tabular}\\ \label{Tabelle4}Tabelle 4: Geschwindigkeit in usec \end{center} \begin{center} \begin{tabular}{lcc} & FORTH & Assembler\\ INVLOG & 60 + 4*256 & 76 + 3*256\\ LOG & 325 + 113 & 141 + 113\\ F+ & 633 + 256 & 146 + 256\\ F* F/ & 154 & 58 \end{tabular}\\ \label{Tabelle5}Tabelle 5: Speicherverbrauch Code + Tabellen \end{center} \columnbreak \section{Tests} Wegen des kompakten Datenformats kann man die FORTH-- und Assemblerroutinen über den gesamten Wertebereich (d.h. 256 x 256 Berechnungen) gegeneinander testen, ob sie bitgenau identische Resultate liefern. \end{multicols} \section{Literatur} \begin{small} \begin{tabular}{ll} {[1]} Lee, Edgar „The FOCUS number system“ IEEE Trans. Comp. Nov 1977\\ {[2]} Lee, Edgar „Focus Microcomputer Number System“ in: Lee „microcomputer design and applications“ Academic Press 1977\\ {[3]} Edgar „FOCUS microcomputer number system“ Com. of ACM March 1979\\ {[4]} Lee, Edgar Addendum to „The Focus Number System“ IEEE Trans. on Computers Sept. 1979\\ {[5]} Swartzlander Comment on „The Focus Number System“ IEEE Trans. on Computers Sept. 1979\\ {[6]} Swartzlander, Alexopolous „The Sign/Logarithm Number System“ IEEE Trans. on Computers Dez. 1975\\ {[7]} emb (9) Einfacher Logarithmus \end{tabular} \end{small} \begin{multicols}{2} \section{Listing: FOCUS} \listinginput[1]{1}{2007-0304/focus.fs} \end{multicols} \begin{minipage}{\textwidth} \begin{multicols}{5} \begin{tabular}{ll} Byte & Dezimalwert\\ 00& 0,0039\\ 01& 0,0043\\ 02& 0,0046\\ 03& 0,0051\\ 04& 0,0055\\ 05& 0,0066\\ 06& 0,0066\\ 07& 0,0072\\ 08& 0,0078\\ 09& 0,0085\\ 0A& 0,0093\\ 0B& 0,0101\\ 0C& 0,0110\\ 0D& 0,0120\\ 0E& 0,0131\\ 0F& 0,0143\\ 10& 0,0156\\ 11& 0,0170\\ 12& 0,0186\\ 13& 0,0203\\ 14& 0,0221\\ 15& 0,0241\\ 16& 0,0263\\ 17& 0,0287\\ 18& 0,0313\\ 19& 0,0341\\ \end{tabular} \begin{tabular}{ll} Byte & Dezimalwert\\ 1A& 0,0372\\ 1B& 0,0405\\ 1C& 0,0442\\ 1D& 0,0482\\ 1E& 0,0526\\ 1F& 0,0573\\ 20& 0,0625\\ 21& 0,0682\\ 22& 0,0743\\ 23& 0,0811\\ 24& 0,0884\\ 25& 0,0964\\ 26& 0,1051\\ 27& 0,1146\\ 28& 0,1250\\ 29& 0,1363\\ 2A& 0,1487\\ 2B& 0,1621\\ 2C& 0,1768\\ 2D& 0,1928\\ 2E& 0,2102\\ 2F& 0,2293\\ 30& 0,2500\\ 31& 0,2726\\ 32& 0,2973\\ 33& 0,3242\\ \end{tabular} \begin{tabular}{ll} Byte & Dezimalwert\\ 34& 0,3936\\ 35& 0,3856\\ 36& 0,4204\\ 37& 0,4585\\ 38& 0,5000\\ 39& 0,5453\\ 3A& 0,5946\\ 3B& 0,6484\\ 3C& 0,7071\\ 3D& 0,7711\\ 3E& 0,8409\\ 3F& 0,9170\\ 40& 1,000\\ 41& 1,091\\ 42& 1,180\\ 43& 1,297\\ 44& 1,414\\ 45& 1,542\\ 46& 1,682\\ 47& 1,834\\ 48& 2,000\\ 49& 2,181\\ 4A& 2,378\\ 4B& 2,594\\ 4C& 2,828\\ 4D& 3,084\\ \end{tabular} \begin{tabular}{ll} Byte & Dezimalwert\\ 4E& 3,364\\ 4F& 3,668\\ 50& 4,000\\ 51& 4,362\\ 52& 4,757\\ 53& 5,187\\ 54& 5,657\\ 55& 6,169\\ 56& 6,727\\ 57& 7,336\\ 58& 8,000\\ 59& 8,724\\ 5A & 9,514\\ 5B& 10,375\\ 5C& 11,314\\ 5D& 12,338\\ 5E& 13,454\\ 5F& 14,672\\ 60& 16,000\\ 61& 17,448\\ 62& 19,027\\ 63& 20,749\\ 64& 22,627\\ 65& 24,675\\ 66& 26,909\\ 67& 29,344\\ \end{tabular} \begin{tabular}{ll} Byte & Dezimalwert\\ 68& 32,000\\ 69& 34,896\\ 6A& 38,055\\ 6B& 41,499\\ 6C& 45,255\\ 6D& 49,351\\ 6E& 53,817\\ 6F& 58,688\\ 70& 64,000\\ 71& 69,792\\ 72& 76,109\\ 73& 82,998\\ 74& 90,510\\ 75& 98,701\\ 76& 107,635\\ 77& 117,377\\ 78& 128,000\\ 79& 139,585\\ 7A& 152,219\\ 7B& 165,995\\ 7C& 181,019\\ 7D& 197,403\\ 7E& 215,269\\ 7F& 234,753 \end{tabular} \end{multicols} \centerline{\label{Tabelle3}Tabelle 3: manuelle Wandlungstabelle} \end{minipage} \end{document}