Ogólna charakterystyka systemu CP/M 2.2 .

Zawartość:

© 1998-08-18 Jarek Adamski. Wersja 1.3.

Literatura.

  1. Dec M., Matuszczak M.: 'Poznaj swoją dyskietkę.' Komputer 8,10/87
  2. Feichtinger H.: 'Mikrokomputery. Poradnik.' WKŁ Warszawa 1988.
  3. Jedynak T., Pietruszka M.: 'System operacyjny CP/M-80.' Komputer 6,7/88.
  4. Jedynak T., Pietruszka M.: 'CP/M [3].' Komputer 8/88.
  5. Gardynik S.: 'MIK11. Superemulator MikSID.' MIK Raszyn 1991.
  6. Majewski A. J.: 'CP/M.' Komputer 1,2/86.
  7. Mayer J.: 'Oreracje dyskowe w systemie CP/M Plus.' Bajtek 1-2/90, 3-4/90, I(5-6)/90.
  8. Mayer J.: 'Test komputera Spectravideo SVI 738.' Bajtek 3-4/90.
  9. Pietruszka M.: 'CP/M [4].' Komputer 9/88.
  10. Sawicki M., Wolcendorf M.: 'Formatowanie dyskietek w TOS-ie.' Bajtek 11/92.
  11. Świniarski R.: 'System operacyjny CP/M.' WNT Warszawa 1988.

  12. 'Funkcje BDOS.' Komputer 8,9,10,11,12/88.
  13. 'MSX Spectravideo SVI 738.' tom 2.

Tak to wygląda z zewnątrz.

Praca z systemem.

Podstawowym pojęciem w systemie CP/M 2.2 jest plik (zbiór). Jest to ciąg danych posiadający własną nazwę. Pliki są przechowywane na dyskach (dyskietkach) obsługiwanych przez napędy dyskowe. Zestaw nazw plików nazywamy katalogiem dysku. System może sterować szesnastoma napędami o maksymalnej pojemności 2 GB (2048 MB). Każdy z nich posiada ściśle określoną strukturę logiczną oraz nazwę złożoną z jednej z liter A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P oraz dwukropka. Jeden z napędów jest przez system wyróżniony i nazywany domyślnym. Niezależnie od tego wyróżniony jest napęd A: (systemowy), z którego jest wczytywany system. System steruje również czterema urządzeniami logicznymi: konsolą (CON:), czytnikiem (RDR:), perforatorem (PTP:) oraz drukarką (LST:). Zadaniem systemu jest ułatwienie użytkownikowi przesyłania plików między napędami, pamięcią operacyjną komputera oraz urządzeniami logicznymi.

Po uruchomieniu systemu pojawia się jego wizytówka zawierająca informację o wersji systemu. Domyślnym napędem staje się dysk A: (czynności te nazywane są zimnym startem). System zgłasza swoją gotowość wyświetlając nazwę domyślnego napędu (bez dwukropka) oraz znak '>', po którym pojawia się kursor.
A>

Użytkownik wpisuje polecenie i naciska klawisz <RETURN> (operacja ta jest dalej nazywana wprowadzaniem polecenia). System interpretuje polecenie i jeżeli jest ono poprawne wykonuje je. Po wykonaniu polecenia system ponownie zgłasza swoją gotowość. Polecenie złożone jest z komendy i ewentualnych parametrów. Komendę stanowi ciąg znaków do pierwszego odstępu (spacji). Poza zimnym startem istnieje proces zwany restartem (ciepłym startem). Powoduje on odtworzenie tych części systemu, które mogły ulec uszkodzeniu, inicjuje napęd systemowy oraz domyślny (jeśli różny od A:) i odłącza pozostałe, po czym następuje zgłoszenie gotowości.

Pliki.

Plik jest zbiorem danych posiadającym następujące cechy:

Oznaczenie jednoznaczne składa się z:

Pominięcie określenia napędu jest równoznaczne ze wskazaniem napędu domyślnego. Nazwy i typy krótsze są uzupełniane automatycznie znakami odstępu, których nie należy podawać. Typ pliku można pominąć przy pracy z niektórymi programami (tzw. typ domyślny), przykładowo:

Nazwa i typ mogą być złożone wyłącznie z następujących znaków (małe litery są automatycznie zamieniane na wielkie):

      ! $ & ( ) - 0 1 2 3 4 5 6 7 8 9 @ A B C D E F G

      H I J K L M N O P Q R S T U V W X Y Z ^ { | } ~

Ponadto dopuszczalne są znaki:

     " # % ' + , / [ \ ] `

Jednak ze względu na niektóre programy, używające ich do własnych celów (np. oddzielania parametrów) nie jest to zalecane i może powodować komplikacje.

Niektóre programy (zwłaszcza Microsoft) umożliwiają również użycie innych znaków (np. małych liter). Należy tego unikać, gdyż tak nazwane pliki nie będą prawidłowo obsługiwane przez system.

Oznaczenie niejednoznaczne (grupowe) zawiera znaki "?" i "*" (tzw. wild cards). Znak zapytania oznacza możliwość wystąpienia w tym miejscu każdego innego znaku. Gwiazdka jest równoważna z uzupełnieniem znakami "?" do pełnej długości. Symbol "*.*" wskazuje wszystkie pliki na danym dysku. Niejednoznaczne wskazanie napędu nie jest dopuszczalne.

