Функції BIOS, що обслуговують два асинхронні адаптери COM1 та COM2
доступні через переривання 14h.
Функція 00h призначена для ініціалізації портів асинхронного адаптера:
Вхід: AH = 00h
DX – номер порту: 00h – COM1, 01h – COM2
AL – байт параметрів ініціалізації (таблиця 10)
Вихід: AL – байт стану модема (таблиця 9);
AH – байт стану лінії асинхронного адаптера (таблиця 7).
Для передачі байта використовується функція 01h:
Вхід: AH = 01h
DX – номер порту: 00h – COM1, 01h – COM2
AL – байт, що передається у зовнішній пристрій
Вихід: AL – байт передачі;
AH – стан порту асинхронного адаптера.
Якщо біт 7 регістра AH встановлений на 1, то сталася помилка. Функція 02h призначена для прийому байта з лінії:
Вхід: AH = 02h
DX – номер порту: 00h – COM1, 01h – COM2
Вихід: AL – байт, прийнятий із зовнішнього пристрою;
AH – стан порту асинхронного адаптера. Якщо регістр AH не дорівнює 0, то сталася помилка.
Функція 03h визначає стан порту асинхронного адаптера:
Вхід: AH = 03h
DX – номер порту: 00h – COM1, 01h – COM2
Вихід: AL – стан модема;
AH – стан порту асинхронного адаптера.
|
|
Таблиця 10 – Формат байта параметрів ініціалізації
Біт | Значення |
D1, D0 | Кількість розрядів у символі, що передається: 00 – 5 01 – 6 10 – 7 11 – 8 |
D2 | Число стоп-бітів: 0 – один 1 – два |
D4, D3 | Метод контролю: ´0 – без контролю 01 – додаток до непарності 11 – додаток до парності |
D7 – D5 | Швидкість передачі у біт/с: 000 – 110 100 – 1200 001 – 150 101 – 2400 010 – 300 110 – 4800 011 – 600 111 – 9600 |
Підтримка асинхронного адаптера в DOS
MS DOS підтримує лише дві функції переривання 21h.
Функція 03h отримує в регістрі AL символ, прийнятий з адаптера:
Вхід: AH = 03h
Вихід: AL – байт, прийнятий із зовнішнього пристрою. Функція 04h посилає в адаптер символ, записаний в регістр DL:
Вхід: AH = 04h
DL – байт, що передається у зовнішній пристрій.
МЕТОДИЧНІ ВКАЗІВКИ
В даній роботі пропонується дослідити і протестувати декілька програм, які працюють з послідовними портами.
Для виконання роботи необхідні грунтовні знання архітектури та принципів функціонування асинхронного адаптера, а також знання та навички програмного
доступу до регістрів RS232C.
ЛІТЕРАТУРА
1. Гук М. Аппаратные средства IBM PC. Энциклопедия. – СПб.: “Издательс-
тво Питер”, 1999. – 816 с.
2. Гуржій А. М., Коряк С. Ф., Самсонов В. В., Скляров О. Я. Архітектура, принципи функціонування і керування ресурсами IBM PC: Навч. посібник. Харків: ТОВ. “Компанія СМІТ”, 2003. – 512 с.
3. Зубков С. В. Ассемблер для DOS, Windows и Unix. – М.: ДМК, 1999. –
640 с.
4. Фролов А. В., Фролов Г. В. Аппаратное обеспечение персонального ком-
|
|
пьютера. – М.: ДИАЛОГ МИФИ, 1997. – 304 с.
ЗАВДАННЯ
1. Дослідити програму aux читання всіх доступних регістрів портів COM1 і
COM2.
2. За текстом програми нарисувати схему алгоритму.
3. На вінчестері створити каталог RS232C.
4. За допомогою редактора середовища програмування Borland C++ 3.1
створити символьний файл тексту програми та записати його у каталог RS232C.
5. Виконати налагодження програми та запустити її на виконання.
6. Ідентифікувати (розшифрувати) коди, прочитані з регістрів УАПП.
7. Модифікувати програму таким чином, щоб на екрані монітора отримати розшифрування відомостей про стан регістрів УАПП.
8. Зробити висновки.
9. Дослідити програму auxinit задання режимів роботи портів COM1 і
COM2.
10. За текстом програми нарисувати схему алгоритму.
11. За допомогою редактора середовища програмування Borland C++ 3.1
створити символьний файл тексту програми та записати його у каталог RS232C.
12. Виконати налагодження програми та запустити її на виконання.
13. Сформувати код статусу порту, який передається в регістр УАПП.
14. Модифікувати програму так, щоб з екрана монітора можна було б задати стани всім регістрам COM1 і COM2, що є доступними для запису.
15. Зробити висновки.
ТЕКСТИ ПРОГРАМ
// aux
#include <conio.h>
#include <stdio.h>
typedef struct _AUX_MODE_ {
union {
struct {
unsigned char len: 2,
stop: 1, parity: 2, stuck_parity: 1, en_break_ctl: 1, dlab: 1;
} ctl_word;
char ctl;
} ctl_aux;
unsigned long boad;
} AUX_MODE;
void aux_stat (AUX_MODE *mode, int port)
{
unsigned long b;
mode->ctl_aux.ctl = (char) inp (0x3FB – 0x100 * port);
outp (0x3FB – 0x100 * port, mode->ctl_aux.ctl | 0x80);
b = inp (0x3F9 – 0x100 * port);
b = b << 8;
b += inp (0x3F8 – 0x100 * port);
switch (b) {
case | 1040: | b | = | 110; | break; |
case | 768: | b | = | 150; | break; |
case | 384: | b | = | 300; | break; |
case | 192: | b | = | 600; | break; |
case | 96: | b | = | 1200; | break; |
case | 48: | b | = | 2400; | break; |
case | 24: | b | = | 4800; | break; |
case | 12: | b | = | 9600; | break; |
case | 6: | b | = | 19200; | break; |
case 3: b = 38400; break; case 2: b = 57600; break; case 1: b = 115200; break; default: b = 0; break; mode->boad = b;
outp (0x3FB – 0x100 * port, mode->ctl_aux.ctl & 0x7F);
}
}
void main (void)
{
int NumPort;
AUX_MODE AdapterStatus;
clrscr ();
printf (“Введіть номер порту (0 – COM1, 1 – COM2): ”);
scanf (“%d”, &NumPort);
aux_stat (&AdapterStatus, NumPort);
printf (“Швидкість передачі – %ld\n”, AdapterStatus.boad);
printf (“Довжина слова – %d бітів\n”,
(int) (AdapterStatus.ctl_aux.ctl_word.len + 5));
switch (AdapterStatus.ctl_aux.ctl_word.parity) {
case 0: printf (“Контроля на парність немає\n”); break; case 1: printf (“Контроль на непарність\n”); break; case 3: printf (“Контроль на парність\n”); break;
}
switch (AdapterStatus.ctl_aux.ctl_word.stuck_parity) {
case 1:
printf (“Розряд контролю дорівнює 1, якщо контроль на парність\n”); break;
case 0:
printf (“Розряд контролю дорівнює 0, якщо контроль на парність\n”); break;
}
switch (AdapterStatus.ctl_aux.ctl_word.en_break_ctl) {
case 0: printf (“Нормальна передача символу\n”); break;
case 1: printf (“Постійна передача нуля\n”); break;
}
printf (“Вміст регістра керування перериваннями: %02.2X\n”,
inp (0x3F9));
printf (“Вміст регістра ідентифікації перериваннь: %02.2X\n”,
inp (0x3FA));
printf (“Вміст регістра керування модемом: %02.2X\n”,
inp (0x3FC));
printf (“Вміст регістра стану лінії: %02.2X\n”,
inp (0x3FD));
printf (“Вміст регістра стану модема: %02.2X\n”,
inp (0x3FE));
}
// auxinit
#include <conio.h>
#include <stdio.h>
typedef struct _AUX_MODE_ {
union {
struct {
unsigned char len: 2, stop: 1, parity: 2, stuck_parity: 1, en_break_ctl: 1, dlab: 1;
} ctl_word;
char ctl;
} ctl_aux;
unsigned long boad;
} AUX_MODE;
int aux_ini (AUX_MODE *mode, int port, int imask)
{
unsigned div;
char ctl;
switch (mode->boad) {
case 110: div = 1040; break; case 150: div = 768; break; case 300: div = 384; break; case 600: div = 192; break; case 1200: div = 96; break; case 2400: div = 48; break; case 4800: div = 24; break; case 9600: div = 12; break; case 19200: div = 6; break; case 38400: div = 3; break; case 57600: div = 2; break; case 115200: div = 1; break; default: return –1;
}
ctl = inp (0x3FB – 0x100 * port);
outp (0x3FB – 0x100 * port, ctl | 0x80);
outp (0x3F9 – 0x100 * port, (div >> 8) & 0x00FF);
outp (0x3F8 – 0x100 * port, div & 0x00FF);
outp (0x3FB – 0x100 * port, mode->ctl_aux.ctl & 0x7F);
outp (0x3F9 – 0x100 * port, imask);
return 0;
}
void main (void)
{
int NumPort;
unsigned long Speed;
AUX_MODE AdapterStatus;
int LenPack, NumStopBit;
int Parity, FixsPar, Pereriv;
clrscr ();
|
|
printf (“Введіть номер порту (0 – COM1, 1 – COM2): ”);
scanf (“%d”, &NumPort);
printf (“Введіть швидкість передачі данихв бодах: ”);
scanf (“%ld”, &Speed);
AdapterStatus.boad = Speed;
printf (“Введіть довжину слова (0 – 5 біт,... 3 – 8 біт): ”);
scanf (“%d”, &LenPack);
AdapterStatus.ctl_aux.ctl_word.len = LenPack;
printf (“Введіть кількість стопових бітів (0 – 1, 1 – 2): ”);
scanf (“%d”, &NumStopBit);
AdapterStatus.ctl_aux.ctl_word.stop = NumStopBit;
printf (“Введіть тип контролю парності (0 – немає,
1 – непарн., 2 – парн.): ”);
scanf (“%d”, &FixsPar); AdapterStatus.ctl_aux.ctl_word.stuck_parity = FixsPar;
printf (“Введіть ознаку переривання (0 або 1): ”);
scanf (“%d”, &Pereriv);
AdapterStatus.ctl_aux.ctl_word.en_break_ctl = Pereriv;
aux_init (&AdapterStatus, NumPort, 0x0F);
}
КОНТРОЛЬНІ ЗАПИТАННЯ
1. Дайте визначення інтерфейса периферійних пристроїв і назвіть його призначення та функції.
2. Функціональне призначення вхідних та вихідних сигналів інтерфейса
RS232C.
3. Перелчіть основні функціональні елементи уніфікованого асинхронного
програмованого приймача-передавача (УАПП).
4. Які засоби має BIOS для підтримки асинхронного адаптера?