 macro
&l add4 &m1,&m2,&m3
 lclb &yistwo
 lclc &c
&l ~setm
 aif c:&m3,.a
&c amid "&m2",1,1
 aif "&c"<>"#",.a
&c amid "&m1",1,1
 aif "&c"="{",.a
 aif "&c"="[",.a
&c amid "&m2",2,l:&m2-1
 aif &c>=65536,.a
 clc
 ~lda &m1
 ~op adc,&m2
 ~sta &m1
 bcc ~&SYSCNT
 ~op.h inc,&m1
~&SYSCNT anop
 ago .c
.a
 aif c:&m3,.b
 lclc &m3
&m3 setc &m1
.b
 clc
 ~lda &m1
 ~op adc,&m2
 ~sta &m3
 ~lda.h &m1
 ~op.h adc,&m2
 ~sta.h &m3
.c
 ~restm
 mend
 macro
&l inc4 &a
&l ~setm
 inc &a
 bne ~&SYSCNT
 inc 2+&a
~&SYSCNT ~restm
 mend
 macro
&l long &a,&b
 lclb &i
 lclb &m
&a amid &a,1,1
&m setb ("&a"="M").or.("&a"="m")
&i setb ("&a"="I").or.("&a"="i")
 aif c:&b=0,.a
&b amid &b,1,1
&m setb ("&b"="M").or.("&b"="m").or.&m
&i setb ("&b"="I").or.("&b"="i").or.&i
.a
&l rep #&m*32+&i*16
 aif .not.&m,.b
 longa on
.b
 aif .not.&i,.c
 longi on
.c
 mend
 macro
&l ph2 &n1
&l anop
 aif "&n1"="*",.f
 lclc &c
&c amid &n1,1,1
 aif "&c"="#",.d
 aif s:longa=1,.a
 rep #%00100000
.a
 aif "&c"<>"{",.b
&c amid &n1,l:&n1,1
 aif "&c"<>"}",.g
&n1 amid &n1,2,l:&n1-2
 lda (&n1)
 pha
 ago .e
.b
 aif "&c"="<",.c
 lda &n1
 pha
 ago .e
.c
&n1 amid &n1,2,l:&n1-1
 pei &n1
 ago .e
.d
&n1 amid &n1,2,l:&n1-1
 pea &n1
 ago .f
.e
 aif s:longa=1,.f
 sep #%00100000
.f
 mexit
.g
 mnote "Missing closing '}'",16
 mend
 macro
&l short &a,&b
 lclb &i
 lclb &m
&a amid &a,1,1
&m setb ("&a"="M").or.("&a"="m")
&i setb ("&a"="I").or.("&a"="i")
 aif c:&b=0,.a
&b amid &b,1,1
&m setb ("&b"="M").or.("&b"="m").or.&m
&i setb ("&b"="I").or.("&b"="i").or.&i
.a
&l sep #&m*32+&i*16
 aif .not.&m,.b
 longa off
.b
 aif .not.&i,.c
 longi off
.c
 mend
 macro
&l ~lda &op
 lclc &c
&c amid "&op",1,1
 aif "&c"<>"{",.b
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
&l lda &op
 mend
 macro
&l ~lda.h &op
&l anop
 lclc &c
&c amid "&op",1,1
 aif "&c"="[",.b
 aif "&c"<>"{",.d
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
 aif &yistwo,.c
&yistwo setb 1
 ldy #2
.c
&op setc "&op,y"
 lda &op
 mexit
.d
 aif "&c"<>"#",.e
&op amid "&op",2,l:&op-1
&op setc "#^&op"
 lda &op
 mexit
.e
 lda 2+&op
 mend
 macro
&l ~op &opc,&op
 lclc &c
&c amid "&op",1,1
 aif "&c"<>"{",.b
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
&l &opc &op
 mend
 macro
&l ~op.h &opc,&op
&l anop
 lclc &c
&c amid "&op",1,1
 aif "&c"="[",.b
 aif "&c"<>"{",.d
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
 aif &yistwo,.c
&yistwo setb 1
 ldy #2
.c
&op setc "&op,y"
 &opc &op
 mexit
.d
 aif "&c"<>"#",.e
&op amid "&op",2,l:&op-1
&op setc "#^&op"
 &opc &op
 mexit
.e
 &opc 2+&op
 mend
 macro
&l ~restm
&l anop
 aif (&~la+&~li)=2,.i
 sep #32*(.not.&~la)+16*(.not.&~li)
 aif &~la,.h
 longa off
.h
 aif &~li,.i
 longi off
.i
 mend
 macro
&l ~setm
&l anop
 aif c:&~la,.b
 gblb &~la
 gblb &~li
.b
&~la setb s:longa
&~li setb s:longi
 aif s:longa.and.s:longi,.a
 rep #32*(.not.&~la)+16*(.not.&~li)
 longa on
 longi on
.a
 mend
 macro
&l ~sta &op
 lclc &c
&c amid "&op",1,1
 aif "&c"<>"{",.b
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
&l sta &op
 mend
 macro
&l ~sta.h &op
&l anop
 lclc &c
&c amid "&op",1,1
 aif "&c"="[",.b
 aif "&c"<>"{",.d
&c amid "&op",l:&op,1
 aif "&c"="}",.a
 mnote "Missing closing '}'",2
&op setc &op}
.a
&op amid "&op",2,l:&op-2
&op setc (&op)
.b
 aif &yistwo,.c
&yistwo setb 1
 ldy #2
.c
&op setc "&op,y"
 sta &op
 mexit
.d
 sta 2+&op
 mend
