back : next : content =
 

3.8             ***     Arbeitstabellen

Es gibt drei besondere Tabellen, die vom System bei gewissen Prozessen der Datenbearbeitung benutzt werden.

Dies sind die Tabellen für den Zeichensatz zur Umsetzung der ASCII-Zeichen in Bildpunkte, die Tabelle der Systemmeldungen, und die Tabelle zur Umsetzung von ASCII-Zeichen zur Sendung aus den SER-Anschlüssen der seriellen Kanäle.

Alle lassen sich frei definiert dem System eingliedern.
 
 

3.8.1   **      Zeichensatz

Schriftzeichen und sonstige zu sendende Zeichen werden in binären Bytes transportiert. Für den umgekehrten Weg gilt natürlich dasselbe. Zur Ausgabe von Schriftzeichen an ein Sichtgerät sind also für die Bildpunkte dort entsprechende Muster zu ermitteln. Der QL enthält einen Processor im ZX8301, dessen Arbeitmemory mit diesem Punktmuster von der CPU her beschickt wird.

Die Adresse dieses Videomemorys findet sich auf Offset 50 in den Tabellen aller Bildschirmkanäle. Zugleich halten diese auch zwei Adressen in SD.FOUNT (42,46), die auf einen zweigeteilten Zeichensatz weisen.

Diese sind aufgebaut
 
   0 .b ASCII-Code des ersten Zeichens 
   1 .b Anzahl definierter Zeichen 
   2 9.b Bitmuster für das erste Zeichen, 
beginnend mit der oberen Linie im Bild, 
dargestellt werden die 6 höchstwertigen Bits. 
11 ... weitere Gruppen zu 9 Bytes
 
Es folgen die Muster für die angegebene Anzahl Schriftzeichen in Reihenfolge aufsteigender ASCII-Werte. Das zuerst angegebene Muster wird benutzt, wenn das eigentlich Gesuchte nicht in der Tabelle vorhanden ist.

Wir gehen erst einmal davon aus, daß nur eine solche Tabelle definiert worden sei. Der Ptr zum zweiten Teil des Zeichensatzes steht in diesem Fall auf Null.

Wenn als erste gültige Ausgabe das Zeichen der Nummer 32 gelten soll, als letzte das Zeichen 127, werden 97 Zeichen ab Nummer 31 definiert. Bei der Ausgabe erscheinen dann die Muster für die Zeichen 31 bis 127 in der definierten Weise. Die Zeichencodes 0 bis 30 und 128 bis 256 werden mit dem Muster für das Zeichen 31 im Bildschirm angezeigt.

Je nach QL-System ist es durchaus möglich, den Zeichensatz mit Null beginnen zu lassen, und sämtliche 256 Zeichen im selben Block zu definieren. Außerdem, da der übergebene Code als Byte ausgewertet wird, kann man in allen QL-Versionen den eigentlich nicht mehr darstellbaren Codes 256 bis 287 die Muster für die Zeichen 0 bis 31 zuordnen.

Die Angabe zweier Teiltabellen als Standardform im QL gibt den nötigen Spielraum.

Dazu bleibt die erste Tabelle so, wie oben angegeben. Der Rest an Zeichen, 128 bis 255, oder bis 287 (Standard bei MINERVA), folgt in der zweiten Tabelle. Auch darin wird wieder das erste ungültige Zeichen zuerst angegeben.

Nun wird das System die erste Hälfte durchsuchen, ist das Zeichen dort nicht vorhanden, was ja aus den ersten zwei Bytes schnell zu ermitteln ist, sucht es nach der zweiten Tabelle. Wenn der Ptr im Definitionsblock entsprechend besetzt ist, wird dort nach dem Zeichen weitergesucht. Ist es auch dort nicht vorhanden, wird der Fehlanzeige gemäß das erste Muster aus dem zweiten Teil ausgegeben.

Übergabe der Ptr erfolgt mit Hilfe der QDOS-Trap SD.FOUNT (3/37). Die Angabe Null für einen der Ptr bewirkt dabei das Zurückstellen auf die systemeigene Tabelle.

HINWEIS:
In manchen Systemen darf Bit 1 in den Zeichensätzen nicht gesetzt sein (vor JM, alte Versionen SMSQ und Atari-E-Software).
 

3.8.2           **      Systemmeldungen

Dies sind die Texte, die als Fehlermeldungen an die Basic-Kanäle Null oder notfalls Eins ausgegeben werden. Auch die Einschalt-Nachricht zur Auswahl der Betriebsart für die Bildschirmdarstellung, und die weiteren Informationen über laufende Fehlerbehandlung, die Namen der Monate u.a.

Zuvor ein Hinweis:
Datumsbezogene Berechnungen in ABACUS basieren auf den englischen Monatsnamen. Sind diese verändert worden, wird es nach endloser Rechnerei schließlich ganz utopische und zu weiteren Arbeiten völlig untaugliche Ergebnisse anzeigen. Mitunter kann diese Rechnerei mehrere Stunden dauern, und es scheint, als sei das program steckengeblieben. Das aber ist nicht der Fall. Sind noch wichtige Daten im Rechner, die nicht verlorengehen sollen, lohnt sich das Warten.
Und fortan wird man vielleicht auf überzogenes "Eindeutschen" verzichten...

