Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sys_prg_Lab4_ASM.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
136.7 Кб
Скачать

2.4. Організація вводу/виводу для паралельного інтерфейсу

Всі режими стандарту 1284 забезпечують організацію вводу/виводу даних з використанням “рукопотискання”. Протокол “рукопотискання” в інтерфейсі передбачає, що прийом кожної зміни сигналу керування адаптера підтверджується зміною відповідного сигналу стану контроллера і навпаки. Це дає можливість периферійним пристроям керувати часом, потрібним для виконання операції вводу/виводу (синхронізація вводу/виводу), а також формувати цикл стійкої прийомопередачі незалежно від довжини кабеля, яка впливає на час встановлення сигналів.

Реалізація “рукопотискання” забезпечується циклічним виконанням такої послідовності кроків:

Байт, що виводиться, заноситься в регістр даних адаптера.

Перевіряється стан принтера (сигнал Busy) і після встановлення сигналу “Принтер вільний” адаптером встановлюється активне значення сигналу стробу, яке дозволяє прийом нового байта даних контроллером принтера.

По закінченню прийому байта, контроллером встановлюється відповідне значення сигналу Ask (прийом байта завершений), прийом якого відтверджується адаптером скиданням активного значення сигналу стробу.

Після чого адаптер переходить до першого кроку для виводу нового байта даних.

При реалізації такого протоколу синхронний ввід/вивід здійснюється під керуванням центрального процесора, який є ініціатором обміну. При низькій швидкодії периферійних пристроїв це приводить до нераціонального використання процесорного часу (процесор простоює, очікуючи завершення роботи периферійного пристрою). Для усунення цього недоліку використовується асинхронний ввід/вивід в режимі переривання. При цьому процесор ініціює вивід першого байта і переходить до виконання якої-небудь іншої задачі (наприклад обчислення нових значень). По завершенню обробки прийнятого байта контроллер периферійного пристрою встановлює активне значення сигналу Ask, яке викликає апаратне переривання процесора. Процесор переходить у підпрограму обробки переривань і формує сигнали для виводу наступного байта. Таким чином у цьому режимі ініціатором обміну (крім першого байта) є периферійний пристрій.

2.5. Реалізація обміну інформацією між еом за допомогою паралельного інтерфесу в режимі тетради

При вирішенні багатьох задач виникає необхідність забезпечення двонаправленого обміну інформацією з використанням паралельного інтерфейсу. В даній лабораторній роботі розглядається варіант організації двонаправленого обміну між ПЕОМ з використанням паралельного інтерфейсу в режимі тетради. Для цього використовується кабельне з’єднання роз’ємів паралельного інтерфейсу у відповідності з рис.1. При передачі, байт, що виводиться заноситься потетрадно в молодші розряди регістру даних (D0-D3), а прийом тетрад забезпечується входами інтерфейсу, які забезпечують отримання слова стану (Ask, Paper,Select, Error). Передача байта здійснюється півбайтами з використаннням мультиплексування. Сигнали Strobe та Busy використовуються для керування обміном. Прийомопередача здійснюється в напівдуплексному режимі (одна ПЕОМ передає, інша приймає, а потім вони міняються). Фрагмент програми, який ілюструє можливий варіант реалізації передачі даних, приведений на рис. 2.

D7

D6

D5

D4

D3

D2

D1

D0

D3

D2

D1

D0

Ask

Paper

Select

Error

Strobe

Busy

Рис. 1. Кабельне з’єднання роз’ємів паралельного інтерфейсу для режиму тетради.

mov si,0

mov ax,40h ; занесення адреси LPT1 в регістр dx

mov es,ax

mov dx,es:[8]

c1: mov al,buf[si]

out dx,al ; занесення байта в регістр даних

inc dx

inc dx

mov al,13 ; формування строба (вивід керуючого слова)

out dx,al

dec al

out dx,al

dec dx ; ввід і аналіз слова стану

c2: in al,dx

test al,01000b

jz error

test al,80h

jz c2

inc si

dec dx

jmp c1

Рис.2. Фрагмент програми передачі даних.

LPTsend.asm:

title LPTsend

.286

sseg segment stack

db 256 dup(?)

sseg ends

dseg segment

w db ?

file db 'C:\test.txt',0

handle dw ?

fsize dw ?

csize dw 0

dseg ends

cseg segment

assume ss:sseg,cs:cseg,ds:dseg

start: jmp main

main: mov ax,dseg

mov ds,ax

call open_file

call send_size

call send_file

call close_file

mov ax,4C00h

int 21h

;---------------------------------------------------------------------

;**********************************************

open_file proc near

pusha

mov ax,3D00h

lea dx,file

int 21h

mov handle,ax

mov ax,4202h

mov bx,handle

mov cx,0

mov dx,0

int 21h

mov fsize,ax

mov ax,4200h

mov dx,cx

int 21h

popa

ret

open_file endp

;***********************************************

close_file proc near

push ax

push bx

mov ah,3Eh

