Add immediate variable address parameter in inline assembler
This commit is contained in:
parent
9a0256449b
commit
4eaa6c8b1e
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue