// it's a bitfield instruction--check the parameters inside the {} block
// for validity
if (*tok == '{')
- if (check030bf() == ERROR)
- return ERROR;
+ if (check030bf() == ERROR)
+ return ERROR;
if ((acount == 0) || (*tok != ','))
return 1;
// It's a bitfield instruction--check the parameters inside the {} block
// for validity
- if (*tok == '{')
+ if (*tok == '{')
if (check030bf() == ERROR)
return ERROR;
else
cnt = 0;
- r = 0;
+ r = 0;
+
while (cnt-- >= 0)
rmask |= msktab_minus[r++];
int check030bf(void)
{
CHECK00;
-
tok++;
if (*tok == CONST)
#define AM_CCR 0110
#define AM_NONE 0111 // Nothing
#define CACHES 0120 // Instruction/Data/Both Caches (IC/DC/BC)
-#define CREG 0121 // Control registers (see CREGlut in mach.c)
+#define CREG 0121 // Control registers (see CREGlut in mach.c)
#define FREG 0122 // FPU registers (fp0-fp7)
#define FPSCR 0123 // FPU system control registers (fpiar, fpsr, fpcr)
#define M_CREG 0x00800000L // Control registers
#define M_FREG 0x01000000L // FPn
#define M_FPSCR 0x02000000L // fpiar, fpsr, fpcr
-#define M_CACHE40 0x04000000L // 68040 cache registers (IC40,DC40,BC40)
+#define M_CACHE40 0x04000000L // 68040 cache registers (IC40,DC40,BC40)
// Addr mode categories
#define C_ALL 0x00000FFFL
#define C_DATA030 0x0003FFFDL
#define C_MOVES (M_AIND | M_APOSTINC | M_APREDEC | M_ADISP | M_AINDEXED | M_ABSW | M_ABSL | M_ABASE | M_MEMPRE | M_MEMPOST)
#define C_BF1 (M_DREG | M_AIND | M_AINDEXED | M_ADISP | M_ABSW | M_ABSL | M_ABASE | M_MEMPOST | M_MEMPRE)
-#define C_BF2 (C_BF1 | M_PCDISP | M_PCINDEXED | M_PCBASE | M_PCMPOST | M_PCMPRE )
+#define C_BF2 (C_BF1 | M_PCDISP | M_PCINDEXED | M_PCBASE | M_PCMPOST | M_PCMPRE)
#define C_PMOVE (M_AIND | M_ADISP | M_AINDEXED | M_ABSW | M_ABSL | M_ABASE | M_MEMPRE | M_MEMPOST)
#define C_ALTDATA (C_DATA & C_ALT)
else if (*tok++ != ',')
return error("comma expected after ]");
- if (*tok == SYMBOL || *tok == CONST)
- {
- if (expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
- goto badmode;
-
- if (CHECK_OPTS(OPT_BASE_DISP) && (AnEXVAL == 0) && (AnEXATTR & DEFINED))
+ if (*tok == SYMBOL || *tok == CONST)
{
- // od=0 so optimise it out
- AMn = MEMPRE; // let's say it's ([bd,An],Xn,od) with od=0 then
- AnEXTEN |= EXT_IISPRE0; // No outer displacement
- tok++;
- goto AnOK;
+ if (expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
+ goto badmode;
+
+ if (CHECK_OPTS(OPT_BASE_DISP) && (AnEXVAL == 0) && (AnEXATTR & DEFINED))
+ {
+ // od=0 so optimise it out
+ AMn = MEMPRE; // let's say it's ([bd,An],Xn,od) with od=0 then
+ AnEXTEN |= EXT_IISPRE0; // No outer displacement
+ tok++;
+ goto AnOK;
+ }
}
- }
// ([bd,An/PC,Xn],od)
if (*tok == DOTL)
else
{
// expr.[W]
- int expr_size;
-
AMn = MEMPRE;
- expr_size = EXT_IISPREW; // Assume we have a .w value
+ int expr_size = EXT_IISPREW; // Assume we have a .w value
- if ((AnEXVAL + 0x8000) > 0x10000)
+ if ((AnEXVAL + 0x8000) > 0x10000)
{
- // Long value, so mark it as such for now
- expr_size = EXT_IISPREL;
- // Defined, absolute values from $FFFF8000..$00007FFF get optimized
- // to absolute short
+ // Long value, so mark it as such for now
+ expr_size = EXT_IISPREL;
+
+ // Defined, absolute values from $FFFF8000..$00007FFF
+ // get optimized to absolute short
if (CHECK_OPTS(OPT_BASE_DISP)
- && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
- && ((AnEXVAL + 0x8000) < 0x10000))
- {
- expr_size = EXT_IISPREW;
- warn("outer displacement absolute value from $FFFF8000..$00007FFF optimised to absolute short");
+ && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
+ && ((AnEXVAL + 0x8000) < 0x10000))
+ {
+ expr_size = EXT_IISPREW;
+ warn("outer displacement absolute value from $FFFF8000..$00007FFF optimised to absolute short");
+ }
}
- }
- AnEXTEN |= expr_size; // Assume we have a .w value
+ AnEXTEN |= expr_size; // Assume we have a .w value
- // Is .W forced here?
+ // Is .W forced here?
if (*tok == DOTW)
{
tok++;
- if (expr_size == EXT_IISPREL)
- return error("outer displacement value does not fit in .w size");
- }
+ if (expr_size == EXT_IISPREL)
+ return error("outer displacement value does not fit in .w size");
+ }
}
// Check for final closing parenthesis
0L, // 0115
0L, // 0116
0L, // 0117
- M_CACHE40, // 0120
+ M_CACHE40, // 0120
M_CREG, // 0121
M_FREG, // 0122
M_FPSCR // 0123
// Check for ".b" ".w" ".l" after directive, macro or mnemonic.
siz = SIZN;
- switch (*tok)
- {
- case DOTW: siz = SIZW, tok++; break;
- case DOTL: siz = SIZL, tok++; break;
- case DOTB: siz = SIZB, tok++; break;
- case DOTD: siz = SIZD, tok++; break;
- case DOTP: siz = SIZP, tok++; break;
- case DOTQ: siz = SIZQ, tok++; break;
- case DOTS: siz = SIZS, tok++; break;
- case DOTX: siz = SIZX, tok++; break;
- }
+ switch (*tok)
+ {
+ case DOTW: siz = SIZW, tok++; break;
+ case DOTL: siz = SIZL, tok++; break;
+ case DOTB: siz = SIZB, tok++; break;
+ case DOTD: siz = SIZD, tok++; break;
+ case DOTP: siz = SIZP, tok++; break;
+ case DOTQ: siz = SIZQ, tok++; break;
+ case DOTS: siz = SIZS, tok++; break;
+ case DOTX: siz = SIZX, tok++; break;
+ }
// Do special directives (500..999) (These must be handled in "real time")
return 0;
}
-
case '\\':
c = '\\';
break;
- case '!':
- // If we're evaluating a macro
- // this is valid and expands to
- // "dot-size"
- break;
+ case '!':
+ // If we're evaluating a macro
+ // this is valid and expands to
+ // "dot-size"
+ break;
default:
warn("bad backslash code in string");
ln--;
{
v &= 0x000000FF;
ln += 2;
- *tk++ = CONST;
- *tk++ = v;
- *tk++ = DOTB;
+ *tk++ = CONST;
+ *tk++ = v;
+ *tk++ = DOTB;
}
else if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W'))
{
v &= 0x0000FFFF;
ln += 2;
- *tk++ = CONST;
- *tk++ = v;
- *tk++ = DOTW;
+ *tk++ = CONST;
+ *tk++ = v;
+ *tk++ = DOTW;
}
else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L'))
{
ln += 2;
- *tk++ = CONST;
- *tk++ = v;
- *tk++ = DOTL;
- }
- }
- else
- {
- *tk++ = CONST;
- *tk++ = v;
- }
+ *tk++ = CONST;
+ *tk++ = v;
+ *tk++ = DOTL;
+ }
+ }
+ else
+ {
+ *tk++ = CONST;
+ *tk++ = v;
+ }
//printf("CONST: %i\n", v);
continue;
#define MAJOR 1 // Major version number
#define MINOR 8 // Minor version number
-#define PATCH 3 // Patch release number
+#define PATCH 4 // Patch release number
#endif // __VERSION_H__