SDL-1.2.14
[sdl_omap.git] / src / video / ataricommon / SDL_ikbdinterrupt.S
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2009 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)
98 ikbd_restoreierb:
99
100         bclr    #6,a0@(0x15)
101         tstb    ikbd_imrb
102         beqs    ikbd_restoreimrb
103         bset    #6,a0@(0x15)
104 ikbd_restoreimrb:
105
106         movel   old_ikbd,0x118:w
107
108         | Clear keyboard buffer
109
110         lea     0xfffffc00:w,a0
111 ikbd_videbuffer:
112         btst    #0,a0@
113         beqs    ikbd_finbuffer
114         tstb    a0@(0x02)
115         bras    ikbd_videbuffer
116 ikbd_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
138 ikbd:
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
160 ikbd_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
169 ikbd_yes_joystick:
170         movel   #ikbd_joystick,0x118:w
171         bras    ikbd_endit_stack
172
173         | Keyboard press/release
174
175 ikbd_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
184 ikbd_endit_stack:
185         moveml  sp@+,d0-d1/a0
186 ikbd_endit:
187         bclr    #6,0xfffffa11:w
188         rte
189
190         | Call old MIDI interrupt
191
192 ikbd_oldmidi:
193         movel   old_ikbd,sp@-
194         rts
195
196         | Mouse packet, byte #2
197
198 ikbd_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
217 ikbd_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
236 ikbd_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