Відокремлений структурний підрозділ -
Технічний коледж Національного університету «ЛП»
Звіт
Лабараторна робота
З дисципліни
Комп’ютерні системи
На тему
«Робота з матричним принтером. керування принтером за допомогою програм. написаних у програмі Assembler»
Виконав студент групи 45 КІ
Логін Юрій
1. Паралельний інтерфейс.
Історично паралельний інтерфейс був введений в персональний комп'ютер (ПК) для підключення принтера (звідси і абревіатура LPT - Line printer - відрядковий принтер). Проте згодом паралельний інтерфейс став використовуватися для підключення інших периферійних пристроїв - сканерів, дисководів типу Zip і ряду інших пристроїв. Базовий різновид порту дозволяє передавати дані тільки в одному напрямі (від ПК до ПП), проте пізніше були розроблені ряд стандартів двонаправленої передачі даних.
Адаптер паралельного інтерфейсу є набором регістрів, розташованих в адресному просторі пристроїв вводу/виводу. Кількість регістрів залежить від типу порту, проте три з них стандартні і є присутній завжди - регістр даних, регістр стану і регістр керування. Адреси регістрів відлічуються від базового, стандартні значення якого 3BCh, 378h, 278h. Впізнати кількість встановлених портів в комп'ютері і їх базові адреси можна просканувавши область даних BIOS по адресах 0:408h для LPT1, 0:40Ah для LPT2, 0:40Ch для LPT3 і 0:40Eh для LPT4. Якщо по цих адресах міститься слово (2 байти) з ненульовим значенням, то це і є базова адреса порту. Якщо слово містить нульове значення - порт не встановлений. BIOS не підтримує більше 4 LPT-портів. Порт може використовувати апаратне переривання (IRQ7 або IRQ9). Багато сучасних систем дозволяють змінювати режим роботи порту, його адресу і IRQ з налаштувань BIOS Setup. Наприклад, в AWARD BIOS є розділ Integrated Peripherals, що дозволяє настроювати режим, адресу і IRQ порту.
LPT порт має зовнішню 8-бітову шину даних, 5-бітову шину сигналів стану і 4-х бітову шину керуючих сигналів. При початковому завантаженні BIOS намагається виявити паралельний порт, причому робить це примітивним і не завжди коректним чином - за можливими базовими адресами портів передається тестовий байт, що складається з набору нулів і одиниць (55h або AAh), що чергується, потім здійснюється читання за тією ж адресою, і якщо прочитаний байт співпав із записаним, то вважається, що за цією адресою знайдений LPT порт. Визначити адресу порту LPT4 BIOS не може. Для роботи з ПП в BIOS передбачено переривання INT 17h, що надає можливість передавати дані (побайтно), ініціалізувати ПП і отримувати інформацію про його стан.
1.1. Інтерфейс Centronics
Поняття Centronics відноситься до набору сигналів, протоколу обміну і роз'єму, що встановлюється в принтерах. Більшість сучасних принтерів сумісні з інтерфейсом Centronics. Призначення сигналів і контакти роз'єму ПП, на який вони виведені приведені в таблиці 1.1
Таблиця 1.1.
Сигнали інтерфейсу Centronics
Сигнал
Т
Конт.
Напр.
Призначення
Strobe
0
1
i
Строб даних. Передається ЕОМ, дані фіксуються по низькому рівню сигналу.
D0 .. D7
1
2-9
i
Лінії даних. D0 - молодший біт.
Ack
0
10
o
Acknowledge - імпульс підтвердження прийому байта (запит на прийом наступного). Може використовуватися для формування переривання.
Busy
1
11
o
Зайнятий. Прийом даних можливий тільки при низькому рівні сигналу
PE
1
12
o
""1" сигналізує про кінець паперу
Select
1
13
o
""1" сигналізує про включення принтера (ГП - готовність приймача), зазвичай +5 В через резистор від джерела живлення ПП)
Auto LF
0
14
i
Автоматичне перевелення рядка. Якщо "0", то ПП при отриманні символу CR (переведення каретки) виконує функцію LF - переклад рядка
Error
0
32
o
Помилка ПП (off - line, немає паперу, немає тонера, внутрішня помилка)
Init
0
31
i
Ініціалізація (перехід на початок рядка, скидання усіх параметрів на значення за умовчанням)
Slct In
0
36
i
Вибір принтера. При "1" принтер не сприймає інші сигнали інтерфейсу
GND
19-30,
33
-
Загальний провід
Примітка: стовпець "T" - активний рівень сигналу : "1" - високий активний рівень, "0" - низький активний рівень. Стовпець "Напр". - напрям передачі по відношенню до принтера: i - вхід, 0 - вихід.
Сигнал Auto LF практично не застосовується, але його неправильне значення призводить до того, що принтер або робить пропуски рядків, або друкує рядки один поверх одного, або дублює рядки при друці в два проходи.
Вітчизняним аналогом інтерфейсу Centronics є ІРПР-м. Окрім нього існує інтерфейс ІРПР (застарілий), який відрізняється протоколом обміну, відсутністю сигналу "Error" і інверсією ліній даних. Крім того, до усіх вхідних ліній ІРПР підключені узгоджувальні пари резисторів: 220 Ом до +5 В і 330 Ом до загального проводу. Це перевантажує більшість інтерфейсних адаптерів сучасних ПК, тому при адаптації такого принтера необхідно видалити ці резистори.
Протокол обміну по інтерфейсу Centronics приведений на мал. 1.1
/
Мал. 1.1. Передача даних за протоколом Centronics
Передача починається з перевірки джерелом сигналу "Error". Якщо він встановлений, то обмін не здійснюється. Потім перевіряється стан сигналу "Busy". Якщо він дорівнює "0", то джерело приступає до передачі байта даних. Для передачі байта джерело виставляє на лінії D0 - D7 байт даних і видає сигнал Strobe. Приймач по сигналу Strobe# (тут і далі по тексту значок "#" після назви сигналу є ознакою того, що сигнал має низький активний рівень) читає дані з шини даних і виставляє сигнал Busy на час його обробки. Після закінчення обробки приймач видає сигнал ACK# і знімає сигнал Busy. Якщо протягом тривалого часу (6 - 12 с) джерело не отримує ACK#, то він приймає рішення про помилку "тайм-аут" (time - out) пристрою. Якщо після прийому байта приймач за будь-якою причиною не готовий приймати дані, то він не знімає сигнал Busy. При програмній реалізації обміну за вказаним протоколом бажано обмежити час очікування зняття Busy (зазвичай 30 - 45 с), інакше можливе зависання програми.
1.2. Стандартний паралельний порт ПК
Стандартний паралельний порт називається SPP (Standard Parallel Port - Стандартний Паралельний Порт). SPP порт є однонапрямленим, на його базі програмно реалізується протокол обміну Centronics. Порт забезпечує можливість генерації IRQ за імпульсом ACK# на вході. Сигнали порту виводяться на стандартний роз'єм DB - 25S (розетка), який розміщений безпосередньо на платі адаптера або з'єднується з ним плоским шлейфом (у разі, якщо адаптер інтегрований з материнською платою). Назви сигналів відповідають назвам сигналів інтерфейсу Centronics (таблиця 1.2).
У таблиці 1.2 I/O - напрям передачі : I - вхід; O - вихід; O(I) - вихід, стан якого може бути лічений за певних умов, O/I - вихідні лінії, стан яких читається при читанні з відповідних регістрів порту.
Таблиця 1.2.
Роз'єм і шлейф стандартного LPT порту
Контакт
DB - 25S
Провід
шлейфу
I/O
Сигнал
Контакт
DB - 25S
Провід
шлейфу
I/O
Сигнал
1
1
O/I
Strobe#
10
19
I*
ACK#
2
3
O(I)
D0
11
21
I
Busy
3
5
O(I)
D1
12
23
I
PE
4
7
O(I)
D2
13
25
I
Select
5
9
O(I)
D3
14
2
O/I
Auto LF#
6
11
O(I)
D4
15
4
I
Error#
7
13
O(I)
D5
16
6
O/I
Init#
8
15
O(I)
D6
17
8
O/I
Select In#
9
17
O(I)
D7
18 - 25
10,22,14,
16,18,20,22,24,26
-
GND
* - * - Вхід ACK# сполучений з живленням +5 В через резистор 10 кОм. Це зроблено для виключення помилкових переривань, оскільки переривання генерується за негативним перепадом сигналу на вході ACK#.
В якості недоліків стандартного LPT порту (SPP) слід зазначити невисоку швидкість передачі даних (100 - 150 КБ/с), завантаження процесора при передачі даних, неможливість двонаправленого побайтного обміну. Існує "аматорська" методика двонаправленого обміну, яка полягає в тому, що для введення даних на лінії D0, - D7 виставляють "1", а в якості передавача використовують мікросхеми з відкритим колектором, які при відкритому транзисторі можуть "підсаджувати" напругу логічної одиниці до рівня близько 1,5 – 1,7 В. Струм обмежений на рівні 30 мА. Як очевидно з рівнів сигналів, вони не відповідають рівням ТТЛ, тому багато портів не працюють в такому режимі або працюють нестабільно. Крім того, такий спосіб може бути небезпечний для адаптера порту, який працюватиме з граничними для нього струмами.
1.3. Стандарт IEEE 1284 -1994
Стандарт на паралельний інтерфейс IEEE 1284, прийнятий в 1994 році, визначає терміни SPP, ЕРР і ЕСР. Стандарт визначає 5 режимів обміну даними, метод узгодження режиму, фізичний і електричний інтерфейси. Згідно IEEE 1284, можливі наступні режими обміну даними через паралельний порт:
Compatibility Mode - однонапрямлений (вивід) по протоколу Centronics. Цей режим відповідає стандартному (традиційному) порту SPP
Nibble Mode - введення байта в два цикли (по 4 біта), використовуючи для введення лінії стану. Цей режим обміну може використовуватися на будь-яких адаптерах.
Byte Mode - введення байта повністю, використовуючи для прийому лінії даних. Цей режим працює тільки на портах, що допускають читання вихідних даних (Bi - Directional або PS/2 Type 1).
ЕРР (Enhanced Parallel Port) Mode - двонаправлений обмін даними, при якому керуючі сигнали інтерфейсу генеруються апаратно під час циклу звернення до порту (читання або запису в порт). Ефективний при роботі з пристроями зовнішньої пам'яті, адаптерами локальних мереж.
ЕСР (Extended Capability Port) Mode - двонаправлений обмін з можливістю апаратного стискання даних за методом RLE (Run Length Encoding), використання FIFO -буферов і DMA. Керуючі сигнали інтерфейсу генеруються апаратно. Ефективний для принтерів і сканерів.
У сучасних АТ - машинах з LPT -портом на системній платі режим порту - SPP, ЕРР, ЕСР або їх комбінація задається в BIOS Setup. Режим Compatibility Mode повністю відповідає SPP і часто встановлений за умовчанням. Усі інші режими розширюють функціональні можливості інтерфейсу і підвищують його продуктивність. Крім того, стандарт регламентує спосіб узгодження режиму, доступного як ПК, так і периферійному пристрою.
1.4. Фізичний і електричний інтерфейс
Стандарт IEEE 1284 визначає фізичні характеристики приймачів і передавачів сигналів. IEEE 1284 передбачає два рівні інтерфейсної сумісності: перший рівень - для пристроїв, що не вимагають високих швидкостей обміну, але що використовують можливість зміни напряму передачі даних; рівень два - пристрої, що працюють в розширених режимах, з високими швидкостями і довгими кабелями.
Вимоги до передавачів приведені в таблиці 1.3, для приймачів - в таблиці 1.4.
Таблиця 1.3.
Вимоги стандарту IEEE 1284 до передавачів
Вимога
Значення
Діапазон рівнів сигналів без навантаження
-0.- 0.5..+5.5 В
Рівень "1" при струмі навантаження 14 мА, не менше
++2.4 В
Рівень "0" при струмі навантаження 14 мА, не більше
+0.+0.4 В
Вихідний імпеданс, виміряний на роз'ємі
50+ 5 Ом
Швидкість наростання/спаду імпульсу (повинен знаходитися у вказаних межах)
0.05 ... 0.4
В/нс
Таблиця 1.4.
Вимоги стандарту IEEE 1284 до приймачів
Вимога
Значення
Допустимі пікові значення сигналів, що витримуються без руйнування і помилок в роботі, В
-2.0 ... +7.0
Поріг спрацьовування "1", не вище, В
2.0
Поріг спрацьовування "0", не нижче, В
0.8
Гістерезис приймача(межі), В
0.2 - 1.2
Вхідний струм (впадаючий і витікаючий), не більше, мкА
20
Вхідна місткість, не більше, пФ
50
Примітка: Вхідні лінії з'єднуються з шиною живлення резистором 1,2 кОм.
Стандарт IEEE 1284 визначає три типи використовуваних роз'ємів : А, B (Centronics - 36), C (новий малогабаритний 36-контактний роз'єм).
Інтерфейсні кабелі можуть мати від 18 до 25 провідників (залежно від кількості провідників GND). Не пред'являється жорстких вимог до екранування і інших параметрів, проте, такі кабелі можуть працювати тільки на низьких швидкостях при довжині не більше 2 метрів. Стандарт IEEE 1284 для кабелів:
Усі сигнальні провідники мають бути перевиті з окремими зворотними (загальними) проводами.
Кожна пара повинна мати імпеданс 62+ 6 Ом в діапазоні частот 4-16 МГц
Рівень перехресних перешкод не повинен перевищувати 10%
Кабель повинен мати екран, що покриває не менше 85 відсотків зовнішньої поверхні. На кінцях кабелю екран має бути окільцьований і сполучений з контактом роз'єму.
Кабелі, що задовольняють цим вимогам, маркуються як "IEEE Std 1284 - 1994 Compliant". Вони можуть мати довжину до 10 метрів.
1.5. Робота з SPP портом на низькому рівні
Робота з паралельним портом на низькому рівні (тобто на рівні прямого звернення до контроллера порту) застосовується при рішенні різного типу завдань з обміну інформацією з нестандартними пристроями, для написання драйверів принтерів і ряду інших завдань. Пряма робота з контролером дозволяє реалізувати будь-який протокол обміну з пристроєм і використовувати лінії порту на власний розсуд.
Контролер порту розташований в адресному просторі пристроїв вводу-виводу і звернення до нього здійснюється за допомогою команд IN і OUT асемблера. Інформацію про порти LPT1 - LPT3 можна отримати, прочитавши змінні BIOS, приведені в таблицю. 1.5.
Таблиця 1.5.
Змінні BIOS для LPT портів
Ім'я порту
Адреса в BIOS
Тип змінної
Опис
LPT1
000040:0008 h
Word
Базова адреса порту LPT1. Якщо змінна дорівнює 0, то порт LPT1 не знайдений
000040:0078 h
Byte
Константа, задаюча тайм-аут
LPT2
000040:000 Ah
Word
Базова адреса порту LPT2. Якщо змінна дорівнює 0, то порт LPT2 не знайдений
000040:0079 h
Byte
Константа, що задає тайм-аут
LPT3
000040:000 Ch
Word
Базова адреса порту LPT3. Якщо змінна дорівнює 0, то порт LPT3 не знайдений
000040:007 Ah
Byte
Константа, що задає тайм-аут
LPT4
000040:000 Eh
Word
Базова адреса порту LPT4. Якщо змінна дорівнює 0, то порт LPT4 не знайдений
000040:007 Bh
Byte
Константа, що задає тайм-аут
Примітка: BIOS шукає порти за адресами 3BCh, 378h, 278h. Порт LPT4 BIOS знайти не може. Приклад визначення базової адреси (TASM) :
push dx
mov ax, 40h
mov es, ax ; в es - сегмент = 0040h
mov dx, es:[08] ; dx = базова адреса порту LPT1
mov lpt1_adr, dx ; запам'ятали адресу порту LPT1 в змінній lpt1_adr
pop dx
Змінна lpt1_adr має тип word і має бути визначена в сегменті даних.
Стандартний порт має три 8-бітові регістри, розташованих по сусідніх адресах, починаючи з базової (Base) адреси - таблиці. 1.6.
Таблиця 1.6.
Регістри стандартного LPT порту
Адреса
Назва
W - R
Base+0
Data Register - регістр даних (DR)
W/R
Base+1
Status register - регістр стану (SR)
R
Base+2
Control Register - регістр керування (CR)
W/R
де W - R - доступні операції (W - запис, R - читання, W/R - читання/запис)
1.5.1.Регістр даних.Записані в цей регістр дані виводяться на вихідні лінії інтерфейсу D0 - D7. Результат читання цього регістра залежить від схемотехніки адаптера і відповідають або записаним раніше даним, або сигналам на лініях D0 - D7, що не завжди одне і теж (на цьому принципі і базується "аматорський" метод двонаправленого обміну, заснований на "підсаджуванні рівнів "1" на виході порту до рівня "0"). При стандартному включенні справедливий перший варіант - читані дані рівні раніше записаним.
1.5.2. Регістр стану.Є 5-ти бітовий порт введення, на яке заведені сигнали від зовнішнього пристрою. Допускає тільки читання. Призначення бітів регістра стану приведені в таблиці 1.7.
Таблиця 1.7.
Біти регістра стану
Біт
Вага
Назва
Призначення
7
128
BUSY
Інверсне відображення стану лінії Busy (11). При низькому рівні на лінії 11 (Busy) - біт дорівнює "1" - ПП готовий до прийому чергового байта
6
64
ACK
Відображення стану лінії ACK# (10).
"0"-"0"-підтвердження прийому, "1"- звичайний стан
5
32
PE
Відображення стану лінії Paper End (12).
"0" - "0" - норма, "1" - в ПП немає паперу
4
16
SLCT OUT
Відображення стану лінії Select (13).
"0" - "0" - ПУ не вибрано, "1" - ПП вибрано
3
8
Error інв.
Відображення стану лінії Error (15).
"0" - "0" - помилка ПП, "1" - звичайний стан
2
4
PIRQ
Прапор переривання по ACK# (тільки PS/2). Обнулюється, якщо ACK# викликав апаратне переривання. "1" - після скидання або після читання регістра стану
1-0
4-1
--
Не використовуються (резерв)
1.5.3. Регістр керування.Регістр керування є 4-м бітовий порт виводу, що допускає читання і запис. Біти 0,1,3 інвертуються, тобто "1" в цих бітах регістра керування відповідає "0" на відповідних лініях порту. Призначення біт регістра керування приведені в таблиці 1.8. Біт 5 використовується тільки портами PS/2.
Таблиця 1.8.
Біти регістра керування
Біт
Вага
Назва
Призначення
7
128
-
Резерв
6
64
-
Резерв
5
32
Direction
Біт керування напрямом порту PS/2.
""1" - режим введення, "0" - режим виводу
4
16
AckIntEn
Біт керування генерацією переривання по ACK#
""1" - дозволити переривання по спаду ACK# (10)
3
8
SLCT IN
Керування лінією SLCT IN# (17).
""1" - робота принтера дозволена.
2
4
INIT
Керування лінією INIT# (16).
""1" - звичайний стан, "0" - апаратне скидання ПУ
1
2
Auto LF
Керування лінією Auto LF# (14).
""1" - включити режим "Auto LF", "0" - звичайне сост.
0
1
Strobe
Керування лінією Strobe# (1).
""1" - стробування даних, "0" - звичайне сост.
1.5.4. Приклад програми для передачі рядка даних на низькому рівні.
; Приклад розроблений на TASM.
DATA Segment byte public 'DATA' ; Описуємо сегмент
; даних
String DB 'Test printer !!!', 0Dh, 0Ah,0 ; рядок,що виводиться
Lpt1_adr DW 0 ;, , Змінна для зберігання базової адреси LPT1
DATA ENDS ; кінець сегменту даних
; Сегмент коду - в нім розташуємо саму програму
CODE Segment byte public 'CODE'
ASSUME CS : CODE, DS: DATA, ES: DATA
START: ; Початок програми
mov ax, data ; встановимо ds на сегмент даних
mov ds, ax
push dx
mov ax, 40h
mov es, ax ; в es - сегмент = 0040h
mov dx, es:[08] ; dx = базова адреса порту lpt1
mov lpt1_adr, dx ; запам'ятали адресу порту lpt1 в змінній lpt1_adr
pop dx
LOOP1 : ; цикл друку рядка
mov ah, ds:[bx] ; прочитали черговий символ рядка
cmp ah, 0h ; це кінець рядка ?
je exit ; так, вихід
call out_byte ; немає, друкуємо його
inc bx ; на наступний символ
jmp loop1 ; повторюємо, поки не досягли кінця рядка
EXIT : ; завершення програми
mov ax, 4C00h ; завершити з кодом повернення 0
int 21h ;**** процедури і функції програми ****
OUT_BYTE : ; процедура виведення символу з ah на принтер з очікуванням
push dx
LOOP2 :
mov dx, lpt1_adr
inc dx ; адреса регістра стану (lpt1_adr+1)
in al, dx ; Читаний регістр стану
test al, 80h ; Перевіримо сигнал BUSY (<1> - принтер готовий)
jz loop2 ; якщо ні, то повторимо опитування
dec dx ; адреса регістра даних (lpt1_adr)
mov al, ah ; Завантаження передаваного байта в AL
out dx, al ; Запис байта в регістр даних
inc dx
inc dx ; адреса регістра керування (lpt1_adr+2)
in al, dx ; Читаний регістр керування
; Формований строб
and al, 11111110b ; Біт 0 (Strobe) :=0
out dx, al ; Запис в регістр керування
or al, 00000001b ; Біт 0 (Strobe) :=1
out dx, al ; Запис в регістр керування
and al, 11111110b ; Біт 0 (Strobe) :=0
out dx, al ; Запис в регістр керування
pop dx
ret ; вихід в основну програму
code ends
end start
Коротко про роботу програми. На початку програми описаний сегмент даних, що містить ASCIIZ рядок (рядок, що завершується нулем), що виводиться, і змінну типу Lpt1_adr типу Word для зберігання базової адреси порту Lpt1.
На початку програми вона визначає базову адресу Lpt1 і зберігає її в змінній Lpt1_adr. Потім йде цикл побайтного виведення рядка, критерій завершення - поточний символ дорівнює 0. Виведення символу здійснюється процедурою OUT_BYTE (передаваний символ повинен знаходитися в AL на момент виклику процедури).
При запуску OUT_BYTE читає регістр стану порту і перевіряє 7-й біт (BYSY). Якщо він дорівнює 0 (принтер зайнятий), то повторюємо опитування регістра стану до досягнення готовності принтера (цикл LOOP2). Потім в регістр даних записується код передаваного символу, після чого формується імпульс Strobe.
Цей приклад дещо некоректний - цикл очікування готовності принтера може тривати нескінченно, якщо по якій або причині він тримає на лінії сигнал BUSY. Для усунення повисання в циклі LOOP2 необхідно зробити прив'язку до таймера для перевірки часу очікування і, у разі очікування більш ніж 15 - 20 сік, видати повідомлення про те, що принтер не готовий до роботи. Крім того, після визначення базової адреси необхідно перевірити, чи не рівний він 0 (ознака відсутності LPT порту.
1.6. Робота з SPP портом через INT 17h
Як очевидно з розглянутого в п.п. 1.5.4 прикладу роботи з портом на низькому рівні, написання програми складне і неможливо перехопити виведення інформації в порт. Це означає, що неможливо розробити програму - драйвер для перекодування символів, що передаються в порт або для реалізації нестандартного протоколу обміну. Якісно інший підхід - використання програмного переривання BIOS INT 17h. Воно надає програмістові набір стандартних функцій для роботи з ПП: передати байт, скидання ПП і опитування стану ПП. Це переривання може бути перехоплене або заміщене програмою - драйвером. Не всі програми, що виводять інформацію на ПП, працюють через INT 17h. Крім того, при перекодуванні символів не можна перекодувати символи, що входять до складу команд мови керування ПП. Параметри виклику функцій INT 17h приведені в таблиці 1.9.
Таблиця 1.9.
Функції INT 17h
Функція
Регістри при виклику
Регістри при поверненні
Виведення символу по протоколу Centronics
ah = 00h
al = символ, що виводиться
dx = номер принтера (0 - 3)
AH - слово стану
Ініціалізація принтера
ah = 01h
dx = номер принтера (0 - 3)
AH - слово стану
Принтер - отримати багатство
ah = 01h
dx = номер принтера (0 - 3)
AH - слово стану
Слово стану принтера : слово стану принтера містить біти 1.7 регістра стану вказаного порту (см п.п. 1.5.2), а біт 0 є прапором тайм-ауту. Якщо він встановлений, то ПП не знімає сигнал BUSY протягом часу, заданого у відповідній змінній BIOS.
1.6.1. Приклад програми для передачі рядка через INT 17h
Як приклад розглянемо ту ж програму, що і в прикладі по прямій роботі з LPT портом.
; Описуємо сегмент даних, в якому розташуємо усі ці програми
DATA Segment byte public 'DATA'
String DB 'Test printera!!!', 0 ; рядок, що виводиться
Error DB 'Помилка: принтер не готів !!!!$' ; повідомлення про
; помилці
DATA ENDS ; кінець сегменту даних
; Сегмент коду - в нім розташуємо саму програму
CODE Segment byte public 'CODE'
; Задамо відповідність регістрів для використання за умовчанням
ASSUME CS : CODE, DS: DATA, ES: DATA
START: ; Початок програми
mov ax, data ; встановимо ds на сегмент даних
mov ds, ax
mov dx, 0 ; принтер на lpt1
mov ah, 2 ; функція int 17 "отримати багатство принтера"
int 17h ; перевіримо стан принтера
test ah, 80h ; принтер готів ?
jz err_exit ; якщо ні, то вихід з повідомленням про помилку
mov bx, offset string ; зміщення на рядок, що виводиться
LOOP1: ; Цикл друку рядка
mov al, ds:[bx] ; прочитали черговий символ рядка
cmp al, 0h ; це кінець рядка ??
je exit ; так, виходимо
call out_byte ; немає, друкуємо його
inc bx ; на наступний символ
jmp loop1 ; повторюваний
ERR_EXIT : ; Вихід помилково
mov dx, offset error ; виведення рядка на екран
mov ah, 9
int 21h
mov ax, 4c00h ; завершити з кодом повернення 1
int 21h
EXIT: ; Нормальне завершення
mov al, 0ah ; дамо переведення каретки
call out_byte
mov ax, 4c00h ; завершити з кодом повернення 0
int 21h
; **** Процедури і функції програми ****
OUT_Byte : ; Процедура виведення символу з AL на принтер з
; очікуванням
push ax ; процедура має бути рентабельна
push dx
LOOP2:
mov dx, 0
mov ah, 2
int 17h ; перевіримо стан принтера
test ah, 80h ; готів ?
jz loop2 ; якщо ні, то повторювано опитування
mov ah, 0
int 17h ; виводиться символ
pop dx
pop ax
ret ; вихід в основну програму
CODE ENDS ; Завершення кодового сегменту
END START ; Кінець програми
1.7. Реалізації двонаправленого обміну даними
Проблема двонаправленого обміну виникла при появі пристроїв типу накопичувача ZIP, які зручно підключати до LPT порту. Існує декілька стандартних рішень, схвалених IEEE 1284. Розглянемо два найбільш простих. У описі двонаправленого обміну застосовуються наступні терміни:
Хост (Host) - ПК з LPT портом
Прямий канал (передача в прямому напрямі) - канал (передача) від хоста до ПП; зворотний канал - канал введення даних в Хост від ПП
1.7.1. Напівбайтний обмін - Nibble Mode.
Режим полубайтного обміну (Nibble Mode) найбільш універсальний і може використовуватися на будь-якому стандартному (SPP) порту. SPP порт має 5 ліній введення, використовуваних для введення сигналів стану ПУ. Їх можна використовувати для введення даних за два прима по 4 біта (Nibble - півбайт). Призначення і назва сигналів, використовуваних в Nibble Mode приведені в таблиці
Таблиця 1.10.
Сигнали, використовувані при введенні в Nibble Mode
Конт.
Сигнал
SPP
Сигнал
NM
I/O
Призначення
14
Auto Feed#
HostBusy
O
Сигнал квитування.
"0" - "0" - готовність до прийому тетради
""1"-подтверждение прийому тетради
17
SLCT IN#
-
O
""1" - ознака обміну по IEEE 1284
"0" - "0" - обмін по SPP
10
ACK#
PtrClk
I
"0" - "0" - дійсність тетради
""1" - відповідь на HostBusy
11
BUSY
-
I
Прийом бітів 3, 7
12
PE
-
I
Прийом бітів 2, 6
13
SELECT
-
I
Прийом бітів 1, 5
15
ERROR#
-
I
Прийом бітів 0, 4
/Мал. 1.2.
Часові діаграми обміну приведені на мал. 1.2.
Прийом в режимі Nibble Mode здійснюється наступним чином: ПК сигналізує про готовність до прийому низьким рівнем HostBusy. ПП у відповідь виставляє на лінії молодшу тетраду даних і сигналізує про її дійсність низьким рівнем PtrClk. ПК у відповідь встановлює високий рівень HostBusy, сигналізуючи про зайнятість прийомом і обробкою. ПП відповідає на це високим рівнем PtrClk. Потім усі перераховані дії повторюються для старшої тетради даних.
Nibble Mode універсальний і гарантовано працює на будь-якому порту будь-якого типу (SPP, EPP, ECP), тому застосовується в пристроях типу накопичувача ZIP як режим за умовчанням. Проте, прийом даних в Nibble Mode сильно завантажує процесор, максимальна швидкість обміну, як правило, не перевищує 50 - 60 кбайт/с. Обмін з ПП виходить aсимметричным - швидкість прийому буде в два рази менше швидкості передачі.
1.7.2. РежимEPP.
Протокол EPP (поліпшений паралельний порт) був розроблений задовго до прийняття IEEE 1284 і призначений для підвищення продуктивності обміну даними по паралельному порту.
Протокол EPP забезпечує 4 типи циклів обміну :
Цикл запису даних
Цикл читання даних
Цикл запису адреси
Цикл читання адреси
Цикли читання/запису адреси і даних відрізняються протоколами (використовують різні стробуючі сигнали). Зовнішні сигнали EPP порту формуються апаратно в течії одного процесорного циклу введення/виводу, що дозволяє досягти швидкостей 0.5 - 2 Мбайт/с. Призначення сигналів LPT порту в EPP режимі приведені в таблиці 1.11.
Таблиця 1.11.
Сигнали, використовувані в режимі EPP
Конт.
Сигнал
SPP
Сигнал
EPP
I/O
Призначення
1
Strobe#
WRITE#
O
"0" - "0" - ознака циклу запису,
""1" - ознака циклу читання
14
Auto Feed#
DATASTB#
O
Строб даних.
17
SLCT IN#
ADDRSTB#
O
Адреси даних.
16
INIT#
RESET#
O
Скидання ПП (по "0")
10
ACK#
INTR#
I
Переривання від ПП
11
BUSY
WAIT#
I
Сигнал квитування.
"0" - "0" - дозволяє початок циклу
""1" - дозволяє завершення циклу
12
PE
ACKDATAREQ
I
Використовується на розсуд розробника
13
SELECT
XFLAG
I
---//---
15
ERROR#
DATAAVAIL#
I
---//---
В порівнянні з SPP, EPP порт має розширений набір регістрів - таблицю. 1.12
Таблиця 1.12.
Регістри порту EPP
Ім'я регістра
Зміщення
Режим
R/W
Опис
SPP Data Port
Base+0
SPP/EPP
W
Регістр даних SPP
SPP Status Port
Base+1
SPP/EPP
R
Регістр стану SPP
SPP Control Port
Base+2
SPP/EPP
W
Регістр керування SPP
EPP Address Port
Base+3
EPP
R/W
Регістр адреси EPP
EPP Data Port
Base+4
EPP
R/W
Регістр даних EPP
?
Base+5 .+7
EPP
?
Може використовуватися в деяких контроллерах для 16/32 бітових операцій вводу/виводу
Для передачі байта як адреси або даних необхідно записати його у відповідний регістр EPP порт, для читання - прочитати.
Наявність сигналу WAIT# дуже важлива - за допомогою цього сигналу периферійний пристрій може підлаштовувати швидкість обміну під свою швидкодію. Крім того, протокол підлаштовується під довжину інтерфейсного кабелю - затримки, що вносяться за рахунок довжини кабелю, просто приведуть до подовження циклів обміну. У цьому сигналі спостерігається відмінність в стандартах EPP порту: EPP порт, задовольняючий IEEE 1284 підтримує WAIT#, а деякі старі різновиди портів - ні. Вони міняють стан стробуючих сигналів DATASTB# і ADDRSTB# незалежно від WAIT#, як наслідок периферійний пристрій не може підлаштовувати швидкість обміну. Така специфікація називається EPP 1.7.
З огляду на те, що обмін по EPP йде протягом одного процесорного циклу обміну, необхідно унеможливити "зависання" процесора в такому циклі обміну за рахунок того, що пристрій довгий час не відповідає. Повисання виключене, оскільки через 15 мкс будь-який цикл обміну завершується примусово.
Часові діаграми запису приведені на мал. 1.3
/
Мал. 1.3
Для запису даних в порт програма виконує цикл запису (IO WR) в порт EPP Data. Адаптер при цьому встановлює Write в низький рівень і поміщає дані на лінії порту. Потім адаптер при низькому рівні Wait встановлює строб даних і чекає підтвердження від ПП (переведення Wait у високий рівень). Після приходу Wait, адаптер знімає строб даних - на цьому зовнішній цикл обміну завершується. Потім завершується процесорний цикл введення-виводу (зняття IO WR). Через деякий час ПП встановлює низький рівень Wait, вказуючи на можливість нового циклу обміну.
/
Мал. 1.4
Часові діаграми процесу читання приведені на мал. 1.4 і відрізняються