Mad-Assembler
Mad-Assembler (MADS) jest cross-assemblerem MOS 6502/MOS 65C02/WDC 65816 autorstwa Tomazs Biela (tebe).
Najnowsze wydania dla systemu Windows są dostępne na Github. Wydania dla innych platform systemów operacyjnych są publikowane cyklicznie w ramach WUDSN IDE Tools.
Historia Zmian
2.1.6 - 2.1.7
- dodana obsługa zapisu wartości w systemie czwórkowym 0q0123
- nowy przełącznik '-xp Display warnings for unreferenced procedures'
- Sparta DOS X: Weak Symbol,
SMB^
- poprawione inicjalizowanie danych
STRUCT
przezSTRING
- poprawki dla
.LOCAL +label
- naprawiony błąd zapisu małych liczb
FLOAT (.FL)
, issue 8 - issue #10 fixed
- issue #18 fixed
- dodany komunikat ostrzeżenia w przypadku przekroczenia adresu
$FFFF
'Memory range has been exceeded' - poprawione generowanie kodu dla
LAX (Z,X)
- dodane etykiety automodyfikacji dla zasięgu globalnego
::
, np.
.local
lda temp:: #$00
.endl
lda #$aa
sta temp
2.1.5
- poprawione działanie
.UNDEF
,.IFDEF
- poprawione wykonywanie zagnieżdżonych pętli
.REPT
- dodana możliwość łączenia obszarów lokalnych,
.LOCAL +full_path_to_local
- dodanie kolorowania komunikatów konsoli
- etykiety automodyfikacji kodu, np.
lda label: #$40
2.1.3
- nowa dyrektywa
.RND
zwracająca wartość losową z zakresu0..255
- dodany komunikat ostrzeżenia 'Register A is changed' dla pseudo rozkazów
DEW
,DEL
,DED
- nowy przełącznik
-bc
'Branch condition test', powoduje wygenerowanie komunikatów ostrzeżenia w przypadku kiedy skok jest poza zakres lub przekracza stronę pamięci
2.1.0
- dodany komunikat ostrzeżenia 'Buggy indirect jump' w przypadku użycia rozkazu
JMP(ABS)
- dodana dyrektywa
.FILEEXISTS('filename')
zwracajaca1
gdy plik w podanej ścieżce istnieje,0
gdy nie istnieje - rozszerzony komunikat Value out of range (VALUE must be between X and Y)
2.0.9
.CBM 'text'
konwersja na znaki ekranowe Commodore C64- usunięty błąd kiedy procedura
.PROC
znajdująca się w bloku.LOCAL
nie została oznaczona jako 'do asemblacji' mimo tego że było do niej odwołanie z poziomu makra.MACRO
w bloku.LOCAL
- usunięty błąd, etykiety tymczasowe
?label
były oznaczane 'do relokacji'
2.0.8
- krótszy kod dla
#CYCLE
- poprawki dla
.BY
.WO
.HE
.SB
.CB
.FL
- dodano komunikat błędu 'Improper syntax' w przypadku użycia
.BY
.WO
.HE
.SB
.CB
.FL
w bloku.STRUCT
- dodane dyrektywy dla WDC 65816
.LONGA ON|OFF
.LONGI ON|OFF
- poprawione działanie śledzenia rozmiaru rejestrów WDC 65816 gdy
OPT T+
- added command line option
-fv:value
to set the memory fill value whenOPT F+
. - dodany przełącznik
-fv:value
pozwalający ustalić wartość wypełnienia pamięci gdyOPT F+
- dodana możliwość podania argumentu jako ciągu dwóch znaków (poprzednio tylko 1 znak) np.
lda #'AB'
,mwa #'XY' $80
2.0.7
- poprawione generowanie kodu wynikowego dla nielegali
DOP
iSHA
- dodane dyrektywy WDC 65816
.A8
.A16
.I8
.I16
.AI8
.IA8
.AI16
.IA16
pozwalające ustawić rozmiar rejestrówAXY
- dodane dyrektywy WDC 65816
.ASIZE
.ISIZE
zwracające aktualnie ustawiony rozmiar rejestrówAXY
- rozkaz
JMP
zmieniany jest naJML
WDC 65816 tylko gdy skok dotyczy innego64KB
banku niż obecny - dodany przełącznik
-ml:value
(margin-left property), który umożliwia zmianę lewego marginesu generowanego listingu w zakresie od32
do128
znaków
2.0.6
- poprawione parsowanie parametrów makra zapisanych przy pomocy etykiet
.macro test currentRow, previousRow
.print Tmp%%currentRowAllowed
.print Tmp%%previousRowAllowed
.endm
- poprawione alokowanie danych
.ARRAY
gdy nie ma określonego rozmiaru, lub jest to tablica inna niż jednowymiarowa - zwiększona liczba przebiegów dla
.PROC
, w pewnych warunkach dla parametruxa .reg
parametr był źle interpretowany - dodana dyrektywa
.DEFINE
pozwalająca definiować jedno liniowe makra (można definiować wielokrotnie w tym samym przebiegu)
.DEFINE macro_name expression
.DEFINE write .print %%1+%%2
write (5,12)
.DEFINE text .sb
text 'atari'
- dodana dyrektywa
.UNDEF macro_name
, usuwa definicję jedno liniowego makramacro_name
2.0.5
- tablice
.ARRAY
w bloku.PROC
są pomijane jeśli użyto przełącznik-x
Exclude unreferenced procedures - użycie
.ARRAY
w bloku.STRUCT
nie będzie generować już zer w pliku wynikowym - nowa dyrektywa
.XGET
, pozwalająca wczytać do bufora pamięci Mad Assembler plik i dodatkowo zmodyfikować jego bajty pod warunkiem że są różne od zera (przydatne dla VBXE)
2.0.4
- usunięty błąd powodujący błędny zapis bloku aktualizacji dla starszego bajtu adresu w bloku
.RELOC
.DB
.DW
usunięte.DBYTE
(MSB/LSB) odkłada słowo w odwrotnej kolejności (starszy/młodszy)- dodane dyrektywy
.WGET
WORD,.LGET
LONG,.DGET
DWORD - poprawione działanie makro rozkazków
ADW
iSBW
, np.:
adw (tmp),y #1 posx
adw (tmp),y ptr2 ptr4
2.0.2
- poprawione alokowanie danych dla
.SB [+<byte>],<bytes|string|char>
2.0.1
- poprawione alokowanie danych dla
.ARRAY
gdy typ większy od.BYTE
.SIZEOF
zwraca rozmiar dla wbudowanych typów.BYTE
.WORD
.LONG
.DWORD
- dodana relokowalna wersja playera MPT
examples\players\mpt_player_reloc.asm
- poprawione działanie dyrektywy
.DS
w blokach SDXblk sparta $xxx
które nie są relokowalne
1.9.8
- naprawione działanie rozkazów WDC 65816
PEA
PEI
PER
- dodana możliwość podania kodu dla
.RELOC
[.BYTE|WORD] [TYPE]
1.9.7
- dyrektywa
.DEF
definiuje etykiety o zasiegu lokalnym, jeśli poprzedzić ją znakiem:
to globalne - poprawki dla liczb zmiennoprzecinkowych
.FL
, poprawione kodowane zera, dokonywane zaokrąglenie do10
miejsc po przecinku - dla bloków Sparta DOS X
blk reloc
iblk empty
dodana możliwość określenia innego typu pamięci niż$00
(main),$02
(extended), np.:
blk reloc $40
- poprawka umożliwiająca użycie dyrektywy
.PRINT
poblk empty
- dodana możliwość definiowania wielowymiarowych tablic
.ARRAY
, np.:
.array scr [24][40]
[11][16] = "atari"
.enda
mva #"!" scr[11][22]
- dodana możliwość definiowania tablicy
.ARRAY
poprzez dyrektywę.DS
, np.:
tmp .ds .array [5][12][4] .word
- dodana możliwość definiowania tablicy
.ARRAY
poprzez pseudorozkazEQU
(=), np.:
fnt = $e000 .array [128] [8] .byte
- naprawione działanie makrorozkazu
ADW
w połączeniu z makrorozkazemSCC
itp. - poprawki dla
.REPT
, m.in. komentarz wieloliniowy/* */
jest teraz właściwie rozpoznawany
1.9.6
- poprawione działanie etykiet anonimowych dla mnemoników łączonych znakiem
:
, np.:
ldx #8
@ lda:cmp:req 20
dex
bne @-
- dodany pseudo rozkaz
COS
(centre,amp,size[,first,last])
generujący wartości dla funkcji cosinus - dodany komunikat błędu Improper syntax w przypadku użycia dyrektywy
.DS
w bloku.STRUCT
- naprawione działanie pseudo rozkazu
ORG
, np.:
opt h-
ORG [a($ffff),d'atari',c'ble',20,30,40],$8000,$a000
- addytywne bloki
.LOCAL
otrzymują kolejne adresy, poprzednio adres ustalany był na podstawie pierwszego wystąpienia takiego bloku - dodany komunikat ostrzeżenia w przypadku stworzenia kolejnego addytywnego bloku
.LOCAL
o tej samej nazwie Ambiguous label LOCAL_NAME - dodane mnemoniki
PER
(PEA rell),PEI
(PEA (zp)) dla WDC 65816 - dodane nowy typ danych M (najstarszy bajt LONG) i G (najstarszy bajt DWORD) dla pseudorozkazu
DTA
, np.:
dta m($44556677) ; -> $55
dta g($44556677) ; -> $44
- dyrektywa
.LEN
.SIZEOF
rozszerzona o obsługę danych alokowanych poprzezDTA STRUCT_NAME
, np.:
.STRUCT free_ptr_struct
prev .WORD
next .word
.ENDS
free_ptr_t dta free_ptr_struct [3]
.print .sizeof(free_ptr_t) ; free_ptr_struct [0..3] = 16 bytes
- zmiany dla operacji odczytu plików poprzez
ICL
,INS
itp. plik do odczytu/zapisu będzie poszukiwany najpierw w ścieżce, która prowadzi do obecnie otwartego pliku, następnie ze ścieżki z której został uruchomiony główny asemblowany plik i na końcu ze ścieżek podanych parametrem -i (additional include directories) - poprawione rozpoznawanie wielkości znaków gdy aktywowany jest przełącznik
-c
(char sensitive) dla struktur, np.:
.struct fcb
sEcbuf .byte
.ends
data dta fcb [1] (0)
lda data[0].sEcbuf
- rozszerzone działanie dyrektywy
.REPT
o możliwość jej zagnieżdżania np.:
.rept 2,#*2 ; 1 - $0000
; 2 - $0000
.print '1 - ',# ; 1 - $0001
; 2 - $0000
.rept :1 ; 2 - $0001
.print '2 - ',.r ; 2 - $0002
.endr ;
;
.endr
- krótsza wersja pętli
#WHILE
bez wyrażenia, pętla trwa dopókiLABEL <> 0
#while .word label
#end
1.9.5
- dodany pseudorozkaz
SET
pozwalający redefiniować etykietę, podobne działanie jak etykiety tymczasowe zaczynające się znakiem?
, np.:
temp set 12
lda #temp
temp set 23
lda #temp
- dodana możliwość wymuszenia trybu adresowania w stylu XASM
a:
iz:
, np.:
XASM MADS
lda a:0 lda.a 0
ldx z:0 lda.z 0
- dodana możliwość określenia nowego adresu relokacji kodu w stylu XASM
r:
, np.:
XASM MADS
org r:$40 org $40,*
- poprawione działanie parametru
-x
Exclude unreferenced procedures, zmienne.VAR
nie są alokowane gdy procedura jest nieużywana - rozszerzona składnia dla jednoliniowych pętli
:rept
, możliwe wykorzystanie licznika pętli jako parametru:1
lub%%1
, np.:
line0
line1
line2
line3
ladr1 :4 dta l(line:1)
hadr1 :4 dta h(line:1)
ladr2 :4 dta l(line%%1)
hadr2 :4 dta h(line%%1)
- dodany komunikat ostrzeżenia w przypadku użycia nielegalnych niestabilnych rozkazów 6502, np.
CIM
- dodany komunikat ostrzeżenia w przypadku użycia nielegalnych niestabilnych rozkazów 6502, np.
CIM
- dodana nowa funkcjonalność dla pseudorozkazów
RUN
iINI
, które teraz zachowują adres asemblacji, poprzednio przestawiały adres asemblacji na$2E0
(RUN),$2E2
(INI) - dodana obsługa etykiet anonimowych anonymous labels
@
@+[1..9]
(forward)@-[1..9]
(backward), w celu zapewnienia przejrzystości kodu ograniczone jest używania takich etykiet tylko dla skoków warunkowych oraz do 10 wystąpień w przód/tył, np.:
@ dex <------+---+
bne @+ --+ | |
stx $80 | | |
@ lda #0 <-+ | |
bne @- ------+ |
bne @-1 --------+
- rozszerzone działanie dyrektyw
#IF
i#WHILE
o zmienne deklarowane przez.VAR
, dotychczas wymagane było podanie typu zmiennej, np.:
.var temp .word
#if temp>#2100 ;Now
#end
#if .word temp>#2100 ;Before
#end
1.9.4
- dodana normalizacja ścieżek dla plików, tak aby działały pod Unixami, znaki
\
zamieniane są na/
- poprawione przekazywanie dyrektyw jako parametrów do procedur i makr, dyrektywy nie były rozpoznawane przy włączonym przełączniku
-c
(case sensitive) - poprawione działanie
.USE
.USING
- dodana informacja w postaci ostrzeżenia WARNING o etykiecie powodującej nieskończoną ilość przebiegów asemblacji INFINITE LOOP
- dodany zapis dwóch bajtów nagłówka
FF FF
dla pliku zawierającego blok o adresie ładowania$FFFF
- komentarze po mnemonikach nie wymagających argumentu zostaną potraktowane jako błąd, wyjątkiem jest łączenie rozkazów w stylu xasm poprzez znak
:
, np.:
pla $00 -> ERROR: Extra characters on line
pha:pla $00 -> OK
- rozszerzona składnia makr o możliwość używania parametrów w postaci nazw a nie tylko wartości numerycznych-decymalnych, np.:
.macro SetColor val,reg
lda :val
sta :reg
.endm
.macro SetColor2 (arg1, arg2)
lda #:arg1
sta :arg2
.endm
- naprawione definiowanie etykiet dla n/w sytuacji, pierwsza etykieta nie zostanie zignorowana
temp label = 100
1.9.3
- poprawione przetwarzanie bloków
.PROC
, które w pewnych okolicznościach mogły zostać pominięte podczas asemblacji - poprawiony zapis
BLK EMPTY
dla plików SDX jeśli zastosowaliśmy deklarację takiego bloku przez.DS
- poprawki dotyczące testowania końca linii
- dodane dyrektywy
.FILESIZE
,.SIZEOF
jako odpowiednik dotychczasowej dyrektywy.LEN
- rozszerzona składnia dla pól struktury
.STRUCT
, np.:
.struct name
.byte label0
.byte :5 label1
label2 .byte
label3 :2 .word
.ends
1.9.2
- możliwość określenia adresu dla
.ZPVAR = $XX
- usprawnione odwołania do etykiet wyliczeniowych
.ENUM
, np.enum_label(field0, field1)
- dodana możliwość generowania bloku dla symboli zewnętrznych BLK UPDATE EXTRN dla plików DOS-a, poprzednio tylko dla plików
.RELOC
, np.:
.extrn vbase .word
org $2000
lda #$80
sta vbase+$5d
blk update extrn
- dodany komunikat błędu Could not use NAME in this context w przypadku rozkazów odwołań do bloków
.MACRO
.ENUM
.STRUCT
- poprawiony błąd który uniemożliwiał użycie
EQU
w nazwie etykiety - dodana dyrektywa
.CB +byte,.....
, ostatni bajt ciągu znakowego zapisywany jest w inwersie - dodana obsługa segmentów poprzez dyrektywy
.SEGDEF
.SEGMENT
.ENDSEG
- dodana nowa dyrektywa
#CYCLE #N
generująca kod 6502 o zadanej liczbie cykliN
- dodana obsługa nielegalnych rozkazów 6502, przykład w pliku
.\examples\test6502_illegal.asm
- uaktualnione pliki konfiguracyjne dla Notepad++
..\syntax\Notepad++
- poprawiony zapis pliku
LST
- naprawiona alokacja pamięci dla zmiennych strukturalnych, rozszerzona składnia dla
.STRUCT
.struct LABEL
x,y,z .word // wiele zmiennych tego samego typu w jednej linii
.byte a,b
.ends
.enum type
a=1,b=2
.ende
.struct label2
x type
type y
.ends
1.9.0
- naprawiony zapis linii z komentarzem
/* */
do pliku listingu*.LST
, poprzednio takie linie nie były zapisywane - poprawka dla etykiet deklarowanych z linii komend
-d:label
, poprzednio takie etykiety widziane były tylko w pierwszym przebiegu - w przypadku addytywności bloków
.LOCAL
tylko pierwszy adres z takich bloków jest zapisywany - poprawki dotyczące parsowania makr, poprzednio etykiety zaczynające się od
END
mogły zostać zinterpretowane jako pseudo rozkazEND
- poprawka odczytu dla pustego pliku relokowalnego, poprzednio występował błąd Value out of range
- poprawki dla
.USING
.USE
1.8.8 - 1.8.9
- uaktualniony silnik duchów programowych
..\EXAMPLES\SPRITES\CHARS
o duchy 8x24 - w przypadku braku podania rozszerzenia pliku i braku istnienia takiego pliku dla
ICL 'filename'
zostanie domyślnie przyjęte rozszerzenie*.ASM
ICL 'filename.asm'
- poprawione działanie komentarzy
/* */
w blokach.MACRO
.REPT
- usunięty błąd uniemożliwiający poprawną asemblację bloku
#IF
#WHILE
dla wyrażeń łączonych przez.OR
.AND
- przełączniki w linii komend mogą być poprzedzone tylko znakiem
-
, poprzednio także/
jednak były problemy z działaniem tego znaku na MacOSX - poprawiony zakres działania dyrektywy
.USING
, dla aktualnej przestrzeni nazw i kolejnych zawierających się w tej przestrzeni nazw
1.8.6 - 1.8.7
- usprawnione rozpoznawanie komentarzy
/* */
w wyrażeniach - domyślny adres dla
.ZPVAR
ustawiony na$0080
, poprzednio$0000
- dodana nowa dyrektywa
.ELIF
jako krótszy odpowiednik dyrektywy.ELSEIF
- rozszerzone działanie dyrektywy
.LEN
o możliwość podania jako parametru nazwy pliku, zwracana jest wówczas długość takiego pliku - usprawnione działanie dyrektywy
.DEF
w wyrażeniach warunku.IF
.IFDEF
IFNDEF
1.8.5
- dodane makro relokujące moduły RMT
...\EXAMPLES\MSX\RMT_PLAYER_RELOCATOR\
- dodany test składni dla nie asemblowanych procedur .PROC gdy aktywny jest przełącznik
-x
Exclude unreferenced procedures - poprawione działanie przełącznika
-d:label[=value]
, podanie wartości dla etykiety jest teraz opcjonalne, domyślnie mads przypisze wartość 1 - dyrektywy
.DS
.ALIGN
nie spowodują alokacji zmiennych zdefiniowanych przez.VAR
- alokacja zmiennych
.VAR
przed nowym blokiemORG
nie nastąpi jeśli blokORG
znajduje się w bloku.LOCAL
lub.PROC
- poprawione łamanie wierszy znakiem
\
w ciągach ograniczonych nawiasami()
- usunięty błąd powodujący relokowanie adresu dla wyrażenia dyrektywy
.ERROR
ERT
- usunięte zauważone błędy przy parsowaniu parametrów linii komend
- usunięte zauważone błędy dotyczące optymalizacji długości kodu makro rozkazów
MVA
MWA
itp. - poprawiony kod realizujący zagnieżdżanie bloków
.PROC
- poprawiony kod realizujący działanie pseudo rozkazów warunku
IFT ELI ELS EIF
- dodany komunikat '#' is allowed only in repeated lines dla przypadków użycia licznika pętli
# (.R)
poza pętlą - usunięty błąd powodujący błędne alokowanie zmiennych zadeklarowanych przez dyrektywę
.VAR
podczas wykonywania makra - w celu ujednolicenia składni odwołania do etykiet typów wyliczeniowych możliwe są tylko poprzez znak kropki
.
, poprzednio także przez::
- możliwe krótsze odwołania do typów wyliczeniowych
enum_label(fields)
, np. :
.enum typ
val0 = 1
val1 = 5
val2 = 9
.ende
lda #typ(val0|val2) ; == "lda #typ.val0|typ.val2"
- rozszerzona składnia dyrektywy
.SAV
, np.:
.sav 'filename',offset,length
.sav 'filenema',length
.sav [offset] 'filename',offset2,length
.sav length
.sav offset,length
- rozszerzona składnia dyrektywy
.ARRAY
, w przypadku braku podania maksymalnego indeksu tablicy zostanie on obliczony na podstawie ilości wprowadzonych elementów, elementy można wprowadzać bez konieczności poprzedzenia ich indeksem [expression], np.:
.array temp .byte
1,4,6 ; [0..2] = 1,4,6
[12] = 9,3 ; [12..13] = 9,3
[5]:[8] = 10,16 ; [5..6] = 10,16 ; [8..9] = 10,16
0,0,\ ; [14..17] = 0,0,1,1
1,1
.enda ; 18 elementów, TEMP [0..17]
- dodana możliwość alokacji zmiennej typu strukturalnego przy pomocy dyrektyw
.VAR
.ZPVAR
, np.:
.struct Point
x .byte
y .byte
.ends
.var a,b,c Point
.zpvar Point f,g,i
- dodana możliwość alokacji zmiennej typu wyliczeniowego przy pomocy dyrektyw
.VAR
.ZPVAR
, np.:
.enum Boolean
false = 0
true = 1
.ende
.var test Boolean
.zpvar Boolean test
- dodana możliwość deklaracji pól struktury przy pomocy typów wyliczeniowych, np.:
.enum EState
DONE, DIRECTORY_SEARCH, INIT_LOADING, LOADING
.ende
.struct SLoader
m_file_start .word
m_file_length .word
m_state EState
.ends
1.8.3 - 1.8.4
- nowy silnik duchów programowych z minimalnymi wymaganiami pamięci, bez dodatkowych buforów pamięci obrazu
...EXAMPLES\SPRITES\CHARS_NG
- nowa wersja pakera Huffmana (kompatybilna z Free Pascal Compiler-em,
fpc -MDelphi sqz15.pas
) i dekompresora Huffmana SQZ15...EXAMPLES\COMPRESSION\SQUASH
- poprawiony kod generowany dla rozkazów
MVP
MVN
PEA
BRA
for WDC 65816 - dodane nowe rozkazy
BRL
JSL
JML
WDC 65816, jako odpowiedniki rozkazów długich skokówBRA
JSR
JMP
- blok aktualizacji etykiet zewnętrznych (external) został rozszerzony o zapis młodszego i starszego bajtu adresu takiej etykiety
- poprawione działanie dyrektywy
.USE
.USING
, działa niezależnie od przestrzeni nazw w której zostanie użyta - usunięty błąd, który powodował w pewnych sytuacjach pomijanie asemblacji bloku
#IF
#WHILE
- dodana możliwość definiowania zmiennych poprzez dyrektywę
.DS
lub pseudo rozkaz ORG przed blokiem.RELOC
- dodana dodatkowa forma składni dla dyrektywy
.VAR
, z tym że dla takiego przypadku nie ma możliwości określenia adresu umiejscowienia zmiennych w pamięci
.VAR .TYPE lab1 lab2 lab3 .TYPE lab4 .TYPE lab5 lab6 ...
.var .byte a,b,c .dword i j
- dodana możliwość definicji pojedyńczych zmiennych typu strukturalnego w krótszy sposób aniżeli dotąd przez
DTA
.struct @point
x .byte
y .byte
.ends
pointA @point ; pointA dta @point [0] <=> pointA dta @point
pointB @point ; pointB dta @point [0] <=> pointB dta @point
points dta @point [100]
- dodana nowa dyrektywa
.ZPVAR
umożliwiająca automatyczne przydzielenie miejsca zmiennym na stronie zerowej
.ZPVAR TYPE label1, label2 label3 = $80 ; LABEL1=$80, LABEL2=LABEL1+TYPE, LABEL3=LABEL2+TYPE
.ZPVAR label4, label5 TYPE ; LABEL4=LABEL3+TYPE, LABEL5=LABEL4+TYPE
.print .zpvar
- poprawione działanie dyrektywy
.ERROR
i pseudo rozkazuERT
, możliwe jest umieszczenie dodatkowych informacji w wierszu podobnie jak dla.PRINT
.ECHO
np.:
ERT *>$6000 , BUUU przekroczyliśmy zakres pamięci o ' , *-$6000 , ' bajtów'
- dodana możliwość zagnieżdżania bloków procedur .PROC, ten sam kod może być wywoływany z różnymi parametrami np.:
.proc copySrc (.word src+1) .var
.proc ToDst (.word src+1, dst+1) .var
.endp
ldy #0
src lda $ffff,y
dst sta $ffff,y
iny
bne src
rts
.endp
copySrc.ToDst #$a080 #$b000
copySrc #$a360
- dodane nowe dyrektywy
.ENUM
.ENDE
.EEND
.enum dni_tygodnia
poniedzialek = 1
wtorek, sroda = 5, czwartek = 7
piatek
sobota
niedziela
.ende
ift dzien==dni_tygodnia::wtorek
.print 'wtorek'
eif
- rozszerzona funkcjonalność komentarzy wieloliniowych
/* */
o możliwość umieszczania ich gdziekolwiek
lda #12+ /* komentarz */ 23
- umożliwiona relokacja adresów definiowanych dyrektywą
.DEF
.reloc
.def label=*
lda label
- dodana możliwość użycia znaków
{ }
do oznaczenia bloku (z wyjątkiem bloków.MACRO
), znak{
}
zostaje rozpoznany na początku nowego wiersza, np.:
#while .word ad+1<=#$bc40+39
{
ad sta $bc40
inw ad+1
}
.proc lab
{
.local temp2
{
}
.array tab [255] .long
{}
}
1.8.2
- zniesione ograniczenie długości pliku dla pseudo rozkazu
INS
(poprzednio długość wczytywanego pliku ograniczona była do 65536 bajtów) - dodany komunikat błędu The referenced label ... has not previously been defined properly w przypadku etykiet, które nie zostały zdefiniowane do końca, np. tylko w pierwszym przebiegu wartością nieokreśloną
- dodana nowa dyrektywa
.ECHO
jako odpowiednik dyrektywy .PRINT, dodatkowo informacje generowane przez.PRINT
.ECHO
zapisywane są teraz także w listingu*.LST
- dodana nowa dyrektywa
.ALIGN
pozwalająca na wyrównanie do zadanego zakresu pamięci, dodatkowo można określić wartość jaką wypełnić pamięć
[label] .ALIGN N[,fill]
- dodany nowy przełącznik
-U
(Warn of unused labels)
1.8.1
- rozszerzone działanie znaku backslash
\
, umieszczenie go na końcu wiersza oznacza kontynuację aktualnego wiersza od nowego wiersza, np.:
macro_temp \
_____________________________________parametr1_________________________________________________\
_____________________________________parametr2_________________________________________________\
_____________________________________parametr3_________________________________________________
lda\
#____________________________________label________________________________________\
+__________________________________expression___________________________________
- zmienione testowanie niekończącego wywoływania się makr po którym wystąpi błąd Infinite loop
- naprawiony zapis etykiet do pliku
*.LAB
, błąd powstał po dodaniu addytywności obszarówLOCAL
- poprawione działanie pseudo rozkazu
SIN
(kod zapożyczony z XASM) - poprawione rozpoznawanie dyrektyw przy włączonym przełączniku -C (Case sensitive)
- usprawniony odczyt bloków
.REPT
(wskazanie prawidłowej linii z błędem) i.MACRO
- zablokowane użycie
.VAR
w bloku.REPT
- umożliwione zagnieżdżanie oraz wielokrotne uruchamianie (poprzez makra) pętli
.REPT
:repeat
(poprzednio występował komunikat Use .REPT directive) - umożliwione przekazywanie parametrów do bloku .REPT, np.
.REPT 10, #
label:1 ; LABEL0, LABEL1, LABEL2 ... LABEL9
.ENDR
.REPT 5, $12,$33,$44,$55,$66
dta :1,:2,:3,:4,:5 ; $12,$33,$44,$55,$66
dta :5,:4,:3,:2,:1 ; $66,$55,$44,$33,$12
.ENDR
1.7.9 - 1.8.0
- poprawiony błąd w opisie przełącznika
-f
, poprzednio Label at first column, prawidłowy opis to CPU command at first column - przepisana od nowa obsługa dyrektywy
.DS
i opcjiOPT F+
(dodana możliwość użycia bloków RUN i INI) - przepisana od nowa obsługa opcji
OPT ?+
(etykiety lokalne w standardzie MAE) - dodana możliwość upublicznienia w blokach PUBLIC tablic zadeklarowanych przez .ARRAY oraz deklaracji struktur
.STRUCT
- dyrektywa generująca kod 6502 dla decyzji
.TEST
zastąpiona została przez dyrektywę#IF
, dyrektywa.ENDT
przez#END
, dodatkowo możliwe jest użycie dyrektywy#ELSE
np.:
# if .byte i>#8 .and .byte i<#200
# else
#if .word j = #12
#end
# end
- dyrektywa generująca kod 6502 dla iteracji
.WHILE
zastąpiona została przez dyrektywę#WHILE
, dyrektywa.ENDW
przez#END
, np.:
lda 20 -> lda 20
# while .byte @=20 -> wait cmp 20
# end -> sne
-> jmp wait
- dyrektywy
#IF
#WHILE
akceptują dwa dodatkowe operatory==
!=
- dodana dyrektywa
.EXITM
jako odpowiednik.EXIT
- dodana dyrektywa
.FI
jako odpowiednik.ENDIF
- dodana dyrektywa
.IFDEF
jako krótszy odpowiednik dyrektyw.IF
.DEF
- dodana dyrektywa
.IFNDEF
jako krótszy odpowiednik dyrektyw.IF
.NOT
.DEF
- umożliwione zostało definiowanie makr w obszarze procedury
.PROC
, podsumowując aktualnie dopuszczalne jest zdefiniowanie makra w obszarze.LOCAL
.PROC
- wystąpienie jakiegokolwiek ostrzeżenia podczas asemblacji nie zmieni kodu wyjścia (exit_code=0), zmiana podyktowana potrzebą kompatybilności z linuxowym makefile
- ujednolicony sposób deklaracji etykiet lokalnych i globalnych, "białe znaki" przed nazwą etykiety nie wymuszą zdefiniowania takiej etykiety jako globalnej, umożliwi to tylko dyrektywa
.DEF :LABEL
- poprawione makra
@CALL.MAC
@CALL_2.MAC
, zmienna tymczasowa globalna?@stack_offset
modyfikowana jest teraz przez dyrektywę.DEF
- rezygnacja z opcji
-E
(Eat White spaces), aktualnie jest ta opcja zawsze włączona - poprawione wyświetlanie numeru linii z błędem w aktualnie wykonywanym makrze
- skrócone nazwy etykiet tworzonych podczas wykonywania makr (łatwiejsza ich identyfikacja w pliku
*.LAB
) - poprawione działanie opcji
OPT H-
- dodane nowe makro rozkazy
INL
(increse LONG),IND
(increse DWORD),DEL
(decrese LONG),DED
(decrese DWORD) - dodane nowe makro rozkazy
CPB
(compare BYTE),CPW
(compare WORD),CPL
(compare LONG),CPD
(compare DWORD) - usprawnione i rozszerzone działanie dyrektyw
#TEST
#WHILE
w oparciu o kod generowany przez makro rozkazyCPB
CPW
CPL
CPD
, dyrektywy#TEST
#WHILE
dla wyrażeń=#0
<>#0
generują najkrótszy kod wynikowy - dodana optymalizacja długości generowanego kodu dla makro rozkazów
MWA
MWX
MWY
- dodana nowa opcja OPT R optymalizująca kod makro rozkazów
MWA
MWX
MWY
MVA
MVX
MVY
ze względu na zawartość rejestrów, np.:
opt r- opt r+
mva #0 $80 -> lda #$00 -> lda #0
mva #0 $81 -> sta $80 -> sta $80
lda #$00 -> sta $81
sta $81 ->
- rozszerzona funkcjonalność dyrektywy
.DEF
o możliwość przypisania wartości nowo deklarowanej etykiecie, np.:
.def label = 1
- rozszerzona funkcjonalność dyrektywy
.DEF
o możliwość zdefiniowania etykiety globalnej niezależnie od aktulnego obszaru lokalnego, np.:
.def :label
- umożliwiona została addytywność obszarów
.LOCAL
, tzn. może istnieć wiele obszarów lokalnych o tej samej nazwie, symbole zawarte w takich obszarach należeć będą do wspólnej przestrzeni nazw, np.:
.local namespace
.proc proc1
.endp
.endl
.local namespace
.proc proc2
.endp
.endl
1.7.8
- dodane dyrektywy
.MEND
.PGEND
.REND
jako odpowiedniki.ENDM
.ENDPG
.ENDR
- obecnie deklaracja makra musi kończyć się dyrektywą
.ENDM
lub.MEND
(poprzednio dopuszczalne było użycie dyrektywy.END
) - poprawiony sposób wykonywania makr dzięki czemu umożliwione zostało wykonanie dyrektywy
.ENDL
z poziomu wykonywanego makra - poprawione zauważone błędy dotyczące starszych bajtów relokowanego adresu oraz bloku aktualizacji symboli publicznych
- dodana nowa dyrektywa
.USING
.USE
pozwalająca określić ścieżkę poszukiwań dla nazw etykiet - poprawione działanie dyrektyw
.LOCAL
.DEF
, których błędne działanie objawiało się w szczególnych przypadkach - poprawione działanie makro rozkazów skoków (
SNE
RNE
itp.), których błędne działanie objawiało się w szczególnych przypadkach - rozszerzona składnia dyrektywy
.TEST
(kod 6502 dla warunku) o dowolną ilość wyrażeń połączonych przez.OR
lub.AND
(brak możliwości zmiany piorytetu wartościowania przy pomocy nawiasów), np.:
.test .byte k>#10+1 .or .word j>#100 .and .word j<#105 .or .byte k<=#5
...
...
.endt
- rozszerzona składnia dyrektywy
.WHILE
(kod 6502 dla pętli) o dowolną ilość wyrażeń połączonych przez.OR
lub.AND
(brak możliwości zmiany piorytetu wartościowania przy pomocy nawiasów), np.:
.while .byte k>#4 .and .byte k<#39
...
...
.endw
1.7.6 - 1.7.7
- dodany nowy przełącznik
-B:ADDRESS
umożliwiający asemblacje od zadanego adresu - dodany nowa opcja
OPT F+-
pozwalająca tworzyć bloki ciągłej pamięci (przydatne dla cartów) - dodana obsługa parametrów typu
.LONG
.DWORD
przekazywanych do procedur.PROC
typu.VAR
(poprzednio akceptowanymi typami parametrów był tylko.BYTE
.WORD
) - dodana nowa dyrektywa
.FL
realizująca zapis liczb rzeczywistychREAL
w formacie FP Atari, np.:
pi .fl 3.1415926535897932384626433832795 ; 40 03 14 15 92 65
tb .fl 0.5 12.34 -2.30 0.00002
tb .fl 0.5, 12.34, -2.30, 0.00002
- umożliwiony został zapis wartości innych typów niż tylko
.BYTE
w bloku.ARRAY
- dodana obsługa typów wielokrotnych dla
.STRUCT
, poprzednio takie typy były akceptowane jednak pamięć nie była właściwie dla nich rezerwowana, np.:
.struct test
x :200 .byte
y :999 .long
.ends
buf dta test [0]
- poprawione błędy dotyczące generowania kodu relokowalnego zauważone przez Laoo, np.:
.reloc
lda temp
temp .long $aabbcc
- błąd Addres relocation overload wystąpi teraz tylko gdy wyrażenie będzie dotyczyć więcej niż jednej etykiety relokowalnej, poprzednio każde wyrażenie z udziałem etykiety relokowalnej powodowało wyświetlenie tego komunikatu błędu
- blok aktualizacji symboli plublicznych rozszerzony został o możliwość przekazywania stałych różnych typów B-YTE, W-ORD, L-ONG, D-WORD, poprzednio przekazywanym typem był tylko W-ORD
- zmienione działanie dyrektywy
.VAR
w blokach.LOCAL
znajdujących się w bloku.PROC
, zmienne takie zawsze odkładane są na końcu bloku przed dyrektywą.ENDP
, w pozostałych przypadkach na końcu bloku.LOCAL
przed dyrektywą.ENDL
- umożliwiona została relokowalność kodu generowanego przez dyrektywy
.WHILE
.TEST
- poprawione działanie testowania wartości typu
.WORD
w kodzie generowanym przez dyrektywy.WHILE
.TEST
- dodana nowa dyrektywa
.ADR
zwracająca adres etykiety przed zmianą adresu asemblacji - dodana nowa dyrektywa
.LEN
zwracająca długość bloków zdefiniowanych przez.PROC
.ARRAY
- poprawione działanie operacji dzielenia, mnożenia i modulo, poprzednio błędnie był interpretowany piorytet dla tych operacji
- komentarze z końca linii nie poprzedzone znakiem komentarza będą powodować wystąpienie błędu Unexpected end of line
- dodana możliwość przypisania zmiennej pól zdefiniowanych przez strukture, np.:
@point .struct
x .byte
y .byte
.ends
a @point
b @point
c @point
- rozszerzona składnia
.STRUCT
o możliwość dodania nowych pól bez definiowania nazwy pola, np.:
.struct @id
id .word
.ends
.struct @mem
@id
adr .word
.ends
- rozszerzona składnia makro rozkazu
MWA
o możliwość użycia adresowania pośredniego strony zerowej postindeksowanegoY
, np.:
mwa ($80),y $a000,x
mwa $bc40,y ($f0),y
mwa ($80),y ($82),y
- rozszerzona składnia dyrektywy
.EXTRN
, obecnie możliwe jest zapowiedzenie większej ilości etykiet różnych typów w jednym wierszu, zapowiedzenie procedury.PROC
w takim wierszu musi znajdować się na jego końcu, np.:
.extrn a,b,c,d .byte x y z .word line .proc(.byte x,y) .reg
- rozszerzona składnia dyrektywy
.VAR
, obecnie możliwe jest zadeklarowanie większej ilości etykiet różnych typów w jednym wierszu oraz przypisanie im adresu od którego zostaną odłożone w pamięci, np.:
.var x y z .byte bit :2 .dword = $80
- rozszerzona składnia dla parametrów procedur przekazywanych przez zmienne
.VAR
, możliwe jest podanie przesunięcia np.:
move .proc (.word src+1,dst+1) .var
src lda $ffff
dst sta $ffff
.endp
- dodana nowa dyrektywa
.NOWARN
wyłączająca wyświetlenie ostrzeżenia dla aktualnie asemblowanego wiersza, np.:
.nowarn PROCNAME
- dodane nowe makro rozkazy
PHR
PLR
realizujące odkładanie i zdejmowanie wartości rejestrów z udziałem stosu sprzętowego, np.:
PHR -> PHA PLR -> PLA
TXA TAY
PHA PLA
TYA TAX
PHA PLA
- dodane nowe makro rozkazy
ADB
,SBB
realizujące dodawanie i odejmowanie wartości typu.BYTE
, np.:
ADB $80 #12 $b000 -> lda $80
clc
adc #12
sta $b000
SBB #200 $a000 -> lda #200
sec
sbc $a000
sta $a000
- dodana możliwość użycia składni C dla liczb szestnastkowych, np.:
lda 0x2000
ldx #0x12
temp = 0x8000
1.7.5
- dyrektywa
.DS
w blokach relokowalnych SDXRELOC
i MADSRELOC
deklaruje od teraz pusty blok - dodany nowy przełącznik -F, który umożliwia umieszczanie rozkazów CPU i pseudo rozkazów od pierwszej kolumny w wierszu
- przepisane od nowa procedury odczytu bloków
.MACRO
.REPT
oraz procedura realizująca dzielenie wiersza przy pomocy znaku\
- dodane nowe pseudo rozkazy
ADW
,SBW
realizujące dodawanie i odejmowanie wartości typuWORD
dla 6502, np.:
adw hlp #40 ; hlp=hlp+40
adw hlp #20 pom ; pom=hlp+20
- rozszerzone działanie dyrektywy
.DEF
o możliwość zdefiniowania etykiety, np.:.DEF label
- zwiększona liczba przebiegów dla deklaracji etykiet przez EQU dla pewnych szczególnych przypadków
1.7.4
- naprawione działanie dyrektywy
.PRINT
, dotąd mogła nie wyświetlić wartości etykiet zaczynającej się na literęA
B
C
D
E
F
G
H
L
T
V
- zablokowane działanie dyrektywy
.DS
w blokach.RELOC
SDX oraz naprawione jej działanie z instrukcją warunkową.IF
IFT
- usprawnione przeszukiwanie ścieżek dostępu
-i:path
(można odwoływać się do podkatalogów tam zawartych) - w przypadku wystąpienia błędów podczas asemblacji wyświetlane są one wszystkie a nie tylko pierwszy z błędów
- poprawione zauważone błędy, m.in. użycie makra w pliku
.RELO
C mogło spowodować w pewnych sytuacjach zapis błędnej informacji o relokownych adresach - uproszczony został sposób kończenia procedur wykorzystujących stos programowy MADS, nie ma potrzeby używania dyrektywy
.EXIT
, a dyrektywa.ENDP
nie powoduje już dodatkowych działań na stosie programowym - dodana nowa dyrektywa
.SYMBOL
jako odpowiednik bloku aktualizacjiBLK UPDATE NEW SYMBOL 'SYMBOL'
, dyrektywę.SYMBOL
można użyć w dowolnym miejscu programu - dodane automatyczne wywoływanie bloków aktualizacji
ADDRESS
EXTERNAL
PUBLIC
SYMBOL
dla.RELOC
i SDX - dodane nowe dyrektywy
.BY
.WO
.HE
.EN
.SB
(zapożyczone z MAE) - dodany nowy przełącznik
OPT ?-
(domyślnie) etykiety ze znakiem zapytania (?labels) traktowane są jako etykiety tymczasowe,OPT ?+
etykiety ze znakiem zapytania?labels
traktowane są jako lokalne i tymczasowe, nazwą obszaru lokalnego jest ostatnio użyta etykieta bez znaku zapytania - dodane dyrektywy
.LEND
.PEND
.AEND
.WEND
.TEND
.SEND
jako odpowiedniki dyrektyw.ENDL
.ENDP
.ENDW
ENDW
.ENDT
.ENDS
- dodane nowe dyrektywy
.GLOBAL
.GLOBL
jako odpowiednik (zamiennik) dyrektywy.PUBLIC
- dodana optymalizacja skoków warunkowych
JEQ
JNE
JPL
JMI
JCC
JCS
JVC
JVS
jeśli jest taka możliwość wybierany jest skok krótki typuBEQ
BNE
BPL
BMI
BCC
BCS
BVC
BVS
- dodany nowy domyślny separator znak spacji dla przekazywanych parametrów do
.PROC
.MACRO
dotąd był to tylko znak przecinka - usprawnienia dotyczące przekazywania parametrów do makr i procedur, np. paramatrem makra może być dyrektywa zwracająca wartość wyrażenia lub symbol licznika pętli
#
:12 makro #
- dodana możliwość użycia znaku spacji jako separatora dla
.VAR
.EXTRN
np.
.EXTRN a b c d .word
.VAR i = 1 j = 2 .byte
.VAR a b c d .byte
- rozszerzona składnia dla
.VAR
umożliwiająca zaincjowanie zmiennych stałą, np.:
.var i = 10 j = 12 .byte
.var a , b = 2 .byte
- dodane nowe dyrektywy
.WHILE
.ENDW
pozwalające na automatyczne wygenerowanie kodu dla pętliWHILE
, np.:
ldx #$ff
.while .word adr < #$bc40+40*24
stx $bc40
adr: equ *-2
inw adr
.endw
- dodane nowe dyrektywy
.TEST
.ENDT
pozwalające na automatyczne wygenerowanie kodu dla warunku, np.:
.test .byte (@>=#'a')
.test .byte (@<=#'z')
.endt
.endt
1.7.3
- dodana możliwość zmiany adresu asemblacji
.PROC
lub.LOCAL
bez zmiany adresu ładowania - usunięto optymalizację kodu dla makro rozkazów
MWA
itp., która mogła powodować w szczególnych przypadkach zapętlenie się MADS - dodane dyrektywy
.REG
.VAR
pozwalające określić sposób przekazywania parametrów do procedur (.REG
przez rejestry CPU,.VAR
przez zmienne) - dodana dyrektywa
.VAR
pozwalająca na deklarację zmiennych w blokach.PROC
.LOCAL
, zadeklarowane zmiennne są fizycznie odkładane na końcu takiego bloku - rozszerzona składnia dla dyrektywy
.EXTRN
, np.EXTRN label1,label2,label3... TYPE
- jesli brak deklaracji etykiet dla stosu programowego MADS, przyjmowane są domyślne wartości
@PROC_VARS_ADR=$0500
@STACK_ADDRESS=$0600
@STACK_POINTER=$FE
- dodany
repeat_counter #
, który można używać zamiennie z dyrektywą.R
- wystapi błąd ^ not relocatable przy próbie relokacji rozkazu
lda ^label
- dodana obsługa symboli publicznych dla stałych
CONSTANT
w blokachPUBLIC
- poprawiona relokowalnosc dla tablic
.ARRAY
, danych stworzonych przez.STRUCT
, parametrów przekazywanych do procedur przez stała#
1.7.2
- przepisana na nowo obsługa pseudo rozkazów
REQ
RNE
RPL
RMI
RCC
RCS
RVC
RVS
SEQ
SNE
SPL
SMI
SCC
SCS
SVC
SVS
- poprawione działanie dyrektywy
.LINK
dla bloków o stałych adresach - poprawione testowanie słów zarezerwowanych (można używać nazw zarezerwowanych dla WDC 65816 gdy używamy tylko 6502)
- zmiany w listingu, wyświetla informacje o numerze banku tylko gdy bank > 0
- dodana obsługa makro rozkazów
MWA
MWX
MWY
MVA
MVX
MVY
ADD
SUB
INW
DEW
(do ich obsługi nie są już potrzebne makra)
1.7.1
- dodana możliwość używania nazw mnemoników WDC 65816 w trybie pracy 6502, w trybie WDC 65816 wystąpi już błąd Reserved word
- poprawione działanie pseudo rozkazów skoków
SCC
RNE
itp. w makrach - usprawnione wykonywanie wielu makr rozdzielonych znakiem dwukropka
:
1.7.0
- usunięty błąd, który powodował zbyt mała liczbę przebiegów asemblacji
- dodana obsługa pseudo rozkazów
JEQ
JNE
JPL
JMI
JCC
JCS
JVC
JVS
(makra nie są już potrzebne do ich obsługi)
1.6.9
- rozszerzona składnia dla
.ARRAY
.PUT
- dodany pseudo rozkaz
EXT
pozwalający na deklaracje etykiety external - dodane makra
JEQ
JNE
JPL
JMI
JCC
JCS
- dodane dyrektywy
.PAGES
.ENDPG
- dodana dyrektywa
.END
zastepujaca inne dyrektywy.END?
- przełącznik
-H
zastąpiony został przez-HC
(generuje plik nagłówkowy dla CC65) - dodany nowy przełącznik
-HM
generujący plik nagłówkowy dla MADS z sortowaniem na etykiety typuCONSTANTS
VARIABLES
PROCEDURES
- dodana nowa dyrektywa
.RELOC
generująca kod relokowalny w formacie MADS
1.6.8
- dodana nowa dyrektywa
.PUT
oraz rozszerzona składnia dla dyrektywy.GET
(../EXAMPLES/MSX/MPT_PLAYER/MPT_RELOCATOR.MAC , ../EXAMPLES/MSX/TMC_PLAYER/TMC_RELOCATOR.MAC) - dodana obsługa pseudo rozkazów XASM
REQ
RNE
RPL
RMI
RCC
RCS
RVC
RVS
SEQ
SNE
SPL
SMI
SCC
SCS
SVC
SVS
- dodana możliwość łączenia dowolnej liczby znanych MADS mnemoników przy pomocy znaku
:
(styl XASM), np.:
lda:cmp:req 20
ldx:ldy:lda:iny label
1.6.6 - 1.6.7
- źródło MADS kompatybilne z Free Pascal Compiler, po kompilacji możliwe jest jego używanie na innych platformach systemowych, jak np. Linux, Mac OS, OS/2 itp.
- od teraz MADS sam dobiera odpowiednią liczbę przebiegów asemblacji, przełącznik
/3
nie jest już potrzebny - poprawiony i rozbudowany został mechanizm przekazywania parametrów do MADS (rozdział Przełączniki assemblera)
- poprawione zostało wywołanie makra w linii rozdzielanej znakiem
\
oraz usprawnione rozpoznawanie i wykonywanie linii rozdzielanych znakami\
- poprawiony błąd, w którym MADS mylił dyrektywę
.ENDM
z pseudorozkazemIFT
- poprawione działanie instrukcji warunkowych
.ELSEIF
.ELSE
- poprawione testowanie poprawności instrukcji warunkowych w makrach
- obsługa procedur
.PROC
została rozbudowana o nowe makra i mechanizmy, dzięki którym podobna jest w działaniu jak i łatwości użycia do procedur z języków wyższego poziomu - dla procedur
.PROC
z zadeklarowanymi parametrami potrzebna jest teraz dodatkowa deklaracja@PROC_VARS_ADR
- brak ograniczeń w liczbie parametrów przekazywanych do procedur, jedynym ograniczeniem jest dostępna pamięć
- dodany nowy przełącznik
/d:label=value
pozwalający zdefiniować nową etykietę MADS z poziomu linii poleceń - dodany nowy przełącznik
/x
Exclude unreferenced procedures pozwalający pominąć podczas asemblacji nie używane w programie procedury zadeklarowane dyrektywą.PROC
- nowa opcja
OPT T+
(track sep, rep) śledząca zmiany rozmiaru rejestrówA
X
Y
dokonywane przez rozkazySEP
,REP
WDC 65816 - nowe biblioteki w katalogu
..\EXAMPLES\LIBRARIES
- w deklaracji obszaru lokalnego
.LOCAL
nie jest wymagane podanie nazwy obszaru - nowe operatory
-=
+=
++
--
pozwalające zmniejszyć/zwiększyć wartość etykiety tymczasowej, np.:
?label -- -> ?label=?label-1
?lab ++ -> ?lab=?lab+1
?temp += 3 -> ?temp=?temp+3
?ofset -= 5 -> ?ofset=?ofset-5
- rozszerzona o znak przecinka składnia deklaracji parametrów procedur, np.:
.proc nazwa (.byte a,b,c .word d,e)
.endp