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.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 zakresu 0..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') zwracajaca 1 gdy plik w podanej ścieżce istnije, 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 when OPT F+.
  • dodany przełącznik -fv:value pozwalający ustalić wartość wypełnienia pamięci gdy OPT 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 i SHA
  • dodane dyrektywy WDC 65816 .A8 .A16 .I8 .I16 .AI8 .IA8 .AI16 .IA16 pozwalające ustawić rozmiar rejestrów AXY
  • dodane dyrektywy WDC 65816 .ASIZE .ISIZE zwracające aktualnie ustawiony rozmiar rejestrów AXY
  • rozkaz JMP zmieniany jest na JML WDC 65816 tylko gdy skok dotyczy innego 64KB banku niż obecny
  • dodany przełącznik -ml:value (margin-left property), który umożliwia zmianę lewego marginesu generowanego listingu w zakresie od 32 do 128 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 parametru xa .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 makra macro_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 MADS 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 i SBW, 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 SDX blk 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 do 10 miejsc po przecinku
  • dla bloków Sparta DOS X blk reloc i blk 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 po blk 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 pseudorozkaz EQU (=), np.:
fnt = $e000 .array [128] [8] .byte
  • naprawione działanie makrorozkazu ADW w połączeniu z makrorozkazem SCC 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 poprzez DTA 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óki LABEL <> 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: i z:, 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 i INI, 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 cykli N
  • 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 rozkaz END
  • 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 blokiem ORG nie nastąpi jeśli blok ORG 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ów BRA 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 rozkazu ERT, 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ów LOCAL
  • 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 opcji OPT 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 rozkazy CPB 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 rzeczywistych REAL 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 postindeksowanego Y, 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 SDX RELOC i MADS RELOC 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 typu WORD 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 .RELOC 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 aktualizacji BLK 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 typu BEQ 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ętli WHILE, 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 blokach PUBLIC
  • 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 typu CONSTANTS 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 pseudorozkazem IFT
  • 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ów A X Y dokonywane przez rozkazy SEP, 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