Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

snd_mixa.s (3987B)


      1 //
      2 // snd_mixa.s
      3 // x86 assembly-language sound code
      4 //
      5 
      6 #include "qasm.h"
      7 
      8 #if	id386
      9 
     10 	.text
     11 
     12 //----------------------------------------------------------------------
     13 // 8-bit sound-mixing code
     14 //----------------------------------------------------------------------
     15 
     16 #define ch		4+16
     17 #define sc		8+16
     18 #define count	12+16
     19 
     20 .globl C(S_PaintChannelFrom8)
     21 C(S_PaintChannelFrom8):
     22 	pushl	%esi				// preserve register variables
     23 	pushl	%edi
     24 	pushl	%ebx
     25 	pushl	%ebp
     26 
     27 //	int 	data;
     28 //	short	*lscale, *rscale;
     29 //	unsigned char *sfx;
     30 //	int		i;
     31 
     32 	movl	ch(%esp),%ebx
     33 	movl	sc(%esp),%esi
     34 
     35 //	if (ch->leftvol > 255)
     36 //		ch->leftvol = 255;
     37 //	if (ch->rightvol > 255)
     38 //		ch->rightvol = 255;
     39 	movl	ch_leftvol(%ebx),%eax
     40 	movl	ch_rightvol(%ebx),%edx
     41 	cmpl	$255,%eax
     42 	jna		LLeftSet
     43 	movl	$255,%eax
     44 LLeftSet:
     45 	cmpl	$255,%edx
     46 	jna		LRightSet
     47 	movl	$255,%edx
     48 LRightSet:
     49 
     50 //	lscale = snd_scaletable[ch->leftvol >> 3];
     51 //	rscale = snd_scaletable[ch->rightvol >> 3];
     52 //	sfx = (signed char *)sc->data + ch->pos;
     53 //	ch->pos += count;
     54 	andl	$0xF8,%eax
     55 	addl	$(sfxc_data),%esi
     56 	andl	$0xF8,%edx
     57 	movl	ch_pos(%ebx),%edi
     58 	movl	count(%esp),%ecx
     59 	addl	%edi,%esi
     60 	shll	$7,%eax
     61 	addl	%ecx,%edi
     62 	shll	$7,%edx
     63 	movl	%edi,ch_pos(%ebx)
     64 	addl	$(C(snd_scaletable)),%eax
     65 	addl	$(C(snd_scaletable)),%edx
     66 	subl	%ebx,%ebx
     67 	movb	-1(%esi,%ecx,1),%bl
     68 
     69 	testl	$1,%ecx
     70 	jz		LMix8Loop
     71 
     72 	movl	(%eax,%ebx,4),%edi
     73 	movl	(%edx,%ebx,4),%ebp
     74 	addl	C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size),%edi
     75 	addl	C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size),%ebp
     76 	movl	%edi,C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size)
     77 	movl	%ebp,C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size)
     78 	movb	-2(%esi,%ecx,1),%bl
     79 
     80 	decl	%ecx
     81 	jz		LDone
     82 
     83 //	for (i=0 ; i<count ; i++)
     84 //	{
     85 LMix8Loop:
     86 
     87 //		data = sfx[i];
     88 //		paintbuffer[i].left += lscale[data];
     89 //		paintbuffer[i].right += rscale[data];
     90 	movl	(%eax,%ebx,4),%edi
     91 	movl	(%edx,%ebx,4),%ebp
     92 	addl	C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size),%edi
     93 	addl	C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size),%ebp
     94 	movb	-2(%esi,%ecx,1),%bl
     95 	movl	%edi,C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size)
     96 	movl	%ebp,C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size)
     97 
     98 	movl	(%eax,%ebx,4),%edi
     99 	movl	(%edx,%ebx,4),%ebp
    100 	movb	-3(%esi,%ecx,1),%bl
    101 	addl	C(paintbuffer)+psp_left-psp_size*2(,%ecx,psp_size),%edi
    102 	addl	C(paintbuffer)+psp_right-psp_size*2(,%ecx,psp_size),%ebp
    103 	movl	%edi,C(paintbuffer)+psp_left-psp_size*2(,%ecx,psp_size)
    104 	movl	%ebp,C(paintbuffer)+psp_right-psp_size*2(,%ecx,psp_size)
    105 
    106 //	}
    107 	subl	$2,%ecx
    108 	jnz		LMix8Loop
    109 
    110 LDone:
    111 	popl	%ebp
    112 	popl	%ebx
    113 	popl	%edi
    114 	popl	%esi
    115 
    116 	ret
    117 
    118 
    119 //----------------------------------------------------------------------
    120 // Transfer of stereo buffer to 16-bit DMA buffer code
    121 //----------------------------------------------------------------------
    122 
    123 .globl C(S_WriteLinearBlastStereo16)
    124 C(S_WriteLinearBlastStereo16):
    125 	pushl	%edi
    126 	pushl	%ebx
    127 
    128 //	int		i;
    129 //	int		val;
    130 	movl	C(snd_linear_count),%ecx
    131 	movl	C(snd_p),%ebx
    132 	movl	C(snd_out),%edi
    133 
    134 //	for (i=0 ; i<snd_linear_count ; i+=2)
    135 //	{
    136 LWLBLoopTop:
    137 
    138 //		val = (snd_p[i]*snd_vol)>>8;
    139 //		if (val > 0x7fff)
    140 //			snd_out[i] = 0x7fff;
    141 //		else if (val < (short)0x8000)
    142 //			snd_out[i] = (short)0x8000;
    143 //		else
    144 //			snd_out[i] = val;
    145 	movl	-8(%ebx,%ecx,4),%eax
    146 	sarl	$8,%eax
    147 	cmpl	$0x7FFF,%eax
    148 	jg		LClampHigh
    149 	cmpl	$0xFFFF8000,%eax
    150 	jnl		LClampDone
    151 	movl	$0xFFFF8000,%eax
    152 	jmp		LClampDone
    153 LClampHigh:
    154 	movl	$0x7FFF,%eax
    155 LClampDone:
    156 
    157 //		val = (snd_p[i+1]*snd_vol)>>8;
    158 //		if (val > 0x7fff)
    159 //			snd_out[i+1] = 0x7fff;
    160 //		else if (val < (short)0x8000)
    161 //			snd_out[i+1] = (short)0x8000;
    162 //		else
    163 //			snd_out[i+1] = val;
    164 	movl	-4(%ebx,%ecx,4),%edx
    165 	sarl	$8,%edx
    166 	cmpl	$0x7FFF,%edx
    167 	jg		LClampHigh2
    168 	cmpl	$0xFFFF8000,%edx
    169 	jnl		LClampDone2
    170 	movl	$0xFFFF8000,%edx
    171 	jmp		LClampDone2
    172 LClampHigh2:
    173 	movl	$0x7FFF,%edx
    174 LClampDone2:
    175 	shll	$16,%edx
    176 	andl	$0xFFFF,%eax
    177 	orl		%eax,%edx
    178 	movl	%edx,-4(%edi,%ecx,2)
    179 
    180 //	}
    181 	subl	$2,%ecx
    182 	jnz		LWLBLoopTop
    183 
    184 //	snd_p += snd_linear_count;
    185 
    186 	popl	%ebx
    187 	popl	%edi
    188 
    189 	ret
    190 
    191 
    192 #endif	// id386
    193