• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
57bcl_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 */
68place_found:
69	movel	a0,(a1)
70	moveq	#0,d0
71
72exit_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
96bcl2_search_place:
97	cmpl	(a1),d0
98	bnes	next_place
99	clrl	(a1)
100	moveq	#0,d1
101next_place:
102	addql	#4,a1
103	dbra	d1,bcl2_search_place
104
105	/* Restart interrupts */
106	movew	#0x2300,sr
107badvector:
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
132SDL_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
145SDL_AtariVbl_Xbios_nofpu2:
146
147	moveml	sp@+,d0-d7/a0-a6
148
149	clrw	vbl_mutex
150vbl_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
160