Jak powstają DOS-y?część 2Bardzo poważnym problemem jest sposób poprawnego zainstalowania Dyskowego Systemu Operacyjnego. Niedopuszczalna jest sytuacja, gdy brak jednolitej konwencji dotyczącej DOS-ów powoduje ich instalację według własnego "widzi mi się...". Rezydujący DOS powinien zachowywać się w taki sposób, aby programy pracujące pod jego nadzorem nie kolidowały z rejonami pamięci wykorzystywanymi przez kod maszynowy i bufory operacyjne DOS-u. DOS powinien charakteryzować się stałym obszarem wykorzystywanej pamięci. Przyjęto, że dolnym adresem jest początek siódmej strony pamięci (adres 1792 czyli $700). Jest faktem oczywistym, że od żadnego DOS-u nie można wymagać, aby posiadał określony limit zajętej pamięci. Każdy Dyskowy System Operacyjny jest specyficzny, więc długość kod u i liczba buforów jest inna. Do informowania pozostałych programów o najwyższym wykorzystywanym adresie pamięci służy słowo MEMLO (lokacja 743 czyli $2e7). Oczywiście im mniej pamięci zajmuje DOS, tym więcej zostaje jej dla innych programów (np. dla BASICu). Dobrym zwyczajem jest, aby DOS i jego Command Processor nie przekraczały adresu 8192 ($2000). Istnieją programy poszerzające możliwości systemu, zwane nakładkami lub programami rezydentnymi, które po uruchomieniu przyczepiają się na stałe do DOS-u, podnosząc wskaźnik MEMLO. Taki sposób dobudowywania nowych funkcji do istniejącego systemu jest bardzo wygodny, lecz możliwy tylko z poprawnie skonstruowanymi DOS-ami. Do takich należą: SpartaDOS, Dos XL, DOS 2.5 w wersji z CP, a także, w pewnym sensie, COS. Próba zapisu w obszarach pamięci powyżej szóstej strony, a poniżej wartości określonej przez MEMLO jest zabroniona, bo może spowodować uszkodzenie DOS-u, a więc jego nieprawidłowe działanie, co grozi utratą danych na dyskietce. Programy, które chcą korzystać z możliwości DOS-u wiedzą zatem, gdzie nie należy niczego zmieniać. Nie wiedzą jednak, jak praktycznie obsługuje się DOS, znają tylko zasady korzystania z centrali operacji wejścia/wyjścia (CIO -Central Input/Output). CIO nie ma pojęcia co znajduje się w danej części DOS-u, musi zatem istnieć łącznik pomiędzy DOSem a CIO. W tym celu istnieje tablica HATABS (lokacja 794-831 czyli $31a-$33f), zawierająca spis wszystkich aktywnych w danej chwili urządzeń zewnętrznych. Podzielona ona jest na trzybajtowe segmenty, z których każdy zawiera informacje o jednym urządzeniu: pierwszy bajt jest literowym symbolem peryferia (dla stacji dysków jest to D), bajty drugi i trzeci stanowią adres początku tablicy sterownika, o której potem. Standardowo system operacyjny wpisuje do tablicy HATABS następujące urządzenia: drukarkę (P), magnetofon (C), edytor ekranowy (E), ekran (S) i klawiaturę(K). Prawidłowe dopisanie nowego peryferia polega na umieszczeniu jego literowego identyfikatora w kolejnym, wolnym segmencie (pole jest wolne, gdy zwiera zera) oraz adresu tablicy sterownika tego urządzenia. Tablica sterownika (ang. handler) zawiera szereg wektorów o określonym znaczeniu. Ich kolejność jest następująca: OPEN (wektor otwarcia pliku), CLOSE (wektor zamknięcia pliku), GET BYTE (wektor pobrania bajtu z urządzenia źródłowego), PUT BYTE (wektor wysłania bajtu do peryferia), GET STATUS (wektor pobrania statusu), SPECIAL (wektor specjalny). Te wektory nie są dokładnymi adresami danych procedur, lecz powinny mieć wartość o jeden mniejszą od właściwego umiejscowienia procedury. Spowodowane jest to sposobem ich wykorzystania: pobrany z tablicy adres jest umieszczany na stosie , a następnie wykonywana jest instrukcja RTS (powrotu z podprogramu). Przykładowo, gdy procedura OPEN zaczyna się pod adresem 1992 ($708), to wektor powinien mieć wartość 1991 ($7C7). Gdy poprawnie została skonstruowana tablica sterownika oraz urządzenie pozytywnie zainstalowano w tablicy HATABS, to system operacyjny komputera już będzie "widział" DOS. Są to już prawie wszystkie problemy związane z dobrą instalacją rezydentnego DOS-u. "Prawie wszystkie", ponieważ pozostał jeszcze bardzo ważny: problem właściwej pielęgnacji MEMLO i tablicy HATABS, ze względu na destruktywną działalność klawisza RESET. Naciśnięcie tego przycisku powoduje między innymi zniszczenie DOS-owego wpisu w tablicy HATABS oraz wskaźnika MEMLO. Jak należy obsługiwać RESET? Prawdę mówiąc istnieje kilka teorii na ten temat. Niech o złożoności tego problemu świadczy fakt, że nawet DOS 2.5 firmy Atari Corporation niepoprawnie obsługuje RESET. Istnieją dwa wektory, które należy właściwie ustawić z punktu widzenia obsługi RESETu. Są to: DOSVEC (słowo 10 czyli $a) oraz DOSINI (słowo 12 czyli $c). Po naciśnięciu klawisza RESET system operacyjny wykona skok do procedury znajdującej się pod adresem zapisanym w DOSINI. Powinny się w niej znajdować instrukcje uaktualniające MEMLO, HATABS oraz zamykające wszystkie lokalne pliki (RESET zamyka wszystkie bloki kontroli wejścia/wyjścia, więc nie ma możliwości zamknięcia plików na dyskietce). Wektor DOSVEC natomiast zawiera globalny adres powrotu do DOS-u, przykładowo wydanie w Basicu polecenia DOS spowoduje praktycznie skok przez wektor DOSVEC. Pod adresem wskazywanym przez słowo 10 powinny przede wszystkim znajdować się instrukcje kasujące flagi przerwania i trybu dziesiętnego (CLI oraz CLD), inicjujące stos (LDX #$ff; TXS),zamykające wszystkie pliki, uaktualniające tablicę HATABS (jeśli np. napisaliśmy bardzo ważny program w Basicu, a z bliżej nieokreślonego powodu tablica została zniszczona, to ta]de rozwiązanie może umożliwić nagranie stworzonego programu). Wiadomo, że stary system operacyjny komputerów ATARI serii XL/XE nie posiadał instrukcji likwidującej dziesiętny tryb pracy po naciśnięciu klawisza RESET i jeśli taki tryb był włączony, to komputer po prostu przestawał działać, należało go wyłączyć i powtórnie włączyć. Ciekawskim polecam uruchomienie jakiegokolwiek programu z ustawioną flagą trybu dziesiętnego (SED). Dobrym zwyczajem wydaje mi się również ustawienie w procedurze obsługi wektora DOSVEC większej prędkości czytania klawiszy ze względu na żenującą prędkość ustawianą przez system operacyjny komputera. Gdy naciśniemy klawisz, to będzie on odczytany powtórnie po czasie zawartym w komórce 729 ($2d9). Komórka 730 ($2da) określa tempo powtórzeń, gdy trzymamy klawisz wciąż naciśnięty. Kontrowersyjną jest sprawa wzajemnego wspierania się wektorów DOSVEC i DOSINI, tzn. wywołanie procedury o adresie zapisanym w DOSINI spowoduje ustawienie adresu DOSVEC i vice versa. Osobiście opowiadam się za jednorazowym ustawieniem tych wektorów podczas uruchamiania DOS-u. Praktycznie adres zawarty w DOSVEC powinien wskazywać na Command Processor, który po wykonaniu operacji niezbędnych dla inicjalizacji natychmiast przejdzie w tryb oczekiwania na instrukcje użytkownika (przypominam, że DOS 2.5 wcześniej doczytuje swój Command Processor czyli program DUP.SYS). Warto kilka zdań poświęcić wykorzystywaniu przez Dyskowy System Operacyjny strony zerowej. DOS korzysta z komórek ZIOCB (lokacje 32-47 czyli $20$2f), przez które komunikuje sięz CIO. Istnieje kilka komórek pamięci, z których DOS może korzystać do własnych celów. Jest to siedem bajtów o nazwie FMZSPG (adres 67-73 czyli $43-$49). Zwykle spełniają one rolę liczników, wskaźników bufora, służą do tymczasowego zapamiętania numeru sektora poddawanego operacji, długości tworzonego pliku, itp. Teoretycznie istnieje możliwość korzystania jeszcze z innych komórek na zerowej stronie, z tym, że zmienianie wartości komórek powyżej adresu 128 ($80) jest zabronione. Korzysta z tego obszaru interpreter Basicu, a także wiele programów użytkowych. Poniżej adresu 128 ($80) znajduje się kilka komórek, które są wykorzystywane tylko przy inicjalizacji systemu operacyjnego komputera, potem są "bezużyteczne", można z nich korzystać na własne ryzyko, ale twórcom systemów operacyjnych tego nie polecam. W kolejnym odcinku spróbuję nakreślić szkic operacji, które są wskazywane przez wektory sterownika urządzenia. Leon
|