Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

ROZDZIAŁ 9

Dyskowy system operacyjny

Podrozdziały


Stacja dysków ATARI 810

Dyskowy system operacyjny (ang. Disk Operating System, DOS) jest rozszerzeniem systemu operacyjnego, który umożliwia dostęp do stacji dysków ATARI 810™ w ten sam sposób, w jaki uzyskuje się dostęp do innych urządzeń we/wy. DOS posiada trzy podstawowe składniki: rezydentny sterownik dysków, system zarządzania plikami (ang. File Management System, FMS), i dyskowy pakiet użytkowy (ang. Disk Utility Package, DUP). Rezydentny sterownik dysków jest jedyną częścią DOS, którą dostarcza system operacyjny w ROM. Pakiety FMS i DUP znajdują się oba na dyskietce, przy czym FMS jest ładowany do pamięci przy włączeniu zasilania. DUP nie jest automatycznie ładowany przy starcie komputera, lecz wymaga na to jawnego żądania z programu aplikacji. Jeśli przykładowo jest obecny kartridż języka BASIC, to DUP nie jest ładowany aż do wydania rozkazu DOS. Poniższe podrozdziały opisują bardziej szczegółowo każdy z tych komponentów i prezentują inne powiązane tematy, które są konieczne do efektywnego wykorzystywania DOS. Komentarze w tym rozdziale odnoszą się do wersji 2.0S Dyskowego Systemu Operacyjnego, który istotnie różni się od wcześniejszych wersji DOS. Pełne dane dane techniczne odnośnie DOS znajdziesz w instrukcji systemu operacyjnego i w instrukcji dyskowego systemu operacyjnego II.


Rezydentny sterownik dysku

Rezydentny sterownik dysku jest najprostszą częścią DOS. Ten sterownik dysku nie stosuje się do zwykłej sekwencji wywołania CIO, którą przestrzegają inne sterowniki urządzeń (zobacz do Rozdziału 8 – System operacyjny, gdzie opisano szczegółowo używanie scentralizowanego podsystemu we/wy). W DOS 2.0S rezydentny sterownik dysku używany jest tylko podczas początkowego procesu bootowania. Później dodatkowy kod w FMS jest używany przy dostępie do stacji dysków. Związek sterownika dysków z podsystemem we/wy jest pokazany na rys.8-8 w poprzednim rozdziale.

Do komunikacji ze sterownikiem dysków używany jest blok kontrolny urządzenie (ang. Device Control Block, DCB). Rys.8-10 ilustruje strukturę bloku DCB. Sekwencja wywołania sterownika dysków jest następująca:

              ;Program wywołujący już ustawił DCB
JSR DSKINV    ;Procedura systemowa wykonuje skok poprzez wektor do rezydentnego sterownika dysków
BPL OKAY      ;Jeśli sukces, to wykonaj skok, rejestr Y = 1
              ;Inaczej rejestr Y = numer błędu (pole DCBSTA również przechowuje ten numer)

Sterownik dysków jest podprogramem używanym do wspierania fizycznych transferów danych pomiędzy mikroprocesorem 6502 wewnątrz komputera ATARI a innym mikroprocesorem umieszczonym wewnątrz stacji dysków ATARI 810. Ten przesył danych odbywa się poprzez szeregową magistralę we/wy. Rezydentny sterownik dysków w ROM wspiera cztery funkcje:

FORMATOWANIE Wysłanie rozkazu formatowania do kontrolera dysku
ODCZYT SEKTORA Odczyt określonego sektora z dysku
ZAPIS/WERYFIKACJA SEKTORA Zapis sektora na dysku; sprawdzenie, czy zapis się powiódł
STAN Pobranie stanu kontrolera dysku

Rozkaz FORMATOWANIA czyści wszystkie ścieżki na dyskietce i zapisuje na nich adresy sektorów. Rozkaz ten nie umieszcza na dyskietce żadnej struktury plików. Obszar danych każdego sektora zostaje wypełniony zerami i jest tworzona początkowa tablica zawartości dysku i katalogu plików. Więcej informacji na temat fizycznego układu danych na dyskietce znajdziesz w instrukcji systemu operacyjnego oraz w następnym podrozdziale.

Powinieneś zapamiętać, iż wszystkie operacje we/wy sterownika dysków są zorientowane na sektory. Rozkazy sektorowego we/wy można używać do odczytu i zapisu dowolnego sektora na dyskietce. Możesz ich użyć do stworzenia własnej struktury plików. W rozdziale 10 instrukcji systemu operacyjnego jest przykład użycia sterownika dysków do zapisu pliku startowego (ang. boot file).

Funkcja STANU używana jest do określania stanu stacji dysków. Rozkaz ten powoduje, iż stacja dysków wysyła cztery bajty definiujące jej bieżący stan. Bajty te są ładowane do DVSTAT [$02EA,4]. Pirwszy bajt jest bajtem stanu rozkazu i zawiera następujące bity stanu:

Bit-0 = 1 oznacza otrzymanie wadliwej ramki rozkazu.
Bit-1 = 1 oznacza otrzymanie wadliwej ramki danych.
Bit-2 = 1 oznacza porażkę operacji PUT.
Bit-3 = 1 oznacza, że dysk jest zabezpieczony przed zapisem.
Bit-4 = 1 oznacza aktywność/gotowość.

Drugi bajt jest sprzętowym bajtem stanu i zawiera kopię rejestru stanu układu kontrolera dysków elastycznych INS1771-1 używanego przez stację dysków. Trzeci bajt określa maksymalną limit czasu operacji, który dostarczył kontroler dysku (wartość w sekundach), a który ma używać sterownik dysków w komputerze ATARI. Czwarty bajt jest nieużywany. Rozkazu STANU można używać do kilku celów. Ponieważ limit czasowy dla rozkazu stanu jest mniejszy niż dla pozostałych rozkazów, można go używać do sprawdzenia podłączenia konkretnej stacji dysków. Jeśli sterownik dysków zwróci błąd przekroczenia limitu czasowego urządzenia, to wiadomo, iż dana stacja dysków nie została podłączona.


Na początek:  podrozdziału   strony 

System zarządzania plikami

System zarządzania plikami (ang. File Management System, FMS) jest nierezydentnym sterownikiem urządzenia, który wykorzystuje normalny interfejs sterowników urządzeń CIO. FMS nie znajduje się w pamięci OS ROM. Ładowany jest w czasie startu komputera, jeśli jest obecna dyskietka z DOS'em.

FMS, podobnie jak inne sterowniki urządzeń, otrzymuje dane kontrolne we/wy z CIO. FMS następnie używa własnego sterownika dysku do zapisu/odczytu danych z dyskietki. Kod dodatkowego sterownika dysków dostarczono głównie w celu pominięcia błędu systemu operacyjnego. Błąd ten wynika z nieprawidłowego porównywania 16-bitowego wskaźników buforów i może wystąpić podczas transferów SIO. Błąd występuje głównie wtedy, gdy bufor kończy się na granicy strony. Jednakże, skoro wynikiem tej łatki jest umieszczenie sterownika dysków w pamięci RAM, to możliwe jest pewnego rodzaju przystosowanie DOS'a do własnych potrzeb. Sprzęt stacji dysków jest w stanie wykonywać jedną funkcję, która nie jest obsługiwana przez rezydentny sterownik dysków. Funkcja ta to rozkaz ZAPISU SEKTORA BEZ WERYFIKACJI. Nawet chociaż poświęca się nieco niezawodność, to jednak zapisy na dysku dokonują się szybciej. Aby otrzymać to przystosowanie z poziomu języka BASIC, musisz wpisać:

POKE 1913,80

aby otrzymać szybki zapis (zapis bez odczytu weryfikacyjnego). Jeśli chcesz przywrócić zapis z odczytem weryfikacyjnym, wpisz:

POKE 1913,87

FMS jest wywoływane przez ustawienie bloku IOCB i wywołanie CIO. FMS obsługuje kilka specjalnych funkcji CIO, które nie są dostępne w innych sterownikach:

FORMAT FMS wywołuje sterownik dysku, aby sformatował dyskietkę. Gdy formatowanie zakończy się sukcesem, FMS zapisuje na dyskietce pewne dane struktury plików.
NOTE FMS zwraca bieżącą wartość wskaźnika pliku.
POINT FMS ustawia wskaźnik pliku na określoną wartość.

W podrozdziale o "Swobodnym Dostępie" umieszczono instrukcje na temat używania NOTE i POINT.

Dyskowe operacje we/wy

Poprzez CIO masz dostęp do wszystkich standardowych wywołań operacji we/wy na plikach. W języku BASIC oznacza to używanie rozkazów takich jak OPEN, CLOSE, GET, PUT i XIO. W języku asemblera musisz ustawić samodzielnie blok IOCB i wywołać CIO.

Aby wykonać jakąkolwiek dyskową operację we/wy, musisz najpierw otworzyć plik. Składnia rozkazu OPEN w języku BASIC jest następująca:

