File:  [WindowsNT SDKs] / ntddk / src / video / displays / vga256 / i386 / srccopy.asm
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:31:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntddk-nov-1993, HEAD
Microsoft Windows NT Build 511 (DDK SDK) 11-01-1993

;---------------------------Module-Header------------------------------;
; Module Name: srccopy.asm
;
; Copyright (c) 1993 Microsoft Corporation
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
; VOID vSrcCopy8bpp(ppdev, psoSrc, prclDst, pptlSrc, lSrcDelta, pvSrcStart);
;
; Input:
;
;  ppdev      - screen pdev
;  psoSrc     - source surface
;  prcldest   - pointer to destination rectangle
;  pptlsrc    - pointer to source upper left corner
;  lSrcDelta  - offset from start of one scan to next in source
;  pvSrcStart - pointer to start of bitmap
;
; Performs 8bpp SRCCOPY memory-to-screen blts.
;
;-----------------------------------------------------------------------;
; NOTE: Assumes all rectangles have positive heights and widths. Will
; not work properly if this is not the case.
;-----------------------------------------------------------------------;

;-----------------------------------------------------------------------;
; Set LOOP_UNROLL_SHIFT to the log2 of the number of times you want loops in
; this module unrolled. For example, LOOP_UNROLL_SHIFT of 3 yields 2**3 = 8
; times unrolling. This is the only thing you need to change to control
; unrolling.

LOOP_UNROLL_SHIFT equ 2

;-----------------------------------------------------------------------;

        .386

        .model  small,c

        assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
        assume fs:nothing,gs:nothing

        .xlist
        include stdcall.inc             ;calling convention cmacros
        include i386\strucs.inc
        include i386\driver.inc
        include i386\unroll.inc
        include i386\egavga.inc

        .list

;-----------------------------------------------------------------------;

        .data

;-----------------------------------------------------------------------;

        .code

;-----------------------------------------------------------------------;

cProc   vSrcCopy8bpp,20,<       \
        uses esi edi ebx,       \
        ppdev:      ptr PDEV,   \
        prclDst:    ptr RECTL,  \
        pptlSrc:    ptr POINTL, \
        lSrcDelta:  dword,      \
        pvSrcStart: ptr         >

        local culMiddle:    dword ;# of dwords in middle
        local cyToGo:       dword ;# of scans to copy after the current bank
        local ppfnUnroll:   ptr   ;points to appropriate unroll loop table
        local pvSrc:        ptr   ;source pointer

        mov     esi,prclDst             ;esi = prclDest
        mov     ebx,ppdev               ;ebx = ppdev
        mov     edi,[esi].yTop

        cmp     edi,[ebx].pdev_rcl1WindowClip.yTop
        jl      short src8_map_init_bank

        mov     edx,[ebx].pdev_rcl1WindowClip.yBottom
                                        ;edx = ppdev->rcl1WindowClip.bottom
        cmp     edi,edx
        jl      short src8_init_bank_mapped

src8_map_init_bank:
        ptrCall <dword ptr [ebx].pdev_pfnBankControl>, \
                <ebx,edi,JustifyTop>

        mov     edx,[ebx].pdev_rcl1WindowClip.yBottom

src8_init_bank_mapped:
        mov     eax,[esi].yBottom
        sub     eax,edx
        mov     cyToGo,eax              ;eax = # scans to do after this bank
        sbb     ecx,ecx
        and     ecx,eax
        add     edx,ecx                 ;edx = min(prclDst->bottom,
                                        ;          ppdev->rcl1WindowClip.bottom)
        sub     edx,edi                 ;edx = # of scans to do in this bank

; ebx = ppdev
; edx = # of scans to do in this bank
; esi = prclDst

        mov     eax,[esi].xLeft
        add     eax,3
        and     eax,not 3               ;eax = xLeft aligned to next dword

        mov     edi,pptlSrc             ;edi = pptlSrc
        mov     ecx,lSrcDelta
        imul    ecx,[edi].ptl_y
        add     ecx,[edi].ptl_x
        add     ecx,eax
        sub     ecx,[esi].xLeft
        add     ecx,pvSrcStart
        mov     pvSrc,ecx               ;pvSrc = pptlSrc->y * lSrcDelta +
                                        ;        pptlSrc->x + dest alignment +
                                        ;        pvSrcStart

        mov     edi,[ebx].pdev_lNextScan
        imul    edi,[esi].yTop
        add     edi,eax
        add     edi,[ebx].pdev_pvBitmapStart
                                        ;edi = prclDst->top * ppdev->lNextScan +
                                        ; aligned left + ppdev->pvBitmapStart
                                        ; (the aligned destination address)

