- // 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;
- a0bexpr[0]=a1bexpr[0]= ENDEXPR;
- a0bexval=a0bsize=a0extension=a1bexval=a1bsize=a1extension=0;
- am0_030=am1_030=0;
- bfparam1=bfparam2=0;
- bf0expr[0]=ENDEXPR;
- bf0exattr=0;
- bf0esym= (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
- #define CHK_FOR_DISPn CheckForDisp0
- #define AnBEXPR a0bexpr
- #define AnBEXVAL a0bexval
- #define AnBEXATTR a0bexattr
- #define AnBZISE a0bsize
- #define AnEXTEN a0extension
- #define AMn_030 am0_030
- #define IS_SUPPRESSEDn IS_SUPPRESSED0
- #define CHECKODn CHECKOD0
- #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 (*tok == '{')
- if (check030bf()==ERROR) // it's a bitfield instruction - check the parameters inside the {} block for validity
- return ERROR;
-
- 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
- #define CHK_FOR_DISPn CheckForDisp1
- #define AnBEXPR a1bexpr
- #define AnBEXVAL a1bexval
- #define AnBEXATTR a1bexattr
- #define AnBZISE a1bsize
- #define AnEXTEN a1extension
- #define AMn_030 am1_030
- #define IS_SUPPRESSEDn IS_SUPPRESSED1
- #define CHECKODn CHECKOD1
- #include "parmode.h"
-
- if (*tok == '{')
- if (check030bf()==ERROR) // it's a bitfield instruction - check the parameters inside the {} block for validity
- return ERROR;
-
- // At this point, it is legal for 020+ to have a ':'. For example divu.l d0,d2:d3
- if (*tok == ':')
- {
- if ((activecpu & (CPU_68020 | CPU_68030 | CPU_68040)) == 0)
- return error(unsupport);
- // TODO: protect this from combinations like Dx:FPx etc :)
- tok++; //eat the colon
- if (*tok >= KW_D0 && *tok <= KW_D7)
- {
- a2reg = (*tok - KW_D0);
- mulmode=1<<10;
- }
- else if (*tok >= KW_FP0&&*tok <= KW_FP7)
- {
- a2reg = (*tok - KW_FP0);
- mulmode=1<<10;
- }
- else
- return error("a data or FPU register must follow a :");
- *tok++;
- }
- else
- {
- //If no ':' is present then maybe we have something like divs.l d0,d1 which sould translate to divs.l d0,d1:d1
- a2reg = a1reg;
- mulmode=0;
- }
-
- nmodes = 2;
- return 2;
-
- // Error messages:
- badmode:
- return error("addressing mode syntax");
-
- //unmode:
- //return error("unimplemented addressing mode");
+ // 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 = NULL;
+ a0bexpr[0] = a1bexpr[0] = ENDEXPR;
+ a0bexval = a0bsize = a0extension = a1bexval = a1bsize = a1extension = 0;
+ am0_030 = am1_030 = 0;
+ bfparam1 = bfparam2 = 0;
+ bf0expr[0] = ENDEXPR;
+ bf0exattr = 0;
+ bf0esym = 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
+ #define CHK_FOR_DISPn CheckForDisp0
+ #define AnBEXPR a0bexpr
+ #define AnBEXVAL a0bexval
+ #define AnBEXATTR a0bexattr
+ #define AnBZISE a0bsize
+ #define AnEXTEN a0extension
+ #define AMn_030 am0_030
+ #define IS_SUPPRESSEDn IS_SUPPRESSED0
+ #define CHECKODn CHECKOD0
+ #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;
+
+ // it's a bitfield instruction--check the parameters inside the {} block
+ // for validity
+ if (*tok == '{')
+ if (check030bf() == ERROR)
+ return ERROR;
+
+ 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
+ #define CHK_FOR_DISPn CheckForDisp1
+ #define AnBEXPR a1bexpr
+ #define AnBEXVAL a1bexval
+ #define AnBEXATTR a1bexattr
+ #define AnBZISE a1bsize
+ #define AnEXTEN a1extension
+ #define AMn_030 am1_030
+ #define IS_SUPPRESSEDn IS_SUPPRESSED1
+ #define CHECKODn CHECKOD1
+ #include "parmode.h"
+
+ // It's a bitfield instruction--check the parameters inside the {} block
+ // for validity
+ if (*tok == '{')
+ if (check030bf() == ERROR)
+ return ERROR;
+
+ // At this point, it is legal for 020+ to have a ':'. For example divu.l
+ // d0,d2:d3
+ if (*tok == ':')
+ {
+ if ((activecpu & (CPU_68020 | CPU_68030 | CPU_68040)) == 0)
+ return error(unsupport);
+
+ // TODO: protect this from combinations like Dx:FPx etc :)
+ tok++; //eat the colon
+
+ if ((*tok >= KW_D0) && (*tok <= KW_D7))
+ {
+ a2reg = (*tok - KW_D0);
+ mulmode = 1 << 10;
+ }
+ else if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
+ {
+ a2reg = (*tok - KW_FP0);
+ mulmode = 1 << 10;
+ }
+ else
+ return error("a data or FPU register must follow a :");
+
+ *tok++;
+ }
+ else
+ {
+ // If no ':' is present then maybe we have something like divs.l d0,d1
+ // which sould translate to divs.l d0,d1:d1
+ a2reg = a1reg;
+ mulmode = 0;
+ }
+
+ nmodes = 2;
+ return 2;
+
+ // Error messages:
+badmode:
+ return error("addressing mode syntax");
+
+ //unmode:
+ //return error("unimplemented addressing mode");