From 91c907be7e6a1a38aa7d5f24fc8d9a6d42d2deb9 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 28 Jan 2024 09:39:40 +0100 Subject: [PATCH] Improve BYT operands in inline assembler --- oscar64/Parser.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 5f2a60e..001a16a 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -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");