Atrybuty pliku można zmieniać programem STAT. Istnieją dwa rodzaje atrybutów: Plik może być ukryty ($SYS) lub nie ($DIR) oraz zabezpieczony przed zapisem ($R/O) lub nie ($R/W). Dodatkowo niektóre programy używają atrybutu archiwizacji, który określa, czy istnieje kopia pliku.

Szczególnym rodzajem plików są pliki tekstowe. Składają się one z linii (wierszy - ciągów znaków) kończących się sekwencją CR LF (^M^J). Ostatnia zakończona jest znakiem SUB (^Z). Można je tworzyć oraz zmieniać za pomocą edytorów tekstu (np. ED, ED80, VDE, WS itp.). Pliki tekstowe można wyświetlić poleceniem TYPE. Długość linii nie powinna przekraczać ilości kolumn ekranu lub drukarki (zwykle do 80-127-255 znaków). Niektóre programy jako koniec pliku uznają inne znaki (np. TURBO Pascal - znak o numerze 255).

Błędy.

System (moduł BDOS) zgłasza cztery błędy (pojawia się jeden z komunikatów, zamiast X: jest wstawiana nazwą napędu, którego błąd dotyczy):

Bdos Err On X: R/O

Występuje, gdy dyskietka zostanie wymieniona, a system nie zostanie poinformowany wciśnięciem ^C na poziomie CCP lub odpowiednią opcją w programie. Zabezpiecza przed przypadkowym zapisaniem obcej dyskietki. Porządne programy potrafią uniknąć tego błędu. Wciśnięcie dowolnego klawisza powoduje restart systemu.

Bdos Err On X: File R/O

Występuje przy próbie zapisu, usunięcia lub zmiany nazwy pliku z atrybutem $R/O. Zabezpiecza plik przed przypadkową modyfikacją. Możliwy do uniknięcia.

Bdos Err On X: Select

Podana została nazwa niedostępnego napędu. W pewnych sytuacjach wystąpienie tego błędu może doprowadzić do zawieszenia komputera.

Bdos Err On X: Bad Sector

Występuje w przypadku nieudanej operacji dyskowej. Powodem najczęściej jest brak dyskietki w napędzie, fizyczne zabezpieczenie przed zapisem, użycie niesformatowanej dyskietki lub niezgodność jej formatu z wymaganym przez system. Zjawiskiem normalnym jest sporadyczne (co kilkadziesiąt godzin pracy) wystąpienie tego błędu bez sensownego powodu, jednak częstsze jego pojawianie się oznacza najprawdopodobniej uszkodzenie dyskietki lub napędu.
Dowolny klawisz - kontynuacja, ^C - restart.

Jeżeli zamiast BDOSu Digital Research użyty jest inny BDOS (np. SUPERDOS lub Z80DOS) treść komunikatów może być inna (znaczenie pozostaje takie samo). Może być wyświetlony dodatkowo numer funkcji i nazwa pliku.

CCP.

Czyli Procesor Komend. Jest to program będący jednym z modułów systemu CP/M. Zadaniem jego jest komunikacja z użytkownikiem - wyświetlenie oznaczenia domyślnego napędu i znaku '>', wprowadzenie, interpretacja i wykonanie polecenia.

Przy wprowadzaniu dostępne są następujące kody pomocnicze:

Rodzaje poleceń:


Wyświetlenie oznaczeń plików - katalogu dysku (DIR). Parametrem domyślnym jest *.* . Można podać niejednoznaczne oznaczenie plików lub tylko nazwę napędu. Wyświetlane są tylko oznaczenia plików aktywnego użytkownika z atrybutem $DIR.
A>DIR
A>DIR *.PAS
A>DIR M:

Usunięcie pliku (ERA). Parametrem jest niejednoznaczne oznaczenie plików. Zalecane jest używanie jednoznacznego oznaczenia pliku ze względu na możliwość nieświadomego usunięcia ważnych danych. Nie zostanie wykonane jeśli napęd ma status R/O (np. została wymieniona dyskietka). Zostaje przerwane po napotkaniu zabezpieczonego pliku (File $R/O). Parametr *.* spowoduje pojawienie się pytania i aby usunąć wszystkie pliki konieczne jest wprowadzenie litery 'Y'. (ZCPR1 ma tę zaletę, że wyświetla nazwy usuwanych plików.)
A>ERA *.BAK
C>ERA *.*
ALL (Y/N)?

Zmiana oznaczenia pliku (REN). Parametr według schematu >newname<=>oldname< (jednoznacznie), przy czym plik >oldname< musi mieć atrybut $R/W, a plik >newname< nie może istnieć. Zmiana dotyczy napędu wskazanego przy >newname<.
A>REN TEXT.TXT=TEXT.BAK
A>REN B:NOWY=STARY

Wyświetlenie pliku (TYPE). Jako parametr należy podać jednoznaczne określenie pliku. Postać wydruku będzie sensowna wyłącznie dla plików tekstowych.
A>TYPE READ.ME

Utworzenie pliku (SAVE). Jest to raczej zaawansowane polecenie. Powoduje ono skopiowanie określonej ilości stron (strona to 256 bajtów) TPA (obszaru pamięci programu) do pliku (z atrybutami $DIR i $R/W).
A>SAVE 16 MEMORY.DAT
A>SAVE 34 CPM64.COM

