+ if (*tok.u32 != CONST && *tok.u32 != SYMBOL)
+ return error("function code should be an expression");
+
+ if (expr((TOKENPTR)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 = (uint16_t)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.u32++ & 7);
+ break;
+ case KW_SFC:
+ fc = 0;
+ tok.u32++;
+ break;
+ case KW_DFC:
+ fc = 1;
+ tok.u32++;
+ break;
+ default:
+ return error(syntax_error);
+ }
+
+ if (*tok.u32++ != ',')
+ return error("comma exptected");
+
+ if (*tok.u32++ != '#')
+ return error("mask should be an immediate value");
+
+ if (*tok.u32 != CONST && *tok.u32 != SYMBOL)
+ return error("mask is supposed to be immediate");
+
+ if (expr((TOKENPTR)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 = (uint16_t)a0exval << 5;
+
+ if (*tok.u32 == EOL)
+ {
+ // PFLUSH FC, MASK
+ D_word(inst);
+ inst = (1 << 13) | fc | mask | (4 << 10);
+ D_word(inst);
+ return OK;
+ }
+ else if (*tok.u32 == ',')
+ {
+ // PFLUSH FC, MASK, < ea >
+ tok.u32++;
+
+ if (amode(0) == ERROR)
+ return ERROR;
+
+ if (*tok.u32 != 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;