Support for "virtual operands" of subroutines like this:
jsr SomeProc .byte $00, $01 ; argument to SomeProc ; return here from SomeProc bit $3F
This commit is contained in:
@@ -542,6 +542,18 @@ code. The following attributes are recognized:
|
|||||||
range, where <tt/label/ is the label name given with the <tt/NAME/
|
range, where <tt/label/ is the label name given with the <tt/NAME/
|
||||||
attribute, and <tt/offs/ is the offset within the data.
|
attribute, and <tt/offs/ is the offset within the data.
|
||||||
|
|
||||||
|
<tag><tt>VOPERAND</tt></tag>
|
||||||
|
This optional attribute is followed by a numerical value. It tells the
|
||||||
|
assembler that subroutine calls to this label follow "virtual operands"
|
||||||
|
of the given bytes like this:
|
||||||
|
|
||||||
|
<tscreen><verb>
|
||||||
|
JSR LabelWith2BytesOfVoperand
|
||||||
|
.byte $00, $10 ; virtual operands
|
||||||
|
; return here
|
||||||
|
BIT $0F
|
||||||
|
</verb></tscreen>
|
||||||
|
|
||||||
</descrip>
|
</descrip>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned short SubroutineVOperandSize[0x10000];
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Helper functions */
|
/* Helper functions */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -741,3 +743,31 @@ void OH_JmpAbsoluteXIndirect (const OpcDesc* D)
|
|||||||
}
|
}
|
||||||
SeparatorLine ();
|
SeparatorLine ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void OH_JsrAbsolute (const OpcDesc* D)
|
||||||
|
{
|
||||||
|
unsigned VOperandSize = SubroutineVOperandSize[GetCodeWord(PC+1)];
|
||||||
|
OH_Absolute (D);
|
||||||
|
if (VOperandSize > 0) {
|
||||||
|
unsigned RemainingBytes;
|
||||||
|
PC += D->Size;
|
||||||
|
RemainingBytes = GetRemainingBytes();
|
||||||
|
if (RemainingBytes < VOperandSize) {
|
||||||
|
VOperandSize = RemainingBytes;
|
||||||
|
}
|
||||||
|
if (VOperandSize > 0) {
|
||||||
|
DataByteLine (VOperandSize); /* FIXME: follow BytesPerLine */
|
||||||
|
PC += VOperandSize;
|
||||||
|
}
|
||||||
|
PC -= D->Size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetSubroutineVOperand (unsigned Addr, unsigned Size)
|
||||||
|
{
|
||||||
|
SubroutineVOperandSize[Addr] = Size;
|
||||||
|
}
|
||||||
|
|||||||
@@ -104,7 +104,9 @@ void OH_Rts (const OpcDesc*);
|
|||||||
void OH_JmpAbsolute (const OpcDesc*);
|
void OH_JmpAbsolute (const OpcDesc*);
|
||||||
void OH_JmpAbsoluteIndirect (const OpcDesc* D);
|
void OH_JmpAbsoluteIndirect (const OpcDesc* D);
|
||||||
void OH_JmpAbsoluteXIndirect (const OpcDesc* D);
|
void OH_JmpAbsoluteXIndirect (const OpcDesc* D);
|
||||||
|
void OH_JsrAbsolute (const OpcDesc*);
|
||||||
|
|
||||||
|
void SetSubroutineVOperand (unsigned Addr, unsigned Size);
|
||||||
|
|
||||||
|
|
||||||
/* End of handler.h */
|
/* End of handler.h */
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
#include "opctable.h"
|
#include "opctable.h"
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
|
#include "handler.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -380,6 +381,7 @@ static void LabelSection (void)
|
|||||||
{ "ADDR", INFOTOK_ADDR },
|
{ "ADDR", INFOTOK_ADDR },
|
||||||
{ "NAME", INFOTOK_NAME },
|
{ "NAME", INFOTOK_NAME },
|
||||||
{ "SIZE", INFOTOK_SIZE },
|
{ "SIZE", INFOTOK_SIZE },
|
||||||
|
{ "VOPERAND", INFOTOK_VOPERAND },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Locals - initialize to avoid gcc warnings */
|
/* Locals - initialize to avoid gcc warnings */
|
||||||
@@ -387,6 +389,7 @@ static void LabelSection (void)
|
|||||||
char* Comment = 0;
|
char* Comment = 0;
|
||||||
long Value = -1;
|
long Value = -1;
|
||||||
long Size = -1;
|
long Size = -1;
|
||||||
|
long VOperand = -1;
|
||||||
|
|
||||||
/* Skip the token */
|
/* Skip the token */
|
||||||
InfoNextTok ();
|
InfoNextTok ();
|
||||||
@@ -448,6 +451,17 @@ static void LabelSection (void)
|
|||||||
InfoNextTok ();
|
InfoNextTok ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case INFOTOK_VOPERAND:
|
||||||
|
InfoNextTok ();
|
||||||
|
if (VOperand >= 0) {
|
||||||
|
InfoError ("VOperand already given");
|
||||||
|
}
|
||||||
|
InfoAssureInt ();
|
||||||
|
InfoRangeCheck (1, 0x10000);
|
||||||
|
VOperand = InfoIVal;
|
||||||
|
InfoNextTok ();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Internal ("Unexpected token: %u", InfoTok);
|
Internal ("Unexpected token: %u", InfoTok);
|
||||||
}
|
}
|
||||||
@@ -484,6 +498,9 @@ static void LabelSection (void)
|
|||||||
} else {
|
} else {
|
||||||
AddExtLabelRange ((unsigned) Value, Name, Size);
|
AddExtLabelRange ((unsigned) Value, Name, Size);
|
||||||
}
|
}
|
||||||
|
if (VOperand >= 0) {
|
||||||
|
SetSubroutineVOperand ((unsigned) Value, (unsigned) VOperand);
|
||||||
|
}
|
||||||
|
|
||||||
/* Define the comment */
|
/* Define the comment */
|
||||||
if (Comment) {
|
if (Comment) {
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ const OpcDesc OpcTable_6502[256] = {
|
|||||||
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
||||||
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $1f */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $1f */
|
||||||
{ "jsr", 3, flLabel, OH_Absolute }, /* $20 */
|
{ "jsr", 3, flLabel, OH_JsrAbsolute }, /* $20 */
|
||||||
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ const OpcDesc OpcTable_65816[256] = {
|
|||||||
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
||||||
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
||||||
{ "ora", 4, flUseLabel, OH_AbsoluteLongX }, /* $1f */
|
{ "ora", 4, flUseLabel, OH_AbsoluteLongX }, /* $1f */
|
||||||
{ "jsr", 3, flLabel, OH_Absolute }, /* $20 */
|
{ "jsr", 3, flLabel, OH_JsrAbsolute }, /* $20 */
|
||||||
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
||||||
{ "jsl", 3, flLabel, OH_AbsoluteLong }, /* $22 */
|
{ "jsl", 3, flLabel, OH_AbsoluteLong }, /* $22 */
|
||||||
{ "and", 2, flNone, OH_StackRelative }, /* $23 */
|
{ "and", 2, flNone, OH_StackRelative }, /* $23 */
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ const OpcDesc OpcTable_65C02[256] = {
|
|||||||
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
||||||
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
||||||
{ "bbr1", 3, flUseLabel, OH_BitBranch }, /* $1f */
|
{ "bbr1", 3, flUseLabel, OH_BitBranch }, /* $1f */
|
||||||
{ "jsr", 3, flLabel, OH_Absolute }, /* $20 */
|
{ "jsr", 3, flLabel, OH_JsrAbsolute }, /* $20 */
|
||||||
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ const OpcDesc OpcTable_65SC02[256] = {
|
|||||||
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
{ "ora", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1d */
|
||||||
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
{ "asl", 3, flUseLabel|flAbsOverride, OH_AbsoluteX }, /* $1e */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $1f */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $1f */
|
||||||
{ "jsr", 3, flLabel, OH_Absolute }, /* $20 */
|
{ "jsr", 3, flLabel, OH_JsrAbsolute }, /* $20 */
|
||||||
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
{ "and", 2, flUseLabel, OH_DirectXIndirect }, /* $21 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $22 */
|
||||||
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
{ "", 1, flIllegal, OH_Illegal, }, /* $23 */
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ typedef enum token_t {
|
|||||||
INFOTOK_COMMENT,
|
INFOTOK_COMMENT,
|
||||||
INFOTOK_ADDR,
|
INFOTOK_ADDR,
|
||||||
INFOTOK_SIZE,
|
INFOTOK_SIZE,
|
||||||
|
INFOTOK_VOPERAND,
|
||||||
|
|
||||||
/* ASMINC section */
|
/* ASMINC section */
|
||||||
INFOTOK_FILE,
|
INFOTOK_FILE,
|
||||||
|
|||||||
Reference in New Issue
Block a user