Zmiana numeru użytkownika (USER). Jako parametr podaje się numer użytkownika 0..15. Umożliwia istnienie na dysku 16 niezależnych obszarów plików. Po zimnym starcie wybrany jest użytkownik nr 0. Praktyczne zastosowanie w CP/M 2.2 raczej niewielkie. Dopiero ZCPR1 i późniejsze wersje CP/M posiadają mechanizmy czyniące tą komendę przydatną, szczególnie przy obsłudze dysków twardych. A>USER 7

Poprzedzenie powyższych komend nazwą napędu nie jest dopuszczalne.
A>B:DIR
spowoduje szukanie na dysku B: pliku DIR.COM !

Jeżeli komenda nie jest jedną z sześciu powyższych, CCP szuka w domyślnym (lub wskazanym) napędzie pliku ">komenda<.COM", będącego programem, ładuje do pamięci i uruchamia go. Jeśli plik taki nie zostanie znaleziony CCP wyświetli komunikat:
>komenda<?
i zgłosi ponownie gotowość.
A>EMPTY
EMPTY? - plik EMPTY.COM nie istnieje
A>PIP
A>STAT
A>TURBO
A>WS

Niektóre programy wymagają podania odpowiednich parametrów (należy sprawdzić jakie są wymagane w konkretnym przypadku - najczęściej jest to nazwa pliku).
A>PIP M:=A:*.COM[ORV]
A>STAT *.*
A>WS A:CP/M.TXT

Moduł CCP z systemu ZCPR1 zachowuje się trochę inaczej. Wyświetla numer użytkownika (czasem zero też). Dostępne są też dodatkowe komendy, jak:

Pewne komendy działają inaczej:

Program jest szukany kolejno w obszarach (przykład dla USER 12 i DFU 5):

Urządzenia logiczne.

System CP/M może przesyłać pliki z/do czterech urządzeń logicznych (potwierdzenie oznacza tu możliwość sprawdzenia gotowości urządzenia do przesłania znaku):

Każdemu z tych urządzeń może być przypisane jedno z czterech urządzeń fizycznych:

CON:=TTY: CRT: BAT: UC1:
RDR:=TTY: PTR: UR1: UR2:
PUN:=TTY: PTP: UP1: UP2:
LST:=TTY: CRT: LPT: UL1:

dalsze informacje - patrz program STAT. Działanie urządzeń fizycznych jest zależne od implementacji CP/M. Na ogół TTY: to łącze szeregowe, CRT: to ekran i klawiatura, a LPT: odpowiada drukarce.

Tak to wygląda od środka.

Organizacja pamięci.

System dzieli pamięć komputera (max 64 KB) na pięć obszarów - trzy z nich zajęte są przez moduły systemu:

BIOS zawiera 17 podstawowych procedur. Ich realizacja jest uzależniona od budowy komputera. Można podzielić je na trzy grupy:

Krótki ich opis znajduje się dalej.

BDOS zawiera 38 procedur wyższego poziomu. Dostęp do nich odbywa się poprzez skok do adresu #0005 (wykonaniem rozkazu CALL #0005) w rejestrze C procesora należy umieścić kod właściwej funkcji, a w rejestrze E (lub w DE, gdy potrzebne są dwa bajty) należy umieścić parametr. Po wykonaniu operacji system przekazuje informację o jej zakończeniu w rejestrze A lub HL. Ogólnie wywołanie modułu BDOS ma postać:

    LDC,>kod_funkcji<
LDDE,>argument<
CALL #0005

CCP czyli procesor komend organizuje dialog z użytkownikiem, a wszystkie operacje wykonuje za pośrednictwem modułu BDOS.

TPA (Transient Program Area) jest to obszar, do którego ładowane są programy. Mogą one również zajmować obszar modułu CCP, ponieważ nie jest on potrzebny podczas realizacji programu. Dla programów pozostaje maksymalnie 60672 bajtów. Programy mogą również zajmować obszar BDOS jeżeli nie korzystają z systemu plików (praktycznie niespotykane).

ZERO PAGE czyli strona zerowa pośredniczy w komunikacji programów z systemem operacyjnym oraz zawiera pewne informacje sterujące pracą systemu.

Schematycznie wygląda to tak (z lewej strony podane są przykładowe adresy dla kilku różnych implementacji):

#BFFF#FFFF#FFFF#FFFF#FFFF
BIOS
minimum 1kB
#BC00#E200#F200#FA00#FC00
BDOS
3.5kB
#AA00#D400#E400#EC00#EA00
TPACCP
2kB
#A600#CC00#DC00#E400#E600
TPA
maksimum 59.25kB
#0100#0100#0100#0100#0100
ZERO PAGE
0.25kB
#0000#0000#0000#0000#0000

Funkcje BDOS.

Zwykle argument podaje się w E lub DE, funkcje zwracają wartości w A lub HL.

Funkcja 0: SYSTEM RESET - Zerowanie systemu
Inicjuje system. Odtwarza CCP i BDOS oraz oddaje sterowanie do poziomu CCP. Inicjuje napęd domyślny oraz systemowy. Funkcja daje taki sam efekt jak wykonanie procedury BOOT z BIOSu.

Funkcja 1: CONSOLE INPUT - Wejście z konsoli
Czyta następny znak z konsoli do rejestru A. Znaki posiadające odpowiednik graficzny, wraz ze znakami CR, LF i BS są powtarzane na konsoli. Znak tabulacji poziomej TAB przesuwa kursor do następnej pozycji tabulacji (co 8 kolumn). Sprawdzane jest, czy nie pojawił się znak ^S powodujący zatrzymanie wyświetlania oraz ^P oznaczający start/stop echa na drukarce. BDOS nie powraca do programu wywołującego aż do momentu, gdy znak będzie napisany, tak więc działanie jest zawieszone jeżeli znak nie jest gotowy.

