MAD-PASCAL 1.4.3

Tebe/Madteam (12.09.2016)



WPROWADZENIE

Wstęp

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ą:

  • If, For, While, Repeat, Case statements.
  • Compound statements.
  • Label, Goto statements.
  • Arithmetic and boolean operators.
  • Procedures and functions with up to 8 parameters. Returned value of a function is assigned to a predefined Result variable.
  • Static local variables.
  • Primitive data types:
    • Cardinal, Word, Char, Byte, Boolean
    • Integer, SmallInt, ShortInt
    • Pointer, File, Single/Real (fixed-point)
    All types except the Single/Real type are compatible. Pointers are dereferenced as pointers to Word.
  • One-dimensional arrays (with zero lower bound) of any primitive type. Arrays are treated as pointers to their origins (like in C) and can be passed to subroutines as parameters.
  • Predefined type string [N] which is equivalent to array [0..N] of Char.
  • Type aliases.
  • Records.
  • Separate program modules.

  • Free Pascal Reference Guide
  • MadPascal forum
  • MadPascal examples


    Kompilacja

    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
    
    
  • -Mdelphi pozwala kompilować plik w formacie Delphi
  • -v wyświetla wszystkie komunikaty błędów i ostrzeżeń
  • -O3 dokonuje optymalizacji kodu

  • SPOSÓB UŻYCIA

    Przełączniki kompilatora

    Syntax: mp source [switches]
    
    -d:address      tryb diagnostyczny
    -o              optymalizacja kodu
    

    -d
    Użycie przełącznika -d powoduje wygenerowanie dodatkowego pliku z informacją o wszystkich użytych zmiennych, procedurach, funkcjach.

    -o
    Użycie przełącznika -o wygeneruje krótszy i szybszy kod dla 6502.

    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:base
    
    Przełącznik -x (Exclude unreferenced procedures) pozwoli wygenerować najkrótszy kod wynikowy dla 6502.


    Kody wyjścia

    3 = bad parameters, compiling not started
    2 = error occured
    0 = no errors
    
    Komunikaty ostrzeżenia nie powodują zmiany wartości kodu wyjścia.


    SKŁADNIA

    Komentarze

    Comments

    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
     }
    


    Zarezerwowane słowa

    Zarezerwowane rozkazy:
    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  
    xor
    
    Zarezerwowane stałe:
    pi
    true
    false
    


    WYRAŻENIA

    Expression

    Liczby

    Numbers

  • zapis decymalny:
     -100
     -2437325
     1743
    
  • zapis hexadecymalny:
     $100
     $e430
     $000001
    
  • zapis binarny:
     %0001001010
     %000000001
     %001000
    
  • zapis kodami ATASCII:
     'a'
     'fds'
     'W'
     #65#32#65
     #$9b
    


    Operatory

    Arithmetic operators
    +   Addition
    -   Subtraction
    *   Multiplication
    /   Division
    DIV Integer division
    MOD Remainder
    
    Logical 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 right
    
    Boolean operators
    NOT logical negation (unary)
    AND logical and
    OR  logical or
    XOR logical xor
    
    Relational operators
    =   Equal
    <>  Not equal
    <   Less than
    >   Greater than
    <=  Less than or equal
    >=  Greater than or equal
    


    DYREKTYWY KOMPILATORA

    Compiler directives

    Zapis dyrektyw kompilatora ma postać:

    • {$dyrektywa parametry}
    • {$lista_dyrektyw_przełącznikowych}
    Dyrektywa stanowi komentarz, w którym pierwszy znak $ odróżnia zwykły komentarz, od dyrektywy kompilatora.

    IOCHECK {$I+} {$I-}

    Input/Output checking
    {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.


    INCLUDE {$I filename}

    Include file

    Dyrektywa dołączenia tekstu zawartego w pliku.


    {$R filename}

    Include resource

    RCLABEL RCTYPE RCFILE [PAR0 PAR1 PAR2 PAR3 PAR4 PAR5 PAR6 PAR7]

    Dyrektywa dołączenia pliku z zasobami. Plik zasobów jest plikiem tekstowym, każdy jego kolejny wiersz powinien składać się z trzech pól rozdzielonych "białym znakiem": etykieta RCLABEL (jej deklaracja musi znaleźć się także w programie), typ zasobów RCTYPE, lokalizacja pliku RCFILE. Aktualnie w pliku BASE\RES6502.ASM znajdują się makra do obsługi 10 typów zasobów RCTYPE:

    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 constants

    Do 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

    Typy porządkowe

    Typ porządkowy
    Ordinal 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

    Typy logiczne

    Boolean types

    Name Size Ord(True)



    BOOLEAN 1 1

    Typy rzeczywiste

    Real types

    Type Range Size in bytes



    SINGLE -128..127 2
    REAL -8388607..8388608 4


    Typy znakowe

    Char
    Short strings

    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.


    Wskaźniki

    Pointers

    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

    Static Arrays

    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
    


    Pliki

    File Types

    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

    Procedure

    Procedure declaration

    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.


    Function

    Function declaration

    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

    ASSEMBLER

    Procedury/Funkcje oznaczona przez ASSEMBLER mogą składać się tylko z bloku ASM. Kompilator nie dokonuje analizy składni takich bloków, traktuje je jak komentarz, ewentualne błędy zostaną wychwycone dopiero podczas asemblacji.
    procedure color(a: byte); assembler;
    asm
    {	mva a 712
    };
    end;
    

    OVERLOAD

    Procedury/Funkcje przeciążone rozpoznawane są na podstawie listy parametrów.
    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;
    

    FORWARD

    Jeżeli chcemy aby procedura/funkcja była zadeklarowana za miejscem jej pierwszego wywołania, należy użyć modyfikator FORWARD.
    procedure nazwa [(lista-parametrów-formalnych)]; forward;
    
    ...
    ...
    ...
    
    procedure nazwa;
    begin
    end;
    

    REGISTER

    Użycie modyfikatora REGISTER spowoduje że parametry formalne procedury/funkcji będą umieszczone na stronie zerowej, w 32-bitowych rejestrach programowych, odpowiednio EDX, ECX, EAX.
    procedure nazwa (a,b,c: cardinal); register;
    
    // a = edx
    // b = ecx
    // c = eax
    

    INTERRUPT

    Procedury/Funkcje oznaczone przez INTERRUPT kompilator będzie kończył rozkazem RTI (standardowo RTS). Zaleca się używanie bloku ASM w przypadku takich procedur/funkcji, w innym przypadku stos programowy Mad Pascala zostanie zniszczony, co może doprowadzić do niestabilnego działania programu, łącznie z zawieszeniem się komputera. Na wejściu procedury/funkcji oznaczonej przez INTERRUPT programista musi zadbać o zachowanie rejestrów CPU (A, X, Y), na wyjściu o przywrócenie stanu takich rejestrów, kompilator ogranicza się tylko do wstawienia końcowego rozkazu RTI.
    procedure dli; interrupt;
    asm
    {	pha
    
    	lda #$c8
    	sta wsync
    	sta $d01a
    
    	pla 
    };
    end;             // rozkaz RTI zostanie wstawiony automatycznie
    


    INSTRUKCJE WARUNKOWE

    CASE OF ELSE

    The Case statement

    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;
    


    IF THEN ELSE

    The If..then..else statement

    Instrukcje warunkowe IF mogą być zagnieżdżane. Wykorzystywane jest to przy budowie bardziej złożonych warunków.


    INSTRUKCJE ITERACYJNE

    FOR TO DOWNTO DO

    The For..to/downto..do statement
    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 DO

    The While..do statement
    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 VBXE
    

    Ograniczenia dla instrukcji WHILE:
     while i<=255 do inc(i); // pętla bez końca gdy zmienna I typu BYTE
    


    REPEAT UNTIL

    The Repeat..until statement
    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.

    SYSTEM

    Reference for unit 'System': Procedures and functions

    [ 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 spacji
    
    Zamiennie 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ą:

    iDLI - przerwanie DLI
    iVBL - przerwanie VBL
    
    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:

    TEST.EXE parametr1 parametr2 parametr3
    
    To aby uzyskać parametr3 należy podać Index=3, zaś aby uzyskać parametr1 należy Index=1. Index=0 to specjalny argument, wtedy funkcja zwraca napęd z którego został uruchomiony programu, np. 'D1:'

    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ą:

    iDLI - przerwanie DLI
    iVBL - przerwanie VBL
    
    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.


    CRT

    Reference for unit 'Crt': Procedures and functions

    [ 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.


    GRAPH

    Reference for unit 'Graph': Procedures and functions

    [ 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);


    SYSUTILS

    Reference for unit 'Sysutils': Procedures and functions

    [ 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;


    MISC

    [ 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
    


    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.


    DOS

    Reference for unit 'Dos': Procedures and functions

    [ Procedures and functions ]

    CurrentMinuteOfDay
    CurrentSec100OfDay
    CurrentSecondOfDay
    DosVersion
    GetTime
    MinuteOfDay
    MinutesToTime
    SecondOfDay
    SecondsToTime
    SetTime


    MATH

    Reference for unit 'Math': Procedures and functions

    [ 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.


    CMC

    [ 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);


    MPT

    [ 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);


    RMT

    [ 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);


    JOYSTICK

    [ 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'.


  • HISTORIA

    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 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