|
Inferno #04
22 июня 2003 |
|
For Coderz - Macros for assembler Alasm v4.4x.

On a macro poor Say a Word ...
(C) Vitamin / CAIG:
Probably many coders (at least starting to) complained of
some shortcomings assembly, which, however, were absent in a
higher level language. This is a question I'm about
constructions. But because if you can not make the assembler
in Pascal, or anything else, do something
programming more convenient. To implement such a venture, we
need assembler supports macros. The examples below are written
by Alasm v4.4x. At a special wish they can be converted into
any other Macroassembler. So Now, start with one that is two
simple macros that can do the job with
variables more convenient than before.
MACRO GET
IFN?: 1 +1; check for the presence of
LD: 0 (: 1) variable
ELSE
DISPLAY "Variable: one is not found"
ENDIF
ENDM
And a second macro:
MACRO PUT
IFN?: 0 +1
LD (: 0): 1
ELSE
DISPLAY "Variable: 0 is not found"
ENDIF
ENDM
And use them should be as follows:
xpos equ 32768; declare a variable
...
get b, xpos; thought
...
put xpos, a; recorded
Registers can be paired.
The variables can not use absolute addresses.
Just a few macros on this topic.
Suppose we have some complex data structure and we need to ask
yourself comfortable to its elements. Let the address of the
structure is stored in the IX.
MACRO MOV
IFN?: 1 +1
LD: 0, (IX +: 1)
ELSE
DISPLAY "Field: one is not defined"
ENDIF
ENDM
Example of use:
BOX DB 0; x
DB 1; y
DB 2; width
DB 3; heigth
BOX_X EQU 0
BOX_Y EQU 1
BOX_W EQU 2
BOX_H EQU 3
LD IX, BOX
...
MOV A, BOX_X
...
And to finish the topic of variables,
talk about access to bit fields.
MACRO MASK
IFN (?: )'(?: 0 +1 1 +1)
BIT: 0, (IX +: 1)
ELSE
DISPLAY "Field: 0 or field: one not defined"
ENDIF
ENDM
For example, augment the previous example
lines:
BOX ...
DB 0; flag
...
BOX_FLAG EQU 4
BOX_FULL EQU 0
BOX_TURN EQU 1
BOX_CLOS EQU 2
...
MASK BOX_FULL, BOX_FLAG; check
JZ ... And if that move
Similarly, you can add macros to
Installation and removal of bit variables.
Go ahead. Everyone knows the error output of the field in
the compilation command relative to the transition. Then we
take and fix everything at jr jp. And then, when everything is
soptimizirovano, configured and have the opportunity to replace
some jp back to jr, but go find them among the heaps of their
own kind - zae ..., sorry, butt:) And following macro tries to
do an optimal code, automatically placing jr, where possible,
but in other cases - jp.
But there is one bad feature: it
works well only with specific addresses given, or with already
defined marks, IMHO feature alasma with his single pass. If
anything, the compiler generates an error and you change to jmp
jp. Risk a bit, but in many cases it really will save you
pyamyat.
MACRO JMP
LOCAL; local labels
DIFF =: 0 - $ -2; path difference
IF DIFF '# 8000; if the transition forward
IF DIFF '# FF80; if you fit in
DB # 18, DIFF; short transition
ELSE
JP: 0, if no
ENDIF
ELSE
DIFF =- DIFF; if the transition back
IF DIFF '# FF80
DB # 18,-DIFF
ELSE
JP: 0
ENDIF
ENDIF
ENDL
ENDM
You can upgrade the macro and
create several new named jz, jnz,
jc, jnc, which will optimize conditional jumps, and the macro
loop, which will choose between djnz and dec b: jp nz.
But this macro allows you to copy memory area.
MACRO COPY
LOCAL
OLDADR = $
DEST =: 0
ORG: 1
DUP: 2
DB {DEST}
DEST = DEST +1
EDUP
ORG $
ENDL
ENDM
And they should use this:
COPY from, to, length. If the length of the block or forward
multiple of 2, we can fix DB on the DW and DEST = DEST +2. Just
keep in mind that This macro is very slow -
even slower than BASIC, and adds lines to compile 2 * length.
He needed to copy the data to be performed external to this
procedure.
Nice collection of macros supplied with alasmom, this counter
builds, and a generator of random garbage:)
Somehow I gave Steve my drives on
Spectrum, and some gave him a
dude named Unwinder, who was in our group before I came into
it. So, on one disc, I found a toy, "Python", written entirely
on the macro and Macro Assembler. It runs at compile time, and
was adapted for Tasm. Attempts to move it to Alasm failed,
besides, I do not razobralya in principle of its work. But try
to find it and provide for public Review.
To enable this to take leave. If that
come up with - tell a must!
----------------------------------------- Alone Coder:
For its part, can not comment on that python under ALASM
writing is more difficult because the resident would have to
patch ALASM'a that he had included an interrupt when
assembly. Fortunately, he does not seem to
uses non-standard stack ...
... And J7n/4D, programming under TASM, invented
completely insane macro. Interestingly, the
on ALASM it works too!
; MACROS LIBRARY Revision 2.0
; J7n'n'MiKE / 4D 98-2001
MACRO COP
IFN: 1
: 0
COP: 0, :1-1
ENDIF
ENDM
Any team is copied multiple times! And this is in one line!
But from there, a new variation on the theme
code alignment along the boundary of 256 bytes:
MACRO OFFSET
IFN. $
DS # 100 $ -.
ENDIF
ENDM
Here is my macro poll ports for keyboard. Instead of polling
the port # FEFE just write "I 2", can be a parameter, then you
can select the desired key:
MACRO i
LD A, -: 0
IN A, (-2)
IFN? I :1-2
AND: 1
ENDIF
ENDM
As you can see, my one-letter macros. This is to save space
in the source. For even more savings Challenges Macros should
be written on the label field, then is this:
i 2,1
I wanted to make a macro, but it did not work - Russian
letters do not mean:
; MACRO s
; EX DE, HL
; ENDM
So we have to write the old-fashioned:
DB "s
And here's my version of the JP / JR:
; Jp / r (UNDEFINED = JR)
MACRO j
IFN?: 0
JR: 0
ELSE
IF: 0 - $ 126 / 256
JR: 0
ELSE
JP: 0
ENDIF
ENDIF
ENDM
True, I do not use it.
Check HL-zero with a possible transition to zero. This macro
is not only diminishes the source, but also allows you to
change the condition finding the beginning of the text in
ACEdit. (Macro used in all proveryalku start
text editor.)
MACRO b
LD A, H
OR L
IFN? B :0-2
JR Z,: 0
ENDIF
ENDM
What does the following macro, I hope
obyaslyat should not?
MACRO [
LD HL, (: 0)
CALL: 1
LD (: 0), HL
ENDM
The macro I used for storage
table scan codes keyboard in the format
described in AlCoNews # 6:
MACRO d
DB: 0
DW: 1
ENDM
By the way, you can loop! Just yet
question whether it would be advantageous to fit:)
It's just a copy from somewhere kudato (saves some space in
the source):
MACRO l
LD HL, (: 0)
LD (: 1), HL
ENDM
Sravnivalka 16-bit chisel.Esli given parameters, and even
jump on the condition!
MACRO s
OR A
SBC HL, BC
ADD HL, BC
IFN? S :0-2
JR: 0: 1
ENDIF
ENDM
That's interesting here is makros.Takie macros, completely
unexpected, there the optimization program. This sequence of
commands I have found very popular when looking printout ACE.
Output these macros - the first step toward finding places
to reduce program length.
So: a cycle in which something called
and something (register-to-other) increments!
MACRO c
LOCAL
cc
CALL: 0
IFN? C :1-2
INC: 1
ENDIF
IFN? C :2-2
INC: 2
ENDIF
DJNZ cc
ENDL
ENDM
In fact, one could not verify that the parameters (after
all, darling, and an undocumented feature ALASM), but then when
assembling on the screen will be displayed error, that's ugly.
Besides, better precision confidence as a result!
Other articles:
Similar articles:
В этот день... 30 October