Funkcja 2: CONSOLE OUTPUT - Wyjście na konsolę
Znak ASCII z rejestru E wysyła na konsolę. Działanie znaków sterujących jest identyczne jak w przypadku funkcji 1.

Funkcja 3: READER INPUT - Wejście z czytnika
Czyta następny znak z PTP: do rejestru A. Nie powraca do momentu, aż znak zostanie przeczytany.

Funkcja 4: PUNCH OUTPUT - Wyjście na perforator
Wysyła znak z rejestru E do PUN:.

Funkcja  5: LIST OUTPUT - Wyjście na drukarkę
Wysyła znak ASCII z rejestru E do LST: .

Funkcja 6: DIRECT CONSOLE I/O - Bezpośrednie we/wy konsoli
Jeżeli argument wejściowy w rejestrze E jest równy #FF, to funkcja zwraca w rejestrze A wartość #00 gdy znak nie jest gotowy lub kod następnego znaku wprowadzonego z konsoli. W przypadku argumentu wejściowego różnego od #FF jest on wysyłany jako znak na konsolę. Nie są realizowane kody sterujące (^P, ^S). Używana w połączeniu z innymi funkcjami we/wy konsoli może powodować gubienie wprowadzanych znaków.

Funkcja 7: GET IOBYTE - Pobranie IOBYTE
Przesyła aktualną wartość IOBYTE do rejestru A.

Funkcja 8: SET IOBYTE - Ustawienie IOBYTE
Zmienia wartość IOBYTE na wartość podaną w rejestrze E.

