Source file: /~heha/hsn/glpntdrv.zip/h#s/kdoio.cpp

#include "glpntdrv.h"

long GALEP::Nop(long)			{return 0;}
long GALEP::Out(long v)			{WRITE(0,(UCHAR)v); return 0;}
long GALEP::Move(long v)		{WRITE(0,READ(0)&0x80|UCHAR(v)); return 0;}
long GALEP::in(long)			{return READ(0);}
long GALEP::Clock(long)			{WRITE(0,READ(0)^0x80); return 0;}
long GALEP::Fastout(long v)		{WRITE(0,~READ(0)&0x80|UCHAR(v)); return 0;}
long GALEP::Strobe(long v)		{WRITE(2,READ(2)&0xDE|UCHAR(v)); return 0;}
long GALEP::QuickBusy(long)		{READ(1); return 0;}
long GALEP::SetINI(long)		{WRITE(2,READ(2)|0xE4); return 0;}	// RESET (INIT) = HIGH
long GALEP::Busy(long)			{return KrnlInterfaceHdw::Busy();}
long GALEP::DataOut(long v)		{KrnlInterfaceHdw::DataOut(UCHAR(v)); return 0;}
long GALEP::ReadDatenRegByte(long)	{return ReadDatenReg(2,8);}
long GALEP::ReadDatenRegWord(long)	{return ReadDatenReg(2,16);}
long GALEP::ReadDatenRegPin1_20(long)	{return ReadDatenReg(0x0A,20);}
long GALEP::ReadDatenRegPin21_40(long)	{return ReadDatenReg(0x0C,20);}
long GALEP::ExternalDelay(long us)	{KeStallExecutionProcessor(us); return 0;}
//void KrnlInterfaceHdw::Enable()	{if (DisableCallCount) DisableCallCount--; if (IsIrplHigh) {IsIrplHigh=FALSE; ResetIrql();}}
//void GALEP::Disable()		{DisableCallCount++; if (!IsIrplHigh) {IsIrplHigh=TRUE; SetIrqlHigh();}}
long GALEP::MeasureBusySpeed(long)	{return KrnlInterfaceHdw::MeasureBusySpeed();}
long GALEP::WaitForNotBusy(long)	{return KrnlInterfaceHdw::WaitForNotBusy();}
long GALEP::GetKernelVer(long)		{return 2;}

// Einige Funktionen benutzen das Argument aus der Tabelle, einige liefern einen Returnwert.
long(GALEP::*const GALEP::vtbl[])(long)={
 &GALEP::Nop,			//	  NOP
 &GALEP::Out,			//	  Out(0,arg), Taktbit = Bit 7
 &GALEP::Move,			//	  Out(0,arg), Taktbit belassen
 &GALEP::in,			// retval=In(0), Datenport rücklesen
 &GALEP::Clock,			//	  Taktbit wechseln
 &GALEP::Fastout,		//	  Out(0,arg), Taktbit wechseln
 &GALEP::Strobe,		//	  Out(2,arg), aber nur Bit 0 (Strobe) sollte benutzt werden, AF,INI,SEL bleibt
 &GALEP::QuickBusy,		//	  In(1), Eingabedaten verwerfen
 &GALEP::SetINI,		//	  INI=H (komisch! Es gibt keine Möglichkeit, INI auf L zu schalten.)
 &GALEP::Busy,			// retval=In(1), Bit 7 invertiert, d.h. 0x80 wenn BUSY=H, 0x00 wenn =L
 &GALEP::DataOut,		//	  Out(0,arg), anschließend Taktbit wechseln, mit Wartezyklen
 &GALEP::ReadDatenRegByte,	// retval=8 Bit lesen
 &GALEP::ReadDatenRegWord,	// retval=16 Bit lesen
 &GALEP::ExternalDelay,		//	  (arg) µs warten
 &GALEP::ExternalDelay,		//	  (arg) µs warten
 &GALEP::Nop,//Enable,		//	  früher: Interrupts freigeben, hier: IRQL herabsetzen
 &GALEP::Nop,//Disable,		//	  früher: Interrupts sperren, hier: IRQL hochdrehen
 &GALEP::ReadDatenRegPin1_20,	// retval=20 Bit lesen (IC-Fassung Pin 1..20)
 &GALEP::ReadDatenRegPin21_40,	// retval=20 Bit lesen (IC-Fassung Pin 21..40)
 &GALEP::SetLPTAddress,		//	  Portadresse = arg setzen und belegen (dass kein Drucker dazwischenfunkt)
 &GALEP::MeasureBusySpeed,	// retval=Messergebnis (vermutlich für lange Leitungen!)
 &GALEP::WaitForNotBusy,	// retval=Messergebnis (vermutlich für lange Leitungen!)
 &GALEP::GetKernelVer,		// retval=2
 &GALEP::FreePort,		//	  Parallelport freigeben
};

void GALEP::doio(PDEVICE_OBJECT obj, CMDBUF* buf) {
 pDevObj=obj;
 pCmdBuf=buf;
 pCmdBuf->errorcode=0;
 /*
 if (DisableCallCount) {
  if (!IsIrplHigh) {
   IsIrplHigh=true;
   SetIrqlHigh();
  }
 }
 */
 for (int i=0; i<5000; i++) {
  ULONG j=pCmdBuf->n[i].func;
  if (j==elemof(vtbl)) break;		// 24 = Mikrokode-Ende
  if (j>elemof(vtbl)) {
   pCmdBuf->errorcode=1001;
   return;
  }
  long r=(this->*vtbl[j])(pCmdBuf->n[i].arg);
  if (1<<j&0x761A08L) pCmdBuf->retval=r;
  if (pCmdBuf->errorcode) return;
 }
 /*
 if (IsIrplHigh) {
  IsIrplHigh=false;
  ResetIrql();
 }
 */
}
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded