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