// MACRO.C - Macro Definition and Invocation
// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
//
#include "macro.h"
#include "token.h"
-static void SetupDefaultMacros(void);
-
LONG curuniq; // Current macro's unique number
//TOKEN ** argp; // Free spot in argptrs[]
int macnum; // Unique number for macro definition
//
-// Initialize Macro Processor
+// Initialize macro processor
//
void InitMacro(void)
{
macnum = 1;
// argp = NULL;
argp = 0;
- SetupDefaultMacros();
}
//
-// Exit from a Macro;
+// Exit from a macro;
// -- pop any intervening include files and repeat blocks;
// -- restore argument stack;
// -- pop the macro.
//
int ExitMacro(void)
{
-#warning !!! Bad macro exiting !!!
+#ifndef _MSC_VER
+#pragma message !!! Bad macro exiting !!!
+#else
+#pragma WARNING(!!! Bad macro exiting !!!)
+#endif
+
/*
This is a problem. Currently, the argument logic just keeps the current
arguments and doesn't save anything if a new macro is called in the middle
DEBUG printf("%d (nargs = %d)\n", argp, imacro->im_nargs);
fpop();
- mjump_align = 0;
return 0;
}
//
-// Add a Formal Argument to a Macro Definition
+// Add a formal argument to a macro definition
//
int defmac2(char * argname)
{
//
int defmac1(char * ln, int notEndFlag)
{
- PTR p;
- LONG len;
+// PTR p;
+// LONG len;
if (list_flag)
{
rptlevel++;
default:
//MORE stupidity here...
-#warning "!!! Casting (char *) as LONG !!!"
+#ifndef _MSC_VER
+#pragma warning "!!! Casting (char *) as LONG !!!"
+#else
+#pragma WARNING(!!! Casting (char *) as LONG !!!)
+#endif
addln:
// Allocate length of line + 1('\0') + LONG
len = strlen(ln) + 1 + sizeof(LONG);
for(;;)
{
- if (tokln() == TKEOF)
+ if (TokenizeLine() == TKEOF)
{
errors("encountered end-of-file looking for '%s'", dirlist);
fatal("cannot continue");
if ((tok[2] == ':' || tok[2] == DCOLON))
{
if (tok[3] == SYMBOL) // label: symbol
-#if 0
- p = (char *)tok[4];
-#else
p = string[tok[4]];
-#endif
}
else
{
-#if 0
- p = (char *)tok[1]; // symbol
-#else
p = string[tok[1]]; // Symbol
-#endif
}
}
// argp = 0;
DEBUG printf("InvokeMacro: argp: %d -> ", argp);
- if ((!strcmp(mac->sname, "mjump") || !strcmp(mac->sname, "mpad")) && !in_main)
- {
- error("macro cannot be used outside of .gpumain");
- return ERROR;
- }
-
INOBJ * inobj = a_inobj(SRC_IMACRO); // Alloc and init IMACRO
IMACRO * imacro = inobj->inobj.imacro;
imacro->im_siz = siz;
TOKEN * dest;
int stringNum = 0;
int argumentNum = 0;
- int i;
+// int i;
for(dry_run=1; ; dry_run--)
{
Shamus:
This construct is meant to deal with nested macros, so the simple minded way
we deal with them now won't work. :-/ Have to think about how to fix.
-What we could do is simply move the argp with each call, and move it back by the
-number of arguments in the macro that's ending. That would solve the problem nicely.
+What we could do is simply move the argp with each call, and move it back by
+the number of arguments in the macro that's ending. That would solve the
+problem nicely.
[Which we do now. But that uncovered another problem: the token strings are all
-stale by the time a nested macro gets to the end. But they're supposed to be symbols,
-which means if we put symbol references into the argument token streams, we can
-alleviate this problem.]
+stale by the time a nested macro gets to the end. But they're supposed to be
+symbols, which means if we put symbol references into the argument token
+streams, we can alleviate this problem.]
*/
#if 0
argptr = (TOKEN **)malloc((nargs + 1) * sizeof(LONG));
return OK;
}
-
-//
-// Setup inbuilt macros (SubQMod)
-//
-static void SetupDefaultMacros(void)
-{
- curmac = NewSymbol("mjump", MACRO, 0);
- curmac->svalue = 0;
- curmac->sattr = (WORD)(macnum++);
- argno = 0;
- defmac2("cc");
- defmac2("addr");
- defmac2("jreg");
-// curmln = NULL;
- curmac->lineList = NULL;
- defmac1(" nop", -1);
- defmac1(" movei #\\addr,\\jreg", -1);
- defmac1(" jump \\cc,(\\jreg)", -1);
- defmac1(" nop", -1);
- defmac1(" nop", -1);
-
- curmac = NewSymbol("mjr", MACRO, 0);
- curmac->svalue = 0;
- curmac->sattr = (WORD)(macnum++);
- argno = 0;
- defmac2("cc");
- defmac2("addr");
-// curmln = NULL;
- curmac->lineList = NULL;
- defmac1(" jr \\cc,\\addr", -1);
- defmac1(" nop", -1);
- defmac1(" nop", -1);
-
- curmac = NewSymbol("mpad", MACRO, 0);
- curmac->svalue = 0;
- curmac->sattr = (WORD)(macnum++);
- argno = 0;
- defmac2("size");
-// curmln = NULL;
- curmac->lineList = NULL;
- defmac1(" .rept (\\size/2)", -1);
- defmac1(" nop", -1);
- defmac1(" .endr", -1);
-}