AOA 21.pdf

(262 KB) Pobierz
Microsoft Word - aoa21A.doc
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA
POSIADA RAG
HTTP://WWW.R-AG.PRV.PL
„THE ART OF ASSEMBLY LANGUAGE
tłumaczone by KREMIK
Konsultacje naukowe: NEKRO
wankenob@priv5.onet.pl
nekro@pf.pl
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ROZDZIAŁ DWUDZIESTY PIERWSZY: PORTY RÓWNOLEGŁE
Oryginalny projekt IBM’owski dostarczał wsparcia dla trzech portów równoległych drukarki, które
IBM nazwał LPT1:,LPT2:, i LPT3:. IBM prawdopodobnie przewidział maszyny, które będą wspierały drukarki
mozaikowe, drukarkę z głowicą wirującą i być może inne typy drukarek dla różnych celów, wszystkie na jednej
maszynie (drukarki laserowe miały pojawić się dopiero kilka lat później) . Z pewnością IBM nie przewidywał
ogólnego zastosowania tych portów równoległych, gdyż prawdopodobnie zaprojektował by je inaczej. Dzisiaj,
porty równoległe PC sterują klawiaturą, dyskami, streamerami, kontrolerami SCSI, kontrolerami ethernet (lub
innymi sieciowymi), kontrolerem joysticka, pomocniczymi blokami klawiszy i różnymi urządzeniami, no i
oczywiście drukarkami. Rozdział ten nie będzie próbował opisywać jak stosować port równoległy dla tych
wszystkich różnych celów – ta książka już jest dość duża. Jednak gruntowne omówienie jak interfejs równoległy
steruje drukarką i aplikacją portu równoległego (komunikacja krzyżowa) powinno dostarczyć nam dosyć
pomysłów na implementację kolejnego wielkiego urządzenia równoległego.
21.1 PODSTAWOWE INFORMACJE O PORCIE RÓWNOLEGŁYM
Są dwa podstawowe metody transmisji danych nowoczesnych obliczeń: równoległa transmisja danych
szeregowa transmisja danych. Przy szeregowej transmisji danych (zobacz „Port szeregowy PC”) jedno
urządzenie wysyła dane do innego jako pojedynczy bit w czasie po jednej linii. W transmisji równoległej, jedno
urządzenie wysyła dane do innego jako kilka bitów w czasie (równolegle) kilkoma różnymi liniami. Na
przykład, port równoległy PC dostarcza ośmiu lini danych w porównaniu do jednej lini danych portu
szeregowego. Dlatego też, wydawałoby się, że port równoległy mógłby transmitować dane osiem razy szybciej
ponieważ jest osiem razy więcej linii w kablu. Podobnie wydawałoby się, że kabel szeregowy, w takiej samej
cenie jak kabel równoległy, mógłby iść osiem razy wolniej ponieważ jest mnij lini w kablu. Mamy kolejny
problem z metodami komunikacji równoległej kontra szeregowej: szybkość kontra koszt.
W praktyce, komunikacja równoległa nie jest osiem razy szybsza niż komunikacja szeregowa, także
kable równoległe nie kosztują osiem razy więcej. Generalnie, ci, którzy projektowali kable szeregowe (np.
kable ethernetowe) użyli najlepszych materiałów i ekranowania. Podnosi to koszt kabli ale pozwala
transmitować dane, bit w czasie, dużo szybciej. Co więcej, lepsze kable pozwalają na większy dystans pomiędzy
urządzeniami. Kable równoległe, z drugiej strony, są generalnie tańsze i zaprojektowane dla bardzo krótkich
połączeń (mniej więcej od sześciu do dziesięciu stóp). Problemy świata rzeczywistego z szumem elektrycznym
i przesłuchem tworzy problemy kiedy używamy długich kabli równoległych i ogranicza szybkość systemu przy
transmisji danych. Faktycznie, oryginalna specyfikacja portu drukarki Centronics wskazuje na nie więcej niż
1000 znaków/ sekundę częstotliwości transmisji danych, więc wiele drukarek zaprojektowano do obsługi
danych dla tej częstotliwości transmisji. Większość portów równoległych może łatwo przewyższyć osiągami tą
wartość; jednakże czynnikiem ograniczającym jest jeszcze kabel, żadne wrodzone ograniczenie w
nowoczesnych komputerach.
Chociaż system komunikacji równoległej może używać różnej liczby linii do transmisji danych,
większość systemów równoległych używa ośmiu lini danych do transmisji bajtu w czasie. Jest kilka godnych
uwagi wyjątków. Na przykład interfejs SCSI jest interfejsem równoległym, nowsze wersje standardu SCSI
pozwalają na ośmio- szesnasto- a nawet trzydziesto dwu bitowy transfer danych. W rozdziale tym
skoncentrujemy się na transferach o rozmiarze bajta ponieważ port równoległy PC dostarcza ośmiobitowej danej
.
Typowy system komunikacji równoległej może być jednokierunkowy (unidirectional) lub dwu
kierunkowy (bidirectional). Port równoległy PC wspiera komunikację jednokierunkowa (z PC do drukarki),
więc rozpatrzymy najpierw ten najprostszy przypadek.
 
