Tajemnice ATARI

FDD


Stacje dysków

    Spośród urządzeń peryferyjnych do małego ATARI, dołączanych do szyny szeregowej, najpopularniejszymi są: magnetofon i stacja dysków. Ponieważ ten pierwszy (z punktu widzenia programisty) jest raczej mało interesujący, od razu możemy się zająć stacjami dysków. Na początku wypadałoby sprecyzować dokładniej obiekty naszych badań:

  • ATARI 1050 - procesor 6507 (6502 z ograniczoną do 8KB magistralą adresową), kontroler WD 1772, 2KB ROM, 2KB RAM.
  • LDW 2000 - procesor Z80, kontroler WD 2797, 4KB ROM, 2KB RAM.
  • CA 2001 - "zmodernizowana" LDW 2000 z kontrolerem WD 1772 (i podobnym OS-em).
  • XF 551 - mikrokomputer jednoukładowy 8050 (zgodny z 8048; ma wbudowane 256B RAM), 4KB ROM - stacja dwugłowicowa.

        Oprócz wyżej wymienionych istnieje oczywiście cała gama innych modeli, znacznie rzadziej u nas występujących. Pominąłem również stacje dysków TOMS 720 i SN-360, gdyż, poza ogólną ich charakterystyką, niewiele o nich wiem. Wszystkie stacje dysków do ATARI XL/XE używają dyskietek 5.25'.

    Jak to działa?

        Zakładam, że pojęcia podstawowe: dyskietka, ścieżka, sektor, szyna szeregowa itp. są Czytelnikom znane, jeśli nie - odsyłam do literatury. W swoim czasie zresztą w TA był cykl artykułów na ten temat.

        Stacja dysków to cały mikrokomputer, zawierający procesor, pamięć ROM i RAM, scalony kontroler napędu dyskowego i programowane złącze wejścia/wyjścia. W jej budowle wyróżnić można kilka podstawowych modułów:

  • moduł procesora: obejmuje on procesor, pamięci ROM i RAM oraz port we/wy i kontroler napędu dyskowego (FDC od ang. Floppy Disk Controller) od strony rejestrów programowych;
  • moduł napędu: obejmuje oprócz samego napędu również końcówki FDC, sterujące napędem dyskowym; • moduł we/wy: obejmuje port we/wy od strony fizycznego złącza stacji oraz wszelkie kontrolki, przyciski, itp.

        Jak łatwo się domyślić, obiektem naszego zainteresowania jest przede wszystkim moduł procesora, choć nie tylko. Najczęściej spotykane w stacjach procesory to; Z80, 650718050, lub zgodne z nimi.

        System operacyjny, zapisany w ROM, steruje całą pracą stacji. Niektóre modele stacji mają częściowo otwartą strukturę, co oznacza, że można ingerować w program, wykonywany przez procesor stacji, np. zlecić mu wykonanie procedury, wysłanej z komputera, a następnie przekazać sterowanie z powrotem do programu OS-u. Do tego typu stacji należą: LDW 2000 oraz CA 2001, również z rozszerzeniami TOMS. Inne modele są pozbawione tej możliwości, czy to z uwagi na cechy charakterystyczne zastosowanego procesora (XF 551), czy też przestarzałą ideę, rzutującą na zastosowane rozwiązania konstrukcyjne (1050).

        Ogólnie jednak, OS stacji jest niezależny od OS-u komputera i ma za zadanie odbierać dane z komputera, zapisywać je na dyskietce, a następnie ponownie je odczytywać i przesyłać do komputera. Aby to było możliwe, muszą istnieć jakieś znormalizowane protokoły transmisji danych pomiędzy komputerem, a stacją. Od strony komputera jest to:

    SIO

        SIO (ang. Serial Input/Output - szeregowe wejście/wyjście) to zespół programów, zawartych w ROM komputera, umożliwiających komunikację z urządzeniami dołączonymi do zewnętrznej szyny szeregowej. Wykorzystanie SIO w naszych własnych programach jest najczęściej zbędne. Jest to bowiem najniższy poziom OS i oferowane przez niego możliwości są wykorzystywane przez procedury wyższego poziomu, zapewniające większy komfort pracy (CIO - ang. Central Input/Output - centralne, główne wejście/wyjście i DOS). Niemniej jednak, warto wiedzieć i w razie potrzeby umieć wykorzystać tę jedną z ważniejszych procedur systemowych. Ponieważ jednak temat ten opisywany był już kiedyś na łamach "Bajtka", "Mojego ATARI", a także w (2), pominę szczegółowe rozważania na ten temat. Przypomnę tu tylko najważniejsze dane.

        Rejestry OS o adresach $300 do $30B zawierać powinny parametry wejściowe:

  • $300 - nr identyfikacyjny urządzenia (tu $30) zsumowany z jego numerem kolejnym ($1-$8),
  • $301 - nr kolejny urządzenia ($1-$8),
  • $302 - kod komendy (o tym niżej),
  • $303 - status operacji ($40 - odbiór danych, $80 - nadawanie),
  • $304, $305 - adres bufora danych,
  • $306 - maksymalny czas oczekiwania w sek. na odpowiedź od urządzenia (tzw. timeout),
  • $307 - nieużywane,
  • $308, $309 - długość bufora,
  • $30A, $30B - 1 i 2 bajt dodatkowy (AUX1 i AUX2).

        Aby wywołać SIO, należy wypełnić podane wyżej rejestry właściwymi wartościami, a następnie wywołać procedurę o adresie $E459. Po powrocie rejestr OS $303 i rejestr procesora Y zawierają status powrotny operacji. Wartość 1 oznacza, że operacja przebiegła bezbłędnie. Procedurę SIO dla stacji 1 można również wywoływać przez wektor $E453. Można wówczas pominąć wprowadzanie odpowiednich wartości do rejestrów: $300, $303, $306, $308 i $309, a dla komendy GET STATUS również $304 i $305 (adres: ustawiany na $23A). A oto spis komend:

    Komenda Znaczenie
    $4E Odczyt z urządzenia 12-bajtowego bloku konfiguracyjnego (PERCOM).
    $4F Zapis do urządzenia bloku PERCOM.
    $50 Zapis sektora o numerze w AUX1 i AUX2.
    $52 Odczyt sektora (numer jak wyżej).
    $53 Odczyt 4-bajtowego bloku statusu urządzenia.
    $57 Zapis sektora z weryfikacją.
    $21 Formatowanie dysku w aktualnie ustawionej przez PERCOM gęstości (dla ATARI 1050 - w gęstości pojedynczej).
    $22 Formatowanie dyskietki w gęstości rozszerzonej.

        Uwaga: operacje formatowania wymagają ustawienia DEVSTATUS ($304) na $40 i długości bufora na $80 - w odpowiedzi otrzymuje się blok $80 danych. Są to numery uszkodzonych sektorów (dwubajtowe). Na końcu bloku numerów sektorów znajduje się znacznik ich końca: $FFFF.

        Tylko dla LDW 2000 i CA 2001 (z TOMS'em i bez):

    Komenda Znaczenie
    $58 Wysłanie do RAM stacji programu dla Z80 i jego ewentualne uruchomienie.

        I tylko dla 1050 TOP DRIVE:

    Komenda Znaczenie
    $23 Opisane w (3) jako service put; prawdopodobnie przesyła do stacji blok danych/program i uruchamia go.
    $24 Również z (3): service get; odbiera dane(?).

        Za dwie powyższe komendy nie mogę wziąć odpowiedzialności - ze stacją 1050 TOP DRIVE nie miałem jak dotąd okazji lepiej się zapoznać.

        Dodatkowo, dla stacji LDW 2000, CA 2001, XF 551 możliwe jest przyspieszenie transmisji danych ze standardowych 19200 bodów do ok.50000 bodów, poprzez podanie komendy w inwersie (powiększonej o $80). W przypadku stacji LDW 2000 i CA 2001 musi obsługiwać tę przyspieszoną transmisję ich własny program SIO (realizowany np. przez DOS XL - SYNCHROMESH): zamiast taktowania transmisji zawsze przez urządzenie odbierające, całość transmisji taktowana jest przez ATARI (POKEY). W przypadku stacji XF 551 przyspieszenie nie jest związane ze sposobem transmisji, niemniej jednak jego wykorzystanie również wymaga specjalnego SIO (np. SpartaDOS X). Rozszerzenia typu TOP DRIVE (do 1050 oraz TOMS) są znacznie łatwiejsze i wygodniejsze w użyciu: zamiast nowym SIO, zadawalają się nakładką na system, prze-chwytującą przerwania, związane z transmisją danych przez POKEY i przyspieszającą zegar transmisji (4 generator/licznik POKEYa), aby osiągnąć prędkość 70000 bodów. System szybkiej transmisji uruchamia się tu ustawiając 7 bit w AUX2 przy zlecaniu SIO transmisji.

        Charakterystyczną cechą wszystkich nowoczesnych stacji do małego ATARI jest korzystanie z bloku konfiguracyjnego PERCOM. Właściwie jedynie standardowa 1050, nie przerobiona na "turbo", jest pozbawiona tej możliwości. PERCOM umożliwia ustawienie różnych wariantów konfiguracji, zależnie od potrzeby i w miarę możliwości, przy pomocy jednej komendy (84F). Oto znaczenie kolejnych bajtów bloku PERCOM:

  • 0 - ilość ścieżek: jak dotąd zawsze 40,
  • 1 - ignorowane,
  • 2 i 3 - ilość sektorów na ścieżce: 18 lub 26,
  • 4 - liczba stron - 1: 0 lub 1,
  • 5 - gęstość fizycznego zapisu na dysku: tylko SD - 0, inne - 4, (0 - FM, 4 - MFM),
  • 6 i 7 - ilość bajtów w sektorze: 128 lub 256,
  • 8, 9, 10, 11 - ignorowane.

        Dodatkowo: stacje TOMS rozpoznają, oprócz 3 standardowych gęstości (SD, ED, i DD) również gęstość IBM S-9 (MFM, 9 sektorów na ścieżce po 512B każdy), a XF 551 - gęstość QD (MFM, 18 sektorów na ścieżce po 256B, 2 strony).

    Uwaga! Dalsza część tekstu tylko dla posiadaczy LDW 2000 i CA 2001.


        Ponieważ jak dotąd miałem dłuższą styczność jedynie z tymi stacjami dysków, więc to je właśnie najlepiej miałem okazję poznać (w wersji z TOMS-em i bez). Ich charakterystyczną cechą są "bajery" na płytce czołowej: przyciski i kontrolki. Producentem jest: Callfornia Dreams vel Logical Design Works - jedna i ta sama firma w USA. ROM LDW 2000 pochodzi z 1983 roku, a CA 2001 - z 1988. Jednostkę centralną stanowi procesor Z80A, pamięć ROM - to EPROM 2732 (lub 2764), RAM - 2116, FDC - WD 2797 (lub zgodny 1772), system wejścia/wyjścia zbudowany jest z układów TTL. Mimo, że w CA 2001 zastosowano inny FDC, układy elektroniczne tych stacji niczym się nie różnią.

        WD 1772 - to WD 2797 w mniejszej (28 nóżek zamiast 40) obudowie. Aby układ zmieścił się w tej obudowie, niezbędne było dokonanie "drobnych" cięć w ilości wyprowadzeń: skutkiem tej oszczędności (mniejsze obudowy to niższy koszt produkcji) jest brak na wejściu FDC tak czasem bardzo potrzebnego sygnału READY, będącego ilustracją stanu drzwiczek napędu (uniesione/zamknięte). Użytkownikom CA 2001 pozostaje więc płacz i zgrzytanie zębów lub wymiana kontrolera na 2797 (płytka stacji CA 2001 jest uniwersalna - można umieścić na niej 1772 lub 2797).

        Bardzo dużą zaletą tych stacji jest, jak już wspomniałem, możliwość programowania ich pracy z komputera. Dokonuje się tego w następujący sposób:

    Dla stacji bez TOMS'a:

        Aby wpisać program do RAM stacji (pod adres $7F00) należy użyć komendy SIO $58, przy czym długość bufora<256, AUX2 ($30B) = 1, a AUX1 = $308. Aby go teraz uruchomić i odebrać od stacji dane, należy ponownie użyć komendy $58, ustawiając rejestry AUX2 = 0, a DEVSTATUS ($304) = $40. Ponieważ OS stacji po otrzymaniu tej komendy jedynie przekazuje sterowanie do naszej procedury (CALL $7F00 - po naszemu JSR $7F00), nasza procedurka musi sama zatroszczyć się o wysłanie pożądanych danych do komputera. Jak to zrobić - nieco dalej. Aby cała operacja przebiegła bezbłędnie, nasza procedura przed zakończeniem i oddaniem sterowania OS-owi musi załadować do akumulatora powrotny kod błędu ($43), wysłać go do komputera (o tym niżej) i ustawić znacznik C (np. przez SCF - u nas SEC; polecam listę rozkazów Z80, np. z "Bajtka" 12/88).

        Uwaga! Rozmiar bufora dla komendy $58 musi się zawierać między 1 a 256. Niżej przedstawiam skróconą mapę OS-ów CA 2001 i LDW 2000:

        Główne wejście do procedur systemowych (wektor) ma adres $4, w rejestrze C - nr wywoływanej funkcji. Celowo nie podaję konkretnych adresów, gdyż są one inne dla CA 2001 i dla LDW 2000. Spis funkcji systemowych:

  • $0 - pobranie w rejestrze DE 2 bajtów, określających typ stacji (w CA 2001 są równe $1,$2, w LDW 2000 -$20,$1),
  • $1 - przemieszczenie głowicy na ścieżkę 0,
  • $2 - Przemieszczenie głowicy na ścieżkę o numerze w rejestrze D/2,
  • $5 - odebranie bajtu z komputera (w akumulatorze),
  • $6 - wysłanie bajtu do komputera (z akumulatora),
  • $7 - odebranie bloku danych z sumą kontrolną z komputera (długość w bajtach, adres początku bufora w DE, Z = 1, jeśli bezbłędnie),
  • $8 - wysłanie bloku danych z sumą kontrolną do komputera (długość w bajtach, adres początku bufora w DE),
  • $10-dzwonek stacji.

        Dodatkowo:

  • skok pod adres $0 - to programowe resetowanie stacji (cecha Z80),
  • od adresu $1B9 zaczyna się tablica wykonywanych przez stację komend w postaci: kod komendy, adres procedury obsługi (2B).

        Funkcji jest razem $15 ($0 - $14). Niektóre pominąłem, jako niezbyt istotne (np. konwersja danych na format wyświetlacza LED), innych zaś nie chciało mi się zbyt dokładnie zgłębiać. Zainteresowanych odsyłam do (4) - tam znajduje się szczegółowa mapa pamięci LDW TOMS MULTI (adresy rejestrów sprzętowych są te same).

        Na marginesie: ROM-y CA 2001 i LDW 2000 do analizy uzyskałem przez wpisanie do RAM-u stacji programu, "przepychającego" go w częściach przez złącze szeregowe. Z kolei Informacji, niezbędnych do stworzenia owego programu, dostarczyły mi: analiza programu GTSYNC.COM oraz lista rozkazów Z80.

    Dla stacji z TOMS'em:

        Wszystkie istotne wiadomości można znaleźć w (4).

        Myślę, że zainteresowani sami dotrą do w/w źródeł - nie jest to w końcu takie trudne, a kompleksowe potraktowanie tematu zajęłoby cały numer TA.

        Czytelniku! Reszta należy do Ciebie, więc dobrej zabawy życzy Ci autor.

    Artur Miarecki


    (1) - "Atari Intern",
    (2) - "Mapa pamięci ATARI XL/XE. Procedury wejścia/wyjścia", Wojciech Zientara,
    (3) - opis 1050 Top Drive,
    (4) - "Programowanie stacji TOMS MULTI", Robert Miziński, "Moje Atari" nr 7,
    (5) - "Pamięć zewnętrzna na minidyskach elastycznych", Adam Pluta, "Mikroklan" nr 3,
    (6) - analiza własna ROM CA 2001 i LDW 2000,
    (7) - analiza własna ROM TOMS MINI.




  • Powrót na start | Powrót do spisu treści | Powrót na stronę główną

    Pixel 2002