]> git.sur5r.net Git - cc65/commitdiff
Added .asize and .isize pseudo variables
authorMarcus Rowe <undisbeliever@gmail.com>
Mon, 19 Oct 2015 23:30:25 +0000 (09:30 +1000)
committerMarcus Rowe <undisbeliever@gmail.com>
Mon, 19 Oct 2015 23:30:25 +0000 (09:30 +1000)
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

doc/ca65.sgml
src/ca65/expr.c
src/ca65/pseudo.c
src/ca65/scanner.c
src/ca65/token.h

index 19c09b85ddefd6e88e03f427d662068459efe446..278a81d1bef9ca1ce780203e7e7d12ba11e7e065 100644 (file)
@@ -1191,6 +1191,35 @@ writable.
   assignments to <tt/*/, use <tt/<ref id=".ORG" name=".ORG">/ instead.
 
 
+<sect1><tt>.ASIZE</tt><label id=".ASIZE"><p>
+
+  Reading this pseudo variable will return the current size of the
+  Accumulator in bits.
+
+  For the 65816 instruction set .ASIZE will return either 8 or 16, depending
+  on the current size of the operand in immediate accu addressing mode.
+
+  For all other CPU instruction sets, .ASIZE will always return 8.
+
+  Example:
+
+  <tscreen><verb>
+       ; Reverse Subtract with Accumulator
+       ; A = memory - A
+       .macro rsb param
+               .if .asize = 8
+                       eor     #$ff
+               .else
+                       eor     #$ffff
+               .endif
+               sec
+               adc     param
+       .endmacro
+  </verb></tscreen>
+
+  See also: <tt><ref id=".ISIZE" name=".ISIZE"></tt>
+
+
 <sect1><tt>.CPU</tt><label id=".CPU"><p>
 
   Reading this pseudo variable will give a constant integer value that
@@ -1218,6 +1247,19 @@ writable.
   </verb></tscreen>
 
 
+<sect1><tt>.ISIZE</tt><label id=".ISIZE"><p>
+
+  Reading this pseudo variable will return the current size of the Index
+  register in bits.
+
+  For the 65816 instruction set .ISIZE will return either 8 or 16, depending
+  on the current size of the operand in immediate index addressing mode.
+
+  For all other CPU instruction sets, .ISIZE will always return 8.
+
+  See also: <tt><ref id=".ASIZE" name=".ASIZE"></tt>
+
+
 <sect1><tt>.PARAMCOUNT</tt><label id=".PARAMCOUNT"><p>
 
   This builtin pseudo variable is only available in macros. It is replaced by
index 0352b3c804132ba236728b79985cb3d24be992d2..307772a5a655f2c0e505f868b683c9f5786ba390 100644 (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;
index 4484e3c26229474066937cf1da9694a3dc0c9a96..4db780318c0c8f35a90aa8b95fb45910169eef6a 100644 (file)
@@ -1967,6 +1967,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,           DoUnexpected    },      /* .ADDRSIZE */
     { ccNone,           DoAlign         },
     { ccNone,           DoASCIIZ        },
+    { ccNone,           DoUnexpected    },      /* .ASIZE */
     { ccNone,           DoAssert        },
     { ccNone,           DoAutoImport    },
     { ccNone,           DoUnexpected    },      /* .BANK */
@@ -2041,6 +2042,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,           DoIncBin        },
     { ccNone,           DoInclude       },
     { ccNone,           DoInterruptor   },
+    { ccNone,           DoUnexpected    },      /* .ISIZE */
     { ccNone,           DoUnexpected    },      /* .ISMNEMONIC */
     { ccNone,           DoInvalid       },      /* .LEFT */
     { ccNone,           DoLineCont      },
index aaba567642655c8d5309aeb58ec35c5bdeefd28f..7993210669c713fb5af3e872de953fd13d6a0fb4 100644 (file)
@@ -139,6 +139,7 @@ struct DotKeyword {
     { ".ALIGN",         TOK_ALIGN               },
     { ".AND",           TOK_BOOLAND             },
     { ".ASCIIZ",        TOK_ASCIIZ              },
+    { ".ASIZE",         TOK_ASIZE               },
     { ".ASSERT",        TOK_ASSERT              },
     { ".AUTOIMPORT",    TOK_AUTOIMPORT          },
     { ".BANK",          TOK_BANK                },
@@ -224,6 +225,7 @@ struct DotKeyword {
     { ".INCBIN",        TOK_INCBIN              },
     { ".INCLUDE",       TOK_INCLUDE             },
     { ".INTERRUPTOR",   TOK_INTERRUPTOR         },
+    { ".ISIZE",         TOK_ISIZE               },
     { ".ISMNEM",        TOK_ISMNEMONIC          },
     { ".ISMNEMONIC",    TOK_ISMNEMONIC          },
     { ".LEFT",          TOK_LEFT                },
index b0264f1548c7d48cf3aed005583c2726ba044374..bfc013a3ddc729f43dcd235e826194b451ca2534 100644 (file)
@@ -126,6 +126,7 @@ typedef enum token_t {
     TOK_ADDRSIZE,
     TOK_ALIGN,
     TOK_ASCIIZ,
+    TOK_ASIZE,
     TOK_ASSERT,
     TOK_AUTOIMPORT,
     TOK_BANK,
@@ -200,6 +201,7 @@ typedef enum token_t {
     TOK_INCBIN,
     TOK_INCLUDE,
     TOK_INTERRUPTOR,
+    TOK_ISIZE,
     TOK_ISMNEMONIC,
     TOK_LEFT,
     TOK_LINECONT,