1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin OS relocatable module demo
3   File:     a.cpp
4 
5   Copyright 2000-2002 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: a.cpp,v $
14   Revision 1.2  02/20/2006 04:13:12  mitu
15   changed include path from dolphin/ to revolution/.
16 
17   Revision 1.1  01/26/2006 08:01:00  hiratsu
18   Relocatable module demo.
19 
20 
21     6     4/09/04 11:43 Shiki
22     Added check code for sdata and sdata2.
23 
24     5     8/23/02 17:43 Shiki
25     Added call to InlineFunc().
26 
27     4     01/05/09 15:12 Shiki
28     Added const variables to generate .rodata section.
29 
30     3     01/04/02 13:42:00 Shiki
31     Added _unresolved() and IsAThere().
32 
33     2     10/31/00 4:54p Shiki
34     Fixed OSReport msg.
35 
36     1     10/31/00 3:50p Shiki
37     Modified from .c version.
38 
39     2     6/14/01 11:37a Shiki
40     Added _unresolved().
41 
42     1     4/14/00 11:37p Shiki
43     Initial check-in.
44   $NoKeywords: $
45  *---------------------------------------------------------------------------*/
46 
47 #include <revolution.h>
48 #include "inline.h"
49 #include "a.h"
50 #include "b.h"
51 
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55 
56 typedef void (*voidfunctionptr) (void); /* ptr to function returning void */
57 __declspec(section ".init") extern voidfunctionptr _ctors[];
58 __declspec(section ".init") extern voidfunctionptr _dtors[];
59 
60 __declspec(section ".sdata")  extern int SDVar;
61 __declspec(section ".sdata2") extern int SD2Var;
62 
63 void _prolog(void);
64 void _epilog(void);
65 void _unresolved(void);
66 
67 #ifdef __cplusplus
68 }
69 #endif
70 
_prolog(void)71 void _prolog(void)
72 {
73     voidfunctionptr *constructor;
74 
75     /*
76      *  call static initializers
77      */
78     for (constructor = _ctors; *constructor; constructor++) {
79         (*constructor)();
80     }
81     MainA();
82 }
83 
_epilog(void)84 void _epilog(void)
85 {
86     voidfunctionptr *destructor;
87 
88     /*
89      *  call destructors
90      */
91     for (destructor = _dtors; *destructor; destructor++) {
92         (*destructor)();
93     }
94 }
95 
_unresolved(void)96 void _unresolved(void)
97 {
98     u32     i;
99     u32*    p;
100 
101     OSReport("\nError: A called an unlinked function.\n");
102     OSReport("Address:      Back Chain    LR Save\n");
103     for (i = 0, p = (u32*) OSGetStackPointer(); // get current sp
104          p && (u32) p != 0xffffffff && i++ < 16;
105          p = (u32*) *p)                         // get caller sp
106     {
107         OSReport("0x%08x:   0x%08x    0x%08x\n", p, p[0], p[1]);
108     }
109     OSReport("\n");
110 }
111 
112 int A::count;
113 
114 A StaticA01;
115 A StaticA02;
116 
117 static u8 Zero;
118 static u8 One = 1;
119 
MainA(void)120 void MainA(void)
121 {
122     OSReport("Hello, I'm MainA()! %d %d\n", Zero, One);
123     A a;
124 
125     // Generate weak symbol 'InlineFunc'
126     InlineFunc(3, 4);
127 
128     const Vec up = {0.0f, 1.0f, 0.0f};
129     const Vec trg = {0.0f, 0.0f, 0.0f};
130     const Vec pos = {0.0f, 0.0f, -10.0f};
131 
132     OSReport("SDVar(%p) SD2Var(%p)\n", &SDVar, &SD2Var);
133     ++SDVar;
134     ++SD2Var;
135 
136     IsBThere();
137 }
138 
IsAThere(void)139 void IsAThere(void)
140 {
141     OSReport("Yes, I'm A.\n");
142 }
143