На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 8 / Получение адреса последовательного порта Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Получение адреса последовательного порта

Другим полезным встроенным свойством BIOS является то, что на этапе самотестирования при включении (POST) она проверяет наличие последовательных адаптеров COM1/COM2 (хотя MS-DOS 3.3 поддержива- ет порты COM3 и COM4, BIOS распознает только COM1 и COM2) и, если находит тот или другой, адрес первого регистра каждого адаптера заносится в область памяти, начиная со смещения нуля сегмента 14h. Так как в персональном компьютере 20-битовый физический ад- рес равен 10h * 16-битовый сегмент + 16-битовое смещение, и если Ваша система MS-DOS имеет один последовательный порт, назначенный как COM1, то тогда слово в физической ячейке 400h будет содержать 3F8h (если так же присутствует COM2, следующее слово в ячейке 402 h будет содержать 2F8h). Таким образом, Вы можете получить адрес последовательного адаптера из этой области данных BIOS на смеще- нии 0 и сегменте 40h. Например, в Microsoft C Вы можете устано- вить базовый адрес порта следующим образом:


         #define BIOS_DATA ((short far *)(0x400000L))
         static short comport,    /* для базового адреса порта */
                port_number;      /* 0 для COM1, 1 для COM2 */
            .
            .
            .
         comport = *(BIOS_DATA + port_number);

         if(comport == 0) /* последовательный адаптер не установлен */
         {
             printf("Последовательный адаптер не установлен!\n";
             exit(1);
         }

Так как инициализируется переменная comport, все другие ре- гистры последовательного адаптера могут быть доступны прибавлени- ем соответствующих смещений к базовому адресу. В языке Си Вы мо- жете использовать директиву препроцессора #define для установки адресов этих регистров. Например, если инициализируется comport, Вы имеете возможность обратиться к регистрам последовательного порта по их именам, определив их следующим образом:


         #define IER (comport + 1) /* регистр разрешения прерывания */
         #define IIR (comport + 2) /* определение прерывания */
         #define LCR (comport + 3) /* регистр управления линией */
         #define MCR (comport + 4) /* регистр управления модемом */
         #define LSR (comport + 5) /* регистр состояния линии */
         #define MSR (comport + 6) /* регистр состояния модема */

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz