Added .asize and .isize pseudo variables

These pseudo variables will return the size of the accumulator/index
in bits.

For the 65816 instruction set .ASIZE/.ISIZE will return either 8 or 16,
depending on the current size of the operand in immediate addressing
mode.

For all other CPU instruction sets, .ASIZE/.ISIZE will always return 8.

For example:

	; Reverse Subtract with Accumulator
	; A = memory - A
	.macro rsb param
		.if .asize = 8
			eor	#$ff
		.else
			eor	#$ffff
		.endif
		sec
		adc	param
	.endmacro
This commit is contained in:
Marcus Rowe
2015-10-20 09:30:25 +10:00
parent f4335eca87
commit 67cd0c2197
5 changed files with 66 additions and 0 deletions

View File

@@ -1099,6 +1099,15 @@ static ExprNode* Factor (void)
N = Function (FuncAddrSize);
break;
case TOK_ASIZE:
if (GetCPU() != CPU_65816) {
N = GenLiteralExpr (8);
} else {
N = GenLiteralExpr (ExtBytes [AM65I_IMM_ACCU] * 8);
}
NextTok ();
break;
case TOK_BLANK:
N = Function (FuncBlank);
break;
@@ -1132,6 +1141,15 @@ static ExprNode* Factor (void)
N = Function (FuncIsMnemonic);
break;
case TOK_ISIZE:
if (GetCPU() != CPU_65816) {
N = GenLiteralExpr (8);
} else {
N = GenLiteralExpr (ExtBytes [AM65I_IMM_INDEX] * 8);
}
NextTok ();
break;
case TOK_LOBYTE:
N = Function (FuncLoByte);
break;