Home | History | Annotate | Download | only in ataricommon
      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