Annotation of quake1/snd_mixa.s, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.