% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol} % \usepackage{babel} \usepackage{xspace} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} %\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}{Abbildung} \title{Reise in die Vergangenheit --- RSC--Forth decompilieren} \ifx\shorttitle\undefined\else \shorttitle{RSC--Forth--Decompiler} \fi \author{Dirk Brühl} \hyphenation{Baud-ra-te} \begin{document} \maketitle \begin{abstract} Anlass war ein Briefwechsel mit Michael anlässlich des Vintage Computer Festival 2011 in München. Da fiel mir ein, dass ich irgendwo in einer alten Kiste noch Platinen mit RSC--Forth darauf haben könnte. Und der Decompiler war auf einer meiner Archiv--CDs. So wurde der 1. Mai eine Reise in die Vergangenheit. \end{abstract} \begin{multicols}{2} \section{Die Ausgrabungsarbeiten} Was mich damals motiviert hat, den Decompiler zu machen ist schnell gesagt. Ich brauchte den, um etwas über die RSC--Forth--Innereien zu lernen, und in das Forth eingreifen zu können, es gab ja damals den Seitenfehler beim 6502. Später hat dann ein Kunde von mir den Fehler behoben. Der Decompiler hat die Befehle in Klarschrift gebracht, und ich brauchte nicht mühsam den Hexcode zu entschlüsseln. Dafür ist Forth ja schließlich da, dass man sowas machen kann. Doch nun etwas darüber wie der Decompilers aus den Staubsedimenten ausgegraben worden ist. Nachdem ich herausgefunden hatte, dass das Decompilieren nur im System selbst funktioniert, ging es also darum, eine funktionsfähige Karte zu finden. Ich habe zwar etliche Karten mit RSC--Forth wiedergefunden, aber der Zustand war halt unbekannt. Eine kleine Platine (halbes Euroformat, 80x100), lag oben auf einer meiner Kisten, sogar mit RAM, aber ohne EPROM, ziemlich verstaubt. Also habe ich mir ein gut aussehendes mit Aufkleber RSC--Forth aus meiner Sammlung genommen, und siehe da, die Platine funktionierte auf Anhieb. \begin{figure} \centering \includegraphics[scale=2.0]{2011-03/101_9522.eps} \caption{RSC--Platine, etwas entstaubt} \label{fig:rsc-platine} \end{figure} Nur wie zu erwarten, musste die Baudrate erst einmal ermittelt werden. Bei meiner AIM65--Software für den R6501 hatte ich eine automatische Baudratenerkennung eingebaut, nicht jedoch beim RSC--Forth. Nachdem das Durchspielen verschiedener Baudraten nichts erbrachte, habe ich mir mit dem Oszilloskop den Takt und die Baudrate angeschaut, und gesehen, dass der Takt etwas ungewöhnlich war. Weil der Quarz nicht zu der Baudrate des vorhandenen EPROMs passte, musste ich erst einmal die Quarzfrequenz messen und dann den Frequenzteiler für eine Standard--Baudrate berechnen. Und mit diesem Wert musste dann ein frisches EPROM gebrannt werden. Nur ein einziges Byte musste geändert werden, damit ich mit der Karte kommunizieren konnte. Zum Glück hatte ich sogar noch ein paar leere EPROMS. Ich habe dann ein Forth aus meiner EPROM--Liste rausgesucht --- vor fünf Jahren hatte ich schon einige EPROMs gesichert --- in dem die Tabelle mit den OpCodes für den Disassembler bereits enthalten war, damit ich mir diesen Teil zu laden sparen konnte. \section{Gelungener Startversuch} Überraschend war, dass die Karte sich in meinem Win32Forth--Terminalprogramm etwas seltsam verhielt. Aber mit Hyperterminal ging es, doch damit konnten wiederum keine Programme hochgeladen werden. Doch glücklicherweise ließ sich das Terminalprogramm so einstellen, dass der Disassembler und der Decompiler hochgeladen werden konnten, und mit Hyperterminal habe ich dann das Forth decompiliert. Ja, diese alten Tools waren nicht sehr komfortabel. Das Ergebnis ist nun als PDF zu haben, 69 Seiten, inklusive \texttt{VLIST} mit und \texttt{VLI} ohne Adressen. Dass es so viele Seiten sind, liegt daran, dass ich den Decompiler so übernommen habe, wie er war, ein Forthwort pro Zeile, der Disassembler packt dafür dann viele Befehle in eine Zeile. Woher der Decompiler stammte, habe ich vergessen, jedenfalls ist er nicht von mir geschrieben worden. Doch er wurde von mir an RSC--Forth angepasst, denn RSC--Forth--Worte enthalten zwei Adressen, eine im Entwicklungs--ROM mit Header, und eine im Runtime--Forth ohne Header. Da die Adressen in einem Wort direkt auf auszuführende Worte zugreifen, die aber keine ID haben, muss der Header mit der zugehörigen ID bei jedem Befehl gesucht werden, damit läuft der Decompiler ziemlich langsam. Der Vorteil ist aber, dass der RSC--Forth--Kern sehr kompakt ist. Wie daraus unschwer zu erkennen ist, lässt sich dieses File nicht als Grundlage zum Portieren verwenden. Es ist aber kein Problem, die Ausgabe anders zu formatieren, damit sie wieder kompiliert werden kann. Es müssen halt die Adressen rausgelassen werden. Bisher waren die Adressen wichtig, denn wenn man was Patchen wollte, musste man ja wissen, wo. Da diese Ausgrabung nun gelungen ist, ist es mir möglich Vergleiche zwischen FIG--Forth und RSC--Forth zu ziehen. Etliches kann ja beim RSC--Forth entfallen, z.B. die Floppydisk--Routinen und die Bankexecute--Routinen. Damit wird das Ganze dann noch kompakter. Wenn man wirklich was damit anfangen will, dann muss ich mir erstmal ein EPROM erstellen, das keine Fehler hat. Das von mir verwendete hat wohl noch fehlerbehaftete Stellen, immer dann, wenn der Code auf leeren Speicherstellen (FF) landet. \section{Ergebnis} Ich habe das FIG--Forth und das decompilierte RSC--Forth jeweils in ein PDF gesteckt\footnote{Ihr findet sie dort: \\ \url{http://www.forth-ev.de/filemgmt/index.php}\\ und dann unter: Vierte Dimension $\longrightarrow$ Listings $\longrightarrow$ Sonstiges\\ }. Damit ist es möglich, besser Vergleiche zu ziehen. Zum Beispiel hat RSC--Forth dreimal so viel \texttt{INX}--Befehle und neunmal so viel \texttt{DEX}--Befehle wie FIG--Forth. Das ist ein klares Zeichen dafür, dass es beim RSC--Forth viel mehr Worte gibt, die Maschinenbefehle enthalten, als beim FIG--Forth, d.h., das FIG--Forth wird einfacher zu adaptieren sein, aber das RSC--Forth läuft schneller. So, von dieser Reise in die Vergangenheit muss ich mich jetzt erst einmal erholen, und dann denke ich mal darüber nach, was ich wohl am besten als Nächstes tue. Wahrscheinlich wird es der Monitor für den MSP430 sein, denn sowas wird ja auf jeden Fall gebraucht. \end{multicols} \section{Listing}\label{RSC_Dec.seq} \begin{quote} \begin{small} \listinginput[1]{1}{2011-03/RSC_Dec.seq} \end{small} \end{quote} \end{document}