|
|
|
|
Получение адреса последовательного порта
Другим полезным встроенным свойством 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) /* регистр состояния модема */
|
|
|