In particular, renamed "virtual operands" to "inline parameters".
range, where <tt/label/ is the label name given with the <tt/NAME/
attribute, and <tt/offs/ is the offset within the data.
- <tag><tt>VOPERAND</tt></tag>
+ <tag><tt>PARAMSIZE</tt></tag>
This optional attribute is followed by a numerical value. It tells the
- assembler that subroutine calls to this label follow "virtual operands"
+ assembler that subroutine calls to this label follow "inline parameters"
of the given bytes like this:
<tscreen><verb>
- JSR LabelWith2BytesOfVoperand
- .byte $00, $10 ; virtual operands
- ; return here
- BIT $0F
+ JSR LabelWithParamSize2
+ .byte $00, $10
+ (return here)
+ code...
</verb></tscreen>
</descrip>
-static unsigned short SubroutineVOperandSize[0x10000];
+static unsigned short SubroutineParamSize[0x10000];
/*****************************************************************************/
/* Helper functions */
void OH_JsrAbsolute (const OpcDesc* D)
{
- unsigned VOperandSize = SubroutineVOperandSize[GetCodeWord(PC+1)];
+ unsigned ParamSize = SubroutineParamSize[GetCodeWord(PC+1)];
OH_Absolute (D);
- if (VOperandSize > 0) {
+ if (ParamSize > 0) {
unsigned RemainingBytes;
+ unsigned BytesLeft;
PC += D->Size;
RemainingBytes = GetRemainingBytes();
- if (RemainingBytes < VOperandSize) {
- VOperandSize = RemainingBytes;
+ if (RemainingBytes < ParamSize) {
+ ParamSize = RemainingBytes;
}
- if (VOperandSize > 0) {
- DataByteLine (VOperandSize); /* FIXME: follow BytesPerLine */
- PC += VOperandSize;
+ BytesLeft = ParamSize;
+ while (BytesLeft > 0) {
+ unsigned Chunk = (BytesLeft > BytesPerLine)? BytesPerLine : BytesLeft;
+ DataByteLine (Chunk);
+ BytesLeft -= Chunk;
+ PC += Chunk;
}
PC -= D->Size;
}
-void SetSubroutineVOperand (unsigned Addr, unsigned Size)
+void SetSubroutineParamSize (unsigned Addr, unsigned Size)
{
- SubroutineVOperandSize[Addr] = Size;
+ SubroutineParamSize[Addr] = Size;
}
void OH_JmpAbsoluteXIndirect (const OpcDesc* D);
void OH_JsrAbsolute (const OpcDesc*);
-void SetSubroutineVOperand (unsigned Addr, unsigned Size);
+void SetSubroutineParamSize (unsigned Addr, unsigned Size);
/* End of handler.h */
{ "ADDR", INFOTOK_ADDR },
{ "NAME", INFOTOK_NAME },
{ "SIZE", INFOTOK_SIZE },
- { "VOPERAND", INFOTOK_VOPERAND },
+ { "PARAMSIZE", INFOTOK_PARAMSIZE },
};
/* Locals - initialize to avoid gcc warnings */
char* Comment = 0;
long Value = -1;
long Size = -1;
- long VOperand = -1;
+ long ParamSize = -1;
/* Skip the token */
InfoNextTok ();
InfoNextTok ();
break;
- case INFOTOK_VOPERAND:
+ case INFOTOK_PARAMSIZE:
InfoNextTok ();
- if (VOperand >= 0) {
- InfoError ("VOperand already given");
+ if (ParamSize >= 0) {
+ InfoError ("ParamSize already given");
}
InfoAssureInt ();
InfoRangeCheck (1, 0x10000);
- VOperand = InfoIVal;
+ ParamSize = InfoIVal;
InfoNextTok ();
break;
} else {
AddExtLabelRange ((unsigned) Value, Name, Size);
}
- if (VOperand >= 0) {
- SetSubroutineVOperand ((unsigned) Value, (unsigned) VOperand);
+ if (ParamSize >= 0) {
+ SetSubroutineParamSize ((unsigned) Value, (unsigned) ParamSize);
}
/* Define the comment */
INFOTOK_COMMENT,
INFOTOK_ADDR,
INFOTOK_SIZE,
- INFOTOK_VOPERAND,
+ INFOTOK_PARAMSIZE,
/* ASMINC section */
INFOTOK_FILE,