Home | History | Annotate | Download | only in mint
      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  *	VBL queue routine
     25  *
     26  *	Patrice Mandin
     27  */
     28 
     29 #define _vbl_queue 0x456
     30 #define _hz_200    0x4ba
     31 
     32 	.text
     33 
     34 	.globl	_SDL_AtariVblInstall
     35 	.globl	_SDL_AtariVblUninstall
     36 
     37 	.globl	_SDL_MintAudio_hasfpu
     38 
     39 /*--- Save/restore FPU context ---*/
     40 
     41 #if defined(__mcoldfire__)
     42 
     43 #define SAVE_FPU_CONTEXT \
     44 	lea		sp@(-216),sp;	\
     45 	fsave		sp@;	\
     46 	fmovel		fpiar,sp@-;	\
     47 	lea		sp@(-64),sp;	\
     48 	fmovemd	fp0-fp7,sp@
     49 
     50 #define RESTORE_FPU_CONTEXT	\
     51 	fmovemd		sp@,fp0-fp7;	\
     52 	lea		sp@(64),sp;	\
     53 	fmovel		sp@+,fpiar;	\
     54 	frestore	sp@;	\
     55 	lea		sp@(216),sp
     56 
     57 #else
     58 
     59 #define SAVE_FPU_CONTEXT	\
     60 	.chip	68k/68881;	\
     61 	fsave	sp@-;	\
     62 	fmoveml fpcr/fpsr/fpiar,sp@-;	\
     63 	fmovemx	fp0-fp7,sp@-;	\
     64 	.chip	68k
     65 
     66 #define RESTORE_FPU_CONTEXT	\
     67 	.chip	68k/68881;	\
     68 	fmovemx	sp@+,fp0-fp7;	\
     69 	fmoveml	sp@+,fpcr/fpsr/fpiar;	\
     70 	frestore	sp@+;	\
     71 	.chip	68k
     72 
     73 #endif
     74 
     75 /*--- Vector installer ---*/
     76 
     77 _SDL_AtariVblInstall:
     78 #if defined(__mcoldfire__)
     79 	movel	sp@(4),d0
     80 	movel	d0,my_vector
     81 #else
     82 	movel	sp@(4),my_vector
     83 #endif
     84 
     85 	lea		_my_vbl,a0
     86 
     87 	clrw	vbl_mutex
     88 #if defined(__mcoldfire__)
     89 	movel	_hz_200.w,d0
     90 	movel	d0, _SDL_Atari_hz200
     91 #else
     92 	movel	_hz_200.w, _SDL_Atari_hz200
     93 #endif
     94 
     95 	/* Stop interrupts */
     96 
     97 	movew	#0x2700,sr
     98 
     99 	/* Read vbl_queue pointer */
    100 	movel	_vbl_queue.w,a1
    101 
    102 	/* Search a free place */
    103 	moveq	#7,d0
    104 bcl_search_place:
    105 	movel	(a1),d1
    106 	beqs	place_found
    107 	addql	#4,a1
    108 #if defined(__mcoldfire__)
    109 	subql	#1,d0
    110 	bpls	bcl_search_place
    111 #else
    112 	dbra	d0,bcl_search_place
    113 #endif
    114 
    115 	/* Not found */
    116 	moveq	#1,d0
    117 	bras	exit_vbl_queue
    118 
    119 	/* Then install ourselves */
    120 place_found:
    121 	movel	a0,(a1)
    122 	moveq	#0,d0
    123 
    124 exit_vbl_queue:
    125 	/* Restart interrupts */
    126 	movew	#0x2300,sr
    127 
    128 	rts
    129 
    130 /*--- Vector uninstaller ---*/
    131 
    132 _SDL_AtariVblUninstall:
    133 	movel	sp@(4),d0
    134 	cmpl	my_vector,d0
    135 	bnes	badvector
    136 
    137 	movel	#_my_vbl,d0
    138 
    139 	/* Stop interrupts */
    140 
    141 	movew	#0x2700,sr
    142 
    143 	/* Read vbl_queue pointer */
    144 	movel	_vbl_queue.w,a1
    145 
    146 	/* Search where we are */
    147 	moveq	#7,d1
    148 bcl2_search_place:
    149 	cmpl	(a1),d0
    150 	bnes	next_place
    151 	clrl	(a1)
    152 	moveq	#0,d1
    153 next_place:
    154 	addql	#4,a1
    155 #if defined(__mcoldfire__)
    156 	subql	#1,d1
    157 	bpls	bcl_search_place
    158 #else
    159 	dbra	d1,bcl2_search_place
    160 #endif
    161 
    162 	/* Restart interrupts */
    163 	movew	#0x2300,sr
    164 badvector:
    165 	rts
    166 
    167 /*--- Our vbl ---*/
    168 
    169 _my_vbl:
    170 #if defined(__mcoldfire__)
    171 	lea	sp@(-60),sp
    172 	moveml	d0-d7/a0-a6,sp@
    173 #else
    174 	moveml	d0-d7/a0-a6,sp@-
    175 #endif
    176 
    177 	/* Update _hz_200 */
    178 #if defined(__mcoldfire__)
    179 	movel	_hz_200.w,d0
    180 	movel	d0, _SDL_Atari_hz200
    181 #else
    182 	movel	_hz_200.w, _SDL_Atari_hz200
    183 #endif
    184 
    185 	/* Verify if this is not already running */
    186 
    187 	tstw	vbl_mutex
    188 	bnes	vbl_end
    189 #if defined(__mcoldfire__)
    190 	movew	vbl_mutex,d0
    191 	notl	d0
    192 	movew	d0,vbl_mutex
    193 #else
    194 	notw	vbl_mutex
    195 #endif
    196 
    197 	/* Save FPU if needed */
    198 	tstw	_SDL_MintAudio_hasfpu
    199 	beqs	SDL_AtariVbl_nofpu1
    200 	SAVE_FPU_CONTEXT
    201 SDL_AtariVbl_nofpu1:
    202 
    203 	movel	my_vector,a0
    204 	jsr		a0@
    205 
    206 	/* Restore FPU if needed */
    207 	tstw	_SDL_MintAudio_hasfpu
    208 	beqs	SDL_AtariVbl_Xbios_nofpu2
    209 	RESTORE_FPU_CONTEXT
    210 SDL_AtariVbl_Xbios_nofpu2:
    211 
    212 	clrw	vbl_mutex
    213 vbl_end:
    214 #if defined(__mcoldfire__)
    215 	moveml	sp@,d0-d7/a0-a6
    216 	lea	sp@(60),sp
    217 #else
    218 	moveml	sp@+,d0-d7/a0-a6
    219 #endif
    220 	rts
    221 
    222 	.data
    223 	.even
    224 	.comm	_SDL_Atari_hz200,4*1
    225 	.even
    226 	.comm	vbl_mutex,2*1
    227 	.even
    228 	.comm	my_vector,4*1
    229