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

View File

@ -814,6 +814,43 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
else else
mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Invalid immediate operand"); 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) else if (aexp->mType == DT_FUNCTION_REF)
{ {
if (!aexp->mBase->mLinkerObject) if (!aexp->mBase->mLinkerObject)