From 4eaa6c8b1eec308d5dbeea0bac8aa70bbe344ade Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:22:46 +0100 Subject: [PATCH] Add immediate variable address parameter in inline assembler --- include/c64/kernalio.c | 39 ++++++++-------------------------- oscar64/InterCodeGenerator.cpp | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/include/c64/kernalio.c b/include/c64/kernalio.c index de0961d..a41c587 100644 --- a/include/c64/kernalio.c +++ b/include/c64/kernalio.c @@ -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 diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 819a83f..bc53917 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -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)