000
09.05.2010, 19:32 Uhr
danielk
|
Hallo,
seit einigen Wochen schon kämpfe ich mit einem Hardware-Problem, das mir einfach keine Ruhe lässt. Ich glaube, heute endlich des Rätsels Lösung gefunden zu haben. Wenn meine Beobachtungen korrekt sind, hat die Koppelsteuerung des D004 einen Fehler. Und zwar nicht nur bei mir, sondern im originalen Design.
Um da wirklich sicher sein zu können, brauche ich Hilfe. Zunächst würde ich gerne in Erfahrung bringen, ob das Problem wirklich bei allen D004 auftritt. Der Fehler kann wie folgt reproduziert werden:
1. Benötigt wird ein KC 85/4 oder KC 85/5 mit D004-Aufsatz. Ein D002 Busdriver kann dazwischen stecken, muss aber nicht.
2. Im Schacht F0 oder F4 muss sich ein Modul M008 bzw. M021 befinden. Die Prioritätskette darunter sollte ununterbrochen sein.
3. Nach dem Einschalten des Systems im CAOS-Menü folgendes ausführen:
Damit wird (ausschließlich) die Koppelsteuerung der D004 aktiviert. Bei CAOS 4.4 ist dies nicht unbedingt notwendig, da die D004 schon beim Start initialisiert wird.
4. Die Datei DIGGERJ.KCC (Diskette 023 des KC-Clubs) in den KC laden. Wie das geschieht, ist unerheblich. V.24, USB, Kassette oder Diskette gehen alle, wobei bei der Verwendung von Disketten natürlich die D004 zunächst in der CAOS-Betriebsart gestartet werden muss, womit Punkt 3 entfällt.
5. Falls nicht schon geschehen, das Spiel mit der Eingabe von DIGGER im CAOS-Menü starten.
6. Die Taste "P" drücken und den folgenden Bildschirm mit Enter bestätigen, um mit dem ersten Level zu beginnen. Nach dem Erscheinen des Levels nochmals Enter drücken. Die Uhr am oberen Rand sollte jetzt loslaufen und der Diamant fällt herunter.
Wenn Ihr jetzt problemlos Digger spielen könnt, ohne das irgendetwas passiert, dann habt Ihr das Problem offenbar nicht. Probiert auch mal den Joystick aus, falls Ihr einen habt. Wenn allerdings die Uhr nach wenigen Sekunden stehen bleibt, alles einfriert, und der KC auf keinerlei Eingaben mehr reagiert, dann habt Ihr offenbar das gleiche Problem wie ich.
Soweit der erste Teil. Es wäre super, wenn sich ein paar Tester fänden und das Ergebnis zurückmelden würden.
Dieses Problem beschäftigt mich wie gesagt schon seit Wochen. Ich hatte im Laufe der Zeit folgende Beobachtungen gemacht:
1. Das M008 muss im D004 stecken. Im Grundgerät oder im Busdriver gibt es keine Probleme. Das Problem tritt sowohl mit als auch ohne Busdriver zwischen D001 und D004 auf.
2. Der Fehler tritt nur auf, wenn die Koppelsteuerung aktiv ist (angezeigt duch die LED "CONNECTION" am D004). Die weiteren Bits im Steuerwort haben keinen Einfluss auf das Ergebnis. SWITCH FC FB reicht aus, um das Problem verschwinden zu lassen.
3. Nach dem Einfrieren des Systems liegt auf der /INT-Leitung dauerhaft Low-Pegel. Der Sender ist das Grundgerät, nicht die D004 (durch Auftrennen festgestellt).
4. Die Joystick-Routine hat die Besonderheit, dass sie die PIO des M008 alle 20 ms (50 Hz) einen Interrupt auslösen lässt. Darüber hinaus sorgt Digger dafür, dass Interrupts mit einer Frequenz von 17,5 kHz auf die CPU einprasseln. Man kann das gleiche Phänomen inklusive des Einfrierens auch mit Jungle 2.0 beobachten.
5. Das Trennen der Verbindung von D306 Pin 8 zur Leitung /KZKR genügt, um das Einfrieren zu verhindern. Das gleiche gilt, wenn stattdessen Leitung /OE von D415 Pin 9 getrennt wird. Verbindet man den Anschluss wieder für einen kurzen Moment während das Spiel läuft, friert der KC sofort ein. Ohne Trennen der Verbindungen kann man leider mit dem Oszilloskop nichts sehen, da nur ein kurzer Impuls zu reichen scheint.
Ich habe das ganze Wochenende mit Messen und Schaltungsstudium verbracht, und konnte keine Abweichung der Funktion vom Stromlaufplan feststellen. Ich habe dabei Ulrich Zanders korrigierte Pläne benutzt. Ich wollte schon aufgeben, doch dann fiel mir folgendes auf:
In der Logik der Koppelsteuerung erfolgt das Zuschalten des Koppel-RAM auf den Datenbus bei /IORQ. Für die Richtungssteuerung wird zusätzlich noch /WR ausgewertet. Was jedoch nicht ausgewertet wird, ist /RD oder /M1! Wenn /WR High-Pegel führt und /IORQ aktiv ist, und die sonstigen Bedingungen wie Zugriffsadresse usw. erfüllt sind, dann wird einfach ein Lesezugriff angenommen und der Bustreiber D415 auf den Datenbus zugeschalten.
Dass dies tatsächlich so ist, habe ich mit den Messungen in Punkt 5 nachgewiesen: Für einen kurzen Moment wird der Koppel-RAM auf den Datenbus gelegt, obwohl Digger sicherlich nichts mit der D004 im Sinn hat.
Da gibt es aber nun ein Problem: Der Interrupt-Acknowledge der Z80-CPU wird durch /M1 und /IORQ angezeigt. Man darf also bei aktivem /IORQ und inaktivem /WR nicht einfach einen Lesezugriff annehmen. Daher meine These: Das Zuschalten des Koppel-RAM auf den Datenbus stört den Interrupt-Request/Interrupt-Acknowledge-Zyklus, was das Einfrieren des Systems zur Folge hat.
Um diese These zu testen, habe ich meine Bustreiberplatine im D004 so umgebaut, dass statt dem originalen /IORQ die Verknüpfung von /(IORQ x /M1) zur Hauptplatine geführt wird. Das Ergebnis: es funktioniert! Digger mit Joystick läuft jetzt, und CP/M macht auch noch was es soll.
Das soll jetzt erst mal reichen. Ich habe auch schon ein paar Überlegungen zur der Frage angestellt, warum das M008 im D004 stecken muss. Dazu später mehr. Jetzt will ich erst mal Testergebnisse sehen.
Puuh. *schweißvonderstirnwisch* Dieser Beitrag wurde am 09.05.2010 um 21:14 Uhr von danielk editiert. |