Pseudo rozkazy
IFT .IF expression
ELS .ELSE
ELI .ELSEIF expression
EIF .ENDIF
ERT ERT 'string' | ERT expression
label SET expression
label EXT type
label EQU expression
label = expression
OPT [bcfhlmorst][+-]
ORG [[expression]]address[,address2]
INS 'filename'["filename"][*][+-value][,+-ofset[,length]]
ICL 'filename'["filename"]
DTA [abfghltvmer](value1,value2...)[(value1,value2...)]
DTA [cd]'string'["string"]
RUN expression
INI expression
END .EN
SIN (centre,amp,size[,first,last])
COS (centre,amp,size[,first,last])
RND (min,max,length)
BLK None
X
BLK Dos
X
BLK Sparta
X
BLK Reloc
Main
|Extended
BLK Empty
X Main
|Extended
BLK Update
Symbols
BLK Update
External
BLK Update
Adress
BLK Update
New
X 'string'
Czyli w większości po staremu, chociaż parę zmian zaszło. W przypadku cudzysłowów można używać ' ' lub " ". Oba rodzaje cudzysłowów traktowane są jednakowo z wyjątkiem adresowania (dla ' ' zostanie wyliczona wartość ATASCII
znaku, dla " " zostanie wyliczona wartość INTERNAL
znaku).
BLK
BLK N[one] X - blok bez nagłówków, licznik programu ustawiany na X
BLK D[os] X - blok DOS-a z nagłówkiem $FFFF lub bez nagłówka gdy
poprzedni taki sam, licznik programu ustawiany na X
BLK S[parta] X - blok o stałych adresach ładowania z nagłówkiem $FFFA,
licznik programu ustawiany na X
BLK R[eloc] M[ain]|E[xtended] - blok relokowalny umieszczany w pamięci MAIN lub EXTENDED
BLK E[mpty] X M[ain]|E[xtended] - blok relokowalny rezerwujący X bajtów w pamięci MAIN lub EXTENDED
UWAGA: licznik programu jest natychmiastowo zwiększany o X bajtów
BLK U[pdate] S[ymbols] - blok aktualizujący w poprzednich blokach SPARTA lub
RELOC adresy symboli SDX
BLK U[pdate] E[xternal] - blok aktualizujący adresy etykiet external (nagłówek $FFEE)
UWAGA: nie dotyczy Sparta DOS X, jest to rozszerzenie MADS-a
BLK U[pdate] A[dress] - blok aktualizacji adresów w blokach RELOC
BLK U[pdate] N[ew] X 'string' - blok deklarujący nowy symbol 'string' w bloku RELOC
o adresie X. Gdy nazwa symbolu poprzedzona jest znakiem @,
a adres jest z pamięci podstawowej to taki symbol może być
wywoływany z command.com
Więcej informacji na temat bloków w plikach Sparta DOS X w rozdziale Budowa plików SPARTA DOS X oraz Programowanie SPARTA DOS X.
label SET expression
Pseudorozkaz SET
pozwala redefiniować etykietę, ma podobne działanie jak etykiety tymczasowe zaczynające się znakiem ?
, np.:
temp set 12
lda #temp
temp set 23
lda #temp
label SMB 'string'
Deklaracja etykiety jako symbolu SDX. Symbol może mieć maksymalnie długość 8-iu znaków. Dzięki temu po użyciu BLK UPDATE SYMBOLS
asembler wygeneruje poprawny blok aktualizacji symboli. Np:
pf smb 'PRINTF'
jsr pf
...
sprawi że po instrukcji JSR
system SDX wstawi adres symbolu.
UWAGA: Deklaracja ta nie jest przechodnia, to znaczy że poniższy przykład spowoduje błędy w czasie kompilacji:
cm smb 'COMTAB'
wp equ cm-1 (błąd !)
sta wp
Zamiast tego należy użyć:
cm smb 'COMTAB'
sta cm-1 (ok !)
UWAGA: Wszystkie deklaracje symboli należy użyć przed deklaracjami etykiet, jak i programem właściwym !
:repeat
:4 asl @
:2 dta a(*)
:256 dta #/8
ladr :4 dta l(line:1)
hadr :4 dta h(line:1)
Znak :
określa liczbę powtórzeń linii (w przypadku makr określa numer parametru pod warunkiem że wartość liczbowa zapisana została w systemie decymalnym). Liczba powtórzeń powinna być z zakresu <0..2147483647>
. W powtarzanej linii :repeat
możliwe jest skorzystanie z licznika pętli - znaku hash #
lub z parametru :1
.
Jeśli użyjemy znaku :
w makrze w znaczeniu liczby powtórzeń linii, np.:
.macro test
:2 lsr @
.endm
Wówczas dla w/w przykładu znak :
zostanie zinterpretowany jako drugi parametr makra. Aby zapobiec takiej interpretacji przez MADS, należy po znaku dwukropka :
umieścić znak który nic nie robi, np. znak plusa '+'.
.macro test
:+2 lsr @
.endm
Teraz znak dwukropka :
zostanie prawidłowo zinterpretowany jako :repeat
OPT
Pseudo rozkaz OPT
pozwala włączać/wyłączać dodatkowe opcje podczas asemblacji.
b+ bank sensitive on
b- bank sensitive off (default)
c+ włącza obsługę CPU 65816 (16bit)
c- włącza obsługę CPU 6502 (8bit) (default)
f+ plik wynikowy w postaci jednego bloku (przydatne dla carta)
f- plik wynikowy w postaci blokowej (default)
h+ zapisuje nagłówek pliku dla DOS (default)
h- nie zapisuje nagłówka pliku dla DOS
l+ zapisuje listing do pliku (LST)
l- nie zapisuje listingu (LST) (default)
m+ zapisuje całe makra w listingu
m- zapisuje w listingu tylko tą część makra która zostaje wykonana (default)
o+ zapisuje wynik asemblacji do pliku wynikowego (OBX) (default)
o- nie zapisuje wyniku asemblacji do pliku wynikowego (OBX)
r+ optymalizacja długości kodu dla MVA, MVX, MVY, MWA, MWX, MWY
r- bez optymalizacji długości kodu dla MVA, MVX, MVY, MWA, MWX, MWY (default)
s+ drukuje listing na ekranie
s- nie drukuje listingu na ekranie (default)
t+ track SEP REP on (CPU 65816)
t- track SEP REP off (CPU 65816) (default)
?+ etykiety ze znakiem '?' na początku są lokalne (styl MAE)
?- etykiety ze znakiem '?' na początku są tymczasowe (default)
OPT c+ c - l + s +
OPT h-
OPT o +
Wszystkie opcje OPT
możemy używać w dowolnym miejscu listingu, czyli np. możemy włączyć zapis listingu w linii 12, a w linii 20 wyłączyć itd., wówczas plik z listingiem będzie zawierał tylko linie 12..20.
Jeśli chcemy użyć trybów adresowania 65816, musimy o tym poinformować asembler przez OPT C+
.
Jeśli używamy CodeGenie lub NotePad++ możemy użyć OPT S+
, dzięki temu nie musimy przechodzić do pliku z listingiem, bo listing wydrukowany został w dolnym okienku (Output Bar).
ORG
Pseudo rozkaz ORG
ustawia nowy adres asemblacji, a więc i lokalizację zasemblowanych danych w pamięci RAM.
adr asembluj od adresu ADR, ustaw adres w nagłówku pliku na ADR
adr,adr2 asembluj od adresu ADR, ustaw adres w nagłówku pliku na ADR2
[b($ff,$fe)] zmień nagłówek na $FFFE (zostaną wygenerowane 2 bajty)
[$ff,$fe],adr zmień nagłówek na $FFFE, ustaw adres w nagłówku pliku na ADR
[$d0,$fe],adr,adr2 zmień nagłówek na $D0FE, asembluj od adresu ADR, ustaw adres w nagłówku pliku na ADR2
[a($FFFA)],adr nagłówek SpartaDOS $FAFF, ustaw adres w nagłówku pliku na ADR
opt h-
ORG [a($ffff),d'atari',c'ble',20,30,40],adr,adr2
Nawiasy kwadratowe [ ]
służą określeniu nowego nagłówka, który może być dowolnej długości. Pozostałe wartości za zamykającym nawiasem kwadratowym ]
, rozdzielone znakiem przecinka ,
oznaczają odpowiednio: adres asemblacji, adres w nagłówku pliku.
Przykład nagłówka dla pliku w postaci jednego bloku, asemblowanego od adresu $2000, w nagłówku podany adres początkowy i adres końcowy bloku.
opt h-f+
ORG [a(start), a(over-1)],$2000
start
nop
.ds 128
nop
over
INS 'filename'["filename"][*][+-value][,+-ofset[,length]]
Pseudo rozkaz INS
pozwala na dołączenie dodatkowego pliku binarnego. Dołączany plik nie musi znajdować się w tym samym katalogu co główny asemblowany plik. Wystarczy, że odpowiednio wskazaliśmy MADS-owi ścieżki poszukiwań za pomocą przełącznika /i
(patrz Przełączniki assemblera).
Dodatkowo można przeprowadzić na dołączanym pliku binarnym operacje:
* invers bajtów pliku binarnego
+-VALUE zwiększenie/zmniejszenie wartości bajtów pliku binarnego o wartość wyrażenia VALUE
+OFSET ominięcie OFSET bajtów z początku pliku binarnego (SEEK OFSET)
-OFSET odczyt pliku binarnego od jego końca (SEEK FileLength-OFSET)
LENGTH odczyt LENGTH bajtów pliku binarnego
Jeśli wartość LENGTH
nie została określona, domyślnie plik binarny zostanie odczytany aż do końca.
ICL 'filename'["filename"]
Pseudo rozkaz ICL
pozwala na dołączenie dodatkowego pliku źródłowego i jego asemblację. Dołączany plik nie musi znajdować się w tym samym katalogu co główny asemblowany plik. Wystarczy, że odpowiednio wskazaliśmy MADS-owi ścieżki poszukiwań za pomocą przełącznika /i
(patrz Przełączniki assemblera).
DTA
Pseudo rozkaz DTA
służy do definicji danych określonego typu. Jeśli typ nie został określony wówczas domyślnie zostanie ustawiony typ BYTE
(b).
b wartość typu BYTE
a wartość typu WORD
v wartość typu WORD, relokowalna
l młodszy bajt wartości (BYTE)
h starszy bajt wartości (BYTE)
m najstarszy bajt wartości LONG (24bit)
g najstarszy bajt wartości DWORD (32bit)
t wartość typu LONG (24bit)
e wartość typu LONG (24bit)
f wartość typu DWORD (32bit)
r wartość typu DWORD w odróconej kolejności (32 bit)
c ciąg znaków ATASCII ograniczony apostrofami '' lub "", znak * na końcu spowoduje
invers wartości ciągu, np. dta c'abecadlo'*
d ciąg znaków INTERNAL ograniczony apostrofami '' lub "", znak * na końcu spowoduje
invers wartości ciągu, np. dta d'abecadlo'*
dta 1 , 2, 4
dta a ($2320 ,$4444)
dta d'sasasa', 4,a ( 200 ), h($4000)
dta c 'file' , $9b
dta c'invers'*
SIN (centre,amp,size[,first,last])
centre is a number which is added to every sine value
amp is the sine amplitude
size is the sine period
first,last define range of values in the table. They are optional.
Default are 0,size-1.
dta a(sin(0,1000,256,0,63))
defines table of 64 words representing a quarter of sine with amplitude of 1000.
COS (centre,amp,size[,first,last])
centre is a number which is added to every cosine value
amp is the cosine amplitude
size is the cosine period
first,last define range of values in the table. They are optional.
Default are 0,size-1.
dta a(cos(0,1000,256,0,63))
defines table of 64 words representing a quarter of cosine with amplitude of 1000.
RND (min,max,length)
Ten pseudo rozkaz umożliwia wygenerowanie LENGTH losowych wartości z przedziału
dta b(rnd(0,33,256))
IFT, ELS, ELI, EIF
IFT .IF expression
ELS .ELSE
ELI .ELSEIF expression
EIF .ENDIF
W/w pseudo rozkazy i dyrektywy wpływają na przebieg asemblacji (można ich używać zamiennie).