OPEN #IOCB,ICAX1,0,"D:MYPROG.BAS"

Parametr #IOCB wybiera jeden z ośmiu dostępnych bloków IOCB (zobacz do podrozdziału "Scentralizowany podsystem we/wy", gdzie opisano ustawianie zawartości bloku IOCB). Powinieneś unikać bloków IOCB o numerach 0, 6 i 7, ponieważ są one używane przez system operacyjny i język BASIC przy różnych okazjach. ICAX1 jest kodem typu otwarcia pliku. Bity tego kodu są następujące:

BIT 7 6 5 4 3 2 1 0
x x x x W R D A
Gdzie: A oznacza dołączanie do końca pliku (ang. Append)
D oznacza katalog (ang. Directory)
R oznacza odczyt (ang. Read)
W oznacza zapis (ang. Write)
x oznacza bit nieużywany

Rys.9-1 Układ bajtu pomocniczego dla rozkazu OPEN

Różne wartości ICAX1 są omawiane w rozdziale 5 instrukcji systemu operacyjnego. Niektóre kluczowe rzeczy na temat różnych trybów rozkazu OPEN są następujące:

ICAX1=6 Używane przy otwieraniu katalogu dyskietki. Odczytywane rekordy są elementami katalogu.
ICAX1=4 Tryb odczytu.
ICAX1=8 Tryb zapisu. Każdy istniejący plik otwierany w tym trybie zostaje najpierw wymazany. Bajty początkowe, które zostaną zapisane do tego pliku, znajdą się na jego początku.
ICAX1=9 Tryb zapisu z dołączaniem. Plik nie jest zmieniany. Bajty zapisane do tego pliku zostaną dołączone na jego końcu.
ICAX1=12 Tryb uaktualniania. Ten tryb pozwala jednocześnie na odczyt i zapis do pliku. Bajty odczytywane i zapisywane rozpoczną się od pierwszego bajtu pliku.
ICAX1=13 Nieobsługiwane.

Są dwa rodzaje operacji we/wy, które możesz używać do przesyłania danych pomiędzy swoim programem a dyskiem: rekordowe lub znakowe.

Znakowe operacje we/wy oznaczają, iż dane w pliku są ciągiem kolejnych bajtów. DOS interpretuje tę listę bajtów jako dane, a żadna z ich wartości nie będzie interpretowana jako znak kontrolny. Przykład danych znakowych (wszystkie wartości są w systemie szesnastkowym):

00 23 4F 55 FF 34 21

Rekordowe operacje we/wy oznaczają, iż dane w pliku składają się ze zbioru rekordów. Rekord jest grupą bajtów, za którą następuje znak końca wiersza (ang. End of Line, EOL) o kodzie $9B (155 dziesiętnie). Przykład dwóch rekordów jest następujący:

00 23 4F 55 FF 34 9B 21 34 44 9B
rekord 1 rekord 2

Rekordowe i znakowe operacje we/wy na plikach można wykonywać w dowolnej kolejności. W rzeczwistości dane utworzone jako rekordy mogą być odczytywane jako znaki, a pliki utworzone jako znaki mogą być odczytywane jako rekordy. Jedyną różnicą pomiędzy znakowymi a rekordowymi operacjami we/wy jest to, iż rekordy muszą kończyć się wartością $9B. Wartość $9B jest traktowana jako zwykła dana w znakowej operacji we/wy.

Język BASIC dosyć dobrze wspiera rekordowe operacje we/wy. Można używać rozkazów PRINT i INPUT do zapisu i odczytu rekordów z plików. Natomiast znakowe operacje we/wy nie są całkowicie wspierane przez BASIC. Rozkazy GET i PUT pozwalają jedynie na odczyt lub zapis pojedynczego bajtu. Jednakże system operacyjny posiada możliwość odczytywania i zapisywania bloków znaków. BASIC nie wykorzystuje tej możliwości. Aby z niej skorzystać w systemie operacyjnym, musisz określić długość oraz adres bloku danych do przesłania. Aby używać znakowego trybu blokowego systemu operacyjnego z poziomu języka BASIC, możesz napisać moduł w języku asemblera i wywoływać go z programu w BASIC'u za pomocą funkcji USR. Rys.8-16 przedstawia przykład podprogramu wykonującego znakową operację blokową we/wy.

Rozkaz XIO w języku BASIC jest ogólnym poleceniem we/wy, które pozwala na bezpośrednią komunikację z CIO z poziomu języka BASIC. Więcej szczegółów na ten temat znajdziesz w następnym podrozdziale.


Na początek:  podrozdziału   strony 

