###   Projekte und Informationen rund um den KC85   ### 

Speichertestprogramm RAMTEST

von Frank Dachselt und Mario Leubner

Das Programm RAMTEST testet die Funktionsfähigkeit von internen und externen RAM-Modulen im KC85. Die zu testenden RAM-Bereiche werden in Blöcken zu 16 KByte entsprechend dem Modulkonzept des KC85 verwaltet.

Das Programm liegt als Assemblerquelltext (EDAS) und als fertig übersetztes MC-Programm RAMTEST.KCC vor. Mit dem fertigen Programm lassen sich komplette Module und interne Speicherbänke testen, die Assembler-Version erlaubt darüber hinaus auch das gezielte Testen einzelner Blöcke der Module. Dazu müssen im Assemblerquelltext des Programms die zu testenden Blöcke vereinbart werden. Am Beginn des Quelltextes existiert eine Datenstruktur, die Datensätze der folgenden Form enthält:

SLOT0:   DEFB 03H        ; Modulschacht 
        DEFB 00H        ; erste Bl.-#
      DEFB 03H        ; erstes MSTW
        DEFB 04H        ; MSTW-Inkrem.
        DEFB 14         ; Anzahl Bl.
      DEFW 8000H      ; Adresse 

Jeder Datensatz enthält die zu testenden RAM-Blöcke für einen (internen oder externen) Modulschacht. Die Modulschacht-Adresse ist als erstes Byte anzugeben. Danach folgt eine Blocknummer, ab der die zu durchlaufenden RAM-Blöcke gezählt werden sollen. Diese Angabe ist nur für die Anzeige von Bedeutung, um die Blöcke unabhängig vom Modulsteuerwort zu identifizieren. Das nächste Byte ist das Modulsteuerwort des ersten zu testenden Blocks in diesem Modul. Der Wert, der zum Modulsteuerwort addiert werden muss, um den jeweils nächsten Block einzuschalten, wird im folgenden Byte angegeben. Danach folgt die Anzahl der Blöcke, die in diesem Modul getestet werden sollen. Die abschließende Angabe ist die Basisadresse des RAM-Blocks, wobei als Standardwert 8000H zu verwenden ist. Alle RAM-Blöcke müssen mit den angegebenen Modulsteuerworten auf der angegebenen Basisadresse aktiv geschaltet werden.

Der oben angegebene Datensatz ist für den auf 256 KByte aufgerüsteten RAM des KC85/4 vorgesehen. Es werden 14 Blöcke zu 16 KByte auf der internen Moduladresse 03 (RAM8), beginnend mit der logischen Blocknummer 0 getestet. Das erste Modulsteuerwort ist 03H, das zweite 03H + 04H = 07H, das dritte 07H + 04H = 0FH usw. Die logischen Blöcke 0E und 0F werden nicht getestet, da sie dem RAM0 und dem RAM4 entsprechen.

Beispiele für externe (gesteckte) Module sind im folgenden angegeben:

4 Blöcke des M011 (64 KByte) im Schacht 0C:

SLOT1:   DEFB 0CH        ; Modulschacht
         DEFB 00H        ; erste Bl.-#
         DEFB 03H        ; erstes MSTW
         DEFB 40H        ; MSTW-Inkrem.
         DEFB 4          ; Anzahl Bl.
         DEFW 8000H      ; Adresse

1 Block des M022 (16 KByte) im Schacht F0:

SLOT2:   DEFB F0H        ; Modulschacht 
         
DEFB 00H        ; erste Bl.-#
         DEFB 83H        ; erstes MSTW
         DEFB 00H        ; MSTW-Inkrem.
         DEFB 1          ; Anzahl Bl.
         DEFW 8000H      ; Adresse

Mit dieser Datenstruktur können auch gezielt einzelne Blöcke oder Teilbereiche aus größeren Modulen ausgewählt und getestet werden. Die Anzahl der definierten bzw. zu verwendenden Datensätze ist frei wählbar. Das Ende der Definitionstabelle wird durch eine abschließende 0 gekennzeichnet. Im Quelltext ist Platz für 20 Datensätze vorgesehen. (siehe Kommando TESTM weiter unten in der Beschreibung!).

