Zarezerwowane słowa
rozkazy
absolute and array asm assembler
begin case const constructor div
do downto else end exports
external file for forward function
if implementation in interrupt interface
length library main mod not
object of or overload pascal
procedure program record register repeat
shl shr string text textfile
then to type unit until
uses var while xor
stałe
pi
true
false
nil
eol
nan
infinity
neginfinity
Komentarze
W Mad-Pascal do oznaczenia komentarza jednoliniowego służą znaki //
, dla wieloliniowego klamry { }
, lub (* *)
.
// to jest komentarz
inc(a); // to jest komentarz
(* komentarz *)
(*
komentarz
*)
{ to
jest
komentarz
}
Wyrażenia
Liczby
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
arytmetyczne
+ Addition
- Subtraction
* Multiplication
/ Division
DIV Integer division
MOD Remainder
bitowe
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
logiczne
NOT logical negation (unary)
AND logical and
OR logical or
XOR logical xor
relacji
= Equal
<> Not equal
< Less than
> Greater than
<= Less than or equal
>= Greater than or equal
Dyrektywy kompilatora
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.
WARUNKOWE
{$IFDEF label}
{$IFNDEF label}
{$ELSE}
{$ENDIF}
{$DEFINE label}
{$UNDEF label}
{$define test}
const
{$ifdef test}
a=1;
{$else}
a=2;
{$endif}
Z poziomu assemblera dostęp do zdefiniowanych etykiet $DEFINE
możliwy jest przez MAIN.@DEFINES.label
$BIN2CSV
Dołącza zawartość zewnętrznego pliku binarnego do kodu źródłowego, jako tekst CSV.
Na przykład, jeśli plik binarny zawiera bajty $1E, $1F, $20
, dyrektywa wygeneruje ciąg 30, 31, 32
.
Głównym zastosowaniem tej dyrektywy jest inicjalizacji tablic.
//Initialize with a binary content
AAA: array[3] of byte = ( {$BIN2CSV data.bin} );
AAA: array of byte = [ {$BIN2CSV data.bin} ];
$CODEALIGN
PROC
{$codealign proc = $100}
Dyrektywa $CODEALIGN PROC
pozwala wyrównać generowany kod wynikowy do VALUE
bajtów strony pamięci. Przed każdym blokiem PROCEDURE
, FUNCTION
wstawiany jest kod .ALIGN VALUE
. Aby wyłączyć wyrównywanie należy ustawić {$CODEALIGN PROC = 0}
LOOP
{$codealign loop = $100}
Dyrektywa $CODEALIGN LOOP
pozwala wyrównać generowany kod wynikowy do VALUE
bajtów strony pamięci. Przed każdą instrukcją iteracyjną FOR
, WHILE
, REPEAT
wstawiany jest kod .ALIGN VALUE
. Aby wyłączyć wyrównywanie należy ustawić {$CODEALIGN LOOP = 0}
LINK
{$codealign link = $100}
Dyrektywa $CODEALIGN LINK
pozwala wyrównać generowany kod wynikowy do VALUE
bajtów strony pamięci. Przed każdą dyrektywą {$LINK filename}
wstawiany jest kod .ALIGN VALUE
. Aby wyłączyć wyrównywanie należy ustawić {$CODEALIGN LINK = 0}
$DEFINE
BASICOFF
{$DEFINE BASICOFF}
Powoduje utworzenie dodatkowego bloku programu, realizującego wyłączenie BASIC-a.
ROMOFF
{$DEFINE ROMOFF}
Zyskujemy dostęp do pamięci pod ROM-em, $C000..$CFFF
, $D800..$FFFF
.
Zestaw znaków z ROM $E000..$E3FF
zostaje przepisany pod ten sam adres w RAM, zostaje zainstalowany handler przerwań NMI
, IRQ
. System operacyjny działa normalnie, można z poziomu ASM wywoływać procedury w nim zawarte poprzez makro m@call
.
UWAGA:
W przypadku umieszczenia programu ANTIC-a Display List pod ROM-em każde naciśnięcie klawisza będzie powodować wywołanie przerwania IRQ obsługującego klawiaturę.Program ANTIC-a będzie zakłócany poprzez przełączanie ROM - RAM, w przypadku gdy korzystamy z przerwania Display List-y (DLI) może dojść do uszkodzenia stosu i wyłożenia się systemu.
Umieszczenie zestawu znaków lub pamięci obrazu pod ROM będzie skutkować 'glitchami' w momencie naciskania klawiszy.
NOROMFONT
{$DEFINE NOROMFONT}
Uzupełnienie dla {$DEFINE ROMOFF}
, zapobiega przepisaniu zestawu znakowego z ROM do RAM
$ERROR
{$ERROR user_defined}
Wygenerowanie komunikatu z błędem ERROR
.
$EVAL
{$EVAL PAR1[,PAR2] ,"EXPRESSION"}
-
Oblicza wartość wyrażenia EXPRESSION dla zakresu:
0..PAR1-1
(jeśli podano tylkoPAR1
)0..PAR1-1 * 0..PAR2-1
(jeśli podanoPAR1
iPAR2
)
-
Parametry w wyrażeniu oznaczamy jako
:1
(dlaPAR1
) i:2
(dlaPAR2
). - W wyrażeniu można używać stałych występujących w programie.
- Dozwolone operatory: +, -, *, /, DIV, MOD, AND, SHL, SHR, OR, XOR, AND
- Dostępne funkcje matematyczne: PI, RND, SQRT, SQR, ARCTAN2, COS, SIN, TAN, EXP, LN, ABS, INT, POWER, ARCTAN
Głównym zastosowaniem tej dyrektywy jest inicjalizacji tablic.
mul_40: array of word = [ {$EVAL 192,":1*40"} ];
sqr : array of byte = [ {$eval WIDTH,200,"255/(sqrt(power(:1-WIDTH/2.5,2)*4+power(:2-HEIGHT/2-20,2))+5)*32.0" } ];
sinx: array of byte = [ {$eval 256, "(sin(:1/256.0*PI*2.0)*48+63)"} ];
cnt: array [0..39] of byte = ( {$eval 40,":1 and 15"} );
$F, $FASTMUL
{$fastmul page} // fastmul at page*256
{$f $70} // fastmul at $7000
Alternatywne procedury szybkiego mnożenia dla typu BYTE
SHORTINT
WORD
SMALLINT
SHORTREAL
. Procedury zajmują 2KB i są umieszczane od adresu PAGE*256.
$I+, $I-, IOCHECK
{$I+}
{$I-}
{i+} IOCHECK ON default
{i-} IOCHECK OFF
Dla {$i+}
w przypadku wystąpienia błędów transmisji I/O dla: 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 on
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.
$I, $INCLUDE
%DATE%
{$INCLUDE %DATE%}
{$I %DATE%}
Parametr %DATE%
pozwala dołączyć tekst z aktualną datą kompilacji.
%TIME%
{$INCLUDE %TIME%}
{$I %TIME%}
Parametr %TIME%
pozwala dołączyć tekst z aktualnym czasem kompilacji.
FILENAME
{$INCLUDE filename}
{$I filename}
Parametr FILENAME
pozwala dołączyć plik tekstowy.
$INFO
{$INFO user_defined}
Wygenerowanie komunikatu z informacją INFO
.
$LIBRARYPATH
{$LIBRARYPATH path1; path2; ...}
Dyrektywa $LIBRARYPATH
pozwala wskazać dodatkowe ścieżki poszukiwań modułów UNIT
zadeklarowanych przez USES
.
$LINK
{$LINK filename}
Dyrektywa {$link filename}
pozwala dołączyć i zintegrować z programem Mad Pascal-a kod i procedury zasemblowane w Mad Assembler-rze.
Więcej na temat łączenia assemblera z Mad Pascal-em w rozdziale Wstawki assemblera
$MACRO
{$MACRO ON}
{$MACRO OFF}
{$MACRO+}
{$MACRO-}
Dyrektywa {$macro }
włącza/wyłącza możliwość definiowania makr, jest wymagana przez FPC, w Mad-Pascal jest zachowana tylko w celu zgodności.
$OPTIMIZATION
LOOPUNROLL
{$OPTIMIZATION loopunroll}
Dyrektywa $OPTIMIZATION
z parametrem LOOPUNROLL
pozwala rozpętlać pętle FOR
(parametry takiej pętli muszą być stałymi):
{$OPTIMIZATION loopunroll}
for i:=0 to 11 do tab[i]:=i*2;
{$OPTIMIZATION noloopunroll}
NOLOOPUNROLL
{$OPTIMIZATION noloopunroll}
Parametr NOLOOPUNROLL
wyłącza rozpętlanie pętli FOR
.
$R, $RESOURCE
{$R filename}
{$RESOURCE filename}
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 12 typów zasobów RCTYPE
:
RCDATA
rclabel RCDATA 'filename'
rclabel RCDATA 'filename' OFFSET
Dowolny typ danych, możliwe jest podanie dodatkowego parametru określającego liczbę bajtów które mają zostać pominięte, przydatne kiedy chcemy usunąć nagłówek pliku XEX.
EXTMEM
rclabel EXTMEM 'filename'
Dowolny typ danych ładowany do pamięci dodatkowej PORTB, adres ładowania ustalany jest na podstawie RCLABEL
.
RCASM
rclabel RCASM 'filename'
Plik w assemblerze, który zostanie dołączony i zasemblowany pod wskazany adres RCLABEL
.
DOSFILE
rclabel DOSFILE 'filename'
Plik z nagłówkiem Atari DOS, adres ładowania takiego pliku powinien być identyczny jak RCLABEL
.
RELOC
rclabel RELOC 'filename'
Plik relokowalny w formacie Mad Assembler-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL
.
PP
rclabel PP 'filename'
Plik spakowany Power Packer-em, który zostanie załadowany pod wskazany adres RCLABEL
.
SAPR
rclabel SAPR 'filename'
Plik SAPR-LZSS, który zostanie załadowany pod wskazany adres RCLABEL
.
RMT
rclabel RMT 'filename'
Plik modułu Raster Music Tracker-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL
.
MPT
rclabel MPT 'filename'
Plik modułu Music ProTracker-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL
.
CMC
rclabel CMC 'filename'
Plik modułu Chaos Music Composer-a, plik zostanie poddany relokacji pod wskazany adres RCLABEL
.
RMTPLAY
rclabel RMTPLAY 'filename.feat' 0
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
SAPRPLAY
rclabel SAPRPLAY
Player SAPR-LZSS, który wymaga $C00 bajtów pamięci ($300 player, $900 bufory).
MPTPLAY
rclabel MPTPLAY
Player dla modułu MPT.
CMCPLAY
rclabel CMCPLAY
Player dla modułu CMC.
XBMP
rclabel XBMP 'filename' 0
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
$UNITPATH
{$UNITPATH path1; path2; ...}
Dyrektywa $UNITPATH
pozwala wskazać dodatkowe ścieżki poszukiwań modułów UNIT
zadeklarowanych przez USES
.
$WARNING
{$WARNING user_defined}
Wygenerowanie komunikatu z ostrzeżeniem WARNING
.