Dyskowy pakiet użytkowy


Menu z opcjami DOS 2,5

Dyskowy pakiet użytkowy (ang. Disk Utility Package, DUP) jest zbiorem narzędzi do zarządzania dyskietką, zwykle widzianych jako menu DOS. Pakiet DUP wykonuje rozkazy przez wywoływanie FMS za pośrednictwem CIO. Rozkazy te są następujące (DOS 2.0II):

Następne podrozdziały opisują każdą z tych funkcji. Jednakże ich kompletny opis znajdziesz w instrukcji systemu DOS II.

Znaki zastępcze

Wiele rozkazów w DUP wymaga określenia nazwy pliku. DOS rozpoznaje dwa "znaki zastępcze", którymi możesz zastępować znaki w nazwie pliku. Znaki te są reprezentowane przez znaki specjalne: pytajnik (?) i gwiazdkę (*).

Znaki te stosuje się w deskryptorach nazw plików, gdzie z jakiegokolwiek powodu istnieje nieco niepewności co do dokładnej nazwy. Przykładem może być sytuacja, gdy rozszerzenie nazwy nie jest znane. Innym przykładem jest sytuacja, gdy chcesz skopiować tylko pliki ze specyficznym rozszerzeniem, takim jak OBJ.

Pytajnik (?) może zastępować pojedynczy znak. Gwiazdka (*) może zastępować dowolną kombinację znaków lub dowolną liczbę znaków. Poniższe przykłady ilustrują użycie tych znaków w poleceniu Directory.

*.BAS pokaże listę wszystkich plików na dyskietce w stacji nr 1, które kończą się rozszerzeniem BAS.
D2:*.* pokaże listę wszystkich plików na dyskietce w stacji nr 2.
PRO*.BAS pokaże listę wszystkich plików na dyskietce w stacji nr 1, których nazwy rozpoczynają się od liter PRO i posiadają rozszerzenie BAS.
TEST?? pokaże listę wszystkich plików na dyskietce w stacji nr 1, których nazwy rozpoczynają się na TEST i posiadają dalej dowolną kombinację dwóch znaków.

Katalog dyskietki (A. DIRECTORY)

Katalog dysku zawiera listę wszystkich plików na dyskietce. Rozkaz ten wyświetli nazwy plików, ich rozszerzenia oraz liczbę sektorów zajętych przez plik na dyskietce. Częściową listę można otrzymać przez wprowadzenie specyficznych parametrów. W parametrach mogą być używane znaki zastępcze.

Uruchomienie kartridża (B. RUN CARTRIDGE)

Gdy zostanie wpisana litera B, to DOS przekaże kontrolę systemu do jakiegokolwiek kartridża, który został włożony do gniazda w komputerze. Od tego miejsca działanie komputera zależy od określonego kartridża. Na przykład BASIC odpowie wyświetleniem słowa READY (gotowy) na ekranie.

Jeśli dyskietka w stacji 1 nie była zmieniana od czasu załadowania pakietu DUP i jeśli plik MEM.SAV jest obecny na dyskietce, to zawartość tego pliku zostanie z powrotem skopiowana do pamięci RAM przed przekazaniem kontroli do kartridża. Plik ten zwykle jest używany do przechowywania części pamięci RAM, którą zajmuje DUP po załadowaniu. Jednakże plik MEM.SAV musi już istnieć na dyskietce, gdy nastąpi wywołanie do załadowania DUP. Przed załadowaniem DUP zawartość tej pamięci RAM zostaje zapisana na dyskietce do późniejszego odtworzenia. Możesz traktować MEM.SAV i DUP jako wymieniające się miejscani pomiędzy pamięcią RAM a dyskietką.

Kopiowanie plików (C. COPY FILES)

Rozkaz kopiowania plików, ('C'), jest używany do kopiowania pliku z jednej dyskietki na drugą w innej stacji dysków. Zostaniesz poproszony o podanie określenia pliku dla COPY-FROM (kopiuj z) i TO (kopiuj do). Pierwsze określenie pliku może zawierać znaki zastępcze i może być użyte do oznaczenia ciągu plików do skopiowania. Drugi parametr jest zwykle również określeniem pliku, lecz może także być urządzeniem docelowym, takim jak E: (ekran) lub P: (drukarka). Za drugim parametrem może pojawić się opcja '/A', która oznacza, iż pierwszy nazwany plik ma zostać dołączony na końcu drugiego pliku. Opcji tej nie należy używać z kodowanymi plikami języka BASIC.

Usuwanie plików (D. DELETE FILES)