; eax = prclDst->left aligned to dword
; ebx = ppdev
; edx = # of scans to do in this bank
; esi = prclDst
; edi = destination address

        mov     ecx,[esi].xRight        ;esi = prclDst->right
        sub     ecx,eax                 ;ecx = length in bytes from first full
                                        ;      dword to last byte
        jl      short src8_one_dword    ;special case if the destination
                                        ; starts and ends in the same dword

        mov     eax,ecx
        and     ecx,not 3               ;ecx = length of middle dwords in bytes
        sub     eax,ecx                 ;eax = (right & 3)

        mov     esi,[esi].xLeft
        and     esi,3                   ;esi = (left & 3)
        shl     eax,2
        or      esi,eax                 ;esi = ((right & 3) << 2) | (left & 3)
                                        ; (look-up index for unroll loops)

        mov     ebx,[ebx].pdev_lNextScan
        sub     ebx,ecx                 ;ebx = ppdev->lNextScan
                                        ; - (culMiddle << 2)
                                        ; (destination delta)

        mov     eax,lSrcDelta
        sub     eax,ecx                 ;eax = lSrcDelta - (culMiddle << 2)
                                        ; (source delta)

        shr     ecx,2
        mov     culMiddle,ecx           ;culMiddle = number of middle dwords

; eax = source delta
; ebx = destination delta
; ecx =
; edx = # scans to do
; esi = flags
; edi = destination pointer

; Set up for loop unrolling:

        mov     ecx,edx
        add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        and     ecx,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        shr     edx,LOOP_UNROLL_SHIFT           ;number of whole loops

        shl     esi,LOOP_UNROLL_SHIFT+2 ;every unroll table is
                                        ; (1 << LOOP_UNROLL_SHIFT) dwords long
        add     esi,offset gapfnMasterCopyTable
        mov     ppfnUnroll,esi          ;save unroll table pointer for next bank

        mov     ecx,[esi+ecx*4]
        mov     esi,pvSrc
        jmp     ecx

;-----------------------------------------------------------------------;
; Here we handle cases where copy starts and ends in same dword:

        public  src8_one_dword
src8_one_dword:
        sub     eax,[esi].xLeft         ;eax = # of bytes from left edge to
                                        ; first dword
        add     ecx,eax                 ;ecx = # of bytes to do

        sub     edi,eax                 ;adjust back to start byte
        sub     pvSrc,eax               ;adjust accordingly

        mov     ebx,[ebx].pdev_lNextScan;ebx = ppdev->lNextScan
                                        ; (destination delta)

        mov     eax,lSrcDelta           ;eax = lSrcDelta
                                        ; (source delta)

; eax = source delta
; ebx = destination delta
; esi =
; edx = # scans to do
; ecx = flags
; edi = destination pointer

; Set up for loop unrolling:

        mov     esi,edx
        add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        and     esi,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        shr     edx,LOOP_UNROLL_SHIFT           ;number of whole loops

        dec     ecx                     ;adjust for table (no zero entry)
        shl     ecx,LOOP_UNROLL_SHIFT+2 ;every unroll table is
                                        ; (1 << LOOP_UNROLL_SHIFT) dwords long
        add     ecx,offset gapfnOneDwordCopyTable
        mov     ppfnUnroll,ecx          ;save unroll table pointer for next bank

        mov     ecx,[ecx+esi*4]
        mov     esi,pvSrc
        jmp     ecx

;-----------------------------------------------------------------------;
; We have following variables set before calling unrolled loops:
;
;   eax = source delta (from end of dwords to start of dwords on next scan)
;   ebx = destination delta
;   edx = # of unrolled loops
;   esi = source pointer
;   edi = destination pointer
;   culMiddle = number of dwords to copy

;-----------------------------------------------------------------------;
; See if done.  If not, get next bank.

        align   4
        public  src8_done
src8_done:
        cmp     cyToGo,0
        jg      short src8_next_bank
        cRet    vSrcCopy8bpp

src8_next_bank:
        push    esi
        push    ebx                     ;save some registers
        mov     ebx,ppdev
        push    eax

        mov     esi,[ebx].pdev_rcl1WindowClip.yBottom
        sub     edi,[ebx].pdev_pvBitmapStart

        ptrCall <dword ptr [ebx].pdev_pfnBankControl>, \
                <ebx,esi,JustifyTop>

        add     edi,[ebx].pdev_pvBitmapStart
        mov     edx,[ebx].pdev_rcl1WindowClip.yBottom
        sub     edx,esi                 ;edx = # scans can do in this bank

        mov     eax,cyToGo
        sub     eax,edx
        mov     cyToGo,eax              ;eax = # scans to do after this bank
        sbb     ecx,ecx
        and     ecx,eax
        add     edx,ecx                 ;edx = min(# of scans can do in bank,
                                        ;          # of scans to go)

        mov     ecx,edx
        mov     esi,ppfnUnroll          ;unroll table
        add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        and     ecx,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        shr     edx,LOOP_UNROLL_SHIFT           ;# of whole loops

        mov     ecx,[esi+ecx*4]

        pop     eax                     ;restore those registers
        pop     ebx
        pop     esi

        jmp     ecx

;-----------------------------------------------------------------------;
; We organize the unroll tables as follows so that it's easy to index
; into them:
;
;   Bits 2 and 3 = # of trailing bytes
;   Bits 0 and 1 = # of leading bytes to skip in first dword

        align   4
gapfnMasterCopyTable label dword
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW00Entry,W_00,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW30Entry,W_30,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW20Entry,W_20,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW10Entry,W_10,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW01Entry,W_01,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW31Entry,W_31,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW21Entry,W_21,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW11Entry,W_11,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW02Entry,W_02,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW32Entry,W_32,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW22Entry,W_22,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW12Entry,W_12,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW03Entry,W_03,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW33Entry,W_33,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW23Entry,W_23,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW13Entry,W_13,LOOP_UNROLL_COUNT

        align   4
gapfnOneDwordCopyTable label dword
        UNROLL_LOOP_ENTRY_TABLE pfnCopyThin1Entry,T_1,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyThin2Entry,T_2,LOOP_UNROLL_COUNT
        UNROLL_LOOP_ENTRY_TABLE pfnCopyThin3Entry,T_3,LOOP_UNROLL_COUNT

;-----------------------------------------------------------------------;
; Copy n dwords, 0 leading bytes, 0 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_00 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     ecx,culMiddle
        rep     movsd
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_00_loop:
        UNROLL_LOOP     COPY_WIDE_W_00,W_00,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_00_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 0 leading bytes, 1 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_01 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     ecx,culMiddle
        rep     movsd
        mov     cl,[esi]
        mov     [edi],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_01_loop:
        UNROLL_LOOP     COPY_WIDE_W_01,W_01,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_01_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 0 leading bytes, 2 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_02 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_02_loop:
        UNROLL_LOOP     COPY_WIDE_W_02,W_02,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_02_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 0 leading bytes, 3 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_03 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        mov     cl,[esi+2]
        mov     [edi+2],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_03_loop:
        UNROLL_LOOP     COPY_WIDE_W_03,W_03,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_03_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 1 leading byte, 0 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_10 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-1]
        mov     [edi-1],cl
        mov     ecx,culMiddle
        rep     movsd
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_10_loop:
        UNROLL_LOOP     COPY_WIDE_W_10,W_10,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_10_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 1 leading byte, 1 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_11 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-1]
        mov     [edi-1],cl
        mov     ecx,culMiddle
        rep     movsd
        mov     cl,[esi]
        mov     [edi],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_11_loop:
        UNROLL_LOOP     COPY_WIDE_W_11,W_11,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_11_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 1 leading byte, 2 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_12 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-1]
        mov     [edi-1],cl
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_12_loop:
        UNROLL_LOOP     COPY_WIDE_W_12,W_12,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_12_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 1 leading byte, 3 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_13 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-1]
        mov     [edi-1],cl
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        mov     cl,[esi+2]
        mov     [edi+2],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_13_loop:
        UNROLL_LOOP     COPY_WIDE_W_13,W_13,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_13_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 2 leading bytes, 0 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_20 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_20_loop:
        UNROLL_LOOP     COPY_WIDE_W_20,W_20,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_20_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 2 leading bytes, 1 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_21 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cl,[esi]
        mov     [edi],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_21_loop:
        UNROLL_LOOP     COPY_WIDE_W_21,W_21,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_21_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 2 leading bytes, 2 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_22 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_22_loop:
        UNROLL_LOOP     COPY_WIDE_W_22,W_22,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_22_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 2 leading bytes, 3 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_23 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        mov     cl,[esi+2]
        mov     [edi+2],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_23_loop:
        UNROLL_LOOP     COPY_WIDE_W_23,W_23,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_23_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 3 leading bytes, 0 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_30 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-3]
        mov     [edi-3],cl
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_30_loop:
        UNROLL_LOOP     COPY_WIDE_W_30,W_30,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_30_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 3 leading bytes, 1 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_31 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-3]
        mov     [edi-3],cl
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cl,[esi]
        mov     [edi],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_31_loop:
        UNROLL_LOOP     COPY_WIDE_W_31,W_31,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_31_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 3 leading bytes, 2 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_32 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-3]
        mov     [edi-3],cl
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_32_loop:
        UNROLL_LOOP     COPY_WIDE_W_32,W_32,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_32_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy n dwords, 3 leading bytes, 3 trailing bytes, then advance to next
