Mercurial > hg > Members > kono > nitros9-code
diff docs/ccguide/basic09.appendix @ 554:afff0087c27f
findstr and signal finished.
author | roug |
---|---|
date | Tue, 22 Oct 2002 19:09:04 +0000 |
parents | 60b821f18853 |
children | 7d803625ead8 |
line wrap: on
line diff
--- a/docs/ccguide/basic09.appendix Sun Oct 20 05:16:37 2002 +0000 +++ b/docs/ccguide/basic09.appendix Tue Oct 22 19:09:04 2002 +0000 @@ -9,4 +9,105 @@ calling protocol. </para> +<section> +<title>Example 1 - Simple Integer Aritmetic Case</title> +<para> +This first example illustrates a simple case. Write a C function to +add an integer value to three integer variables. +<screen> +build bt1.c +? addints(cnt,value,s1,arg1,s2,arg2,s2,arg3,s4) +? int *value,*arg1,*arg2,*arg3; +? { +? *arg1 += *value; +? *arg2 += *value; +? *arg3 += *value; +? } +? +</screen> +</para> +<para> +That's the C function. The name of the function is "addints". The +name is information for C and c.link; BASIC09 will not know anything +about the name. Page 9-13 of the BASIC09 Reference manual describes +how BASIC09 passes parameters to machine language modules. Since +BASIC09 and C pass parameters in a similar fashion, it is easy to +access BASIC09 values. The first parameter on the BASIC09 stack is +a two-byte count of the number of following parameter pairs. Each +pair consists of an address and size of value. For most C +functions, the parameter count and pair size is not used. The +address, however, is the useful piece of information. The address +is declared in the C function to always be a "pointer to..." type. +BASIC09 always passes addresses to procedures, even for constant +values. The arguments cnt, s1, s2, s3 and s4 are just place holders +to indicate the presence of the parameter count and argument sizes +on the stack. These can be used to check validity of the passed +arguments if desired. +</para> +<para> +The line "int *value,*arg1,*arg2,*arg3" declares the parameters (in +this case all "pointers to int"), so the compiler will generate the +correct code to access the BASIC09 values. The remaining lines +increment each arg by the passed value. Notice that a simple +arithmetic operation is performed here (addition), so C will not +have to call a library function to do the operation. +</para> +<para> +To compile this function, the following C compiler command line is +used: +<informalexample> +<para> +cc2 bt1.c -rs +</para> +</informalexample> +CC2 uses the Level-Two compiler. Replace cc2 with cc1 if you are +using the Level-One compiler. The -r option causes the compiler to +leave bt1.r as output, ready to be linked. The -s option suppresses +the call to the stack-checking function. Since we will be making a +module for BASIC09, cstart.r will not be used. Therefore, no +initialized data, static data, or stack checking is allowed. More +on this later. +</para> +<para> +The bt1.r file must now be converted to a loadable module that +BASIC09 can link to by using a special linking technique as follows: +<informalexample> +<para> +c.link bt1.r -b=addints -o=addints +</para> +</informalexample> +This command tells the linker to read bt1.r as input. The option +"-b=addints" tells the linker to make the output file a module that +BASIC09 can link to and that the function "addints" is to be the +entrypoint in the module. You may give many input files to c.link +in this mode. It resolves references in the normal fashion. The +name given to the "-b=" option indicates which of the functions is +to be entered directly by the BASIC09 RUN command. The option +"-o=addints" says what the name of the output file is to be, in this +case "addints". This name should be the name used in the BASIC09 +RUN command to call the C procedure. The name given in "-o=" +option is the name of the procedure to RUN. The "-b=" option is +merely information to the linker so it can fill in the correct +module entrypoint offset. +</para> + +<para> +Enter the following BASIC09 program: +<programlisting> +PROCEDURE btest +DIM i,j,k:INTEGER +i=1 +j=132 +k=-1033 +RUN addints(4,i,j,k) +PRINT i,j,k +END +</programlisting> +When this procedure is RUN, it should print: +<screen> +5 136 -1029 +</screen> +indicating that our C function worked! +</para> + </appendix>