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

unix.superglobalmegacorp.com

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