MAD-PASCAL 1.6.3
Tebe/Madteam (2020-01-04)
WPROWADZENIE
Mad-Pascal (MP) jest 32-bitowym kompilatorem Turbo Pascala dla Atari XE/XL. W założeniu jest kompatybilny z Free Pascal Compilatorem (FPC) (przełącznik -MDelphi powinien być aktywny), co oznacza możliwość otrzymanie kodu uruchomieniowego dla XE/XL, PC i każdej innej platformy dla której istnieje FPC. MP nie jest portem FPC, został napisany na podstawie kompilatorów SUB-Pascal (2009), XD-Pascal (2010), których autorem jest Vasiliy Tereshkov (vtereshkov@mail.ru).
Program który zadziała na Atari może mieć problem na PC jeśli np. nie zaincjowaliśmy wskaźników adresem zmiennej, będziemy próbowali zapisywać coś pod adresem $0000 (błąd ochrony pamięci). Mocną stroną MP jest szybka i wygodna możliwość dołączania wstawek assemblerowych. Program z wstawkami ASM nie będzie działał na innej platformie niż XE/XL. MP wykorzystuje 64KB pamięci podstawowej, korzystanie z pamięci rozszerzonej udostępnia TMemoryStream.
Alokacja zmiennych jest statyczna, nie ma dynamicznego zarządzania pamięcią. Parametry przekazywane do funkcji i procedur są przez wartość, zmienną lub stałą.Dostępne są:
Aby skompilować źródło Mad-Pascala, można użyć kompilatora z Delphi, jeśli ktoś ma akurat zainstalowane środowisko Delphi 7.0 lub nowsze.
Innym sposobem, bardziej multi platformowym jest użycie kompilatora z pakietu Free Pascal Compiler (FPC), który można pobrać ze strony http://www.freepascal.org/
Uruchamiamy instalator, wybieramy katalog w którym zostanie zainstalowany FP. Ważne jest aby nie używać w nazwie katalogu znaku wykrzyknika '!' czy innych nie standardowych znaków. Jeśli nie uda nam się skompilować żadnego pliku, najpewniej winna jest nie standardowa nazwa ścieżki. Linia komend uruchamiająca kompilację może wyglądać następująco (wielkość liter w nazwach parametrów ma znaczenie):fpc -Mdelphi -v -O3 mp.dpr
SPOSÓB UŻYCIA
Syntax: mp source [switches] -d:address tryb diagnostyczny -define:symbol definiowanie symbolu -ipath:<x> dodatkowa ścieżka poszukiwań -code:$address adres uruchomienia programu -data:$address adres pamięci dla zmiennych, tablic -stack:$address adres pamięci dla stosu programowego (64 bajty) -zpage:$address adres na stronie zerowej dla zmiennych (24 bajty)
Domyślnym rozszerzeniem pliku wynikowego jest *.A65, plik taki assemblujemy z użyciem Mad-Assemblera (dodatkowo ustawiamy ścieżkę poszukiwań na -i:base), np.:
mads source.a65 -x -i:basePrzełącznik -x (Exclude unreferenced procedures) pozwoli wygenerować najkrótszy kod wynikowy dla 6502.
3 = bad parameters, compiling not started 2 = error occured 0 = no errorsKomunikaty ostrzeżenia nie powodują zmiany wartości kodu wyjścia.
SKŁADNIA
W MP do oznaczenia komentarza jednoliniowego służą znaki '//', dla wieloliniowego klamry { }, lub (* *).
// to jest komentarz inc(a); // to jest komentarz (* komentarz *) (* komentarz *) { to jest komentarz }
absolute and array asm begin case const div do downto else end file for function if implementation interface main mod not of or procedure program record repeat shl shr stack string then to type unit until uses var while xorZarezerwowane stałe:
pi true false
WYRAŻENIA
Expression-100 -2437325 1743
$100 $e430 $000001
%0001001010 %000000001 %001000
'a' 'fds' 'W' #65#32#65 #$9b
+ Addition - Subtraction * Multiplication / Division DIV Integer division MOD RemainderLogical operators
NOT Bitwise negation (unary) AND Bitwise and OR Bitwise or XOR Bitwise xor SHL Bitwise shift to the left SHR Bitwise shift to the rightBoolean operators
NOT logical negation (unary) AND logical and OR logical or XOR logical xorRelational operators
= Equal <> Not equal < Less than > Greater than <= Less than or equal >= Greater than or equal
DYREKTYWY KOMPILATORA
Compiler directivesZapis dyrektyw kompilatora ma postać:
{$define test} const {$ifdef test} a=1; {$else} a=2; {$endif}Z poziomu assemblera dostęp do zdefiniowanych etykiet $DEFINE możliwy jest przez MAIN.@DEFINES.label
{$f $70} // fastmul at $7000
Alternatywne procedury szybkiego mnożenia dla typu BYTE, SHORTINT, WORD, SMALLINT, SHORTREAL. Procedury zajmują 2KB i są umieszczane od adresu PAGE*256.
{i+} IOCHECK ON default {i-} IOCHECK OFF
Dla {$i+} w przypadku wystąpienia błędów transmisji I/O (RESET, REWRITE, BLOCKREAD, BLOCKWRITE, CLOSE) wykonywany program zostaje zatrzymany, generowany jest komunikat błędu 'ERROR xxx'. Wyłączenie IOCHECK {$i-} przydaje się gdy chcemy sprawdzić istnienie pliku na dysku, np.:
function FileExists(name: TString): Boolean; var f: file; begin {$I-} // io check off Assign (f, name); Reset (f); Result:=(IoResult<128) and (length(name)>0); Close (f); {$I+} // io check end;W blokach PROCEDURE, FUNCTION dyrektywa IOCHECK jest zasięgu lokalnego, po zakończeniu kompilacji takiego bloku przywracana jest wartość IOCHECK która została określona poza takim blokiem.
Dyrektywa dołączenia tekstu z aktualną datą kompilacji.
Dyrektywa dołączenia tekstu z aktualnym czasem kompilacji.
Dyrektywa dołączenia tekstu zawartego w pliku.
Dyrektywa pozwalająca wskazać dodatkowe ścieżki poszukiwań dla bibliotek (unit).
RCDATA | dowolny typ danych |
RCASM | plik w assemlerze, który zostanie dołączony i zasemblowany |
DOSFILE | plik z nagłówkiem Atari DOS, adres ładowania takiego pliku powiniem być identyczny jak RCLABEL |
RELOC | plik relokowalny w formacie MadAssemblera, plik zostanie poddany relokacji pod wskazany adres RCLABEL |
RMT | plik modułu Raster Music Tracker-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL |
MPT | plik modułu Music ProTracker-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL |
CMC | plik modułu Chaos Music Composer-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL |
RMTPLAY | player dla modułu RMT, jako RCFILE podajemy plik *.FEAT oraz dodatkowo PAR0 tryb playera 0..3
0 => compile RMTplayer for 4 tracks mono 1 => compile RMTplayer for 8 tracks stereo 2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 |
MPTPLAY | player dla modułu MPT |
CMCPLAY | player dla modułu CMC |
XBMP | plik Windows Bitmap (8 BitsPerPixel) ładowany do pamięci VBXE pod wskazany adres RCLABEL od indeksu koloru PAR0 w palecie kolorów VBXE nr 1 |
Przykład: bmp1 RCDATA 'pic.mic' msx MPT 'porazka.mpt' play RMTPLAY 'modul.feat' 1 bmp XBMP 'pic.bmp' 80
CONSTANTS
Ordinary constantsDo deklaracji stałych CONST służy znak '='. Dopuszczalne jest użycie operatorów +, -, *, /, not, and, or, div, mod, ord, chr, sizeof, pi
Const e = 2.7182818; { Real type constant } f : single = 3.14; { Single type constant } a = 2; { Ordinal BYTE type constant } c = '4'; { Character type constant } s = 'atari'; { String type constant } sc = chr(32); ls = SizeOf(cardinal); x: word = 5; { wymuszenie typu stałej }
TYPES
Type | Range | Size in bytes |
BYTE | 0 .. 255 | 1 |
SHORTINT | -128 .. 127 | 1 |
WORD | 0 .. 65535 | 2 |
SMALLINT | -32768 .. 32767 | 2 |
CARDINAL | 0 .. 4294967295 | 4 |
LONGWORD | 0 .. 4294967295 | 4 |
DWORD | 0 .. 4294967295 | 4 |
UINT32 | 0 .. 4294967295 | 4 |
INTEGER | -2147483648 .. 2147483647 | 4 |
LONGINT | -2147483648 .. 2147483647 | 4 |
Name | Size | Ord(True) |
BOOLEAN | 1 | 1 |
Typ wyliczeniowy w MP został zaimplementowany w podstawowej postaci, tzn.:
Type Days = (monday,tuesday,wednesday,thursday,friday, saturday,sunday); Joy = (right_down = 5, right_up, right, left_down = 9, left_up, left, down = 13, up, none);
Typ wyliczeniowy przechowywany jest tylko w pamięci kompilatora MP, do pliku wynikowego nie zostaną zapisane jakiekolwiek informacje dotyczące pól typu wyliczeniowego. Dopuszczalne jest użycie komendy ORD, SIZEOF oraz rzutowania dla typu wyliczeniowego.
var d: Days; d:=friday; writeln(ord(d)); writeln(ord(sunday)); writeln(sizeof(days)); writeln(sizeof(monday)); d:=days(20); case d of sunday: writeln('sunday'); end;
Aktualnie kompilator MP nie sprawdzi poprawności typów wyliczeniowych dla operacji IF ELSE.
Type | Range | Size in bytes |
SHORTREAL (Q8.8) | -128..127 | 2 |
REAL (Q24.8) | -8388607..8388608 | 4 |
SINGLE (IEEE-754) | 1.5E-45 .. 3.4E38 | 4 |
FLOAT (IEEE-754) | 1.5E-45 .. 3.4E38 | 4 |
Type | Range | Size in bytes |
CHAR | ATASCII (0 .. 255) | 1 |
STRING | 1 .. 255 | 256 |
PCHAR | 0 .. 65535 | 2 |
Ciąg znaków STRING reprezentowany jest jako tablica o możliwym maksymalnym rozmiarze [0..255]. Pierwszym bajtem takiej tablicy [0] jest długość ciągu z zakresu 0..255. Od bajtu [1..] zaczyna się właściwy ciąg znaków.
Ciąg znaków PCHAR reprezentowany jest przez wskaźnik do typu CHAR. Znakiem końca ciągu PCHAR jest znak #0.
Dopuszczalne jest użycie dodatkowych znaków po końcowym apostrofie, takich jak '*', '~'. Znak '*' oznacza ciąg w inwersie, tylda '~' ciąg w kodach ANTIC-a.
Innym sposobem modyfikacji wyprowadzanych znaków jest użycie systemowej zmiennej TextAttr, każdy znak wyprowadzany na ekran jest zwiększany o wartość TextAttr (domyślnie = 0).
a: string = 'Atari'*; // ciąg znaków w inwersie b: string = 'Spectrum'~; // ciąg znaków w kodach ANTIC-a c: char = 'X'~*; // znak w inwersie, kodach ANTIC-a
Type | Range | Size in bytes |
POINTER | 0 .. 65535 | 2 |
Wskaźniki w MP mogą być typowane i bez określonego typu, np.:
a: ^word; // wskaźnik typowany na słowo b: pointer; // wskaźnik bez typu
Niezaincjowany wskaźnik najczęściej będzie miał adres $0000, należy zadbać aby przed jego wykorzystaniem zaincjować go adresem odpowiedniej zmiennej, np.:
a := @tmp; // wskaźnikowi A zostaje przypisany adres zmiennej TMP
Jeśli tego nie zrobimy to w przypadku uruchomienia takiego programu na PC spowodujemy błąd ochrony pamięci 'Access Violation'.
Zwiększanie wskaźnika przez INC zwiększy go o rozmiar typu na jaki wskazuje. Zmniejszenie wskaźnika przez DEC zmniejszy go o rozmiar typu na jaki wskazuje. Jeśli typ jest nieokreślony, wówczas domyślną wartością zwiększania/zmniejszanie będzie 1.Tablice w MP są tylko statyczne, jednowymiarowe lub dwuwymiarowe z początkowym indeksem =0, np.:
var tb: array [0..100] of word; var tb2: array [0..15, 0..31] of Boolean;
W przypadku początkowego indeksu innego niż zero zostanie wygenerowany błąd 'Error: Array lower bound is not zero'.
W pamięci tablica reprezentowana jest przez wskaźnik (POINTER), wskaźnik jest adresem tablicy w pamięci (WORD). Najszybszą metodą odwołania się do tablicy z poziomu assemblera jest zastosowanie przedrostka 'ADR.', np.:asm { lda adr.tb,y ; bezpośrednie odwołanie do tablicy TB lda tb ; odwołanie do wskaźnika tablicy TB };
Kompilator generuje kod dla tablic zależnie od ich deklaracji:
array [0..255] of byte array [0..127] of word array [0..63] of cardinal |
Gdy liczba bajtów zajmowanych przez tablicę nie przekracza 256 bajtów generowany jest najszybszy kod odwołujący się bezpośrednio do adresu tablicy (przedrostek ADR.) z pominięciem wskaźnika. Dla takiej tablicy nie ma możliwości zmiany adresu.
ldy #118 lda adr.tb,y |
array [0..0] of type | Gdy liczba elementów tablicy wynosi '1' jest ona traktowana specjalnie. Generowany kod odwołuje się do tablicy poprzez wzkaźnik. Istnieje możliwość ustalenia nowego adresu takiej tablicy.
lda TB add I tay lda TB+1 adc #$00 sta bp+1 lda (bp),y |
array [0..255+1] of byte array [0..127+1] of word array [0..63+1] of cardinal |
Gdy liczba bajtów zajmowanych przez tablicę przekracza 256 bajtów generowany kod odwołuje się do tablicy poprzez wskaźnik. Istnieje możliwość ustalenia nowego adresu takiej tablicy.
lda TB add I tay lda TB+1 adc #$00 sta bp+1 lda (bp),y |
W pamięci rekord reprezentowany jest przez wskaźnik (POINTER).
type
TPoint = record x,y: byte end;
var px: TPoint;
Domyślnie rekordy w MP są typu PACKED.
Jeśli zależy nam na zachowania kompatybilności z FPC należy dodatkowo poprzedzić słowo 'record' słowem 'packed'.
Bez tego rozmiar pamięci jaki zajmuje rekord będzie mógł się różnić, bęzie mniej zajmował pamięci na Atari XE/XL, potencjalnie więcej o kilka bajtów na PC.
type TPoint = packed record x,y: byte end; var px: TPoint;Dostęp do pól rekordu z poziomu asm:
mwa px bp2 ldy #px.x-DATAORIGIN lda (bp2),y
Obiekty to rekordy z dodatkowymi metodami. W pamięci obiekt reprezentowany jest przez wskaźnik (POINTER).
type
TRMT = Object
player: pointer;
modul: pointer;
procedure Init(a: byte); assembler;
procedure Play; assembler;
procedure Stop; assembler;
end;
Typ FILE reprezentuje uchwyt do pliku oraz definiuje rozmiar rekordu.
type ftype = array [0..63] of cardinal; var f: file; // rekord domyślny =128 bajtów f: file of byte; // rekord 1 bajt f: file of ftype; // rekord 256 bajtów (ftype = 64 * 4)W pamięci XE/XL uchwyt FILE reprezentowany jest przez wskaźnik (POINTER) do tablicy o strukturze (rozmiar 12 bajtów):
.struct s@file pfname .word ; pointer to string with filename record .word ; record size chanel .byte ; channel *$10 eof .byte ; EOF status buffer .word ; load/write buffer nrecord .word ; number of records for load/write numread .word ; pointer to variable, length of loaded data .ends
Do procedur, funkcji typ FILE może być przekazywany tylko jako zmienna (VAR).
INSTRUKCJE WARUNKOWE
Obecnie Mad Pascal akceptuje dla zmiennej CASE typy tylko o długości 1 bajta: SHORTINT, BYTE, CHAR, BOOLEAN
case a of // dla zmiennej A typu CHAR 'A'..'Z': begin end; '0'..'9': begin end; '+','*': begin end; end;
Instrukcje warunkowe IF mogą być zagnieżdżane. Wykorzystywane jest to przy budowie bardziej złożonych warunków.
INSTRUKCJE ITERACYJNE
FOR zmienna := { wartość początkowa } TO { wartość końcowa } DO { instrukcje do wykonania } FOR zmienna := { wartość końcowa } DOWNTO { wartość początkowa } DO { instrukcje do wykonania }Instrukcja ta służy do organizacji obliczeń, które będą wykonywane z góry określoną liczbę razy. Zmienna sterująca musi być identyfikatorem typu porządkowego, a oba wyrażenia powinny być zgodne w sensie przypisania z typem zmiennej sterującej. W czasie realizacji pętli TO zmiennej sterującej przypisywana jest następna wartość w danym typie, w pętli DOWNTO poprzednia. Zabroniona jest "ręczna" zmiana wartości zmiennej sterującej. W przypadku takiej próby MP nie zasygnalizuje błędu.
Kompilator dba o to aby nie wystąpiła pętla bez końca, dlatego można bez obaw stosować taką pętlę:
for i:=0 to 255 do writeln(i); // dla zmiennej I typu BYTE
while { warunek } do { instrukcja do wykonania }Konstrukcja ta służy do organizacji obliczeń, które będą wykonywane tak długo jak wyrażenie znajdujące się po słowie WHILE jest prawdą. Tak skonstruowana pętla może nie zostać wykonana ani razu.
while BlitterBusy do; // oczekiwanie na zakończenie działania blittera VBXEOgraniczenia dla instrukcji WHILE:
while i<=255 do inc(i); // pętla bez końca gdy zmienna I typu BYTE
repeat { instrukcje do wykonania } until { warunek zakończenia }Instrukcja ta wykonuje cyklicznie inne instrukcje zawarte pomiędzy słowami REPEAT i UNTIL do momentu gdy wyrażenie znajdujące się za słowem UNTIL nie przyjmie wartości PRAWDA (czyli TRUE).
Efekt zastosowania pętli REPEAT jest bardzo podobny do działania pętli WHILE. Pętla ta także może być wykonywana ogromną liczbę razy. Jedyna różnica polega na tym, że w pętli REPEAT warunek zakończenia sprawdzany jest dopiero po wykonaniu instrukcji. Oznacza to, że pętla REPEAT zawsze będzie wykonana co najmniej raz. Dopiero po tej iteracji program sprawdzi, czy można zakończyć działanie pętli. W przypadku pętli WHILE warunek jest sprawdzany bezpośrednio przed jej wykonaniem, co w rezultacie może spowodować, że taka pętla nigdy niezostanie wykonana.
i:=0; repeat inc(i); until i=0; // pętla wykona się 256 razy
PROCEDURY I FUNKCJE
MP pozwala na przekazanie do procedury maksymalnie 8 parametrów. Są dostępne trzy sposoby przekazywania parametrów - przez wartość, stałą (CONST) i zmienną (VAR). Możliwe jest użycie modyfikatora OVERLOAD w celu przeciążenia procedur.
Dostępne modyfikatory procedur: OVERLOAD, ASSEMBLER, FORWARD, REGISTER, INTERRUPT.Możliwa jest rekurencja procedur, pod warunkiem że parametry procedury będą przekazywane przez wartość, będą typu prostego - porządkowego. Typ rekordowy, wskaźnikowy nie będzie właściwie alokowany w pamięci.
MP pozwala na przekazanie do funkcji maksymalnie 8 parametrów. Są dostępne trzy sposoby przekazywania parametrów - przez wartość, stałą (CONST) i zmienną (VAR). Wynik funkcji zwracamy przypisując go do nazwy funkcji lub korzystając z automatycznie deklarowanej zmiennej RESULT, np.:
function add(a,b: word): cardinal; begin Result := a+b; end; function mul(a,b: word): cardinal; begin mul := a*b; end;Dostępne modyfikatory funkcji: OVERLOAD, ASSEMBLER, FORWARD, REGISTER, INTERRUPT (nie zalecane dla funkcji).
Możliwa jest rekurencja funkcji, pod warunkiem że parametry funkcji będą przekazywane przez wartość, będą typu prostego - porządkowego. Typ rekordowy, wskaźnikowy nie będzie właściwie alokowany w pamięci.
MODYFIKATORY PROCEDUR I FUNKCJI
procedure color(a: byte); assembler; asm { mva a 712 }; end;
procedure suma(var i: integer; a,b: integer); overload; begin i := a+b; end; procedure suma(var i: integer; a,b,c: integer); overload; begin i := a+b+c; end; function fsuma(a,b: word): cardinal; assembler; overload; asm { adw a b result }; end; function fsuma(a,b: real): real; overload; begin Result := a+b; end;
procedure nazwa [(lista-parametrów-formalnych)]; forward; ... ... ... procedure nazwa; begin end;
procedure nazwa (a,b,c: cardinal); register; // a = edx // b = ecx // c = eax
procedure dli; interrupt; asm { pha lda #$c8 sta wsync sta $d01a pla }; end; // rozkaz RTI zostanie wstawiony automatycznie
UNITS
Unitsunit test; interface type TUInt24 = record byte0: byte; byte1: byte; byte2: byte; end; const LoRes = 1; MedRes = 2; HiRes = 3; procedure Print(a: string); implementation uses test2; procedure Print(a: string); begin writeln(a); end; end.
BIBLIOTEKA PODSTAWOWA
W katalogu 'LIB' Mad-Pascala znajdują się potrzebne do kompilacji podstawowe moduły (unit), takie jak SYSTEM, CRT, GRAPH, SYSUTILS, MATH, DOS. W programie wybierane są przez instrukcję USES, np.:uses crt, sysutils;Moduł SYSTEM jest domyślnie dopisywany do listy USES i kompilowany jako pierwszy.
[ Constants ]
M_PI_2 = 6.283285; // pi * 2 D_PI_2 = 1.570796; // pi / 2 D_PI_180 = 0.017453; // pi / 180 mGTIA = 0; mVBXE = $80; WINDOW = $10; NARROW = $20; VBXE_XDLADR = $0000; // XDLIST VBXE_MAPADR = $1000; // COLOR MAP ADDRESS VBXE_BCBADR = $0100; // BLITTER LIST ADDRESS VBXE_OVRADR = $5000; // OVERLAY ADDRESS VBXE_WINDOW = $B000; // 4K WINDOW $B000..$BFFF iDLI = 0; iVBL = 1; CH_DELCHR = $FE; CH_ENTER = $9B; CH_ESC = $1B; CH_CURS_UP = 28; CH_CURS_DOWN = 29; CH_CURS_LEFT = 30; CH_CURS_RIGHT = 31; CH_TAB = $7F; CH_EOL = $9B; CH_CLR = $7D; CH_BEL = $FD; CH_DEL = $7E; CH_DELLINE = $9C; CH_INSLINE = $9D; COLOR_BLACK = $00; COLOR_WHITE = $0e; COLOR_RED = $32; COLOR_CYAN = $96; COLOR_VIOLET = $68; COLOR_GREEN = $c4; COLOR_BLUE = $74; COLOR_YELLOW = $ee; COLOR_ORANGE = $4a; COLOR_BROWN = $e4; COLOR_LIGHTRED = $3c; COLOR_GRAY1 = $04; COLOR_GRAY2 = $06; COLOR_GRAY3 = $0a; COLOR_LIGHTGREEN = $cc; COLOR_LIGHTBLUE = $7c;
[ Types ]
TPoint |
TPoint = record x,y: SmallInt end;;
Definicja współrzędnych (x,y). |
TRect |
TRect = record left, top, right, bottom: smallint end;
Definicja położenia i rozmiaru czworokąta o parametrach (left, top) - lewy górny narożnik, (right, bottom) - prawy dolny narożnik. |
TString |
TString = string[32];
Definicja krótkiego ciągu znakowego wykorzystywanego do przekazywania nazw plików itp. |
[ Variables ]
IOResult |
IOResult: byte;
Kod błędu (>127) dla ostatnio przeprowadzonej operacji I/O. |
ScreenWidth |
ScreenWidth: word = 40;
Zmienna przechowująca aktualną szerokość ekranu. Domyślnie jest to wartość 40 dla ekranu edytora. |
ScreenHeight |
ScreenHeight: word = 24;
Zmienna przechowująća aktualną wysokość ekranu. Domyślnie jest to wartość 24 dla ekranu edytora. |
[ Procedures and functions ]
Abs |
function Abs(x: real): real; function Abs(x: integer): integer; Funkcja obliczająca wartość bezwzględną podanej liczby (ang. Absolute value). Wartość bezwzględna liczby nieujemnej to ta sama liczba, a liczby ujemnej - liczba do niej przeciwna. Funkcja w przypadku podania jej argumentu całkowitego zwraca wynik również typu całkowitego. |
ArcTan |
function ArcTan(x: real): real;
Funkcja ArcTan (arcus tangens) zwraca wartość kąta, którego tangens wynosi x. |
Assign |
procedure Assign(var F:File; FileName:string)
Procedura przypisuje zmiennej plikowej F plik o nazwie FileName. Aby móc odwoływać się do jakiegoś pliku, zawsze należy najpierw użyć procedury Assign. Przy dalszych operacjach pliki są identyfikowane przy pomocy zmiennej plikowej, a nie nazwy. |
BinStr |
function BinStr(Value: cardinal; Digits: byte): TString;
Funkcja BinStr zwraca ciąg znakowy z reprezentacją binarną wartości Value. Digits określa długość ciągu, który maksymalnie może liczyć 32 znaki. |
Concat |
function Concat(a,b: string): string; assembler function Concat(a: string; b: char): string; assembler; function Concat(a: char; b: string): string; assembler; function Concat(a,b: char): string; Funkcja łączy dwa ciągi tekstowe w nowy ciąg znakowy. |
Blockread Blockwrite |
procedure BlockRead(var f: file; var Buf; Count: word; var Result: word); procedure BlockWrite(var f: file; var Buf; Count: word; var Result: word); Procedura BlockRead wczytuje z pliku plik do zmiennej Buf nie więcej niż Count bajtów i umieszcza w zmiennej Result ilość rzeczywiście przeczytanych bajtów (która może być mniejsza od oczekiwanej np. ze względu na rzeczywistą długość pliku). Procedura BlockWrite działa tak samo, tylko zapisuje do pliku. |
Chr |
function Chr(X: Byte): Char;
Funkcja zwraca znak (Char) o odpowiadającym kodzie ATASCII podanym w parametrze. Chr(65); // Zwraca znak A Chr(90); // Zwraca znak Z Chr(32); // Zwraca znak spacjiZamiennie z funkcją Chr, chcąc uzyskać odpowiedni znak możemy użyć jego kodu ATASCII poprzedzając go # Writeln(#65); // Znak A Writeln(#65#32#65); // Napisze 'A Z' |
Cos |
function Cos(x: real): real;
Cosinus kąta (x w radianach). |
Close |
procedure Close(var f: file);
Procedura służąca do zamykania otwartego pliku dowolnego typu. Każdy plik otwarty przy pomocy Reset lub Rewrite powinno się zamknąć przy pomocy Close. |
Dec |
procedure Dec(var X [, N: int]);
Procedura zmniejsza wartość parametru X o 1 lub wartość parametru N. Wartość parametru X może być typu CHAR, BYTE, WORD, CARDINAL. Procedura DEC generuje optymalny kod, jest zalecana do używania w pętlach, zamiast operatora odejmowania (-).dec(tmp); dec(tmp[2]); |
DeleteFile |
function DeleteFile(FileName: string): Boolean;
Funkcja pozwala skasować plik z dysku o nazwie FileName, zwraca TRUE kiedy operacja powiodła się, FALSE w przypadku wystąpienia błędu (najczęściej z powodu zabezpieczenia przed zapisem lub błędnej nazwy pliku). |
DPeek |
function DPeek(a: word): word;
Funkcja zwraca słowo spod adresu A. |
DPoke |
procedure DPoke(a: word; value: word);
Procedura zapisuje słowo Value pod adresem A. |
Eof |
function Eof(var f: file): Boolean;
Funkcja zwraca wartość logiczną True jeśli osiągnięty został koniec pliku. |
Exit | Wywołanie procedury Exit powoduje natychmiastowe opuszczenie bloku programu, w którym to wywołanie nastąpiło. Można jej użyć do opuszczenia pętli, wyjścia z procedury/funkcji lub programu głównego. |
Exp |
function Exp(x: real): real;
Funkcja podnosząca liczbę e (=2.71) do potęgi podanej przez argument. |
FilePos |
function FilePos(var f: file): cardinal;
Funkcja zwraca aktualną pozycję pliku. Plik nie może być tekstowy i musi być otwarty (np. poleceniem Reset). Bity 0..15 zwróconej wartości to numer sektora dysku, bity 16..23 pozycja w sektorze [0..255]. Jest to odpowiednik instrukcji NOTE. |
FileSize |
function FileSize(var f: file): cardinal;
Funkcja zwraca długość pliku w bajtach (Sparta DOS X). Plik nie może być tekstowy i musi być otwarty (np. poleceniem Reset). |
FillChar |
procedure FillChar(a: pointer; count: word; value: char);
Procedura wypełnia bufor określony w parametrze X identycznymi znakami lub bajtami. Parametr Value musi określać dane, natomiast Count - ilość danych jakie zostaną przypisane do bufora. var Buffer : array[0..100] of Char; begin FillChar(Buffer, SizeOf(Buffer), 'A'); end. |
Frac |
function Frac(x: real): real;
Zwraca część ułamkową liczby x w postaci rzeczywistej. |
GetIntVec |
procedure GetIntVec(intno: Byte; var vector: pointer);
Procedura odczytuje adres wektora przerwań wg. kodu INTNO. Obecnie dopuszczalnymi kodami są:
|
Halt |
procedure halt;
Wywołanie powoduje natychmiastowe wyjście z programu. Można (opcjonalnie) podać kod błędu, w przypadku MP jest on ignorowany. |
Hi |
function Hi(x): byte
Funkcja zwracająca starszy bajt parametru X. |
HexStr |
function HexStr(Value: cardinal; Digits: byte): TString;
Funkcja HexStr zwraca ciąg znakowy z reprezentacją heksadecymalną wartości Value. Digits określa długość ciągu, który maksymalnie może liczyć 32 znaki. |
Inc |
procedure Inc(var X [, N: int]);
Procedura zwiększa wartość parametru X o 1 lub wartość parametru N. Wartość parametru X może być typu CHAR, BYTE, WORD, CARDINAL. Procedura INC generuje optymalny kod, jest zalecana do używania w pętlach, zamiast operatora dodawania (+).inc(tmp); inc(tmp[2]); |
Int |
function Int(x: real): real;
Funkcja zwraca część całkowitą argumentu będącego liczbą rzeczywistą. |
IOResult |
var IOResult: byte;
Zmienna IOResult przechowuje ostatni błąd operacji I/O. Kody błędów I/O |
Ln |
function Ln(x: real): real;
Funkcja licząca logarytm naturalny (o podstawie e) z podanej liczby. Argument funkcji musi być dodatni! |
Lo |
function Lo(x): byte;
Funkcja zwracająca młodszy bajt parametru X. |
LowerCase |
function LowerCase(a: char): char;
Funkcja zmieniająca znaki 'A'..'Z' na odpowiednie małe znaki 'a'..'z' |
Move | procedure Move(source, dest: pointer; count: word);
Procedura służy do kopiowania danych ze źródła (parametr Source) do bufora oznaczonego jako przeznaczenie (parametr Dest). Ilość kopiowanych danych określa parametr Count. |
OctStr |
function OctStr(Value: cardinal; Digits: byte): TString;
Funkcja OctStr zwraca ciąg znakowy z reprezentacją ósemkową wartości Value. Digits określa długość ciągu, który maksymalnie może liczyć 32 znaki. |
Odd |
function Odd(x: cardinal): Boolean; function Odd(x: integer): Boolean; Funkcja Odd zwraca wartość True jeżeli liczba określona w parametrze X jest nieparzysta, False jeżeli jest parzysta. |
Ord |
function Ord(X);
Funkcja ta działa odwrotnie do Chr. Z podanego znaku jako parametr zwraca nam jego kod w ATASCII. Ord('A'); // Zwraca 65 Ord('Z'); // Zwraca 90 Ord(' '); // Zwraca 32 |
ParamCount |
function ParamCount: byte;
Funkcja ParamCount zwraca ilość dostępnych argumentów (Sparta Dos X, BWDos), tzn. maksymalny indeks dla procedury ParamStr. ParamCount określa ilość parametrów przekazanych do programu z linii poleceń. |
ParamStr |
function ParamStr(Index: byte): TString;
Funkcja ParamStr zwraca parametry programu (Sparta Dos X, BWDos). Index to numer parametru, czyli ciągu znaków oddzielonego spacją. Jeżeli uruchomimy program TEST.EXE w taki sposób:
|
Pause |
procedure Pause; procedure Pause(n: word); Zatrzymuje działanie programu na N * 1.50 sek |
Peek |
function Peek(a: word): byte;
Funkcja zwraca bajt spod adresu A. |
Point |
function Point(AX, AY: smallint): TPoint;
Na podstawie parametrów AX oraz AY tworzony jest rekord typu TPoint. |
PointsEqual |
function PointsEqual(const P1, P2: TPoint): Boolean;
Funkcja sprawdza czy wartości współrzędnych określone w parametrach P1 oraz P2 są sobie równe. W takim wypadku funkcja zwraca wartość True. |
Poke |
procedure Poke(a: word; value: byte);
Procedura zapisuje bajt Value pod adresem A. |
Pi | Zwraca wartość liczby pi. |
Pred |
function Pred(X: TOrdinal): TOrdinal;
Poprzednik elementu X. |
Random |
function Random: Real; assembler;
Funkcja zwraca losową wartość z przedziału <0 .. 1> function Random(range: byte): byte; assembler;Funkcja zwraca losową wartość z przedziału <0 .. range-1>, w przypadku Range=0 zwraca wartość losową z przedziału <0 .. 255 > function Random(range: smallint): smallint;Funkcja zwraca losową wartość z przedziału <0 .. range-1> |
ReadConfig |
function ReadConfig(devnum: byte): cardinal;
Odczyt statusu stacji DEVNUM. Wynikiem są cztery bajty DVSTAT ($02EA..$02ED).
Byte 0 ($02ea): Bit 0:Indicates the last command frame had an error. Bit 1:Checksum, indicates that there was a checksum error in the last command or data frame Bit 2:Indicates that the last operation by the drive was in error. Bit 3:Indicates a write protected diskette. 1=Write protect Bit 4:Indicates the drive motor is on. 1=motor on Bit 5:A one indicates MFM format (double density) Bit 6:Not used Bit 7:Indicates Density and a Half if 1 Byte 1 ($02eb): Bit 0:FDC Busy should always be a 1 Bit 1:FDC Data Request should always be 1 Bit 2:FDC Lost data should always be 1 Bit 3:FDC CRC error, a 0 indicates the last sector read had a CRC error Bit 4:FDC Record not found, a 0 indicates last sector not found Bit 5:FDC record type, a 0 indicates deleted data mark Bit 6:FDC write protect, indicates write protected disk Bit 7:FDC door is open, 0 indicates door is open Byte 2 ($2ec): Timeout value for doing a format. Byte 3 ($2ed): not used, should be zero |
ReadSector |
procedure ReadSector(devnum: byte; sector: word; var buf);
Odczyt sektora SECTOR dyskietki w stacji dysków DEVNUM i zapisanie go w buforze BUF. |
Rect |
function Rect(ALeft, ATop, ARight, ABottom: smallint): TRect;
Na podstawie parametrów tworzony jest rekord typu TRect. |
RenameFile |
function RenameFile(OldName, NewName: string): Boolean;
Funkcja pozwala zmienić nazwę pliku OldName na nową nazwę NewName, zwraca TRUE kiedy operacja powiodła się, FALSE w przypadku wystąpienia błędu (najczęściej z powodu zabezpieczenia przed zapisem lub błędnej nazwy pliku). RenameFile('D:OLDNAME.TMP', 'NEWNAME.TMP'); |
Reset |
procedure Reset(var f: file; l: Word);
Otwiera istniejący plik z nazwą przekazaną do F poleceniem Assign. Opcjonalnie możemy podać rozmiar rekordu w bajtach L, domyślnie jest to wartość 128. |
Rewrite |
procedure Rewrite(var f: file; l: Word);
Tworzy i otwiera nowy plik. F jest nazwą przekazaną za pomocą polecenia Assign. Opcjonalnie możemy podać rozmiar rekordu w bajtach L, domyślnie jest to wartość 128. |
Round |
function Round(x: real): integer;
Funkcja Round dokonuje zaokrąglenia podanej liczby rzeczywistej do najbliższej liczby całkowitej. |
Seek |
procedure Seek(var f: file; N: cardinal);
Ustawia pozycję w pliku na N. N powinno być wartością zwróconą przez FilePos. Jest to odpowiednik instrukcji POINT. |
SetLength |
procedure SetLength(var S: string; Len: byte);
Ustawia długość ciągu S na LEN. |
SetIntVec |
procedure SetIntVec(intno: Byte; vector: pointer);
Procedura ustawia adres wektora przerwań wg. kodu INTNO. Obecnie dopuszczalnymi kodami są:
|
Sin |
function Sin(x: real): real;
Sinus kąta (x w radianach). |
Succ |
function Succ(X: TOrdinal): TOrdinal;
Następnik elementu X. |
Space |
function Space(Len: Byte): ^char;
Funkcja generuje nowy ciąg znakowy o długości LEN wypełniony znakami spacji. |
SizeOf |
function SizeOf(X: AnyType): byte;
Funkcja zwraca rozmiar podanej zmiennej (lub typu) w bajtach. |
Str |
procedure Str(var X: TNumericType; var S: string);
Instrukcja zamienia liczbę X na łańcuch znaków S. |
StringOfChar |
procedure StringOfChar(ch: Char; len: byte): ^char;
Funkcja generuje nowy ciąg znakowy o długości LEN wypełniony znakami CH. |
Sqr |
function Sqr(x: real): real; function Sqr(x: integer): integer; Funkcja obliczająca kwadrat podanej liczby (ang. Square). |
Sqrt |
function Sqrt(x: real): real; function Sqrt(x: single): single; function Sqrt(x: integer): single; Funkcja obliczająca pierwiastek kwadratowy podanej liczby (ang. Square root). |
Trunc |
function Trunc(x: real): integer;
Funkcja zwraca część całkowitą liczby rzeczywistej w postaci liczby całkowitej. |
UpCase |
function UpCase(a: char): char;
Funkcja zmieniająca znaki 'a'..'z' na odpowiednie duże znaki 'A'..'Z' |
Val |
procedure Val(const S: string; var V; var Code: Byte);
Procedura przekształca ciąg znaków S na liczbę V. Code przyjmie wartość 0 jeśli nie było błędnych znaków, w przeciwnym wypadku przyjmie numer znaku który spowodował błąd konwersji. |
WriteSector |
procedure WriteSector(devnum: byte; sector: word; var buf);
Zapis sektora SECTOR dyskietki w stacji DEVNUM na podstawie bufora BUF. |
[ Constants ]
CN_START_SELECT_OPTION = 0; CN_SELECT_OPTION = 1; CN_START_OPTION = 2; CN_OPTION = 3; CN_START_SELECT = 4; CN_SELECT = 5; CN_START = 6; CN_NONE = 7;
[ Variables ]
Consol |
Consol: byte absolute $d01f;
Zmienna 'Consol' zwraca kod naciśniętego klawisza/klawiszy konsoli. |
TextAttr |
TextAttr: byte = 0;
Zmienna 'TextAttr' przechowuje wartość jaka jest dodawana do każdego wyświetlanego znaku, np. TextAttr = $80 spowoduje że znaki będą wyświetlane w inwersie. |
WhereX |
WhereX: byte absolute $54;
Zmienna 'WhereX' przechowuje aktualną poziomą pozycję kursora. |
WhereY |
WhereY: byte absolute $55;
Zmienna 'WhereY' przechowuje aktualną pionową pozycję kursora. |
[ Procedures and functions ]
ClrEol |
procedure ClrEol;
Procedura czyści wiersz od aktualnej pozycji kursora do prawej strony krawędzi ekranu. Pozycja kursora nie ulega zmianie. |
ClrScr |
procedure ClrScr;
Procedura czyści ekran edytora, wykonuje kod znaku CH_CLR |
CursorOff |
procedure CursorOff;
Procedura wyłącza kursor. |
CursorOn |
procedure CursorOn;
Procedura włącza kursor. |
Delay |
procedure Delay(MS: Word);
Procedura czeka zadaną ilość milisekund MS. W przybliżeniu Delay(1000) generuje opóźnienie jednej sekundy. |
DelLine |
procedure DelLine;
Procedura kasuje wiersz na aktualnej pozycji kursora, wykonuje kod znaku CH_DELLINE |
GotoXY |
procedure GotoXY(x, y: byte);
Procedura ustawia nową pozycję kursora. |
InsLine |
procedure InsLine;
Procedura wstawia pusty wiersz na aktualnej pozycji kursora, wykonuje kod znaku CH_INSLINE |
Keypressed |
function Keypressed: Boolean;
Funkcja zwraca TRUE gdy został naciśnięty jakiś klawisz klawiatury, w przeciwnym razie zwraca FALSE. |
NoSound |
procedure NoSound;
Procedura wycisza kanały obu POKEY-i ($D200, $D210) |
ReadKey |
function ReadKey: char;
Funkcja zwraca kod naciśniętego klawisza klawiatury. |
Sound |
procedure Sound(Chan,Freq,Dist,Vol: byte);
Procedura odtwarza dźwięk na kanale POKEY-a CHAN (0..3, 4..7), o częstotliwości FREQ (0..255), filtrach DIST (0..7), głośności VOL (0..15). |
TextBackground |
procedure TextBackground(a: byte);
Procedura ustawia nowy kolor tła znaków (działa najlepiej z włączonym VBXE). |
TextColor |
procedure TextColor(a: byte);
Procedura ustawia nowy kolor znaków (działa najlepiej z włączonym VBXE). |
[ Constants ]
{ graphic drivers } D1bit = 11; D2bit = 12; D4bit = 13; D6bit = 14; // 64 colors Half-brite mode - Amiga D8bit = 15; D12bit = 16; // 4096 color modes HAM mode - Amiga m640x480 = 8 + 16; { error codes } grOK = 0; grNoInitGraph = -1; grNotDetected = -2; grFileNotFound = -3; grInvalidDriver = -4; grNoLoadMem = -5; grNoScanMem = -6; grNoFloodMem = -7; grFontNotFound = -8; grNoFontMem = -9; grInvalidMode = -10; grError = -11; grIOerror = -12; grInvalidFont = -13; grInvalidFontNum= -14; grInvalidVersion= -18;
[ Variables ]
GraphResult |
GraphResult : byte;
|
[ Procedures and functions ]
Bar |
procedure Bar(x1, y1, x2, y2: Smallint);
Prostokąt, np. dla wykresów słupkowych. |
Bar3D |
procedure Bar3D(x1, y1, x2, y2: smallint; depth: word; top: boolean);
Słupek trójwymiarowy. |
Circle |
procedure Circle(x0,y0,radius: word);
Okrąg. |
ClipLine |
procedure ClipLine(x1, y1, x2, y2: smallint);
|
Ellipse |
procedure Ellipse(x0, y0, a, b: word);
Elipsa. |
FillEllipse |
procedure FillEllipse(x0, y0, a, b: word);
Elipsa wypełniona wewnątrz. |
FillRect |
procedure FillRect(Rect: TRect);
Prostokąt wypełniony wewnątrz. |
FloodFill |
procedure FloodFill(x, y: smallint; color: byte);
Wypełnienie zamkniętego obszaru ekranu. |
GetColor |
function GetColor: byte; assembler;
Podaj bieżący kolor rysowania. |
GetMaxX |
function GetMaxX: word;
Podaj najwyższą wartość współrzędnej X na ekranie. |
GetMaxY |
function GetMaxY: word;
Podaj najwyższą wartość współrzędnej Y na ekranie. |
GetPixel |
function GetPixel(x,y: smallint): byte;
Podaj kolor danego punktu na ekranie. |
GetX |
function GetX: smallint;
Podaj bieżącą współrzędną X kursora graficznego. |
GetY |
function GetY: smallint;
Podaj bieżącą współrzędną Y kursora graficznego. |
InitGraph |
procedure InitGraph(mode: byte); procedure InitGraph(driver, mode: byte; pth: TString); Zainicjuj tryb graficzny. |
Line |
procedure Line(x0, y0, x1, y1: smallint);
Linia prosta. |
LineTo |
procedure LineTo(x, y: smallint);
Linia od bieżącej pozycji kursora do wskazanego punktu. |
MoveRel |
procedure MoveRel(Dx, Dy: smallint);
Przesuń kursor graficzny. |
MoveTo |
procedure MoveTo(x, y: smallint);
Przesuń kursor graficzny do wskazanego punktu. |
PutPixel |
procedure PutPixel(x,y: smallint); procedure PutPixel(x,y: smallint; color: byte); Zapal punkt na ekranie. |
Rectangle |
procedure Rectangle(x1, y1, x2, y2: smallint); procedure Rectangle(Rect: TRect); Prostokąt. |
SetBkColor |
procedure SetBkColor(color: byte);
Ustaw kolor tła. |
SetClipRect |
procedure SetClipRect(x0,y0,x1,y1: smallint); procedure SetClipRect(Rect: TRect);
|
SetColor |
procedure SetColor(color: byte);
Ustaw kolor pisaka. |
SetColorMapEntry |
procedure SetColorMapEntry; procedure SetColorMapEntry(a,b,c: byte);
|
SetColorMapDimensions |
procedure SetColorMapDimensions(w,h: byte);
|
[ Constants ]
faReadOnly = $01; faHidden = $02; faSysFile = $04; faVolumeID = $08; faDirectory = $10; faArchive = $20; faAnyFile = $3f;
[ Types ]
TSearchRec |
TSearchRec = record Attr: Byte; Name: TString; FindHandle: Pointer; end;
|
[ Procedures and functions ]
AnsiUpperCase |
function AnsiUpperCase(const a: string): string;
Funkcja konwertuje znaki z łańcucha A na wielkie. |
Beep |
procedure Beep;
Sygnał brzęczka (buzzer). |
Click |
procedure Click;
Sygnał klawiatury. |
DeleteFile |
function DeleteFile(var FileName: TString): Boolean;
Funkcja kasuje plik określony w parametrze FileName, zwraca TRUE gdy operacja się powiodła. |
ExtractFileExt |
function ExtractFileExt(const FileName: string): TString;
Na podstawie nazwy pliku lub pełnej ścieżki do pliku (określonej w parametrze FileName), funkcja zwraca rozszerzenie (poprzedzone kropką - np. .txt). |
FileExists |
function FileExists(const FileName: string): Boolean;
Funkcja sprawdza czy plik określony w parametrze FileName, istnieje (True) czy też nie (False). |
FindFirst |
function FindFirst(const FileMask: TString; Attributes: Byte; var SearchResult: TSearchRec): byte;
Funkcja FindFirst wyszukuje pliki pasujące do wzorca FileMask i posiadające atrybuty określone w Attributes. Jeśli zostały znalezione pliki pasujące do szablonu to pierwszy z nich jest zwracany w zmiennej SerchResult. |
FindNext |
function FindNext(var f: TSearchRec): byte;
Funkcja przechodzi do następnego rekordu znalezionego wcześniej przy pomocy FindFirst. W parametrze musi zostać przekazane wskazanie na rekord, który wcześniej został użyty w funkcji FindFirst. |
FindClose |
procedure FindClose(var f: TSearchRec);
Procedura zwalnia zasoby (pamięć) zaalokowaną przez funkcję FindFirst. Procedura ta powinna być wywoływana za każdym razem po zakończeniu procesu wyszukiwania. |
GetTickCount |
function GetTickCount: cardinal;
GetTickCount zwraca 24-bitowy licznik czasu (PEEK(RTCLOK+2) + PEEK(RTCLOK+1)*256 + PEEK(RTCLOK)*65536). Jest to przydatne do pomiaru czasu. |
IntToHex |
function IntToHex(Value: cardinal; Digits: byte): TString;
Funkcja konwertuje wartość liczbową na jej odpowiednik łańcuchowy w systemie szesnastkowym. |
IntToStr |
function IntToStr(a: integer): ^char;
Funkcja służy do konwersji liczby całkowitej podanej w parametrze do postaci łańcuchowej. |
RenameFile |
function RenameFile(var OldName,NewName: TString): Boolean;
RenameFile próbuje zmienić nazwę pliku (określonego w parametrze OldName) na NewName. Jeżeli operacja się powiedzie, funkcja zwróci wartość True; w przeciwnym wypadku - False. Może się zdarzyć, że funkcja nie będzie mogła zmienić nazwy (np. gdy aplikacja nie ma prawa do tego) - wówczas funkcja zwróci False. |
StrToFloat |
function StrToFloat(var s: TString): real;
Funkcja konwertuje łańcuch do postaci zmiennoprzenkowej typu Real. |
StrToInt |
function StrToInt(const S: char): byte; function StrToInt (const S: TString): integer; Funkcja służy do konwersji tekstu zapisanego w zmiennej S na liczbę całkowitą - o ile to możliwe. |
Mapa pamięci dla VBXE zdefiniowana jest w module SYSTEM
VBXE_XDLADR = $0000; // XDLIST VBXE_MAPADR = $1000; // COLOR MAP ADDRESS VBXE_BCBADR = $0100; // BLITTER LIST ADDRESS VBXE_OVRADR = $5000; // OVERLAY ADDRESS VBXE_WINDOW = $B000; // 4K WINDOW $B000..$BFFF
[ Constants ]
LoRes = 1; MedRes = 2; HiRes = 3;
[ Types ]
TUInt24 |
record byte0: byte; byte1: byte; byte2: byte; end; |
Typ 24-bitowy wykorzystywany do definicji adresów pamięci VBXE. |
TXDL |
record xdlc_: word; rptl_: byte; xdlc: word; rptl: byte; ov_adr: TUInt24; ov_step: word; mp_adr: TUInt24; mp_step: word; mp_hscrol: byte; mp_vscrol: byte; mp_width: byte; mp_height: byte; ov_width: byte; ov_prior: byte; end; |
Typ TXDL wykorzystywany przez procedury GetXDL i SetXDL. Pozwala na modyfikację programu dla VBXE wykorzystywanego przez MadPascal. |
TBCB |
record src_adr: TUInt24; src_step_y: smallint; src_step_x: shortint; dst_adr: TUInt24; dst_step_y: smallint; dst_step_x: shortint; blt_width: word; blt_height: byte; blt_and_mask: byte; blt_xor_mask: byte; blt_collision_mask: byte; blt_zoom: byte; pattern_feature: byte; blt_control: byte; end; |
Typ TBCB (21 bajtów), Blitter Code Block. Definicja typu bloku programu dla Blittera VBXE. |
TVBXEMemoryStream |
Object Position: cardinal; Size: cardinal; // 0..Size-1 procedure Create; procedure Clear; procedure SetBank; procedure ReadBuffer(var Buffer; Count: word); procedure WriteBuffer(var Buffer; Count: word); function ReadByte: Byte; function ReadWord: Word; function ReadDWord: Cardinal; procedure WriteByte(b: Byte); procedure WriteWord(w: Word); procedure WriteDWord(d: Cardinal); end; |
Obiekt TVBXEMemoryStream pozwala na liniowy dostęp do pamięci VBXE. |
[ Procedures and functions ]
BlitterBusy | function BlitterBusy: Boolean; assembler;
Funkcja zwraca TRUE jeśli blitter VBXE zajęty jest wykonywaniem programu blittera. |
ColorMapOff | procedure ColorMapOff; assembler;
Wyłączenie mapy kolorów w programie XDLIST dla VBXE. |
ColorMapOn | procedure ColorMapOn; assembler;
Włączenie mapy kolorów w programie XDLIST dla VBXE. |
DstBCB |
procedure DstBCB(var a: TBCB; dst: cardinal);
Procedura zmieniająca adres docelowy (dst_adr) w programie blittera A. |
GetXDL |
procedure GetXDL(var a: txdl); register; assembler;
Procedura przepisuje do zmiennej A program XDLIST spod adresu VBXE_XDLADR w pamięci VBXE. |
IniBCB |
procedure IniBCB(var a: TBCB; src,dst: cardinal; w0, w1: smallint; w: word; h: byte; ctrl: byte);
Procedura INIBCB pozwala zaincjować pamięć dla programu blittera pod adresem A. Dodatkowe parametry określają adres spod którego będą kopiowane dane SRC, adres docelowy kopiowanych danych DST, szerokość okna danych źródłowych W0, docelowych W1, rozmiar okna wynikowego, jego szerokość W, wysokość H, oraz określić parametry końcowe bloku programu blittera CTRL (ustawiony bit 3 CTRL nakazuje blitterowi odczyt kolejnego programu i jego wykonanie). |
OverlayOff |
procedure OverlayOff; assembler;
Wyłączenie trybu overlay w programie XDLIST. |
RunBCB |
procedure RunBCB(var a: TBCB); assembler;
Wystartowanie blittera VBXE na podstawie adresu programu A. |
SetHorizontalRes |
procedure SetHorizontalRes(a: byte); assembler; procedure SetHRes(a: byte); assembler; Ustanowienie trybu overlay w programie XDLIST (LoRes: 160x240x256c, MedRes: 320x240x256c, HiRes: 640x240x16c). |
VBXEMemoryBank |
procedure VBXEMemoryBank(b: byte); assembler;
Włączenie 4K banku VBXE w okno pamięci XE/XL $B000..$BCFF |
SetXDL |
procedure SetXDL(var a: txdl); register; assembler;
Procedura przepisuje program A pod adres VBXE_XDLADR w pamięci VBXE. |
SrcBCB |
procedure SrcBCB(var a: TBCB; src: cardinal);
Procedura zmieniająca adres źródłowy (src_adr) w programie blittera A. |
VBXEControl |
procedure VBXEControl(a: byte); assembler;
Procedura ustawia wartośc FX_VIDEO_CONTROL. |
VBXEOff |
procedure VBXEOff
Wyłączenie, reset VBXE. |
[ Procedures and functions ]
ArcCos |
function ArcCos(x: real): real;
Arcus cosinus jest funkcją odwrotną do funkcji Cos (cosinus). Wartość parametru X musi należeć do przedziału obustronnie domkniętego <-1; 1>. Wartością zwracaną przez funkcję jest kąt z przedziału <0; ?> wyrażony w mierze łukowej (radianach). |
ArcSin |
function ArcSin(x: real): real;
Funkcja ArcSin służy do obliczenia funkcji matematycznej arcus sinus z liczby X. Jest to funkcja odwrotna do funkcji sinus, tzn. sin(arcsin(x)) = x. |
ArcTan2 |
function ArcTan2(y, x: real) : real;
Funkcja oblicza arcus tangens (odwrotność tangensa) z liczby Y/X i zwraca wartość w radianach. |
Ceil |
function Ceil(a: real): smallint;
Funkcja zwraca najmniejszą liczbę całkowitą większą lub równą od tej podanej w parametrze. |
CycleToRad |
function CycleToRad(cycle : real) : real;
Funkcja CycleToRad przelicza wartość kąta wyrażonego w cyklach (obrotach) na kąt wyrażony w radianach. |
DegNormalize |
function DegNormalize(deg : real) : real;
|
DegToGrad |
function DegToGrad(deg : real) : real;
Funkcja DegToGrad przelicza wartość kąta wyrażonego w stopniach na kąt wyrażony w gradach. |
DegToRad |
function DegToRad(deg : real) : real;
Funkcja DegToRad przelicza wartość kąta wyrażonego w stopniach na kąt wyrażony w mierze łukowej, czyli radianach. |
DivMod |
procedure DivMod(Dividend: integer; Divisor: Word; var r, Remainder: Word); procedure DivMod(Dividend: integer; Divisor: Word; var r, Remainder: smallint);
|
EnsureRange |
function EnsureRange(const AValue, AMin, AMax: byte): Integer; function EnsureRange(const AValue, AMin, AMax: Integer): Integer;
|
Floor |
function Floor(a: real): smallint;
Funkcja zwraca najbliższą liczbę całkowitą mniejszą lub równą od tej podanej w parametrze. |
FMod |
function FMod(a, b: real): real;
Funkcja FMod zwraca resztę z dzielenia dwóch liczb rzeczywistych. |
GradToDeg |
function GradToDeg(grad : real) : real;
Funkcja GradToDeg przelicza wartość kąta wyrażonego w gradach na kąt wyrażony w stopniach. |
GradToRad |
function GradToRad(grad : real) : real;
Funkcja GradToRad przelicza wartość kąta wyrażonego w gradach na kąt wyrażony w radianach. |
InRange |
function InRange(const AValue, AMin, AMax: byte): Boolean; function InRange(const AValue, AMin, AMax: Integer): Boolean;
|
IsNan |
function IsNan(const d : Single): Boolean;
Funkcja sprawdza czy wartość parametru D jest poprawną liczbą. |
Log2 |
function log2(x : single): single;
Funkcja zwraca wartość logarytmu przy podstawie 2 dla parametru rzeczywistego X>0. |
Log10 |
function log10(x : single): single;
Funkcja zwraca wartość logarytmu dziesiętnego (logarytmu przy podstawie 10) dla parametru rzeczywistego X>0. |
LogN |
function logN(n,x : single): single;
Funkcja zwraca wartość logarytmu przy podstawie N>0 dla parametru rzeczywistego X>0. |
Max |
function Max(a, b: real): real; function Max(a, b: integer): integer; Przeciążona funkcja porównuje wartości dwóch parametrów: A i B, oraz zwraca ten, który jest większy. |
Min |
function Min(a, b: real): real; function Min(a, b: integer): integer; Przeciążona funkcja porównuje wartości dwóch parametrów A i B, oraz zwraca wartość tego który jest mniejszy. |
Power |
function Power(base : real; const exponent : shortint): real; power(base : integer; const exponent : shortint): integer; Funkcja podnosi liczbę A do dowolnej potęgi N, potęga może być ułamkiem. |
RadToCycle |
function RadToCycle(rad : real) : real;
Funkcja RadToCycle przelicza wartość kąta wyrażonego w radianach na kąt wyrażony w cyklach (obrotach). |
RadToDeg |
function RadToDeg(rad : real) : real;
Funkcja RadToDeg przelicza wartość kąta wyrażonego w radianach na kąt wyrażony w stopniach (deg). |
RadToGrad |
function RadToGrad(rad : real) : real;
Funkcja RadToGrad przelicza wartość kąta wyrażonego w radianach na kąt wyrażony w gradach. |
RandG |
function RandG(mean, stddev : single) : single;
RandG reprezentuje generator liczb pseudolosowych o rozkładzie Gaussa wokół średniej Mean. Parametr StdDev jest odchyleniem standardowym generowanych liczb od wartości średniej (Mean). |
RandomRange |
function RandomRange(const aFrom, aTo: smallint): smallint;
Funkcja zwraca losową liczbę z przedziału AFrom - ATo (łącznie z wartością ATo). |
RandomRangeF |
function RandomRangeF(const min, max: single): single;
|
Tan |
function Tan(x: Real): Real;
Funkcja zwraca wartość tangensa kąta podanego w parametrze X. |
1.6.3
- poprawki, optymalizacje
- SYSUTILS: Trim
- SYSTEM: PByte, PByteArray, PWord
- GRAPH, FASTGRAPH: TFrameBuffer, DisplayBuffer, FrameBuffer, SwitchBuffer, Scanline
- BLIBS: unit GR10PP
- LIB: unit GR4PP
1.6.0 - 1.6.2
- nowy unit EFAST dla przyspieszenia wyprowadzania znaków na urządzenie E:
- SYSTEM: function Copy(var S: String; Index: Byte; Count: Byte): String;
- SYSTEM: Palette, HPalette
- dodana obsługa tablic jednowymiarowych typu ^RECORD (wskaznik do rekordu)
- optymalizacja bloków warunkowych, generowany jest możliwie najkrótszy, najszybszy kod wynikowy
- dodany typ PChar, https://www.freepascal.org/docs-html/rtl/system/pchar.html
- dodana możliwość zwracania wartości funkcji przez typ wyliczeniowy
- dodany nowy przełącznik -define:symbol
- dodany nowy przełącznik -ipath:includepath
1.5.9 - 1.6.0
- SYSTEM: TDateTime
- GRAPH, FASTGRAPH: Arc, PieSlice, TLastArcCoords, LastArcCoords
- SYSUTILS: Now, Date, DateToStr, DecodeDate, DecodeDateTime, DecodeTime, EncodeDate, EncodeDateTime, EncodeTime, IsLeapYear, BoolToStr, StrToBool
- STRUTILS: AddChar, AddCharR, PadLeft, PadRight
- dodana obsługa {$INCLUDE %DATE%}, {$INCLUDE %TIME%}, https://www.freepascal.org/docs-html/prog/progsu41.html
- przełączniki -CODE:, -DATA:, -STACK:, -ZPAGE: domyślnie wymagają podania wartości HEX bez znaku początkowego '$'
1.5.8
- GRAPHICS: Font, FontInitialize, FillRect, TextOut, TextWidth, MoveTo, LineTo
- SYSTEM: FileMode (RESET), [fmOpenRead, fmOpenWrite, fmOpenAppend, fmOpenReadWrite]
- dodana obsługa dyrektyw {$info user_defined}, {$warning user_defined}, {$error user_defined}, {$include filename}, {$resource filename}
- akceptuje zapis PROGRAM (par1, par2 ...)
- poprawione FillFlood, dodane FillFloodH (wypełnianie poziomymi liniami)
- kompilator generuje krótszy kod gdy procedura/funkcja nie ma parametrów
- dostęp do definicji .DEFINE z poziomu ASM, MAIN.@DEFINES.nazwa
- procedury/funkcje INTERRUPT niezależnie czy zostaną użyte kompilator zawsze wygeneruje dla nich kod
- poprawiona optymalizacja bloków REPEAT UNTIL
- dodana informacja o czasie kompilacji
- dodana obsługa inicjalizacji tablic dwuwymiarowych stałych i zmiennych
1.5.6 - 1.5.7
- SYSUTILS: Click
- SYSTEM: Sqrt(Integer): Single
- MATH: Sign
- dodana możliwość użycia nazwy funkcji dla zwracanej wartości, dotychczas tylko przez RESULT
- dodana obsługa tablic typu STRING
- dodana obsługa dyrektywy {$LIBRARYPATH path1;path2;...}
- nowa biblioteka BLIBS
- nowa dokumentacja dla LIB, BLIBS wygenerowana przez PASDOC (https://gitlab.com/bocianu/pasdoc)
1.5.3 - 1.5.5
- CRT: TextMode
- SYSUTILS: ExtractFilePath
- SYSTEM: EoLn
- dodana obsługa linii poleceń z poziomu DOS II/D dla ParamCount, ParamStr
- OBJECT, można zdefiniować je bez zmiennych, tylko same metody
- OBJECT, można wywołać metodę z poziomu metody
- dodana automatyczna konwersja wyrażeń typu INTEGER na REAL
1.5.2
- nowy typ FLOAT jako odpowiednik typu SINGLE
- SYSTEM unti: FileSize (SDX)
- SYSTEM unit: EXP:Single, LN:Single, LN:Real, EXP:Real (wysoka precyzja obliczeń)
- SYSUTILS unit: AnsiUpperCase, ExtractFileExt
- TYPES unit: Bounds, CenterPoint, EqualRect, InflateRect, IntersectRect, IsRectEmpty, NormalizeRect, OffsetRect, Point, PointsEqual, PtInRect, PtInEllipse, Rect, RectWidth, RectHeight, Size, UnionRect
- IMAGE unit: LoadMIC, LoadPIC, LoadBMP, LoadPCX, LoadGIF
- VIMAGE unit: LoadVBMP, LoadVPCX, LoadVGIF
- GRAPH, FASTGRAPH unit: SetClipRect, ClipLine, FillRect(TRect), Rectangle(TRect)
1.5.1
- dodane nowe przełączniki -CODE:$address, -DATA:$address -STACK:$address, -ZPAGE:$address
- SYSTEM unit: RandomF (Result as Single), VAL (Integer, Single)
- GRAPH, FASTGRAPH unit: Bar, Bar3D, GetX, GetY, MoveRel, FloodFill
- MATH unit: RandomRange, RandomRangeF, RandG (gaussian distributed random number)
- CRT unit: SOUND (działa identycznie jak SOUND w Atari BASIC)
- VBXE unit: TVBXEMemoryStream
- dodany komunikat ostrzeżenia 'Comparison might be always true/false due to range of constant and expression'
- zasoby RCASM, CMCPLAY, MPTPLAY można teraz ładować pod ROM
- dodana możliwość oznaczenia kodowania ciągu znakowego jako internal ANTIC-a poprzez znak tyldy '~', np.:
txt0: string = 'Atari'~; // ciąg w kodach ANTIC-a txt1: string = 'Spectrum'*~; // ciąg w inwersie w kodach ANTIC-a
1.5.0
- poprawiona i uzupełniona inicjalizacja tablic typu POINTER
- poprawiona i uzupełniona inicjalizacja zmiennych typu wyliczeniowego
- wprowadzony typ LONGWORD, DWORD, UINT32 jako odpowiednik CARDINAL
- wprowadzony typ LONGINT jako odpowiednik INTEGER
- zreorganizowane typy rzeczywiste, typ ShortReal (fixed point Q8.8), Real (fixed point Q24.8), Single (32bit IEEE-754)
- unit SYSTEM (const SINGLE): NaN, Infinity, NegInfinity
- unit SYSTEM (type SINGLE): SIN, COS, ABS, SQRT, ISQRT, ROUND, TRUNC
- unit MATH (type SINGLE): LOG2, LOG10, LOGN, IsNaN
- dla WRITE/WRITELN akceptowane i ingorowane jest formatowanie wyniku, np.: writeln(f:8:8)
1.4.8 / 1.4.9
- zmniejszenie wskaźnika stosu programowego w przypadku wywołania funkcji bez odebrania jej wartości
- lepsza ocena możliwości ustalenia adresu stałej/zmiennej, dodany komunikat "Can't take the address of constant expressions"
1.4.7
- optymalizacja dla imulBYTE, imulWORD, imulCARD, mulSHORTINT, mulSMALLINT, mulINTEGER
- dodana obsługa wskaźnika rekordu, np.:
type TPoint = record x,y: smallint end; var a,b: ^TPoint; begin a^.y := b^.x; a^ := b^; end.
- dodana obsługa sekcji INITIALIZATION w modułach UNIT
- dodany nowy typ EXTMEM dla pliku resource $R, pozwalajacy ładować dane do pamięci dodatkowej
- dodany nowy typ OBJECT, czyli RECORD z dodatkowymi metodami
type TMemoryStream = Object Position: cardinal; Size: cardinal; procedure Create; procedure ReadBuffer(var Buffer; Count: word); procedure WriteBuffer(var Buffer; Count: word); end;
- poprawione biblioteki CMC, MPT, RMT
1.4.6
- dodana obsługa dyrektyw warunkowych $IFDEF, $IFNDEF, $ELSE, $ENDIF, $DEFINE, $UNDEF przez DMSC
{$define test} const {$ifdef test} a=1; {$else} a=2; {$endif}
- dodana możliwość przekazania wartości funkcji przez EXIT(expression)
- dodana podstawowa implementacja dla typu wyliczeniowego (w pliku wynikowym nie są zapisywane nazwy etykiet)
- dodana obsługa tablic dwuwymiarowych
1.4.4/1.4.5
- poprawione porównanie typów tego samego rozmiaru ale o przeciwnych znakach
- dodana możliwość użycia klauzuli USES w blokach modułów UNIT
- dodany wymóg deklaracji funkcji/procedur w sekcji INTERFACE modułów UNIT
- poprawione zauważone błędy optymalizatora
1.4.3
- dodana możliwość zwrócenia wartości funkcji przez RECORD, np:
var p: TPoint; p:=Point(x,y);
- {$f page} FAST_MUL, procedury szybkiego mnożenia dla BYTE, SHORTINT, WORD, SMALLINT, SINGLE
- SYSTEM: ReadConfig, ReadSector, WriteSector
- SYSTEM: Point, Rect, Bounds, PointsEqual
(https://github.com/graemeg/freepascal/blob/577d99e594f4958bad4f343fb419b8dddda2ebe6/rtl/objpas/classes/classes.inc)
- DOS: CurrentMinuteOfDay, CurrentSec100OfDay, CurrentSecondOfDay, MinuteOfDay, MinutesToTime, SecondOfDay, SecondsToTime
(https://github.com/graemeg/freepascal/blob/master/packages/fv/src/time.pas#L309)
- MATH: Power, ArcTan2, InRange, EnsureRange, CycleToRad, DegNormalize, DegToGrad, DegToRad, DivMod, GradToDeg, GradToRad, RadToCycle, RadToDeg, RadToGrad
(https://github.com/graemeg/freepascal/blob/master/rtl/objpas/math.pp)
- nowy typ LABEL
- dodana obsługa GOTO label
1.4.1 / 1.4.2
- optymalizacja kodu wynikowego 6502 generowanego dla pętli FOR
- poprawiony odczyt plików include i resource
- MISC: DetectCPUSpeed
- dodatkowy typ danych rzeczywistych SINGLE <-128..127>
1.4.0
- w parametrach formalnych procedur i funkcji dodana możliwość podania typu UNTYPED (tylko przez VAR), np.
procedure move(var x,y; count: word); begin end; move(tab[100], tab[200], 50);
- SYSTEM: poprawki dla FILLCHAR, FILLBYTE, MOVE
fillchar(pointer($bc40+40*8), 100, ord('a')); fillchar(scr[40*8], 100, ord('a')); // teraz takie wywołanie też jest możliwe
- funkcja INTTOREAL usunięta, zastąpiona przez wbudowaną konwersję typu REAL, np.
var f: real; i: word; f:=real(i);
- FASTGRAPH: SetClipRect, ClipLine (Cohen-Sutherland algorithm)
- poprawki dla {$i filename}, poprawne liczenie linii kompilowanego programu
1.3.8
- SYSTEM: RANDOM(RANGE: BYTE): BYTE; RANDOM(RANGE: INTEGER): SMALLINT;
- CRT: WHEREX, WHEREY
- SYSUTILS: BEEP
- dodatkowy znak * po apostrofie '' oznacza inwers znaków, np.:
writeln('inwers'*'bez inwersu');
1.3.7
- dodana możliwość ładowania bloku resource {$R} pod adres tablicy
1.3.6
- dodane rozkazy GetIntVec, SetIntVec w zastępstwie rozkazu Intr
- umożliwione zwracanie wartości RESULT dla funkcji poprzez tablice
- poprawki dla MOVE (downwards, upwards)
- optymalizacja ASM dla procedur/funkcji POKE, DPOKE, PEEK, DPEEK, FILLCHAR, MOVE, INTTOREAL
- SYSTEM: ParamCount, ParamStr (SDX, BWDOS)
1.3.5
- dodana możliwość odczytu adresu stałej, np.:
const tb: array [0..0] of byte = ( lo(word(@tb)) );
- dodany odczyt wektorów DLI, VBL przez rozkaz INTR
intr(rVBL, label); intr(rDLI, label);
1.3.4
- dodana dodatkowa informacja o zajmowanej pamięci przez kolejne kompilowane moduły
- dodany nowy moduł VBXE (tryb OVERLAY, BLITTER)
- dodana obsługa błędów dla operacji I/O {I+} {I-} IOCHECK ON/OFF
- dwie dodatkowe poprawki Greblusa dla $I, $R z myślą o działaniu w środowisku Linuxa
1.3.3
- Greblus dodał poprawki umożliwiające działanie kompilatora z Linux-em
- dodana możliwość zaincjowania wskaźnika
tmp: byte; p: pointer = @tmp; a: ^byte = @tmp;
- dodana możliwość przypisania rekordu
type a = record x,y: byte end; var k,w: a; k:=w;
- GRAPH: SetVideoBank, SetColorMapDimensions, SetColorMapEntry
- VBXE: GetXDL, SetXDL, RunBlit, ClrVideoBank
1.3.2
- DOS: GetTime, SetTime
- MATH: Ceil
- SYSUTILS: GetTickCount
- FindFirst ... obsługa Attributes
- wbudowanie funkcji w kompilator: INT, FRAC, TRUNC, ROUND, ODD
1.3.1
- dodana obsługa rekordów RECORD
- {$i filename}
- {$r filename}, Resource Type: RCDATA, DOSFILE, RELOC, RMT, MPT, CMC
- dodany przełącznik -o Optimize code
- możliwość wymuszenia typu dla CONST
const a: word = 5; // WORD b = 5; // BYTE
- dodana obsługa modyfikatorów INTERRUPT, FORWARD, REGISTER dla procedur i funkcji
- dodana obsługa mapy kolorów (40x30x8x8) VBXE (moduł GRAPH, CRT), SetColorMap, SetColorCell, SetVideoBank
- SYSUTILS: TSearchRec, FindFirst, FindNext, FindClose
- GRAPH, FASTGRAPH: FillRect, FillEllipse
- SYSTEM: ODD, INT, LOW, HIGH, SIZEOF, INTR (INTERRUPT_NUMBER), BinStr, OctStr, HexStr, Pause, Sound, NoSound, Concat
- RMT: RMTINIT, RMTPLAY, RMTSTOP
- MPT: MPTINIT, MPTPLAY, MPTSTOP
- CMC: CMCINIT, CMCPLAY, CMCSTOP