Standardmäßig stehen die Texte irgendwo im System-ROM und werden bedarfsweise herausgesucht. Neue Definitionen sind mit der Trap MT.TRA (3/36) mittels entsprechend aufzubauender Tabellen möglich. In den Systemvariablen wird der Ptr auf den Tabellenanfang in SV.MGTAB auf $14A(sb) notiert und kann dort auch vom Basic aus gelesen oder neu gesetzt werden. Steht dort Null, so gelten (wieder) die Systemmeldungen aus dem Rom.
 
 
basis 0000 $4AFB Konventionszahl
  0002 erster.text-basis rel Ptr zum String
  0004 zweiter.text-basis dto.
...
  003A text.29-basis dto.
  003C text.30-basis dto.
...
text29   count.w + "meldungstext 29"  
text30   count.w + "medungstext 30"  
 

Es sind beliebig viele Meldungen definierbar, solange sie mit 16-Bit-Offsets gegenüber der Basisadresse erreichbar sind. Dabei sind die eigentlichen Fehlermeldungen ab ERR.NC (-1) einzutragen, in bekannter Weise als Standardstrings aufgebaut. Bis -27 haben alle Codes solche Texte. Sämtliche Zeichen, auch die Länge Null, sind darin zulässig.
Die Tagesnamen, dann die der Monate, werden in festem Format zu Dreiergruppen von sieben resp. zwölf Abkürzungen jeweils ohne Trennzeichen und Längenangabe angefügt.

Zusätzliche Texte trägt man dann wieder im Standardformat ein.

Eine Basic-Procedur, mit der solche Meldungen frei definiert und zusammengestellt werden können, ist in "MDVtest" mit Namen SET_ERRMS enthalten. Dazu ist TK2 oder Ähnliches erforderlich. Beim Aufruf wird nach entsprechender Abfrage ein File "ERR_M#1.00" erzeugt. Von da an können die neuen Meldungen mit LBYTES geladen und mit TRA 0,basisadresse aktiviert werden.
 
 

3.8.3           **      ASCII-Umsetzung

Die zweite durch den TRA-Befehl beeinflußbare Funktion wird mit Hilfe der Tabelle gesteuert, deren Adresse in SV.TRTAB auf $146(sb) steht. Auch dort gilt mit Null die Standardtabelle aus dem Rom. Zusätzlich in den nationalen Ausgaben der MG-Roms eine unterschiedliche Tabelle, wenn Eins eingetragen wurde. Das entspricht dann dem Befehl TRA 1. Die QDOS-Übergabe erfolgt auch hier mit MT.TRA (3/36). Die Tabelle ordnet den Ausgabedaten diejenigen ASCII-Codes zu, die über die seriellen Schnittstellen tatsächlich gesendet werden.

Hier lassen sich alle Einzelzeichen an jegliche Drucker anpassen, und auch die dümmlich eingetragenen "?" anstelle vermeintlich "nicht definierter" Zeichen ersetzen. Besonders interessant bei den Psion-programen, wo die Konfiguration zur Ausgabe nur wenige Umsetzungen zuläßt. Diese können nun den längeren Zeichenkombinationen vorbehalten bleiben. Besonders, da in der Tabelle noch die Möglichkeit vorgesehen ist, einzelne Zeichen in Gruppen von bis zu drei Zeichen umzusetzen.

An der entsprechenden Codeposition steht die ASCII-Nummer des Zeichens, das gesendet werden soll. Die Null hat zweifache Bedeutung. Im ersten Teil signalisiert sie, daß in der zweiten Tabelle eine erweiterte Definition zu dem Code angegeben ist, der ihrer Position entspricht. Dort wiederum werden damit nicht benötigte Bytes auf Viererposten aufgefüllt.
 
basis 0000 $4AFB Konventionszahl 
  0002 liste1-basis Ofs zu den Einzelzeichen
  0004 liste2-basis Ofs zu den Zeichengruppen
liste1 0006 zeichen.00 Code für CHR$(0)
  0007 zeichen.01 Code für CHR$(1)
... bis CHR$(255)
liste2 0000 anzahl.gruppen  Byte, ggf. Null
  0001 zeichen.x0 erste zu ersetzende Nummer
  0002 ausgabe.x0.1 bis zu drei Zeichen, die 
stattdessen gesendet werden; 
auf Viererposten mit Null aufgefüllt.
  0005 zeichen.x1 nächste zu ersetzende Nummer, 
wie oben
... etc. ...
  xxxx zeichen.nn bis alle mit Null markierten Zeichen der ersten Anordnung definiert sind.
 

"mtra_dat" aus den program(ier)beispielen zeigt den Aufbau einer vollständigen Meldungstext- und Zeichenumsetzungs-Tabelle.
 
 



top : back : next : content 

= (count)