mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Support 'MACRO mac' as well as 'mac: MACRO' for defining macros
The new syntax is used in documentation, but the old syntax is not yet deprecated.
This commit is contained in:
@@ -934,7 +934,12 @@ break : T_POP_BREAK T_NEWLINE {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
macrodef : T_LABEL T_COLON T_POP_MACRO T_NEWLINE {
|
macrodef : T_POP_MACRO T_ID T_NEWLINE {
|
||||||
|
lexer_CaptureMacroBody(&captureBody);
|
||||||
|
} T_NEWLINE {
|
||||||
|
sym_AddMacro($2, captureBody.lineNo, captureBody.body, captureBody.size);
|
||||||
|
}
|
||||||
|
| T_LABEL T_COLON T_POP_MACRO T_NEWLINE {
|
||||||
lexer_CaptureMacroBody(&captureBody);
|
lexer_CaptureMacroBody(&captureBody);
|
||||||
} T_NEWLINE {
|
} T_NEWLINE {
|
||||||
sym_AddMacro($1, captureBody.lineNo, captureBody.body, captureBody.size);
|
sym_AddMacro($1, captureBody.lineNo, captureBody.body, captureBody.size);
|
||||||
|
|||||||
@@ -1076,33 +1076,40 @@ Macros can be called with arguments, and can react depending on input using
|
|||||||
.Ic IF
|
.Ic IF
|
||||||
constructs.
|
constructs.
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
MyMacro: MACRO
|
MACRO MyMacro
|
||||||
ld a,80
|
ld a, 80
|
||||||
call MyFunc
|
call MyFunc
|
||||||
ENDM
|
ENDM
|
||||||
.Ed
|
.Ed
|
||||||
.Pp
|
.Pp
|
||||||
Note that a single colon
|
The example above defines
|
||||||
|
.Ql MyMacro
|
||||||
|
as a new macro.
|
||||||
|
You may use the older syntax
|
||||||
|
.Ql MyMacro: MACRO
|
||||||
|
instead of
|
||||||
|
.Ql MACRO MyMacro ,
|
||||||
|
with a single colon
|
||||||
.Ql \&:
|
.Ql \&:
|
||||||
following the macro's name is required.
|
following the macro's name.
|
||||||
Macros can't be exported or imported.
|
Macros can't be exported or imported.
|
||||||
.Pp
|
.Pp
|
||||||
Plainly nesting macro definitions is not allowed, but this can be worked around using
|
Plainly nesting macro definitions is not allowed, but this can be worked around using
|
||||||
.Ic EQUS .
|
.Ic EQUS .
|
||||||
This won't work:
|
So this won't work:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
outer: MACRO
|
MACRO outer
|
||||||
inner: MACRO
|
MACRO inner
|
||||||
PRINTLN "Hello!"
|
PRINTLN "Hello!"
|
||||||
ENDM
|
ENDM
|
||||||
ENDM
|
ENDM
|
||||||
.Ed
|
.Ed
|
||||||
.Pp
|
.Pp
|
||||||
But this will:
|
But this will:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
outer: MACRO
|
MACRO outer
|
||||||
definition equs "inner: MACRO\[rs]nPRINTLN \[rs]"Hello!\[rs]"\[rs]nENDM"
|
definition EQUS "MACRO inner\[rs]nPRINTLN \[rs]"Hello!\[rs]"\[rs]nENDM"
|
||||||
definition
|
definition
|
||||||
PURGE definition
|
PURGE definition
|
||||||
ENDM
|
ENDM
|
||||||
.Ed
|
.Ed
|
||||||
@@ -1393,7 +1400,7 @@ it will insert the macro definition (the code enclosed in
|
|||||||
.Pp
|
.Pp
|
||||||
Suppose your macro contains a loop.
|
Suppose your macro contains a loop.
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
LoopyMacro: MACRO
|
MACRO LoopyMacro
|
||||||
xor a,a
|
xor a,a
|
||||||
\&.loop ld [hl+],a
|
\&.loop ld [hl+],a
|
||||||
dec c
|
dec c
|
||||||
@@ -1411,7 +1418,7 @@ also works in
|
|||||||
.Ic REPT
|
.Ic REPT
|
||||||
blocks.
|
blocks.
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
LoopyMacro: MACRO
|
MACRO LoopyMacro
|
||||||
xor a,a
|
xor a,a
|
||||||
\&.loop\[rs]@ ld [hl+],a
|
\&.loop\[rs]@ ld [hl+],a
|
||||||
dec c
|
dec c
|
||||||
@@ -1440,7 +1447,7 @@ through
|
|||||||
.Ic \[rs]9 , \[rs]1
|
.Ic \[rs]9 , \[rs]1
|
||||||
being the first argument specified on the macro invocation.
|
being the first argument specified on the macro invocation.
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
LoopyMacro: MACRO
|
MACRO LoopyMacro
|
||||||
ld hl,\[rs]1
|
ld hl,\[rs]1
|
||||||
ld c,\[rs]2
|
ld c,\[rs]2
|
||||||
xor a,a
|
xor a,a
|
||||||
@@ -1465,7 +1472,7 @@ to
|
|||||||
if you perform further calculations on them.
|
if you perform further calculations on them.
|
||||||
For instance, consider the following:
|
For instance, consider the following:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
print_double: MACRO
|
MACRO print_double
|
||||||
PRINTLN \[rs]1 * 2
|
PRINTLN \[rs]1 * 2
|
||||||
ENDM
|
ENDM
|
||||||
print_double 1 + 2
|
print_double 1 + 2
|
||||||
@@ -1480,7 +1487,7 @@ which will print 5 and not 6 as you might have expected.
|
|||||||
Line continuations work as usual inside macros or lists of macro arguments.
|
Line continuations work as usual inside macros or lists of macro arguments.
|
||||||
However, some characters need to be escaped, as in the following example:
|
However, some characters need to be escaped, as in the following example:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
PrintMacro: MACRO
|
MACRO PrintMacro
|
||||||
PRINT \[rs]1
|
PRINT \[rs]1
|
||||||
ENDM
|
ENDM
|
||||||
|
|
||||||
|
|||||||
15
test/asm/macro-syntax.asm
Normal file
15
test/asm/macro-syntax.asm
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
old: MACRO ; comment
|
||||||
|
println "out with the ", \1
|
||||||
|
ENDM ; comment
|
||||||
|
|
||||||
|
MACRO new ; comment
|
||||||
|
println "in with the ", \1
|
||||||
|
ENDM ; comment
|
||||||
|
|
||||||
|
old 1
|
||||||
|
new 2
|
||||||
|
|
||||||
|
bad1: MACRO bad2 ; comment
|
||||||
|
println "which?"
|
||||||
|
ENDM ; comment
|
||||||
5
test/asm/macro-syntax.err
Normal file
5
test/asm/macro-syntax.err
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
ERROR: macro-syntax.asm(13):
|
||||||
|
syntax error, unexpected identifier, expecting newline
|
||||||
|
ERROR: macro-syntax.asm(15):
|
||||||
|
syntax error, unexpected ENDM
|
||||||
|
error: Assembly aborted (2 errors)!
|
||||||
3
test/asm/macro-syntax.out
Normal file
3
test/asm/macro-syntax.out
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
out with the $1
|
||||||
|
in with the $2
|
||||||
|
which?
|
||||||
5
test/asm/macro-syntax.simple.err
Normal file
5
test/asm/macro-syntax.simple.err
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
ERROR: macro-syntax.asm(13):
|
||||||
|
syntax error
|
||||||
|
ERROR: macro-syntax.asm(15):
|
||||||
|
syntax error
|
||||||
|
error: Assembly aborted (2 errors)!
|
||||||
Reference in New Issue
Block a user