int am0; // Addressing mode
int a0reg; // Register
TOKEN a0expr[EXPRSIZE]; // Expression
-VALUE a0exval; // Expression's value
+uint64_t a0exval; // Expression's value
WORD a0exattr; // Expression's attribute
int a0ixreg; // Index register
int a0ixsiz; // Index register size (and scale)
TOKEN a0oexpr[EXPRSIZE]; // Outer displacement expression
-VALUE a0oexval; // Outer displacement value
+uint64_t a0oexval; // Outer displacement value
WORD a0oexattr; // Outer displacement attribute
SYM * a0esym; // External symbol involved in expr
TOKEN a0bexpr[EXPRSIZE]; // Base displacement expression
-VALUE a0bexval; // Base displacement value
+uint64_t a0bexval; // Base displacement value
WORD a0bexattr; // Base displacement attribute
WORD a0bsize; // Base displacement size
WORD a0extension; // 020+ extension address word
int am1; // Addressing mode
int a1reg; // Register
TOKEN a1expr[EXPRSIZE]; // Expression
-VALUE a1exval; // Expression's value
+uint64_t a1exval; // Expression's value
WORD a1exattr; // Expression's attribute
int a1ixreg; // Index register
int a1ixsiz; // Index register size (and scale)
TOKEN a1oexpr[EXPRSIZE]; // Outer displacement expression
-VALUE a1oexval; // Outer displacement value
+uint64_t a1oexval; // Outer displacement value
WORD a1oexattr; // Outer displacement attribute
SYM * a1esym; // External symbol involved in expr
TOKEN a1bexpr[EXPRSIZE]; // Base displacement expression
-VALUE a1bexval; // Base displacement value
+uint64_t a1bexval; // Base displacement value
WORD a1bexattr; // Base displacement attribute
WORD a1bsize; // Base displacement size
WORD a1extension; // 020+ extension address word
int bfparam1; // bfxxx / fmove instruction parameter 1
int bfparam2; // bfxxx / fmove instruction parameter 2
-int bfval1; //bfxxx / fmove value 1
-int bfval2; //bfxxx / fmove value 2
+int bfval1; // bfxxx / fmove value 1
+int bfval2; // bfxxx / fmove value 2
TOKEN bf0expr[EXPRSIZE]; // Expression
-VALUE bf0exval; // Expression's value
+uint64_t bf0exval; // Expression's value
WORD bf0exattr; // Expression's attribute
SYM * bf0esym; // External symbol involved in expr
a0exattr = a0oexattr = a1exattr = a1oexattr = 0;
a0esym = a1esym = NULL;
a0bexpr[0] = a1bexpr[0] = ENDEXPR;
- a0bexval = a0bsize = a0extension = a1bexval = a1bsize = a1extension = 0;
+ a0bexval = a1bexval = 0;
+ a0bsize = a0extension = a1bsize = a1extension = 0;
am0_030 = am1_030 = 0;
bfparam1 = bfparam2 = 0;
bf0expr[0] = ENDEXPR;
bf0esym = NULL;
// If at EOL, then no addr modes at all
- if (*tok == EOL)
+ if (*tok.u32 == EOL)
return 0;
// Parse first addressing mode
#define AnREG a0reg
#define AnIXREG a0ixreg
#define AnIXSIZ a0ixsiz
- #define AnEXPR a0expr
+ #define AnEXPR (TOKENPTR)a0expr
#define AnEXVAL a0exval
#define AnEXATTR a0exattr
- #define AnOEXPR a0oexpr
+ #define AnOEXPR (TOKENPTR)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 AnBEXPR (TOKENPTR)a0bexpr
#define AnBEXVAL a0bexval
#define AnBEXATTR a0bexattr
#define AnBZISE a0bsize
// it's a bitfield instruction--check the parameters inside the {} block
// for validity
- if (*tok == '{')
- if (check030bf() == ERROR)
- return ERROR;
+ if (*tok.u32 == '{')
+ if (check030bf() == ERROR)
+ return ERROR;
- if ((acount == 0) || (*tok != ','))
+ if ((acount == 0) || (*tok.u32 != ','))
return 1;
// Eat the comma
- tok++;
+ tok.u32++;
// Parse second addressing mode
#define AnOK a1ok
#define AnREG a1reg
#define AnIXREG a1ixreg
#define AnIXSIZ a1ixsiz
- #define AnEXPR a1expr
+ #define AnEXPR (TOKENPTR)a1expr
#define AnEXVAL a1exval
#define AnEXATTR a1exattr
- #define AnOEXPR a1oexpr
+ #define AnOEXPR (TOKENPTR)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 AnBEXPR (TOKENPTR)a1bexpr
#define AnBEXVAL a1bexval
#define AnBEXATTR a1bexattr
#define AnBZISE a1bsize
// It's a bitfield instruction--check the parameters inside the {} block
// for validity
- if (*tok == '{')
+ if (*tok.u32 == '{')
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 (*tok.u32 == ':')
{
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
+ tok.u32++; //eat the colon
- if ((*tok >= KW_D0) && (*tok <= KW_D7))
+ if ((*tok.u32 >= KW_D0) && (*tok.u32 <= KW_D7))
{
- a2reg = (*tok - KW_D0);
+ a2reg = (*tok.u32 - KW_D0);
mulmode = 1 << 10;
}
- else if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
+ else if ((*tok.u32 >= KW_FP0) && (*tok.u32 <= KW_FP7))
{
- a2reg = (*tok - KW_FP0);
+ a2reg = (*tok.u32 - KW_FP0);
mulmode = 1 << 10;
}
else
return error("a data or FPU register must follow a :");
- *tok++;
+ *tok.u32++;
}
else
{
for(;;)
{
- if ((*tok >= KW_D0) && (*tok <= KW_A7))
- r = *tok++ & 0x0F;
+ if ((*tok.u32 >= KW_D0) && (*tok.u32 <= KW_A7))
+ r = *tok.u32++ & 0x0F;
else
break;
- if (*tok == '-')
+ if (*tok.u32 == '-')
{
- tok++;
+ tok.u32++;
- if ((*tok >= KW_D0) && (*tok <= KW_A7))
- cnt = *tok++ & 0x0F;
+ if ((*tok.u32 >= KW_D0) && (*tok.u32 <= KW_A7))
+ cnt = *tok.u32++ & 0x0F;
else
return error("register list syntax");
while (cnt-- >= 0)
rmask |= msktab[r++];
- if (*tok != '/')
+ if (*tok.u32 != '/')
break;
- tok++;
+ tok.u32++;
}
*a_rmask = rmask;
for(;;)
{
- if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
- r = *tok++ & 0x07;
+ if ((*tok.u32 >= KW_FP0) && (*tok.u32 <= KW_FP7))
+ r = *tok.u32++ & 0x07;
else
break;
- if (*tok == '-')
+ if (*tok.u32 == '-')
{
- tok++;
+ tok.u32++;
- if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
- cnt = *tok++ & 0x07;
+ if ((*tok.u32 >= KW_FP0) && (*tok.u32 <= KW_FP7))
+ cnt = *tok.u32++ & 0x07;
else
return error("register list syntax");
else
cnt = 0;
- r = 0;
+ r = 0;
+
while (cnt-- >= 0)
rmask |= msktab_minus[r++];
- if (*tok != '/')
+ if (*tok.u32 != '/')
break;
- tok++;
+ tok.u32++;
}
*a_rmask = rmask;
for(;;)
{
- if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
- r = *tok++ & 0x07;
+ if ((*tok.u32 >= KW_FP0) && (*tok.u32 <= KW_FP7))
+ r = *tok.u32++ & 0x07;
else
break;
- if (*tok == '-')
+ if (*tok.u32 == '-')
{
- tok++;
+ tok.u32++;
- if ((*tok >= KW_FP0) && (*tok <= KW_FP7))
- cnt = *tok++ & 0x07;
+ if ((*tok.u32 >= KW_FP0) && (*tok.u32 <= KW_FP7))
+ cnt = *tok.u32++ & 0x07;
else
return error("register list syntax");
while (cnt-- >= 0)
rmask |= msktab_plus[r++];
- if (*tok != '/')
+ if (*tok.u32 != '/')
break;
- tok++;
+ tok.u32++;
}
*a_rmask = rmask;
int check030bf(void)
{
CHECK00;
+ tok.u32++;
- tok++;
-
- if (*tok == CONST)
+ if (*tok.u32 == CONST)
{
- tok++;
- bfval1 = *(int *)tok;
+ tok.u32++;
+// bfval1 = (int)*(uint64_t *)tok.u32;
+ bfval1 = (int)*tok.u64;
// Do=0, offset=immediate - shift it to place
bfparam1 = (0 << 11);
- tok++;
+// tok.u32++;
+// tok.u32++;
+ tok.u64++;
}
- else if (*tok == SYMBOL)
+ else if (*tok.u32 == SYMBOL)
{
- if (expr(bf0expr, &bf0exval, &bf0exattr, &bf0esym) != OK)
+ if (expr((TOKENPTR)bf0expr, &bf0exval, &bf0exattr, &bf0esym) != OK)
return ERROR;
if (!(bf0exattr & DEFINED))
return error("bfxxx offset: immediate value must evaluate");
- bfval1 = bf0exval;
+ bfval1 = (int)bf0exval;
// Do=0, offset=immediate - shift it to place
bfparam1 = (0 << 11);
}
- else if ((*tok >= KW_D0) && (*tok <= KW_D7))
+ else if ((*tok.u32 >= KW_D0) && (*tok.u32 <= KW_D7))
{
// Do=1, offset=data register - shift it to place
bfparam1 = (1 << 11);
- bfval1 = (*(int *)tok - 128);
- tok++;
+ bfval1 = (*(int *)tok.u32 - 128);
+ tok.u32++;
}
else
return ERROR;
- if (*tok==':')
- tok++; //eat the ':'
+ // Eat the ':', if any
+ if (*tok.u32 == ':')
+ tok.u32++;
- if (*tok == '}' && tok[1] == EOL)
+ if (*tok.u32 == '}' && tok.u32[1] == EOL)
{
// It is ok to have }, EOL here - it might be "fmove fpn,<ea> {dx}"
- tok++;
+ tok.u32++;
return OK;
}
- if (*tok == CONST)
+ if (*tok.u32 == CONST)
{
- tok++;
- bfval2 = *(int *)tok;
+ tok.u32++;
+// bfval2 = (int)*(uint64_t *)tok.u32;
+ bfval2 = (int)*tok.u64;
// Do=0, offset=immediate - shift it to place
bfparam2 = (0 << 5);
- tok++;
+// tok.u32++;
+// tok.u32++;
+ tok.u64++;
}
- else if (*tok == SYMBOL)
+ else if (*tok.u32 == SYMBOL)
{
- if (expr(bf0expr, &bf0exval, &bf0exattr, &bf0esym) != OK)
+ if (expr((TOKENPTR)bf0expr, &bf0exval, &bf0exattr, &bf0esym) != OK)
return ERROR;
- bfval2 = bf0exval;
+ bfval2 = (int)bf0exval;
if (!(bf0exattr & DEFINED))
return error("bfxxx width: immediate value must evaluate");
// Do=0, offset=immediate - shift it to place
bfparam2 = (0 << 5);
}
- else if ((*tok >= KW_D0) && (*tok <= KW_D7))
+ else if ((*tok.u32 >= KW_D0) && (*tok.u32 <= KW_D7))
{
// Do=1, offset=data register - shift it to place
- bfval2 = ((*(int *)tok - 128));
+ bfval2 = ((*(int *)tok.u32 - 128));
bfparam2 = (1 << 5);
- tok++;
+ tok.u32++;
}
else
return ERROR;
- tok++; // Eat the '}'
+ tok.u32++; // Eat the '}'
return OK;
}