Nach der Assemblierung steht im CAOS-Menü das Menüwort TEST zur Verfügung, mit dem das Testprogramm gestartet wird. Zuvor sind alle nicht im Test verwendeten externen Module, die den RAM-Bereich der zu testenden Module (im Normalfall 8000H...BFFFH) überdecken können, auszuschalten. Die internen RAM8-Blöcke werden automatisch durch das Programm geschaltet. Bei Verwendung der Basisadresse 4000H ist der RAM4 auszuschalten (SWITCH 4 0), wenn dieser nicht mit getestet wird.

Für einen vollständigen Test empfiehlt es sich, nicht nur das zu testende Modul selbst zu verwenden, sondern auch mindestens ein höher priorisiertes und ein niedriger priorisiertes Modul in die Testschleife aufzunehmen, um auch die korrekte Funktion der Prioritätskette zu testen.



Bild 16: Clubtreffen 2004: Hier wird der Prototyp des M035 in Enrico Grämers KC- System im Schacht 1C getestet. Das Monitorbild zeigt, daß bisher keine Fehler aufgetreten sind.

Das Testprogramm arbeitet die Datenstruktur in der angegebenen Reihenfolge zyklisch ab. Während des Tests ist der Bildschirm in zwei Fenster aufgeteilt. In der obersten Zeile werden zur Kontrolle die im Test einbezogenen Modulsteckplätze angezeigt. Darunter (Statusfenster) wird für jeden getesteten Block eine Zeile der Form

       rr mm:bb --> mi:bi I10ESBWPIR

ausgegeben. Die Angaben haben folgende Bedeutung:

   rr ... Nummer des Testdurchlaufs (Runde), beginnend bei 00 
   mm ... aktuelle Moduladresse
   bb ... aktuelle Blocknummer
   mi ... zurückgelesene Moduladresse
   bi ... zurückgelesene Blocknummer

Die Zeichen “I10SBWPIR“ kennzeichnen die durchgeführten Tests. Falls während der Tests in einer Speicherzelle ein Fehler erkannt wird, wechselt das Zeichen die Farbe von Weiß auf Rot und im unteren Bildschirmteil (Fehlerfenster) erscheint eine Zeile der Form

       rr mm:bb t aaaa dd --> dr # eeee:eeee

Die Angaben haben folgende Bedeutung:

        rr ... Nummer des Testdurchlaufs (Runde), beginnend bei 00 
      mm ... aktuelle Moduladresse
      bb ... aktuelle Blocknummer
      t ... Testmode (I,1,0,E,S,B,W,P)
    aaaa ... Speicheradresse
      dd ... erwartetes Datenbyte
      dr ... zurückgelesenes Datenbyte
eeee:eeee ... laufende Nummer des Fehlers (32 Bit)

Im einzelnen werden folgende Tests durchgeführt, die durch jeweils eines der Zeichen I,1,0,E,S,B,W,P oder R symbolisiert werden:

I ... Blockidentifizierung

Dieser Test liest zunächst aus <Basisadresse> und <Basisadresse + 1> die dort abgelegten Werte mi (Moduladresse) und bi (Blocknummer) zurück und gibt sie in der Statuszeile aus. Diese Werte stimmen erst ab dem zweiten Durchlauf mit den erwarteten Werten mm und bb überein. Eine Abweichung der beiden zurückgelesenen Werte von den erwarteten Werten hat keine Ausgabe im Fehlerfenster zur Folge, da diese Information im Statusfenster erscheint. Ab dem zweiten Durchlauf enthalten die restlichen Bytes des Blocks ein eindeutiges Pseudo-Zufallsmuster, das zurückgelesen wird. Der Vergleich wird ab dem zweiten Durchlauf durchgeführt, das führende ’I’ in der Testanzeige erscheint deshalb nicht im ersten Durchlauf.

1 ... alle Bits 1

Der gesamte Speicherblock wird mit dem Datenbyte FFH gefüllt und zurückgelesen.

0 ... alle Bits 0

Der gesamte Speicherblock wird mit dem Datenbyte 00H gefüllt und zurückgelesen.

