Annotation of ntddk/src/video/displays/vga256/i386/srccopy.asm, revision 1.1

1.1     ! root        1: ;---------------------------Module-Header------------------------------;
        !             2: ; Module Name: srccopy.asm
        !             3: ;
        !             4: ; Copyright (c) 1993 Microsoft Corporation
        !             5: ;-----------------------------------------------------------------------;
        !             6: 
        !             7: ;-----------------------------------------------------------------------;
        !             8: ; VOID vSrcCopy8bpp(ppdev, psoSrc, prclDst, pptlSrc, lSrcDelta, pvSrcStart);
        !             9: ;
        !            10: ; Input:
        !            11: ;
        !            12: ;  ppdev      - screen pdev
        !            13: ;  psoSrc     - source surface
        !            14: ;  prcldest   - pointer to destination rectangle
        !            15: ;  pptlsrc    - pointer to source upper left corner
        !            16: ;  lSrcDelta  - offset from start of one scan to next in source
        !            17: ;  pvSrcStart - pointer to start of bitmap
        !            18: ;
        !            19: ; Performs 8bpp SRCCOPY memory-to-screen blts.
        !            20: ;
        !            21: ;-----------------------------------------------------------------------;
        !            22: ; NOTE: Assumes all rectangles have positive heights and widths. Will
        !            23: ; not work properly if this is not the case.
        !            24: ;-----------------------------------------------------------------------;
        !            25: 
        !            26: ;-----------------------------------------------------------------------;
        !            27: ; Set LOOP_UNROLL_SHIFT to the log2 of the number of times you want loops in
        !            28: ; this module unrolled. For example, LOOP_UNROLL_SHIFT of 3 yields 2**3 = 8
        !            29: ; times unrolling. This is the only thing you need to change to control
        !            30: ; unrolling.
        !            31: 
        !            32: LOOP_UNROLL_SHIFT equ 2
        !            33: 
        !            34: ;-----------------------------------------------------------------------;
        !            35: 
        !            36:         .386
        !            37: 
        !            38:         .model  small,c
        !            39: 
        !            40:         assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
        !            41:         assume fs:nothing,gs:nothing
        !            42: 
        !            43:         .xlist
        !            44:         include stdcall.inc             ;calling convention cmacros
        !            45:         include i386\strucs.inc
        !            46:         include i386\driver.inc
        !            47:         include i386\unroll.inc
        !            48:         include i386\egavga.inc
        !            49: 
        !            50:         .list
        !            51: 
        !            52: ;-----------------------------------------------------------------------;
        !            53: 
        !            54:         .data
        !            55: 
        !            56: ;-----------------------------------------------------------------------;
        !            57: 
        !            58:         .code
        !            59: 
        !            60: ;-----------------------------------------------------------------------;
        !            61: 
        !            62: cProc   vSrcCopy8bpp,20,<       \
        !            63:         uses esi edi ebx,       \
        !            64:         ppdev:      ptr PDEV,   \
        !            65:         prclDst:    ptr RECTL,  \
        !            66:         pptlSrc:    ptr POINTL, \
        !            67:         lSrcDelta:  dword,      \
        !            68:         pvSrcStart: ptr         >
        !            69: 
        !            70:         local culMiddle:    dword ;# of dwords in middle
        !            71:         local cyToGo:       dword ;# of scans to copy after the current bank
        !            72:         local ppfnUnroll:   ptr   ;points to appropriate unroll loop table
        !            73:         local pvSrc:        ptr   ;source pointer
        !            74: 
        !            75:         mov     esi,prclDst             ;esi = prclDest
        !            76:         mov     ebx,ppdev               ;ebx = ppdev
        !            77:         mov     edi,[esi].yTop
        !            78: 
        !            79:         cmp     edi,[ebx].pdev_rcl1WindowClip.yTop
        !            80:         jl      short src8_map_init_bank
        !            81: 
        !            82:         mov     edx,[ebx].pdev_rcl1WindowClip.yBottom
        !            83:                                         ;edx = ppdev->rcl1WindowClip.bottom
        !            84:         cmp     edi,edx
        !            85:         jl      short src8_init_bank_mapped
        !            86: 
        !            87: src8_map_init_bank:
        !            88:         ptrCall <dword ptr [ebx].pdev_pfnBankControl>, \
        !            89:                 <ebx,edi,JustifyTop>
        !            90: 
        !            91:         mov     edx,[ebx].pdev_rcl1WindowClip.yBottom
        !            92: 
        !            93: src8_init_bank_mapped:
        !            94:         mov     eax,[esi].yBottom
        !            95:         sub     eax,edx
        !            96:         mov     cyToGo,eax              ;eax = # scans to do after this bank
        !            97:         sbb     ecx,ecx
        !            98:         and     ecx,eax
        !            99:         add     edx,ecx                 ;edx = min(prclDst->bottom,
        !           100:                                         ;          ppdev->rcl1WindowClip.bottom)
        !           101:         sub     edx,edi                 ;edx = # of scans to do in this bank
        !           102: 
        !           103: ; ebx = ppdev
        !           104: ; edx = # of scans to do in this bank
        !           105: ; esi = prclDst
        !           106: 
        !           107:         mov     eax,[esi].xLeft
        !           108:         add     eax,3
        !           109:         and     eax,not 3               ;eax = xLeft aligned to next dword
        !           110: 
        !           111:         mov     edi,pptlSrc             ;edi = pptlSrc
        !           112:         mov     ecx,lSrcDelta
        !           113:         imul    ecx,[edi].ptl_y
        !           114:         add     ecx,[edi].ptl_x
        !           115:         add     ecx,eax
        !           116:         sub     ecx,[esi].xLeft
        !           117:         add     ecx,pvSrcStart
        !           118:         mov     pvSrc,ecx               ;pvSrc = pptlSrc->y * lSrcDelta +
        !           119:                                         ;        pptlSrc->x + dest alignment +
        !           120:                                         ;        pvSrcStart
        !           121: 
        !           122:         mov     edi,[ebx].pdev_lNextScan
        !           123:         imul    edi,[esi].yTop
        !           124:         add     edi,eax
        !           125:         add     edi,[ebx].pdev_pvBitmapStart
        !           126:                                         ;edi = prclDst->top * ppdev->lNextScan +
        !           127:                                         ; aligned left + ppdev->pvBitmapStart
        !           128:                                         ; (the aligned destination address)
        !           129: 
        !           130: ; eax = prclDst->left aligned to dword
        !           131: ; ebx = ppdev
        !           132: ; edx = # of scans to do in this bank
        !           133: ; esi = prclDst
        !           134: ; edi = destination address
        !           135: 
        !           136:         mov     ecx,[esi].xRight        ;esi = prclDst->right
        !           137:         sub     ecx,eax                 ;ecx = length in bytes from first full
        !           138:                                         ;      dword to last byte
        !           139:         jl      short src8_one_dword    ;special case if the destination
        !           140:                                         ; starts and ends in the same dword
        !           141: 
        !           142:         mov     eax,ecx
        !           143:         and     ecx,not 3               ;ecx = length of middle dwords in bytes
        !           144:         sub     eax,ecx                 ;eax = (right & 3)
        !           145: 
        !           146:         mov     esi,[esi].xLeft
        !           147:         and     esi,3                   ;esi = (left & 3)
        !           148:         shl     eax,2
        !           149:         or      esi,eax                 ;esi = ((right & 3) << 2) | (left & 3)
        !           150:                                         ; (look-up index for unroll loops)
        !           151: 
        !           152:         mov     ebx,[ebx].pdev_lNextScan
        !           153:         sub     ebx,ecx                 ;ebx = ppdev->lNextScan
        !           154:                                         ; - (culMiddle << 2)
        !           155:                                         ; (destination delta)
        !           156: 
        !           157:         mov     eax,lSrcDelta
        !           158:         sub     eax,ecx                 ;eax = lSrcDelta - (culMiddle << 2)
        !           159:                                         ; (source delta)
        !           160: 
        !           161:         shr     ecx,2
        !           162:         mov     culMiddle,ecx           ;culMiddle = number of middle dwords
        !           163: 
        !           164: ; eax = source delta
        !           165: ; ebx = destination delta
        !           166: ; ecx =
        !           167: ; edx = # scans to do
        !           168: ; esi = flags
        !           169: ; edi = destination pointer
        !           170: 
        !           171: ; Set up for loop unrolling:
        !           172: 
        !           173:         mov     ecx,edx
        !           174:         add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        !           175:         and     ecx,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        !           176:         shr     edx,LOOP_UNROLL_SHIFT           ;number of whole loops
        !           177: 
        !           178:         shl     esi,LOOP_UNROLL_SHIFT+2 ;every unroll table is
        !           179:                                         ; (1 << LOOP_UNROLL_SHIFT) dwords long
        !           180:         add     esi,offset gapfnMasterCopyTable
        !           181:         mov     ppfnUnroll,esi          ;save unroll table pointer for next bank
        !           182: 
        !           183:         mov     ecx,[esi+ecx*4]
        !           184:         mov     esi,pvSrc
        !           185:         jmp     ecx
        !           186: 
        !           187: ;-----------------------------------------------------------------------;
        !           188: ; Here we handle cases where copy starts and ends in same dword:
        !           189: 
        !           190:         public  src8_one_dword
        !           191: src8_one_dword:
        !           192:         sub     eax,[esi].xLeft         ;eax = # of bytes from left edge to
        !           193:                                         ; first dword
        !           194:         add     ecx,eax                 ;ecx = # of bytes to do
        !           195: 
        !           196:         sub     edi,eax                 ;adjust back to start byte
        !           197:         sub     pvSrc,eax               ;adjust accordingly
        !           198: 
        !           199:         mov     ebx,[ebx].pdev_lNextScan;ebx = ppdev->lNextScan
        !           200:                                         ; (destination delta)
        !           201: 
        !           202:         mov     eax,lSrcDelta           ;eax = lSrcDelta
        !           203:                                         ; (source delta)
        !           204: 
        !           205: ; eax = source delta
        !           206: ; ebx = destination delta
        !           207: ; esi =
        !           208: ; edx = # scans to do
        !           209: ; ecx = flags
        !           210: ; edi = destination pointer
        !           211: 
        !           212: ; Set up for loop unrolling:
        !           213: 
        !           214:         mov     esi,edx
        !           215:         add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        !           216:         and     esi,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        !           217:         shr     edx,LOOP_UNROLL_SHIFT           ;number of whole loops
        !           218: 
        !           219:         dec     ecx                     ;adjust for table (no zero entry)
        !           220:         shl     ecx,LOOP_UNROLL_SHIFT+2 ;every unroll table is
        !           221:                                         ; (1 << LOOP_UNROLL_SHIFT) dwords long
        !           222:         add     ecx,offset gapfnOneDwordCopyTable
        !           223:         mov     ppfnUnroll,ecx          ;save unroll table pointer for next bank
        !           224: 
        !           225:         mov     ecx,[ecx+esi*4]
        !           226:         mov     esi,pvSrc
        !           227:         jmp     ecx
        !           228: 
        !           229: ;-----------------------------------------------------------------------;
        !           230: ; We have following variables set before calling unrolled loops:
        !           231: ;
        !           232: ;   eax = source delta (from end of dwords to start of dwords on next scan)
        !           233: ;   ebx = destination delta
        !           234: ;   edx = # of unrolled loops
        !           235: ;   esi = source pointer
        !           236: ;   edi = destination pointer
        !           237: ;   culMiddle = number of dwords to copy
        !           238: 
        !           239: ;-----------------------------------------------------------------------;
        !           240: ; See if done.  If not, get next bank.
        !           241: 
        !           242:         align   4
        !           243:         public  src8_done
        !           244: src8_done:
        !           245:         cmp     cyToGo,0
        !           246:         jg      short src8_next_bank
        !           247:         cRet    vSrcCopy8bpp
        !           248: 
        !           249: src8_next_bank:
        !           250:         push    esi
        !           251:         push    ebx                     ;save some registers
        !           252:         mov     ebx,ppdev
        !           253:         push    eax
        !           254: 
        !           255:         mov     esi,[ebx].pdev_rcl1WindowClip.yBottom
        !           256:         sub     edi,[ebx].pdev_pvBitmapStart
        !           257: 
        !           258:         ptrCall <dword ptr [ebx].pdev_pfnBankControl>, \
        !           259:                 <ebx,esi,JustifyTop>
        !           260: 
        !           261:         add     edi,[ebx].pdev_pvBitmapStart
        !           262:         mov     edx,[ebx].pdev_rcl1WindowClip.yBottom
        !           263:         sub     edx,esi                 ;edx = # scans can do in this bank
        !           264: 
        !           265:         mov     eax,cyToGo
        !           266:         sub     eax,edx
        !           267:         mov     cyToGo,eax              ;eax = # scans to do after this bank
        !           268:         sbb     ecx,ecx
        !           269:         and     ecx,eax
        !           270:         add     edx,ecx                 ;edx = min(# of scans can do in bank,
        !           271:                                         ;          # of scans to go)
        !           272: 
        !           273:         mov     ecx,edx
        !           274:         mov     esi,ppfnUnroll          ;unroll table
        !           275:         add     edx,(1 shl LOOP_UNROLL_SHIFT)-1 ;round count up
        !           276:         and     ecx,(1 shl LOOP_UNROLL_SHIFT)-1 ;fractional part of loop
        !           277:         shr     edx,LOOP_UNROLL_SHIFT           ;# of whole loops
        !           278: 
        !           279:         mov     ecx,[esi+ecx*4]
        !           280: 
        !           281:         pop     eax                     ;restore those registers
        !           282:         pop     ebx
        !           283:         pop     esi
        !           284: 
        !           285:         jmp     ecx
        !           286: 
        !           287: ;-----------------------------------------------------------------------;
        !           288: ; We organize the unroll tables as follows so that it's easy to index
        !           289: ; into them:
        !           290: ;
        !           291: ;   Bits 2 and 3 = # of trailing bytes
        !           292: ;   Bits 0 and 1 = # of leading bytes to skip in first dword
        !           293: 
        !           294:         align   4
        !           295: gapfnMasterCopyTable label dword
        !           296:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW00Entry,W_00,LOOP_UNROLL_COUNT
        !           297:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW30Entry,W_30,LOOP_UNROLL_COUNT
        !           298:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW20Entry,W_20,LOOP_UNROLL_COUNT
        !           299:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW10Entry,W_10,LOOP_UNROLL_COUNT
        !           300:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW01Entry,W_01,LOOP_UNROLL_COUNT
        !           301:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW31Entry,W_31,LOOP_UNROLL_COUNT
        !           302:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW21Entry,W_21,LOOP_UNROLL_COUNT
        !           303:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW11Entry,W_11,LOOP_UNROLL_COUNT
        !           304:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW02Entry,W_02,LOOP_UNROLL_COUNT
        !           305:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW32Entry,W_32,LOOP_UNROLL_COUNT
        !           306:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW22Entry,W_22,LOOP_UNROLL_COUNT
        !           307:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW12Entry,W_12,LOOP_UNROLL_COUNT
        !           308:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW03Entry,W_03,LOOP_UNROLL_COUNT
        !           309:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW33Entry,W_33,LOOP_UNROLL_COUNT
        !           310:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW23Entry,W_23,LOOP_UNROLL_COUNT
        !           311:         UNROLL_LOOP_ENTRY_TABLE pfnCopyWideW13Entry,W_13,LOOP_UNROLL_COUNT
        !           312: 
        !           313:         align   4
        !           314: gapfnOneDwordCopyTable label dword
        !           315:         UNROLL_LOOP_ENTRY_TABLE pfnCopyThin1Entry,T_1,LOOP_UNROLL_COUNT
        !           316:         UNROLL_LOOP_ENTRY_TABLE pfnCopyThin2Entry,T_2,LOOP_UNROLL_COUNT
        !           317:         UNROLL_LOOP_ENTRY_TABLE pfnCopyThin3Entry,T_3,LOOP_UNROLL_COUNT
        !           318: 
        !           319: ;-----------------------------------------------------------------------;
        !           320: ; Copy n dwords, 0 leading bytes, 0 trailing bytes, then advance to next
        !           321: ; scan line.
        !           322: 
        !           323: COPY_WIDE_W_00 macro ENTRY_LABEL,ENTRY_INDEX
        !           324: &ENTRY_LABEL&ENTRY_INDEX&:
        !           325:         mov     ecx,culMiddle
        !           326:         rep     movsd
        !           327:         add     esi,eax
        !           328:         add     edi,ebx
        !           329:         endm    ;--------------------------------;
        !           330: 
        !           331:         align   4
        !           332: copy_wide_w_00_loop:
        !           333:         UNROLL_LOOP     COPY_WIDE_W_00,W_00,LOOP_UNROLL_COUNT
        !           334:         dec     edx
        !           335:         jnz     copy_wide_w_00_loop
        !           336:         jmp     src8_done
        !           337: 
        !           338: ;-----------------------------------------------------------------------;
        !           339: ; Copy n dwords, 0 leading bytes, 1 trailing bytes, then advance to next
        !           340: ; scan line.
        !           341: 
        !           342: COPY_WIDE_W_01 macro ENTRY_LABEL,ENTRY_INDEX
        !           343: &ENTRY_LABEL&ENTRY_INDEX&:
        !           344:         mov     ecx,culMiddle
        !           345:         rep     movsd
        !           346:         mov     cl,[esi]
        !           347:         mov     [edi],cl
        !           348:         add     esi,eax
        !           349:         add     edi,ebx
        !           350:         endm    ;--------------------------------;
        !           351: 
        !           352:         align   4
        !           353: copy_wide_w_01_loop:
        !           354:         UNROLL_LOOP     COPY_WIDE_W_01,W_01,LOOP_UNROLL_COUNT
        !           355:         dec     edx
        !           356:         jnz     copy_wide_w_01_loop
        !           357:         jmp     src8_done
        !           358: 
        !           359: ;-----------------------------------------------------------------------;
        !           360: ; Copy n dwords, 0 leading bytes, 2 trailing bytes, then advance to next
        !           361: ; scan line.
        !           362: 
        !           363: COPY_WIDE_W_02 macro ENTRY_LABEL,ENTRY_INDEX
        !           364: &ENTRY_LABEL&ENTRY_INDEX&:
        !           365:         mov     ecx,culMiddle
        !           366:         rep     movsd
        !           367:         mov     cx,[esi]
        !           368:         mov     [edi],cx
        !           369:         add     esi,eax
        !           370:         add     edi,ebx
        !           371:         endm    ;--------------------------------;
        !           372: 
        !           373:         align   4
        !           374: copy_wide_w_02_loop:
        !           375:         UNROLL_LOOP     COPY_WIDE_W_02,W_02,LOOP_UNROLL_COUNT
        !           376:         dec     edx
        !           377:         jnz     copy_wide_w_02_loop
        !           378:         jmp     src8_done
        !           379: 
        !           380: ;-----------------------------------------------------------------------;
        !           381: ; Copy n dwords, 0 leading bytes, 3 trailing bytes, then advance to next
        !           382: ; scan line.
        !           383: 
        !           384: COPY_WIDE_W_03 macro ENTRY_LABEL,ENTRY_INDEX
        !           385: &ENTRY_LABEL&ENTRY_INDEX&:
        !           386:         mov     ecx,culMiddle
        !           387:         rep     movsd
        !           388:         mov     cx,[esi]
        !           389:         mov     [edi],cx
        !           390:         mov     cl,[esi+2]
        !           391:         mov     [edi+2],cl
        !           392:         add     esi,eax
        !           393:         add     edi,ebx
        !           394:         endm    ;--------------------------------;
        !           395: 
        !           396:         align   4
        !           397: copy_wide_w_03_loop:
        !           398:         UNROLL_LOOP     COPY_WIDE_W_03,W_03,LOOP_UNROLL_COUNT
        !           399:         dec     edx
        !           400:         jnz     copy_wide_w_03_loop
        !           401:         jmp     src8_done
        !           402: 
        !           403: ;-----------------------------------------------------------------------;
        !           404: ; Copy n dwords, 1 leading byte, 0 trailing bytes, then advance to next
        !           405: ; scan line.
        !           406: 
        !           407: COPY_WIDE_W_10 macro ENTRY_LABEL,ENTRY_INDEX
        !           408: &ENTRY_LABEL&ENTRY_INDEX&:
        !           409:         mov     cl,[esi-1]
        !           410:         mov     [edi-1],cl
        !           411:         mov     ecx,culMiddle
        !           412:         rep     movsd
        !           413:         add     esi,eax
        !           414:         add     edi,ebx
        !           415:         endm    ;--------------------------------;
        !           416: 
        !           417:         align   4
        !           418: copy_wide_w_10_loop:
        !           419:         UNROLL_LOOP     COPY_WIDE_W_10,W_10,LOOP_UNROLL_COUNT
        !           420:         dec     edx
        !           421:         jnz     copy_wide_w_10_loop
        !           422:         jmp     src8_done
        !           423: 
        !           424: ;-----------------------------------------------------------------------;
        !           425: ; Copy n dwords, 1 leading byte, 1 trailing bytes, then advance to next
        !           426: ; scan line.
        !           427: 
        !           428: COPY_WIDE_W_11 macro ENTRY_LABEL,ENTRY_INDEX
        !           429: &ENTRY_LABEL&ENTRY_INDEX&:
        !           430:         mov     cl,[esi-1]
        !           431:         mov     [edi-1],cl
        !           432:         mov     ecx,culMiddle
        !           433:         rep     movsd
        !           434:         mov     cl,[esi]
        !           435:         mov     [edi],cl
        !           436:         add     esi,eax
        !           437:         add     edi,ebx
        !           438:         endm    ;--------------------------------;
        !           439: 
        !           440:         align   4
        !           441: copy_wide_w_11_loop:
        !           442:         UNROLL_LOOP     COPY_WIDE_W_11,W_11,LOOP_UNROLL_COUNT
        !           443:         dec     edx
        !           444:         jnz     copy_wide_w_11_loop
        !           445:         jmp     src8_done
        !           446: 
        !           447: ;-----------------------------------------------------------------------;
        !           448: ; Copy n dwords, 1 leading byte, 2 trailing bytes, then advance to next
        !           449: ; scan line.
        !           450: 
        !           451: COPY_WIDE_W_12 macro ENTRY_LABEL,ENTRY_INDEX
        !           452: &ENTRY_LABEL&ENTRY_INDEX&:
        !           453:         mov     cl,[esi-1]
        !           454:         mov     [edi-1],cl
        !           455:         mov     ecx,culMiddle
        !           456:         rep     movsd
        !           457:         mov     cx,[esi]
        !           458:         mov     [edi],cx
        !           459:         add     esi,eax
        !           460:         add     edi,ebx
        !           461:         endm    ;--------------------------------;
        !           462: 
        !           463:         align   4
        !           464: copy_wide_w_12_loop:
        !           465:         UNROLL_LOOP     COPY_WIDE_W_12,W_12,LOOP_UNROLL_COUNT
        !           466:         dec     edx
        !           467:         jnz     copy_wide_w_12_loop
        !           468:         jmp     src8_done
        !           469: 
        !           470: ;-----------------------------------------------------------------------;
        !           471: ; Copy n dwords, 1 leading byte, 3 trailing bytes, then advance to next
        !           472: ; scan line.
        !           473: 
        !           474: COPY_WIDE_W_13 macro ENTRY_LABEL,ENTRY_INDEX
        !           475: &ENTRY_LABEL&ENTRY_INDEX&:
        !           476:         mov     cl,[esi-1]
        !           477:         mov     [edi-1],cl
        !           478:         mov     ecx,culMiddle
        !           479:         rep     movsd
        !           480:         mov     cx,[esi]
        !           481:         mov     [edi],cx
        !           482:         mov     cl,[esi+2]
        !           483:         mov     [edi+2],cl
        !           484:         add     esi,eax
        !           485:         add     edi,ebx
        !           486:         endm    ;--------------------------------;
        !           487: 
        !           488:         align   4
        !           489: copy_wide_w_13_loop:
        !           490:         UNROLL_LOOP     COPY_WIDE_W_13,W_13,LOOP_UNROLL_COUNT
        !           491:         dec     edx
        !           492:         jnz     copy_wide_w_13_loop
        !           493:         jmp     src8_done
        !           494: 
        !           495: ;-----------------------------------------------------------------------;
        !           496: ; Copy n dwords, 2 leading bytes, 0 trailing bytes, then advance to next
        !           497: ; scan line.
        !           498: 
        !           499: COPY_WIDE_W_20 macro ENTRY_LABEL,ENTRY_INDEX
        !           500: &ENTRY_LABEL&ENTRY_INDEX&:
        !           501:         mov     cx,[esi-2]
        !           502:         mov     [edi-2],cx
        !           503:         mov     ecx,culMiddle
        !           504:         rep     movsd
        !           505:         add     esi,eax
        !           506:         add     edi,ebx
        !           507:         endm    ;--------------------------------;
        !           508: 
        !           509:         align   4
        !           510: copy_wide_w_20_loop:
        !           511:         UNROLL_LOOP     COPY_WIDE_W_20,W_20,LOOP_UNROLL_COUNT
        !           512:         dec     edx
        !           513:         jnz     copy_wide_w_20_loop
        !           514:         jmp     src8_done
        !           515: 
        !           516: ;-----------------------------------------------------------------------;
        !           517: ; Copy n dwords, 2 leading bytes, 1 trailing bytes, then advance to next
        !           518: ; scan line.
        !           519: 
        !           520: COPY_WIDE_W_21 macro ENTRY_LABEL,ENTRY_INDEX
        !           521: &ENTRY_LABEL&ENTRY_INDEX&:
        !           522:         mov     cx,[esi-2]
        !           523:         mov     [edi-2],cx
        !           524:         mov     ecx,culMiddle
        !           525:         rep     movsd
        !           526:         mov     cl,[esi]
        !           527:         mov     [edi],cl
        !           528:         add     esi,eax
        !           529:         add     edi,ebx
        !           530:         endm    ;--------------------------------;
        !           531: 
        !           532:         align   4
        !           533: copy_wide_w_21_loop:
        !           534:         UNROLL_LOOP     COPY_WIDE_W_21,W_21,LOOP_UNROLL_COUNT
        !           535:         dec     edx
        !           536:         jnz     copy_wide_w_21_loop
        !           537:         jmp     src8_done
        !           538: 
        !           539: ;-----------------------------------------------------------------------;
        !           540: ; Copy n dwords, 2 leading bytes, 2 trailing bytes, then advance to next
        !           541: ; scan line.
        !           542: 
        !           543: COPY_WIDE_W_22 macro ENTRY_LABEL,ENTRY_INDEX
        !           544: &ENTRY_LABEL&ENTRY_INDEX&:
        !           545:         mov     cx,[esi-2]
        !           546:         mov     [edi-2],cx
        !           547:         mov     ecx,culMiddle
        !           548:         rep     movsd
        !           549:         mov     cx,[esi]
        !           550:         mov     [edi],cx
        !           551:         add     esi,eax
        !           552:         add     edi,ebx
        !           553:         endm    ;--------------------------------;
        !           554: 
        !           555:         align   4
        !           556: copy_wide_w_22_loop:
        !           557:         UNROLL_LOOP     COPY_WIDE_W_22,W_22,LOOP_UNROLL_COUNT
        !           558:         dec     edx
        !           559:         jnz     copy_wide_w_22_loop
        !           560:         jmp     src8_done
        !           561: 
        !           562: ;-----------------------------------------------------------------------;
        !           563: ; Copy n dwords, 2 leading bytes, 3 trailing bytes, then advance to next
        !           564: ; scan line.
        !           565: 
        !           566: COPY_WIDE_W_23 macro ENTRY_LABEL,ENTRY_INDEX
        !           567: &ENTRY_LABEL&ENTRY_INDEX&:
        !           568:         mov     cx,[esi-2]
        !           569:         mov     [edi-2],cx
        !           570:         mov     ecx,culMiddle
        !           571:         rep     movsd
        !           572:         mov     cx,[esi]
        !           573:         mov     [edi],cx
        !           574:         mov     cl,[esi+2]
        !           575:         mov     [edi+2],cl
        !           576:         add     esi,eax
        !           577:         add     edi,ebx
        !           578:         endm    ;--------------------------------;
        !           579: 
        !           580:         align   4
        !           581: copy_wide_w_23_loop:
        !           582:         UNROLL_LOOP     COPY_WIDE_W_23,W_23,LOOP_UNROLL_COUNT
        !           583:         dec     edx
        !           584:         jnz     copy_wide_w_23_loop
        !           585:         jmp     src8_done
        !           586: 
        !           587: ;-----------------------------------------------------------------------;
        !           588: ; Copy n dwords, 3 leading bytes, 0 trailing bytes, then advance to next
        !           589: ; scan line.
        !           590: 
        !           591: COPY_WIDE_W_30 macro ENTRY_LABEL,ENTRY_INDEX
        !           592: &ENTRY_LABEL&ENTRY_INDEX&:
        !           593:         mov     cl,[esi-3]
        !           594:         mov     [edi-3],cl
        !           595:         mov     cx,[esi-2]
        !           596:         mov     [edi-2],cx
        !           597:         mov     ecx,culMiddle
        !           598:         rep     movsd
        !           599:         add     esi,eax
        !           600:         add     edi,ebx
        !           601:         endm    ;--------------------------------;
        !           602: 
        !           603:         align   4
        !           604: copy_wide_w_30_loop:
        !           605:         UNROLL_LOOP     COPY_WIDE_W_30,W_30,LOOP_UNROLL_COUNT
        !           606:         dec     edx
        !           607:         jnz     copy_wide_w_30_loop
        !           608:         jmp     src8_done
        !           609: 
        !           610: ;-----------------------------------------------------------------------;
        !           611: ; Copy n dwords, 3 leading bytes, 1 trailing bytes, then advance to next
        !           612: ; scan line.
        !           613: 
        !           614: COPY_WIDE_W_31 macro ENTRY_LABEL,ENTRY_INDEX
        !           615: &ENTRY_LABEL&ENTRY_INDEX&:
        !           616:         mov     cl,[esi-3]
        !           617:         mov     [edi-3],cl
        !           618:         mov     cx,[esi-2]
        !           619:         mov     [edi-2],cx
        !           620:         mov     ecx,culMiddle
        !           621:         rep     movsd
        !           622:         mov     cl,[esi]
        !           623:         mov     [edi],cl
        !           624:         add     esi,eax
        !           625:         add     edi,ebx
        !           626:         endm    ;--------------------------------;
        !           627: 
        !           628:         align   4
        !           629: copy_wide_w_31_loop:
        !           630:         UNROLL_LOOP     COPY_WIDE_W_31,W_31,LOOP_UNROLL_COUNT
        !           631:         dec     edx
        !           632:         jnz     copy_wide_w_31_loop
        !           633:         jmp     src8_done
        !           634: 
        !           635: ;-----------------------------------------------------------------------;
        !           636: ; Copy n dwords, 3 leading bytes, 2 trailing bytes, then advance to next
        !           637: ; scan line.
        !           638: 
        !           639: COPY_WIDE_W_32 macro ENTRY_LABEL,ENTRY_INDEX
        !           640: &ENTRY_LABEL&ENTRY_INDEX&:
        !           641:         mov     cl,[esi-3]
        !           642:         mov     [edi-3],cl
        !           643:         mov     cx,[esi-2]
        !           644:         mov     [edi-2],cx
        !           645:         mov     ecx,culMiddle
        !           646:         rep     movsd
        !           647:         mov     cx,[esi]
        !           648:         mov     [edi],cx
        !           649:         add     esi,eax
        !           650:         add     edi,ebx
        !           651:         endm    ;--------------------------------;
        !           652: 
        !           653:         align   4
        !           654: copy_wide_w_32_loop:
        !           655:         UNROLL_LOOP     COPY_WIDE_W_32,W_32,LOOP_UNROLL_COUNT
        !           656:         dec     edx
        !           657:         jnz     copy_wide_w_32_loop
        !           658:         jmp     src8_done
        !           659: 
        !           660: ;-----------------------------------------------------------------------;
        !           661: ; Copy n dwords, 3 leading bytes, 3 trailing bytes, then advance to next
        !           662: ; scan line.
        !           663: 
        !           664: COPY_WIDE_W_33 macro ENTRY_LABEL,ENTRY_INDEX
        !           665: &ENTRY_LABEL&ENTRY_INDEX&:
        !           666:         mov     cl,[esi-3]
        !           667:         mov     [edi-3],cl
        !           668:         mov     cx,[esi-2]
        !           669:         mov     [edi-2],cx
        !           670:         mov     ecx,culMiddle
        !           671:         rep     movsd
        !           672:         mov     cx,[esi]
        !           673:         mov     [edi],cx
        !           674:         mov     cl,[esi+2]
        !           675:         mov     [edi+2],cl
        !           676:         add     esi,eax
        !           677:         add     edi,ebx
        !           678:         endm    ;--------------------------------;
        !           679: 
        !           680:         align   4
        !           681: copy_wide_w_33_loop:
        !           682:         UNROLL_LOOP     COPY_WIDE_W_33,W_33,LOOP_UNROLL_COUNT
        !           683:         dec     edx
        !           684:         jnz     copy_wide_w_33_loop
        !           685:         jmp     src8_done
        !           686: 
        !           687: ;-----------------------------------------------------------------------;
        !           688: ; Copy 1 byte, then advance to next scan line.
        !           689: 
        !           690: COPY_THIN_T_1 macro ENTRY_LABEL,ENTRY_INDEX
        !           691: &ENTRY_LABEL&ENTRY_INDEX&:
        !           692:         mov     cl,[esi]
        !           693:         mov     [edi],cl
        !           694:         add     esi,eax
        !           695:         add     edi,ebx
        !           696:         endm    ;--------------------------------;
        !           697: 
        !           698:         align   4
        !           699: copy_thin_t_1_loop:
        !           700:         UNROLL_LOOP     COPY_THIN_T_1,T_1,LOOP_UNROLL_COUNT
        !           701:         dec     edx
        !           702:         jnz     copy_thin_t_1_loop
        !           703:         jmp     src8_done
        !           704: 
        !           705: ;-----------------------------------------------------------------------;
        !           706: ; Copy 2 bytes, then advance to next scan line.
        !           707: 
        !           708: COPY_THIN_T_2 macro ENTRY_LABEL,ENTRY_INDEX
        !           709: &ENTRY_LABEL&ENTRY_INDEX&:
        !           710:         mov     cx,[esi]
        !           711:         mov     [edi],cx
        !           712:         add     esi,eax
        !           713:         add     edi,ebx
        !           714:         endm    ;--------------------------------;
        !           715: 
        !           716:         align   4
        !           717: copy_thin_t_2_loop:
        !           718:         UNROLL_LOOP     COPY_THIN_T_2,T_2,LOOP_UNROLL_COUNT
        !           719:         dec     edx
        !           720:         jnz     copy_thin_t_2_loop
        !           721:         jmp     src8_done
        !           722: 
        !           723: ;-----------------------------------------------------------------------;
        !           724: ; Copy 3 bytes, then advance to next scan line.
        !           725: 
        !           726: COPY_THIN_T_3 macro ENTRY_LABEL,ENTRY_INDEX
        !           727: &ENTRY_LABEL&ENTRY_INDEX&:
        !           728:         mov     cx,[esi]
        !           729:         mov     [edi],cx
        !           730:         mov     cl,[esi+2]
        !           731:         mov     [edi+2],cl
        !           732:         add     esi,eax
        !           733:         add     edi,ebx
        !           734:         endm    ;--------------------------------;
        !           735: 
        !           736:         align   4
        !           737: copy_thin_t_3_loop:
        !           738:         UNROLL_LOOP     COPY_THIN_T_3,T_3,LOOP_UNROLL_COUNT
        !           739:         dec     edx
        !           740:         jnz     copy_thin_t_3_loop
        !           741:         jmp     src8_done
        !           742: 
        !           743: public copy_wide_w_00_loop
        !           744: public copy_wide_w_01_loop
        !           745: public copy_wide_w_02_loop
        !           746: public copy_wide_w_03_loop
        !           747: public copy_wide_w_10_loop
        !           748: public copy_wide_w_11_loop
        !           749: public copy_wide_w_12_loop
        !           750: public copy_wide_w_13_loop
        !           751: public copy_wide_w_20_loop
        !           752: public copy_wide_w_21_loop
        !           753: public copy_wide_w_22_loop
        !           754: public copy_wide_w_23_loop
        !           755: public copy_wide_w_30_loop
        !           756: public copy_wide_w_31_loop
        !           757: public copy_wide_w_32_loop
        !           758: public copy_wide_w_33_loop
        !           759: public copy_thin_t_1_loop
        !           760: public copy_thin_t_2_loop
        !           761: public copy_thin_t_3_loop
        !           762: 
        !           763: endProc vSrcCopy8bpp
        !           764: 
        !           765:         end
        !           766: 

unix.superglobalmegacorp.com

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