W systemie jednokierunkowej komunikacji równoległej są dwie rozpoznawalne węzły: węzeł
transmisji i węzeł odbioru. Węzeł transmisji umieszcza dane na lini danych i informuje węzeł odbioru , że dana
jest dostępna; wtedy węzeł odbioru odczytuje linię danych i informuje węzeł transmisji ,że pobrał dane.
Odnotujmy jak te dwa węzły synchronizują swój dostęp do lini danych – węzeł odbioru nie odczytuje lini
danych dopóki węzeł transmisji nie przekaże mu tego, węzeł transmisji nie umieszcza nowej wartości na lini
danych dopóki węzeł odbioru nie usunie danych i nie przekaże węzłowi transmisji, że ma dane. Uzgodnienie
(handshaking) jest terminem, które opisuje jak te dwa węzły koosdynuja transfer danych.
Właściwa implementacja uzgodnienia wymaga dwóch dodatkowych linii. Linia strobe (lub strobowanie
danych) jest tym czego używa węzeł transmisji do przekazania węzłowi odbioru , że dana jest dostępna. Linia
acknowledge (potwierdzenia) jest tym czego węzeł odbioru używa do przekazania węzłowi transmisji, że
pobrał już dane i jest gotów na więcej. W rzeczywistości port równoległy dostarcza trzeciej lini uzgodnienia,
busy, której węzeł odbiorczy może użyć do przekazania węzłowi transmisji, że jest zajęty i węzeł transmisji nie
próbował wysyłać danych. Typowa sesja transmisji danych wygląda podobnie jak następuje:
Węzeł transmisji:
1) Węzeł transmisji sprawdza linię busy aby sprawdzić czy odbiór jest zajęty. Jeśli linia busy jest
aktywna, nadajnik czeka w pętli dopóki linia busy stanie się nieaktywna
2) Węzeł transmisji umieszcza dane na lini danych
3) Węzeł transmisji aktywuje linię strobe
4) Węzeł transmisji czeka w pętli aż linia potwierdzenia stanie się aktywna
5) Węzeł transmisji ustawia nieaktywna strobe
6) Węzeł transmisji czeka w pętli aż linia potwierdzenia stanie się nieaktywna
7) Tan transmisji powtarza kroki od jeden do sześć dla każdego bajtu jaki musi przesłać
Węzeł odbiorczy:
1) Węzeł odbiorczy ustawia linię busy nieaktywną (zakładając gotowość do akceptacji danej)
2) Węzeł odbiorczy oczekuje w pętli dopóki linia strobe nie stanie się aktywna.
3) Węzeł odbiorczy odczytuje daną z lini danych (i przetwarza tą daną, jeśli to konieczne)
4) Węzeł odbiorczy aktywuje linię potwierdzenia
5) Węzeł odbiorczy oczekuje w pętli dopóki linia strobe nie stanie się nieaktywna
6) Węzeł odbiorczy ustawia nieaktywną linię potwierdzenia
7) Węzeł odbiorczy powtarza kroki od jeden do sześć dla każdego dodatkowego bajtu jaką musi odebrać
Ostrożnie korzystajmy z tych kroków, węzły odbiorczy i transmisji starannie koordynują swoje działania więc
węzeł transmisji nie próbuje odłożyć kilku bajtów na linie danych zanim węzeł odbiorczy nie skonsumuje ich a
węzeł odbiorczy nie próbuje czytać danych, których nie wysłał węzeł transmisji.
Dwukierunkowa transmisja danych jest często niczym więcej niż dwom jednokierunkowymi
transmisjami danych z rolą węzła transmisji i odbiorczego odwróconą dla drugiego kanału komunikacji.
Niektóre porty równoległe PC (szczególnie w systemach PS/2 i wielu notebookach) dostarczają
dwukierunkowego portu równoległego. Dwukierunkowa transmisja danych na takim sprzęcie nieco bardziej
złożona niż w systemach, które implementują komunikację dwukierunkową z dwóch portów
jednokierunkowych. Komunikacja dwukierunkowa w dwukierunkowym porcie równoległym wymaga
dodatkowego zbioru lini sterujących, więc te dwa węzły mogą określić kto zapisuje do wspólnej lini danych w
czasie.
21.2 SPRZĘT PORTU RÓWNOLEGŁEGO
Standardowy jednokierunkowy port równoległy w PC dostarcza więcej niż 11 lini opisanych w
poprzedniej sekcji (osiem lini danych , trzy linie uzgodnienia). Port równoległy PC dostarcza następujących
sygnałów:
Numer końcówki złącza
Kierunek I/O
Aktywność Biegunowość
Opis sygnałów
1
wyjście
0
Strobe (sygnał dostępnej danej
2 –9
wyjście
-
Linia danych (bit 0 to pin 2, bit 7 to
pin 9
10
wejście
0
Linia potwierdzenia (aktywna kiedy
zdalny system pobrał daną)
11
wejście
0
Linia busy (aktywna kiedy system
21856002.009.png
zdalny jest zajęty i nie można
zaakceptować danej
12
wejście
1
Brak papieru (aktywna kiedy w
drukarce brak papieru)
13
wejście
1
Wybór. Aktywna kiedy jest
wybrana drukarka.
14
wyjście
0
Autoprzesuw. Aktywna kiedy
drukarka automatycznie przesuwa
linię po każdym powrocie karetki
15
wejście
0
Błąd. Aktywna kiedy mamy błąd
drukarki
16
wyjście
0
Inicjalizacja. Sygnał ten powoduje,
że drukarka sam się inicjalizuje.
17
wyjście
0
Wybór wejścia. Sygnał ten, kiedy
jest
nieaktywny,
wymusza
autonomiczną drukarkę
18 - 25
-
-
Sygnał uziemienia
Tablica 79; Sygnały portu równoległego
Zauważmy, że port równoległy dostarcza 12 lini wyjściowych (osiem lini danych, strobe,
autoprzesuwania, inicjalizacji i wyboru wejścia0 i pięć lini wejściowych (potwierdzenia, busy, brak papieru,
wyboru i błędu). Pomimo, że port jest jednokierunkowy, jest dobrą mieszanką dostępnych lini wejściowych i
wyjściowych w porcie. Wiele urządzeń (jak dysk lub streamer), które wymagają dwukierunkowego transferu
danych używają tych dodatkowych lini do wykonania dwukierunkowego transferu danych
W dwukierunkowym porcie równoległym ( system PS/2 i laptopy), linia danych i strobe, oba , są
liniami wejściowymi i wejściowymi. Jest bit w rejestrze sterującym powiązanym z portem równoległym, który
jest wybrany, który steruje kierunkiem w danym momencie (nie możemy przekazać danych w obu kierunkach
równocześnie).
Są trzy adresy I/O powiązane z typowym PC porcie równoległym. Adres te należą do rejestru danych,
rejestru statusu i rejestru sterującego. Rejestr danych jest ośmiobitowym portem odczyt / zapis. Odczytując
rejestr danych ( w trybie jednokierunkowym) zwracamy wartość ostatnio zapisaną do rejestru danych. Rejestr
sterujący i statusu dostarcza interfejsu do innych lini I/O. Organizacja tego portu jest następująca:
Bit dwa (potwierdzenie drukarki) jest dostępny tylko na PS/2 i innych systemach, które wspierają
dwukierunkowy port drukarki. Inne systemy nie używają tego bitu
21856002.010.png 21856002.011.png 21856002.001.png 21856002.002.png 21856002.003.png 21856002.004.png
Rejestr sterujący portu równoległego jest rejestrem wyjściowym. Odczytując tą lokację zwracamy ostatnią
wartość zapisaną do rejestru sterującego z wyjątkiem bitu pięć, który jest tylko do zapisu. Bit pięć, bit kierunku
danej, jest dostępny tylko w PS/2 i innych systemach, które wspierają dwukierunkowy port równoległy. Jeśli
zapiszemy zero do tego bitu, linia strobe i danej są bitami wyjściowymi, podobnie jak jednokierunkowy port
równoległy. Jeśli zapisujemy jeden do tego bitu, wtedy linie strobe i danej są wejściowe. Odnotujmy, że w
trybie wejściowym (bit 5 =1), bit zero rejestru sterującego jest w rzeczywistości wejściowym. Notka: zapiszmy
jeden do bitu cztery rejestru sterującego odblokowującego IRQ drukarki (IRQ 7). Jednakże , cecha ta nie działa
na wszystkich systemach , więc bardzo mało programów próbuje używać przerwań z portu równoległego. Kiedy
jest aktywny, port równoległy będzie generował int 0Fh kiedy drukarka potwierdza transmisję danych.
Ponieważ PC wspiera do trzech oddzielnych portów równoległych, może być nie mniej niż trzy zbiory
tych rejestrów portów równoległych w systemie w tym samym czasie. Są trzy adresy bazowe portu
równoległego powiązane z trzema możliwymi portami równoległymi :3BCh, 378h i 278h. Będziemy się odnosili
do tego jako adresów bazowych dla LPT1: , LPT2:, i LPT3:, odpowiednio. Rejestr danych portu równoległego
jest zawsze ulokowany pod adresem bazowym dla portu równoległego, rejestr stanu pojawia się pod adresem
bazowym plus jeden a rejestr sterujący pojawia się pod adresem bazowym plus dwa. Na przykład , dla LPT1:,
rejestr danych jest pod adresem I/O 3BCh, rejestr statusu pod adresem I/O 3BDh a rejestr sterujący pod adresem
I/O 3BEh.
Jest jedno ważne zakłócenie. Adresy I/O dla LPT1:, LPT2:, i LPT3: dane powyżej są adresami
fizycznymi dla portu równoległego. BIOS dostarcza również adresów logicznych dla tych portów
równoległych. Pozwala to użytkownikom ponownie odwzorować ich drukarki (ponieważ większość programów
tylko zapisuje do LPT1. Wykonując to, BIOS rezerwuje osiem bajtów w przestrzeni zmiennej BIOS (40:8,
40:0A, 40:0C i 40:0E). Lokacja 40:8 zawiera adres bazowy dla logicznego LPT1: , lokacja 40:0A zawiera adres
bazowy dla logicznego LPT2:, itd. Kiedy oprogramowanie uzyskuje dostęp do LPT1:, LPT2:, itd., generalnie
uzyskuje dostęp do portu równoległego, którego adres bazowy pojawia się w jednej z tych lokacji.
21.3 STEROWANIE DRUKARKI POPRZEZ PORT RÓWNOLEGŁY
Chociaż jest wiele urządzeń które przyłącza się do portu równoległego PC, drukarki wykonują
największą ilość takich połączeń. Dlatego też, opisanie jak sterować drukarką z portu równoległego PC jest
prawdopodobnie najlepszym pierwszym przykładem do przedstawienia. Jak przy klawiaturze, nasze
oprogramowanie może działać na trzech różnych poziomach: może drukować dane stosując DOS, stosując
BIOS lub przez zapisanie bezpośrednio do sprzętu portu równoległego. Podobnie jak przy interfejsie klawiatury
, stosowanie DOS lub BIOS jest najlepszym podejściem jeśli chcemy utrzymać kompatybilność z innymi
urządzeniami podłączonymi do portu równoległego. Oczywiście, jeśli sterujemy jakimś innym typem
urządzenia, przejście bezpośrednio do sprzętu jest tylko naszym wyborem. Jednakże, BIOS dostarcza dobrego
wsparcia dla drukarek, więc podejście bezpośrednio do sprzętu jest rzadko koniecznością jeśli po prostu chcemy
wysłać dane do drukarki.
21.3.1 DRUKOWANIE POPRZEZ DOS
MS-DOS dostarcza dwóch funkcji jakie możemy użyć wysyłając dane do drukarki. Funkcja DOS’a
05h zapisuje znak w rejestrze dl bezpośrednio do drukarki. Funkcja 40h, z logicznym numerem pliku 04h,
również wysyła daną do drukarki. Ponieważ rozdział o DOS i BIOS dokładnie opisał te funkcje, nie będziemy
ich omawiać dalej tutaj.
21856002.005.png 21856002.006.png
21.3.2 DRUKOWANIE POPRZEZ BIOS
Chociaż DOS dostarcza stosownego zbioru funkcji dla wysyłania znaków do drukarki, nie dostarcza
funkcji, która pozwoli nam zainicjalizować drukarki lub uzyskać bieżącego stanu drukarki. Dlatego też DOS
tylko drukuje do LPT1:. Podprogram BIOS’a PC int 17h dostarcza trzech funkcji, drukuj, inicjalizuj i status.
Możemy zastosować te funkcje do każdego portu równoległego w systemie. Funkcja drukuj jest przybliżonym
odpowiednikiem funkcji DOS’a drukowani znaku. Funkcja inicjalizacji inicjalizuje drukarkę przy użyciu
systemowej informacji zależnej czasowo. Status drukarki zwraca informację z portu stanu drukarki wraz z
informacją limitu czasu.
21.3.3 PODPROGRAM OBSŁUGI PRZERWANIA INT 17H
Być może najlepszym sposobem zobaczenia jak funkcje BIOS działają jest napisanie zastępczego ISR’a
17h dla drukarki. Sekcja ta wyjaśni protokół uzgodnienia i zmienne używane przez drukarkę. Opisuje również
działanie i zwrot wyniku powiązanego z każdą maszyną.
Jest osiem zmiennych w przestrzeni zmiennych BIOS (segment 40h) jakich używa drukarka. Poniższa
tabela opisuje każdą z tych zmiennych.
Adres
Opis
40:08
Adres bazowy urządzenia LPT1:
40:0A
Adres bazowy urządzenia LPT2:
40:0C
Adres bazowy urządzenia LPT3:
40:0E
Adres bazowy urządzenia LPT4:
40:78
Wartość ograniczenia czasu LPT1:. Oprogramowanie portu
drukarki powinno zwracać błąd jeśli drukarka nie odpowiada w
stosownej ilości czasu. Zmienna ta (jeśli nie zero) określa jak wiele
pętli z 65,536 iteracji urządzenie będzie oczekiwało na
potwierdzenie z drukarki. Jeśli zero, urządzenie będzie czekało
zawsze
40:79
Wartość ograniczenia czasu LPT2: .Jak wyżej
40:7A
Wartość ograniczenia czasu LPT3: .Jak wyżej
40:7B
Wartość ograniczenia czasu LPT4: .Jak wyżej
Tablica 80: Zmienne BIOS portu równoległego
Zwrócimy uwagę na drobne odchylenie w protokole uzgodnienia w powyższym kodzie. Sterownik
drukarki nie oczekuje na potwierdzenie z drukarki po wysłaniu znaku. Zamiast tego, sprawdza aby zobaczyć czy
drukarka wysłała potwierdzenie dla poprzedniego znaku zanim wyśle znak. Zajmuje to małą ilość czasu
ponieważ program drukując znaki może kontynuować działanie równolegle z odebraniem potwierdzenia z
drukarki. Odnotujmy również, że to szczególne urządzenie nie monitoruje lini busy. Prawie każda istniejąca
drukarka pozostawia tą linie nieaktywną (not busy), więc nie musimy jej sprawdzać. Jeśli napotkamy drukarkę,
która manipuluje linią busy, modyfikacja tego kodu jest banalna. Poniższy kod implementuje usługę int 17h
; INT17.ASM
;
; Krótki bierny TSR, który zamienia program obsługi BIOS’a int 17h. Ten podprogram demonstruje
; funkcjonowanie każdej z funkcji int 17h, której standardowo dostarcza BIOS.
;
; Zauważmy, że kod ten nie aktualizuje int 2Fh (przerwania równoczesnych procesów) ani też nie możemy
; usunąć tego kodu z pamięci z wyjątkiem przeładowania. Jeśli chcemy móc zrobić te dwie rzeczy (jak również
; sprawdzić poprzednią instalację), zobacz rozdział o programach rezydentnych. Kod taki zostanie pominięty
; w tym programie z powodu ograniczenia długości
;
; cseg i EndResident muszą pojawić się przed segmentem biblioteki standardowej!
cseg
segment para public ‘code’
cseg
ends
21856002.007.png 21856002.008.png
Zgłoś jeśli naruszono regulamin