E ... Einzelbit-Tests

Es wird überprüft, ob sich alle Bits einer Speicherzelle einzeln setzen und rücksetzen lassen. Anschließend wird noch kontrolliert, dass keine (nur durch ein Adressbit abweichende) benachbarte Speicherzelle beim Schreiben des Datenbytes FFH mit verändert wird (Übersprechtest). Dieser Test wird nur für jede 31. Speicherzelle ausgeführt.

S ... aperiodisches Muster (vorwärts)

Der Speicherblock wird ab <Basisadresse> mit einem aperiodischen Muster der Form

01 02 02 03 03 03 ...

gefüllt und zurückgelesen.

B ... aperiodisches Muster (rückwärts)

Der Speicherblock wird ab <Basisadresse +3FFFH> rückwärts mit einem aperiodischen Muster der Form

01 02 02 03 03 03 ...

gefüllt und zurückgelesen. 

W ... Schreibschutz

Bei gesetztem Schreibschutzbit wird das Muster des Tests B mit einem anderen Muster überschrieben. Das anschließende Zurücklesen muss die Bytes des Testmusters B liefern, ansonsten wird ein Fehler ausgegeben. 

P ... Programmabarbeitung

In den Speicherblock wird Programmcode geladen und dort gestartet. Der Programmcode beginnt ab <Basisadresse + 100H> und hat folgende Form:

34 ... 3C47H-mal ... 34 C9

Der Operationscode 34H entspricht dem Befehl INC (HL), C9H dem Befehl RET. In die Speicherzelle <Basisadresse + 1> wird der Wert 00H geladen und das Unterprogramm mit HL = <Basisadresse + 1> aufgerufen. Nach erfolgreicher Abarbeitung des Programms wird in der Speicherzelle <Basisadresse + 1> der Wert 47H erwartet. ACHTUNG: Da die fehlerhafte Abarbeitung des Programmcodes auch zum Absturz des Rechners führen kann, wir dieser Test nur ausgeführt, wenn die vorher für diesen Block absolvierten Tests fehlerfrei waren, ansonsten wird für den Test ein “-“ statt dem “P“ angezeigt. 

I ... Schreiben der Blockidentifizierung

Das abschießende ’I’ in der Testfolge schreibt die Werte mm und bb in die Speicherzellen <Basisadresse> und <Basisadresse + 1> und füllt den Rest des Blocks mit einem eindeutigen Pseudo-Zufallsmuster (16 Bit m-Sequenz mit Startwert mm:bb). Das Rücklesen erfolgt erst im nächsten Durchlauf am Beginn der Testfolge für diesen Block (Datenerhalt-Test). 

R ... Refresh-Test

Es wird eine Warteschleife abgearbeitet, deren Dauer in Sekundenschritten wählbar (siehe Kommandozeilen-Parameter) ist. Für die Dauer dieser Schleife erfolgen keine Schreib-/Lesezugriffe in den zu testenden Speicherblock. Der Datenerhalt muss während dieser Zeit allein durch den M1-Zyklus-Refresh gewährleistet werden. Die Warteschleife ist so dimensioniert, dass für je 1024 M1-Zyklen eine Zeit von 8,67 ms gebraucht wird. 

Kommandozeilen-Parameter:   Dem Programm TEST können bis zu drei Parameter beim Programmaufruf übergeben werden:

TEST ff ss rr

Der Vorgabewert für nicht angegebene Parameter ist jeweils 0.

Der Parameter ff beeinflusst die Art der Fehlerausgabe im Fehlerfenster. Mit zunehmenden Wert ff wird die Ausgabe im Fehlerfenster beschleunigt, der Informationsgehalt im Gegenzug aber verringert:

ff = 0 ... Paging, wartet nach 14 Zeilen auf Tastenbetätigung
1 ... fortlaufendes Scrollen über großes Fehlerfenster 
2 ... fortlaufende Fehlerausgabe einer Zeile, dafür ist das Statusfenster entsprechend größer 
3 ... Fensteraufteilung wie bei ff = 2, aber nur Ausgabe des Fehlerzählers eeee:eeee

 

