From a855d6202536ff28e5aae4f22a0f31d8f5b325d0 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Sat, 21 Jan 2017 15:18:31 -0500 Subject: Port of Duke Nukem 3D This ports Fabien Sanglard's Chocolate Duke to run on a version of SDL for Rockbox. Change-Id: I8f2c4c78af19de10c1633ed7bb7a997b43256dd9 --- .../sdl/src/video/ataricommon/SDL_ikbdinterrupt.S | 404 +++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt.S (limited to 'apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt.S') diff --git a/apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt.S b/apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt.S new file mode 100644 index 0000000000..21facc80a2 --- /dev/null +++ b/apps/plugins/sdl/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 -- cgit v1.2.3