Changed the documentation to reflect the new fastcall/cdecl reality.
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<article>
|
||||
<title>Defining a Custom cc65 Target
|
||||
<author>Bruce Reidenbach
|
||||
<date>2010-02-22
|
||||
<date>2015-03-13
|
||||
|
||||
<abstract>
|
||||
This section provides step-by-step instructions on how to use the cc65
|
||||
@@ -525,15 +525,16 @@ The first step in creating the assembly language code for the driver is
|
||||
to determine how to pass the C arguments to the assembly language
|
||||
routine. The cc65 toolset allows the user to specify whether the data
|
||||
is passed to a subroutine via the stack or by the processor registers by
|
||||
using the <tt>__fastcall__</tt> function declaration (note that there
|
||||
are two underscore characters in front of and two behind the
|
||||
<tt>fastcall</tt> declaration). When <tt>__fastcall__</tt> is
|
||||
specified, the rightmost argument in the function call is passed to the
|
||||
using the <tt/__fastcall__/ and <tt/__cdecl__/ function qualifiers (note that
|
||||
there are two underscore characters in front of and two behind each
|
||||
qualifier). <tt/__fastcall__/ is the default. When <tt/__cdecl__/ <em/isn't/
|
||||
specified, and the function isn't variadic (i.e., its prototype doesn't have
|
||||
an ellipsis), the rightmost argument in the function call is passed to the
|
||||
subroutine using the 6502 registers instead of the stack. Note that if
|
||||
there is only one argument in the function call, the execution overhead
|
||||
required by the stack interface routines is completely avoided.
|
||||
|
||||
Without <tt>__fastcall__</tt>, the argument is loaded in the A and X
|
||||
With <tt/__cdecl__</tt>, the last argument is loaded into the A and X
|
||||
registers and then pushed onto the stack via a call to <tt>pushax</tt>.
|
||||
The first thing the subroutine does is retrieve the argument from the
|
||||
stack via a call to <tt>ldax0sp</tt>, which copies the values into the A
|
||||
@@ -561,7 +562,7 @@ _foo: jsr ldax0sp ; Retrieve A and X from the stack
|
||||
jmp incsp2 ; Pop A and X from the stack (includes return)
|
||||
</verb></tscreen>
|
||||
|
||||
If <tt>__fastcall__</tt> is specified, the argument is loaded into the A
|
||||
If <tt/__cdecl__/ isn't specified, then the argument is loaded into the A
|
||||
and X registers as before, but the subroutine is then called
|
||||
immediately. The subroutine does not need to retrieve the argument
|
||||
since the value is already available in the A and X registers.
|
||||
@@ -596,7 +597,7 @@ variable which is stored in the zero page memory space in order to allow
|
||||
for retrieval of each character in the string via the indirect indexed
|
||||
addressing mode.
|
||||
|
||||
The assembly language routine is stored in a file names
|
||||
The assembly language routine is stored in a file named
|
||||
"rs232_tx.s" and is shown below:
|
||||
|
||||
<tscreen><code>
|
||||
@@ -680,7 +681,7 @@ all of the behind-the-scene work is transparent to the user.
|
||||
#define TX_FIFO_FULL (FIFO_STATUS & 0x01)
|
||||
#define RX_FIFO_EMPTY (FIFO_STATUS & 0x02)
|
||||
|
||||
extern void wait ();
|
||||
extern void wait (void);
|
||||
extern void __fastcall__ rs232_tx (char *str);
|
||||
|
||||
int main () {
|
||||
|
||||
Reference in New Issue
Block a user