Mercurial > sdl-ios-xcode
comparison src/joystick/riscos/SDL_sysjoystick.c @ 630:550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 29 May 2003 04:44:13 +0000 |
parents | |
children | b8d311d90021 |
comparison
equal
deleted
inserted
replaced
629:3fa401bb4bb5 | 630:550bccdf04bd |
---|---|
1 /* | |
2 SDL - Simple DirectMedia Layer | |
3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga | |
4 | |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
20 slouken@devolution.com | |
21 */ | |
22 | |
23 /* | |
24 RISCOS - Joystick support by Alan Buckley (alan_baa@hotmail.com) - 10 April 2003 | |
25 | |
26 Note: Currently assumes joystick is present if joystick module is loaded | |
27 and that there is one joystick with four buttons. | |
28 */ | |
29 | |
30 #ifdef SAVE_RCSID | |
31 static char rcsid = | |
32 "@(#) $Id$"; | |
33 #endif | |
34 | |
35 /* This is the system specific header for the SDL joystick API */ | |
36 | |
37 #include <stdio.h> /* For the definition of NULL */ | |
38 #include <stdlib.h> | |
39 | |
40 #include "SDL_error.h" | |
41 #include "SDL_joystick.h" | |
42 #include "SDL_sysjoystick.h" | |
43 #include "SDL_joystick_c.h" | |
44 | |
45 #include "kernel.h" | |
46 | |
47 #define JOYSTICK_READ 0x43F40 | |
48 | |
49 struct joystick_hwdata | |
50 { | |
51 int joystate; | |
52 }; | |
53 | |
54 | |
55 /* Function to scan the system for joysticks. | |
56 * This function should set SDL_numjoysticks to the number of available | |
57 * joysticks. Joystick 0 should be the system default joystick. | |
58 * It should return number of joysticks, or -1 on an unrecoverable fatal error. | |
59 */ | |
60 int SDL_SYS_JoystickInit(void) | |
61 { | |
62 _kernel_swi_regs regs; | |
63 | |
64 /* Try to read joystick 0 */ | |
65 regs.r[0] = 0; | |
66 if (_kernel_swi(JOYSTICK_READ, ®s, ®s) == NULL) | |
67 { | |
68 /* Switch works so assume we've got a joystick */ | |
69 return 1; | |
70 } | |
71 /* Switch fails so it looks like there's no joystick here */ | |
72 | |
73 return(0); | |
74 } | |
75 | |
76 /* Function to get the device-dependent name of a joystick */ | |
77 const char *SDL_SYS_JoystickName(int index) | |
78 { | |
79 if (index == 0) | |
80 { | |
81 return "RISCOS Joystick 0"; | |
82 } | |
83 | |
84 SDL_SetError("No joystick available with that index"); | |
85 return(NULL); | |
86 } | |
87 | |
88 /* Function to open a joystick for use. | |
89 The joystick to open is specified by the index field of the joystick. | |
90 This should fill the nbuttons and naxes fields of the joystick structure. | |
91 It returns 0, or -1 if there is an error. | |
92 */ | |
93 int SDL_SYS_JoystickOpen(SDL_Joystick *joystick) | |
94 { | |
95 _kernel_swi_regs regs; | |
96 | |
97 if(!(joystick->hwdata=malloc(sizeof(struct joystick_hwdata)))) | |
98 return -1; | |
99 | |
100 regs.r[0] = joystick->index; | |
101 | |
102 /* Don't know how to get exact count of buttons so assume max of 4 for now */ | |
103 joystick->nbuttons=4; | |
104 | |
105 joystick->nhats=0; | |
106 joystick->nballs=0; | |
107 joystick->naxes=2; | |
108 joystick->hwdata->joystate=0; | |
109 | |
110 return 0; | |
111 | |
112 } | |
113 | |
114 /* Function to update the state of a joystick - called as a device poll. | |
115 * This function shouldn't update the joystick structure directly, | |
116 * but instead should call SDL_PrivateJoystick*() to deliver events | |
117 * and update joystick device state. | |
118 */ | |
119 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) | |
120 { | |
121 _kernel_swi_regs regs; | |
122 regs.r[0] = joystick->index; | |
123 | |
124 if (_kernel_swi(JOYSTICK_READ, ®s, ®s) == NULL) | |
125 { | |
126 int newstate = regs.r[0]; | |
127 int oldstate = joystick->hwdata->joystate; | |
128 if (newstate != oldstate) | |
129 { | |
130 if ((newstate & 0xFF) != (oldstate & 0xFF)) | |
131 { | |
132 int y = regs.r[0] & 0xFF; | |
133 /* Convert to signed values */ | |
134 if (y >= 128) y -= 256; | |
135 SDL_PrivateJoystickAxis(joystick,1,-y * 256); /* Up and down opposite to result in SDL */ | |
136 } | |
137 if ((newstate & 0xFF00) != (oldstate & 0xFF00)) | |
138 { | |
139 int x = (regs.r[0] & 0xFF00) >> 8; | |
140 if (x >= 128) x -= 256; | |
141 SDL_PrivateJoystickAxis(joystick,0,x * 256); | |
142 } | |
143 | |
144 if ((newstate & 0xFF0000) != (oldstate & 0xFF0000)) | |
145 { | |
146 int buttons = (regs.r[0] & 0xFF0000) >> 16; | |
147 int oldbuttons = (oldstate & 0xFF0000) >> 16; | |
148 int i; | |
149 for (i = 0; i < joystick->nbuttons; i++) | |
150 { | |
151 if ((buttons & (1<<i)) != (oldbuttons & (1<<i))) | |
152 { | |
153 if (buttons & (1<<i)) SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED); | |
154 else SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED); | |
155 } | |
156 } | |
157 } | |
158 joystick->hwdata->joystate = newstate; | |
159 } | |
160 } | |
161 | |
162 return; | |
163 } | |
164 | |
165 /* Function to close a joystick after use */ | |
166 void SDL_SYS_JoystickClose(SDL_Joystick *joystick) | |
167 { | |
168 if(joystick->hwdata) | |
169 free(joystick->hwdata); | |
170 return; | |
171 } | |
172 | |
173 /* Function to perform any system-specific joystick related cleanup */ | |
174 void SDL_SYS_JoystickQuit(void) | |
175 { | |
176 SDL_numjoysticks=0; | |
177 | |
178 return; | |
179 } | |
180 |