Source file: /~heha/hs/glpntdrv.zip/kdoio.cpp

#include "glpntdrv.h"

static void FirstCmdFkt()	{}
static void Out()		{WRITE(0,(UCHAR)pCmdBuf->n[i].arg);}
static void Move()		{WRITE(0,READ(0)&0x80|UCHAR(pCmdBuf->n[i].arg));}
static void in()		{pCmdBuf->retval=READ(0);}
static void Clock()		{WRITE(0,READ(0)^0x80);}
static void Fastout()		{WRITE(0,~READ(0)&0x80|UCHAR(pCmdBuf->n[i].arg));}
static void Strobe()		{WRITE(2,READ(2)&0xDE|UCHAR(pCmdBuf->n[i].arg));}
static void QuickBusy()		{READ(1);}
static void SetINI()		{WRITE(2,READ(2)|0xE4);}	// RESET (INIT) = HIGH
static void Busy()		{pCmdBuf->retval=io.Busy();}
static void DataOut()		{io.DataOut(UCHAR(pCmdBuf->n[i].arg));}
static void ReadDatenRegByte()	{pCmdBuf->retval=io.ReadDatenRegByte();}
static void ReadDatenRegWord()	{pCmdBuf->retval=io.ReadDatenRegWord();}
static void ReadDatenRegPin1_20()	{pCmdBuf->retval=io.ReadDatenRegPin1_20();}
static void ReadDatenRegPin21_40()	{pCmdBuf->retval=io.ReadDatenRegPin21_40();}
static void ExternalDelay()	{ExternalDelay(pCmdBuf->n[i].arg);}
       void Enable()		{if (DisableCallCount) DisableCallCount--; if (IsIrplHigh) {IsIrplHigh=FALSE; ResetIrql();}}
static void Disable()		{DisableCallCount++; if (!IsIrplHigh) {IsIrplHigh=TRUE; SetIrqlHigh();}}
static void SetLptAddress()	{SetLPTAddress(pCmdBuf);}
static void MeasureBusySpeed()	{pCmdBuf->retval=io.MeasureBusySpeed();}
static void WaitForNotBusy()	{pCmdBuf->retval=io.WaitForNotBusy();}
static void GetKernelVer()	{pCmdBuf->retval=2;}
static void FreeLptAddress()	{ExternFreePort();}
static void LastCmdFkt()	{i=5000;}

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

extern "C" bool doio(CMDBUF*cmdbuf) {
 pCmdBuf=cmdbuf;
 if (DisableCallCount) {
  if (!IsIrplHigh) {
   IsIrplHigh=TRUE;
   SetIrqlHigh();
  }
 }
 for (i=0;i<5000;i++) {
  ULONG j=cmdbuf->n[i].func;
  if (j>=elemof(fkt)) {		// 25
   doio_error=1001;
   return false;
  }
  fkt[j]();
  if (doio_error) return false;
 }
 if (IsIrplHigh) {
  IsIrplHigh=FALSE;
  ResetIrql();
 }
 return true;
}
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded