doubleclick[,] ff = new doubleclick[5, 1];

MAD-ASSEMBLER INSTRUCTIONS
MAD-ASSEMBLER 1.9.5
Tebe/Madteam (01.01.2013)
translated poorly to English by Phaeron using Google Translate (01.26.2013)
If your system can run a version of Free Pascal, you can use MADS.
XASM home page:
Run the installer, and select the folder in which you installed FP. It is important
not to use a directory name which contains '!' or other special characters, or
else you will not be able to compile any files, and it should probably not be a standard
path name. The command-line to start compilation could look like this (the case in the
parameter names is important):
fpc -Mdelphi -v mads.pas
compile in Delphi mode
show all errors and warnings
enable code optimization
Compared to the Delphi compiler, FPC generates bigger code,
but the speed of the compiled MADS is much faster, even by a few seconds.
The included MADS.EXE is compiled using FPC.
psuedo-command specifies
an assembly address).
The -c switch causes label, variable, and constant names to be treated as
case-sensitive. Assembler directives and
CPU instructions are always recognized
regardless of case.
-d:label=value
Use the -d switch to define a new label in MADS memory from
the command-line. This switch can be used multiple times in a single invocation of MADS,
which is useful when assembling from a batch file (BAT).
Use -f to allow CPU instructions to be recognized in the first column instead of
just labels.
-hc[:filename]
The switch -hc saves a header file for the CC65 compiler.
It also lets you specify a new name for the file. The default extension for the CC65
header file is *.H.
-hm[:filename]
The switch -hm saves a header file for MADS. It also lets you specify
a new name for the file. The default extension for the MADS is *.HEA.
Such a file contains information about the banks and values assigned to labels. Additionally,
the labels are grouped by their types: CONSTANTS, VARIABLES, PROCEDURES.
The -i switch is used to set the search path for ICL and INS.
This switch can be use multiple times in the same command line to MADS, i.e.:
-i:"c:\program files" -i:c:\temp -i:"d:\atari project"
-l:filename
The -l switch enables writing of a listing file. It also lets you specify a new name for the file.
-m:filename
The -m switch specifies a file with macro definitions, which MADS
assembles before the main .ASM file.
-o:filename
The -o switch specifies a new name for the
Atari DOS or SpartaDOS X executable file, which is created at the end of assembly.
The -p switch is useful in conjunction with Code Genie.
When an error occurs during assembly, MADS generated error messages will appear in the
Output Bar of Code Genie:
D:\!Delphi\Masm\test.asm (29) ERROR: Missing .PROC
Now just double-click the message line, and the cursor in the editor will move to the line with the error.
Use the -s switch to activate the so-called 'Silent mode', where no messages will be displayed,
only errors (ERROR) and warnings (WARNING).
-t[:filename]
The -t switch writes a file with referenced label definitions. It also lets you specify an
alternate name for the file.
-x skips assembly of unreferenced procedures defined with the .PROC directive.
-vu enables verification of code inside procedures even if they are not emitted, usually used in conjunction with -x.
-u lists unreferenced labels in the program.
4 = 01,9033
picture equ $9033
5 = 01,00A0
scr1 equ $a0
8 01,2000 EA
The purpose of macro commands is to save time when writing programs and to shorten listings. Macro
commands replace commonly used groups of instructions.
[.IF] expression
[.ELSEIF] expression
ERT 'string'["string"] | ERT expression
label EQU expression
expression
expression
[bcfhlmorst][+-]
[[expression]]address[,address2]
'filename'["filename"][*][+-value][,+-ofset[,length]]
'filename'["filename"]
[abfghltv](value1,value2...)[(value1,value2...)]
DTA [cd]'string'["string"]
RUN expression
INI expression
(centre,amp,size[,first,last])
(min,max,length)
S[parta] X
R[eloc] M[ain]|E[xtended]
E[mpty] X M[ain]|E[xtended]
U[pdate] S[ymbols]
U[pdate] E[xternal]
U[pdate] A[dress]
U[pdate] N[ew] X 'string'
#expression
These are mostly the same, although there are some differences with quoted strings.
Both ' ' and " " are treated the same except in operands, where
'' gives the ATASCII code of a character, and "" gives the INTERNAL code.
Additionally, you can perform the following operations on the binary data:
invert bytes
increase or decrease each byte by the value of the expression VALUE
skip OFSET bytes at the beginning of the file
(seek to OFSET)
read OFSET bytes at the end of the file
(seek to FileLength-OFSET)
read LENGTH bytes from the file
If the LENGTH value is not specified, the default behavior is to read to the end.
label index type [= default_value]
label [= expression]
[ERT] 'string'["string"] lub .ERROR [ERT] expression
label [,label2,...] type
[IFT] expression
[ELI] expression
'filename'
[.ECHO] 'string1','string2'...,value1,value2,...
[expression]
label [,label2,...]
expression [,parameter1, parameter2, ...]
[.BYTE|.WORD]
label address length [bank]
proc_name, local_name
var1[=value],var2[=value]... (.BYTE|.WORD|.LONG|.DWORD)
var1, var2... (.BYTE|.WORD|.LONG|.DWORD)
(expression)
(expression)
expression
[+byte] bytes and/or ASCII
[+byte] bytes and/or ASCII
[+byte] bytes and/or ASCII
floating point numbers
[index] 'filename'["filename"][*][+-value][,+-ofset[,length]]
[index] = value
[index] ['filename',] length
except that a block is repeated instead of a single line. The beginning of the block is defined
with the .REPT directive, which is followed by a repeat count in the range
&0..& and then optional parameters. Unlike macro parameters, the
parameters to .REPT are always calculated first and the result is substituted immediately (this
feature can be used to define new labels). The parameters specified in the .REPT block are used
like parameters to a .MACRO block. A .REPT block is ended using the .ENDR directive,
before which there should be no label.
Additionally, within a .REPT....ENDR block, the hash sign '#' (or directive .R)
gives the current value of the loop counter (like for :repeat).
.rept 12, #*2, #*3 a .REPT block can be combined with :rept
:+4 dta :1 :+4 to distinguish from repeat block parameter :4
:+4 dta :2
.rept 9, # define 9 labels label0..label8
label:1 mva #0 $d012+#
[ERT] 'string'["string"] | .ERROR [ERT] expression
The directive .ERROR and pseudo-command ERT are equivalent and
stop assembly, displaying a message given as a parameter delimited by ' ' or " ".
If the parameter is a boolean expression, then assembly will stop when the expression is true (with User error):
ert "halt" ERROR: halt
.error "halt"
ert *>$7 ERROR: User error
.error *>$7fff
type expression [.OR type expression] [.AND type expression]
type expression [.OR type expression] [.AND type expression]
Another way to force zero page addressing is to use curly braces { }:
dta {lda $00},$80 lda $80
Either will work with MADS, but the last pass will do the trick for us. :) The next problem is
putting this code on your computer. Loading directly into page zero will probably work if the
target area is within $80..$FF, but below that the OS is unlikely to survive.
Therefore, MADS allows the following:
org $20,$3080
tmp lda #$00
This assembles at address $0020, but with a load address of $3080. Of course, moving
the code to the correct address ($0020 in our example) is now the responsibility of the programmer.
In summary:
org adres1,adres2
Assembles at adres1, but loads to address adres2. The ORG
will always create a new block in the file, which adds an additional four bytes for the header of
the new block.
If it is OK for the new address of the data in memory to be the current address, then
the property of .LOCAL and .PROC blocks can be used to avoid writing a new header:
4 FFFF> D> A9 00
.local temp, $60
9 0060 BD FF FF
lda $ffff,x
10 0063 BE FF FF
ldx $ffff,y
15 200B AD 03 20
lda .adr temp
In this example the block TEMP will assemble with the new address = $60
and be placed in memory at address $2003. After the block end directive (.ENDL, .ENDP, .END),
assembly will resume at the previous assembly address plus the length of the block,
which in this case is
The directives .ADR and .LEN can then be used to copy the block to the correct address:
mva .adr(temp),y temp,y+
cpy #.len temp
For more information on the directives, see
To access labels within a procedure from outside of it, address it using a dot ('.'):
lda test.pole
.proc test
If a referenced label is not found within a .PROC procedure, MADS will then
look for in enclosing scopes until the global scope is reached. To directly address a global label
from within a .PROC procedure (or any other scope) prefix the label name with a colon (':').
For procedures that use a software stack, MADS requires three specific globally defined labels
(the stack location, the stack pointer, and the address of the procedure variables):
@PROC_VARS_ADR
@STACK_ADDRESS
@STACK_POINTER
If these labels are undefined and a ..PROC procedure with a software stack is used,
MADS assumes the following default values: @PROC_VARS_ADR = $0500, @STACK_ADDRESS = $0600,
and @STACK_POINTER = $FE.
For procedures using a software stack, MADS also requires the declaration of macros with
specific names. Declarations of these macros are included with MADS in the following files:
..\EXAMPLES\MACROS\@CALL.MAC
..\EXAMPLES\MACROS\@CALL.MAC
..\EXAMPLES\MACROS\@PULL.MAC
..\EXAMPLES\MACROS\@EXIT.MAC
These macros implement the loading and pushing of parameters onto the software stack, the popping
and saving of procedure parameters off the software stack, and calling other procedures using
the software stack.
Parameters passed using the accumulator ('@') should always be the first parameter
passed to the procedure. If it is used elsewhere, the accumulator is already modiied by that
point (this restriction is imposed by the @CALL macro). Of course, this can be
lifted with a custom version of the @CALL macro.
With procedures that use .REG or .VAR, a '@' parameter can be used in any position.
The end of a .PROC procedure is marked by an RTS. After the procedure call,
MADS invokes the @EXIT macro to modify the @STACK_POINTER, which is necessary
for proper operation of the software stack. The number of bytes passed to the procedure is passed
as a parameter to the macro, which then subtracts that number of bytes from the software stack.
(Editor's note: This is known as a caller-pops convention, since the caller both pushes and pops
the parameters off the stack, and is common in C implementations.)
Adding an RTS instruction at the end of every code path in the procedure is the responsibility
of the programmer, and not the assembler.
If the assembler cannot find a label within a .LOCAL area, MADS will then look
in the global scope. To refer to global labels directly from a .LOCAL area, prefix
the label name with a colon (':').
An example of defining global labels:
lab2 equ $4000
?tmp += 40
.proc name
.def :?nazwa
.def :nazwa=20
.local lok1
.def :@?nazw
Examples of defining a global temporary labels include the macro @CALL
(in ..\EXAMPLES\MACROS\@CALL.MAC), which defines the temporary label
?@STACK_OFFSET. This is later used by other macros called
called by the macro @CALL, and is used to optimize access to
parameters on the stack.
@CALL .macro
.def ?@stack_offset = 0 definition of temporary global lavel ?@stack_offset
@CALL_@ .macro
sta @stack_address+?@stack_offset,x
.def ?@stack_offset = ?@stack_offset + 1 modify ?@stack_offset label
) or global scope
A temporary label is created by placing a '?' at the beginning:
Temporary labels should not be used to name procedures (.PROC), macros
(.MACRO), local scopes (.LOCAL), structures (.STRUCT),
or arrays (.ARRAY).
A temporary label is defined using one of the following equivalent pseudo commands:
Additionally, they can be modified using recognizable C operators:
-= expression
+= expression
These assignment operators only work with temporary labels, and attempting to
use them for other types of labels results in a Improper syntax
error message.
Examples of using temporary labels:
?loc = $567
?loc2 = ?loc+$2000
?loc = $123
An example of using MAE-style temporary labels:
local1 ldx #7
sta $a000,x
local2 ldx #7
sta $b000,x
A basic limitation of SDX relocatable code is that only WORD addresses are relocated
and there is no support for 65816 code. MADS provides the ability to generate code
both in SDX format and in a non-SDX format that removes the aforementioned limitations.
The MADS relocatable code format is similar to that of SDX, as there are main blocks
and then blocks with additional address relocation information. MADS uses a simpler
update block format, without the "compression" used by SDX.
At the end of a .RELOC block it is necessary to generate an update block, using the
same BLK syntax for SDX relocatable blocks ("BLK UPDATE ADDRESS"). The
encoding format for this block is different than for SDX and is as follows:
WORD ($FFEF)
CHAR (B-YTE, W-ORD, L-ONG, D-WORD, &, &)
DATA_LENGTH
WORD [BYTE]
always set to $FFEF
data type is stored in bits 0..6 and specifies the type of addresses to update,
where "&" means the lower address byte and "&" means the upper address byte.
DATA_LENGTH
number of 2-byte data items (addresses) to modify
offsets for updating the relocatable block, where at each address a value of type TYPE is read and then updated to the final address
The exception is an update block for address high bytes "&", where for such a block
an extra BYTE is stored for each address (low byte of address being modified). To
adjust the high bytes, the high byte has to be read from the WORD address in the DATA,
added to the current relocation address, and then added to the low byte in the BYTE field of the DATA.
The newly calculated byte is then store back at the WORD address in the DATA.
During the assembly process, references to external symbols are replaced with the value zero.
External symbols can be useful when assembling part of a program separately from the rest of it.
In this case, there are often references to other procedures and variables are defined
elsewhere, and only the type and not value are known. With the help of external symbols, such
a program can be assembled without the full procedure and variable definitions.
Another use for external symbols is for "plugins", or external programs connected to the
main program to add additional functionality. These are types of libraries, using the
procedures of the main program and expanding its capabilities. Creating such a plugin
requires determining what procedures the main program provides (their name + parameters
and type), and a procedure to read the file from the external symbols, which then
attaches the plugins to the main program.
The following is the format of the file header produced by BLK UPDATE EXTERNAL
for external symbols of type B-YTE, W-ORD, L-ONG, and D-WORD:
WORD ($FFEE)
CHAR (B-YTE, W-ORD, L-ONG, D-WORD, &, &)
DATA_LENGTH
LABEL_LENGTH
LABEL_NAME
WORD .. .. ..
always set to $FFEE
bits 0..6 contain the type of data to modify
DATA_LENGTH
number of 2-byte data items (addresses) to modify
LABEL_LENGTH
symbol name length in bytes
LABEL_NAME
the symbol name, coded in ATASCII
offset data for the relocation process. At each indicated address here, the value of type TYPE is read and then based on the actual value of the symbol.
The .LINK directive allows linking of relocatable and non-relocatable code. MADS automatically
relocates the file based on all three types of update blocks (ADDRESS, EXTERNAL, PUBLIC).
There is no limit to the address at which a file can be relocated.
If a block being relocated requires the MADS software stack, the labels @STACK_POINTER,
@STACK_ADDRESS, and @PROC_VARS_ADR are automatically updated based on the .RELOC block header.
It is necessary that the main program and the .RELOC blocks operate on the same software stack.
The program is able to detect the presence of the following microprocessors: 6502, 65C02, and 65816.
How to detect on which CPU the assembler code is running
(This information is from Draco, the author of SYSINFO 2.0)
You can test on plain 6502-Code if there is a 65c816 CPU, the 16-Bit processor avaible
in some XLs as a turbo-board, avaible. Draco told me how to do this:
First we make sure, whether we are running on NMOS-CPU (6502) or CMOS (65c02,65c816).
I will just show the "official" way which doesn`t uses "illegal opcodes":
beq DetectCPU_CMOS
DetectCPU_02
ldx #_6502
DetectCPU_CMOS
;reset Z bit
bne DetectCPU_C816
DetectCPU_C02
ldx #_65c02
DetectCPU_C816
ldx _65816
dta c'6502',$9b
dta c'65c02',$9b
dta c'65816',$9b
The next CPU detection example is limited to distinguishing a 6502 from a 65816
microprocessor. The program instructions are read differently by a 6502 than by a 65816.
A 6502 executes 'inc @' and a 'nop' instead of 'xba' followed by 'sbc #'.
With this "transparency" we can be assured that the program does not perform illegal operations and
correctly recognizes the correct CPU. The idea for this concise and very clever test comes from
Ullrich von Bassewitz.
opt c+ 65816 enabled
inc @ increment accumulator
bcc cpu6502
; ultimate test for 65816 presence
put $01 in B accu
dec @ A=$00 if 65C02
get $01 back if 65816
inc @ make $01/$02
bne cpu6502
ldx &text65816
ldy &text65816
ldx &text6502
ldy &text6502
dta c'6502',$9b
text65816 dta c'65816',$9b
but by default they are interpreted as virtual banks (option OPT B-, ).
The following pseudo commands apply to banks:
LMB #value
LMB # (Load Memory Bank)
Sets the MADS bank counter to a value in the range &$00..$FF& (BANK = value):
lmb #5 , $6500 only with OPT B+
NMB (Next Memory Bank)
Increments the MADS bank counter (BANK = BANK + 1).
$6500 only with OPT B+
RMB (Reset Memory Bank)
Resets the MADS bank counter (BANK = 0).
rmb $3500 only with OPT B+
rmb $8500 only with OPT B+
During assembly, MADS assigns the current bank counter value to each newly defined
label. The programmer can affect the value of the bank counter through pseudo commands.
Labels assigned with the MADS bank counter =0 are global.
Labels assigned with the MADS bank counter &0 are local.
Virtual memory banks (OPT B-)
In MADS, the term "virtual memory bank" refers to any area designated by a newly defined
label set to the current value of the bank counter (the default bank counter is zero). That is,
a virtual memory bank is not necessary a memory area in the range &$4000..$7FFF&,
but each label presents a code area of the program which has been assigned a code (bank counter value)
in the range &$00..$FF& with appropriate pseudo-commands for use by the programmer
(NMB, RMB, LMB).
The exceptions are .RELOC blocks, where the bank counter cannot be changed manually and is
automatically updated by MADS, incrementing it for each instance of the .RELOC directive.
Bank counter values are in the range &$0001..$FFF7&.
The programmer can read the bank counter value associated with a label using the equal operator '=':
ldx #=label
In this example, the X CPU register is set to the bank counter value associated
by MADS with the label LABEL.
Another useful operator is the colon (':') placed at the beginning of the label name,
which causes MADS to allow references to labels outside of the area specified by the
current MADS bank counter. Sometimes this may cause problems, such as if
there is more than one label with the same name in different local scopes or in areas with
a different virtual bank number.
lda :label5
In this example, without the operator ':' at the beginning of the label name in the instruction
'lda :label5' the error ERROR: Undeclared label LABEL5 (BANK=6) would result.
Virtual memory banks can be used to index an array containing values for the PORTB register.
This is the main use of the option OPT B+.
Hardware memory banks (OPT B+)
This mode of operation can be called "bank sensitive".
Hardware banks are an extension of virtual memory banks and are understood by MADS
as expanded memory banks in the range &$4000..$7FFF&. The pseudo commands NMB, RMB, and LMB
are extended to call the macro @BANK_ADD, which can be found in ..\EXAMPLES\MACROS\.
In this mode of operation, MADS requires the definitions for the following macros:
and requires label definitions with the names:
@TAB_MEM_BANKS
@PROC_ADD_BANK
The @TAB_MEM_BANKS label specifies the address of an array with values to
write to the PORTB register for switching extended memory banks. You can take advantage
of pre-written expanded memory bank detection routines included with MADS, in ..\EXAMPLES\PROCEDURES\@MEM_DETECT.ASM.
The label @PROC_ADD_BANK is used by the macro @BANK_ADD and defines
the address of the code for switching extended memory banks.
The programmer can read the bank counter value associated with a label using the '=' operator:
ldy #=label
In this example, the Y register is set to the memory bank value associated with the
label LABEL by MADS.
If the MADS bank counter = 0:
program code must be placed outside of &$4000..$7FFF&
newly defined labels in this area are global
all defined labels can be accessed without limitation, regardless of bank number
jumping into a bank is possible using the macro @BANK_JMP (..\EXAMPLES\MACROS\@BANK_JMP.MAC); the parameter
for this macro does not have to be preceded by the ':' operator
If the MADS bank counter & 0:
program code must be within &$4000..$7FFF&
newly defined labels in this area are local
only global labels and labels within the current bank can be accessed
the pseudo-commands LMB and NMB will call the macro @BANK_ADD, which creates a new
bank with the MADS extended memory bank counter and sets a new assembly address (defaults to $4000)
the pseudo-command RMB resets the MADS memory bank counter and sets a new assembly address outside of the bank (defaults to $8000)
jumping to another bank is possible using the macro @BANK_JMP (..\EXAMPLES\MACROS\@BANK_JMP); the parameter
for this macro does not have to be preceded by the ':' operator
An example of the use of MADS bank sensitive mode can be found in the file ..\EXAMPLES\XMS_BANKS.ASM.
In this example, the program code is located in two different extended memory banks and runs as if it
were a single program.
- added pseudo-command SET to redefine labels, with a similar effect as temporary labels that begin with '?', e.g.:
temp set 12
temp set 23
- added ability to force addressing mode in XASM-style ('a:', 'z:'):
- added ability to specify a new code relocation address in XASM-style ('r:'):
- improved performance of '-x Exclude unreferenced procedures' .VAR variables are not allocated for unused procedures
- extended single-line syntax for :rept loops so that the loop counter can now be used as a parameter :1 (%%1):
ladr :4 dta l(line:1)
hadr :4 dta h(line:1)
- added a warning message when unstable illegal 6502 opcodes are used, i.e. CIM
- added new functionality to pseudo-opcodes RUN and INI to retain the previous assembly address when assembling to $2E0 (RUN), $2E2 (INI)
- added support for anonymous labels @, @+[1..9] (forward), @-[1..9] (backward); for clarity, their use is limited only to conditional branches no more than 10 instances away:
---- -------
bne @- ---
- extended directives #IF and #WHILE to allow arguments declared by .VAR, whereas previously only a variable was allowed:
.var temp .word
#if temp>#2100
#if .word temp>#2100
- 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.:
ERROR: Extra characters on line
pha:pla $00
- 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
.macro SetColor2 (arg1, arg2)
lda #:arg1
- naprawione definiowanie etykiet dla n/w sytuacji, pierwsza etykieta nie zostanie zignorowana
label = 100
- 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
- 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
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 CPU 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
.enum type
.struct label2
- 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)
v1.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 i .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
v1.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)
- 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 i .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. :
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]
[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
.end 18 elementów, TEMP [0..17]
- dodana mo?liwo?? alokacji zmiennej typu strukturalnego przy pomocy dyrektyw .VAR i .ZPVAR, np.:
.struct Point
.var a,b,c Point
.zpvar Point f,g,i
- dodana mo?liwo?? alokacji zmiennej typu wyliczeniowego przy pomocy dyrektyw .VAR i .ZPVAR, np.:
.enum Boolean
.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
.struct SLoader
m_file_start .word
m_file_length .word
m_state EState
v1.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 (CPU 65816)
- dodane nowe rozkazy BRL, JSL, JML (CPU 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
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
src lda $ffff,y
dst sta $ffff,y
copySrc.ToDst #$a080 #$b000
copySrc #$a360
- dodane nowe dyrektywy .ENUM i .ENDE (.EEND)
.enum dni_tygodnia
poniedzialek = 1
wtorek, sroda = 5, czwartek = 7
ift dzien==dni_tygodnia::wtorek
.print 'wtorek'
- rozszerzona funkcjonalno?? komentarzy wieloliniowych /* */ o mo?liwo?? umieszczania ich gdziekolwiek
lda #12+ /* komentarz */ 23
- umo?liwiona relokacja adresów definiowanych dyrektyw? .DEF
.def 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
.local temp2
.array tab [255] .long
- 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)
- rozszerzone dzia?anie znaku backslash '\', umieszczenie go na końcu wiersza oznacza kontynuacj? aktualnego wiersza od nowego wiersza, np.:
macro_temp \
_____________________________________parametr1_________________________________________________\
_____________________________________parametr2_________________________________________________\
_____________________________________parametr3_________________________________________________
#____________________________________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 i :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
.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
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
#if .word j = #12
- dyrektywa generuj?ca kod 6502 dla iteracji .WHILE zast?piona zosta?a przez dyrektyw? #WHILE, dyrektywa .ENDW przez #END, np.:
# while .byte @=20
wait cmp 20
- dyrektywy #IF i #WHILE akceptuj? dwa dodatkowe operatory '==' i '!='
- 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 i .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 i @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 i #WHILE w oparciu o kod generowany przez makro rozkazy CPB, CPW, CPL, CPD, dyrektywy #TEST i #WHILE dla wyra?eń '=#0' i '#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.:
mva #0 $80
mva #0 $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
.local namespace
.proc proc2
- 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
- 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
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 i .DWORD przekazywanych do procedur .PROC typu .VAR (poprzednio akceptowanymi typami parametrów by? tylko .BYTE i .WORD)
- dodana nowa dyrektywa .FL realizuj?ca zapis liczb rzeczywistych REAL w formacie FP Atari, np.:
pi .fl 3. 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
buf dta test [0]
- poprawione b??dy dotycz?ce generowania kodu relokowalnego zauwa?one przez Laoo, np.:
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 i .TEST
- poprawione dzia?anie testowania warto?ci typu .WORD w kodzie generowanym przez dyrektywy .WHILE i .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 i .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
- rozszerzona sk?adnia .STRUCT o mo?liwo?? dodania nowych pól bez definiowania nazwy pola, np.:
.struct @id
.struct @mem
- 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
- 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
- dodane nowe makro rozkazy ADB, SBB realizuj?ce dodawanie i odejmowanie warto?ci typu .BYTE, np.:
ADB $80 #12 $b000
SBB #200 $a000
- dodana mo?liwo?? u?ycia sk?adni C dla liczb szestnastkowych, np.:
lda 0x2000
temp = 0x8000
- 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 CPU6502, np.:
adw hlp #40 hlp=hlp+40
adw hlp #20 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
- 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 i 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-a, 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 i .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.:
.while .word adr < #$bc40+40*24
adr: equ *-2
- dodane nowe dyrektywy .TEST, .ENDT pozwalaj?ce na automatyczne wygenerowanie kodu dla warunku, np.:
.test .byte (@>=#'a')
.test .byte (@<=#'z')
- 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-a
- 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-a, 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 (C-ONSTANT) w blokach PUBLIC
- poprawiona relokowalnosc dla tablic .ARRAY, danych stworzonych przez .STRUCT, parametrów przekazywanych do procedur przez sta?a #
- 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 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)
- dodana mo?liwo?? u?ywania nazw mnemoników 65816 w trybie pracy 6502, w trybie 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 ':'
- 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)
- 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 i .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-a z sortowaniem na etykiety typu CONSTANTS, VARIABLES, PROCEDURES
- dodana nowa dyrektywa .RELOC generuj?ca kod relokowalny w formacie MADS-a
- 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-a REQ, RNE, RPL, RMI, RCC, RCS, RVC, RVS, SEQ, SNE, SPL, SMI, SCC, SCS, SVC, SVS
- dodana mo?liwo?? ??czenia dowolnej liczby znanych MADS-owi mnemoników przy pomocy znaku ':' (styl XASM-a), np.:
lda:cmp:req 20
ldx:ldy:lda:iny label
v1.6.6 - 1.6.7
- ?ród?o MADS-a 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-a (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-a 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 (CPU 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-1
?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)

我要回帖

更多关于 doubleclick 的文章

 

随机推荐