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 (at) 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 #if defined(__mcoldfire__) 46 lea sp@(-16),sp 47 moveml d0-d1/a0-a1,sp@ 48 #else 49 moveml d0-d1/a0-a1,sp@- 50 #endif 51 52 | Disable interrupts 53 54 movew #0x2700,sr 55 56 | Save MFP registers used for keyboard 57 58 lea 0xfffffa00:w,a0 59 btst #6,a0@(0x09) 60 #if defined(__mcoldfire__) 61 sne d0 62 move.b d0,ikbd_ierb 63 #else 64 sne ikbd_ierb 65 #endif 66 btst #6,a0@(0x15) 67 #if defined(__mcoldfire__) 68 sne d0 69 move.b d0,ikbd_imrb 70 #else 71 sne ikbd_imrb 72 #endif 73 74 | Set our routine 75 76 #if defined(__mcoldfire__) 77 movel 0x118:w,d0 78 movel d0,old_ikbd 79 lea ikbd,a0 80 movel a0,0x118:w 81 moveql #6,d0 82 bset d0,0xfffffa09:w | IERB 83 bset d0,0xfffffa15:w | IMRB 84 #else 85 movel 0x118:w,old_ikbd 86 movel #ikbd,0x118:w 87 bset #6,0xfffffa09:w | IERB 88 bset #6,0xfffffa15:w | IMRB 89 #endif 90 91 | Set mouse relative mode 92 93 #if defined(__mcoldfire__) 94 moveql #8,d0 95 moveb d0,0xfffffc02:w 96 #else 97 moveb #8,0xfffffc02:w 98 #endif 99 100 | Reenable interrupts 101 102 movew #0x2300,sr 103 104 | Interrupts done 105 106 #if defined(__mcoldfire__) 107 movel #0xffff,d0 108 movew d0,_SDL_AtariIkbd_enabled 109 110 moveml sp@,d0-d1/a0-a1 111 lea sp@(16),sp 112 #else 113 movew #0xffff,_SDL_AtariIkbd_enabled 114 115 moveml sp@+,d0-d1/a0-a1 116 #endif 117 rts 118 119 /*--- Uninstall our IKBD vector ---*/ 120 121 _SDL_AtariIkbdUninstall: 122 movel a0,sp@- 123 124 | Disable interrupts 125 126 movew #0x2700,sr 127 128 | Restore previous MFP registers 129 130 lea 0xfffffa00:w,a0 131 132 bclr #6,a0@(0x09) 133 tstb ikbd_ierb 134 beqs ikbd_restoreierb 135 bset #6,a0@(0x09) 136 ikbd_restoreierb: 137 138 bclr #6,a0@(0x15) 139 tstb ikbd_imrb 140 beqs ikbd_restoreimrb 141 bset #6,a0@(0x15) 142 ikbd_restoreimrb: 143 144 #if defined(__mcoldfire__) 145 movel old_ikbd,a0 146 movel a0,0x118:w 147 #else 148 movel old_ikbd,0x118:w 149 #endif 150 151 | Clear keyboard buffer 152 153 lea 0xfffffc00:w,a0 154 ikbd_videbuffer: 155 btst #0,a0@ 156 beqs ikbd_finbuffer 157 tstb a0@(0x02) 158 bras ikbd_videbuffer 159 ikbd_finbuffer: 160 161 | Reenable interrupts 162 163 movew #0x2300,sr 164 165 movel sp@+,a0 166 rts 167 168 .bss 169 170 .even 171 .comm ikbd_ierb,1 172 .comm ikbd_imrb,1 173 174 /*--- Our custom IKBD vector ---*/ 175 176 .text 177 .even 178 .ascii "XBRA" 179 .ascii "LSDL" 180 .comm old_ikbd,4*1 181 ikbd: 182 #if defined(__mcoldfire__) 183 lea sp@(-12),sp 184 moveml d0-d1/a0,sp@ 185 #else 186 moveml d0-d1/a0,sp@- 187 #endif 188 189 | Check if source is IKBD or MIDI 190 #if defined(__mcoldfire__) 191 moveql #0,d0 192 btst d0,0xfffffc00.w 193 #else 194 btst #0,0xfffffc00.w 195 #endif 196 beqs ikbd_oldmidi 197 198 moveb 0xfffffc02:w,d0 199 200 | Joystick packet ? 201 202 cmpb #0xff,d0 203 beqs ikbd_yes_joystick 204 205 | Mouse packet ? 206 207 cmpb #0xf8,d0 208 bmis ikbd_no_mouse 209 cmpb #0xfc,d0 210 bpls ikbd_no_mouse 211 212 | Mouse packet, byte #1 213 214 ikbd_yes_mouse: 215 #if defined(__mcoldfire__) 216 andl #3,d0 217 #else 218 andw #3,d0 219 #endif 220 movew d0,_SDL_AtariIkbd_mouseb 221 222 #if defined(__mcoldfire__) 223 movel #ikbd_mousex,d0 224 movel d0,0x118:w 225 #else 226 movel #ikbd_mousex,0x118:w 227 #endif 228 bras ikbd_endit_stack 229 230 | Joystick packet, byte #1 231 232 ikbd_yes_joystick: 233 #if defined(__mcoldfire__) 234 movel #ikbd_joystick,d0 235 movel d0,0x118:w 236 #else 237 movel #ikbd_joystick,0x118:w 238 #endif 239 bras ikbd_endit_stack 240 241 | Keyboard press/release 242 243 ikbd_no_mouse: 244 moveb d0,d1 245 lea _SDL_AtariIkbd_keyboard,a0 246 #if defined(__mcoldfire__) 247 andl #0x7f,d1 248 btst #7,d0 249 spl d0 250 moveb d0,a0@(0,d1:l) 251 #else 252 andw #0x7f,d1 253 tas d0 254 spl a0@(0,d1:w) 255 #endif 256 257 | End of interrupt 258 259 ikbd_endit_stack: 260 #if defined(__mcoldfire__) 261 moveql #6,d0 262 bclr d0,0xfffffa11:w 263 264 moveml sp@,d0-d1/a0 265 lea sp@(12),sp 266 #else 267 moveml sp@+,d0-d1/a0 268 269 bclr #6,0xfffffa11:w 270 #endif 271 rte 272 273 | Call old MIDI interrupt 274 275 ikbd_oldmidi: 276 #if defined(__mcoldfire__) 277 moveml sp@,d0-d1/a0 278 lea sp@(12),sp 279 #else 280 moveml sp@+,d0-d1/a0 281 #endif 282 283 movel old_ikbd,sp@- 284 rts 285 286 | Mouse packet, byte #2 287 288 ikbd_mousex: 289 #if defined(__mcoldfire__) 290 lea sp@(-12),sp 291 moveml d0-d1/a0,sp@ 292 #else 293 moveml d0-d1/a0,sp@- 294 #endif 295 296 | Check if source is IKBD or MIDI 297 #if defined(__mcoldfire__) 298 moveql #0,d0 299 btst d0,0xfffffc00.w 300 #else 301 btst #0,0xfffffc00.w 302 #endif 303 beqs ikbd_oldmidi 304 305 moveb 0xfffffc02:w,d0 306 extw d0 307 #if defined(__mcoldfire__) 308 movew _SDL_AtariIkbd_mousex,d1 309 addl d1,d0 310 movew d0,_SDL_AtariIkbd_mousex 311 312 movel #ikbd_mousey,d0 313 movel d0,0x118:w 314 #else 315 addw d0,_SDL_AtariIkbd_mousex 316 317 movel #ikbd_mousey,0x118:w 318 #endif 319 bras ikbd_endit_stack 320 321 | Mouse packet, byte #3 322 323 ikbd_mousey: 324 #if defined(__mcoldfire__) 325 lea sp@(-12),sp 326 moveml d0-d1/a0,sp@ 327 #else 328 moveml d0-d1/a0,sp@- 329 #endif 330 331 | Check if source is IKBD or MIDI 332 #if defined(__mcoldfire__) 333 moveql #0,d0 334 btst d0,0xfffffc00.w 335 #else 336 btst #0,0xfffffc00.w 337 #endif 338 beqs ikbd_oldmidi 339 340 moveb 0xfffffc02:w,d0 341 extw d0 342 #if defined(__mcoldfire__) 343 movew _SDL_AtariIkbd_mousey,d1 344 addl d1,d0 345 movew d0,_SDL_AtariIkbd_mousey 346 347 movel #ikbd,d0 348 movel d0,0x118:w 349 #else 350 addw d0,_SDL_AtariIkbd_mousey 351 352 movel #ikbd,0x118:w 353 #endif 354 bras ikbd_endit_stack 355 356 | Joystick packet, byte #2 357 358 ikbd_joystick: 359 #if defined(__mcoldfire__) 360 lea sp@(-12),sp 361 moveml d0-d1/a0,sp@ 362 #else 363 moveml d0-d1/a0,sp@- 364 #endif 365 366 | Check if source is IKBD or MIDI 367 #if defined(__mcoldfire__) 368 moveql #0,d0 369 btst d0,0xfffffc00.w 370 #else 371 btst #0,0xfffffc00.w 372 #endif 373 beqs ikbd_oldmidi 374 375 #if defined(__mcoldfire__) 376 moveb 0xfffffc02:w,d0 377 moveb d0,_SDL_AtariIkbd_joystick+1 378 379 movel #ikbd,d0 380 movel d0,0x118:w 381 382 bra ikbd_endit_stack 383 #else 384 moveb 0xfffffc02:w,_SDL_AtariIkbd_joystick+1 385 386 movel #ikbd,0x118:w 387 388 bras ikbd_endit_stack 389 #endif 390 391 .data 392 393 .even 394 _SDL_AtariIkbd_enabled: 395 .word 0 396 397 .bss 398 399 .even 400 .comm _SDL_AtariIkbd_keyboard,128 401 .comm _SDL_AtariIkbd_mousex,2 402 .comm _SDL_AtariIkbd_mousey,2 403 .comm _SDL_AtariIkbd_mouseb,2 404 .comm _SDL_AtariIkbd_joystick,2 405