SDL-1.2.14
[sdl_omap.git] / src / timer / mint / SDL_vbltimer.S
CommitLineData
e14743d1 1/*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2009 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