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@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 104bcl_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 */ 120place_found: 121 movel a0,(a1) 122 moveq #0,d0 123 124exit_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 148bcl2_search_place: 149 cmpl (a1),d0 150 bnes next_place 151 clrl (a1) 152 moveq #0,d1 153next_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 164badvector: 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 201SDL_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 210SDL_AtariVbl_Xbios_nofpu2: 211 212 clrw vbl_mutex 213vbl_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