Improve BYT operands in inline assembler

This commit is contained in:
drmortalwombat 2024-01-28 09:39:40 +01:00
parent fafbbe82d1
commit 91c907be7e

View File

@ -10738,7 +10738,61 @@ Expression* Parser::ParseAssembler(void)
ilast->mAsmInsType = ins;
mScanner->NextToken();
if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE)
if (ins == ASMIT_BYTE)
{
for (;;)
{
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
if (mScanner->mToken == TK_STRING)
{
if (mScanner->mTokenString[0])
{
int i = 0;
while (mScanner->mTokenString[i])
{
Declaration* dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
dec->mInteger = mCharMap[mScanner->mTokenString[i]];
dec->mBase = TheUnsignedCharTypeDeclaration;
Expression* exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec;
exp->mDecType = dec->mBase;
ilast->mLeft = exp;
i++;
if (mScanner->mTokenString[i])
{
offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode);
ifinal = ilast;
ilast->mRight = new Expression(mScanner->mLocation, EX_ASSEMBLER);
ilast = ilast->mRight;
ilast->mAsmInsType = ASMIT_BYTE;
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
}
}
}
else
mErrors->Error(mScanner->mLocation, EERR_ASM_INVALID_INSTRUCTION, "Invalid assembler token");
mScanner->NextToken();
}
else
ilast->mLeft = ParseAssemblerOperand(vdasm, offset);
if (ConsumeTokenIf(TK_COMMA))
{
offset += AsmInsSize(ilast->mAsmInsType, ilast->mAsmInsMode);
ifinal = ilast;
ilast->mRight = new Expression(mScanner->mLocation, EX_ASSEMBLER);
ilast = ilast->mRight;
ilast->mAsmInsType = ASMIT_BYTE;
}
else
break;
}
}
else if (mScanner->mToken == TK_EOL || mScanner->mToken == TK_CLOSE_BRACE)
ilast->mAsmInsMode = ASMIM_IMPLIED;
else if (mScanner->mToken == TK_HASH)
{
@ -10832,9 +10886,6 @@ Expression* Parser::ParseAssembler(void)
}
}
if (ilast->mAsmInsType == ASMIT_BYTE)
ilast->mAsmInsMode = ASMIM_IMMEDIATE;
if (mScanner->mToken != TK_EOL && mScanner->mToken != TK_CLOSE_BRACE)
{
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "End of line expected");