Der Parameter ss legt den Schaltzustand der zu testenden Module fest:

ss = 0 ... Die zu testenden Module sind im Normalfall ausgeschaltet. Das jeweils aktuelle Modul wird eingeschaltet und nach dem dazugehörenden Test wieder ausgeschaltet. 
1 ... Alle zu testenden Module werden zum Beginn einer jeden Runde eingeschaltet. Nach dem dazugehörenden Test wird das aktuelle Modul ausgeschaltet.

 

Voraussetzung für den Test mit ss = 1 ist, dass alle zu testenden Module nach Schachtnummern geordnet, beginnend mit der kleinsten, in die Datenstruktur des Testprogramms eingetragen werden.

Grundsätzlich muss sichergestellt sein, dass kein nicht zu testendes (aktiv geschaltetes) Modul ein zu testendes Modul überdecken kann. Im Zweifelsfall sollten alle nicht am Test beteiligten Module zuvor ausgeschaltet werden. Die internen RAM8-Blöcke werden automatisch durch das Programm geschaltet.

Der Parameter rr legt die Länge der Warteschleife (Test ’R’) in Sekunden fest. Alle Werte von 00 bis FF sind zulässig.

Das Testprogramm kann jederzeit durch Drücken der BRK-Taste abgebrochen werden. Die Abfrage der BRK-Taste erfolgt jeweils am Ende der Tests eines Blocks und nach jeder Zeile, die im Fehlerfenster ausgegeben wird.

Erzeugen der Modulliste:   Das Menüwort TESTM im CAOS-Menü dient der automatischen Generierung von Datensätzen für die Tests mit dem Menüwort TEST. Wenn komplette Module getestet werden sollen, ist es damit nicht erforderlich, den Assemblerquelltext zu bearbeiten und die Tabellen am Anfang neu zu schreiben. Dies geht einfacher mit dem Kommando TESTM:

TESTM ohne Argumente durchsucht alle internen und externen Module des KC und zeigt die gefundenen Module zur Kontrolle an. Nach maximal 20 Modulen bricht die Suche ab, da der für die Daten vorgesehene Speicher maximal 20 Module aufnehmen kann.

Es lassen sich aber auch gezielt einzelne oder mehrere Module in den Test aufnehmen. Dazu sind diese einfach als Liste von Argumenten hinter TESTM anzugeben. Zur Kontrolle wird auch hier wieder angezeigt, welche Module erkannt und in der Liste aufgenommen wurden. Beispiel:

TESTM 03 04 10 F0 F1

Es werden die internen Speicher RAM8 (Steckplatz 03), RAM4 (Steckplatz 04), sowie die Module auf Steckplatz 10, F0 und F1 getestet. Bekannte Module, die automatisch erkannt werden, sind:

RAM4 ... 1 oder 2 Ebenen, abhängig von CAOS-Version
RAM8 ... 2 oder 14 Ebenen abhängig von Speicherausbau und CAOS-Version
M022 ... 16 KByte
M024 ... 32 KByte
M011 ... 64 KByte
M036 ... 128 KByte
M032 ... 256 KByte
M034 ... 512 KByte
M035 ... 1 MByte

Nach Ausführung des Kommandos TESTM ist nur die Definitionstabelle erzeugt. Der eigentliche Test erfolgt erst durch das Kommando TEST, bei dem weitere Parameter angegeben werden können.

Ausgabe der Fehlerstatistik:   Im CAOS-Menü steht weiterhin das Menüwort BLIST zur Verfügung, mit dem nach Durchführung der Tests eine Fehlerstatistik ausgegeben wird. Jeder Block, in dem ein Fehler erkannt wurde, erscheint mit einer Zeile der Form

mm:bb eeee:eeee [I10ESBWP]

Die Angaben haben folgende Bedeutung:

        mm ... Moduladresse 
        bb ... Blocknummer
 eeee:eeee ... Anzahl der Fehler, die insgesamt in diesem Block erkannt wurden (32 Bit)
[I10ESBWP] ... hier erscheinen nur die Zeichen der Tests, bei denen im Block Fehler aufgetreten sind