LPT под ДОС, не понимаю
int LPT1Base;
unsigned char* iBuf;
int iSize;
unsigned char* oBuf;
int oSize;
//-----------------------------------------------------------------------
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS);
int InputBit;
int InputByte;
int InitLPT1();
void SetInputBuffer(int Size);
void SetOutputBuffer(unsigned char* Buf,int Size);
void WriteToPort();
void ReadFromPort();
void EndReading();
void startTransfer();
//-----------------------------------------------------------------------
int InitLPT1()
{
int* b;
b=(int*) MK_FP(0,0x408);
if (*b!=0)
{
LPT1Base=*b;
outportb(LPT1Base+2,11); InputBit=0;
InputByte=0;
oldhandler=getvect(0x0F);
return 0;
}
else return 1;
}
//-----------------------------------------------------------------------
void SetInputBuffer(int Size)
{
iSize=Size;
}
//-----------------------------------------------------------------------
void SetOutputBuffer(unsigned char* Buf,int Size)
{
oBuf=Buf;
oSize=Size;
SetInputBuffer(Size);
}
//-----------------------------------------------------------------------
void WriteToPort()
{
int i;
for (i=0;i<oSize;i++)
{
outportb(LPT1Base,oBuf);
outportb(LPT1Base+2,14); // STOBE | INIT
outportb(LPT1Base+2,15); // INIT
}
}
//-----------------------------------------------------------------------
void interrupt handler(__CPPARGS)
{
InputBit++;
if (InputBit==9)
{
InputByte++;
if (InputByte=iSize) { EndReading(); return;}
InputBit=1;
iBuf[InputByte]=0;
}
else iBuf[InputByte]<<1;
if (inportb(LPT1Base+1)&16!=0) iBuf[InputByte]++;
else iBuf[InputByte]=iBuf[InputByte]&254;
}
//-----------------------------------------------------------------------
void ReadFromPort()
{
InputBit=0;
InputByte=0;
setvect(0x0F, handler);
outportb(LPT1Base,31); // INIT | IRQ
}
//-----------------------------------------------------------------------
void EndReading()
{
outportb(LPT1Base,15); // INIT
setvect(0x0F, oldhandler);
Цитата:
Originally posted by dlr
Люди добрые, помогите пожалуйста. У меня есть кусок проги (на С под Дос), которая как бы должна выдавать в ЛПТшник байты. Объясните как она работает....!!! Хоть кратенко... Просто я с указателями пока неочень...:
int LPT1Base;
unsigned char* iBuf;
int iSize;
unsigned char* oBuf;
int oSize;
//-----------------------------------------------------------------------
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS);
int InputBit;
int InputByte;
int InitLPT1();
void SetInputBuffer(int Size);
void SetOutputBuffer(unsigned char* Buf,int Size);
void WriteToPort();
void ReadFromPort();
void EndReading();
void startTransfer();
//-----------------------------------------------------------------------
int InitLPT1()
{
int* b;
b=(int*) MK_FP(0,0x408);
if (*b!=0)
{
LPT1Base=*b;
outportb(LPT1Base+2,11); InputBit=0;
InputByte=0;
oldhandler=getvect(0x0F);
return 0;
}
else return 1;
}
//-----------------------------------------------------------------------
void SetInputBuffer(int Size)
{
iSize=Size;
}
//-----------------------------------------------------------------------
void SetOutputBuffer(unsigned char* Buf,int Size)
{
oBuf=Buf;
oSize=Size;
SetInputBuffer(Size);
}
//-----------------------------------------------------------------------
void WriteToPort()
{
int i;
for (i=0;i<oSize;i++)
{
outportb(LPT1Base,oBuf);
outportb(LPT1Base+2,14); // STOBE | INIT
outportb(LPT1Base+2,15); // INIT
}
}
//-----------------------------------------------------------------------
void interrupt handler(__CPPARGS)
{
InputBit++;
if (InputBit==9)
{
InputByte++;
if (InputByte=iSize) { EndReading(); return;}
InputBit=1;
iBuf[InputByte]=0;
}
else iBuf[InputByte]<<1;
if (inportb(LPT1Base+1)&16!=0) iBuf[InputByte]++;
else iBuf[InputByte]=iBuf[InputByte]&254;
}
//-----------------------------------------------------------------------
void ReadFromPort()
{
InputBit=0;
InputByte=0;
setvect(0x0F, handler);
outportb(LPT1Base,31); // INIT | IRQ
}
//-----------------------------------------------------------------------
void EndReading()
{
outportb(LPT1Base,15); // INIT
setvect(0x0F, oldhandler);
Люди добрые, помогите пожалуйста. У меня есть кусок проги (на С под Дос), которая как бы должна выдавать в ЛПТшник байты. Объясните как она работает....!!! Хоть кратенко... Просто я с указателями пока неочень...:
int LPT1Base;
unsigned char* iBuf;
int iSize;
unsigned char* oBuf;
int oSize;
//-----------------------------------------------------------------------
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS);
int InputBit;
int InputByte;
int InitLPT1();
void SetInputBuffer(int Size);
void SetOutputBuffer(unsigned char* Buf,int Size);
void WriteToPort();
void ReadFromPort();
void EndReading();
void startTransfer();
//-----------------------------------------------------------------------
int InitLPT1()
{
int* b;
b=(int*) MK_FP(0,0x408);
if (*b!=0)
{
LPT1Base=*b;
outportb(LPT1Base+2,11); InputBit=0;
InputByte=0;
oldhandler=getvect(0x0F);
return 0;
}
else return 1;
}
//-----------------------------------------------------------------------
void SetInputBuffer(int Size)
{
iSize=Size;
}
//-----------------------------------------------------------------------
void SetOutputBuffer(unsigned char* Buf,int Size)
{
oBuf=Buf;
oSize=Size;
SetInputBuffer(Size);
}
//-----------------------------------------------------------------------
void WriteToPort()
{
int i;
for (i=0;i<oSize;i++)
{
outportb(LPT1Base,oBuf);
outportb(LPT1Base+2,14); // STOBE | INIT
outportb(LPT1Base+2,15); // INIT
}
}
//-----------------------------------------------------------------------
void interrupt handler(__CPPARGS)
{
InputBit++;
if (InputBit==9)
{
InputByte++;
if (InputByte=iSize) { EndReading(); return;}
InputBit=1;
iBuf[InputByte]=0;
}
else iBuf[InputByte]<<1;
if (inportb(LPT1Base+1)&16!=0) iBuf[InputByte]++;
else iBuf[InputByte]=iBuf[InputByte]&254;
}
//-----------------------------------------------------------------------
void ReadFromPort()
{
InputBit=0;
InputByte=0;
setvect(0x0F, handler);
outportb(LPT1Base,31); // INIT | IRQ
}
//-----------------------------------------------------------------------
void EndReading()
{
outportb(LPT1Base,15); // INIT
setvect(0x0F, oldhandler);
а скажи, ка конкретно, что тебе непонятно... а то разбирать построчно всю прогу не прикольно. если кратенько - программа читает и пишет байты в ЛПТ порт :) зачем указатели? для того, чтобы адресовать буферы для записи и чтения. в указателе как тебе известно содержиться адрес некоторой области памяти... а подробнее - выдели конкретные строки и скажи что именно в них не ясно... чтобы "воды много не лить"
А так же, строка if (inportb(LPT1Base+1)&16!=0) iBuf[InputByte]++;
else iBuf[InputByte]=iBuf[InputByte]&254;
Спасибо!