1/*
2    SDL - Simple DirectMedia Layer
3    Copyright (C) 1997-2006 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 *	IKBD 6301 interrupt routine
25 *
26 *	Patrice Mandin
27 */
28
29	.text
30
31	.globl	_SDL_AtariIkbdInstall
32	.globl	_SDL_AtariIkbdUninstall
33
34	.globl	_SDL_AtariIkbd_keyboard
35	.globl	_SDL_AtariIkbd_mouseb
36	.globl	_SDL_AtariIkbd_mousex
37	.globl	_SDL_AtariIkbd_mousey
38	.globl	_SDL_AtariIkbd_joystick
39
40	.globl	_SDL_AtariIkbd_enabled
41
42/*--- Install our IKBD vector ---*/
43
44_SDL_AtariIkbdInstall:
45	moveml	d0-d1/a0-a1,sp@-
46
47	| Disable interrupts
48
49	movew	#0x2700,sr
50
51	| Save MFP registers used for keyboard
52
53	lea	0xfffffa00:w,a0
54	btst	#6,a0@(0x09)
55	sne		ikbd_ierb
56	btst	#6,a0@(0x15)
57	sne		ikbd_imrb
58
59	| Set our routine
60
61	movel	0x118:w,old_ikbd
62	movel	#ikbd,0x118:w
63	bset	#6,0xfffffa09:w	| IERB
64	bset	#6,0xfffffa15:w	| IMRB
65
66	| Set mouse relative mode
67
68	moveb	#8,0xfffffc02:w
69
70	| Reenable interrupts
71
72	movew	#0x2300,sr
73
74	| Interrupts done
75
76	movew	#0xffff,_SDL_AtariIkbd_enabled
77
78	moveml	sp@+,d0-d1/a0-a1
79	rts
80
81/*--- Uninstall our IKBD vector ---*/
82
83_SDL_AtariIkbdUninstall:
84	movel	a0,sp@-
85
86	| Disable interrupts
87
88	movew	#0x2700,sr
89
90	| Restore previous MFP registers
91
92	lea	0xfffffa00:w,a0
93
94	bclr	#6,a0@(0x09)
95	tstb	ikbd_ierb
96	beqs	ikbd_restoreierb
97	bset	#6,a0@(0x09)
98ikbd_restoreierb:
99
100	bclr	#6,a0@(0x15)
101	tstb	ikbd_imrb
102	beqs	ikbd_restoreimrb
103	bset	#6,a0@(0x15)
104ikbd_restoreimrb:
105
106	movel	old_ikbd,0x118:w
107
108	| Clear keyboard buffer
109
110	lea	0xfffffc00:w,a0
111ikbd_videbuffer:
112	btst	#0,a0@
113	beqs	ikbd_finbuffer
114	tstb	a0@(0x02)
115	bras	ikbd_videbuffer
116ikbd_finbuffer:
117
118	| Reenable interrupts
119
120	movew	#0x2300,sr
121
122	movel	sp@+,a0
123	rts
124
125	.bss
126
127	.even
128	.comm	ikbd_ierb,1
129	.comm	ikbd_imrb,1
130
131/*--- Our custom IKBD vector ---*/
132
133	.text
134	.even
135	.ascii	"XBRA"
136	.ascii	"LSDL"
137	.comm	old_ikbd,4*1
138ikbd:
139	| Check if source is IKBD or MIDI
140	btst	#0,0xfffffc00.w
141	beqs	ikbd_oldmidi
142
143	moveml	d0-d1/a0,sp@-
144	moveb	0xfffffc02:w,d0
145
146	| Joystick packet ?
147
148	cmpb	#0xff,d0
149	beqs	ikbd_yes_joystick
150
151	| Mouse packet ?
152
153	cmpb	#0xf8,d0
154	bmis	ikbd_no_mouse
155	cmpb	#0xfc,d0
156	bpls	ikbd_no_mouse
157
158	| Mouse packet, byte #1
159
160ikbd_yes_mouse:
161	andw	#3,d0
162	movew	d0,_SDL_AtariIkbd_mouseb
163
164	movel	#ikbd_mousex,0x118:w
165	bras	ikbd_endit_stack
166
167	| Joystick packet, byte #1
168
169ikbd_yes_joystick:
170	movel	#ikbd_joystick,0x118:w
171	bras	ikbd_endit_stack
172
173	| Keyboard press/release
174
175ikbd_no_mouse:
176	moveb	d0,d1
177	lea		_SDL_AtariIkbd_keyboard,a0
178	andw	#0x7f,d1
179	tas		d0
180	spl		a0@(0,d1:w)
181
182	| End of interrupt
183
184ikbd_endit_stack:
185	moveml	sp@+,d0-d1/a0
186ikbd_endit:
187	bclr	#6,0xfffffa11:w
188	rte
189
190	| Call old MIDI interrupt
191
192ikbd_oldmidi:
193	movel	old_ikbd,sp@-
194	rts
195
196	| Mouse packet, byte #2
197
198ikbd_mousex:
199
200	| Check if source is IKBD or MIDI
201	btst	#0,0xfffffc00.w
202	beqs	ikbd_oldmidi
203
204	movew	d0,sp@-
205
206	moveb	0xfffffc02:w,d0
207	extw	d0
208	addw	d0,_SDL_AtariIkbd_mousex
209
210	movew	sp@+,d0
211
212	movel	#ikbd_mousey,0x118:w
213	bras	ikbd_endit
214
215	| Mouse packet, byte #3
216
217ikbd_mousey:
218
219	| Check if source is IKBD or MIDI
220	btst	#0,0xfffffc00.w
221	beqs	ikbd_oldmidi
222
223	movew	d0,sp@-
224
225	moveb	0xfffffc02:w,d0
226	extw	d0
227	addw	d0,_SDL_AtariIkbd_mousey
228
229	movew	sp@+,d0
230
231	movel	#ikbd,0x118:w
232	bras	ikbd_endit
233
234	| Joystick packet, byte #2
235
236ikbd_joystick:
237
238	| Check if source is IKBD or MIDI
239	btst	#0,0xfffffc00.w
240	beqs	ikbd_oldmidi
241
242	moveb	0xfffffc02:w,_SDL_AtariIkbd_joystick+1
243
244	movel	#ikbd,0x118:w
245	bras	ikbd_endit
246
247	.data
248
249	.even
250_SDL_AtariIkbd_enabled:
251	.word	0
252
253	.bss
254
255	.even
256	.comm	_SDL_AtariIkbd_keyboard,128
257	.comm	_SDL_AtariIkbd_mousex,2
258	.comm	_SDL_AtariIkbd_mousey,2
259	.comm	_SDL_AtariIkbd_mouseb,2
260	.comm	_SDL_AtariIkbd_joystick,2
261