back : next : content =

 

7 *** Bug Collection

Eine Zusammenstellung von Fehlern in den verschiedenen ROMs, soweit sie dem Autor bekantgeworden sind, und ohne Anspruch auf Vollständigkeit. Als Fehler wurde hier alles eingeordnet, was bei Benutzung des QL in dokumentierter Weise Daten, programe oder Geräte stört und womöglich in Gefahr bringt.

Auf die Hardware ist nur kurz Bezug genommen.
Referenz ist in erster Linie das MGG-Rom, dann JS, mit TK2 und Trump-Card, Teils auch Gold-Card.
Aus (Zeit- und) Platzmangel sind die SQ-Varianten hier kaum berücksichtigt.

Irreguläre Anwendungsmöglichkeiten werden nicht als Fehler angesehen. Ein paar dieser mitunter durchaus nützlichen Effekte sind hier auch verzeichnet.
 
 

* A *

ARC : MGG, MINERVA
Bei MGG um Null und Pi, bei Minerva 'nur' um Pi, wird in den Bereichen +/- 11° nichts gezeichnet, an einer Stelle eine unregelmäßige gekrümmte Linie außer Zusammenhang. Abhilfe nur durch richtige Code-Procedur. Eine Lösung ist hilfsweise mit der Turtle-Graphik bei sehr erhöhter Laufzeit möglich.

ATAN u.a. transzendente Funktionen : JS
Der memory kann durch einen Adressierungsfehler im ROM smashed werden, Schäden aller Art sind möglich.
Der Fehler läßt sich sehr leicht korrigieren, wenn der Systemcode im RAM liegt (z.B GoldCard): Man ersetzt das Byte $90 auf Adresse $4356 durch $98.
 

* B *

Basic
Man kann die Priorität des Interpreters auf 0 setzen. Damit schaltet man dann aber die Tastatur mit aus.

Basic-Definitionen Minerva
Überdefinierte Basic-Befehle werden, wenn sie entfernt wurden, auch sonst nach NEW oder LOAD, weiter mit der ehemaligen Zeilennummer als program-Definitionen aufgerufen.

BEEP : alle Sinclair ROMs, MINERVA anscheinend nicht mehr.
1. Wird während der Datenübergabe zum IPC ein Job eingerichtet oder entfernt, kann der QL steckenbleiben. Der Basicbereich wird dabei verschoben und die Parameter geraten durcheinander. Abhilfe mit Processor-Code im Supervisor-Mode oder durch Compilieren.
2. GoldCard und MGG, MINERVA : BEEP 0,22 piept in anderer Tonlage, als BEEP 30000,22 was an daran liegen könnte, daß bei den 680xx-Processoren genaue Laufzeitberechnungen für Warteschleifen nahezu unmöglich sind.

BLOCK : bis MGG
Einen BLOCK von 512 Pixel Breite zu zeichnen ist nicht möglich. Zwei Blöcke ersatzweise oder CLS führen zum Ziel.

Break : bis MGG
1. In einer einzeiligen recursiven Procedur erfolgt keine Reaktion auf Unterbrechung aus der Tastatur (Break). Es hilft nur, sie auf mindestens 2 Zeilen zu verteilen.
2. Wenn man nach BREAK in einer Procedur EDIT Zeilennummer eingibt, dann gibt es meist die Meldung 'Not implemented' und eine falsche Zeile erscheint. Keinesfalls diese Zeile editieren, man kann damit das program zerstören. CLEAR oder erneut BREAK und EDIT Zeilennummer hilft.

BV.CHRIX : MINERVA, SQ
MINERVA: D0 mit -1 signalisiert keinen Fehler. Dieser Wert wird zurückgegeben, wenn keine memoryaktion erforderlich war.
SQ: keinerlei Fehlerhinweise, außer u.U. Systemzusammenbruch.
D0 nach BV.CHRIX ist zwar nicht spezifiziert, MGx gibt jedoch die übliche Codierung zurück., ebenso MINERVA - was bis zum Erscheinen der SQs ja durchaus vorteilhaft war: Man muß nicht abstürzen! Es sind nach Fehlermeldung auch alternative Aktionen denkbar!
 

* C *

