This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_ikbdinterrupt.S
260 lines (179 loc) · 4.19 KB
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
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sam Lantinga
slouken@libsdl.org
*/
/*
* IKBD 6301 interrupt routine
*
* Patrice Mandin
*/
.text
.globl _SDL_AtariIkbdInstall
.globl _SDL_AtariIkbdUninstall
.globl _SDL_AtariIkbd_keyboard
.globl _SDL_AtariIkbd_mouseb
.globl _SDL_AtariIkbd_mousex
.globl _SDL_AtariIkbd_mousey
.globl _SDL_AtariIkbd_joystick
40
41
.globl _SDL_AtariIkbd_enabled
42
43
44
45
46
/*--- Install our IKBD vector ---*/
_SDL_AtariIkbdInstall:
moveml d0-d1/a0-a1,sp@-
47
| Disable interrupts
48
49
50
51
52
53
54
movew #0x2700,sr
| Save MFP registers used for keyboard
lea 0xfffffa00:w,a0
btst #6,a0@(0x09)
56
btst #6,a0@(0x15)
58
59
60
61
62
63
64
65
| Set our routine
movel 0x118:w,old_ikbd
movel #ikbd,0x118:w
bset #6,0xfffffa09:w | IERB
bset #6,0xfffffa15:w | IMRB
66
67
| Set mouse relative mode
68
69
moveb #8,0xfffffc02:w
70
71
| Reenable interrupts
72
73
74
75
movew #0x2300,sr
| Interrupts done
76
77
movew #0xffff,_SDL_AtariIkbd_enabled
78
79
80
81
82
83
84
85
moveml sp@+,d0-d1/a0-a1
rts
/*--- Uninstall our IKBD vector ---*/
_SDL_AtariIkbdUninstall:
movel a0,sp@-
86
| Disable interrupts
87
88
89
90
91
92
93
94
95
movew #0x2700,sr
| Restore previous MFP registers
lea 0xfffffa00:w,a0
bclr #6,a0@(0x09)
tstb ikbd_ierb
96
beqs ikbd_restoreierb
97
98
99
100
101
bset #6,a0@(0x09)
ikbd_restoreierb:
bclr #6,a0@(0x15)
tstb ikbd_imrb
102
beqs ikbd_restoreimrb
103
104
105
106
107
108
109
110
111
112
bset #6,a0@(0x15)
ikbd_restoreimrb:
movel old_ikbd,0x118:w
| Clear keyboard buffer
lea 0xfffffc00:w,a0
ikbd_videbuffer:
btst #0,a0@
113
beqs ikbd_finbuffer
114
tstb a0@(0x02)
115
bras ikbd_videbuffer
116
117
ikbd_finbuffer:
118
119
| Reenable interrupts
120
121
122
123
124
movew #0x2300,sr
movel sp@+,a0
rts
125
126
.bss
128
129
.comm ikbd_ierb,1
.comm ikbd_imrb,1
130
131
132
133
134
135
/*--- Our custom IKBD vector ---*/
.text
.even
.ascii "XBRA"
136
137
.ascii "LSDL"
.comm old_ikbd,4*1
139
| Check if source is IKBD or MIDI
140
141
btst #0,0xfffffc00.w
beqs ikbd_oldmidi
143
144
145
moveml d0-d1/a0,sp@-
moveb 0xfffffc02:w,d0
146
| Joystick packet ?
147
148
cmpb #0xff,d0
149
beqs ikbd_yes_joystick
151
| Mouse packet ?
152
153
cmpb #0xf8,d0
154
bmis ikbd_no_mouse
155
cmpb #0xfc,d0
156
bpls ikbd_no_mouse
158
159
| Mouse packet, byte #1
160
161
162
163
164
ikbd_yes_mouse:
andw #3,d0
movew d0,_SDL_AtariIkbd_mouseb
movel #ikbd_mousex,0x118:w
165
bras ikbd_endit_stack
167
168
| Joystick packet, byte #1
169
170
ikbd_yes_joystick:
movel #ikbd_joystick,0x118:w
171
bras ikbd_endit_stack
173
174
| Keyboard press/release
175
176
ikbd_no_mouse:
moveb d0,d1
177
178
179
180
lea _SDL_AtariIkbd_keyboard,a0
andw #0x7f,d1
tas d0
spl a0@(0,d1:w)
182
| End of interrupt
184
ikbd_endit_stack:
185
moveml sp@+,d0-d1/a0
186
ikbd_endit:
187
188
189
bclr #6,0xfffffa11:w
rte
190
191
192
193
194
195
| Call old MIDI interrupt
ikbd_oldmidi:
movel old_ikbd,sp@-
rts
196
197
| Mouse packet, byte #2
198
ikbd_mousex:
200
| Check if source is IKBD or MIDI
201
202
btst #0,0xfffffc00.w
beqs ikbd_oldmidi
203
204
movew d0,sp@-
205
206
207
208
209
moveb 0xfffffc02:w,d0
extw d0
addw d0,_SDL_AtariIkbd_mousex
210
movew sp@+,d0
211
212
movel #ikbd_mousey,0x118:w
213
bras ikbd_endit
215
216
| Mouse packet, byte #3
217
ikbd_mousey:
219
| Check if source is IKBD or MIDI
220
221
btst #0,0xfffffc00.w
beqs ikbd_oldmidi
222
223
movew d0,sp@-
224
225
226
227
228
moveb 0xfffffc02:w,d0
extw d0
addw d0,_SDL_AtariIkbd_mousey
229
movew sp@+,d0
230
231
movel #ikbd,0x118:w
232
bras ikbd_endit
234
235
| Joystick packet, byte #2
236
ikbd_joystick:
238
| Check if source is IKBD or MIDI
239
240
btst #0,0xfffffc00.w
beqs ikbd_oldmidi
242
243
244
moveb 0xfffffc02:w,_SDL_AtariIkbd_joystick+1
movel #ikbd,0x118:w
245
bras ikbd_endit
246
247
248
249
.data
.even
250
251
_SDL_AtariIkbd_enabled:
.word 0
252
253
254
.bss
255
.even
256
.comm _SDL_AtariIkbd_keyboard,128
257
258
259
260
.comm _SDL_AtariIkbd_mousex,2
.comm _SDL_AtariIkbd_mousey,2
.comm _SDL_AtariIkbd_mouseb,2
.comm _SDL_AtariIkbd_joystick,2