Программирование игр для Windows. Советы профессионала


Коммуникационная программа: NLINK - часть 2


#define SER_BITS 8     3     //8 значащих бит на символ

#define SER_PARITY_NONE 0    // нет контроля четности

#define SER_PARITY_ODD   8 // контроль по нечетности

#define SER PARITY EVEN 24    // контроль по четности

#define SER_DIV_LATCH_ON 128 // используется при загрузке делителя

#define PIC_IMR        0х21   // маска для регистра прерываний

#define PIC ICR        0х20   // маска для контроллера

// прерываний (порт 20h)

#define INT_SER_PORT_0 0x0C   // маска для управления

                       // прерываниями СОМ1 и COM3

#define INT_SER_PORT_1 0x0B   // маска для управления

// прерываниями COM2 и COM4

#define SERIAL_BUFF_SI2E 128 // размер буфера

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ /////////////////////////////////////////

void ( _interrupt _far *01d_Isr) (); // адрес старой подпрограммы

// обслуживания прерываний

// СОМ-порта

char ser_buffer[SERIAL_BUFF_SIZE];// буфер для приходящих символов

int ser_end = -1,ser_start=-l;      // указатели позиции в буфере

int ser_ch, char_ready=0;           // текущий символ и флаг

// готовности

int old_int_mask;                   // старое значение маски

// контроллера прерываний

int open_port;                      // текущий открытый порт

int serial_lock = ,0;                // "семафор" для процедуры

// обработки прерывания,

// управляющий записью

// в программный буфер

////////////////////////////////////////////////////////////

void _interrupt _far Serial_Isr(void)

(

// это процедура обработки прерывания СОМ-порта. Она очень проста.

// При вызове она читает полученный символ из- регистра 0 порта

// и помещает его в буфер программы.

// Примечание: язык Си сам заботится о сохранении, регистров

// и восстановлении состояния

// запрещаем работу всех других функций

//во избежание изменения буфера

serial_lock = 1;

// записываем символ в следующую позицию буфера

ser_ch = _inp(open_port + SER_RBF);

//Устанавливаем новую текущую позицию буфера

if (++ser_end > SERIAL_BUFF_SIZE-1) ser_end =0;




Начало  Назад  Вперед



Книжный магазин