mov bx,handle

int 21h

pop bx

pop ax

ret

close_file endp

;***********************************************

send_size proc near

pusha

mov ax,fsize

mov w,ah

call send_byte

mov w,al

call send_byte

popa

ret

send_size endp

;***********************************************

send_file proc near

pusha

next:

mov ah,3Fh

mov bx,handle

mov cx,1

mov dx,offset w

int 21h

call send_byte

mov bx,csize

add ax,bx

mov csize,ax

mov ax,csize

mov bx,fsize

cmp ax,bx

jz ex

jmp next

ex:

popa

ret

send_file endp

;***********************************************

send_byte proc near

;w - byte for send

pusha

call init

;----Ставимо строб 0-----

mc: inc dx

inc dx

mov ax,0

out dx,ax

;---------------ПЕРШІ 4 БІТИ--------------------

;----Встановлюємо перші 4 біти----

dec dx

dec dx

mov ah,0

mov al,w

out dx,al

;----Встановлюмо строб----

inc dx

inc dx

mov ax,13

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c1: in ax,dx

test ax,10000000b

jz c1

;----Знімаємо строб----

inc dx

mov ax,0

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c2: in ax,dx

test ax,10000000b

jnz c2

;-----------------НАСТУПНІ 4 БІТИ-------------

;----Встановлюємо наступні 4 біти----

dec dx

shr w,1

shr w,1

shr w,1

shr w,1

mov ah,0

mov al,w

out dx,al

;----Встановлюмо строб----

inc dx

inc dx

mov ax,13

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c3: in ax,dx

test ax,10000000b

jz c3

;----Знімаємо строб----

inc dx

mov ax,0

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c4: in ax,dx

test ax,10000000b

jnz c4

dec dx

popa

ret

send_byte endp

;**********************************************

init proc near

mov ax,40h

mov es,ax

mov dx,es:[8]

ret

init endp

;***********************************************

;-----------------------------------------------------------------------

cseg ends

end start

LPTget:

title LPTget

.286

sseg segment stack

db 256 dup(?)

sseg ends

dseg segment

w db ?

lpt1 dw ?

file db 'c:\test.txt',0

handle dw ?

csize dw 0

fsize dw ?

dseg ends

cseg segment

assume ss:sseg,cs:cseg,ds:dseg

start: jmp main

main:

mov ax,dseg

mov ds,ax

call init

call create_file

call get_size

call get_file

call close_file

mov ax,4c00h

int 21h

;----------------------------------------------------------------------------

;***************************************************

init proc near

push ax

push dx

mov ax,40h

mov es,ax

mov dx,es:[8]

mov lpt1,dx

pop dx

pop ax

ret

init endp

;***************************************************

create_file proc near

pusha

mov ah,5Bh

xor cx,cx

lea dx,file

int 21h

mov handle,ax

popa

ret

create_file endp

;***************************************************

get_size proc near

pusha

call get_byte

mov bh,w

call get_byte

mov bl,w

mov fsize,bx

popa

ret

get_size endp

;***************************************************

get_file proc near

pusha

next: call get_byte

mov ah,40h

mov bx,handle

mov cx,1

mov dx,offset w

int 21h

mov w,0

mov ax,csize

inc ax

mov csize,ax

mov bx,fsize

mov ax,csize

cmp ax,bx

jz ex

jmp next

ex:

popa

ret

get_file endp

;***************************************************

get_byte proc near

;w - get byte

pusha

;----Ставимо строб 0-----

mc: mov dx,lpt1

inc dx

inc dx

mov ax,0

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c1: in al,dx

test al,10000000b

jz c1

;----Зчитуємо перші 4 біти----

shr al,1

shr al,1

shr al,1

and al,1111b

mov w,al

;----Встановлюмо строб----

inc dx

mov ax,13

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c2: in ax,dx

test ax,10000000b

jnz c2

;----Знімаємо строб----

inc dx

mov ax,0

out dx,ax

;-----------------------------НАСТУПНІ 4 БІТИ-------------

;----Зациклюємося поки не отримаємо строб----

dec dx

c3: in ax,dx

test ax,10000000b

jz c3

;----Зчитуємо наступні 4 біти----

shl al,1

and al,11110000b

add w,al

;----Встановлюмо строб----

inc dx

mov ax,13

out dx,ax

;----Зациклюємося поки не отримаємо строб----

dec dx

c4: in ax,dx

test ax,10000000b

jnz c4

;----Знімаємо строб----

inc dx

mov ax,0

out dx,ax

popa

ret

get_byte endp

;***************************************************

close_file proc near

push ax

push bx

mov ah,3Eh

mov bx,handle

int 21h

pop bx

pop ax

ret

close_file endp

;***************************************************

;----------------------------------------------------------------------------

cseg ends

end start

Висновок. На цій лабораторній я ознайомився з основами організації обміну інформацією між ЕОМ і отримав практичнi навики програмування вводу-виводу через паралельний інтерфейс.

14

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]