Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

LPT под ДОС, не понимаю

5.9K
18 января 2004 года
dlr
3 / / 18.01.2004
Люди добрые, помогите пожалуйста. У меня есть кусок проги (на С под Дос), которая как бы должна выдавать в ЛПТшник байты. Объясните как она работает....!!! Хоть кратенко... Просто я с указателями пока неочень...:

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);
2
20 января 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
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);


а скажи, ка конкретно, что тебе непонятно... а то разбирать построчно всю прогу не прикольно. если кратенько - программа читает и пишет байты в ЛПТ порт :) зачем указатели? для того, чтобы адресовать буферы для записи и чтения. в указателе как тебе известно содержиться адрес некоторой области памяти... а подробнее - выдели конкретные строки и скажи что именно в них не ясно... чтобы "воды много не лить"

5.9K
21 января 2004 года
dlr
3 / / 18.01.2004
Сложность именно в понимании механизма отправки/приема через LPT. Как я понял, используется SPP режим, а, насколко знаю, в нем можно только отсылать в порт (однонаправленный режим). Неясны строки outportb: куда пишем и что за значения (почему именно такие).
А так же, строка if (inportb(LPT1Base+1)&16!=0) iBuf[InputByte]++;
else iBuf[InputByte]=iBuf[InputByte]&254;
Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог