Підтримка асинхронного адаптера в BIOS

Функції 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 для підтримки асинхронного адаптера?

 

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: