symbian-qemu-0.9.1-12/libsdl-trunk/src/timer/mint/SDL_vbltimer.S
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2     SDL - Simple DirectMedia Layer
       
     3     Copyright (C) 1997-2006 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@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 /*--- Vector installer ---*/
       
    40 
       
    41 _SDL_AtariVblInstall:
       
    42 	movel	sp@(4),my_vector
       
    43 	lea		_my_vbl,a0
       
    44 
       
    45 	clrw	vbl_mutex
       
    46 	movel	_hz_200.w, _SDL_Atari_hz200
       
    47 
       
    48 	/* Stop interrupts */
       
    49 
       
    50 	movew	#0x2700,sr
       
    51 
       
    52 	/* Read vbl_queue pointer */
       
    53 	movel	_vbl_queue.w,a1
       
    54 
       
    55 	/* Search a free place */
       
    56 	moveq	#7,d0
       
    57 bcl_search_place:
       
    58 	movel	(a1),d1
       
    59 	beqs	place_found
       
    60 	addql	#4,a1
       
    61 	dbra	d0,bcl_search_place
       
    62 
       
    63 	/* Not found */
       
    64 	moveq	#1,d0
       
    65 	bras	exit_vbl_queue
       
    66 
       
    67 	/* Then install ourselves */
       
    68 place_found:
       
    69 	movel	a0,(a1)
       
    70 	moveq	#0,d0	
       
    71 
       
    72 exit_vbl_queue:
       
    73 	/* Restart interrupts */
       
    74 	movew	#0x2300,sr
       
    75 
       
    76 	rts
       
    77 
       
    78 /*--- Vector uninstaller ---*/
       
    79 
       
    80 _SDL_AtariVblUninstall:
       
    81 	movel	sp@(4),d0
       
    82 	cmpl	my_vector,d0
       
    83 	bnes	badvector
       
    84 	
       
    85 	movel	#_my_vbl,d0
       
    86 
       
    87 	/* Stop interrupts */
       
    88 
       
    89 	movew	#0x2700,sr
       
    90 
       
    91 	/* Read vbl_queue pointer */
       
    92 	movel	_vbl_queue.w,a1
       
    93 
       
    94 	/* Search where we are */
       
    95 	moveq	#7,d1
       
    96 bcl2_search_place:
       
    97 	cmpl	(a1),d0
       
    98 	bnes	next_place
       
    99 	clrl	(a1)
       
   100 	moveq	#0,d1
       
   101 next_place:
       
   102 	addql	#4,a1
       
   103 	dbra	d1,bcl2_search_place
       
   104 
       
   105 	/* Restart interrupts */
       
   106 	movew	#0x2300,sr
       
   107 badvector:
       
   108 	rts
       
   109 
       
   110 /*--- Our vbl ---*/
       
   111 
       
   112 _my_vbl:
       
   113 	/* Update _hz_200 */
       
   114 	movel	_hz_200.w, _SDL_Atari_hz200
       
   115 
       
   116 	/* Verify if this is not already running */
       
   117 
       
   118 	tstw	vbl_mutex
       
   119 	bnes	vbl_end
       
   120 	notw	vbl_mutex
       
   121 
       
   122 	moveml	d0-d7/a0-a6,sp@-
       
   123 
       
   124 	/* Save FPU if needed */
       
   125 	tstw	_SDL_MintAudio_hasfpu
       
   126 	beqs	SDL_AtariVbl_nofpu1
       
   127 	.chip	68060
       
   128 	fsave	sp@-
       
   129 	fmoveml fpcr/fpsr/fpiar,sp@-
       
   130 	fmovemx	fp0-fp7,sp@-
       
   131 	.chip	68000
       
   132 SDL_AtariVbl_nofpu1:
       
   133 
       
   134 	movel	my_vector,a0
       
   135 	jsr		a0@
       
   136 
       
   137 	/* Restore FPU if needed */
       
   138 	tstw	_SDL_MintAudio_hasfpu
       
   139 	beqs	SDL_AtariVbl_Xbios_nofpu2
       
   140 	.chip	68060
       
   141 	fmovemx	sp@+,fp0-fp7
       
   142 	fmoveml	sp@+,fpcr/fpsr/fpiar
       
   143 	frestore	sp@+
       
   144 	.chip	68000
       
   145 SDL_AtariVbl_Xbios_nofpu2:
       
   146 
       
   147 	moveml	sp@+,d0-d7/a0-a6
       
   148 
       
   149 	clrw	vbl_mutex
       
   150 vbl_end:
       
   151 	rts
       
   152 
       
   153 	.data
       
   154 	.even
       
   155 	.comm	_SDL_Atari_hz200,4*1
       
   156 	.even
       
   157 	.comm	vbl_mutex,2*1
       
   158 	.even
       
   159 	.comm	my_vector,4*1