   #Start Contents

                        Porty szeregowe i rownolegle

   Niektorym programom nie wystarcza dzialanie na samym procesorze czy
   sprzecie znajdujacym sie w komputerze. Czasem trzeba polaczyc sie z
   jakims urzadzeniem zewnetrznym, takim jak modem zewnetrzny czy
   drukarka. Celem tego artykulu jest wlasnie pokazanie, jak to zrobic.
   Przydatny bedzie spis przerwan Ralfa Brown'a (RBIL)

   Informacje tu zgromadzone pochodza z ksiazki Art of Assembly autorstwa
   Randalla Hyde'a i z informacji pochodzacych z RBIL. Nie mialem
   mozliwosci ich zweryfikowania.
     _________________________________________________________________

Dostep przez BIOS

   (przeskocz BIOS)

   BIOS oferuje nam dostep tylko do portow szeregowych, za posrednictwem
   przerwania int 14h.
    1. AH=0 - inicjalizacja portu.
       Rejestr AL ma zawierac parametry portu:
          + bity 5-7: szybkosc, w bitach na sekunde: 000 - 110bps, 001 -
            150bps, 010 - 300bps, 011 - 600bps, 100 - 1200bps, 101 -
            2400bps, 110 - 4800bps, 111 - 9600bps.
          + bity 3-4: tryb parzystosci: 00 - brak, 01 - nieparzysta, 10 -
            brak, 11 - parzysta.
          + bit 2: liczba bitow stopu: 0 - 1 bit stopu, 1 - 2 bity stopu.
          + bity 0-1: bity danych: 10 - 7 bitow, 11 - 8 bitow danych
       Rejestr DX ma zawierac numer portu, od 0 dla COM1 do 3 dla COM4.
       Po wykonaniu tej operacji, w AX zwracany jest stan portu (patrz
       AH=3 ponizej).
       Przyklad:
                mov     ah, 0           ; numer funkcji
                mov     al, 11100011b   ; 9600,8,N (brak parzystosci),1
                mov     dx, 0           ; COM1
                int     14h
    2. AH=1 - wyslij znak do portu.
       DX ma zawierac numer portu, jak powyzej. AL ma zawierac wysylany
       znak.
       Jesli po wykonaniu tej operacji najstarszy bit AH jest jedynka, to
       wystapil blad.
       Przyklad:
                mov     ah, 1           ; numer funkcji
                mov     al, "a"         ; znak do wyslania
                mov     dx, 0           ; COM1
                int     14h
    3. AH=2 - odbierz znak z portu.
       DX ma zawierac numer portu, jak powyzej.
       Po wykonaniu przerwania int 14h, AL bedzie zawierac odebrany znak.
       Jesli po wykonaniu tej operacji najstarszy bit AH jest jedynka, to
       wystapil blad.
       Przyklad:
                mov     ah, 2           ; numer funkcji
                mov     dx, 0           ; COM1
                int     14h             ; znak w AL, jesli nie ma bledu
    4. AH=3 - odczytaj stan portu portu.
       DX ma zawierac numer portu, jak powyzej.
       Po wykonaniu przerwania int 14h, AX bedzie zawierac stan portu.
       Znaczenie kolejnych bitow przedstawia tabela:

   CAPTION: Bity statusu portu

       numer                             co znaczy
       15    Przekroczenie czasu oczekiwania
       14    Rejestr przesuniecia transmisji (Transmitter shift register) pusty
       13    Rejestr przechowania transmisji (Transmitter holding register)
             pusty
       12    Blad wykrywania przerwy
       11    Blad ramki
       10    Blad parzystosci
       9     Blad przepelnienia
       8     Dane sa dostepne
       7     Wykryto sygnal linii odbiorczej
       6     Wskaznik dzwonienia
       5     Dane sa gotowe (DSR)
       4     Mozna wysylac (CTS)
       3     Wykryto sygnal linii odbiorczej delta
       2     Wykryto dzwonek na krawedzi opadajacej
       1     Dane delta sa gotowe
       0     Mozna wysylac dane delta
     _________________________________________________________________