Ta opcja pozwala ci usunąć jeden lub więcej plików z dyskietki. W specyfikacjach nazw plików można używać znaków zastępczych. Możesz uniknąć potwierdzania usuwania plików przez dołączenie opcji '/N' do specyfikacji pliku.

Zmiana nazw plików (E. RENAME FILES)

Ta opcja pozwala ci zmienić nazwę istniejącego pliku na dyskietce. Musisz dostarczyć dwa parametry: OLD NAME (starą nazwę) i NEW (nową nazwę). Pierwszy parametr musi być kompletną specyfikacją pliku, lecz drugi parametr jest po prostu nową nazwą pliku. Znaki zastępcze są dozwolone dla obu nazw. Jeśli nie zostanie podana żadna specyfikacja urządzenia, to zakłada się D1:. Zostanie wygenerowany błąd, jeśli pierwsza nazwa pliku nie istnieje na dyskietce, jeśli ten plik jest zablokowany lub jeśli dyskietka ma blokadę zapisu.

Blokada plików (F. LOCK FILES)

Ten rozkaz jest używany w celu zapobieżenia przypadkowego skasowania pliku lub jego modyfikacji. Zablokowany plik jest oznaczany gwiazdką (*), która poprzedza jego nazwę w katalogu. Zwróć jednak uwagę, iż rozkaz formatowania zupełnie nie dba o blokady plików na dyskietce.

Odblokowanie plików (G. UNLOCK FILES)

Ta opcja jest używana do odblokowania pliku, który został poprzednio zablokowany. Ten rozkaz oraz rozkaz blokowania plików mogą używać znaków zastępczych.

Zapis plików DOS (H. WRITE DOS FILES)

Ta opcja musi być użyta do utworzenia kopii DOS'a na sformatowanej dyskietce, ponieważ nie można ich skopiować rozkazem kopiowania.

Formatowanie dyskietki (I. FORMAT DISK)

Tej opcji używa się do utworzenia informacji o ścieżkach i sektorach na czystej dyskietce, aby mogła być używana przez DOS'a. Jeśli podczas procesu formatowania zostanie napotkany wadliwy sektor, DOS przerwie tę operację. Dyskietka z wadliwym sektorem nie może zostać sformatowana i jest bezużyteczna. OSTRZEŻENIE! Bądź ostrożny z tym rozkazem, ponieważ usunie on każdy istniejący plik na dyskietce.

Tworzenie kopii dyskietki (J. DUPLICATE DISK)

Ta opcja menu jest używana do tworzenia dokładnej kopii dowolnej dyskietki utworzonej i zarządzanej przez DOS. Można jej używać zarówno w systemach z jedną stacją dysków jak i z wieloma. Tworzenie kopii w systemie z pojedynczą stacją dysków wymaga wielokrotnego ręcznego wymieniania w stacji dyskietki źródłowej z dyskietką docelową.

Proces tworzenia duplikatu dyskietki odbywa się sektor po sektorze. Jednakże kopiowane są tylko te sektory, które Tablica Zawartości Dysku oznacza jako używane.

Przy stosowaniu tego rozkazu należy zachować ostrożność, ponieważ niszczy on wszelkie pliki, które mogły się znajdować wcześniej na dyskietce docelowej. Dobrym pomysłem jest zabezpieczenie dysku źródłowego przed zapisem, aby uniknąć katastrofalnej pomyłki przez odwrotne zapisanie wartości źródłowej i docelowej.

Zapis pliku binarnego (K. SAVE BINARY FILE)

To polecenie używane jest do zapisu zawartości komórek pamięci w pliku o formacie binarnym. Format ten jest również używany przez kartridż ATARI Editor Assembler. Składa się on z dwóch bajtów nagłówkowych $FF, dwóch bajtów na adres startowy ładowania i dwóch bajtów na adres końcowy ładowania. Reszta pliku zawiera dane do załadowania. Zostaniesz poproszony o wprowadzenie nazwy pliku oraz adresów startu i końca bloku do załadowania. Są również dwie dodatkowe wartości adresowe, które można opcjonalnie wprowadzić. Są to wartości, które przy ładowaniu zostaną umieszczone w komórkach znanych pod nazwami INIT [$02E0,2] i RUN [$02E2,2]. Jeśli te komórki zostaną uaktualnione podczas ładowania, to zostanie uruchomiony kod wskazywany przez ich zawartości.

Ładowanie pliku binarnego (L. LOAD BINARY FILE)

