0188 - MS-Dos - Od środka cz.6

Omówione dotąd wywołania systemowe były bardzo podobne do wywołań istniejących w systemie operacyjnym CP/M. Teraz zostaną przedstawione wywołania rozszerzone (ang.extended calls) - umożliwiające dostęp do hierarchicznej struktury zbiorów - wprowadzone po raz pierwszy w wersji MS-DOS 2.0 i przypominające wywołania istniejące w systemie XENIX.

Jeśli funkcja związana z danym wywołaniem została wykonana bezbłędnie, system zeruje wskaźnik przeniesienia (ang. carry flag). W przypadku pojawienia się błędu, wskaźnik przeniesienia stanie się jedynką, a w rejestrze AX pojawi się numer błędu (tab.1).

Tabela 1. Zestawienie kodów błędów dla poszczególnych wywołań systemowych

Kod Błędu Znaczenie
01h zły numer funkcji
02h nie znaleziono zbioru
03h nie istnieje podana ścieżka dostępu.
04h zbyt dużo otwartych plików
05h dostęp niedozwolony
06h zły numer kanału dostępu
07h uszkodzona tabela kontrolująca przydział pamięci (ang. memory control blocks)
08h za mało dostępnej pamięci
09h zły adres bloku pamięci
0Ah złe środowisko (ang. environment)
0Bh zły format zbioru (przy ładowaniu pliku .EXE
0Ch zły kod dostępu (ang. access code)
0Dh złe dane (np. przy dostępie do urządzenia)
0Eh nie używany
0Fh zła specyfikacja napędu
10h próba usunięcia aktualnego katalogu
11h użycie nazwy innego napędu dysków przy próbie zmiany nazwy zbioru (ang. RENAME)
12h brak dalszych zbiorów

Dostęp do zbiorów dyskowych jest identyczny, jak do urządzeń we-wy, a przy tym prostszy niż w przypadku funkcji uniwersalnych. Zamiast bloków FCB o rozbudowanej strukturze wewnętrznej stosowane są numery kanałów logicznych (ang. handle). Przy otwieraniu zbioru (lub urządzenia) system informuje użytkownika o wybranym numerze kanału. Wystarczy więc podać numer kanału ,aby uzyskać dostęp do otwartego zbioru (urządzenia).

W systemie jest pięć otwartych na stałe kanałów przypisanych standardowym urządzeniom we-wy (tab.2). Nazwy zbiorów podaje się umieszczając w pamięci kody tzw. ASCIIZ (od ASCII-zero), czyli ciągi kodów ASCII zakończone znakiem końca bajtem o wartości 00.

Tabela 2. Standardowe kanały logiczne w MS-DOS

Nr. Kanału Przyporządkowane urządzenie
00 Standardowe wejście CON: (typowo - wejście z klawiatury)
01

Standardowe wyjście COM: (typowo - wyjście na ekran)

02 Wyjcie informacji o błędach (zawsze na ekran CON:)
03 Standardowe we-wy szeregowe (AUX:)
04 Standardowe wyjście równoległe na drukarkę (PRN:)

Tabela 3. Kodowanie sposobu dostępu do pliku (funkcja 3Dh)

       Bit       | Znaczenie 
 7 6 5 4 3 2 1 0 | poszczególnych bitów
 ---------------------------------------
 I . . . . . . . | dziedziczność
   S S S . . . . | tryb współposiadania
         R . . . | zarezerwowane
           A A A | dopuszczalny tryb dostępu :
           0 0 0 | tylko odczyt
           0 0 1 | odczyt lub zapis
           0 1 0 | odczyt lub zapis

Funkcja 39h - umożliwia utworzenie katalogu, Rejestry DS:DX muszą zawierać adres obszaru pamięci, w którym znajduje się ciąg ASCIIZ opisujący ścieżkę dostępu do katalogu (ang. path name). Możliwe są błędy: 03h i 05h (tab.1).

Funkcja 3Ah - pozwala usunąć katalog, w którym nie ma żadnego pliku ani katalogu podrzędnego. Rejestry DS:DX powinny zawierać adres obszaru pamięci, w którym znajduje się ciąg ASCIIZ określający ścieżkę dostępu do usuwanego katalogu. Możliwi błędy : 03h oraz 05h. Kod 05h oznacza próbę usunięcia katalogu, który nie jest pusty

Funkcja 3Bh - zmienia aktualny katalog. Rejestry DS:DX powinny zawierać adres ciągu ASCIIZ, określającego ścieżkę dostępu do katalogu, który ma się stać aktualnym. Jednym możliwym błędem jest 03h.

Funkcja 3Ch - służy do utworzenia i otwarcia nowego zbioru oraz nadania mu atrybutów. Jeśli istnieje już zbiór o podanej nazwie, to jego zawartość zostanie stracona, gdyż przyjmowana jest zerowa długość zbioru. Zbiór jest następnie otwierany do odczytu-zapisu. Rejestry DS:DX muszą wskazywać na ciąg ASCIIZ, opisujący ścieżkę dostępu do zbioru, zaś rejestr CX powinien zawierać bity opisujące atrybuty nadawane plikowi. Mogą pojawić się trzy rodzaje błędów : 03h, 04h lub 05h. Błąd 05h może wystąpić, gdy brak miejsca na nową pozycję w katalogu, albo gdy podano nazwę istniejącego  zbioru z atrybutem "tylko do odczytu". Jeśli nie wystąpił żaden błąd w rejestrze AX, podawany jest numer kanału logicznego wybranego przez system dla otwartego zbioru.

Funkcja 3Dh - Otwiera istniejący zbiór. Ścieżka dostępu, w postaci ciągu ASCIIZ, musi być wskazywana przez rejestry DS:DX. W rejestrze AL należy umieścić bajt opisujący sposób dostępu do zbiory (tab.3). W wersji MS-DOS 2. istotne są tylko bity 2...0, kodujące tryb dostępu do otwieranego zbioru, pozostałe bity powinny być równe zeru. Począwszy od wersji MS-DOS 3. istotne stały się pozostałe bity. Bit 7 jest bitem dziedziczności.

W wyniku realizacji programu mogą zostać uruchomione inne programy. Jeśli bit 7 jest zerem, program wywoływany (ang. child) może korzystać ze zbioru dyskowego na równi ze swym programem wywołującym. Jeśli bit 7 jest jedynką, dostęp do zbioru jest zastrzeżony dla programu wywołującego. Program wywoływany może uzyskać dostęp do zbioru tylko na specjalne żądanie. Bity 6 ... 4 opisują pięć możliwych trybów współposiadania zbioru (ang. sharing-mode). Określają one, co się stanie w przypadku próby otwarcia tego samego zbioru więcej niż jeden raz. Bit 3 powinien być zawsze równy zeru. Mogą wystąpić trzy rodzaje błędów : 02h, 05h i 12h. Jesli nie wystąpi żaden, to po wyjściu z wywołania rejestr AX zawiera numer kanału logicznego przyporządkowanego do zbioru (tab.2).

Funkcja 3Eh - pozwala na zamknięcie zbioru. W rejestrze BX należy umieścić numer kanału logicznego przyporządkowanego przez system do zamykanego zbioru. Możliwy jest tylko błąd 06h.

Funkcja 3Fh - umożliwia odczyt danych ze zbioru lub urządzenia. W rejestrze BX należy umieścić numer kanału logicznego przyporządkowanego odczytywanemu zbiorowi (lub urządzeniu), a w rejestrze CX - liczbę bajtów do odczytania. Rejestry DS:DX powinny wskazywać adres bufora, w którym mają zostać umieszczane dane. Jeśli nie wystąpi błąd, to w AX podawana jest rzeczywista liczba wczytanych bajtów. Mogą wystąpić błędy : 05h i 06h.

Funkcja 40h - pozwala zapisać dane w zbiorze. W BX należy podać numer kanału logicznego, w CX - liczbę zapisanych bajtów, a w DS:DX - adres bufora, z którego pobierane mają być dane przeznaczone do zapisu. Jeśli nie stwierdzono błędu, to liczba rzeczywiście przesłanych bajtów (w AX) jest równa liczbie bajtów przeznaczonych do przesłania. Możliwe błędy : 05h i 06h.

Funkcja 41h - usuwa zbiór. Rejestry DS:DX muszą wskazywać na łańcuch ASCIIZ, opisujący dostęp do usuwanego zbioru. Zbiory z atrybutem "tylko do odczytu" nie mogą zostać usunięte, lecz najpierw trzeba zmienić atrybut "na zbiór do odczytu i zapisu" (funkcja 43h). Przy usuwaniu zbiorów nie można używać symboli wieloznacznych (? i *). Mogą wystąpić błędy : 02h i 05h.

Funkcja 42h - służy do zmiany wskaźnika logicznego określającego miejsce odczytu-zapisu w zbiorze. Rejestr BX powinien zawierać numer logiczny kanału. Nową pozycję określa się podając w rejestrze AL liczbę definiującą sposób przesunięcia wskaźnika, a w rejestrach CX i DX - przesunięcia będące 32-bitową liczbą całkowitą bez znak (CX zawiera bardziej znaczące bity przesunięcia). Są trzy sposoby przesunięcia wskaźnika. Jeśli AL = 0, to przesunięcie jest określane względem początku zbioru; przy AL=1 - względem aktualnej pozycji, a przy AL = 2 - względem końca zbioru w kierunku jego początku. Jeśli nie było żadnego błędu, to po powrocie z wywołania para rejestr.ów DX i AX zawiera 32-bitową liczbę, określającą przesunięcie wskaźnika względem początku pliku (DX zawiera bardziej znaczące bity tej liczby). Mogą wystąpić błędy : 01h i 06h.

Funkcja 43h - podaje lub ustawia atrybuty pliki. Rejestry DS:DX muszą zawierać adres ciągu znaków określających zbiór (nie można używać symboli wieloznacznych (? i *)). Jeśli przy wejściu do wywołania zawartość rejestru AL jest równa 0 to, przy wyjściu w rejestrze CX znajdą się bity określające atrybuty pliku. Jeśli natomiast przy wejściu do procedury rejestr AL jest równy 1, plikowi zostaną nadane atrybuty określone przez bity rejestru CX. Mogą wystąpić błędy : 02h, 03h i 05h.

Funkcja 44h - umożliwia sterowanie urządzeń znakowych z poziomu systemu operacyjnego (takich jak konsola lub we-wy szeregowe) oraz zbiorów. Przed wywołaniem funkcji w rejestrze AH należy umieścić 44h (wartość kodu funkcji), w rejestrze AL kod operacji (tab.4), a w rejestrze BX - numer kanału logicznego związanego ze standardowym urządzeniem bądź numer napędu dla operacji 4 i 5.

Tabela 4. Operacje realizowane za pomocą funkcji 44h

Kod Opis
00h Pobranie informacji o urządzeniu (do rejestru DX)
01h Ustalenie informacji o urządzeniu (wg DX, przy czym DH 0)
02h Odczyt z kanału sterującego urządzeniem znakowym
03h Zapis do kanału sterującego urządzeniem znakowym
04h Odczyt z kanału sterującego urządzeniem blokowym (napędu dysków)
05h Zapis do kanału sterującego urządzeniem blokowym (napęd dysków)
06h Sprawdzenie gotowości urządzenia wejściowego
07h Sprawdzenie gotowości urządzenia wyjściowego
08h Sprawdzenie, czy dysk jest wymienialny czy stały
0Bh Ustalenie sposobu dostępu do wspólnych plików

W odniesieniu do zbiorów można stosować tylko operacje 00h, 06h i 07h, a począwszy od wersji DOS-3 także 0Bh. Możliwe są następujące błędy 01h, 05h oraz 0Dh.

Operacja 00h - umożliwia pobranie informacji o urządzeniu (zbiorze), związanych z kanałem logicznym o numerze podanym w rejestrze BX. Po powrocie z wywołania informacja o urządzeniu zakodowana jest w rejestrze DX (tab.5). Bit 7 tego rejestru decyduje o sposobie interpretacji pozostałych bitów - innym dla urządzeń i innym dla zbiorów.

Operacja 01h - może być wykonywana tylko w odniesieniu do urządzeń znakowych. Umożliwia ustalenie lub zmianę sposobu traktowania przez system urządzenia związanego z danym kanałem logicznym. Informację należy zakodować podobnie jak w przypadku operacji 00h (tab.5), ustalając odpowiednio zawartość rejestru DX, przy czym DH musi zawierać zero.

Operacja 02h - służy do odczytania znaków sterujących z urządzenia (nie są one w żaden sposób związane ze znakami składającymi się na dane odczytywane z urządzenia). Operacja jest możliwa tylko wtedy, gdy przy operacji 00h otrzymano w wyniku 14 bit rejestru DX, równy 1. W rejestrze CX należy podać liczbę odczytywanych znaków sterujących, a w rejestrze DS:DX - adres bufora dla zapamiętania tych znaków.

Operacja 03h -umożliwia zapisanie znaków sterujących do urządzenia znakowego. Poza zmiana kierunku transmisji, nie różni się niczym od operacji 02h.

Operacja 04h - umożliwia odczyt znaków sterujących z napędu dysków. Zamiast numeru kanału logicznego w BX, należy podać w BL numer napędu dyskowego, przy czym 0 oznacza napęd aktualny, 1 - napęd A, 2 - napęd B, itd, W rejestrze CX trzeba podać liczbę bajtów do odczytania, a w DS:DX - adres bufora dla odczytanych bajtów. Przed powrotem z wywołania system umieści w AX liczbę rzeczywiście przesłanych bajtów.

Operacja 05h - pozwala przesłać znaki sterujące do napędu dysków. Poza zmianą kierunku transmisji, niczym nie różni się od operacji 04h.

Operacja 06h - to sprawdzenie gotowości urządzenia znakowego wejściowego lub zbioru, przy czym brak gotowości zbioru oznacza, że nie można go dalej czytać, gdyż napotkano znak końca pliku (EOF). Po powrocie z wywołania AL=00 świadczy o niegotowości, a AL = 0FFh o gotowości urządzenia (zbioru).

Operacja 07h - jest sprawdzeniem gotowości urządzenia znakowego wyjściowego. Można stosować ją również dla zbiorów, ale nie ma to większego sensu, gdyż dla zbioru gotowość zapisu będzie sygnalizowana nawet wtedy, gdy w rzeczywistości zapis będzie niemożliwy np. z powodu przepełnienia dyskietki. Stany : gotowość i brak gotowości sygnalizowane są identycznie jak dla operacji 06h.

Operacja 08h - (w wersji MS-DOS-3.) umożliwia sprawdzenie czy dany dysk jest wymienialny. Po powrocie z wywołania AX=0 świadczy o wymienialności dysku (dysk elastyczny), AX=1 o jego niewymienialności (dysk sztywny), zaś AX = 0Fh o podaniu złego kodu urządzenia.

Operacja 0Bh - (w wersji DOS-3.XX) ustala sposób reakcji systemu na próbę dostępu do zbioru, który jest wspólny dla kilku programów, ale niedostępny dla danego programu. DOS może wielokrotnie próbować uzyskać dostęp programu do danego zbioru (między kolejnymi próbami blokada dostępu może zostać zniesiona). W rejestrze DX należy podać liczbę dopuszczalnych prób dostępu do zbioru, a w rejestrze CX - liczbę określającą odstęp czasu pomiędzy poszczególnymi próbami.

Tabela 5. Kodowanie informacji o urządzeniu (operacje 0 i 1 funkcji 44h)

Bity Urządzenia znakowe: Bit 7 = 1 - Znaczenie
15 bit zastrzeżony
14 1 oznacza, że urządzenie może otrzymywać i wysyłać znaki sterujące (tylko na takim urządzeniu można wykonywać operacje 2 i 3). Bit ten może być tylko sprawdzany - nie można go ustawić.
13 ... 8 bity zastrzeżone
8 0 oznacza, że przy odczycie z urządzenia napotkano znak końca pliku (EOF)
7 1 oznacza, że z danym kanałem logicznym związane jest urządzenie znakowe
5 1 oznacza, że znaki specjalne (CTRL-C, CTRL-P, CTRL-S, CTRL-Z są przekazywane do/z urządzenia bez przetwarzania; 0 oznacza przetwarzanie tych znaków na odpowiednie sekwencje
4 bit zastrzeżony
3 1 oznacza, że urządzenie jest zegarem systemowym
2 1 oznacza, że urządzenie jest urządzeniem pustym (ang. Null Device), czyli że przyjmuje znaki, lecz nigdzie ich dalej nie wysyła
1 1 oznacza, że urządzenie jest standardowym wyjściem
0 1 oznacza, że urządzenie jest standardowym wejściem

--- ^ --- ^ ---

Bity Zbiory: Bit 7 = 0 - Znaczenie
15 ... 8 zarezerwowane
7 0 oznacza, że z danym kanałem logicznym związany jest plik
6 0 oznacza, że do danego kanału logicznego przesłano już jakieś dane
5 ... 0 numer napędu dysków, w którym znajduje się plik związany z podanym kanałem logicznym (0 oznacza napęd A, 1 - Napęd B, itd)

Opr. Zbigniew Pojmański,
Mikroklan, Styczeń 1988r.