Kurs Assemblera cz. 13

 

Drukarko – Drukuj! Stacjo – Stacjonuj!

1. Rewolucyjna czujność

W odpowiedzi na moje zapytanie z 11 odcinka kursu asemblera, wielu z Was wykazało rewolucyjną czujność i poprzysyłało zamówienia na dokładniejsze wytłumaczenie paru procedur kernalowskich. Większość listów obracało się wokół tematyki połączeń z urządzeniami zewnętrznymi, takimi jak stacja dysków i drukarka (bo tak Bogiem a prawdą, tylko z nich może wycisnąć coś sensownego zwyczajny użytkownik złomodorka). Jak mawiają demokraci, vox populi – vox Dei, więc najpierw zajmiemy się zagadnieniem poruszanym zdecydowanie częściej.

A ogólniej – jak kazać stacji dysków wykonać jakiekolwiek, choćby najprostsze polecenie DOS-u? Wielu, co prawda, ma z tym problemy nawet z poziomu BASIC-a, ale to początkujący. My jesteśmy zaawansowani i BASIC mamy w małym paluszku. Dlatego też wiemy, że trzeba wpisać komputerowi takie instrukcje:

10 OPEN 15,8,15
20 PRINT# 15,”N:NAZWA DYSKU,ID”
30 CLOSE 15

Mamy tylko pewne wątpliwości, jak zrobić to w asemblerze. Na początek powiem Wam, że trzeba wystać stacji dokładnie takie same komendy niezależnie od tego, czy pracujemy w asemblerze, czy w BASIC-u. Stacji jest po prostu wszystko jedno, ona tego nie widzi. Dostaje tylko po drucie bajty, które potem układa sobie w rządku i patrzy, czy wynika z nich coś sensownego. Jeśli nie, to zamiast formatować dysk zacznie wesoło mrugać diodką. Musimy więc po prostu starać się jak najdokładniej odwzorować instrukcje BASIC-a w rozkazach asemblera.

Pierwszym, najbardziej oczywistym jest OPEN ($ffc0), o którym wiemy jednak, że nie może istnieć bez uprzedniego SETLFS ($ffba). Potem ustawiamy odpowiedni kanał jako aktualny kanał wyjściowy, procedurą CHKOUT ($ffc9). Kolejne bajty posyłamy na szynę znanym dobrze CHROUT ($ffd2). Kiedy już poślemy wszystko, trzeba dla porządku ustawić monitor i klawiaturę jako aktualne urządzenia wejścia/wyjścia (CLRCHN, $ffcc). W zasadzie należałoby jeszcze zamknąć kanał – CLOSE ($ffc3), ale przedłużyłoby to czas pracy programu, który musiałby oczekiwać, aż stacja ogłosi gotowość do dalszej pracy. Teraz musimy jeszcze powpisywać różne cyferki do rejestrów A, X i Y i program gotowy. A oto (oczywiście tylko dla porównania z Waszymi osiągnięciami!) moje rozwiązanie palącego problemu formatowania dyskietki.

I w ten oto prosty sposób robimy w 19 linijkach kodu to, co w BASIC-u zajmuje trzy linie. Oczywiście fanatycy BASIC-a mogą to wykorzystać jako argument w ew. dyskusji, ale my skwitujemy to pogardliwym uśmieszkiem. A tak poważnie – to procedura taka może się okazać bardzo użyteczna, jeżeli projektujemy napisanie jakiegoś programu współpracującego ze stacją dysków. Np. możemy wstawić doń opcję „Operacja DOS”, pobrać dane z klawiatury i po prostu wysłać je potem do stacji. Każdy program dużo na tym zyska. Trzeba by tylko zmienić pętlę wysyłającą znaki do stacji. Pętla ta znajduje się w komórkach $27220-$272e.

3. Jak by tu coś wydrukować?

Kłopot bardzo podobny do wyżej poruszonego mają właściciele drukarek. Nie bardzo bowiem wiedzą, jak zmusić je do drukowania czegokolwiek poza tekstem z edytorów tekstu. A w istocie problem sprowadza się do tego samego, co poprzedni – do wysłania odpowiednich bajtów po odpowiednim drucie. No i właściwego ich zaadresowania. Przy okazji udowodnię, że dla nas, asemblerowców nie są staszne nawet znaki sterujące (będą one właściwe dla MPS803 i innych, potrafiących tąż emulować). Podczas drukowania należy pamiętać o zakończeniu ostatniej linijki kodem 13, odpowiadającym naciśnięciu RETURN. Inaczej drukarka będzie czekać aż do zapełnienia bufora, czyli zazwyczaj do świętego Nigdy.

Warto jeszcze nadmienić, że w wersji asemblerowej dla wygody wprowadziłem etykietę „urz”. Oznacza ona numer urządzenia, który przypisany jest drukarce. Bywa 5, bywa 4. U mnie akurat było 4.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *