Mercurial > hg > index.fcgi > lj > lj046-2players
comparison src/dsarm7.c @ 0:c84446dfb3f5
initial add
author | paulo@localhost |
---|---|
date | Fri, 13 Mar 2009 00:39:12 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:9ea69fd57b1d |
---|---|
1 /*--------------------------------------------------------------------------------- | |
2 | |
3 LOCKJAW Tetromino Game: ARM7 core | |
4 | |
5 Copyright (C) 2005-2007 | |
6 Damian Yerrick (tepples) | |
7 | |
8 based on | |
9 default ARM7 core | |
10 | |
11 Copyright (C) 2005-2007 | |
12 Michael Noland (joat) | |
13 Jason Rogers (dovoto) | |
14 Dave Murphy (WinterMute) | |
15 | |
16 This software is provided 'as-is', without any express or implied | |
17 warranty. In no event will the authors be held liable for any | |
18 damages arising from the use of this software. | |
19 | |
20 Permission is granted to anyone to use this software for any | |
21 purpose, including commercial applications, and to alter it and | |
22 redistribute it freely, subject to the following restrictions: | |
23 | |
24 1. The origin of this software must not be misrepresented; you | |
25 must not claim that you wrote the original software. If you use | |
26 this software in a product, an acknowledgment in the product | |
27 documentation would be appreciated but is not required. | |
28 2. Altered source versions must be plainly marked as such, and | |
29 must not be misrepresented as being the original software. | |
30 3. This notice may not be removed or altered from any source | |
31 distribution. | |
32 | |
33 ---------------------------------------------------------------------------------*/ | |
34 #include <stdlib.h> | |
35 #include <nds.h> | |
36 #include "talkback.h" // custom talkback | |
37 | |
38 void ljSoundEffects(unsigned long int sounds, | |
39 int countdown); | |
40 void ljMusic(void); | |
41 extern int order; | |
42 extern char ticksLeft; | |
43 extern char row; | |
44 extern char musicPaused; | |
45 | |
46 | |
47 | |
48 | |
49 void powerOffDS(void) | |
50 { | |
51 writePowerManagement(PM_CONTROL_REG, 1 << 6);//6 DS power (0: on, 1: shut down!) | |
52 } | |
53 | |
54 void doSleep(void) { | |
55 | |
56 // Check if the lid has been closed. | |
57 if(IPC->buttons & BIT(7)) { | |
58 // Save the current interrupt sate. | |
59 u32 ie_save = REG_IE; | |
60 // Turn the speaker down. | |
61 swiChangeSoundBias(0,0x400); | |
62 // Save current power state. | |
63 int power = readPowerManagement(PM_CONTROL_REG); | |
64 // Set sleep LED. | |
65 writePowerManagement(PM_CONTROL_REG, PM_LED_CONTROL(1)); | |
66 // Register for the lid interrupt. | |
67 REG_IE = IRQ_LID; | |
68 | |
69 // Power down till we get our interrupt. | |
70 swiSleep(); //waits for PM (lid open) interrupt | |
71 | |
72 REG_IF = ~0; | |
73 // Restore the interrupt state. | |
74 REG_IE = ie_save; | |
75 // Restore power state. | |
76 writePowerManagement(PM_CONTROL_REG, power); | |
77 | |
78 // Turn the speaker up. | |
79 swiChangeSoundBias(1,0x400); | |
80 IPC->buttons &= ~BIT(7); | |
81 } | |
82 } | |
83 | |
84 void VblankHandler(void) { | |
85 | |
86 doSleep(); | |
87 | |
88 volatile P8A7Talkback *tb = (P8A7Talkback *)IPC->soundData; | |
89 if (tb) { | |
90 int cmd = tb->cmd; | |
91 tb->cmd = 0; | |
92 | |
93 switch (cmd) { | |
94 case TALKBACK_POWER_OFF: | |
95 powerOFF(POWER_SOUND); | |
96 powerOffDS(); | |
97 swiWaitForVBlank(); | |
98 break; | |
99 case TALKBACK_PLAY_MUSIC: | |
100 musicPaused = 0; | |
101 break; | |
102 case TALKBACK_STOP_MUSIC: | |
103 musicPaused = 1; | |
104 order = 0; | |
105 row = 0; | |
106 ticksLeft = 1; | |
107 break; | |
108 case TALKBACK_PAUSE_MUSIC: | |
109 musicPaused = 1; | |
110 } | |
111 unsigned long int fx = tb->sounds; | |
112 tb->sounds = 0; | |
113 | |
114 ljSoundEffects(fx, tb->countdown); | |
115 } | |
116 | |
117 ljMusic(); | |
118 | |
119 } | |
120 | |
121 | |
122 | |
123 // All below this is wintermute's and may need to be replaced | |
124 // with new versions of libnds | |
125 | |
126 | |
127 touchPosition first,tempPos; | |
128 | |
129 //--------------------------------------------------------------------------------- | |
130 void VcountHandler() { | |
131 //--------------------------------------------------------------------------------- | |
132 static int lastbut = -1; | |
133 | |
134 uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0; | |
135 | |
136 but = REG_KEYXY; | |
137 | |
138 if (!( (but ^ lastbut) & (1<<6))) { | |
139 | |
140 tempPos = touchReadXY(); | |
141 | |
142 if ( tempPos.x == 0 || tempPos.y == 0 ) { | |
143 but |= (1 <<6); | |
144 lastbut = but; | |
145 } else { | |
146 x = tempPos.x; | |
147 y = tempPos.y; | |
148 xpx = tempPos.px; | |
149 ypx = tempPos.py; | |
150 z1 = tempPos.z1; | |
151 z2 = tempPos.z2; | |
152 } | |
153 | |
154 } else { | |
155 lastbut = but; | |
156 but |= (1 <<6); | |
157 } | |
158 | |
159 IPC->touchX = x; | |
160 IPC->touchY = y; | |
161 IPC->touchXpx = xpx; | |
162 IPC->touchYpx = ypx; | |
163 IPC->touchZ1 = z1; | |
164 IPC->touchZ2 = z2; | |
165 IPC->buttons = but; | |
166 | |
167 } | |
168 | |
169 | |
170 | |
171 //--------------------------------------------------------------------------------- | |
172 int main(int argc, char ** argv) { | |
173 //--------------------------------------------------------------------------------- | |
174 | |
175 // set up custom ipc struct | |
176 IPC->soundData = 0; | |
177 | |
178 // read User Settings from firmware | |
179 readUserSettings(); | |
180 | |
181 //enable sound | |
182 powerON(POWER_SOUND); | |
183 writePowerManagement(PM_CONTROL_REG, ( readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE & ~(1 << 6) ) | PM_SOUND_AMP ); | |
184 SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F); | |
185 | |
186 irqInit(); | |
187 | |
188 // Start the RTC tracking IRQ | |
189 initClockIRQ(); | |
190 | |
191 SetYtrigger(80); | |
192 irqSet(IRQ_VCOUNT, VcountHandler); | |
193 irqSet(IRQ_VBLANK, VblankHandler); | |
194 | |
195 | |
196 irqEnable( IRQ_VBLANK | IRQ_VCOUNT); | |
197 | |
198 // Keep the ARM7 mostly idle | |
199 while (1) swiWaitForVBlank(); | |
200 } |