CLEAR : MGG, MINERVA
1. Erscheint nach CLEAR ein "Syntax Error", kann jede weitere Operation dazu führen, daß der QL nicht mehr arbeitet. Ein Basic-Job bei MINERVA ist dann oft nicht mehr zu retten. Ein sicheres Verfahren ist sonst, erneut CLEAR einzugeben. Damit sind auch Folgeerscheinungen, die womöglich irgendwo das System durcheinandergebracht haben können, beseitigt.
2. Minerva-Basic-Jobs : CLEAR wirkt nicht, solange gerade ein anderer Basic-Job aktiv ist. Während das program sonst alle Befehle weiter abarbeitet, erfolgt die damit verbundene memoryfreigabe erst, wenn der betreffende Basic-Job (mit CTR/C oder einer 'pick'-Funktion) freigegeben ist.

CLS : alle Sinclair ROMs
Es gibt abwegige Nutzungsmöglichkeiten, aber auch böse Fallen, mit einigen undokumentierten Parametern (s. auch PAN und SCROLL):

    8 STRIP 0
    9 INK 0
  10 FLASH 1
  11 UNDER 1
  12 OVER 0
  16 POINT 0,0
  20 SCALE PI * 10^-618 - Damit keinesfalls die Graphik benutzen.
  97 PAUSE
  98 INPUT ohne Parameter-RETurn
  99, 100 dto mit Müll im Bild
105  nicht vorhander SD.EXTOP-Aufruf ohne Wiederkehr.
108 3 Pixel gestreifte BORDER
114 Cursor auf nächste Zeile
115 Cursor ein Zeichen nach links
116 dto. rechts
120 SCROLL -10
121 dto., oberes Teilwindow
122 dto., unteres
123 PAN ziemlich weit nach rechts
CURSOR : JS
CURSOR a,b,c,d funktioniert nur im Kanal 1, in anderen Kanälen nur mit 2 Parametern.
Der Fehler kann leicht korrigiert werden, wenn der Systemcode im RAM liegt (z.B. GoldCard): Das Byte $67 auf Adresse $66CC ist durch $6A zu ersetzen.
MINERVA :
Gegenüber MGG, JS, MF ist bei Bezug auf das Graphiksystem der Cursor um 4 Pixel nach rechts verschoben. Dazu kommt ein weiterer Versatz unregelmäßig von bis zu zwei Pixeln schwer vorherbestimmbar abhängig von der Position im Bild.
 

* D *

DATA bis JS
Wenn in einer DATA-Zeile eine Angabe mit Klammer "(" beginnt, wird der Rest der Zeile ignoriert.

DEFine allgemein : alle ROMs
1. Sprünge an das Ende des programs dauern länger als an den Anfang: Mit dem Aufruf beginnt die Suche nach niedrigen Zeilennummern hin. Es ist sinnvoll, wichtige oft benutzte Proceduren in die Nähe vor den Aufruf zu stellen.
2. Aufruf oder Editierversuch einer gelöschten Prozedur oder Funktion am Ende eines programs kann zum Steckenbleiben führen. An Schluß sollte stets eine Zeile stehenbleiben.

DIM : any QL
The last index of a DIMed string is the string length, which in contrary to what seems to be believed by many QL users just because of repeated (careless!) statements is NOT a bug nor an "undocumented feature", but is clearly stated in the User Guide (re Keywords, DIM).

DIV : bis JS
Integer-Zahlen des Basic können zu falschen Resultaten führen: 32768 ist im Zweierkomplement nicht darstellbar, der QL nimmt sie aber (durchaus richtig) als -32768 an.
 

* E *

ELSE IF : any QL but Minerva
Ein gelegentlich eher nützlicher Fehler macht unerwartet und undokumentiert ELSE IF zum Strukturwort, das mit dem Ende der einleitenden IF-Abfrage aufgelöst wird:

IF bedingung "true"-Teil ausführen
ELSE IF alternative : zweiter "true"-Teil
ELSE nicht.erfüllt END IF

Womit zugleich klar wird, warum diese ansich richtige Struktur zu Fehlern führt:

IF bedingung true.teil
ELSE IF alternative : ausführung : END IF : END IF

Es ist dabei nur ein "END IF" anzugeben, oder man schreibt mit Doppelpunkt

ELSE : IF alternative : ausführung : END IF : END IF

