<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% 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{$&lt;$ret$&gt;$}\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}


</pre></body></html>