Add immediate variable address parameter in inline assembler

This commit is contained in:
drmortalwombat 2024-01-10 12:22:46 +01:00
parent 9a0256449b
commit 4eaa6c8b1e
2 changed files with 46 additions and 30 deletions

View File

@ -110,10 +110,6 @@ bool krnio_load(char fnum, char device, char channel)
{
__asm
{
lda #0
sta accu
sta accu + 1
lda fnum
ldx device
ldy channel
@ -122,15 +118,12 @@ bool krnio_load(char fnum, char device, char channel)
lda #0
ldx #0
ldy #0
jsr $FFD5 // open
bcc W1
jsr $FFD5 // load
lda #0
jmp E2
W1:
lda #1
sta accu
E2:
bcs W1
lda #1
W1: sta accu
}
}
@ -140,37 +133,24 @@ bool krnio_save(char device, const char* start, const char* end)
{
__asm
{
lda start
sta accu
lda start + 1
sta accu + 1
lda #0
ldx device
ldy #0
jsr $ffba // setlfs
lda #accu
lda #start
ldx end
ldy end+1
jsr $FFD8 // save
lda #0
sta accu
sta accu + 1
bcc W1
lda #0
jmp E2
W1:
lda #1
sta accu
E2:
bcs W1
lda #1
W1: sta accu
}
}
#pragma native(krnio_load)
#pragma native(krnio_save)
bool krnio_chkout(char fnum)
{
@ -179,7 +159,6 @@ bool krnio_chkout(char fnum)
ldx fnum
jsr $ffc9 // chkout
lda #0
sta accu + 1
bcs W1
lda #1
W1: sta accu

View File

@ -814,6 +814,43 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
else
mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Invalid immediate operand");
}
else if (aexp->mType == DT_ARGUMENT || aexp->mType == DT_VARIABLE)
{
if (aexp->mFlags & DTF_GLOBAL)
{
InitGlobalVariable(mod, aexp);
LinkerReference ref;
ref.mObject = dec->mLinkerObject;
ref.mOffset = offset;
ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mLinkerObject;
ref.mRefOffset = 0;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref);
}
else if (refvars)
{
int j = 0;
while (j < refvars->Size() && (*refvars)[j] != aexp)
j++;
if (j == refvars->Size())
refvars->Push(aexp);
LinkerReference ref;
ref.mObject = dec->mLinkerObject;
ref.mOffset = offset;
ref.mFlags = LREF_TEMPORARY;
ref.mRefObject = dec->mLinkerObject;
ref.mRefOffset = j;
ref.mRefObject->mFlags |= LOBJF_RELEVANT;
dec->mLinkerObject->AddReference(ref);
d[offset] = 0;
}
else
mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Local variable outside scope");
}
else if (aexp->mType == DT_FUNCTION_REF)
{
if (!aexp->mBase->mLinkerObject)