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