CROOK-5 - Opis użytkowy programu DEBU
Program DEBU służy przede wszystkim do uruchamiania i testowania programów kodowanych w języku symbolicznym. Dodatkowo umożliwia dokonywanie operacji czytania i zapisu do dowolnego zbioru, a użytkownikom posiadającym uprawnienia 001 do dowolnego obszaru na dysku. Program standardowo czyta zlecenia z końcówki i natychmiast je wykonuje. Zleceniem INT można przełączyć strumień czytania zleceń na dowolne inne urządzenie lub zbiór dyskowy. Ponadto ciąg zleceń programu DEBU można wczytać do jego pamięci operacyjnej (zlecenie PRG); powstały tą drogą pseudoprogram można wydrukować na końcówce (LIS), zachować jego treść w zbiorze dyskowym (SAV), poprawiać (EDI) oraz uruchomić (EXE). Pierwotnie wszystkie komunikaty i wydruki wyprowadzane są na końcówkę. Grupa zleceń opisana w II.4.1. umożliwia rejestrację tych tekstów w zbiorze dyskowym z ewentualnym wstrzymaniem ich wyprowadzania na końcówkę. Program będący w stanie oczekiwania na zlecenie może znajdować się w trzech kontekstach sygnalizowanych znakiem zachęty wyprowadzanym przez program na końcówkę :
- # - stan nieokreślony;
- $ - obsługa procesu uruchomionego zleceniem NEW;
- + - obsługa zbioru lub obszaru przyłączonego zleceniem FIL lub FIP.
Do zmiany kontekstu służą zlecenia NEW, FIL, FIP, OLD.
Zlecenia dotyczące strumieni wyjściowych
OUT [,<tytuł zbioru rejestracji>]
- Zlecenie określa zbiór wyjściowy dla rejestracji przebiegu sesji. Od chwili wykonania zlecenia do zbioru tego wyprowadzane będą wszystkie wiersze wczytywane z końcówki oraz wyprowadzane na końcówkę.
NOC
- Zlecenie zawiesza kopiowanie wierszy do zbioru rejestracji, nie domykając tego zbioru.
NOM
- Zlecenie zawiesza wyprowadzanie wierszy na końcówkę.
MON
- Zlecenie przywraca wyprowadzanie wierszy na końcówkę.
CPE [,<tytuł zbioru rejestracji>]
- Zlecenie działa jak OUT lecz wskażnik pisania do zbioru ustawia na koniec istniejącego zbioru o dostępie sekwencyjnym.
CLS
- Zlecenie powoduje zakończenie kopiowania wierszy do zbioru rejestracji i domknięcie tego zbioru.
EXI
- Domknięcie zbioru rejestracji i zakończenie pracy programu - przejście do interpretacji zleceń OSL.
Zlecenia dotyczące operacji na słownikach
Przy uruchamianiu programów wygodne jest posługiwanie się nazwami (zmiennymi) zamiast adresów i liczb. Program DEBU umożliwia utworzenie takiego słownika jak również wprowadzenie słownika wyprodukowanego przez translator ASSM podczas tłumaczenia programu.
- <nazwa zmiennej>=<wyrażenie>
Nadanie wartości zmiennej o podanej nazwie i umieszczenie jej w słowniku. Nazwa zmiennej może się składać z co najwyżej sześciu znaków, z których pierwszy musi być literą, a następne literami lub cyframi. Program przy pierwszym uruchomieniu wstępnie definiuje kilka zmiennych, których wartości interpretowane są następująco:
- IC - rejestr IC procesu - adres następnego rozkazu,
- R0, R1, R2, R3, R4, R5, R6, R7 - zawartość rejestrów uniwersalnych procesu,
- LEN - maksymalna liczba elementów w wierszu dla zleceń wyprowadzania zwartości pamięci lub zbioru,
- LIN - liczba wierszy wyproadzanych na końcówkę w jednym cyklu
- BAS - adres dyskowy (względem pocz. zbioru) sektora bazowego,
- ERR - numer ostatniego błędu,
- ADR - zmienna używana w zleceniach FNU i FCH.
Zmiennym tym można nadawać wartości, używać ich w wyrażeniach, lecz nie da się ich usunąć zleceniem DEL.
Składnikami wyrażenia arytmetycznego mogą być liczby ósemkowe,dziesiętne, szestnastkowe (poprzedzone znakiem #). Dopuszczalne jest używanie składników o postaci: !<znak><znak>, !!<znak>, !<znak>! oraz $<znak><znak><znak>. Ich interpretacja, jak również interpretacja skalowania jest taka sama jak w języku symbolicznym ASSM. Po obliczeniu wartości wyrażeń brane są ich wartości modulo 65536 (tzn. 16 najmłodszych bitów).
W wyrażeniach mogą być użyte następujące działania:
- dodawanie [+]
- odejmowanie [-]
- mnożenie [*]
- dzielenie [:]
- skalownaie [/]
- modyfikacja (adresowanie pośrednie) [']
Przy obliczaniu wartości wyrażeń najpierw wykonane zostaną działania modyfikacji, potem skalowania, następnie mnożenia i dzielenia, a na końcu dodawania i odejmowania. Działania równorzędne wykonywane będą od lewej do prawej strony. Modyfikacja polega na tym, że składnik poprzedzający bezpośrednio znak apostrofu zostaje potraktowany jako adres i do obliczania wartości wyrażenia program używa zawartości komórki o tym adresie. Działanie modyfikacji jest możliwe tylko wtedy, gdy istnieje odpowiedni obszar obsługiwany przez program (tzn. wykonane było jedno ze zleceń: NEW, FIL lub FIP). Kolejność wykonywania działań można zmienić za pomocą nawiasów.
Przykłady nadania nowej wartości zmiennym:
A=10+R1-R2:2+1/7+MAPA*3+ADRES' DELTA=A+B+C-D+IC*2
- <nazwa wektora>(<wyrażenie określające indeks>)=<wyrażenie>
Nadanie wartości elementowi wektora. Nazwy zmienych i wektorów są zbiorami rozłącznymi. Wymiar wektora jest w zasadzie dowolny, ograniczony jedynie rozmiarem dostępnej pamięci operacyjnej. Pierwszy element wektora ma indeks 1. Zastosowanie wektorów jest sensowne wyłącznie w pseudoprogramach DEBU.
DIS [,<pocz. nazwy zmiennej> lub <liczba dzies. lub ósemk.>]
- Zlecenie powoduje wyprowadzenie na końcówkę nazw i wartości wszystkich zmiennych o wskazanym początku, lub nazw i wartości wszystkich zmiennych, których wartość jest równa podanej liczbie. Zlecenie bez argumentu powoduje wyprowadzenie na końcówkę zawartości całego słownika.
CC,<wyrażenie>
- Obliczenie i wyprowadzenie na końcówkę wartości wyrażenia (patrz zlecenie CC języka OSL).
FLA,<tytuł zbioru etykiet>[,<nazwa1>[,<nazwa2>...]]
- Zlecenie powoduje wczytanie z podanego zbioru słownika nazw wyprodukowanego przez translator ASSM (lub jego fragmentów) i dopisanie go do słownika DEBU. Słownik taki zawiera nazwy zmiennych programu w języku ASSM i odpowiadających im wartości, z tym, że znaki @,#,%, występujące w nazwach, są zamieniane odpowiednio na R,H,P. Użycie dalszych argumentów poza tytułem zbioru pozwala na wczytanie fragmentów słownika według par nazw. W takim przypadku przy wprowadzaniu słownika ignorowane są wszystkie nazwy aż do <nazwa1> (wyłącznie), następnie wprowadzone wszystkie nazwy aż do <nazwa2> włącznie, następne ignorowane, itd.
DIL
- Zlecenie powoduje wyprowadzenie na końcówkę zawartości słownika w czterech kolumnach.
DEL
- Zlecenie powoduje usunięcie słownika.
Zlecenia dotyczące procesu
NEW,<tytuł programu> [,<parametry>]
- Zlecenie usuwa (o ile istnieje) poprzednio uruchomiony przez DEBU proces i pod kontrolą DEBU uruchamia proces o podanej nazwie od jego adresu startowego, przesyłając ewentualne parametry. Proces natychmiast po uruchomieniu zostaje zatrzymany na adresie startowym (przed wykonaniem jakiegokolwiek rozkazu). Po wstawieniu ewentualnych punktów kontrolnych (TR lub TRC), można wznowić jego pracę zleceniem RS. Od chwili wykonania tego zlecenia program DEBU znajduje się w kontekście "obsługa procesu ($)".
RUN [<lista parametrów>]
- Wstęppnie wykonywane są czynności zlecenia CL (patrz niżej), a następnie, o ile występują jakieś parametry, następuje ich interpretacja (tak jak w OSL'u) i przekazanie do uruchamianego procesu.
RS [,[<wyrażenie>]]... (max. 8 wyrażeń)
- Uruchomienie procesu od adresu określonego wartością pierwszego wyrażenia. Wartości dalszych wyrażeń umieszczone zostaną kolejno w R1 do R7. Pusty parametr na liście powoduje pozostawienie bez zmian poprzedniej zawartości odpowiedniego rejestru.
IC,<wyrażenie> [,<wyrażenie>]...
- Pierwsze wyrażenie musi wystąpić. Wartość tego wyrażenia zostanie umieszczona w rejestrze IC procesu. Kolejne wyrażenia, o ile wystąpią, zostaną umieszczone w kolejnych rejestrach od R1 począwszy.
LR,<wyrażenie> [,<wyrażenie>]...
- Wartość pierwszego wyrażenia jest numerem rejestru uniwersalnego, od którego począwszy mają być umieszczone w kolejnych rejestrach wartości następnych wyrażeń.
SP
- Zatrzymanie procesu.
DE
- Usunięcie procesu.
CL
- Zlecenie powoduje umieszczenie w rejestrze IC adresu startowego, i wyzerowanie pozostałych rejestrów.
DR
- Zlecenie wyprowadzenia na końcówkę wartości IC, R0 oraz pozostałych rejestrów procesu.
TR [,<wyrażenie>]
- Zlecenie usuwa jednokrotny punkt kontrolny, i jeśli podano argument, to umieszcza jednokrotny punkt kontrolny pod adresem wskazanym wartością wyrażenia.
TRC [,<wyrażenie>[;<wyrażenie>]]...
- Wartość pierwszego wyrażenia jest adresem pod którym ma zostać umieszczony trwały punkt kontrolny, wartość drugiego wyrażenia jest liczbą pominięć tego punktu kontrolnego. Jeśli drugiego wyrażenia nie podano, to w punkcie tym proces będzie zatrzymywany każdorazowo. Następne pary wyrażeń definiują dalsze trwałe punkty kontrolne.
CLT [,<wyrażenie>]...
- Jeśli nie podano argumentów, to usunięte zostaną wszystkie trwałe punkty kontrolne, jeśli podano, to zostaną usunięte trwałe punkty kontrolne spod adresów pamięci wskazanych wartościami argumentów.
DIT
- Zlecenie powoduje wyprowadzenie zawartości słownika punktów kontrolnych stałych:
- <adres> <licznik> <zawartość komórki>
OLD
- Jeśli program DEBU znajduje się w kontekście "obsługa zbioru", to zlecenie to spowoduje powrót do kontekstu "obsługa procesu", o ile jest on możliwy.
Zlecenia przyłączania zbiorów
Z wielu powodów istnieje potrzeba oglądania zawartości zbiorów (lub obszarów) w innej postaci niż robią to programy LIST lub COPY, a także istnieje potrzeba dokonywania zmian w zbiorach nieczytelnych dla istniejących edytorów. Ponieważ program DEBU zlecenia czytania i zapisu z zasady wykonuje na pamięci obsługiwanego procesu, to dla uniknięcia pomyłek zlecenia FIL oraz FIP powodują wyrażną zmianę kontekstu (znaku zachęty). Oczywiście w tym kontekście wszelkie zlecenia sterujące procesem nie mają sensu.
FIL [,<tytuł zbioru> [,<liczba>]]
- Zlecenie przyłącza zbiór o podanej nazwie i przechodzi w kontekst "obsługa zbioru". Jeśli nie podano argumentu, to zachodzi tylko zmiana kontekstu. Podanie drugiego argumentu (-1, -2, ..., -6) umożliwia przyłączenie zbioru specjalnego.
FIP [,<tytuł zbioru specjalnego>]
- Działa jak FIL, lecz dla zbiorów będących obrazem pamięci procesu o podanej nazwie. (Zlecenie działa jak FIL,<TZ>,-1).
UWAGA: Po wykonaniu jednego ze zleceń : NEW, FIL, FIP, adres 0 oznacza pierwsze słowo w pamięci procesu lub pierwsze słowo w pierwszym sektorze przyłączonego zbioru (obszaru). Do zmiany tego stanu rzeczy służy poniżej opisane zlecenie :
BAS [,<wyrażenie>[,<wyrażenie>]]
- Wartość pierwszego wyrażenia określa numer sektora bazowego, wartość drugiego wyrażenia określa adres przyporządkowany temu sektorowi. Pominięcie obu argumentów powoduje wyprowadzenie na końcówkę numeru aktualnego sektora bazowego oraz adresu przyporządkowanego temu sektorowi.
Wyprowadzanie zawartości pamięci lub zbioru
Zlecenia te mają następującą składnię:
- <nazwa zlecenia> [,<wyrażenie>[,<wyrażenie>]]
Pierwsze wyrażenie oznacza adres, od którego ma się rozpocząć wyprowadzanie zawartości, drugie adres końca (lub, jeśli jego wartość jest mniejsza od wartości pierwszego wyrażenia - liczbę słów do wyprowadzenia). Pominięcie drugiego wyrażenia powoduje wyprowadzenie ośmiu słów. Jeśli pominięto oba argumenty, to adres początku zostanie wyliczony następująco:
- <adres> = 0 dla IC < 2,
- <adres> = IC-2 dla IC >= 2.
PO
- Wyprowadzanie ósemkowe.
PD
- Wyprowadzanie dziesiętne.
PH
- Wyprowadzanie szestnastkowe.
PF
- Wyprowadzanie liczb zmiennopozycyjnych według formatu ustalonego zleceniem FPF.
FPF <liczba cyfr przed kropką>[.<liczba cyfr po kropce>][E]
- Ustalenie formatu drukowania liczb zmiennopozycyjnych.
PC
- Wyprowadzanie znakowe.
PB
- Wyprowadzanie byte'ami.
PCN
- Wyprowadzanie w kodzie R40.
PM
- Wyprowadzanie w postaci rozkazów języka ASSM.
PG
- Wyprowadzanie według programu zapisanego zleceniem PRO (patrz niżej). Wartość drugiego argumentu określa liczbę powtórzeń (liczbę wykonania programu zapisanego zleceniem PRO).
PRO [,<liczba>,<nazwa zlecenia wyprowadzania>]...<kwant>
- Zlecenie umieszcza w pamięci program wyprowadzania (musi się zawierać w jednym wierszu). Przy wykonywaniu zlecenia PG realizowany jest następujący algorytm:
- Do adresu początku wyprowadzania dodawana jest <liczba> (może być ujemna), a następnie wykonywane jest zlecenie o podanej nazwie dla jednego elementu. Proces ten jest powtarzany aż do wyczerpania listy par <liczba>,<nazwa zlecenia wyprowadzania>. Następnie liczba <kwant> jest dodawana do adresu początku wyprowadzania, a wynik dodawania stanje się nowym adresem początku wyprowadzania.
- Pominięcie argumentów spowoduje wyprowadzenie programu wyprowadzania na końcówkę.
NAM {ON lub OFF}
- Opisane powyżej zlecenia opatrują standardowo (stan NAM OFF) wyprowadzaną informację adresami w postaci liczb ósemkowych. Po wykonaniu zlecenia NAM ON, program przed wyprowadzeniem adresu, szuka w słowniku nazwy odpowiadającej temu adresowi, i jeśli znajdzie, pisze ją zamiast liczby.
Zlecenia znajdowania adresu ciągu elementów
FNU ,<wyrażenie>,<wyrażenie> [,<wyrażenie>]...
- Wartość pierwszego wyrażenia wskazuje adres, od którego rozpocznie się szukanie wskazanego ciągu wartości. Jeśli taki ciąg istnieje, to adres jego początku zostanie nadany zmiennej ADR, i jednocześnie wyprowadzony na końcówkę.
FCH ,<wyrażenie> [,<wyrażenie>]...
- Działa podobnie jak FNU, lecz szuka ciągu bajtów. (np.: FCH,0,10,!!F,!!I,!!L,!!E,!!*,!!A,!!B,!!C,!!.,13 będzie szukać w obsługiwanym obszarze wiersza rozpoczynającego się znakiem LF (kod 10), zawierającego ciąg znaków FILE*ABC., i zakończonego znakiem CR (kod 13)).
Zlecenia zapisu do zbioru lub pamięci procesu
ST ,<adres> [,<wyrażenie>]...
- Zlecenie powoduje umieszczenie wartości kolejnych wyrażeń w obsługiwanym obszarze od podanego adresu.
RES [,<adres>[,<liczba komórek>[,<argument>]]]
- Inicjalizacja określonej liczby komórek (wartością <argument>) od podanego adresu począwszy. Pominięcie parametrów spowoduje przyjęcie kolejno wartości IC,1,0.
Zlecenia specjalne (dla pseudoprogramów)
IF ,<wyrażenie><relacja><wyrażenie>,<zlecenie programu DEBU>
- Podane zlecenie zostanie wykonane przy spełnionej <relacji>. Relacją jest jeden ze znaków '<', '=' lub '>', których znaczenie jest naturalne.
IFN ,<wyrażenie><relacja><wyrażenie>,<zlecenie DEBU>
- (IF NOT) Podane zlecenie zostanie wykonane przy nie spełnionej <relacji>.
GO ,<nazwa etykiety>
- Skok do etykiety. Etykietą jest każda nazwa zakończona dwukropkiem, występująca na początku wiersza. Po wykonaniu tego zlecenia pseudoprogram jest wykonywany od miejsca pierwszego wystąpienia wskazanej etykiety.
FOR ,<nazwa zmiennej>=<wyr.>,TO,<wyr.> [,STEP,<wyr.>]
- Inicjacaja bloku pętli. Ciąg zleceń zawarty między zleceniami FOR i NEX będzie wykonany wskazaną liczbę razy od wartości zmiennej równej pierwszemu wyrażeniu do wartości równej drugiemu wyrażeniu z przyrostem równym trzeciemu wyrażeniu. Pętle mogą byż zagnieżdżone na dowolną głębokość.
NEX
- Koniec bloku pętli.
GOS ,<nazwa etykiety>
- Odpowiednik znanej instrukcji GO SUB - skok ze śladem (do podprogramu).
RET
- Odpowiednik instrukcji RETURN - powrót według śladu (z podprogramu).
PRT,<tekst>
- Zlecenie powoduje wyprowadzenie tekstu na końcówkę.
WAI [,<wyrażenie>]
- Program DEBU zawiesza działanie na czas wskazany wartością wyrażenia (w sekundach).
END
- DEBU kończy wykonywanie pseudoprogramu zleceń.
TM
- Wyprowadzenie na końcówkę aktualnego czasu.
AND,<nazwa zmiennej>,<wyrażenie>
- Zmiennej zostanie nadana wartość iloczynu logicznego (bit po bicie) aktualnej wartości zmiennej i wartości wyrażenia.
OR,<nazwa zmiennej>,<wyrażenie>
- Zmiennej zostanie nadana wartość sumy logicznej aktualnej wartości zmiennej i wartości wyrażenia.
ORN,<nazwa zmiennej>,<wyrażenie>
- Zmiennej zostanie nadana wartość iloczynu logicznego aktualnej wartości zmiennej i zanegowanej (logicznie) wartości wyrażenia.
Uruchamianie pseudoprogramów w języku zleceń
INT ,<TZ procedury (pseudoprogramu)> [,<wyrażenie>]...
- Zlecenie przywiązania strumienia wejściowego interpretatora pseudoprogramów DEBU do zbioru o podanej nazwie. Wartości wyrażeń są nadawane zmiennym R1 do R7.Możliwe jest zagnieżdżanie procedur.
PRG [,<tytuł zbioru>]
- Wczytanie do pamięci pseudoprogramu zleceń z końcówki lub z podanego zbioru.
LIS
- Wyprowadzanie wczytanego pseudoprogramu zleceń.
EDI
- Uruchomienie wewnętrznego edytora pseudoprogramu zleceń. Edytor ten rozpoznaje następującą grupę zleceń programu EDIT : FL, FS, AB, AE, RS, DE, RE.
EXE [,<wyrażenie>]... (max. 7 wyrażeń)
- Uruchomienie wczytanego pseudoprogramu zleceń od początku. Wartości wyrażeń nadane zostaną zmiennym R1 do R7.
REX [,<wyrażenie>]... (max. 7 wyrażeń)
- Wznowienie wykonywania pseudoproramu od miejsca jego zatrzymania, z ewentualnym nadaniem nowych wartości zmiennym R1...R7.
Źródło: SYSTEM OPERACYJNY CROOK-5 dla minikomputera MERA-400 (wersja 7), Zbigniew Czerniak, Marek Nikodemski, Gdańsk 1988