#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: UTF-8 | 0
|