000
05.04.2010, 21:40 Uhr
danielk
|
Eins meiner Lieblingsspiele auf dem KC ist Enterprise (EPRISE.KCB auf Club-Diskette 033). Der ein oder andere wird es wahrscheinlich auf dem Clubtreffen akustisch vernommen haben. Wie dem auch sei, das Spiel zeigt einen Grafikfehler der mich schon des längeren wurmte. Zur Illustration hier mal ein paar Schnappschüsse:
Links oben zeigt den Bildschirm kurz nach dem Start des Spiels. Die Darstellung ist hier noch in Ordnung. Nach ein paar Spielrunden sieht es dann mehr und mehr so aus wie auf den anderen drei Bildschirmfotos. Man kann deutlich erkennen, dass die verwendeten Grafikzeichen offenbar mit Müll überschrieben wurden. In der Regel sieht man die Grafikfehler zuerst im Fernsensorbildschirm. Üblicherweise reicht es zwei oder drei Quadranten leer zu räumen und dann tauchen auch schon die Grafikfehler auf.
Ich habe mich über Ostern mal rangesetzt um die Ursache des Problems zu ermitteln. Zuerst dachte ich natürlich an ein Hardwareproblem, aber das ist es nicht. Nach etlichen Versuchen und Basteleien sowohl am echten Gerät als auch im Emulator kann ich folgendes berichten:
1. Es ist ganz klar ein Softwareproblem; der Fehler tritt auch im Emulator auf. Das Spiel ist allerdings fast vollständig in BASIC programmiert, und die wenigen POKEs lassen sich leicht eingrenzen.
2. Der Fehler ist ausschließlich auf einem KC 85/5 mit CAOS 4.4 zu beobachten. KC 85/3 und KC 85/4 mit CAOS 4.2 funktionieren einwandfrei.
3. Es liegt nicht am eingebetteten Maschinenprogramm, welches zwar inkompatibel mit dem KC 85/4 ist aber keine entscheidende Bedeutung für den Programmablauf hat. Ich habe es probehalber für den KC 85/4 angepasst, womit nun der Grafikeffekt für die Zerstörung der Enterprise korrekt funktioniert. Auf die fehlerhafte Darstellung im Spiel hat dies aber keinen Einfluss.
4. Es liegt auch nicht an den eingestreuten "POKE 862,25"-Befehlen, die anscheinend dem Kopierschutz dienen. Ich habe diese probehalber mal in Kommentare umgewandelt, mit dem Ergebnis das LIST jetzt auch nach dem Programmstart funktioniert. Auf das Spielgeschehen hat das keinen Einfluss.
5. Der BASIC-Autostarter ist auch nicht die Ursache. Der Fehler tritt auch dann auf, wenn man das BASIC-Programm klassisch per CLOAD "EPRISE" einliest und per RUN startet.
6. Die einzigen direkten Speicherzugriffe im BASIC-Programm dienen dem Ablegen der Zeichenbildtabelle im Speicherbereich BC00H...BDFFH, genau wie im System-Handbuch am Beispiel beschrieben. Nach der Initialisierung erfolgen keine weiteren Schreibzugriffe auf diesen Bereich.
7. Der Fehler äußert sich darin, dass nach und nach Teilbereiche der Speicherbildtabelle ab etwa BD00H scheinbar willkürlich mit den Bytes FBH und A0H vollgeschrieben werden. Es sind immer diese zwei Werte, sowohl im Emulator als auch am echten Gerät. In der Regel erscheinen die Müll-Bytes als Paar FBA0H oder A0FBH, aber nicht immer.
8. Und nun der wahrscheinlich wichtigste Hinweis: Das Problem tritt nicht auf, wenn man beim Kaltstart des BASIC-Interpreters den Speicher auf 32767 beschränkt, d.h. den Bereich unter 8000H.
Ich habe wirklich alles doppelt und dreifach geprüft, aber es scheint tatsächlich ein Problem in den Änderungen von CAOS 4.4 zu sein. Natürlich ist es auch möglich, dass der BASIC-Interpreter etwas unerlaubtes tut, was durch Zufall mit CAOS 4.2 noch funktioniert hat. In jedem Fall besteht hier anscheinend eine Inkompatibilität.
Schleichende Speicherkorruption ist eine üble Sache, und es ist nicht auszuschließen, dass auch andere Programme außer Enterprise davon betroffen sein könnten. Vielleicht könnte sich jemand der sich im CAOS-Quellcode auskennt die Sache mal ansehen? Ich selbst bin für's erste erstmal geschafft.
Um die Sache zu erleichtern, habe ich ein paar Dateien zusammengetragen. In dem Verzeichnis findet Ihr das auf den KC 85/4 angepasste Spiel ohne Kopierschutz, in den Varianten mit und ohne Autostart. Die epdump*.kcc-Dateien sind Speicherabzüge. In epdump8.kcc kann man ab Adresse BD00H die überschriebenen Bytes sehen.
So weit, so gut. Jetzt ist, glaube ich, Mario dran. |