Funkcja 9: PRINT STRING - Drukowanie łańcucha
Wysyła na konsolę łańcuch znaków znajdujący się w pamięci od adresu podanego w rejestrze DE. Znak '$' (#23) jest traktowany jako zakończenie łańcucha i nie jest przesyłany. Działanie znaków TAB, ^S, ^P jest identyczne jak w przypadku funkcji 1.

Funkcja 10: READ CONSOLE BUFFER - Czytanie bufora konsoli
Wczytuje ciąg znaków z konsoli do bufora w pamięci o adresie podanym w rejestrze DE. Wprowadzanie jest zakończone, gdy bufor wejściowy zostanie przepełniony lub zostanie wprowadzony znak CR lub LF. Bufor ma następującą strukturę:

DE+0+1+2+3..+n+1
bajtmxncc1c2..cn

gdzie >mx< jest maksymalną liczbą znaków, które mogą być wprowadzone (1..255), >nc< jest liczbą faktycznie wczytanych znaków (należy go zainicjować na zero), >c1<..>cn< są znakami wczytanymi z konsoli. Funkcja interpretuje znaki sterujące:

Należy pamiętać, że znaki sterujące, które powodują powrót karetki do pozycji położonej najbardziej w lewo (np. ^X) czynią to tylko do tej pozycji kolumny, gdzie kończy się podpowiedź systemu (we wcześniejszych wersjach kursor powracał do skrajnego lewego marginesu). Funkcja 11: GET CONSOLE STATUS - Pobranie stanu konsoli
Daje możliwość sprawdzenia czy wprowadzono znak z konsoli. Jeżeli znak jest gotowy to w rejestrze A jest wartość #FF. 0 oznacza, że żaden znak nie oczekuje na wczytanie. Współpracuje z funkcją 1.

Funkcja 12: RETURN VERSION NUMBER - Przekazanie numeru wersji
Pozwala na programowanie zależne od wersji systemu. Zawartość rejestru H równa #00 oznacza system CP/M ( #01 - MP/M ), zawartość rejestru L równa #00 odnosi się do wcześniejszych wersji o numerach mniejszych od 2.0 . W przypadku wersji 2.0 przekazywana jest wartość #20. Kolejne wersje są oznaczane wartościami #21..#2F (#22 oznacza wersję 2.2).

Funkcja 13: RESET DISK SYSTEM - Zerowanie systemu dyskowego
Nadaje wszystkim napędom stan R/W (patrz funkcja 28 i 29), ustala A: jako domyślny oraz DMA = #0080. Używana przez programy, które wymagają wymiany dysku w czasie pracy.

Funkcja 14: SELECT DISK - Wybór dysku
Ustala napęd o numerze podanym w rejestrze E jako domyślny. 0 oznacza dysk A:, 1 - dysk B:, itd. Wybrany napęd posiada status włączenia do systemu (patrz funkcja 24). Bloki FCB, których bajt >dr< = #00 odnoszą się do domyślnego napędu.

Funkcja 15: OPEN FILE - Otwarcie pliku
Uaktywnia plik istniejący w katalogu. Z katalogiem dyskowym porównywane są bajty 1..14 FCB wskazywanego przez DE (bajt >s1< jest zerowany automatycznie), przy czym znak zapytania (#3F) na każdej z tych pozycji spełnia relację równości z każdym znakiem katalogu. Znaki zapytania normalnie nie wchodzą w skład nazw w katalogu, a bajty >ex< i >s2< są zerowe.
Jeżeli element katalogu spełnił relację równości w powyższym sensie, odpowiednie dane katalogu są kopiowane do bajtów >d0<..>dn< FCB, umożliwiając tym samym odczyt i zapis pliku. Należy zwrócić uwagę, że istniejący plik nie może być dostępny aż do poprawnie zakończonej operacji otwarcia. Zwracana w rejestrze A wartość #00..#03 oznacza że plik jest otwarty, #FF - plik nie został znaleziony.
Jeżeli w FCB występują znaki zapytania uaktywniany jest pierwszy element katalogu spełniający relację równości. Bajty >cr< i >ex< muszą być wyzerowane jeżeli plik ma być dostępny sekwencyjnie od pierwszego rekordu.

Funkcja 16: CLOSE FILE - Zamknięcie pliku
Rejestr DE zawiera adres FCB uaktywnionego wcześniej przez funkcję otwarcia (15) lub utworzenia pliku (22). Funkcja zawsze zapisuje nowy FCB w odpowiednim katalogu. W przypadku nieznalezienia nazwy w katalogu przekazywana jest w rejestrze A wartość #FF, natomiast wartość #00..#03 odpowiada poprawnie zakończonej operacji. Plik nie wymaga zamknięcia, jeżeli nie była przeprowadzona operacja zapisu. Niezamknięcie spowoduje utratę danych zapisanych jako ostatnie.

Funkcja 17: SEARCH FOR FIRST - Szukanie pierwszego
Poszukuje w katalogu pierwszej pozycji, która jest zgodna z FCB adresowanym przez rejestr DE. W rejestrze A zostanie zwrócona wartość #FF jeżeli plik nie zostanie znaleziony. W przeciwnym wypadku przekazywana jest wartość #00..#03, a do bufora DMA przepisywany jest rekord zawierający znalezioną pozycję (jej adres względny jest równy 32 * A). Znak zapytania na dowolnym bajcie od >f1< do >ex< powoduje spełnienie relacji równości z odpowiednim polem każdej pozycji katalogowej. Jeżeli pole >dr< zawiera znak zapytania przeszukiwany jest katalog napędu domyślnego (niejednoznaczny wybór napędu nie jest możliwy). W tej sytuacji przekazywane są pozycje należące do dowolnego użytkownika (również wolne). Ta ostatnia opcja nie jest zwykle wykorzystywana, zapewnia ona jednak pełną elastyczność badania wszystkich pozycji w katalogu. Jeżeli pole >dr< nie jest zapisane znakiem zapytania pole >s2< jest automatycznie zerowane.

Funkcja 18: SEARCH FOR NEXT - Szukanie następnego
Podobna do funkcji 17, z tym, że katalog jest przeszukiwany od ostatniej znalezionej pozycji katalogu. Nie można przeplatać z innymi funkcjami plikowymi.

Funkcja 19: DELETE FILE - Kasowanie pliku
Usuwa pozycje katalogu zgodne z FCB wskazanym przez rejestr DE. Nazwa i typ mogą zawierać znaki zapytania, ale wybór napędu musi być jednoznaczny. Jeżeli żaden plik nie zostanie znaleziony przekazywana jest w rejestrze A wartość #FF, w przeciwnym razie #00..#03.

Funkcja 20: READ SEQUENTIAL - Czytanie sekwencyjne
Zakładając, że rejestr DE zawiera adres FCB otwartego pliku (funkcje 15 i 22) funkcja powoduje wczytanie kolejnego rekordu pliku (wskazywanego przez bajty >cr< i >ex< ) do bufora DMA, następnie bajt >cr< jest zwiększany o jeden. Jeśli wartość >cr< przekroczy zakres segmentu, automatycznie otwierany jest następny segment, a bajt >cr< zerowany. Jeśli operacja czytania była udana, w rejestrze A przekazywana jest wartość #00, niezerowa oznacza brak danych na następnej pozycji, np. koniec pliku.

Funkcja 21: WRITE SEQUENTIAL - Pisanie sekwencyjne
Zapisuje sekwencyjnie rekord do pliku. Rekord jest zapisywany z bufora DMA na pozycję aktualnego segmentu wskazaną przez bajt >cr< FCB. Zawartość >cr< jest automatyczne zwiększana o 1. Wartość #00 - operacja poprawna, #FF - błąd, np. przepełnienie dysku. W przypadku zapisywania danych o długości będącej wielokrotnością wielkości bloku lub segmentu funkcja może utworzyć pusty blok lub opis pustego segmentu!

Funkcja 22: MAKE FILE - Utworzenie pliku
Tworzy nowy plik i otwiera go (podobnie jak funkcja 15, przy czym dotyczy pliku, który nie jest zapisany w katalogu), wartość 0 oznacza poprawne wykonanie operacji, #FF - przepełnienie katalogu; przed wywołaniem tej funkcji program powinien sprawdzić, czy plik nie istnieje już na dysku (jeśli tak, to należy go skasować funkcją 19).

Funkcja 23: RENAME FILE - Zmiana nazwy pliku
Zmienia nazwę pliku, pole >d< FCB musi zawierać nową nazwę i typ pliku, pierwsza część bloku zawiera poprzednią nazwę i poprzedni typ.

Funkcja 24: RETURN LOGIN VECTOR - Przekazanie wektora zalogowanych napędów
Określenie napędów znanych systemowi. Wartość 1 bitów rejestru HL oznacza dostępność napędu (najmniej znaczący bit opisuje dysk A:).

Funkcja 25: RETURN CURRENT DISK - Przekazanie numeru dysku
Wartością jest numer domyślnego napędu, 0 oznacza A:, 1 - B:, itd.

Funkcja 26: SET DMA ADRESS - Ustawienie adresu DMA
Ustalenie adresu bufora DMA. Argumentem jest nowy adres.

Funkcja 27: GET ADDR(ALLOC) - Pobranie adresu tablicy ALV
Określa adres tzw. wektora alokacji bloków dyskowych (funkcja zarezerwowana dla systemu). Informacja zawarta w wektorze alokacji może być nieważna, jeśli wybrany napęd posiada status R/O. W CP/M Plus tablica ALV nie jest dostępna bezpośrednio (jest w innym banku pamięci)!

Funkcja 28: WRITE PROTECT DISK - Ochrona dysku
Nadaje napędowi domyślnemu status R/O . Każda próba zapisu dysku spowoduje wyświetlenie komunikatu: BDOS Err On X: R/O

Funkcja 29: GET READ/ONLY VECTOR - Pobranie wektora R/O
Podaje numery napędów ze statusem R/O. Wartość ma podobną interpretację jak dla funkcji 24. Po restarcie równa #0000. Status R/O jest ustawiany albo przez funkcję 28, albo przez mechanizm programowy wykrywania wymiany dysku.

Funkcja 30: SET FILE ATRIBUTES - Ustawienie atrybutów pliku
Ustala atrybuty pliku, należy ustalić wartości bitów odpowiednich bajtów FCB. Wskaźniki >f1'<..>f4'< nie są używane na bieżąco, ale mogą być stosowane przez programy użytkowe, ponieważ nie są brane pod uwagę w procesie szukania nazwy podczas operacji otwierania i zamykania pliku. Wskaźniki >f5'<..>f8'< są przewidziane do wykorzystania w kolejnych wersjach systemu.

Funkcja 31: GET ADDR(DISK PARMS) - Pobranie adresu tablicy DPB
Jako rezultat w rejestrze HL przekazywany jest adres tablicy DPB domyślnego napędu. Dane z tej tablicy mogą być użyte do obliczenia pojemności dysku. Normalne programy użytkowe nie powinny stosować tej funkcji.

Funkcja 32: SET/GET USER CODE
Odczytuje lub wybiera obszar użytkownika o podanym numerze. Jeśli #FF, to numer jest odczytywany, w przeciwnym przypadku zawartość rejestru E jest traktowana jako nowy numer użytkownika.

Funkcja 33: READ RANDOM - Odczyt swobodny
Odczytuje wskazany rekord z pliku o dostępie bezpośrednim, numer rekordu należy umieścić na pozycji >r< bloku FCB - bajty te nie ulegają modyfikacji w czasie czytania. Kody przekazywane w rejestrze A mają następującą interpretację: 00 - operacja poprawna, 01 - próba czytania niezapisanego rekordu, 03 - niemożliwe otwarcie określonego segmentu pliku, 04 - próba dostępu do niezapisanego segmentu, 06 - fizyczny koniec dysku.
Kody błędów 01 i 04 występują, jeżeli operacja czytania swobodnego próbuje uzyskać dostęp do rekordu, który nie został uprzednio zapisany, lub do segmentu, który nie został utworzony. Kod błędu 03 normalnie (po wykonaniu właściwej operacji systemowej) nie występuje. Jeżeli wystąpi, może być łatwo usunięty poprzez powtórne przeczytanie lub otwarcie segmentu 0. Kod 06 występuje zawsze, gdy bajt >r2< nie jest zerowy (dla wersji CP/M 2.0). Ogólnie niezerowy kod powrotu może być traktowany jako brakujące dane, natomiast zerowy - prawidłowe zakończenie operacji.

Funkcja 34: WRITE RANDOM - Pisanie swobodne
Zapisuje wskazany rekord na plik o dostępie bezpośrednim. Operacja czytania lub pisania sekwencyjnego wykonana po pisaniu swobodnym będzie dotyczyć ostatnio zapisanego rekordu. Program może w prosty sposób zwiększać numer rekordu w polu >r< po każdym pisaniu, uzyskując w ten sposób efekt pisania sekwencyjnego. W szczególności swobodny odczyt lub zapis ostatniego rekordu segmentu nie powoduje otwarcia kolejnego bloku ani segmentu. Wykonywana jest podobnie jak funkcja 33, dodatkowo: 05 - przepełnienie katalogu.

Funkcja 35: COMPUTE FILE SIZE - Obliczanie wielkości pliku
Wylicza liczbę rekordów danego pliku do pola >r< FCB.

Funkcja 36: SET RANDOM RECORD - Ustalenie numeru rekordu
Określa numer rekordu swobodnego w pliku przetwarzanym sekwencyjnie. Funkcja może być używana na dwa sposoby.
Przy odczycie sekwencyjnym pliku możliwe jest wywoływanie tej funkcji i zapamiętywanie numerów rekordów w tablicy. Po takiej operacji możliwy jest natychmiastowy dostęp do wcześniej określonego miejsca.
Drugi przypadek to przełączenie z przetwarzania sekwencyjnego na dostęp swobodny. Plik jest obsługiwany sekwencyjnie do określonego miejsca, a po wywołaniu tej funkcji kolejne operacje czytania i pisania swobodnego kontynuowane są od następnego rekordu.

Funkcja 37: RESET DRIVE - Zerowanie napędu
Inicjuje napędy określone kolejnymi bitami rejestru DE. Nie ma możliwości zainicjowania niedostępnego napędu. Najmniej znaczący bit oznacza napęd A: . Dla zapewnienia zgodności systemu CP/M z MP/M w rejestrze A jest wartość #00.

Funkcja 38: nie używana

Funkcja 39: nie używana

Funkcja 40: WRITE RANDOM WITH ZERO FILL - Pisanie swobodne z zerowaniem
Działa identycznie jak funkcja 34, a ponadto zeruje każdy nowy blok przed zapisaniem danych.

Budowa FCB.

FCB (File Control Block) jest strukturą używaną przez funkcje BDOS do operacji na plikach. Jej adres podaje się w DE.

0>dr<numer napędu (0..16)
1..8>f<nazwa pliku uzupełniona spacjami, bit 7 - atrybut >f'<
9..11>t<typ pliku, bit 7 - atrybut
12>ex<numer segmentu pliku, należy zainicjować na 0
13..14>s<zarezerwowane dla systemu
15>rc<liczba rekordów (zajętych) w danym segmencie
16..31>d<numery zajętych bloków (16 po 1B albo 8 po 2B) w danym segmencie
32>cr<bieżący numer rekordu czytanego lub pisanego sekwencyjnie, należy zainicjować na 0
33..35>r<numer rekordu odczytywanego z pliku lub zapisywanego do pliku o dostępie bezpośrednim

>dr< w pozycji katalogu na dysku ma inne znaczenie:

bity 7..4=0000opis bloków pliku (FCB)
=0001pozycja zawierająca hasło dostępu
=0010etykieta katalogu, czas, data
=1110skasowany lub nieużywany
bity 3..0numer użytkownika

Procedury BIOS.

BOOT - zimny start systemu. Wyprowadza wizytówkę, inicjuje wszystkie zmienne systemu i ustala dysk A: jako domyślny.

WBOOT - restart systemu. Numer domyślnego napędu jest pobierany spod adresu #0004.

CONST - sprawdza, czy można pobrać znak z CON: informacja zwrotna w rejestrze A: #FF - znak gotowy do wczytania, #00 - żaden znak nie czeka na wczytanie.

CONIN - wczytuje znak z CON: do akumulatora. Jeżeli znak nie jest dostępny powtarza do skutku.

CONOUT - wysyła znak umieszczony w rejestrze C do CON: .

LIST - wysyła znak z rejestru C do LST:  . Jeśli urządzenie nie jest gotowe - czeka na gotowość.

PUNCH - wysyła znak z rejestru C do PUN: Czeka na gotowość.

READER - wczytuje znak z PTP: do akumulatora. Czeka na gotowość.

HOME - ustawia głowicę dysku na ścieżce zerowej.

SELDSK - wybiera napęd określony w rejestrze C (0 = A:, 1 = B:,... 15 = P:) i umieszcza w HL adres tabeli DPH lub #0000, gdy napęd nie jest dostępny (nie jest zdefiniowany w systemie).

SETTRK - wybiera ścieżkę napędu określoną w rejestrze C.

SETSEC - wybiera sektor o numerze w rejestrze C.

SETDMA - ustala adres 128-bajtowego rekordu przeznaczonego do wczytania lub zapisania umieszczony w parze BC.

READ - wczytuje do pamięci sektor (128 bajtów), parametry transmisji muszą być określone przez cztery powyższe procedury stan zakończenia operacji jest określony przez akumulator: #00 - operacja zakończona poprawnie, #01 - wystąpił błąd odczytu.

WRITE - zapis sektora, poza tym analogicznie jak READ.

LISTST - podaje stan urządzenia LPT: w akumulatorze 255 (#FF) - gotowe na przyjęcie znaku, 0 - brak gotowości do przyjęcia znaku (np. zajętość drukarki).

SECTRAN - określa numer sektora fizycznego (zawartość HL) dla zadanego numeru sektora logicznego (zawartość BC) według tablicy XLT (adres XLT umieszczony w DE). Swoje zalety ujawnia prawie wyłącznie przy korzystaniu z dyskietek 8" sformatowanych przez producenta.

Strona zerowa.

Przeznaczenie poszczególnych bajtów jest następujące:

#0000..#0002 Skok do adresu WBOOTE. Skok do adresu #0000 powoduje wykonanie procedury WBOOT. Bajty #0001 i #0002 zawierają adres BIOS+3.
#0003 IOBYTE - przypisania urządzeń.
7, 65, 43, 21, 0
LST:PUN:RDR:CON:
00TTY:TTY:TTY:TTY:
01CRT:PTP:PTR:CRT:
10LPT:UP1:UR1:BAT:
11UL1:UP2:UR2:UC1:
#0004 bity b7..b4 - numer aktualnego użytkownika, bity b3..b0 - numer dysku domyślnego (0 = A:).
#0005..#0007 Skok do modułu BDOS. Wywołanie modułu BDOS następuje poprzez wykonanie rozkazu CALL 5.
#0008..#002F Bajty odpowiadające rozkazom RST #08 do RST #28, nie używane w CP/M 2.2.
#0030..#0037 RST #30 - używany do śledzenia programów przez DDT, DDTZ, MON80.
#0038..#003A RST #38 - wywołanie obsługi przerwań maskowalnych IM 1.
#003B Zarezerwowane dla systemu. Nie wykorzystane.
#003C Prędkość transmisji łącza szeregowego (programy ZMP, IMP)
#003D..#005B Zarezerwowane dla systemu. Nie wykorzystane.
#005C..#007C FCB (File Control Block) zostaje wypełniony pierwszym i drugim parametrem.
#007D..#007F Rozszerzenie tablicy FCB dla plików o dostępie bezpośrednim.
#0080..#00FF Bufor o długości 128 bajtów używany do transmisji dyskowych. Po wprowadzeniu polecenia CCP umieszcza tu parametry. Pierwszy bajt (#0080) zawiera licznik znaków, następny najczęściej spację (#20), dalej kolejno umieszczane są bajty parametrów, a na końcu - znak CR (#0D).

Tablice dyskowe.

Istnieje pięć rodzajów tablic dyskowych. Znajdują się one w module BIOS.

DPH jest najważniejszą tablicą dyskową. Ma ona długość 16 bajtów. (Rozszerzona wersja z systemu CP/M + jest większa i ma inną budowę.) Jej adres (dla danego napędu) zostanie wpisany do HL po wywołaniu procedury BIOS SELDSK. Zawiera ona adresy pozostałych tablic.

+ 02 bajtyadres XLT albo #0000, gdy przeplot nie występuje
+ 26 bajtówzapisywane przez system
+ 82 bajtyadres 128 bajtowego bufora katalogu
+102 bajtyadres DPB
+122 bajtyadres CSV albo #0000, gdy dysk jest niewymienny
+142 bajtyadres ALV

XLT jest tablicą przeplotu sektorów. Ma ona długość równą ilości rekordów na ścieżce. Korzysta z niej procedura BIOS SECTRAN (niektóre implementacje ignorują tą tablicę).

DPB określa sposób korzystania z dysku - jego podstawowe parametry. Modyfikując ją można korzystać z dysków o innych formatach. Długość - 15 bajtów w CP/M 2.2, 27 w CP/M Plus.

CSV (inna nazwa CHK) zawiera sumy kontrolne katalogu. Na jej podstawie system rozpoznaje wymienioną dyskietkę i nadaje napędowi status R/O. Długość jej jest określona w DPB (jeden bajt na cztery pozycje katalogu, lecz nie wszystkie muszą być sprawdzane).

ALV (BMAD) tabela alokacji - określa które bloki są wolne, a które zajęte. Na każdy blok przypada jeden bit. Długość należy zaokrąglić w górę do pełnego bajtu.

Tablice XLT i DPB mają stałą zawartość, CSV i ALV są wypełniane przez system. W CP/M Plus tablice CSV i ALV nie są bezpośrednio dostępne.

Przy zmianie tablicy DPB wiążącej się ze zmianą długości tablic CSV i ALV należy pamiętać o odpowiedniej zmianie adresów w DPH. Nałożenie się tych tablic może spowodować niemożność zapisu (CSV - napęd będzie uzyskiwać status R/O) lub całkowitą utratę danych (ALV - zapisywanie danych na zajęte pozycje).

Ze względów organizacyjnych, zaleca się umieszczenie 15 początkowych bajtów tablicy DPB w polu >d< etykiety dysku (>dr< = #20). Etykieta powinna być pierwszą pozycją w katalogu.

Zawartość DPB.

dziesiętnieszesnastkowonazwaopisdla QED820
Część standardowa DPB:
0#00LSPTilość rekordów na ścieżce (zwykle: 32, 36 lub 40)40
2#02BSHlogarytmiczna wielkość bloku (3:1KB, 4:2KB)4
3#03BLMmaska bloku (rozmiar w rekordach minus 1)15
4#04EXMwielkość segmentu (0:16KB, 1:32KB)0
5#05DSMnumer ostatniego bloku dysku409
7#07DRMnumer ostatniej pozycji katalogu127
9#09AL0wzorzec zajętości dla katalogu (#80:1blok, #C0:2bloki)#C0
10#0AAL1j/w - kolejne 8 bloków (maksymalnie 16 bloków zajętych)0
11#0BCKSilość sprawdzanych rekordów katalogu (0:wcale, 1:4pozycje)1
13#0DOFFilość zarezerwowanych ścieżek (zwykle 0, 1 albo 2)0
Amstradowe rozszerzenie DPB:
15#0FPSHlogarytmiczny rozmiar sektora (1:256B, 2:512B, 3:1KB)3
16#10PHMmaska sektora (rozmiar sektora w rekordach minus 1)7
17#11SDNilość stron dysku (w Amstradach bit 7 określa napęd!)1
18#12TPSliczba ścieżek na stronę (zwykle: 40, 42, 80 albo 82)82
19#13PSPTliczba sektorów fizycznych na ścieżce5
20#14FSNnumer pierwszego sektora na ścieżce#38
21#15PSSrozmiar sektora w bajtach1024
23#17RWGAPdługość przerwy przy zapisie i czytaniu (potrzebne dla 765A)#16
24#18FGAPdługość przerwy Gap3 przy formatowaniu#2A
25#19MFMcztery starsze bity - typ dysku: #0:ramdysk, #2:FM, #6:MFM, #A:HD
cztery młodsze bity - numer jednostki (napędu FD lub partycji HD)
(w Amstradach wyłącznie wartość #60)
#60
26#1AAUTO0 - format ustalany automatycznie, 255 - nie255

© 2001-11-24 Jarek Adamski zxvgs@yarek.com, http://zxvgs.yarek.com