80-Bus Journal |
Mai 1983 · Ausgabe 5 |
Die Idee der frei definierbaren Drucker-Schnittstelle beim
BLS-Pascal
hat sicherlich ihre Vorteile, wenn man bedenkt, wie viele verschiedene
Drucker und somit auch verschiedene Schnittstellen es zur Zeit auf dem
Markt gibt; ja es ist sicherlich ein „Muß“ für den
Software-Anbieter, dem Anwender so viel Freiraun zu lassen. Doch hat
diese Idee auch einen kleinen Nachteil, den ich mit diesem Artikel zu
beheben versuche. Anwender dieser Pascal-Version werden es sicherlich
schon als störend empfunden haben, wenn es einmal vergessen wurde, vor
dem Initialisieren des
BLS-Pascal
die Druckerroutine einzutippen
und/
Zurueck zum Thema. An diesen eben aufgeführten Stellen kann man nun bequem seine Erweiterung einschieben. Ab der Adresse E158 steht nun der Abschnitt AUTO-INIT, der erstens dafür sorgt, daß die zuvor gestrichenen Befehle NOM und INC DE nachgeholt werden, und dann wird eine Änderung des Vektors für die Ausgabe(Drucker)-Routine vorgekommen. Ab der Adresse E162H steht dann ein Programm zur Ansteuerung des Druckers. Im Ass.-Listing finden Sie ein Programm, welches einen Drucker über den vom Monitor unterstützten seriellen Port ansteuert. Man beachte, daß anders als ZEAP das Pascal-System kein Line-Feed ausgibt und dies noch in Drucker-Programm erledigt werden muß. Sollte jemand von Ihnen bei der Änderung Probleme haben, bin ich gerne bereit, weiterzuhelfen; vor allem denke ich an diejenigen, die keinen Prommer haben (bitte Rückporto und Angaben über die Druckerroutine bei legen (ich kann nur 2716 programmieren)).
Hier noch etwas, was man auf jeden Fall wissen muß, was aber nicht im Manual erwähnt wird: sollte man aus Gründen der Anpassung an die eigene Drucker-Routine das Line-Feed-Problem softwaremäßig lösen wollen, so ist der Befehl in Zeile 280 unbedingt notwendig, da sonst der Print-Befehl mit ‚Control "P,"L‘ die erwünschte Zeilennummerierung nur in der ersten Zeile zustande bringt. Als mir dies widerfuhr, dachte ich zuerst, eines der anderen Register, welches vielleicht als Zähler benutzt wird, würde von meiner Routine verändert. Ein Test der Routine DF 6F mit NAS-DIS zeigte mir aber schließlich das, was ich erwartet hatte: es werden keine Register durch diese Routine verändert. Wie schon weiter oben erwähnt wurde, war ein Test der gesamten Drucker-Routine in Verbindung mit den Pascal-Compiler nicht möglich, also blieb mir nur noch das Absuchen des Assembler-Listings als einzige Alternative.
An dieser Stelle möchte ich gerne eine Frage an unsere NAS-SYS-Spezialisten stellen: gegeben sei Folgendes — das Programm (in diesem Fall wäre es der Pascal-Compiler) ändert mit dem Befehl NOM ( DF 71 ) die Adresse der Ausgabe-Tabelle. In der neuen Tabelle wird dann die Ausgabe-Routine UOUT (75H) eingetragen. Wird nun im Laufe des Programms ein Zeichen mit dem Befehl ROUT (RST 30H) ausgegeben, so springt das Programm bei Erreichen dieses Befehls zu „NAS-SYS“ mit dem Zeichen im A-Register. Von dort geht es dann zur Adresse 0C77H, wo ein Sprung zur Benutzer-Routine steht. Und nun die Frage: Warum ist es nicht möglich, in der Benutzer-Routine einen Befehl wie z.B. BRKPT (RST 20H) oder MRET (DF 5B) zur Ausführung zu bringen, damit man eventuell zu Anfang und zum Ende die Register testen kann? Mir ist es auch unter noch so großen Bemühungen nicht gelungen, meinen Nascom zu bewegen, mir an den wichtigen Stellen die Register zu zeigen. Ich hoffe es kann mir hier jemand weiterhelfen.
(Anmerkung der Redaktion: Der Grund, warum die Registeranzeige in einem Ausgabeprogramm nicht funktioniert, ist ganz einfach: Auch die Registeranzeige ruft ebenfalls dasselbe Ausgabeprogramm auf, das untersucht werden soll, um eben die Register anzuzeigen. Dann läuft das Programm immer wieder auf den Breakpoint auf; es kommt also gar nicht zur Anzeige der Register. Bei NAS-SYS-3 wurde auch das verbessert, jedenfalls kann ich damit durch meine Druckerroutine „Singlesteppen“. Vermutlich wird der RST-Befehl E7 erst nach der Registeranzeige wieder zurückgeschrieben. GK)
Im Assembler-Listing fand ich nach langem Suchen bei der Adresse E742H die entscheidende Stelle, wo mit den Befehl RST 30H ein Zeichen ausgegeben wurde. Erst nachdem das Zeichen über die vom Benutzer definierte Schnittstelle ausgegeben wurde, erfolgte der Vergleich, ob das im Register A stehende Zeichen ein CR war. Erfolgt ein Zero bei diesem Vergleich, so springt das Prgramm zu einem Unterprogramm, mit welchem die Zeilennummer generiert und ausgegeben wird. Analog dazu steht dann folgendes: kehrt das Programm mit LF (0AH) aus der Routine zurück, so heißt das für dieses, daß noch nicht alle Zeichen der Zeile gedruckt wurden, und es fährt mit der Ausgabe fort, bis der END-BLOCK-MARKER kommt. Bei dieser Untersuchung endeckte ich dann auch die Speicherstelle, in der die Zeilennummer zwischengespeichert wird. Da man sie für eventuelle Manipulationen gebrauchen kann, soll ihre Adresse auch nicht verschwiegen werden: (0C91H).
| Seite 5 von 28 |
|---|