]> git.sur5r.net Git - cc65/commitdiff
Added more sample for the inline assembler. Contributed by Steffen Görzig.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 7 Dec 2011 21:08:14 +0000 (21:08 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 7 Dec 2011 21:08:14 +0000 (21:08 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5308 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/cc65.sgml

index a1731879add1b65a20f1cf30a1d9e68bffd92fc3..74eb1702c9bb1c260da013bdff903a8482558996 100644 (file)
@@ -1200,8 +1200,8 @@ the format specifier before passing the assembly code line to the backend.
   <item><tt/%b/ - Numerical 8-bit value
   <item><tt/%w/ - Numerical 16-bit value
   <item><tt/%l/ - Numerical 32-bit value
-  <item><tt/%v/ - Assembler name of a (global) variable or function
-  <item><tt/%o/ - Stack offset of a (local) variable
+  <item><tt/%v/ - Assembler name of a global variable or function
+  <item><tt/%o/ - Stack offset of a local variable
   <item><tt/%g/ - Assembler name of a C label
   <item><tt/%s/ - The argument is converted to a string
   <item><tt/%%/ - The % sign itself
@@ -1229,6 +1229,52 @@ Or, to access a struct member of a static variable:
        __asm__ ("lda %v,y", pixel);
 </verb></tscreen>
 <p>
+The next example shows how to use global variables to exchange data between C
+an assembler and how to handle assembler jumps:
+
+<tscreen><verb>
+        unsigned char globalSubA, globalSubB, globalSubResult;
+
+        /* return a-b, return 255 if b>a */
+        unsigned char sub (unsigned char a, unsigned char b)
+        {
+            globalSubA = a;
+            globalSubB = b;
+            __asm__ ("sec");
+            __asm__ ("lda %v", globalSubA);
+            __asm__ ("sbc %v", globalSubB);
+            __asm__ ("bcs %g", jumpSubNoError);
+            __asm__ ("lda #$FF");
+        jumpSubNoError:
+            __asm__ ("sta %v", globalSubResult);
+            return globalSubResult;
+        }
+</verb></tscreen>
+<p>
+
+Arrays can also be accessed:
+
+<tscreen><verb>
+        unsigned char globalSquareTable[] = {
+            0, 1, 4, 9, 16, 25, 36, 49, 64, 81,
+            100, 121, 144, 169, 196, 225
+        };
+        unsigned char globalSquareA, globalSquareResult;
+
+        /* return a*a for a<16, else 255 */
+        unsigned char square (unsigned char a)
+        {
+            if (a>15){
+                return 255;
+            }
+            globalSquareA = a;
+            __asm__ ("ldx %v", globalSquareA);
+            __asm__ ("lda %v,x", globalSquareTable);
+            __asm__ ("sta %v", globalSquareResult);
+            return globalSquareResult;
+        }
+</verb></tscreen>
+<p>
 
 Note: Do not embed the assembler labels that are used as names of global
 variables or functions into your asm statements. Code like this