Zawartość:
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.
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).
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.
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):
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.
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:
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ć:
LD | C,>kod_funkcji< | |
LD | DE,>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 | ||
TPA | CCP 2kB | |||||
#A600 | #CC00 | #DC00 | #E400 | #E600 | ||
TPA maksimum 59.25kB | ||||||
#0100 | #0100 | #0100 | #0100 | #0100 | ||
ZERO PAGE 0.25kB | ||||||
#0000 | #0000 | #0000 | #0000 | #0000 |
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 |
---|---|---|---|---|---|---|
bajt | mx | nc | c1 | c2 | .. | 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.
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 | =0000 | opis bloków pliku (FCB) |
=0001 | pozycja zawierająca hasło dostępu | |
=0010 | etykieta katalogu, czas, data | |
=1110 | skasowany lub nieużywany | |
bity 3..0 | numer użytkownika |
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.
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ń.
| |||||||||||||||||||||||||||||
#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). |
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.
+ 0 | 2 bajty | adres XLT albo #0000, gdy przeplot nie występuje |
+ 2 | 6 bajtów | zapisywane przez system |
+ 8 | 2 bajty | adres 128 bajtowego bufora katalogu |
+10 | 2 bajty | adres DPB |
+12 | 2 bajty | adres CSV albo #0000, gdy dysk jest niewymienny |
+14 | 2 bajty | adres 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.
dziesiętnie | szesnastkowo | nazwa | opis | dla QED820 |
---|---|---|---|---|
Część standardowa DPB: | ||||
0 | #00 | LSPT | ilość rekordów na ścieżce (zwykle: 32, 36 lub 40) | 40 |
2 | #02 | BSH | logarytmiczna wielkość bloku (3:1KB, 4:2KB) | 4 |
3 | #03 | BLM | maska bloku (rozmiar w rekordach minus 1) | 15 |
4 | #04 | EXM | wielkość segmentu (0:16KB, 1:32KB) | 0 |
5 | #05 | DSM | numer ostatniego bloku dysku | 409 |
7 | #07 | DRM | numer ostatniej pozycji katalogu | 127 |
9 | #09 | AL0 | wzorzec zajętości dla katalogu (#80:1blok, #C0:2bloki) | #C0 |
10 | #0A | AL1 | j/w - kolejne 8 bloków (maksymalnie 16 bloków zajętych) | 0 |
11 | #0B | CKS | ilość sprawdzanych rekordów katalogu (0:wcale, 1:4pozycje) | 1 |
13 | #0D | OFF | ilość zarezerwowanych ścieżek (zwykle 0, 1 albo 2) | 0 |
Amstradowe rozszerzenie DPB: | ||||
15 | #0F | PSH | logarytmiczny rozmiar sektora (1:256B, 2:512B, 3:1KB) | 3 |
16 | #10 | PHM | maska sektora (rozmiar sektora w rekordach minus 1) | 7 |
17 | #11 | SDN | ilość stron dysku (w Amstradach bit 7 określa napęd!) | 1 |
18 | #12 | TPS | liczba ścieżek na stronę (zwykle: 40, 42, 80 albo 82) | 82 |
19 | #13 | PSPT | liczba sektorów fizycznych na ścieżce | 5 |
20 | #14 | FSN | numer pierwszego sektora na ścieżce | #38 |
21 | #15 | PSS | rozmiar sektora w bajtach | 1024 |
23 | #17 | RWGAP | długość przerwy przy zapisie i czytaniu (potrzebne dla 765A) | #16 |
24 | #18 | FGAP | długość przerwy Gap3 przy formatowaniu | #2A |
25 | #19 | MFM | cztery 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 | #1A | AUTO | 0 - format ustalany automatycznie, 255 - nie | 255 |