aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S')
-rw-r--r--distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S404
1 files changed, 404 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S b/distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S
new file mode 100644
index 0000000..21facc8
--- /dev/null
+++ b/distrib/sdl-1.2.15/src/video/ataricommon/SDL_ikbdinterrupt.S
@@ -0,0 +1,404 @@
+/*
+ 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