mirror of
https://github.com/yawut/SDL.git
synced 2026-10-02 21:26:41 -05:00
Adapt audio interrupts for Coldfire
--HG-- branch : SDL-1.2
This commit is contained in:
@@ -55,45 +55,110 @@
|
||||
#define savptr 0x4a2
|
||||
#define savamt 0x46
|
||||
|
||||
/*--- Save/restore FPU context ---*/
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
|
||||
#define SAVE_FPU_CONTEXT \
|
||||
lea sp@(-216),sp; \
|
||||
fsave sp@; \
|
||||
fmovel fpiar,sp@-; \
|
||||
lea sp@(-64),sp; \
|
||||
fmovemd fp0-fp7,sp@
|
||||
|
||||
#define RESTORE_FPU_CONTEXT \
|
||||
fmovemd sp@,fp0-fp7; \
|
||||
lea sp@(64),sp; \
|
||||
fmovel sp@+,fpiar; \
|
||||
frestore sp@; \
|
||||
lea sp@(216),sp
|
||||
|
||||
#else
|
||||
|
||||
#define SAVE_FPU_CONTEXT \
|
||||
.chip 68k/68881; \
|
||||
fsave sp@-; \
|
||||
fmoveml fpcr/fpsr/fpiar,sp@-; \
|
||||
fmovemx fp0-fp7,sp@-; \
|
||||
.chip 68k
|
||||
|
||||
#define RESTORE_FPU_CONTEXT \
|
||||
.chip 68k/68881; \
|
||||
fmovemx sp@+,fp0-fp7; \
|
||||
fmoveml sp@+,fpcr/fpsr/fpiar; \
|
||||
frestore sp@+; \
|
||||
.chip 68k
|
||||
|
||||
#endif
|
||||
|
||||
/*--- Xbios interrupt vector to measure Falcon external clock ---*/
|
||||
|
||||
_SDL_MintAudio_XbiosInterruptMeasureClock: /* 1 mS */
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
movel d0,sp@-
|
||||
|
||||
moveql #0,d0
|
||||
btst d0,0xFFFF8901:w /* state DMA sound */
|
||||
#else
|
||||
btst #0,0xFFFF8901:w /* state DMA sound */
|
||||
#endif
|
||||
beqs SDL_MintAudio_EndIntMeasure
|
||||
addql #1,_SDL_MintAudio_clocktics
|
||||
SDL_MintAudio_EndIntMeasure:
|
||||
#if defined(__mcoldfire__)
|
||||
moveql #5,d0
|
||||
bclr d0,0xFFFFFA0F:w /* Clear service bit */
|
||||
|
||||
movel sp@+,d0
|
||||
#else
|
||||
bclr #5,0xFFFFFA0F:w /* Clear service bit */
|
||||
#endif
|
||||
rte
|
||||
|
||||
/*--- Xbios interrupt vector ---*/
|
||||
|
||||
_SDL_MintAudio_XbiosInterrupt:
|
||||
#if defined(__mcoldfire__)
|
||||
lea sp@(-60),sp
|
||||
moveml d0-d7/a0-a6,sp@
|
||||
#else
|
||||
moveml d0-d7/a0-a6,sp@-
|
||||
#endif
|
||||
|
||||
/* Reenable interrupts, so other interrupts can work */
|
||||
movew #0x2300,sr
|
||||
|
||||
/* Clear service bit, so other MFP interrupts can work */
|
||||
#if defined(__mcoldfire__)
|
||||
moveql #5,d0
|
||||
bclr d0,0xfffffa0f:w
|
||||
#else
|
||||
bclr #5,0xfffffa0f:w
|
||||
#endif
|
||||
|
||||
/* Check if we are not already running */
|
||||
tstw _SDL_MintAudio_mutex
|
||||
bne SDL_MintAudio_XbiosEnd
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
movew _SDL_MintAudio_mutex,d0
|
||||
notl d0
|
||||
movew d0,_SDL_MintAudio_mutex
|
||||
|
||||
movew _SDL_MintAudio_numbuf,d1
|
||||
eorl #1,d1
|
||||
movew d1,_SDL_MintAudio_numbuf
|
||||
#else
|
||||
notw _SDL_MintAudio_mutex
|
||||
|
||||
|
||||
/* Swap buffers */
|
||||
eorw #1,_SDL_MintAudio_numbuf
|
||||
|
||||
moveml d0-d7/a0-a6,sp@-
|
||||
|
||||
#endif
|
||||
|
||||
/* Save FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Xbios_nofpu1
|
||||
.chip 68060
|
||||
fsave sp@-
|
||||
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||
fmovemx fp0-fp7,sp@-
|
||||
.chip 68000
|
||||
SAVE_FPU_CONTEXT
|
||||
SDL_MintAudio_Xbios_nofpu1:
|
||||
|
||||
/* Callback */
|
||||
@@ -102,15 +167,16 @@ SDL_MintAudio_Xbios_nofpu1:
|
||||
/* Restore FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Xbios_nofpu2
|
||||
.chip 68060
|
||||
fmovemx sp@+,fp0-fp7
|
||||
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||
frestore sp@+
|
||||
.chip 68000
|
||||
RESTORE_FPU_CONTEXT
|
||||
SDL_MintAudio_Xbios_nofpu2:
|
||||
|
||||
/* Reserve space for registers */
|
||||
#if defined(__mcoldfire__)
|
||||
movel #savamt,d0
|
||||
subl d0,savptr
|
||||
#else
|
||||
subl #savamt,savptr
|
||||
#endif
|
||||
|
||||
/* Set new buffer */
|
||||
|
||||
@@ -132,42 +198,66 @@ SDL_MintAudio_Xbios_nofpu2:
|
||||
lea sp@(12),sp
|
||||
|
||||
/* Restore registers space */
|
||||
#if defined(__mcoldfire__)
|
||||
movel #savamt,d0
|
||||
addl d0,savptr
|
||||
#else
|
||||
addl #savamt,savptr
|
||||
|
||||
moveml sp@+,d0-d7/a0-a6
|
||||
#endif
|
||||
|
||||
clrw _SDL_MintAudio_mutex
|
||||
SDL_MintAudio_XbiosEnd:
|
||||
#if defined(__mcoldfire__)
|
||||
moveml sp@,d0-d7/a0-a6
|
||||
lea sp@(60),sp
|
||||
#else
|
||||
moveml sp@+,d0-d7/a0-a6
|
||||
#endif
|
||||
rte
|
||||
|
||||
/*--- DMA 8 bits interrupt vector ---*/
|
||||
|
||||
_SDL_MintAudio_Dma8Interrupt:
|
||||
#if defined(__mcoldfire__)
|
||||
lea sp@(-16),sp
|
||||
moveml d0-d1/a0-a1,sp@
|
||||
#else
|
||||
moveml d0-d1/a0-a1,sp@-
|
||||
#endif
|
||||
|
||||
/* Reenable interrupts, so other interrupts can work */
|
||||
movew #0x2300,sr
|
||||
|
||||
/* Clear service bit, so other MFP interrupts can work */
|
||||
#if defined(__mcoldfire__)
|
||||
moveql #5,d0
|
||||
bclr d0,0xfffffa0f:w
|
||||
#else
|
||||
bclr #5,0xfffffa0f:w
|
||||
|
||||
#endif
|
||||
/* Check if we are not already running */
|
||||
tstw _SDL_MintAudio_mutex
|
||||
bne SDL_MintAudio_Dma8End
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
movew _SDL_MintAudio_mutex,d0
|
||||
notl d0
|
||||
movew d0,_SDL_MintAudio_mutex
|
||||
|
||||
movew _SDL_MintAudio_numbuf,d1
|
||||
eorl #1,d1
|
||||
movew d1,_SDL_MintAudio_numbuf
|
||||
#else
|
||||
notw _SDL_MintAudio_mutex
|
||||
|
||||
|
||||
/* Swap buffers */
|
||||
eorw #1,_SDL_MintAudio_numbuf
|
||||
|
||||
moveml d0-d1/a0-a1,sp@-
|
||||
#endif
|
||||
|
||||
/* Save FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Dma8_nofpu1
|
||||
.chip 68060
|
||||
fsave sp@-
|
||||
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||
fmovemx fp0-fp7,sp@-
|
||||
.chip 68000
|
||||
SAVE_FPU_CONTEXT
|
||||
SDL_MintAudio_Dma8_nofpu1:
|
||||
|
||||
/* Callback */
|
||||
@@ -176,11 +266,7 @@ SDL_MintAudio_Dma8_nofpu1:
|
||||
/* Restore FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Dma8_nofpu2
|
||||
.chip 68060
|
||||
fmovemx sp@+,fp0-fp7
|
||||
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||
frestore sp@+
|
||||
.chip 68000
|
||||
RESTORE_FPU_CONTEXT
|
||||
SDL_MintAudio_Dma8_nofpu2:
|
||||
|
||||
/* Set new buffer */
|
||||
@@ -188,32 +274,39 @@ SDL_MintAudio_Dma8_nofpu2:
|
||||
moveq #0,d0
|
||||
|
||||
movew _SDL_MintAudio_numbuf,d0
|
||||
lslw #2,d0
|
||||
lsll #2,d0
|
||||
lea _SDL_MintAudio_audiobuf,a0
|
||||
movel a0@(d0:w),d1
|
||||
movel a0@(d0:l),d1
|
||||
|
||||
/* Modify DMA addresses */
|
||||
lea 0xffff8900:w,a0
|
||||
|
||||
moveb d1,a0@(0x07) /* Start address */
|
||||
rorl #8,d1
|
||||
moveb d1,a0@(0x05)
|
||||
rorl #8,d1
|
||||
moveb d1,a0@(0x03)
|
||||
swap d1
|
||||
movel d1,d0
|
||||
|
||||
moveb d0,a0@(0x07) /* Start address */
|
||||
lsrl #8,d0
|
||||
moveb d0,a0@(0x05)
|
||||
lsrl #8,d0
|
||||
moveb d0,a0@(0x03)
|
||||
|
||||
addl _SDL_MintAudio_audiosize,d1
|
||||
|
||||
moveb d1,a0@(0x13) /* End address */
|
||||
rorl #8,d1
|
||||
moveb d1,a0@(0x11)
|
||||
rorl #8,d1
|
||||
moveb d1,a0@(0x0f)
|
||||
movel d1,d0
|
||||
|
||||
moveml sp@+,d0-d1/a0-a1
|
||||
moveb d0,a0@(0x13) /* End address */
|
||||
lsrl #8,d0
|
||||
moveb d0,a0@(0x11)
|
||||
lsrl #8,d0
|
||||
moveb d0,a0@(0x0f)
|
||||
|
||||
clrw _SDL_MintAudio_mutex
|
||||
SDL_MintAudio_Dma8End:
|
||||
#if defined(__mcoldfire__)
|
||||
moveml sp@,d0-d1/a0-a1
|
||||
lea sp@(16),sp
|
||||
#else
|
||||
moveml sp@+,d0-d1/a0-a1
|
||||
#endif
|
||||
rte
|
||||
|
||||
/*--- STFA interrupt vector ---*/
|
||||
@@ -222,28 +315,40 @@ STFA_SOUND_START = 6
|
||||
STFA_SOUND_END = STFA_SOUND_START+8
|
||||
|
||||
_SDL_MintAudio_StfaInterrupt:
|
||||
|
||||
/* Reenable interrupts, so other interrupts can work */
|
||||
movew #0x2300,sr
|
||||
|
||||
/* Check if we are not already running */
|
||||
tstw _SDL_MintAudio_mutex
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
bne SDL_MintAudio_StfaEnd
|
||||
|
||||
lea sp@(-60),sp
|
||||
moveml d0-d7/a0-a6,sp@
|
||||
|
||||
movew _SDL_MintAudio_mutex,d0
|
||||
notl d0
|
||||
movew d0,_SDL_MintAudio_mutex
|
||||
|
||||
movew _SDL_MintAudio_numbuf,d1
|
||||
eorl #1,d1
|
||||
movew d1,_SDL_MintAudio_numbuf
|
||||
#else
|
||||
bnes SDL_MintAudio_StfaEnd
|
||||
notw _SDL_MintAudio_mutex
|
||||
|
||||
/* Swap buffers */
|
||||
eorw #1,_SDL_MintAudio_numbuf
|
||||
|
||||
moveml d0-d7/a0-a6,sp@-
|
||||
|
||||
notw _SDL_MintAudio_mutex
|
||||
|
||||
/* Swap buffers */
|
||||
eorw #1,_SDL_MintAudio_numbuf
|
||||
#endif
|
||||
|
||||
/* Save FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Stfa_nofpu1
|
||||
.chip 68060
|
||||
fsave sp@-
|
||||
fmoveml fpcr/fpsr/fpiar,sp@-
|
||||
fmovemx fp0-fp7,sp@-
|
||||
.chip 68000
|
||||
SAVE_FPU_CONTEXT
|
||||
SDL_MintAudio_Stfa_nofpu1:
|
||||
|
||||
/* Callback */
|
||||
@@ -252,11 +357,7 @@ SDL_MintAudio_Stfa_nofpu1:
|
||||
/* Restore FPU if needed */
|
||||
tstw _SDL_MintAudio_hasfpu
|
||||
beqs SDL_MintAudio_Stfa_nofpu2
|
||||
.chip 68060
|
||||
fmovemx sp@+,fp0-fp7
|
||||
fmoveml sp@+,fpcr/fpsr/fpiar
|
||||
frestore sp@+
|
||||
.chip 68000
|
||||
RESTORE_FPU_CONTEXT
|
||||
SDL_MintAudio_Stfa_nofpu2:
|
||||
|
||||
/* Set new buffer */
|
||||
@@ -265,17 +366,21 @@ SDL_MintAudio_Stfa_nofpu2:
|
||||
movel _SDL_MintAudio_stfa,a1
|
||||
|
||||
movew _SDL_MintAudio_numbuf,d0
|
||||
lslw #2,d0
|
||||
lsll #2,d0
|
||||
lea _SDL_MintAudio_audiobuf,a0
|
||||
movel a0@(d0:w),d1
|
||||
movel a0@(d0:l),d1
|
||||
|
||||
/* Modify STFA replay buffers */
|
||||
movel d1,a1@(STFA_SOUND_START)
|
||||
addl _SDL_MintAudio_audiosize,d1
|
||||
movel d1,a1@(STFA_SOUND_END)
|
||||
|
||||
#if defined(__mcoldfire__)
|
||||
moveml sp@,d0-d7/a0-a6
|
||||
lea sp@(60),sp
|
||||
#else
|
||||
moveml sp@+,d0-d7/a0-a6
|
||||
|
||||
#endif
|
||||
clrw _SDL_MintAudio_mutex
|
||||
SDL_MintAudio_StfaEnd:
|
||||
rte
|
||||
|
||||
Reference in New Issue
Block a user