/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2012 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. 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 Lesser General Public License for more details. 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 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 .globl _SDL_AtariIkbd_enabled /*--- Install our IKBD vector ---*/ _SDL_AtariIkbdInstall: #if defined(__mcoldfire__) lea sp@(-16),sp moveml d0-d1/a0-a1,sp@ #else moveml d0-d1/a0-a1,sp@- #endif | Disable interrupts movew #0x2700,sr | Save MFP registers used for keyboard lea 0xfffffa00:w,a0 btst #6,a0@(0x09) #if defined(__mcoldfire__) sne d0 move.b d0,ikbd_ierb #else sne ikbd_ierb #endif btst #6,a0@(0x15) #if defined(__mcoldfire__) sne d0 move.b d0,ikbd_imrb #else sne ikbd_imrb #endif | Set our routine #if defined(__mcoldfire__) movel 0x118:w,d0 movel d0,old_ikbd lea ikbd,a0 movel a0,0x118:w moveql #6,d0 bset d0,0xfffffa09:w | IERB bset d0,0xfffffa15:w | IMRB #else movel 0x118:w,old_ikbd movel #ikbd,0x118:w bset #6,0xfffffa09:w | IERB bset #6,0xfffffa15:w | IMRB #endif | Set mouse relative mode #if defined(__mcoldfire__) moveql #8,d0 moveb d0,0xfffffc02:w #else moveb #8,0xfffffc02:w #endif | Reenable interrupts movew #0x2300,sr | Interrupts done #if defined(__mcoldfire__) movel #0xffff,d0 movew d0,_SDL_AtariIkbd_enabled moveml sp@,d0-d1/a0-a1 lea sp@(16),sp #else movew #0xffff,_SDL_AtariIkbd_enabled moveml sp@+,d0-d1/a0-a1 #endif rts /*--- Uninstall our IKBD vector ---*/ _SDL_AtariIkbdUninstall: movel a0,sp@- | Disable interrupts movew #0x2700,sr | Restore previous MFP registers lea 0xfffffa00:w,a0 bclr #6,a0@(0x09) tstb ikbd_ierb beqs ikbd_restoreierb bset #6,a0@(0x09) ikbd_restoreierb: bclr #6,a0@(0x15) tstb ikbd_imrb beqs ikbd_restoreimrb bset #6,a0@(0x15) ikbd_restoreimrb: #if defined(__mcoldfire__) movel old_ikbd,a0 movel a0,0x118:w #else movel old_ikbd,0x118:w #endif | Clear keyboard buffer lea 0xfffffc00:w,a0 ikbd_videbuffer: btst #0,a0@ beqs ikbd_finbuffer tstb a0@(0x02) bras ikbd_videbuffer ikbd_finbuffer: | Reenable interrupts movew #0x2300,sr movel sp@+,a0 rts .bss .even .comm ikbd_ierb,1 .comm ikbd_imrb,1 /*--- Our custom IKBD vector ---*/ .text .even .ascii "XBRA" .ascii "LSDL" .comm old_ikbd,4*1 ikbd: #if defined(__mcoldfire__) lea sp@(-12),sp moveml d0-d1/a0,sp@ #else moveml d0-d1/a0,sp@- #endif | Check if source is IKBD or MIDI #if defined(__mcoldfire__) moveql #0,d0 btst d0,0xfffffc00.w #else btst #0,0xfffffc00.w #endif beqs ikbd_oldmidi moveb 0xfffffc02:w,d0 | Joystick packet ? cmpb #0xff,d0 beqs ikbd_yes_joystick | Mouse packet ? cmpb #0xf8,d0 bmis ikbd_no_mouse cmpb #0xfc,d0 bpls ikbd_no_mouse | Mouse packet, byte #1 ikbd_yes_mouse: #if defined(__mcoldfire__) andl #3,d0 #else andw #3,d0 #endif movew d0,_SDL_AtariIkbd_mouseb #if defined(__mcoldfire__) movel #ikbd_mousex,d0 movel d0,0x118:w #else movel #ikbd_mousex,0x118:w #endif bras ikbd_endit_stack | Joystick packet, byte #1 ikbd_yes_joystick: #if defined(__mcoldfire__) movel #ikbd_joystick,d0 movel d0,0x118:w #else movel #ikbd_joystick,0x118:w #endif bras ikbd_endit_stack | Keyboard press/release ikbd_no_mouse: moveb d0,d1 lea _SDL_AtariIkbd_keyboard,a0 #if defined(__mcoldfire__) andl #0x7f,d1 btst #7,d0 spl d0 moveb d0,a0@(0,d1:l) #else andw #0x7f,d1 tas d0 spl a0@(0,d1:w) #endif | End of interrupt ikbd_endit_stack: #if defined(__mcoldfire__) moveql #6,d0 bclr d0,0xfffffa11:w moveml sp@,d0-d1/a0 lea sp@(12),sp #else moveml sp@+,d0-d1/a0 bclr #6,0xfffffa11:w #endif rte | Call old MIDI interrupt ikbd_oldmidi: #if defined(__mcoldfire__) moveml sp@,d0-d1/a0 lea sp@(12),sp #else moveml sp@+,d0-d1/a0 #endif movel old_ikbd,sp@- rts | Mouse packet, byte #2 ikbd_mousex: #if defined(__mcoldfire__) lea sp@(-12),sp moveml d0-d1/a0,sp@ #else moveml d0-d1/a0,sp@- #endif | Check if source is IKBD or MIDI #if defined(__mcoldfire__) moveql #0,d0 btst d0,0xfffffc00.w #else btst #0,0xfffffc00.w #endif beqs ikbd_oldmidi moveb 0xfffffc02:w,d0 extw d0 #if defined(__mcoldfire__) movew _SDL_AtariIkbd_mousex,d1 addl d1,d0 movew d0,_SDL_AtariIkbd_mousex movel #ikbd_mousey,d0 movel d0,0x118:w #else addw d0,_SDL_AtariIkbd_mousex movel #ikbd_mousey,0x118:w #endif bras ikbd_endit_stack | Mouse packet, byte #3 ikbd_mousey: #if defined(__mcoldfire__) lea sp@(-12),sp moveml d0-d1/a0,sp@ #else moveml d0-d1/a0,sp@- #endif | Check if source is IKBD or MIDI #if defined(__mcoldfire__) moveql #0,d0 btst d0,0xfffffc00.w #else btst #0,0xfffffc00.w #endif beqs ikbd_oldmidi moveb 0xfffffc02:w,d0 extw d0 #if defined(__mcoldfire__) movew _SDL_AtariIkbd_mousey,d1 addl d1,d0 movew d0,_SDL_AtariIkbd_mousey movel #ikbd,d0 movel d0,0x118:w #else addw d0,_SDL_AtariIkbd_mousey movel #ikbd,0x118:w #endif bras ikbd_endit_stack | Joystick packet, byte #2 ikbd_joystick: #if defined(__mcoldfire__) lea sp@(-12),sp moveml d0-d1/a0,sp@ #else moveml d0-d1/a0,sp@- #endif | Check if source is IKBD or MIDI #if defined(__mcoldfire__) moveql #0,d0 btst d0,0xfffffc00.w #else btst #0,0xfffffc00.w #endif beqs ikbd_oldmidi #if defined(__mcoldfire__) moveb 0xfffffc02:w,d0 moveb d0,_SDL_AtariIkbd_joystick+1 movel #ikbd,d0 movel d0,0x118:w bra ikbd_endit_stack #else moveb 0xfffffc02:w,_SDL_AtariIkbd_joystick+1 movel #ikbd,0x118:w bras ikbd_endit_stack #endif .data .even _SDL_AtariIkbd_enabled: .word 0 .bss .even .comm _SDL_AtariIkbd_keyboard,128 .comm _SDL_AtariIkbd_mousex,2 .comm _SDL_AtariIkbd_mousey,2 .comm _SDL_AtariIkbd_mouseb,2 .comm _SDL_AtariIkbd_joystick,2