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 (at) 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 160