Warum der C 128 nur ein C 119 ist

[RUN, März 1987, bisher unveröffentlicht]

Dieser Artikel wurde für das RUN Computermagazin (CW-Verlag) verfasst und sollte im Frühjahr 1988 veröffentlicht werden. Leider hat man das Magazin vor der Veröffentlichung (mit der Nummer 1/1998) eingestellt. Noch auf der Cebit (Hannover-Messe) wurde für das gleiche Jahr das Erscheinen ein (letzten) Sonderhefts bestätigt [in der 01/88 war es schon für den März angekündigt worden], doch wurde auch dieses nicht mehr erstellt. Ein ähnlicher Artikel "Defekt im CHAR-Befehl" von T. Sperling erschien später in der 64'er (Heft 08/1988, Seite 42) und als Reprint im 64'er Sonderheft 36 (128er Sonderheft, Seite 136).

[Hinweis: Der hier beschriebene ROM-Fehler wurde mit der zweiten ROM-Version des C 128, wie sie im C 128 DCR, in der SuperCPU128 und im VICE-Emulator Verwendung findet, korrigiert. Trotzdem ist dieses Phänomen zu berücksichtigen, wenn Programme erstellt werden, die auf jedem C 128 lauffähig sein sollen.]

Betriebssystemfehler im C 128 


Bei der Programmierung eines umfangreichen Textverarbeitungsprogrammes für den C 128 kam es zu seltsamen Erscheinungen. Als der Programmumfang ca. 50-KBytes erreicht hatte, wurden Zeilen mit hohen Zeilennummern nicht mehr gefunden, Listings erfolgten 'rekursiv' und blinkende Zeichen 'verzierten' PRINT- und REM-Zeile

Nach langwieriger Suche entdeckte ich den CHAR-Befehl im 80-Zeichen-Modus als Ursache für diese Kapriolen. Ich war auf einen Fehler im Betriebssystem des C 128 gestoßen, der bisher offensichtlich noch unbekannt war.

Anrufe bei Commodore in Frankfurt sollten Aufklärung bringen, doch leider war der 'Experte' trotz mehrerer Versuche nie zu erreichen. Ich habe daher selbst eine Lösungsmöglichkeit für dieses Problem gesucht. Daraus ist dann der folgende Artikel entstanden:


Der defekte 'CHAR'-Befehl
oder
Warum der C 128 nur ein C 119 ist


Ein bislang noch unbeachteter Betriebssystemfehler verbirgt sich im 'CHAR-Befehl des C 128. Wird dieser Befehl im 80-Zeichen-Modus (Graphic 5) verwendet, kann es bei längeren Programmen (ab ca. 50 KBytes bzw. ab ca. 40 KBytes bei aktivierter VIC-Graphik) zu 'Abstürzen' kommen.

Bei Durchsicht der Interpreter- und Betriebssystemroutinen, die beim CHAR-Befehl verwendet werden, findet sich die Erklärung für diesen Effekt. Zugleich erklärt sich auch das Phänomen, daß der CHAR-Befehl den VDC-Cursor nicht korrekt positioniert.

Beispiel 1

30 graphic 5
40 print chr$(147)chr$(27)"f";
50 char 1,10,10
60 getkey a$: print a$
90 end


Dieses kleine Beispielprogramm zeigt, daß der Cursor an der falschen Position blinkt, der String a$ aber an der richtigen Stelle ausgedruckt wird.

Bei der Ausführung des CHAR-Befehls wird über die MMU immer (ob 80 Zeichen, 40 Zeichen oder VIC-Graphik) das Zeichensatzrom (Z-ROM) selektiert. Aus diesem ROM werden dann im VIC-Graphik-Modus die Pixel für das Einfügen von Text in Graphik entnommen. Im Text-Modus (40/80 Zeichen) wird der Text wie mit einer PRINT-Anweisung ausgegeben. Das funktioniert im 40-Zeichen-Modus problemlos, im 80-Zeichenmodus aber tritt hier ein Fehler auf.

Da die 80-Zeichen-Routine 'vergißt' den I/O-Bereich anstelle des Z-ROM zu selektieren (beides liegt bekanntlich ab $D000), die Parameterübergabe an den VDC-Chip aber über $D600/$D601 erfolgt, kommen die Daten des CHAR-Befehls nie beim VDC-Chip an (daher kann der Cursor nicht richtig positioniert werden). Statt dessen wird versucht die Daten in das Z-ROM zu schreiben. Dies bliebe ohne Folgen, wenn der C 128 nicht jeden schreibenden Zugriff auf das ROM in die darunterliegende RAM-Bank 0 umleiten würde. So aber werden die RAM-Daten bei $D600 / $D601 zerstört. BASIC-Programme, die den CHAR-Befehl im 80-Zeichen-Modus benutzen, dürfen also nur bis $D5ff reichen - der C 128 wird zum C 119!

Um dennoch die verbleibenden neun KBytes für BASIC-Programme nutzen zu können, bedarf es eines kleinen Kunstgriffes.

Beim CHAR-Befehl erfolgt die Umschaltung auf das Z-ROM über das 'Preconfiguration Register C' (bei $D503) der MMU. Es ist daher möglich, wenn die VIC-Graphic nicht verwendet wird, das 'Precofiguration Register C' so umzuprogrammieren, daß nicht das Z-ROM, sondern immer der I/O-Bereich selektiert wird. Diese Umschaltung muß jedoch unbedingt rückgängig gemacht werden, bevor im Direkt-Modus Programmveränderungen vorgenommen werden!

Folgendes  Programm führt den CHAR-Befehl korrekt aus:

Beispiel 2

10 trap 80
20 bank 15: poke dec("d503"),0
30 graphic 5
40 print chr$(147)chr$(27)"f";
50 char 1,10,10
60 getkey a$: print a$
80 bank 15: poke dec("d503"),1
90 end

(Reinhard Kratzberg)

[Seitenanfang] [Artikel] [Info] [Links] [Download] [Home]
Erstellt von WTE, am 04. Februar 2006; überarbeitet am
14. Februar 2006