Oxford is Basic
część 1 - część 2
Oxford Pascal nie jest programem najnowszym, ale bardzo popularnym. Niestety posiada pewne wady jak np. brak wbudowanej 'pomocy', czy konieczność numerowania linii programu - choć tylko ze względów czysto pomocniczych. Nie mniej można w nim pracować korzystając z dwóch trybów:
- kompilator znajduje się cały czas w pamięci (uwalnia nas to od żonglowania dyskietkami)
- kompilator jest dogrywany z dysku (nie limituje to długości edytowanego programu)
W pierwszym przypadku sam proces kompilacji jest naprawdę szybki, choć sam program musi zmieścić się w okrojonej pamięci. Natomiast gdy pracujemy w drugim trybie (dyskowym), zyskujemy cenne miejsce kosztem szybkości - ale gra jest warta świeczki :) gdyż możliwość edytowania całego programu jest nam czasami niezbędna.
Tyle tytułem wstępu, pora abyśmy przyjrzeli się temu co oferuje nam Oxford Pascal. Jak już wspomniałem na wstępie, oferuje dwa tryby pracy. Długość programu zależy od trybu i może wahać się nawet od kilkudziesięciu do 6 tysięcy linii kodu! Co to oznacza nie sposób nawet powiedzieć w paru zdaniach - jednym słowem COOL :) Pracując w trybie dyskowym (kompilator jest dogrywany) dostajemy do rąk potężne narzędzie programistyczne, gdyż dzięki dogrywaniu (linkowaniu) możemy kompilować BIBLIOTEKI! Wystarczy umieścić deklarację #nazwa i kompilator dołączy do programu głównego dodatkowe moduły. Możemy tworzyć zbiory "wykonywalne" i wiele innych rzeczy... Mówiąc szczerze to jak dla mnie "starego" c64maniaca - anyway stąd moja xyvka, ten Pascal to 8 cud świata. Wracając jednak do tematu, słowa kluczowe pokrywają się ze standardem w 100% i są wzbogacone o szereg nowych właściwości. Nazwy zmiennych są ograniczone niestety do zaledwie 8 znaków, ale za to rodem z assemblera dostajemy "podkreślanie" czyli c= + @, które zastępuje spacje. Nie ma znaczenia też czy użyjemy dużych lub małych liter, gdyż kompilator ich nie rozróżnia.
W odróżnieniu od standardu, tu musimy numerować linie. Jednak nie ma to znaczenia dla kompilatora - ta numeracja ma nam tylko ułatwić listowanie i poprawianie "odpluskwianie" programu. Pracując pod kontrolą edytora zyskujemy poniższe komendy:
AUTO numer-_linii
Uruchamia lub zatrzymuje automatyczną numerację wpisywanych linii programu.
LIST lub LIST numer_linii
Znaczenie oraz użycie, analogicznie jak dla interpretera Basica. Wciśnięcie dowolnego klawisza wstrzyma proces listowania do momentu wciśnięcia kolejnego.
UPPER i LOWER
Odpowiednio "podnosi" i "opuszcza" jak klawisz shift podczas pisania, wysokość wszystkich znaków na ekranie.
BASIC
Opuszczenie programu i powrót do Basica.
NEW
Kasuje program z pamięci edytora.
DISK
Uruchamia tryb dyskowy.
RESIDENT
Powoduje przejście do trybu pierwszego - czyli załadowanie do pamięci KOMPILATORA.
NUMBER pierwsza_linia , ostatnia_linia , skok
Przenumerowuje linie programu.
FIND "słowo" lub FIND "słowo" , pierwsza_linia - ostatnia_linia
Znajduje i wyświetla poszukiwany łańcuch znaków w treści programu.
CHANGE "stare_słowo / nowe_słowo" , numer_linii (NIEPRZETESTOWANE!)
Zastąpi pierwszy ciąg znaków drugim (działa podobnie do find), parametr numeru jest opcjonalny.
DELETE lub DELETE pierwsza_linia - ostatnia_linia
Kasuje linie programu z pamięci, w pierwszym przypadku działa jak NEW.
PUT:nazwa
Zapisuje na dysku aktualnie edytowany program (Uwaga po komendzie jak i po dwukropku nie może być spacji!).
GET:nazwa
Wczytuje z dysku do pamięci program o podanej nazwie (stary zostanie skasowany).
RUN lub R
Tylko podczas pracy w pierwszym trybie! Kompiluje do pamięci i uruchamia aktualnie wpisany lub wgrany program. Nie może on zawierać błędów, gdyż proces kompilacji zostanie wstrzymany stosownym komunikatem o błędzie.
L
Podobnie jak R, tylko z tą różnicą że program nie zostanie uruchomiony a jedynie wystowany podczas kompilacji na ekran.
P
J/w lecz z wydrukiem na drukarce.
COMP parametr
Tylko tryb dyskowy. Spowoduje kompilacje programu zapisanego wcześniej na dysku. Jako pierwszy wkładamy dysk z kompilatorem! Parametr może przybrać postać:
1 - wyświetlenie treści programu i błędów na ekranie
p - j/w lecz na drukarce
n - kompilacja bez tworzenia zbioru wynikowego (z końcówką .OBJ)
c - kompilacja z optymalizacją kodu wynikowego
EX nazwa
Tylko tryb dyskowy. Powoduje wczytanie i uruchomienie zbioru z końcówką .OBJ (czyli po kompilacji). Jako pierwszy wkładamy dysk systemowy.
HEX liczba_dziesiętna
Poda jej odpowiednik w systemie szesnastkowym (słowo).
DECIMAL liczba_szesnastkowa
Poda jej odpowiednik w systemie dziesiętnym (nie stawiamy $ przed liczbą!)
DUMP
Wydruk treści programu na drukarce.
COLD
Zimny start komputera.
LINK:nazwa1,nazwa2...
Złącza ze sobą programy już skompilowane (te z końcówką .OBJ). Użyte zmienne muszą być globalne oraz zakłada się, że pierwszy program jest docelowym.
Dołączanie programu do kompilacji w treści programu, uzyskamy za pomocą komendy #nazwa Co oznacza, że w momencie napotkania tej instrukcji kompilator dogra potrzebne dane i skompiluje je jako całość.
LOCATE:wynik=nazwa_programu
Spowoduje utworzenie programu wykonywalnego z programu skompilowanego (z końcówką .OBJ). Nazwa - oznacza program w Pascalu, a wynik - nazwę dla programu wykonywalnego.
CHAIN nazwa_programu
Spowoduje wstrzymanie wykonywania programu i załadowanie oraz uruchomienie podanego programu.
Dodatkowo pracując w trybie bezpośrednim (edycyjnym) możemy wspierać się następującymi instrukcjami języka Basic: PRINT, OPEN, CLOSE, CMD, POKE, PEEK, SYS, FOR TO STEP, LET, LOAD, FRE 0 oraz zmienne zegara TI i TI$.
W Oxford Pascalu dodano kilka dodatkowych usprawnień (rozszerzeń) i tak: dopuszcza się deklaracje liczb 16-wych poprzedzając je znakiem $ (dolara) np. CONST LICZBA:=$FCE2
Oraz funkcje:
PEEK (X:INTEGER) :0..255 analogicznie do PEEK czyli D:=PEEK(1024)
POKE (X:INTEGER ; Y:0..255) analogicznie do POKE np. POKE ($2E00,$4C)
VDU (X,Y:INTEGER ; C:CHAR) wyświetli w zadanych współrzędnych x/y (dla ekranu tekstowego) znaku np. VDU (5,12,'A')
GETKEY:CHAR czyta klawiaturę, np. GETKEY=CHR (0) czeka na wciśnięcie dowolnego klawisza.
PAGE czyści ekran
RESTORE (TRUE) lub RESTORE (FALSE) / (NIEPRZETESTOWANE!)
Powoduje odpowiednio włączenie i wyłączenie klawisza RESTORE.
RENDOM:0..255 / (NIEPRZETESTOWANE!)
Spowoduje wygenerowanie liczby pseudolosowej z zakresu 0..255
SETTIME (GG,MM,SS)
Ustawia wewnętrzny zegar na dany czas (zmienna TI$).
INSTRUKCJE MUZYCZNE
ENVEL V,A,D,S,R
Ustawia dane dla obwiedni danego kanału SID, gdzie:
V - numer kanału 1-3
A - narastanie 0-15
D - zanikanie 0-15
S - wybrzmienie 0-15
R - opadanie 0-15
VOICE V,F,W,D
Odgrywa dźwięk zadeklarowany wcześniej przez ENVEL, gdzie:
V - numer kanału 1-3
F - częstotliwość 0-65535 (bazowe f=0.059604645 razy wartość)
W - typ obwiedni 0-3 (trójkąt, piła, prostokąt, szum)
D - czas trwania 0-65535
VOLUME (x)
Wzmocnienie dźwięku 0-15.
INSTRUKCJE GRAFICZNE W TRYBIE TEKSTOWYM
BORDER (c)
Ustala kolor ramki.
SCREEN (c)
Ustala kolor ekranu.
PEN (c)
Ustala kolor dla tekstu.
INSTRUKCJE GRAFICZNE W TRYBIE GRAFICZNYM
PAPER (c)
Ustala kolor tła.
INK (c)
Ustala kolor rysowania.
HIRES 1 lub HIRES 0
Włącza lub wyłącza tryb grafiki wysokiej rozdzielczości.
P:=EXAMINE (X,Y)
Testuje czy punkt jest zapalony P=1, czy zgaszony P=0.
PLOT (TRYB,X,Y,X1,Y1)
Stawia punkt (kreśli linię) o zadanych współrzędnych w zadanym trybie i tak:
0 - to tryb kasowania
1 - skasowanie ekranu graficznego
2 - rysowana jest linia
3 - kasowana jest linia
4 - wypełniany jest obszar wokół punktu
5 - kasowany jest obszar wokół punktu
WINDOW (numer_linii)
Dzieli ekran na tryb graficzny i tekstowy od zadanej wysokości (25 to cały ekran).
KILL
W trybie edytora jest równoważna instrukcji HIRES 0 w programie.
Uwaga: wszystkie wymienione wartości są liczbami stałymi. Odpowiednio X 0..255 i Y 0..200 oraz C 0..15.
MANIPULACJA BITAMI
Zaimplementowano znane z innych języków instrukcje logiczne, działające na 16-bitowych słowach ANDB, ORB, XORB, NOTB. Dodatkowo otrzymujemy przesunięcia logiczne:
SHL (X,Y)
Przesunięcie bitów X o Y pozycji w lewo np. SHL (4,4) = 40
SHR (X,Y)
J/w lecz w prawo. Podanie SHL (X,-Y) jest równoznaczne z instrukcją SHR (X,Y).
Tomasz 'TSD' Dzierkowski
maniac64@poczta.onet.pl
PS. Artykuł powstał na podstawie recenzji z magazynu BAJTEK z roku 1989. Użyte sformułowanie NIE PRZETESTOWANE, oznacza iż miałem pewne problemy z daną instrukcją w trakcie pisania tego opisu.
|