Ten rozkaz używany jest do załadowania pliku binarnego z dyskietki do pamięci RAM. Jeśli w pliku zostały dołączone wartości dla INIT i RUN, wtedy rozkaz działa jako procedura ładowana z dysku i uruchamiana po załadowaniu.

Uruchamianie pod adresem (M. RUN AT ADDRESS)

Ten rozkaz używany jest do przekazywania kontroli do procedury w języku maszynowym umieszczonej w pamięci. Zwykle stosuje się go do uruchamiania programu, który został załadowany, lecz nie miał dołączonych wartości dla INIT lub RUN w pliku.

Zapis pliku MEM.SAV (N. WRITE MEM.SAV)

Ta opcja menu jest używana do tworzenia pliku o nazwie MEM.SAV. Plik ten jest wykorzystywany do zachowywania zawartości pamięci, która zostanie nadpisana przez pakiet DUP po załadowaniu z dyskietki. Później MEM.SAV i DUP będą wymieniały się miejscami pomiędzy pamięcią RAM a dyskietką. Zauważ, iż plik MEM.SAV musi być na dyskietce w stacji nr 1, aby zadziałał. Również czas wymiany pamięci zajmuje około 20 sekund, jeśli MEM.SAV jest w użyciu.

Kopia pliku (O. DUPLICATE FILE)

Opcję tą dostarczono, aby kopiować plik z jednej dyskietki na drugą w systemie z jedną stacją dysków. Działa bardzo podobnie do rozkazu kopiowania (C). Główną różnicą jest to, iż to polecenie można użyć do kopiowania pliku utworzonego pod DOS'em I, natomiast zwykłe polecenie kopiowania tego nie potrafi.

Zastępowanie opcji menu pakietu DUP za pomocą rozkazu XIO

Rozkaz XIO w języku BASIC jest ogólnym poleceniem we/wy, które wywołuje bezpośrednio scentralizowany podsystem we/wy, czyli CIO. Format rozkazu XIO jest następujący:

XIO numer rozkazu, #iocb, wartość pomocnicza 1, wartość pomocnicza 2, specyfikacja pliku

Rozkazu XIO można używać do wykonywania funkcji, które zwykle wymagają obecności pakietu DUP. Poniżej pokazano numery rozkazów dla różnych funkcji pakietu DUP

Numer rozkazu Funkcja
3
5
7
9
11
12
13
32
33
35
36
Otwarcie pliku
Odczyt rekordu
Odczyt znaków
Zapis rekordu
Zapis znaków
Zamknięcie pliku
Żądanie podania stanu
Zmiana nazwy pliku
Usunięcie pliku
Blokowanie zmian w pliku
Usunięcie blokady pliku

Na początek:  podrozdziału   strony 

Swobodny dostęp

Jednym z powszechnych zastosowań dyskietki jest zapis rekordów, które można odczytywać w dowolnej kolejności. Nazywamy to swobodnym dostępem (ang. Random Access). Używanie rozkazów we/wy w połączeniu ze specjalnymi rozkazami NOTE i POINT pozwala ci tworzyć i używać pliki o swobodnym dostępie.

DOS przechowuje wskaźnik pliku dla każdego bieżąco otwartego pliku, który informuje DOS o położeniu następnego bajtu do odczytu/zapisu w tym pliku. NOTE i POINT są używane do pobierania bieżącej wartości tego wskaźnika lub do ustawiania go na specyficzną wartość. Wskaźnik pliku posiada dwa parametry: numer sektora i numer bajtu. Numer sektora jest wartością z przedziału od 1 do 719 i informuje DOS, który z sektorów dyskietki jest wskazywany przez wskaźnik. Numer bajtu identyfikuje określony bajt w tym sektorze, do którego nastąpi następny dostęp (zapis/odczyt). Rys.9-2 pokazuje wartości wskaźnika pliku na pozycjach różnych bajtów wewnątrz pliku. Wszystkie wartości są podane w systemie szesnastkowym. Wartości wskaźnika pliku dla bajtów w tym pliku są podane poniżej bajtów pliku.

Plik A
41
B
42
C
43
EOL
9B
D
44
E
45
F
46
EOL
9B
G
47
H
48
I
49
J
4A
K
4B
EOL
9B
...
 
A
41
B
42
Wskaźnik pliku
Numer
sektora
50 50 50 50 50 50 50 50 50 50 50 50 50 50 ... 50 51
Numer
bajtu
0 1 2 3 4 5 6 7 8 9 A B C D ... 7C 0

Rys.9-2 Wartości NOTE i POINT

Powyższy plik został utworzony przy pomocy następującego programu w języku BASIC:

10 OPEN #1,8,0,"D:FILE"
20 ?#1;"ABC"
30 ?#1;"DEF"
40 ?#1;"GHIJK"
    :
    :          :REM Wypełnij resztę sektora
    :
100 ?#1;"AB"   :REM To zapisze rekord, który przekracza koniec sektora
150 CLOSE #1

Sektor o numerze 50 wybrano dowolnie dla tego przykładu. Numer sektora zmienił się na 51, ponieważ plik jest dłuższy od pojedynczego sektora. FMS połączyło plik z następnym dostępnym sektorem o numerze 51. Rekord "AB" przekracza koniec pierwszego sektora.

Numery bajtów wskaźnika pliku rozpoczynają się od 0 i zwiększane są aż do końca sektora, do wartości $7D (125 dziesiętnie). DOS rezerwuje w każdym sektorze 3 bajty na potrzeby zarządzania danymi w pliku. Zatem maksymalnym numerem bajtu pozostaje 124 (0...124 = 125 bajtów ogółem). Gdy plik osiąga koniec sektora, numer następnego bajtu wraca na 0.

Gdy do ustawienie wskaźnika pliku używany jest rozkaz POINT, DOS sprawdza, czy podany sektor należy do otwartego pliku. Jeśli stwierdzona zostaje niezgodność, operacja POINT nie będzie dozwolona.

Rys.9-3 przedstawia podprogram, który można stosować do zapisywania rekordów, śledzenia, gdzie one są, i do odczytywania ich w sposób swobodny

1000 REM PROCEDURA TWORZY I PLIKI O DOSTĘPIE SWOBODNYM Z REKORDAMI
1001 REM O STAŁEJ DŁUGOŚCI
1002 REM
1003 REM ... ROZKAZY SĄ NASTĘPUJĄCE:
1004 REM CMD=1 ZAPIS N-TEGO REKORDU
1005 REM CMD=2 ODCZYT N-TEGO REKORDU
1006 REM CMD=3 UAKTUALNIENIE N-TEGO REKORDU
1007 REM
1008 REM RECORD$ JEST REKORDEM WE/WY
1009 REM N JEST NUMEREM REKORDU
1010 REM INDEX JEST DWUWYMIAROWĄ TABLICĄ UTWORZONĄ JAKO DIM INDEX(1,RECNUM)
1015 REM INDEX PRZECHOWUJE WARTOŚCI ZWRÓCONE PRZEZ NOTE DLA WSZYSTKICH REKORDÓW
1020 REM PROCEDURA ZAKŁADA, IŻ ZOSTAŁ OTWARTY PLIK LOGICZNY #1 DLA OPERACJI WE/WY
1100 REM
1120 REM PROCEDURA ROZPOCZYNA SIĘ W WIERSZU 1200
1130 REM
1200 ON CMD GOTO 2000,3000,4000
2000 REM ............................
2100 REM ZAPIS N-TEGO REKORDU
2200 NOTE #1,X,Y
2300 INDEX(SEC,N)=X:INDEX(BYTE,N)=Y
2400 ? #1;RECORD$:RETURN
3000 REM ............................
3010 REM ODCZYT N-TEGO REKORDU
3020 REM
3030 X=INDEX(SEC,N):Y=INDEX(BYTE,N)
3040 POINT #1,X,Y
3050 INPUT #1;RECORD$
3060 RETURN
4000 REM ............................
4010 REM AKTUALIZACJA N-TEGO REKORDU
4020 REM
4040 X=INDEX(SEC,N):Y=INDEX(BYTE,N)
4050 POINT #1,X,Y
4060 ? #1;RECORD$
4070 RETURN
Rys.9-3 Przykład dla NOTE i POINT

Na początek:  podrozdziału   strony 

Wykorzystanie dysku

Mapa poniżej pokazuje ogólny rozkład sektorów używany przez DOS'a przy zarządzaniu wykorzystaniem sektorów na standardowej 720-sektorowej dyskietce.

Rekord ładowania FMS

Pierwszy sektor na dyskietce jest zarezerwowany do ładowania FMS. Sektor ten zawiera informację dotyczącą konfiguracji systemowej FMS, jak również wskazuje, czy na dyskietce jest obecny plik DOS.SYS lub nie jest. Jeśli pliki DOS są obecne, to zwykle rozpoczynają się od sektora 2 i rozciągają przez 81 sektorów.

Tablica zawartości dysku