Error : alle ROMs
1. Eine Fehlermeldung geht verloren, wenn sie nach neu geöffnetem Basic-Kanal #1 bei beschäftigtem Kanal #0 auszugeben wäre. Das liegt an der Annahme in den Roms, daß Kanal #1 die Identifizierung $00010001 habe. Der Kanal darf beliebig oft geöffnet und geschlossen werden, wobei er nie wieder dieselbe Nummer erhält. So ist er dann für die Systemmeldungen nicht mehr auffindbar.
2. MINERVA: Basic Jobs Hier gilt dasselbe. Natürlich kann auch ein Kanal #0, identifiziert mit 0, in einem neuen Job nicht mehr vorhanden sein. So gibt es bei den Meldungen Probleme, die vielfach zum Verlust des Jobs führen.
3. bis JS (MGG ?): Jedesmal, wenn nach einer Fehlermeldung RUN eingegeben wird, verliert man 16 Bytes memoryplatz. Selbst NEW gibt sie nicht zurück. Aufruf von EDIT oder Start mit GOTO 1 unmittelbar danach helfen.
4. MGG: Kommen zwei Fehlermeldungen zurück, und lautet die letzte "Syntax Error", ist unbedingt erst CLEAR vor irgendeiner anderen Aktion einzugeben. Sonst bleibt der QL stecken oder baut Fehler auf, die sich erst später zeigen werden.

ERR_DF : alle ROMs
Abfrage von ERR_DF (Drive Full) kann zum Zusammenbruch des Systems führen. TK2 u.a. berichtigt diesen Fehler.

WHEN ERRor
JS : Funktioniert nicht nicht immer.
MGG : Mit TK2 zuverlässig, die Fehlerabfrage muß immer ein END WHEN "sehen".
MINERVA : Heikel! Editieren der definierenden Zeile kann die merkwürdigsten Ergebnisse liefern, bis hin zum vollständigen Zusammenbruch des Systems.
SQ : WHEN variable ist vorsichtshalber garnicht erst eingerichtet.
 

* F *

FILL : bis MGG
Füllt dieselbe Linie zweimal, wenn man vorher OVER -1 eingegeben hat.

FOR/REPEAT : alle ROMs
Man kann einmal je Zeile die Kurzform von FOR/REPeat- Schleifen verwenden. Verschachtelte Schleifen sind mit END FOR/END REPeat abzuschließen.
 

* G *

GO SUB wird in einer einzeiligen FOR Schleife als END FOR bewertet.
 

* H *

Hardware : Hängenbleiben bei allen Geräten
1. Bei längerem Betrieb kann es vorkommen, daß der QL den Dienst versagt. Aber nur dann, wenn die Ursache sicher nicht mit irgendwelchen Systemerweiterungen zusammenhängt, sollte man sich die Mühe machen, an die Hardware zu gehen. Oft ist mit solch einer Erweiterung, auch wenn sie sich sonst bewährt haben mag, das gesamte System weit weniger fehlertolerant. Die Gründe in der Hardware sind nie so recht klar geworden. Es heißt, daß es Probleme mit der Refresh- Steuerung der dynamischen Ram gebe. Dergleichen ist schwer zu analysieren. In {14} wird geraten, die Anschlüsse aller gesockelten Bauteile zu reinigen. Meist ist nur unzureichende Kühlung des Spannungsreglers die Ursache. Legt man ihn nach Außen, ist das Problem oft schon gelöst. Reinigen der Steckkontakte wird aber immerhin nicht schaden.
2, bis MGG Die Tastenkombination CTRL-ALT-7 lähmt den Rechner. Das ist sicher bekannt. Es gibt aber auch Geräte, wo dies mit der 5 oder der 2 geschehen kann. Aus Basic heraus ist keine Abhilfe möglich. Bei direkter programierung ist die Trap-Tabelle zu verändern. Dazu SV.TRAPV und MT.TRAPV im Textteil.
 

* I *

IPC : STAT_CMD : alle Sinclair ROMs {QLW 2/89 }
Der Aufruf liefert immer die Nachricht, daß kein MDV- Schreibschutz bestehe. In solchen Fall wird zwar nicht geschrieben, die Hardware sorgt für Sicherheit. programe erfahren davon erst nach acht vergeblichen Versuchen mit Abbruch wegen "bad or changed medium".
 

* K *

KEYROW : s. 'Tastatur'
 

* L *

LBYTES/SBYTES : alle ROMs
Wird ein File mit LBYTES gleich nach dem Sichern geladen, sind womöglich Änderungen nicht aufgezeichnet. Der Geschwindigkeit wegen werden sie aus den Slave-Blocks heraus an ihre Position im File gesetzt. Die Operation wird durch LBYTES unterbrochen. Die Betriebssysteme nutzen nicht die zum sicheren Abschluß eines SAVE-Vorganges vorgesehene Qdos-Trap FS.FLUSH. Auch FS.CHECK könnte Aufschluß geben und entsprechende Schutzmaßnahmen erlauben. Notfalls gibt Warten bis zum Stillstand des Laufwerks Sicherheit, was aber nicht immer programiert zu überwachen ist ist.
 
