X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=amode.c;h=2c89911b3c87fc643f0bf5d7f65b97fdcd10316c;hp=26934677ecde8bd76a6fcc043c1098f17b4fd553;hb=6c1bc379012b1c1ca369e71e39509f3538042382;hpb=75cce0d9eb190f6094f66ae283b5981af25e5a57 diff --git a/amode.c b/amode.c index 2693467..2c89911 100644 --- a/amode.c +++ b/amode.c @@ -29,7 +29,7 @@ int a0ixsiz; // Index register si TOKEN a0oexpr[EXPRSIZE]; // Outer displacement expression VALUE a0oexval; // Outer displacement value WORD a0oexattr; // Outer displacement attribute -SYM *a0esym; // External symbol involved in expr +SYM * a0esym; // External symbol involved in expr int am1; // Addressing mode int a1reg; // Register @@ -41,121 +41,131 @@ int a1ixsiz; // Index register si TOKEN a1oexpr[EXPRSIZE]; // Outer displacement expression VALUE a1oexval; // Outer displacement value WORD a1oexattr; // Outer displacement attribute -SYM *a1esym; // External symbol involved in expr +SYM * a1esym; // External symbol involved in expr + // -// --- Parse Addressing Mode ----------------------------------------------------------------------- +// Parse Addressing Mode // - -int amode(int acount) { - // Initialize global return values +int amode(int acount) +{ + // Initialize global return values nmodes = a0reg = a1reg = 0; am0 = am1 = AM_NONE; a0expr[0] = a0oexpr[0] = a1expr[0] = a1oexpr[0] = ENDEXPR; a0exattr = a0oexattr = a1exattr = a1oexattr = 0; a0esym = a1esym = (SYM *)NULL; - // If at EOL, then no addr modes at all - if(*tok == EOL) - return(0); - - // Parse first addressing mode - #define AnOK a0ok - #define AMn am0 - #define AnREG a0reg - #define AnIXREG a0ixreg - #define AnIXSIZ a0ixsiz - #define AnEXPR a0expr - #define AnEXVAL a0exval - #define AnEXATTR a0exattr - #define AnOEXPR a0oexpr - #define AnOEXVAL a0oexval - #define AnOEXATTR a0oexattr - #define AnESYM a0esym - #define AMn_IX0 am0_ix0 - #define AMn_IXN am0_ixn - #include "parmode.h" - - // If caller wants only one mode, return just one (ignore comma); - // If there is no second addressing mode (no comma), then return just one anyway. - nmodes = 1; - if(acount == 0 || *tok != ',') - return(1); - ++tok; // Eat comma - - // Parse second addressing mode - #define AnOK a1ok - #define AMn am1 - #define AnREG a1reg - #define AnIXREG a1ixreg - #define AnIXSIZ a1ixsiz - #define AnEXPR a1expr - #define AnEXVAL a1exval - #define AnEXATTR a1exattr - #define AnOEXPR a1oexpr - #define AnOEXVAL a1oexval - #define AnOEXATTR a1oexattr - #define AnESYM a1esym - #define AMn_IX0 am1_ix0 - #define AMn_IXN am1_ixn - #include "parmode.h" - - nmodes = 2; - return(2); - - // Error messages: - badmode: - - return(error("addressing mode syntax")); - - unmode: - - return(error("unimplemented addressing mode")); + // If at EOL, then no addr modes at all + if (*tok == EOL) + return 0; + + // Parse first addressing mode + #define AnOK a0ok + #define AMn am0 + #define AnREG a0reg + #define AnIXREG a0ixreg + #define AnIXSIZ a0ixsiz + #define AnEXPR a0expr + #define AnEXVAL a0exval + #define AnEXATTR a0exattr + #define AnOEXPR a0oexpr + #define AnOEXVAL a0oexval + #define AnOEXATTR a0oexattr + #define AnESYM a0esym + #define AMn_IX0 am0_ix0 + #define AMn_IXN am0_ixn + #include "parmode.h" + + // If caller wants only one mode, return just one (ignore comma); + // If there is no second addressing mode (no comma), then return just one anyway. + nmodes = 1; + + if (acount == 0 || *tok != ',') + return 1; + + // Eat the comma + tok++; + + // Parse second addressing mode + #define AnOK a1ok + #define AMn am1 + #define AnREG a1reg + #define AnIXREG a1ixreg + #define AnIXSIZ a1ixsiz + #define AnEXPR a1expr + #define AnEXVAL a1exval + #define AnEXATTR a1exattr + #define AnOEXPR a1oexpr + #define AnOEXVAL a1oexval + #define AnOEXATTR a1oexattr + #define AnESYM a1esym + #define AMn_IX0 am1_ix0 + #define AMn_IXN am1_ixn + #include "parmode.h" + + nmodes = 2; + return 2; + + // Error messages: + badmode: + return error("addressing mode syntax"); + + unmode: + return error("unimplemented addressing mode"); } + // -// --- Parse Register List ------------------------------------------------------------------------- +// Parse Register List // - -int reglist(WORD *a_rmask) { - static WORD msktab[] = { - 0x0001, 0x0002, 0x0004, 0x0008, - 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, - 0x1000, 0x2000, 0x4000, 0x8000 - }; - WORD rmask; - int r, cnt; - - rmask = 0; - for(;;) { - if(*tok >= KW_D0 && *tok <= KW_A7) - r = *tok++ & 15; - else break; - - if(*tok == '-') { - ++tok; - if(*tok >= KW_D0 && *tok <= KW_A7) - cnt = *tok++ & 15; - else - return(error("register list syntax")); - - if(cnt < r) - return(error("register list order")); - cnt -= r; - } else - cnt = 0; - - while(cnt-- >= 0) - rmask |= msktab[r++]; - if(*tok != '/') - break; - ++tok; - } - - *a_rmask = rmask; - - return(OK); +int reglist(WORD * a_rmask) +{ + static WORD msktab[] = { + 0x0001, 0x0002, 0x0004, 0x0008, + 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, + 0x1000, 0x2000, 0x4000, 0x8000 + }; + + WORD rmask = 0; + int r, cnt; + + for(;;) + { + if (*tok >= KW_D0 && *tok <= KW_A7) + r = *tok++ & 15; + else + break; + + if (*tok == '-') + { + tok++; + + if (*tok >= KW_D0 && *tok <= KW_A7) + cnt = *tok++ & 15; + else + return error("register list syntax"); + + if (cnt < r) + return error("register list order"); + + cnt -= r; + } + else + cnt = 0; + + while (cnt-- >= 0) + rmask |= msktab[r++]; + + if (*tok != '/') + break; + + tok++; + } + + *a_rmask = rmask; + + return OK; } -