agsoptimize: add macro passes
these can be used to replace snippets with cpp macros.
#define VAR_EQ(VAR, VAL) \
li mar, VAR \
memread4 ax \
subi ax, VAL \
not ax
#define VAR_NE(VAR, VAL) \
li mar, VAR \
memread4 ax \
subi ax, VAL
#define INC_VAR(VAR, VAL) \
li mar, VAR \
memread4 ax \
addi ax, VAL \
memwrite4 ax
#define SET_VAR(VAR, VAL) \
li ax, VAL \
li mar, VAR \
memwrite4 ax \
#define FARCALL0(FUN) \
setfuncargs 0 \
li ax, FUN \
farcall ax \
#define FARCALL1(FUN, VAL) \
li ax, VAL \
farpush ax \
setfuncargs 1 \
li ax, FUN \
farcall ax \
farsubsp 1 \
#define OBJCALL0(FN, OBJ) \
li mar, OBJ \
mr ax, mar \
push op \
callobj ax \
setfuncargs 0 \
li ax, FN \
farcall ax \
pop op \
#define OBJCALL1(FN, OBJ, ARG) \
li bx, ARG \
li mar, OBJ \
mr ax, mar \
push op \
callobj ax \
farpush bx \
setfuncargs 1 \
li ax, FN \
farcall ax \
farsubsp 1 \
pop op
#define OBJCALL1_DYNSTR(FN, OBJ, ARG) \
li ax, ARG \
newstr ax \
mr bx, ax \
li mar, OBJ \
mr ax, mar \
push op \
callobj ax \
farpush bx \
setfuncargs 1 \
li ax, FN \
farcall ax \
farsubsp 1 \
pop op \