SMSQ
In SBASIC-Jobs geladene Erweiterungen gehen verloren, sobald ein (Basic-)Programm geladen wird, rsp nach jedem Aufruf von NEW.
 

* M *

MDV : bis JS
Nach Aufruf von MDV8 arbeitet MDV2 nicht mehr richtig.
alle ROMs :  Solange eines der Laufwerke in Betrieb ist, kann ein neuer FORMAT-Befehl zum Hängebleiben führen.
Gold-Card, LV2: Files werden oftmals nicht oder fehlerhaft gelesen.

MERGE : alle ROMs
Ein File aus direkten Kommandos, also ohne Zeilennummer, ist mit MERGE nur zu laden, wenn es nicht mehr als eine Zeile enthält. Sonst wird das u.U. File nicht mehr geschlossen. Hilfsweise ist das Schließen durch CLOSE_Q% aus IO1 {13} nachträglich möglich, nachdem zuvor mit CH_CHAN$ der richtige Kanal herausgesucht wurde.

MODE : alle ROMs
Durch einen Fehler im Befehl geht beim ersten Aufruf ein Teil von SV.TVMOD verloren. Danach ist nicht mehr feststellbar, in welchem Modus (MONITOR/FS) die Bildausgabe sich befindet. In einer neuen Definition zur Korrektur wäre lediglich noch D2 mit -1 an die Trap zu übergeben.
 

* N *

NET: MGG andere nicht geprüft : TK2 enthält womöglich die Fehlerursache
Der QL kann steckenbleiben, wenn beim Sender ein noch bestehender Netzwerkkanal auf einen nicht mehr existierenden Kanal des Empfängers geschlossen werden soll. Eine vom Autor zum Schutz des Tastaturkanals geschriebene CLOSE-Procedur für Basic-Kanäle vermeidet dies, sodaß vermutlich Handler und Hardware in Ordnung sind. Der Sendetransistor ist wohl nicht die Ursache {QLW, 1/90}.
 

* P *

PAN : alle Sinclair ROMs
Wie bei SCROLL und CLS gibt es Abwegiges zu berichten. Hier nur ein paar womöglich brauchbare Beispiele:

PAN #kanal,anzahl.bytes%,40
    verstellt den Filepointer um "anzahl.bytes%" .
PAN #kanal,115 aktiviert den Cursor in #kanal,
PAN #kanal,116 schaltet ihn wieder ab.

POINT : MGG
Setzt Pixelmuster entsprechend der gerade gültigen INK aus drei Parametern. Abhilfe durch neue Codierung der Procedur (TK2).

Pointer Interface
1. Initialisierung der Primärwindow
Die Routinen des Pointer Interface übernehmen die memoryverwaltung nach Öffnen eines Primärwindows mit der ersten I/O-Operation. Sollte vorher irgendeine Aktion mit den windown abgelaufen sein, wird deren memory durcheinandergeraten. Gewöhnlich ist er danach verloren. Schon irgendein Aufruf, der die windowgestalt berührt, schafft Abhilfe (z. B. PAPER 0).
2. memoryorganisation
Das Pointer-I.F. kann das System verderben, bis hin zum Datenverlust, wenn bei ungenügendem memory zwischen zwei windown umzuschalten versucht wurde (CTRL/C). Es hilft nur Überwachung dahingehend, daß stets 32K freien memorys verfügbar bleiben. - Notfalls Sichern der Daten vor Aufgabe eines windows! Ursache ist falsche Berechnung des Platzbedarfs zum Zwischenmemoryn der windowdaten, was anscheinend seit den 1.6x-Versionen endlich korrigiert ist.

PROT_DATE : Gold-Card v2.15
Nette Einrichtung zur Beruhigung des Anwenders. Schutzwirkung nur beim Aus- und Einschalten, versagt aber bei einem Systemzusammenbruch.
 

* Q *

QDOS-Vectoren : alle ROMs
Sicherheitshalber ist das Fehlerregisters zu prüfen, da die Flags nicht immer in der dokumentierten Weise ankommen.
 

* R *

RENUMBER: bis JS, auch manche MINERVA
Kann mit DATA-Zeilen Fehler verursachen, die unmittelbar am Anfang des programes stehen. Z.B. erste Zeile REMark hilft.