Sektor 360 jest zarezerwowany przez FMS na tablicę zawartości dysku (ang. Volume Table of Contents, VTOC). Tablica ta zawiera mapę bitową, która pokazuje sektory przydzielone plikom oraz sektory wolne. Ponieważ do VTOC następuje odwołanie przed każdym zapisem dysku, sektor 360 został wybrany do przechowywania VTOC. Sektor ten znajduje się w środku dyskietki, co skraca minimalny średni czas dostępu do dowolnego sektora dyskietki. Mapa ta rozpoczyna się od bajtu 10 sektora i rozciąga do bajtu 99. Każdy bajt w tym obszarze zawiera informację o przydziale dla ośmiu sektorów. 0 na pozycji bitu oznacza, iż odpowiadający mu sektor znajduje się w użyciu, a 1 oznacza, że jest wolny. Mapa bitowa dysku jest zorganizowana następująco:

Format katalogu plików

Osiem sektorów (361-368) jest zarezerwowanych na katalog plików dyskietki, przy czym każdy sektor jest w stanie przechowywać informację o ośmiu plikach. Stąd maksymalna liczba plików, które można umieścić na pojedynczej dyskietce, wynosi 64.

Każdy wpis do katalogu plików składa się z 16 bajtów. Format każdego wpisu pokazany jest poniżej:

Bajt znaczników posiada następujące przypisania bitów:

Bit nr 7 = 1, jeśli ten plik został skasowany.
Bit nr 6 = 1, jeśli plik jest w użyciu.
Bit nr 5 = 1, jeśli plik został zabezpieczony przed modyfikacją.
Bit nr 0 = 1, jeśli plik został otwarty jako wyjście.

Format sektora pliku zarządzanego przez moduł FMS

Format sektora na dyskietce pokazany jest poniżej:

Pole Numer pliku jest 6-bitową liczbą (zakres od 0 do 63), której używa FMS w celu zapewnienia utrzymania integralności pliku. Pole to zawiera numer wpisu w katalogu dyskietki dla tego pliku. Jeśli kiedykolwiek pojawi się niezgodność pozycji pliku w katalogu z numerem pliku w tym polu sektora, FMS zgłosi błąd i przerwie wykonywaną operację. Pole Następny sektor jest 10-bitowym wskaźnikiem (2 najmłodsze bity bajtu 125 są bitami b9 i b8 tego wskaźnika, pozostałe bity b7 ... b0 znajdują się w bajcie 126), który wskazuje następny sektor w pliku. Sektory tworzą tzw. listę jednokierunkową, w której każdy sektor wskazuje sektor następny, za wyjątkiem ostatniego, który w tym polu ma wartość 0. Więcej na temat list znajdziesz tutaj.

Jeśli bit S jest ustawiony na 1, to dany sektor jest "krótkim sektorem" i zawiera mniej niż 125 bajtów danych. Pozostałe bity bajtu 127 są 7-bitową liczbą określającą liczbę bajtów danych w tym sektorze.


Na początek:  podrozdziału   strony 

Plik AUTORUN.SYS

DOS zawiera opcję, która pozwala na załadowanie do pamięci specjalnego pliku przy każdym uruchomieniu komputera. Mogą to być dane dostosowujące cechy systemu, takie jak ustawienie innych wartości marginesów lub zmianę standardowych kolorów. Jeśli jest pożądane, może to być program w języku asemblera, który będzie wykonany przed wystąpieniem normalnego procesu uruchamiania DOS'a.

Plik ten musi być plikiem binarnym o nazwie AUTORUN.SYS. Aby stał się plikiem wykonywalnym, należy w nim załadować adresem startowym zmienną INIT [$02E0,2] lub zmienną RUN [$02E2,2]. Różnicą pomiędzy tymi dwoma parametrami jest to, iż kod wskazywany przez INIT zostanie wykonany natychmiast po załadowaniu tej zmiennej, natomiast kod wskazywany przez RUN będzie wykonany po zakończeniu całego procesu ładowania pliku. Aby zwrócić kontrolę do DOS'a po wykonaniu pliku AUTORUN.SYS, zakończ swój kod rozkazem RTS.

Plik AUTORUN.SYS może być niezmiernie użyteczny w ustawianiu procedur asemblerowych uruchamianych poprzez ładowanie z dysku. Udostępnia on również pewną metodę rekonfiguracji DOS'a przez "wykradnięcie" określonych wektorów systemowych, zanim DOS będzie miał szansę zainicjować się. Między innymi opcja ta może być używana do dostarczenia pewnego środka ochrony dyskietki. Zobacz na rys.8-3, gdzie podany został przykład ustawiania pliku AUTORUN.SYS do resetowania wskaźnika MEMLO.


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.