★ APPLICATIONS ★ DIVERS ★ Ohne Wartezeiten : Spooler ★ |
Spooler (CPC Amstrad International) | Applications Divers |
Spooler sind eine nützliche Einrichtung für alle, die viel drucken und dabei nicht immer auf den langsamen Drucker warten wollen. Neben der Möglichkeit einer Hardware-Lösung (externer Pufferspeicher zwischen Computer und Drucker) gibt es auch noch die Soft-ware-Lösung, das heißt die Emulierung eines Spoolers im vorhandenen RAM-Speicher: der Spooler zum 'Nulltarif'. Manche werden jetzt sagen, das sei nichts Neues, und sie haben tatsächlich schon mehrere Spooler-Versionen in ihrer Programmsammiung. Aber viele Lösungen, die bisher erschienen sind, waren allzu starr aufgebaut, und die meisten hatten einen entscheidenden Nachteil: Sie belegten Speicherplatz im Hauptspeicher. 16-kByte-Drucker-Spooler für 4 Byte Hauptspeicher Das hier vorzustellende,Programm entstand aus dem Wunsch heraus, die Text Verarbeitung TASWORD auf einem CPC 464 mit einem Spooler zu ergänzen. Da TASWORD neben dem Programm-Code ohnehin nur wenig mehr als 10 kByte für den eigentlichen Text übrig läßt, kam es gar nicht in Frage, den Drucker-Puffer im Hauptspeicher zu organisieren. Die vorhandene SILICON DISC von dk'tronics sollte den Speicherplatz abzwacken. Zusätzlich wurde das Treiberprogramm, das im Hintergrund läuft, in den oberen Teil des Sound-Puffers gelegt, weil man normalerweise während der Textverarbeitung keine exzessiven SOUND-Kommandos gibt. Bleiben lediglich 4 Bytes, die für die Verwaltung des RSX-Befehls SPOOLER im Hauptspeicher belegt werden. So geht's Wer über die SILICON DISC verfügt, kann das Assembler-Listing (in der vorliegenden Form für den DEVPAC GENA-Assembler) einfach abtippen und assemblieren. Anpassungsvorschläge für andere Konfigurationen folgen weiter unten. Der Object-Code muß unter dem Namen 'SPOOLER.BIN' gesichert werden. Dann das SPOOLER-LADEPROGRAMM abtippen und als 'SPOOLER.BAS' sichern. Danach kann das Programm gestartet werden. Das Initialisierungsprogramm löscht sich selbst: Ein weiterer Start würde bis zum System-'Absturz' führen. Werden die entsprechenden Befehle in eigene Programme eingefügt, muß sichergestellt werden, daß sie bei einem Neustart des Programms nicht nochmal aufgerufen werden. Das Treiberprogramm belegt jetzt die obere Hälfte des Sound-Puffers (Also mit Sound-Kommandos sparsam umgehen, es darf aber getrost mal 'gepiepst' werden). Der eigentliche Drucker-Puffer belegt jetzt die oberste 16-kByte-Bank der SILICON DISC. Das bedeutet, Sie müssen darauf achten, daß immer mindestens 16 kByte freibleiben, da es sonst zu Überschneidungen und somit zu Datenverlust kommt. Aufgrund der 254-kByte-Kapazität der SILICON DISC hat sich dies in der Praxis als unproblematisch erwiesen, so daß hier auf einen Schutzmechanismus verzichtet wurde. Während der Spooler aktiv ist, sollte nicht mit der SILICON DISC gearbeitet werden, weil diese die Interrupts offensichtlich nicht sperrt. Die physikalische Floppy kann aber bedenkenlos in Gang gesetzt werden. Der Spooler kann mit der Tastenkombination CTRL+ESC ausgeschaltet werden. Eine entsprechende Meldung erscheint auf dem Schirm. Die Wirkung tritt sofort ein. Sofern der Drucker nicht selbst über einen Zwischenspeicher von mehr als einer Zeile verfügt, hört er sofort nach Beendigung der Zeile auf zu drucken. Der Spooler ist jetzt 'leer'. Dies ist nicht nur die Notbremse. Auch bei zeitkritischen Anwendungen kann es sinnvoll sein, wenn nichts gedruckt werden soll, den Spooler abzuschalten, weil das Treiberprogramm im FAST-TICKER-Interrupt (300 mal/sec.) läuft und damit doch spürbar Zeit beansprucht. Der Spooler kann jederzeit wieder eingeschaltet werden mit dem RSX-Befehl SPOOLER. Dabei berücksichtigt das Programm, ob der Spooler noch arbeitet. Und so funktioniert's Jedes Zeichen, das jetzt zur Centronics-Schnittstelle des Rechners geschickt werden soll, wird über den 'verbogenen' Vektor IND MC WAIT PRINTER an das Treiberprogramm übergeben. Dieses blendet nun an Stelle der RAM-Bank 1 die SILICON-DISC-Bank 15 ein. Das heißt, an den Adressen &4000 bis &7FFF liegt jetzt nicht der Hauptspeicher, sondern die obersten 16 kByte der SILICON DISC. Dieser Speicher wird nun mit dem zu druckenden Zeichen geladen. Dann wird das original RAM zurückgeblendet. Für das nächste Zeichen wiederholt sich dieser Vorgang komplett, weil vor jedem Zeichen 'nachgesehen' werden muß, ob noch Platz ist. Wenn Sie also mehr als 16 kByte drucken wollen, müssen Sie einen Teil ausdrucken lassen, bevor Ihr Computer wieder 'frei' wird. Der Drucker-Puffer wird als Ringspeicher behandelt, das heißt, er muß nicht vollständig geleert werden, bevor er neu gefüllt werden kann. Geleert wird der Puffer praktisch genauso. Nur daß die Routine, die dies erledigt in die Schnell-Takt-Liste eingetragen wurde. Das Programm läuft daher im Hintergrund und versucht, 300mal in der Sekunde ein Zeichen an den Drucker 'loszuwerden'. Das gelingt natürlich nur, wenn der Drucker kein BUSY-Signal sendet. Aus der Beschreibung des Verfahrens sollte klarwerden, daß sich der Spooler nur mit 'sauber' programmierten Anwenderprogrammen vertragen kann, das heißt, es müssen für den Druck auch tatsächlich die Betriebssystem-Vektoren benutzt werden. Sonst gehen die Druckaufträge am Spooler vorbei. Anpassung an andere Konfigurationen Modifikationen lassen sich am besten im Assembler-Listing vornehmen. Eine Verschiebung des Adreßraums, der für den Beide genannten Verschiebungen sind nur über das Assem-bler-Listing sinnvoll, weil sonst zu viele Adressen angepaßt werden müßten. Liegt eine andere Speichererweiterung vor, z.B. die zweiten 64 kByte im CPC 6128, die natürlich nicht gleichzeitig von einem Anwenderprogramm benutzt werden dürfen, so müssen Sie zuerst feststellen, mit welchen OUT-Befehlen die zusätzlichen Bänke eingeblendet werden können. Für den CPC 6128 war eine solche Tabelle in der PC International 11/87 (S.39) abgedruckt. Wollen Sie z.B. die Bank 7 des CPC 6128 anstelle der Bank 1 einblenden, also im Adreßraum &4000 - &7FFF, so erreichen Sie das mit dem Befehl: OUT &7F00, &C7 Dabei ist &7F00 die Portadresse und &C0 der zu übergebende Wert. Wollen Sie das nun auf das Assemblerlisting übertragen, so müssen Sie in den Zeilen 67 und 109 die Befehle LD BC, #7FFF durch LD BC, #7FC7 ersetzen. Dadurch wird das B-Register mit dem High-Byte der Portadresse geladen und das C-Register mit dem zu übergebenden Wert. Der folgende Befehl OUT (C),C müßte eigentlich OUT (B),C heißen, um seine Wirkung richtig zu beschreiben. Denn aufgrund der unvollständigen Adressierung der I/O-Adressen im CPC ist das B-Register entscheidend und das C-Register unmaßgeblich. Das Zurückblenden der Original-Bank muß nicht geändert werden. Es sei denn, Sie haben Ihre eigenen Konfigurationswünsche. Liegt bereits der Object-Code vor, so kann an die zum Programmanfang relativen Adressen &6E sowie &B1 der Wert &C7 eingetragen werden, und schon wird die entsprechende Bank benutzt. Voraussetzung ist natürlich, daß das Programm in seiner Länge nicht verändert wurde. Spooler ohne Speichererweiterung Wollen Sie den Spooler ohne Speichererweiterung benutzen, so suchen Sie sich einen geeigneten RAM-Bereich und tragen wie oben beschrieben die entprechenden Werte für UNTERG und OBERG ein. Dann löschen Sie im Assemblerlisting alle Befehle, die eine Bankumschaltung vornehmen, also die Zeilen 66 bis 68, 70 bis 72, 109 bis 110 und 112 bis 113. Hinweis Die im Assemblerlisting verwendeten Zeilennummern sind nur als Eingabehilfe gedacht, bitte nicht mit abtippen.
|