Annotation of quake2/linux/d_copy.s, revision 1.1.1.1

1.1       root        1: /
                      2: // d_copy.s
                      3: // x86 assembly-language screen copying code.
                      4: //
                      5: 
                      6: #include "qasm.h"
                      7: 
                      8:        .data
                      9: 
                     10: LCopyWidth:            .long   0
                     11: LBlockSrcStep: .long   0
                     12: LBlockDestStep:        .long   0
                     13: LSrcDelta:             .long   0
                     14: LDestDelta:            .long   0
                     15: 
                     16: #define bufptr 4+16
                     17: 
                     18: // copies 16 rows per plane at a pop; idea is that 16*512 = 8k, and since
                     19: // no Mode X mode is wider than 360, all the data should fit in the cache for
                     20: // the passes for the next 3 planes
                     21: 
                     22:        .text
                     23: 
                     24: .globl C(VGA_UpdatePlanarScreen)
                     25: C(VGA_UpdatePlanarScreen):
                     26:        pushl   %ebp                            // preserve caller's stack frame
                     27:        pushl   %edi
                     28:        pushl   %esi                            // preserve register variables
                     29:        pushl   %ebx
                     30: 
                     31:        movl    C(VGA_bufferrowbytes),%eax
                     32:        shll    $1,%eax
                     33:        movl    %eax,LBlockSrcStep
                     34:        movl    C(VGA_rowbytes),%eax
                     35:        shll    $1,%eax
                     36:        movl    %eax,LBlockDestStep
                     37: 
                     38:        movl    $0x3C4,%edx
                     39:        movb    $2,%al
                     40:        outb    %al,%dx         // point the SC to the Map Mask
                     41:        incl    %edx
                     42: 
                     43:        movl    bufptr(%esp),%esi
                     44:        movl    C(VGA_pagebase),%edi
                     45:        movl    C(VGA_height),%ebp
                     46:        shrl    $1,%ebp
                     47: 
                     48:        movl    C(VGA_width),%ecx
                     49:        movl    C(VGA_bufferrowbytes),%eax
                     50:        subl    %ecx,%eax
                     51:        movl    %eax,LSrcDelta
                     52:        movl    C(VGA_rowbytes),%eax
                     53:        shll    $2,%eax
                     54:        subl    %ecx,%eax
                     55:        movl    %eax,LDestDelta
                     56:        shrl    $4,%ecx
                     57:        movl    %ecx,LCopyWidth
                     58: 
                     59: LRowLoop:
                     60:        movb    $1,%al
                     61: 
                     62: LPlaneLoop:
                     63:        outb    %al,%dx
                     64:        movb    $2,%ah
                     65: 
                     66:        pushl   %esi
                     67:        pushl   %edi
                     68: LRowSetLoop:
                     69:        movl    LCopyWidth,%ecx
                     70: LColumnLoop:
                     71:        movb    12(%esi),%bh
                     72:        movb    8(%esi),%bl
                     73:        shll    $16,%ebx
                     74:        movb    4(%esi),%bh
                     75:        movb    (%esi),%bl
                     76:        movl    %ebx,(%edi)
                     77:        addl    $16,%esi
                     78:        addl    $4,%edi
                     79:        decl    %ecx
                     80:        jnz             LColumnLoop
                     81: 
                     82:        addl    LDestDelta,%edi
                     83:        addl    LSrcDelta,%esi
                     84:        decb    %ah
                     85:        jnz             LRowSetLoop
                     86: 
                     87:        popl    %edi
                     88:        popl    %esi
                     89:        incl    %esi
                     90: 
                     91:        shlb    $1,%al
                     92:        cmpb    $16,%al
                     93:        jnz             LPlaneLoop
                     94: 
                     95:        subl    $4,%esi
                     96:        addl    LBlockSrcStep,%esi
                     97:        addl    LBlockDestStep,%edi
                     98:        decl    %ebp
                     99:        jnz             LRowLoop
                    100: 
                    101:        popl    %ebx                            // restore register variables
                    102:        popl    %esi
                    103:        popl    %edi
                    104:        popl    %ebp                            // restore the caller's stack frame
                    105: 
                    106:        ret
                    107: 
                    108: 
                    109: #define srcptr                 4+16
                    110: #define destptr                        8+16
                    111: #define width                  12+16
                    112: #define height                 16+16
                    113: #define srcrowbytes            20+16
                    114: #define destrowbytes   24+16
                    115: 
                    116: .globl C(VGA_UpdateLinearScreen)
                    117: C(VGA_UpdateLinearScreen):
                    118:        pushl   %ebp                            // preserve caller's stack frame
                    119:        pushl   %edi
                    120:        pushl   %esi                            // preserve register variables
                    121:        pushl   %ebx
                    122: 
                    123:        cld
                    124:        movl    srcptr(%esp),%esi
                    125:        movl    destptr(%esp),%edi
                    126:        movl    width(%esp),%ebx
                    127:        movl    srcrowbytes(%esp),%eax
                    128:        subl    %ebx,%eax
                    129:        movl    destrowbytes(%esp),%edx
                    130:        subl    %ebx,%edx
                    131:        shrl    $2,%ebx
                    132:        movl    height(%esp),%ebp
                    133: LLRowLoop:
                    134:        movl    %ebx,%ecx
                    135:        rep/movsl       (%esi),(%edi)
                    136:        addl    %eax,%esi
                    137:        addl    %edx,%edi
                    138:        decl    %ebp
                    139:        jnz             LLRowLoop
                    140: 
                    141:        popl    %ebx                            // restore register variables
                    142:        popl    %esi
                    143:        popl    %edi
                    144:        popl    %ebp                            // restore the caller's stack frame
                    145: 
                    146:        ret
                    147: 

unix.superglobalmegacorp.com

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