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