diff options
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/ataricommon/SDL_ikbdinterrupt.S')
-rw-r--r-- | distrib/sdl-1.2.12/src/video/ataricommon/SDL_ikbdinterrupt.S | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.12/src/video/ataricommon/SDL_ikbdinterrupt.S b/distrib/sdl-1.2.12/src/video/ataricommon/SDL_ikbdinterrupt.S new file mode 100644 index 0000000..9cbf593 --- /dev/null +++ b/distrib/sdl-1.2.12/src/video/ataricommon/SDL_ikbdinterrupt.S @@ -0,0 +1,260 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2006 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: + moveml d0-d1/a0-a1,sp@- + + | Disable interrupts + + movew #0x2700,sr + + | Save MFP registers used for keyboard + + lea 0xfffffa00:w,a0 + btst #6,a0@(0x09) + sne ikbd_ierb + btst #6,a0@(0x15) + sne ikbd_imrb + + | Set our routine + + movel 0x118:w,old_ikbd + movel #ikbd,0x118:w + bset #6,0xfffffa09:w | IERB + bset #6,0xfffffa15:w | IMRB + + | Set mouse relative mode + + moveb #8,0xfffffc02:w + + | Reenable interrupts + + movew #0x2300,sr + + | Interrupts done + + movew #0xffff,_SDL_AtariIkbd_enabled + + moveml sp@+,d0-d1/a0-a1 + 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: + + movel old_ikbd,0x118:w + + | 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: + | Check if source is IKBD or MIDI + btst #0,0xfffffc00.w + beqs ikbd_oldmidi + + moveml d0-d1/a0,sp@- + 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: + andw #3,d0 + movew d0,_SDL_AtariIkbd_mouseb + + movel #ikbd_mousex,0x118:w + bras ikbd_endit_stack + + | Joystick packet, byte #1 + +ikbd_yes_joystick: + movel #ikbd_joystick,0x118:w + bras ikbd_endit_stack + + | Keyboard press/release + +ikbd_no_mouse: + moveb d0,d1 + lea _SDL_AtariIkbd_keyboard,a0 + andw #0x7f,d1 + tas d0 + spl a0@(0,d1:w) + + | End of interrupt + +ikbd_endit_stack: + moveml sp@+,d0-d1/a0 +ikbd_endit: + bclr #6,0xfffffa11:w + rte + + | Call old MIDI interrupt + +ikbd_oldmidi: + movel old_ikbd,sp@- + rts + + | Mouse packet, byte #2 + +ikbd_mousex: + + | Check if source is IKBD or MIDI + btst #0,0xfffffc00.w + beqs ikbd_oldmidi + + movew d0,sp@- + + moveb 0xfffffc02:w,d0 + extw d0 + addw d0,_SDL_AtariIkbd_mousex + + movew sp@+,d0 + + movel #ikbd_mousey,0x118:w + bras ikbd_endit + + | Mouse packet, byte #3 + +ikbd_mousey: + + | Check if source is IKBD or MIDI + btst #0,0xfffffc00.w + beqs ikbd_oldmidi + + movew d0,sp@- + + moveb 0xfffffc02:w,d0 + extw d0 + addw d0,_SDL_AtariIkbd_mousey + + movew sp@+,d0 + + movel #ikbd,0x118:w + bras ikbd_endit + + | Joystick packet, byte #2 + +ikbd_joystick: + + | Check if source is IKBD or MIDI + btst #0,0xfffffc00.w + beqs ikbd_oldmidi + + moveb 0xfffffc02:w,_SDL_AtariIkbd_joystick+1 + + movel #ikbd,0x118:w + bras ikbd_endit + + .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 |