4PRN Cookie
***********

Dieser Cookie wird vom Treiberprogramm zur 4-Druckerport-Karte Mulpri 
eingerichtet. Diese Karte stellt 4 Druckerports zur Verfgung, die 
kompatibel zum Originalport sind (inklusive Eingabefunktion) und 
softwaremig 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 betrgt. Mchte man die Funktion eines bestimmten 
Strukturelements nutzen, mu man zuerst anhand der Anzahl prfen, ob es 
existiert.

Alle Funktionen mssen im Supervisormode aufgerufen werden. Parameter 
werden C-mig auf dem Stack bergeben. Die Routinen knnen 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 Rckgabewert wird in Register D0 
geliefert. Nicht erklrte Bit im Eingabeparameter sind auf 0 zu setzen, 
nicht erklrte Bit des Ausgabeparameters knnen beliebige Werte haben. 
Register D0, D1, A0, A1 werden durch die Routinen zerstrt. Wenn nicht 
extra angegeben, beeinflut eine Routine die Einstellung des aktiven Ports 
nicht, obwohl sie durchaus kurz in- und zurckschalten knnte.

Damit es beim Multitasking kein Chaos gibt, sind zwei LOCKED-Zustnde 
definiert. Beim "Normalzustand" LOCKED1P wurde ein bestimmter Port 
aktiviert. Andere Programme drfen 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 fr 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 Erklrung benutzt, wo eine 1, 2, 4 
oder 8 fr den Druckerport 1 bis 4 stehen kann. Diese ungewhnliche 
Numerierung wurde aus Geschwindigkeitsgrnden 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 */
  LONG (*Presall)();  /* Zeiger auf Funktion zum alles reservieren */
  LONG (*Pbswitch)(); /* Zeiger auf Funktion zum BIOS-Port umschalten */
} Vierprn;

  
LONG Maxfun
Anzahl der insgesamt vorhandenen 32Bit-Werte

LONG Activport
Mgliche 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 
fr Interruptroutinen gedacht. Spezialhinweis: Nur bei IPL7 knnen Wert und 
eingestellter Port differieren. Man sollte deshalb nie in einem 
IPL7-Interrupt (der nichtmaskierbare, kann z.B. vom VME-Bus ausgelst 
werden) auf 4-Port-Zeug zugreifen. Umgehungsvariante (auch fr 
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 unmglich war.

LONG Pbusy(WORD pp)
liefert Busy von Port pp
pp:       Px
Rckgabe: BUSY-Bit des Ports pp in bit0

LONG Pstrobe(WORD pp, WORD strobe)
setzt STROBE-Signal von Port pp
pp:       Px
strobe:   bit5 reprsentiert Pegel fr STROBE-Leitung
Rckgabe: 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
Rckgabe: nichts
Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf 
dieser Funktion sinnlos wre. Falls man einzelne Bits setzen/lschen 
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
Rckgabe: -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 wre. 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 Rckmeldung ist -1. Die Routine wartet 
also nicht.
 
LONG Presall(WORD l4p)
l4p:
0
    hebe LOCKED4P-Zustand auf.
1
    aktiviere LOCKED4P-Zustand.
    liefert  0, wenn Aktivierung wegen eines LOCKED unmglich war.
            -1, wenn LOCKED4P aktiviert wurde

DIESE FUNKTION EXISTIERT NOCH NICHT!
LONG Pbswitch(WORD bswitch)
bswitch:
-1
   erfrage Nummer des aktiven BIOS-Ports
   liefert 0,  falls BIOS-Port nicht fest sondern gleich Activport
           Px  des aktiven BIOS-Ports
0
   trennt festgelegtes BIOS-Gert 0 (PRN) vom Port. Danach werden Ausgaben 
   ber PRN BIOS-0 wieder durch Pswitch() beeinflut.
Px
   schalte das BIOS-Gert 0 (PRN) fest auf Port Px. Umschaltungen der Ports 
   mit Pswitch() lenken die Ausgaben ber PRN BIOS-0 nicht mehr um. Liefert 
   Px des vorher festen BIOS-Ports oder 0, wenn PRN nicht fest war.

 
Druckerspooler
--------------
Hier ahne ich schon viele Probleme...
So knnen 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 gewnschte (nicht-)BUSY-Bedingung 
vorliegt, dann darf die Ausgabe erfolgen. Andernfalls mu der Interrupt 
beendet werden.

Natrlich kann sich ein Spooler auch in einen Timer-Interrupt einhngen und 
dann einfach auf Verdacht die Routine Pput aufrufen. Anhand des 
Rckgabewertes stellt er fest, ob er sein Byte losgeworden ist oder nicht.


Harun Scheutzow, (C) SWB 27.07.1993 und spter
letzte nderung: 07.08.1993

Harun Scheutzow
Dresdener Strae 83
10179 Berlin

Email:
im Mausnetz:      Harun Scheutzow @B
aus dem Internet: Harun_Scheutzow@B.maus.de
