Powrót do spisu treści

Rozdział 1

BLOKI KONTROLI I/O

    Do przesyłania informacji pomiędzy programem użytkownika (lub językiem wyższego poziomu) a procedurą CIO służą bloki kontroli wejścia/wyjścia (IOCB - Input/Output Control Block), zwane także kanałami wejścia/wyjścia (Input/Output Channel), Są to szesnastobajtowe obszary pamięci RAM znajdujące się na stronie trzeciej: IOCB0 od adresu $340 (832), IOCB1 od $350 (848), IOCB2 od $360 (864), IOCB3 od $370 (880), IOCB4 od $380 (896), IOCB5 od $390 (912), IOCB6 od $3A0 (928) i IOCB7 od $3B0 (944). Te osiem bloków pozwala na jednoczesną współpracę komputera z ośmioma urządzeniami zewnętrznymi, przy czym IOCB0 jest standardowo wykorzystywany do obsługi edytora.

    Dodatkowy dziewiąty blok - ZIOCB (Zeropage IOCB) - znajduje się na stronie zerowej od adresu $20 (32). Jest on wykorzystywany do komunikacji pomiędzy CIO i procedurami obsługi poszczególnych urządzeń. Umieszczenie go na stronie zerowej przyspiesza komunikację z urządzeniami peryferyjnymi, dzięki zastosowaniu zerostronicowego trybu adresowania procesora 6502.

    Struktura wszystkich dziewięciu IOCB jest jednakowa. Znaczenie kolejnych rejestrów jest następujące (w nawiasie nazwa rejestru w ZIOCB):

    ICCHID (ICHIDZ) - numer identyfikacyjny urządzenia, wskazuje na wpis w tabeli HATABS określający dane urządzenie. Ustawiany przez CIO po odnalezieniu wpisu; gdy IOCB nie jest używany oraz po zamknięciu kanału IOCB, zawiera wartość $FF.

    ICDNO (ICDNOZ) - numer urządzenia ustawiany przez CIO według podanej nazwy (np. "D2:NAME.EXT") lub standardowo na 1, gdy dane urządzenie może być tylko jedno lub numer nie został podany.

    ICCMD (ICCOMZ) - kod rozkazu (operacji) do wykonania przez CIO, ustawiany przez program użytkownika. Dozwolone są następujące kody operacji:
                     $03 - OPEN
                     $05 - GET RECORD
                     $07 - GET BYTE(S)
                     $09 - PUT RECORD
                     $0B - PUT BYTE(S)
                     $0C - CLOSE
                     $0D - STATUS
    Oprócz tego operacje o kodzie $0E (14) i większym są traktowane jako operacje specjalne i wykonanie ich zależy od rodzaju urządzenia.

    ICSTAT (ICSTZ) - status wykonanej operacji IO, ustawiany przez CIO po zakończeniu operacji. Wartość $01 oznacza poprawne wykonanie operacji, a wartość większa od $80 sygnalizuje błąd. Status operacji jest umieszczany również w rejestrze Y procesora przed zakończeniem procedury CIO.

    ICBUFA (ICBAZ) - adres bufora danych dla operacji CIO, ustawiany przez program użytkownika. Podczas operacji OPEN, STATUS itp. zawiera adres nazwy urządzenia.

    ICPUTB (ICPTZ) - zmniejszony o jeden adres procedury wykonującej żądaną operację, ustawiany przez CIO. Gdy kanał IOCB jest zamknięty, wskazuje procedurę CIONOPN ($E4DC).

    ICBUFL (ICBLZ) - długość bufora danych dla operacji CIO, ustawiana przez program użytkownika. Podczas operacji PUT BYTE i GET BYTE wartość $00 oznacza, że przesyłany bajt znajduje się w akumulatorze.
                             +------------+
                    +$00     |   ICCHID   |
                             +------------+
                    +$01     |   ICDNO    |
                             +------------+
                    +$02     |   ICCMD    |
                             +------------+
                    +$03     |   ICSTAT   |
                             +------------+
                    +$04     |            |
                             +-- ICBUFA --+
                    +$05     |            |
                             +------------+
                    +$06     |            |
                             +-- ICPUTB --+
                    +$07     |            |
                             +------------+
                    +$08     |            |
                             +-- ICBUFL --+
                    +$09     |            |
                             +------------+
                    +$0A     |   ICAX1    |
                             +------------+
                    +$0B     |   ICAX2    |
                             +------------+
                    +$0C     |   ICAX3    |
                             +------------+
                    +$0D     |   ICAX4    |
                             +------------+
                    +$0E     |   ICAX5    |
                             +------------+
                    +$0F     |   ICAX6    |
                             +------------+

                    Rys.2. Struktura IOCB.
    ICAX1 (ICAX1Z) - rejestr pomocniczy numer 1. Podczas operacji OPEN oznacza rodzaj dostępu do urządzenia (zapis, odczyt i in.).

    ICAX2 (ICAX2Z) - rejestr pomocniczy numer 2. Zastosowanie tego i następnych rejestrów pomocniczych jest w przeważającej części zależne od rodzaju urządzenia zewnętrznego (a właściwie od jego procedury obsługi).

    ICAX3 (ICAX3Z) - rejestr pomocniczy numer 3. Wraz z rejestrem ICAX4 służy do przekazywania adresów podczas procedury CIO oraz do przekazywania numeru sektora dla instrukcji Basica NOTE i POINT.

    ICAX4 (ICAX4Z) - rejestr pomocniczy numer 4 (zob. wyżej).

    ICAX5 (ICAX5Z) - rejestr pomocniczy numer 5. Służy do przekazywania numeru bajtu w sektorze dla instrukcji Basica NOTE i POINT oraz do przechowywania numeru IOCB podczas procedury CIO.

    ICAX6 (ICAX6Z) - rejestr pomocniczy numer 6. Wykorzystywany przez CIO m. in. do przechowywania transmitowanego bajtu.

    Dokładne znaczenie poszczególnych rejestrów IOCB (przede wszystkim ICAX1-6) będzie wyjaśnione przy opisach działania procedur CIO.
Zientara Wojciech: Mapa pamięci Atari XL/XE. Procedury wejścia-wyjścia, SOETO, Warszawa, 1988.