MAD-PASCAL 1.4.3
Tebe/Madteam (12.09.2016)
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).
MP nie udostępnia wszystkich możliwości języka Turbo Pascal, tylko pewien jego zakres. 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 możliwość dołączania wstawek assemblerowych, pozwalających zwiększyć szybkość działania. Program z wstawkami ASM nie będzie działał na innej platformie niż XE/XL. MP wykorzystuje 64KB pamięci podstawowej, obecnie nie wspiera pamięci rozszerzonej.
MP nie wspiera tablic wielowymiarowych, rekordów, nie ma zaimplementowanej instrukcji CASE, GOTO, nie daje możliwości rekurencji. Alokacja zmiennych jest statyczna, nie ma dynamicznego zarządzania pamięcią. Parametry przekazywane do funkcji i procedur są przez wartość lub zmienną.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 -o optymalizacja kodu
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 mod not of or procedure program record repeat shl shr 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ć:
{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 zawartego w pliku.
RCDATA | dowolny typ danych |
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 |
INTEGER | -2147483648 .. 2147483647 | 4 |
Name | Size | Ord(True) |
BOOLEAN | 1 | 1 |
Type | Range | Size in bytes |
SINGLE | -128..127 | 2 |
REAL | -8388607..8388608 | 4 |
Type | Range | Size in bytes |
CHAR | ATASCII (0 .. 255) | 1 |
STRING | 1 .. 255 | 256 |
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.
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 i jednowymiarowe z początkowym indeksem =0, np.:
var tb: array [0..100] of word;
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 |
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).
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). Domyślną nazwą zmiennej dla wyniku funkcji jest RESULT, np.:
function suma(a,b: word): cardinal; begin Result := 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
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
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 GTIA = 0; VBXE = $80; 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; // delete char under the cursor 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; // tabulator CH_EOL = $9B; // end-of-line marker CH_CLR = $7D; // clear screen CH_BEL = $FD; // bell CH_DEL = $7E; // back space (delete char to the left) CH_DELLINE = $9C; // delete line CH_INSLINE = $9D; // insert line 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. |
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. |
Bounds |
function Bounds(ALeft, ATop, AWidth, AHeight: smallint): TRect;
Funkcja Bounds zwraca rekord typu TRect na podstawie podanych parametrów. Działanie funkcji jest praktycznie takie samo jak działanie funkcji Rect. |
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. |
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; overload;
Funkcja zwraca losową wartość z przedziału <0 .. 1> function Random(range: byte): byte; assembler; overload;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: integer): integer;
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 ]
TextAttr |
TextAttr: byte = 0;
Zmienna przechowująca wartość jaka jest dodawana do każdego wyświetlanego znaku, np. TextAttr = $80 spowoduje że znaki będą wyświetlane w inwersie. |
[ Procedures and functions ]
Consol |
function Consol: byte;
Funkcja zwraca kod naciśniętego klawisza/klawiszy konsoli. |
ClrEol | Procedura czyści wiersz od aktualnej pozycji kursora do prawej strony krawędzi ekranu. Pozycja kursora nie ulega zmianie. |
ClrScr | Procedura czyści ekran edytora, wykonuje kod znaku CH_CLR |
CursorOff | Procedura wyłącza kursor. |
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 | Procedura kasuje wiersz na aktualnej pozycji kursora, wykonuje kod znaku CH_DELLINE |
GotoXY |
procedure GotoXY(x, y: byte);
Procedura ustawia nową pozycję kursora. |
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 | 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, o częstotliwości FREQ, filtrach DIST, głośności VOL. |
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). |
WhereX |
function WhereX: byte;
Funkcja zwraca aktualną poziomą pozycję kursora. |
WhereY |
function WhereY: byte;
Funkcja zwraca aktualną pionową pozycję kursora. |
[ Constants ]
D2bit = 12; D4bit = 13; D6bit = 14; D8bit = 15; m640x480 = 8; grOK = 0;
[ Variables ]
GraphResult |
GraphResult : byte;
|
[ Procedures and functions ]
Circle |
procedure Circle(x0,y0,radius: word);
|
Ellipse |
procedure Ellipse(x0, y0, a, b: word);
|
FillEllipse |
procedure FillEllipse(x0, y0, a, b: word);
|
FillRect |
procedure FillRect(x1, y1, x2, y2: smallint; c: byte);
|
FloodFill |
procedure FloodFill(x, y: smallint; color: byte);
|
GetPixel |
function GetPixel(x,y: smallint): byte;
|
InitGraph |
procedure InitGraph(mode: byte); procedure InitGraph(driver, mode: byte; pth: TString);
|
Line |
procedure Line(x0, y0, x1, y1: smallint);
|
LineTo |
procedure LineTo(x, y: smallint);
|
MoveTo |
procedure MoveTo(x, y: smallint);
|
PutPixel |
procedure PutPixel(x,y: smallint); procedure PutPixel(x,y: smallint; color: byte);
|
Rectangle |
procedure Rectangle(x1, y1, x2, y2: smallint);
|
SetBkColor |
procedure SetBkColor(color: byte);
|
SetColor |
procedure SetColor(color: byte);
|
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 ]
DeleteFile |
function DeleteFile(var FileName: TString): Boolean;
Funkcja kasuje plik określony w parametrze FileName, zwraca TRUE gdy operacja się powiodła. |
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;
|
FindNext |
function FindNext(var f: TSearchRec): byte;
|
FindClose |
procedure FindClose(var f: TSearchRec);
|
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;
|
IntToStr |
function IntToStr(a: integer): ^char;
|
RenameFile |
function RenameFile(var OldName,NewName: TString): Boolean;
|
StrToFloat |
function StrToFloat(var s: TString): real;
|
StrToInt |
function StrToInt(const s: char): byte; function StrToInt (const s: TString): integer;
|
[ Variables ]
banks |
banks: array [0..63] of byte;
Tablica przechowująca 64 kody wykrytych banków dodatkowej pamięci. |
[ Procedures and functions ]
DetectCPU | function DetectCPU: byte; assembler;
Funckja zwraca wartość $00 gdy wykryje CPU 6502, $01 dla 65C02, $80 dla 65816. |
DetectCPUSpeed | function DetectCPUSpeed: real;
Funckja zwraca szybkość zainstalowanego CPU wyrażoną w MHz. |
DetectMem | function DetectMEM: byte; assembler;
Funkcja zwraca liczbę wykrytych dodatkowych banków pamięci, w tablicy BANKS zapisane zostają ich kody. |
DetectStereo | function DetectStereo: Boolean; assembler;
Funkcja zwraca TRUE gdy wykryty zostanie drugi POKEY (STEREO). |
DetectVBXE | function DetectVBXE(var p: word): Boolean; assembler; register;
Funkcja zwraca TRUE w przypadku wykrycia VBXE, dodatkowo w zmiennej P typu WORD zostają zapisane informacje o wersji zainstalowanego rdzenia. bit 0..6 numer wersji rdzenia bit 7 =1 RAMBO bit 8..15 strona pamięci na której są rejestry VBXE |
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. |
[ 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. |
ClrVideoBank |
procedure ClrVideoBank(a, i: byte);
Procedura czyści kolejne I banki pamięci VBXE zaczynając od banku A. |
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). |
MoveVideoPage |
procedure MoveVideoPage(src: pointer; dst: cardinal);
Procedura przepisuje stronę pamięci SRC pod adres DST pamięci VBXE. |
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). |
SetVideoBank |
procedure SetVideoBank(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
Procedura zmieniająca adres źródłowy (src_adr) w programie blittera A. |
VBXEOff |
procedure VBXEOff
Wyłączenie, reset VBXE. |
[ Procedures and functions ]
CurrentMinuteOfDay | |
CurrentSec100OfDay | |
CurrentSecondOfDay | |
DosVersion | |
GetTime | |
MinuteOfDay | |
MinutesToTime | |
SecondOfDay | |
SecondsToTime | |
SetTime |
[ Procedures and functions ]
ArcCos |
function ArcCos(x: real): real;
|
ArcSin |
function ArcSin(x: real): real;
|
ArcTan2 |
function ArcTan2(y, x: real) : real;
|
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;
|
DegNormalize |
function DegNormalize(deg : real) : real;
|
DegToGrad |
|
DegToRad |
function DegToRad(deg : real) : real;
|
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 zwraca resztę z dzielenia dwóch liczb rzeczywistych. |
GradToDeg |
function GradToDeg(grad : real) : real;
|
GradToRad |
function GradToRad(grad : real) : real;
|
InRange |
function InRange(const AValue, AMin, AMax: byte): Boolean; function InRange(const AValue, AMin, AMax: Integer): Boolean;
|
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;
|
RadToDeg |
function RadToDeg(rad : real) : real;
|
RadToGrad |
function RadToGrad(rad : real) : real;
|
Tan |
function Tan(x: Real): Real;
Funkcja zwraca wartość tangensa kąta podanego w parametrze X. |
[ Types ]
TCMC |
type TCMC = record modul, player: pointer; end;
|
[ Procedures and functions ]
CMCInit |
procedure CMCInit(var a: TCMC);
|
CMCPlay |
procedure CMCPlay(var a: TCMC);
|
CMCStop |
procedure CMCStop(var a: TCMC);
|
[ Types ]
TMPT |
type TMPT = record modul, player: pointer; end;
|
[ Procedures and functions ]
MPTInit |
procedure MPTInit(var a: TMPT);
|
MPTPlay |
procedure MPTPlay(var a: TMPT);
|
MPTStop |
procedure MPTStop(var a: TMPT);
|
[ Types ]
TRMT |
type TRMT = record modul, player: pointer; end;
|
[ Procedures and functions ]
RMTInit |
procedure RMTInit(var a: TRMT);
|
RMTPlay |
procedure RMTPlay(var a: TRMT);
|
RMTStop |
procedure RMTStop(var a: TRMT);
|
[ Constants ]
joy_none = 15; joy_up = 14; joy_down = 13; joy_left = 11; joy_right = 7;
[ Variables ]
joy_1, stick0 |
joy_1 : byte absolute $278; stick0 : byte absolute $278; Położenie joysticka 0. |
joy_2, stick1 |
joy_2 : byte absolute $279; stick1 : byte absolute $279; Położenie joysticka 1. |
strig0 |
strig0 : byte absolute $284;
Wskaźnik naciśnięcia przycisku na joysticku 0. Normalnie zawiera '1', naciśnięcie tzw. fire na joysticku powoduje wpisanie tutaj '0'. |
strig1 |
strig1 : byte absolute $285;
Wskaźnik naciśnięcia przycisku na joysticku 1. Normalnie zawiera '1', naciśnięcie tzw. fire na joysticku powoduje wpisanie tutaj '0'. |
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