146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *	VBL queue routine
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *	Patrice Mandin
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define _vbl_queue 0x456
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define _hz_200    0x4ba
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.text
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.globl	_SDL_AtariVblInstall
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.globl	_SDL_AtariVblUninstall
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.globl	_SDL_MintAudio_hasfpu
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*--- Vector installer ---*/
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_SDL_AtariVblInstall:
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	sp@(4),my_vector
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	lea		_my_vbl,a0
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	clrw	vbl_mutex
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	_hz_200.w, _SDL_Atari_hz200
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Stop interrupts */
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movew	#0x2700,sr
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Read vbl_queue pointer */
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	_vbl_queue.w,a1
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Search a free place */
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveq	#7,d0
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbcl_search_place:
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	(a1),d1
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	beqs	place_found
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	addql	#4,a1
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	dbra	d0,bcl_search_place
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Not found */
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveq	#1,d0
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bras	exit_vbl_queue
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Then install ourselves */
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerplace_found:
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	a0,(a1)
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveq	#0,d0
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerexit_vbl_queue:
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Restart interrupts */
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movew	#0x2300,sr
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	rts
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*--- Vector uninstaller ---*/
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_SDL_AtariVblUninstall:
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	sp@(4),d0
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	cmpl	my_vector,d0
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bnes	badvector
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	#_my_vbl,d0
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Stop interrupts */
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movew	#0x2700,sr
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Read vbl_queue pointer */
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	_vbl_queue.w,a1
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Search where we are */
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveq	#7,d1
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbcl2_search_place:
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	cmpl	(a1),d0
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bnes	next_place
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	clrl	(a1)
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveq	#0,d1
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnernext_place:
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	addql	#4,a1
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	dbra	d1,bcl2_search_place
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Restart interrupts */
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movew	#0x2300,sr
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerbadvector:
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	rts
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*--- Our vbl ---*/
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_my_vbl:
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Update _hz_200 */
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	_hz_200.w, _SDL_Atari_hz200
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Verify if this is not already running */
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tstw	vbl_mutex
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	bnes	vbl_end
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	notw	vbl_mutex
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveml	d0-d7/a0-a6,sp@-
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Save FPU if needed */
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tstw	_SDL_MintAudio_hasfpu
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	beqs	SDL_AtariVbl_nofpu1
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.chip	68060
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fsave	sp@-
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fmoveml fpcr/fpsr/fpiar,sp@-
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fmovemx	fp0-fp7,sp@-
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.chip	68000
13246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_AtariVbl_nofpu1:
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	movel	my_vector,a0
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	jsr		a0@
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Restore FPU if needed */
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	tstw	_SDL_MintAudio_hasfpu
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	beqs	SDL_AtariVbl_Xbios_nofpu2
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.chip	68060
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fmovemx	sp@+,fp0-fp7
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fmoveml	sp@+,fpcr/fpsr/fpiar
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	frestore	sp@+
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.chip	68000
14546be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_AtariVbl_Xbios_nofpu2:
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	moveml	sp@+,d0-d7/a0-a6
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	clrw	vbl_mutex
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervbl_end:
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	rts
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.data
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.even
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.comm	_SDL_Atari_hz200,4*1
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.even
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.comm	vbl_mutex,2*1
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.even
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	.comm	my_vector,4*1
160