Dostep poprzez instrukcje IN i OUT

   (przeskocz dostep przez porty)
    1. Porty szeregowe.
       Dla portow szeregowych przeznaczone sa porty sprzetowe:
       03F8h-03FFh (COM1), 02E8h-02EFh (COM2), 02F8h-02FFh (COM3),
       03E8h-03EFh (COM4).
       Pierwszy z kazdej grupy portow (port bazowy) jest portem danych -
       na niego wysyla sie bajty do transmisji i z niego odczytuje sie
       bajty odebrane przez port.
       Port baza+3 jest portem kontroli linii. Ustawia sie w nim
       parametry portu:
          + bity 3-5 to kontrola parzystosci: xx0 - brak, 001 -
            nieparzysta, 011 - parzysta, 101 - wysoka, 111 - niska, xx1 -
            programowa (x oznacza dowolna wartosc).
          + bit 2 okresla liczbe bitow stopu: 0 - 1 bit stopu, 1 - 2 bity
            (jesli bity danych to 6, 7 lub 8) lub poltora bitu stopu
            (jesli bitow danych jest 5).
          + bity 0-1 mowia o ilosci bitow danych: 00 - 5 bitow, 01 - 6
            bitow, 10 - 7 bitow, 11 - 8 bitow
       Port baza+5 to port stanu linii (tylko do odczytu). Najwazniejsze
       jego bity to:
          + bit 5 - jesli rowny 1, to kontroler moze przyjac kolejny znak
            do wyslania.
          + bit 2 - blad parzystosci
          + bit 1 - przepelnienie. Poprzedni znak w buforze zostal
            stracony.
          + bit 0 - odebrano caly bajt i jest on gotowy do przeczytania.
       Przyklad:
                        mov     dx, 3f8h + 5    ; status COM1
                spr_gotowy:
                        in      al, dx
                        test    al, 20h         ; sprawdz bit 5
                        jz      spr_gotowy      ; czekaj na gotowosc
                        mov     dx, 3f8h        ; bazowy port COM1
                        mov     al, 55h         ; bajt do wyslania
                        out     dx, al          ; wyslij bajt
    2. Porty rownolegle.
       Dla portow rownoleglych przeznaczone sa porty sprzetowe:
       0278h-027Ah (LPT1), 0378h-037Ah (LPT2).
       Pierwszy z kazdej grupy portow (port bazowy) jest portem danych -
       na niego wysyla sie bajty do transmisji i z niego odczytuje sie
       bajty odebrane przez port (w przypadku portow dwukierunkowych).
       Port baza+1 jest portem stanu. Jego najwazniejsze bity to:
          + bit 7 - jesli rowny 1, to kontroler jest zajety.
          + bit 6 - brak potwierdzenia
          + bit 5 - koniec papieru (drukarka)
          + bit 3 - zaden blad nie wystapil
       Port baza+2 jest portem kontroli. Nie zawiera zadnych
       interesujacych nas bitow.
     _________________________________________________________________

Dostep przez DOS

   W DOSie mozna oczywiscie uzywac przedstawionych powyzej sposobow na
   dostep do portow, ale jest tez jeszcze jedna mozliwosc - zapis do
   plikow specjalnych. DOS powinien utworzyc specjalne "urzadzenia",
   ktorych mozna uzywac tak samo jak plikow, a same dane laduja nie w
   plikach, a w portach.

   Te specjalne urzadzenia maja nazwy "COM1", "COM2", "COM3", "COM4",
   "LPT1", "LPT2" (oczywiscie nie wszystkie musza byc obecne na kazdym
   systemie). Otwierajac plik o nazwie "COM1" i zapisujac do niego dane,
   tak naprawde nie zapisujemy ich do zadnego pliku, a sa one wysylane do
   urzadzenia przylaczonego do portu COM1. Dlatego czasem moze byc
   problem z utworzeniem realnego pliku o nazwie "COM1", a nawet jesli da
   sie go stworzyc, to zapisywane do niego dane moga nie trafiac tam,
   gdzie bysmy tego oczekiwali.

   Tych urzadzen mozna uzywac jak normalnych plikow, a to opisalem w
   swoim kursie.

   Spis tresci off-line (klawisz dostepu 1)
   Spis tresci on-line (klawisz dostepu 2)
   Ulatwienia dla niepelnosprawnych (klawisz dostepu 0)
