1 /*---------------------------------------------------------------------------*
2 Project: rsodemo
3 File: e.c
4
5 Copyright 2006 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 $NoKeywords: $
14 *---------------------------------------------------------------------------*/
15
16 // use_lmw_stmw is turned ON tentatively
17 #pragma use_lmw_stmw on
18
19 //
20 #pragma section code_type ".text" data_mode=far_abs code_mode=far_abs
21 #pragma section RX ".init" ".init" data_mode=far_abs code_mode=far_abs
22
23 #include <revolution.h>
24
25 #include "f.h"
26
27 #pragma section code_type ".text" data_mode=far_abs code_mode=pc_rel
28 #pragma section RX ".init" ".init" data_mode=far_abs code_mode=pc_rel
29
30 #include "e.h"
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 typedef void (*voidfunctionptr) (void); /* ptr to function returning void */
37 __declspec(section ".init") extern voidfunctionptr _ctors[];
38 __declspec(section ".init") extern voidfunctionptr _dtors[];
39
40 int g_intE = 8;
41
42 void _prolog(void);
43 void _epilog(void);
44 void _unresolved(void);
45
46 #ifdef __cplusplus
47 }
48 #endif
49
_prolog(void)50 void _prolog(void)
51 {
52 voidfunctionptr *constructor;
53
54 /*
55 * call static initializers
56 */
57 //
58 for (constructor = _ctors; *constructor; constructor++) {
59 (*constructor)();
60 }
61
62 MainE();
63 }
64
_epilog(void)65 void _epilog(void)
66 {
67 voidfunctionptr *destructor;
68
69 /*
70 * call destructors
71 */
72 for (destructor = _dtors; *destructor; destructor++) {
73 (*destructor)();
74 }
75 }
76
_unresolved(void)77 void _unresolved(void)
78 {
79 u32 i;
80 u32* p;
81
82 OSReport("\nError: E called an unlinked function.\n");
83 OSReport("Address: Back Chain LR Save\n");
84 for (i = 0, p = (u32*) OSGetStackPointer(); // get current sp
85 p && (u32) p != 0xffffffff && i++ < 16;
86 p = (u32*) *p) // get caller sp
87 {
88 OSReport("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]);
89 }
90 OSReport("\n");
91 }
92
93
MainE(void)94 void MainE(void)
95 {
96 OSReport("Hello, I'm MainE()!\n");
97 //
98 OSReport("g_intE(%p) %d\n",&g_intE,g_intE);
99 g_intE++;
100 //
101 IsFThere();
102 }
103
IsEThere(void)104 void IsEThere(void)
105 {
106 OSReport("Yes, I'm E.\n");
107 }
108
109