; scan line.

COPY_WIDE_W_33 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi-3]
        mov     [edi-3],cl
        mov     cx,[esi-2]
        mov     [edi-2],cx
        mov     ecx,culMiddle
        rep     movsd
        mov     cx,[esi]
        mov     [edi],cx
        mov     cl,[esi+2]
        mov     [edi+2],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_wide_w_33_loop:
        UNROLL_LOOP     COPY_WIDE_W_33,W_33,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_wide_w_33_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy 1 byte, then advance to next scan line.

COPY_THIN_T_1 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cl,[esi]
        mov     [edi],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_thin_t_1_loop:
        UNROLL_LOOP     COPY_THIN_T_1,T_1,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_thin_t_1_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy 2 bytes, then advance to next scan line.

COPY_THIN_T_2 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi]
        mov     [edi],cx
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_thin_t_2_loop:
        UNROLL_LOOP     COPY_THIN_T_2,T_2,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_thin_t_2_loop
        jmp     src8_done

;-----------------------------------------------------------------------;
; Copy 3 bytes, then advance to next scan line.

COPY_THIN_T_3 macro ENTRY_LABEL,ENTRY_INDEX
&ENTRY_LABEL&ENTRY_INDEX&:
        mov     cx,[esi]
        mov     [edi],cx
        mov     cl,[esi+2]
        mov     [edi+2],cl
        add     esi,eax
        add     edi,ebx
        endm    ;--------------------------------;

        align   4
copy_thin_t_3_loop:
        UNROLL_LOOP     COPY_THIN_T_3,T_3,LOOP_UNROLL_COUNT
        dec     edx
        jnz     copy_thin_t_3_loop
        jmp     src8_done

public copy_wide_w_00_loop
public copy_wide_w_01_loop
public copy_wide_w_02_loop
public copy_wide_w_03_loop
public copy_wide_w_10_loop
public copy_wide_w_11_loop
public copy_wide_w_12_loop
public copy_wide_w_13_loop
public copy_wide_w_20_loop
public copy_wide_w_21_loop
public copy_wide_w_22_loop
public copy_wide_w_23_loop
public copy_wide_w_30_loop
public copy_wide_w_31_loop
public copy_wide_w_32_loop
public copy_wide_w_33_loop
public copy_thin_t_1_loop
public copy_thin_t_2_loop
public copy_thin_t_3_loop

endProc vSrcCopy8bpp

        end


unix.superglobalmegacorp.com

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