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