#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();
}
*/
}
Vorgefundene Kodierung: ANSI (CP1252) | 4
|
|