RI.ATAN - s.o., ATAN
 

* S *

SCROLL : alle Sinclair ROMs
Ähnlich CLS kann auch SCROLL undokumentierte Parameter aufnehmen. In einem Falle ist dies ganz vorteilhaft:

SCROLL #kanal,file.position%,42

setzt einen Filepointer auf die 16-Bit-"file.position%", entsprechend FS.POSAB. Relativ setzen läßt er sich z.B. mit PAN, s. dort.

SER : bis MGG
Nach OPEN oder COPY usw. kann ein SER2-Kanal nicht richtig geschlossen werden: CLOSE schließt den Eingang von SER1 und den Ausgang von SER2. Es bleibt nur, den Stecker herauszuziehen {14}.
alle ROMs:
Bei schnellem Datentransport auf mehreren Wegen des IPC zugleich können einzelne Zeichen verlorengehen oder durcheinandergeraten. Die Ursache liegt in den Grundstrukturen des IPC. Ohne entscheidende Neuerungen ist Abhilfe nicht möglich. Darum ist solch ein Ansturm zu vermeiden.
SQ: Die Z-Option funktioniert nicht.
 

* T *

Tastatur-Eingabe : JS {QLW 6/88}
1. Die Taste CTRL/SHIFT/ESC wird als 160 gelesen, wenn der Feststeller aktiviert wurde, 128 ohne SHIFT. 160 sollte bei CTRL/SHIFT/"2" kommen.
2. alle Sinclair ROMs: Diagonale Cursorsteuerung zusammen mit ALT oder CTRL führt zu mehrdeutigen Ergebnissen bei Maus- oder Keyrow-Abfrage.
 

* V *

VARIABLE - Parameter : JS
1. Bei mehr als 9 lokalen Variablen in einer Procedur kann alles Mögliche passieren. Mitunter werden die Variablennamen durch PRINT ersetzt.
2. Man in einem Select-Statement nur den jeweils letzen Para-meter der Übergabeliste einer Procedur/Funktion verwenden.
3. MINERVA: Der Typ unbenutzter Übergabeparameter kann in der Parameterliste einer Funktion oder Procedur nicht festgelegt werden. Es wird stets Typ 2 (f.p. Zahl) angenommen.

Flieszkommadarstellung bei Werten um +/- 2^32 : JS, MGG
Kettenrechnungen der Art 2^32+2-2^32 führen zu falschen Ergebnissen, die nicht nur durch die definierte Rechengenauigkeit zu erklären sind. Das Resultat Null muß man hinnehmen, nicht aber 4 als Ergebnis obigen Beispiels.
-2^32 wird als -(2^32) ausgerechnet.
MINERVA: -2^32 = (-2)^32 und 2^32-2^32+2 = 2. Aber 2^32+2-2^32 = 0.

String : bis JS
1. Das direkte String-Slicing gibt seinen memoryplatz nicht frei. Ummemoryn vermeidet das: b$=a$(3 to 6):print b$
2. MINERVA: Der erste Parameter ist nur dann entbehrlich, wenn der Teilstring, der ab dem Anfang geschnitten werden soll, nicht einem dimensionierten String entstammt. Dort ist in altbekannter Manier zu verfahren. Bei der Übergabe an eine Procedur haftet dem String der dimensionierte Typ auch dann an, wenn er solchem als Teilstring entnommen wurde.
3. alle ROMs: Stringvergleich arbeitet nur bei Zeichen unter Code 128 und über Code 231 eindwandfrei. Dazwischen nicht immer. Auch wenn Ziffern am Anfang stehen, gibt es Fehler. Es hilft nur geeigneter Code bei direkter programierung.
4. bis JS: READ oder INPUT eines String in den Teil eines undimensionierten String bleibt ohne Erfolg. Basic stoppt ohne Fehlermeldung. Abhilfe durch Ummemoryn.

VER$ : bis MGG
Ist erst in eine Arbeitsvariable zu laden, wenn daran eine Operation durchgeführt werden soll. Sonst kann der QL steckenbleiben.
 

* W *

WINDOW : alle Sinclair ROMs
Der Befehl wertet die letzten vier Parameter aus, dazu ggf. den ersten, wenn das Hash-Zeichen davorsteht. Sind mehr Parameter angegeben worden, bleiben sie ohne Fehlermeldung unbeachtet.
 



top : back : next : content 

= (count)