4PRN Cookie *********** Dieser Cookie wird vom Treiberprogramm zur 4-Druckerport-Karte Mulpri eingerichtet. Diese Karte stellt 4 Druckerports zur Verfgung, die kompatibel zum Originalport sind (inklusive Eingabefunktion) und softwarem„žig umgeschaltet werden. Cookie-Name: 4PRN Cookie-Wert: Zeiger auf Struktur, beginnend auf gerader Adresse Die Vierprn-Struktur -------------------- Alle Strukturelemente sind 32Bit lang. Die Anzahl der Strukturelemente und damit der Funktionsumfang wird in Zukunft erweitert. Deshalb ist am Anfang die Anzahl eingetragen, die immer mindestens 3 betr„gt. M”chte man die Funktion eines bestimmten Strukturelements nutzen, muž man zuerst anhand der Anzahl prfen, ob es existiert. Alle Funktionen mssen im Supervisormode aufgerufen werden. Parameter werden C-m„žig auf dem Stack bergeben. Die Routinen k”nnen auch 4 Byte hinter ihrem Beginn mit de(m/n) Parameter(/n) in Register D0 aufgerufen werden. Ein einzelner Parameter ist entsprechend als WORD oder LONG zu bergeben. Bei zwei WORD-Parametern ist der erste im Highword und der zweite im Lowword zu bergeben. Der Rckgabewert wird in Register D0 geliefert. Nicht erkl„rte Bit im Eingabeparameter sind auf 0 zu setzen, nicht erkl„rte Bit des Ausgabeparameters k”nnen beliebige Werte haben. Register D0, D1, A0, A1 werden durch die Routinen zerst”rt. Wenn nicht extra angegeben, beeinflužt eine Routine die Einstellung des aktiven Ports nicht, obwohl sie durchaus kurz in- und zurckschalten k”nnte. Damit es beim Multitasking kein Chaos gibt, sind zwei LOCKED-Zust„nde definiert. Beim "Normalzustand" LOCKED1P wurde ein bestimmter Port aktiviert. Andere Programme drfen den aktiven Port bis zur Aufhebung dieses Zustandes nicht umschalten. Die Funktionen zur Ausgabe auf einen ganz bestimmten Port sind davon aber nicht betroffen. Bei LOCKED4P wurde die gesamte Mulpri-Karte von einem Programm reserviert. Eine Umschaltung zwischen den Ports ist bis zur Aufhebung dieses Zustandes nur dem einen Programm gestattet, das die Adresse der Spezialroutine kennt. Wenn sich kein Programm speziell fr die Karte interessiert, ist zwar auch ein Port durchgeschaltet, der Zustand des Treibers aber nicht LOCKED, also frei. Px wird als Platzhalter berall in der Erkl„rung benutzt, wo eine 1, 2, 4 oder 8 fr den Druckerport 1 bis 4 stehen kann. Diese ungew”hnliche Numerierung wurde aus Geschwindigkeitsgrnden benutzt. Vierprn-Struktur in C-Notation ------------------------------ struct { LONG Maxfun; /* Anzahl der Strukturelemente */ LONG Activport; /* Nummer des aktiven Ports */ LONG (*Pswitch)(); /* Zeiger auf Funktion zur Umschaltung */ LONG (*Pbusy)(); /* Zeiger auf Funktion zur BUSY-Testung */ LONG (*Pstrobe)(); /* Zeiger auf Funktion zur STROBE-Steuerung */ LONG (*Psetdata)(); /* Zeiger auf Funktion zum Daten ausgeben */ LONG (*Pput)(); /* Zeiger auf Funktion zum Drucken eines Zeichens */ } Vierprn; LONG Maxfun Anzahl der insgesamt vorhandenen 32Bit-Werte LONG Activport M”gliche Werte: 1, 2, 4, 8. Hier steht die Nummer des aktiven Ports, auch wenn kein LOCKED existiert. Diese Stelle darf nur gelesen werden! Sie ist fr Interruptroutinen gedacht. Spezialhinweis: Nur bei IPL7 k”nnen Wert und eingestellter Port differieren. Man sollte deshalb nie in einem IPL7-Interrupt (der nichtmaskierbare, kann z.B. vom VME-Bus ausgel”st werden) auf 4-Port-Zeug zugreifen. Umgehungsvariante (auch fr Soundchipzugriffe, die normalerweise mit IPL6 oder IPL7 geklammert werden, damit keiner zwischendurch die Registerauswahl „ndert) ist ein Test des auf dem Stack abgelegten Statusregisters. Zeigt diese Statusregister-Kopie ein IPL kleiner 6, so darf man zugreifen. LONG Pswitch(WORD switch) switch: -1 erfrage Nummer des aktiven Ports liefert -1, falls LOCKED4P aktiv ist 0, falls kein LOCKED aktiv ist, also die Ports frei sind Px des aktiven Ports, falls LOCKED1P aktiv ist 0 hebt LOCKED1P-Zustand auf. Ehrlicherweise sollte nur der LOCKED1P-Verursacher es aufheben. Wirkungslos bei LOCKED4P. Px aktiviere Port Px und LOCKED1P ihn. Liefert Px des vorher aktiven Ports oder 0, wenn Umschaltung wegen LOCKED unm”glich war. LONG Pbusy(WORD pp) liefert Busy von Port pp pp: Px Rckgabe: BUSY-Bit des Ports pp in bit0 LONG Pstrobe(WORD pp, WORD strobe) setzt STROBE-Signal von Port pp pp: Px strobe: bit5 repr„sentiert Pegel fr STROBE-Leitung Rckgabe: nichts LONG Psetdata(WORD pp, WORD data) setzt die Daten (bit7..0) von Port pp auf den Wert data pp: Px data: bit7..0 enthalten Datenbit Rckgabe: nichts Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf dieser Funktion sinnlos w„re. Falls man einzelne Bits setzen/l”schen will, sollte man sich den alten Ausgabewert selbst merken. LONG Pput(WORD pp, WORD zeichen) druckt ein Zeichen aus, wenn Drucker nicht busy ist pp: Px zeichen: bit7..0 enthalten auszugebendes Zeichen Rckgabe: -1 wenn Zeichen gedruckt wurde 0 wenn Zeichen nicht gedruckt wurde Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf dieser Funktion sinnlos w„re. Das Zeichen wird auf D7..0 gelegt und /STROBE auf inaktiv (high). BUSY wird getestet. Ist es aktiv (high), so wird sofort mit Fehlermeldung 0 beendet. Ist es inaktiv (low), so wird ein /STROBE-Impuls (low) gegeben, und Rckmeldung ist -1. Die Routine wartet also nicht. Druckerspooler -------------- Hier ahne ich schon viele Probleme... So k”nnen MFP-BUSY-Bit-Interrupt getriebene Druckerspooler korrekt mit 4-Port zusammenarbeiten: Tritt der BUSY-Interrupt auf, muž zuerst getestet werden, ob der eigene Port aktiv ist (Activport). Wenn ja, muž noch getestet werden, ob wirklich die gewnschte (nicht-)BUSY-Bedingung vorliegt, dann darf die Ausgabe erfolgen. Andernfalls muž der Interrupt beendet werden. Natrlich kann sich ein Spooler auch in einen Timer-Interrupt einh„ngen und dann einfach auf Verdacht die Routine Pput aufrufen. Anhand des Rckgabewertes stellt er fest, ob er sein Byte losgeworden ist oder nicht. Harun Scheutzow, (C) SWB 27.07.1993 und sp„ter letzte Žnderung: 07.08.1993 Harun Scheutzow Dresdener Straže 83 10179 Berlin Email: im Mausnetz: Harun Scheutzow @B aus dem Internet: Harun_Scheutzow@B.maus.de