- // PFLUSH FC, MASK
- // PFLUSH FC, MASK, < ea >
- WORD mask, fc;
- switch ((int)*tok)
- {
- case '#':
- tok++;
- if (*tok != CONST && *tok != SYMBOL)
- return error("function code should be an expression");
- if (expr(a0expr, &a0exval, &a0exattr, &a0esym) == ERROR)
- return ERROR;
- if ((a0exattr & DEFINED) == 0)
- return error("function code immediate should be defined");
- if (a0exval > 7 && a0exval < 0)
- return error("function code out of range (0-7)");
- fc = a0exval;
- break;
- case KW_D0:
- case KW_D1:
- case KW_D2:
- case KW_D3:
- case KW_D4:
- case KW_D5:
- case KW_D6:
- case KW_D7:
- fc = (1 << 4) | (*tok++ & 7);
- break;
- case KW_SFC:
- fc = 0;
- tok++;
- break;
- case KW_DFC:
- fc = 1;
- tok++;
- break;
- default:
- return error(syntax_error);
- }
-
- if (*tok++ != ',')
- return error("comma exptected");
-
- if (*tok++ != '#')
- return error("mask should be an immediate value");
- if (*tok != CONST && *tok != SYMBOL)
- return error("mask is supposed to be immediate");
- if (expr(a0expr, &a0exval, &a0exattr, &a0esym) == ERROR)
- return ERROR;
- if ((a0exattr & DEFINED) == 0)
- return error("mask immediate value should be defined");
- if (a0exval > 7 && a0exval < 0)
- return error("function code out of range (0-7)");
- mask = a0exval << 5;
-
- if (*tok == EOL)
- {
- // PFLUSH FC, MASK
- D_word(inst);
- inst = (1 << 13) | fc | mask | (4 << 10);
- D_word(inst);
- return OK;
- }
- else if (*tok == ',')
- {
- // PFLUSH FC, MASK, < ea >
- tok++;
- if (amode(0) == ERROR)
- return ERROR;
- if (*tok != EOL)
- return error(extra_stuff);
- if (am0 == AIND || am0 == ABSW || am0 == ABSL || am0 == ADISP || am0 == ADISP || am0 == AINDEXED || am0 == ABASE || am0 == MEMPOST || am0 == MEMPRE)
- {
- inst |= am0 | a0reg;
- D_word(inst);
- inst = (1 << 13) | fc | mask | (6 << 10);
- D_word(inst);
- ea0gen(siz);
- return OK;
- }
- else
- return error("unsupported addressing mode");
-
- }
- else
- return error(syntax_error);
-
- return OK;