1/*
2    SDL - Simple DirectMedia Layer
3    Copyright (C) 1997-2012 Sam Lantinga
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 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    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
19    Sam Lantinga
20    slouken@libsdl.org
21*/
22
23/*
24 *	XBIOS mouse & joystick vectors
25 *
26 *	Patrice Mandin
27 */
28
29	.text
30
31	.globl	_SDL_AtariXbios_Install
32	.globl	_SDL_AtariXbios_Restore
33	.globl	_SDL_AtariXbios_MouseVector
34	.globl	_SDL_AtariXbios_JoystickVector
35
36	.globl	_SDL_AtariXbios_mouselock
37	.globl	_SDL_AtariXbios_mouseb
38	.globl	_SDL_AtariXbios_mousex
39	.globl	_SDL_AtariXbios_mousey
40	.globl	_SDL_AtariXbios_joystick
41
42/*--- Vector installer ---*/
43
44_SDL_AtariXbios_Install:
45	movel	sp@(4),a0
46
47	/* Stop interrupts */
48
49	movew	#0x2700,sr
50
51	/* Save old mouse vector, set our routine */
52
53	clrl	oldmousevector
54	movel	sp@(8),d0
55	beqs	no_new_mouse_vector
56#if defined(__mcoldfire__)
57	movel	a0@(16),d1
58	movel	d1,oldmousevector
59#else
60	movel	a0@(16),oldmousevector
61#endif
62	movel	d0,a0@(16)
63no_new_mouse_vector:
64
65	/* Save old joystick vector, set our routine */
66
67	clrl	oldjoystickvector
68	movel	sp@(12),d0
69	beqs	no_new_joystick_vector
70#if defined(__mcoldfire__)
71	movel	a0@(24),d1
72	movel	d1,oldjoystickvector
73#else
74	movel	a0@(24),oldjoystickvector
75#endif
76	movel	d0,a0@(24)
77no_new_joystick_vector:
78
79	/* Restart interrupts */
80
81	movew	#0x2300,sr
82
83	rts
84
85/*--- Vector restorer ---*/
86
87_SDL_AtariXbios_Restore:
88	movel	sp@(4),a0
89
90	/* Stop interrupts */
91
92	movew	#0x2700,sr
93
94	/* Restore mouse vector */
95
96	movel	oldmousevector,d0
97	beqs	no_restore_mouse
98	movel	d0,a0@(16)
99no_restore_mouse:
100
101	/* Restore joystick vector */
102
103	movel	oldjoystickvector,d0
104	beqs	no_restore_joystick
105	movel	d0,a0@(24)
106no_restore_joystick:
107
108	/* Restart interrupts */
109
110	movew	#0x2300,sr
111
112	rts
113
114/*--- Our mouse vector ---*/
115
116	.text
117	.even
118	.ascii "XBRA"
119	.ascii "LSDL"
120	.comm	oldmousevector,4*1
121_SDL_AtariXbios_MouseVector:
122#if defined(__mcoldfire__)
123	lea	sp@(-8),sp
124	moveml	d0-d1,sp@
125#else
126	movel	d0,sp@-
127#endif
128
129	/* Mouse buttons */
130	moveb	(a0),d0
131#if defined(__mcoldfire__)
132	andl	#3,d0
133#else
134	andw	#3,d0
135#endif
136	movew	d0,_SDL_AtariXbios_mouseb
137
138	/* X movement */
139	moveb	a0@(1),d0
140	extw	d0
141#if defined(__mcoldfire__)
142	movew	_SDL_AtariXbios_mousex,d1
143	addl	d1,d0
144	movew	d0,_SDL_AtariXbios_mousex
145#else
146	addw	d0,_SDL_AtariXbios_mousex
147#endif
148
149	/* Y movement */
150	moveb	a0@(2),d0
151	extw	d0
152#if defined(__mcoldfire__)
153	movew	_SDL_AtariXbios_mousey,d1
154	addl	d1,d0
155	movew	d0,_SDL_AtariXbios_mousey
156#else
157	addw	d0,_SDL_AtariXbios_mousey
158#endif
159
160	/* Lock mouse position ? */
161	tstw	_SDL_AtariXbios_mouselock
162	beq.s	no_mouse_lock
163	clrb	a0@(1)
164	clrb	a0@(2)
165no_mouse_lock:
166
167	/* Jump through old vector */
168#if defined(__mcoldfire__)
169	moveml	sp@,d0-d1
170	lea	sp@(8),sp
171#else
172	movel	sp@+,d0
173#endif
174
175	movel	oldmousevector,sp@-
176	rts
177
178	.data
179	.even
180	.comm	_SDL_AtariXbios_mouselock,2*1
181	.comm	_SDL_AtariXbios_mousex,2*1
182	.comm	_SDL_AtariXbios_mousey,2*1
183	.comm	_SDL_AtariXbios_mouseb,2*1
184
185/*--- Our joystick vector ---*/
186
187	.text
188	.even
189	.ascii "XBRA"
190	.ascii "LSDL"
191	.comm	oldjoystickvector,4*1
192_SDL_AtariXbios_JoystickVector:
193	movel	d0,sp@-
194
195	/* New joystick state */
196	moveb	a0@(2),d0
197#if defined(__mcoldfire__)
198	andl	#0x8f,d0
199#else
200	andw	#0x8f,d0
201#endif
202	movew	d0,_SDL_AtariXbios_joystick
203
204	/* Jump through old vector */
205	movel	sp@+,d0
206
207	movel	oldjoystickvector,sp@-
208	rts
209
210	.data
211	.even
212	.comm	_SDL_AtariXbios_joystick,2*1
213