Article: Q129787
Product(s): Microsoft C Compiler
Version(s): MAC:2.0;
Operating System(s):
Keyword(s): kbcode kbHWMAC kbVC kbhowto
Last Modified: 23-JUL-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, Macintosh Cross-Development Addon, version 4.0
-------------------------------------------------------------------------------
SUMMARY
=======
You can use Visual C++ to build Code Resources of type CDEF, cdev, INIT, LDEF,
MDEF, WDEF, and XCMD. This article illustrates how.
MORE INFORMATION
================
Applications use the register A5 to point to their global memory and as a base
for intersegment jumps. Stand-alone Code Resources cannot use A5 in this manner.
To use global memory in Visual C++, follow these steps:
1. Locate the entry points for the Code Resource types (CDEF, cdev, INIT, LDEF,
MDEF, WDEF, and XCMD) at the beginning of the resource. When Visual C++
compiles a code resource, it locates the global data at the beginning of the
resource by default. To force the global data to be moved to the end of the
resource use the code_seg pragma as in this example:
#pragma code_seg("MAIN$2")
This forces any declarations that follow to be placed in the second half of
the MAIN Code Resource. The data is referenced as an offset from the PC
register, rather than the A5 register.
2. To avoid an intersegment jump, merge the code from two segments together by
using the Linker's MERGE option. This step is necessary if a Code Resource
calls into a library such as the C Runtime libraries because a second segment
is created and the call to the function becomes an intersegment jump.
For example, if the C Runtime library is being merged with and INIT titled
MAIN, add the following line to the Link:Project Options found in the Project
Settings dialog:
" MERGE:CRTSTRING?=MAIN " (without the quotation marks) Replace the question
mark (?) with an ASCII character 1. The CRTSTRING? segment is titled CRTSTRIN
by the Linker, so the name of the segments in the target application cannot
be used. To determine the name of any segments generated by Visual C++, build
the Code Resource as a 'CODE' resource first. Then check the .MAP file for
the correct spelling of the segment.
If a Code Resource is built without merging the segments the following Linker
error is generated: error LNK1574: A5 reference to SomeFunction invalid in
standalone code
Sample Code
-----------
Here is a sample INIT Code Resource including code and project settings:
The C/C++ Project Options:
/nologo /W3 /YX /Oi /D "_WINDOWS" /D "_MAC" /D "_68K_" /D "NDEBUG" /D
"_MBCS"
/FR"MacRel/" /Fp"MacRel/CodRes.pch" /Fo"MacRel/" /c
The Link Project Options:
libcs.lib /NOLOGO /MAC:bundle /MAC:type="rsrc" /MAC:creator="RSED"
/PDB:"MacRel/CodRes.pdb" /MAP:"MacRel/SACODE.map" /DEBUG /MACHINE:M68K
/NODEFAULTLIB:"swapd.lib" /NODEFAULTLIB /OUT:"MacRel/CODRES.exe"
/entry:main
/section:MAIN,,resource="INIT"@99 /MERGE:CRTSTRING =MAIN
The code for this sample:
#include <string.h>
#include <macos\osutils.h>
#pragma code_seg("MAIN$2")
char _declspec(allocate("_CODE")) java[10] =" Help Me!";
#pragma code_seg("MAIN$1")
void main(void)
{
char bob[10];
bob[0]=0;
strcpy(bob,java);
DebugStr(_c2pstr(bob));
}
This code creates an INIT with a resource ID of 99. There will also be resources
of DATA, CODE, and MSCV. They are not needed for this Code Resource to function.
Additional query words:
======================================================================
Keywords : kbcode kbHWMAC kbVC kbhowto
Technology : kbVCsearch kbHWMAC kbOSMAC kbAudDeveloper kbVCXDev400Mac
Version : MAC:2.0;
Issue type : kbhowto
=============================================================================