Changeset 4322 for trunk/src


Ignore:
Timestamp:
Sep 25, 2000, 8:53:45 PM (25 years ago)
Author:
mike
Message:

Fixed many many bugs in the 8/16bit transblt functions.

Location:
trunk/src/ddraw
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ddraw/asmutil.asm

    r2638 r4322  
    1 ; $Id: asmutil.asm,v 1.6 2000-02-04 19:31:26 hugh Exp $
     1; $Id: asmutil.asm,v 1.7 2000-09-25 18:53:45 mike Exp $
    22
    33;
     
    5757  push  edx
    5858
    59   mov  edi, dword ptr [ebp+8]    ;dest
     59  mov  edi, dword ptr [ebp+8]     ;dest
    6060  mov  esi, dword ptr [ebp+12]    ;src
    6161  mov  ecx, dword ptr [ebp+20]    ;linesize
     
    7171  or   edx, eax      ; edx now contains the colorkey in each byte
    7272  shr  ecx, 2        ;linesize in dwords
    73   jz  blitremain    ; less then 4 bytes
     73  jz  blitremain     ; less then 4 bytes
    7474  jmp blitStart
    7575blitloop:
     
    7979  mov  ebx, dword ptr [esi]
    8080  mov  eax, dword ptr [edi]
    81   cmp  ebx, edx  ; All 4 bytes transparent?
     81  cmp  ebx, edx   ; All 4 bytes transparent?
    8282  jz TTTT
    83   cmp   bx, dx     ; lower 2 bytes transparent ?
     83  cmp   bx, dx    ; lower 2 bytes transparent?
    8484  jz XXTT
    85   cmp   bl, dl    ; lower byte trans
     85  cmp   bl, dl    ; lower byte transparent?
    8686  jz XXOT
    8787  mov   al, bl
     
    9393  ror  eax, 16
    9494  ror  ebx, 16
    95   cmp   bx,dx
     95  cmp   bx, dx
    9696  jz   skipbyte4
    9797  cmp   bl, dl
     
    9999  mov   al, bl
    100100skipbyte3:
    101   cmp  bh, dl
     101  cmp  bh, dh
    102102  je  skipbyte4
    103103  mov  ah, bh
     
    107107TTTT:
    108108  dec  ecx
    109   jz   blitloop
     109  jnz  blitloop
    110110blitremain:
    111111  pop  ecx
     
    114114  jz   blit2
    115115  test ecx,ecx
    116   jz endofblit
    117   mov  eax, dword ptr[esi]
     116  jz   endofblit
     117  mov  eax, dword ptr [esi]
    118118  mov  ebx, dword ptr [edi]
    119   rol  eax, 8
    120   rol  ebx, 8
    121119  cmp  al,dl
    122   jz  endofblit
     120  jz   endofblit
    123121  mov  bl,al
    124   ror  ebx, 8
    125122  mov  dword ptr[edi],ebx
    126123  jmp endofblit
    127124
    128125blit3:
    129   mov  eax, dword ptr[esi]
     126  mov  eax, dword ptr [esi]
    130127  mov  ebx, dword ptr [edi]
    131   ror  eax, 16
    132   ror  ebx, 16
    133128  cmp  ax, dx
    134   jz TTX
    135   cmp  ah,dh
    136   jz TXX
    137   mov bh,ah
     129  jz   TTX
     130  cmp  ah, dh
     131  jz   TXX
     132  mov  bh, ah
    138133TXX:
    139   cmp al,dl
    140   jz TTX
    141   mov bl,al
     134  cmp  al, dl
     135  jz   TTX
     136  mov  bl, al
    142137TTX:
    143138  ror  eax, 16
    144139  ror  ebx, 16
    145   cmp  ah,dh
    146   jz Cpyback
    147   mov  dh,ah
     140  cmp  al, dl
     141  jz   Cpyback
     142  mov  bl, al
    148143Cpyback:
     144  ror  ebx, 16
    149145  mov  dword ptr [edi], ebx
    150   jmp endofblit
     146  jmp  endofblit
    151147
    152148blit2:
    153   mov  eax, dword ptr[esi]
     149  mov  eax, dword ptr [esi]
    154150  mov  ebx, dword ptr [edi]
    155   ror  eax, 16
    156   ror  ebx, 16
    157151  cmp  ax, dx  ; both bytes transparent ?
    158   jz endofblit
    159   cmp  ah,dh
    160   jz TX
    161   mov bh,ah
     152  jz   endofblit
     153  cmp  ah, dh
     154  jz   TX
     155  mov  bh, ah
    162156TX:
    163   cmp al,dl
    164   jz OT
    165   mov bl,al
     157  cmp  al, dl
     158  jz   OT
     159  mov  bl, al
    166160OT:
    167   ror  ebx, 16
    168161  mov dword ptr[edi], ebx
    169162
     
    202195  push  edx
    203196
    204   mov  edi, dword ptr [ebp+8]    ;dest
     197  mov  edi, dword ptr [ebp+8]     ;dest
    205198  mov  esi, dword ptr [ebp+12]    ;src
    206199  mov  ecx, dword ptr [ebp+20]    ;linesize
     
    212205  or   edx,eax       ; create dwColorKey
    213206  shr  ecx, 1        ; linesize in dwords
    214   jz   OnePixel
     207  jz   OnePixel      ; FIXME: BUG if ecx was really 1!
    215208
    216209blitloop16:
    217210  mov  eax, dword ptr [esi]
    218211  mov  ebx, dword ptr [edi]
    219   add esi , 4
    220   cmp  eax, edx ; are both pixel transparent?
    221   je  LoopUp    ; Yes, then Jump to loopend
    222   cmp  ax,dx    ; Is lower pixel transparent
    223   je  DrawOT    ; Yes So We got OT (OPAQUE/Transparent
    224   mov  bx,ax    ; No so copy the lower pixel
    225   ror  eax,16   ;
    226   cmp  ax,dx    ; Is higher pixel transparent
    227   je  CopyBack  ;
     212  add  esi, 4
     213  cmp  eax, edx  ; are both pixel transparent?
     214  je   LoopUp    ; Yes, then Jump to loopend
     215  cmp  ax, dx    ; Is lower pixel transparent
     216  je   DrawOT    ; Yes So We got OT (OPAQUE/Transparent
     217  mov  bx, ax    ; No so copy the lower pixel
    228218DrawOT:
     219  ror  eax, 16   ;
     220  cmp  ax, dx    ; Is higher pixel transparent
     221  je   CopyBack  ;
     222  mov  bx, ax
     223CopyBack:
    229224  ror ebx,16
    230   mov  bx,ax
    231   ror ebx,16
    232 CopyBack:
    233225  mov dword ptr[edi], ebx ; copy back the result in ebx
    234226LoopUp:
    235227  mov ebx, dword ptr [ebp+20] ; V load this this in case we are done
    236   add edi , 4                 ; U
     228  add edi, 4                  ; U
    237229OnePixel:
    238230  dec  ecx
    239   jnz blitloop16
     231  jnz  blitloop16
    240232  test ebx, 1                 ; Do we have an odd linesize
    241   jz endofblit16
     233  jz   endofblit16
    242234  mov  eax, dword ptr [esi]
    243235  mov  ebx, dword ptr [edi]
    244   ror  eax,16
    245   ror  ebx,16
    246236  cmp  ax, dx
    247   je endofblit16              ; last pixel is transparent
    248   mov  bx,ax    ; No so copy the lower pixel
    249   ror ebx,16
    250   mov dword ptr[edi], ebx ; copy back the result in ebx
     237  je   endofblit16            ; last pixel is transparent
     238  mov  bx,ax                  ; No so copy the lower pixel
     239  mov  dword ptr [edi], ebx   ; copy back the result in ebx
    251240
    252241endofblit16:
     
    276265  push  edx
    277266
    278   mov  edx,  [ebp+16]    ;colorkey
    279   mov  edi,  [ebp+8]    ;dest
    280   mov  dh,dl
    281   mov  esi,  [ebp+12]    ;src
    282   mov  ax,dx
    283   mov  ecx, dword ptr [ebp+20]    ;linesize
    284   shr  edx,16
    285   mov  dx,ax
    286   movd mm4,edx
    287   movd mm5,edx
     267  mov   edx,  [ebp+16]    ;colorkey (in dl)
     268  mov   edi,  [ebp+8]     ;dest
     269  mov   esi,  [ebp+12]    ;src
     270  mov   ecx, dword ptr [ebp+20]    ;linesize
     271  mov   dh,dl
     272  mov   eax,edx
     273  shl   edx,16
     274  mov   dx,ax
     275  movd  mm4,edx
     276  movd  mm5,edx
    288277  psllq mm4,32
    289   por  mm4,mm5
    290   shr ecx,3
     278  por   mm4,mm5
     279  shr   ecx,3
    291280  jz BltRemain8
    292281
    293282bltLoopMMX8:
    294   movq mm0, [esi] ; get source qword
    295   movq mm1, [edi] ; get dest   qword
    296   movq mm2,mm0   ; copy source
    297   PCMPEQB mm0,mm4 ; create mask
    298   pand  mm1,mm0  ; mask dest
    299   pandn mm2,mm0  ; mask source
    300   por   mm1,mm2  ; or them
     283  movq mm0, [esi]  ; get source qword
     284  movq mm1, [edi]  ; get dest   qword
     285  movq mm2, mm0    ; copy source
     286  pcmpeqb mm0, mm4 ; create mask
     287  pand  mm1, mm0   ; mask dest
     288  pandn mm0, mm2   ; NOT mask AND source
     289  por   mm1, mm0   ; or them
    301290  movq qword ptr [edi], mm1 ; write back result
    302291  add esi, 8
     
    326315;
    327316blt7MMX8:
    328   movd mm0, dword ptr[esi]
    329   mov  ax,  word ptr[esi+4]
    330   mov  bx,  word ptr[edi+4]
    331   movd mm1, dword ptr[edi]
    332   psllq mm0,32
    333   shl  eax,8
    334   shl  ebx,8
    335   mov  al, byte ptr[esi+6]
    336   mov  bl, byte ptr[edi+6]
    337   movd mm0,eax
    338   psllq mm1,32
    339   movd mm1,ebx
    340   movq mm2,mm0    ; copy source
    341   PCMPEQB mm0,mm4 ; create mask
    342   pand  mm1,mm0   ; mask dest
    343   pandn mm2,mm0             ; mask source
    344   por   mm1,mm2 ; or them
     317  movd  mm0, dword ptr[esi]
     318  mov   ax, word ptr[esi+4]
     319  mov   bx, word ptr[edi+4]
     320  movd  mm1, dword ptr[edi]
     321  psllq mm0, 32
     322  shl   eax, 8
     323  shl   ebx, 8
     324  mov   al, byte ptr[esi+6]
     325  mov   bl, byte ptr[edi+6]
     326  movd  mm5, eax
     327  por   mm0, mm5
     328  psllq mm1, 32
     329  movd  mm6, ebx
     330  por   mm1, mm6
     331  movq  mm2, mm0   ; copy source
     332  pcmpeqb mm0, mm4 ; create mask
     333  pand  mm1, mm0   ; mask dest
     334  pandn mm0, mm2   ; mask source
     335  por   mm1, mm0   ; or them
    345336  movd  eax, mm1
    346337  psrlq mm1,32
    347   mov  byte ptr[edi+6], al
     338  mov   byte ptr[edi+6], al
    348339  movd  dword ptr[edi], mm1
    349   shr  eax,8
    350   mov  word ptr[edi+4],ax
    351   jmp bltEndMMX8
     340  shr   eax,8
     341  mov   word ptr[edi+4], ax
     342  jmp   bltEndMMX8
    352343
    353344blt6MMX8:
    354   movd mm0, dword ptr[esi]
    355   mov  ax,  word ptr[esi+4]
    356   mov  bx,  word ptr[edi+4]
    357   movd mm1, dword ptr[edi]
    358   psllq mm0,32
    359   psllq mm1,32
    360   movd mm0,eax
    361   movd mm1,ebx
    362   movq mm2,mm0   ; copy source
    363   pcmpeqb mm0,mm4 ; create mask
    364   pand  mm1,mm0 ; mask dest
    365   pandn mm2,mm0             ; mask source
    366   por   mm1,mm2 ; or them
     345  movd  mm0, dword ptr[esi]
     346  mov   ax, word ptr[esi+4]
     347  mov   bx, word ptr[edi+4]
     348  movd  mm1, dword ptr[edi]
     349  psllq mm0, 32
     350  psllq mm1, 32
     351  movd  mm5, eax
     352  por   mm0, mm5
     353  movd  mm6, ebx
     354  por   mm1, mm6
     355  movq  mm2, mm0   ; copy source
     356  pcmpeqb mm0, mm4 ; create mask
     357  pand  mm1, mm0   ; mask dest
     358  pandn mm0, mm2   ; mask source
     359  por   mm1, mm0   ; or them
    367360  movd  eax, mm1
    368361  psrlq mm1,32
    369   mov  word ptr[edi+4],ax
     362  mov   word ptr[edi+4], ax
    370363  movd  dword ptr[edi], mm1
    371   jmp bltEndMMX8
     364  jmp   bltEndMMX8
    372365
    373366blt5MMX8:
    374367  movd mm0, dword ptr[esi]
    375368  movd mm1, dword ptr[edi]
    376   movq mm2,mm0   ; copy source
    377   pcmpeqb mm0,mm4 ; create mask
    378   pand  mm1,mm0 ; mask dest
    379   add esi, 4;
    380   pandn mm2,mm0 ; mask source
    381   por   mm1,mm2 ; or them
     369  movq mm2, mm0    ; copy source
     370  pcmpeqb mm0, mm4 ; create mask
     371  pand  mm1, mm0  ; mask dest
     372  add   esi, 4
     373  pandn mm0, mm2  ; mask source
     374  por   mm1, mm0  ; or them
    382375  movd  dword ptr[edi], mm1
    383   add edi,4
    384   jmp blt1MMX8
     376  add   edi,4
     377  jmp   blt1MMX8
    385378
    386379blt4MMX8:
    387380  movd mm0, dword ptr[esi]
    388381  movd mm1, dword ptr[edi]
    389   movq mm2,mm0   ; copy source
     382  movq mm2,mm0    ; copy source
    390383  pcmpeqb mm0,mm4 ; create mask
    391   pand  mm1,mm0 ; mask dest
    392   pandn mm2,mm0             ; mask source
    393   por   mm1,mm2 ; or them
    394   movd dword ptr [edi], mm1 ; write back result
    395   jmp bltEndMMX8
     384  pand  mm1,mm0   ; mask dest
     385  pandn mm0,mm2   ; mask source
     386  por   mm1,mm ; or them
     387  movd  dword ptr [edi], mm1 ; write back result
     388  jmp   bltEndMMX8
    396389;
    397390; loading a dword into mm0/mm1 might be faster for 3-2...
    398391;
    399392blt3MMX8:
    400   mov  ax , word ptr [esi]
    401   mov  bx , word ptr [edi]
     393  mov  ax, word ptr [esi]
     394  mov  bx, word ptr [edi]
    402395  shl  eax,8  ; 3 Pixel left to blit
    403396  shl  ebx,8  ; so shift the buffers
     
    408401  movq mm2,mm0
    409402  pcmpeqb mm0,mm4 ; create mask
    410   pand  mm1,mm0 ; mask dest
    411   pandn mm2,mm0 ; mask source
    412   por   mm1,mm2 ; or them
    413   movd eax, mm1 ; write back result
    414   mov  byte ptr[edi+2],al
    415   shr eax,8
    416   mov  word ptr[edi],ax
     403  pand  mm1,mm0   ; mask dest
     404  pandn mm0,mm2  ; mask source
     405  por   mm1,mm ; or them
     406  movd  eax, mm1 ; write back result
     407  mov   byte ptr[edi+2], al
     408  shr   eax, 8
     409  mov   word ptr[edi], ax
    417410  jmp bltEndMMX8
    418411
    419412blt2MMX8:
    420413  mov  al, byte ptr [esi]
    421   cmp al,dl
    422   je  blt1aMMX8
     414  cmp  al, dl
     415  je   blt1aMMX8
    423416  mov  byte ptr [edi], al
    424   mov  bl , byte ptr [esi+1]
    425   cmp bl,dl
    426   je  bltEndMMX8
    427   mov  byte ptr [edi+1], bl
    428   jmp bltEndMMX8
     417;  mov  bl, byte ptr [esi+1]
     418;  cmp  bl, dl
     419;  je   bltEndMMX8
     420;  mov  byte ptr [edi+1], bl
     421;  jmp bltEndMMX8
    429422blt1aMMX8:
    430   add esi,1
    431   add edi,1
     423  add esi, 1
     424  add edi, 1
    432425blt1MMX8:
    433426  mov  al, byte ptr [esi]
    434   cmp al,dl
    435   je  bltEndMMX8
     427  cmp  al, dl
     428  je   bltEndMMX8
    436429  mov  byte ptr [edi], al
    437430
     
    461454  mov  edx, dword ptr [ebp+16]    ; colorkey
    462455  mov  edi, dword ptr [ebp+8]     ; dest
    463   mov  eax, dword ptr [ebp+16]    ; colorkey
    464   shr  edx,16;
    465456  mov  ecx, dword ptr [ebp+20]    ; linesize in pixel!
    466   mov  dx,ax                      ; extend colorkey to 32 Bit
     457
     458  mov  eax, edx
     459  shl  edx, 16;
     460  mov  dx, ax                     ; extend colorKey to 32 bit
     461
    467462  mov  esi, dword ptr [ebp+12]    ; src
    468463  mov  eax, ecx                   ; copy of linesize
     
    476471
    477472bltLoopMMX16:
    478   movq mm0,qword ptr [esi] ; get source dword
    479   movq mm1,qword ptr [edi] ; get destination
    480   movq mm2,mm0   ; copy source
    481   pcmpeqw mm0,mm4 ; create mask
    482   pand  mm1,mm0  ; mask dest
    483   add esi, 8
    484   pandn mm2,mm0  ; mask source
    485   por   mm1,mm2  ; or them
     473  movq mm0,qword ptr [esi]  ; get source dword
     474  movq mm1,qword ptr [edi]  ; get destination
     475  movq mm2,mm0              ; copy source
     476  pcmpeqw mm0,mm4           ; create mask in mm0
     477  pand  mm1,mm0             ; mask dest
     478  add   esi, 8              ; point to next source qword
     479  pandn mm0,mm2             ; NOT mask AND source
     480  por   mm1,mm0             ; or them
    486481  movq qword ptr [edi], mm1 ; write back result
    487482  add edi, 8
     
    505500  movd mm0, dword ptr[esi]
    506501  movd mm1, dword ptr[edi]
    507   movq mm2,mm0   ; copy source
     502  movq mm2,mm0    ; copy source
    508503  add esi,4
    509504  pcmpeqw mm0,mm4 ; create mask 16 bit
    510   pand  mm1,mm0 ; mask dest
    511   pandn mm2,mm0            ; mask source
     505  pand    mm1,mm0 ; mask dest
     506  pandn   mm0,mm2 ; mask source
    512507  add edi,4
    513   por   mm1,mm2 ; or them
     508  por   mm1,mm0 ; or them
    514509  movd  dword ptr[edi-4], mm1
    515510  jmp blt1MMX16
     
    521516  pcmpeqw mm0,mm4 ; create mask 16 bit
    522517  pand  mm1,mm0 ; mask dest
    523   pandn mm2,mm0             ; mask source
    524   por   mm1,mm2 ; or them
     518  pandn mm0,mm2             ; mask source
     519  por   mm1,mm0 ; or them
    525520  movd dword ptr [edi], mm1 ; write back result
    526521  jmp bltEndMMX16
     
    19421937  inc eax
    19431938Return:
     1939;  mov  eax, 0 ; pretend no MMX is available
    19441940  pop  edx
    19451941  pop  ecx
  • trunk/src/ddraw/new/asmutil.asm

    r3345 r4322  
    1 ; $Id: asmutil.asm,v 1.1 2000-04-07 18:21:09 mike Exp $
     1; $Id: asmutil.asm,v 1.2 2000-09-25 18:53:45 mike Exp $
    22
    33;
     
    5757  push  edx
    5858
    59   mov  edi, dword ptr [ebp+8]    ;dest
     59  mov  edi, dword ptr [ebp+8]     ;dest
    6060  mov  esi, dword ptr [ebp+12]    ;src
    6161  mov  ecx, dword ptr [ebp+20]    ;linesize
     
    7171  or   edx, eax      ; edx now contains the colorkey in each byte
    7272  shr  ecx, 2        ;linesize in dwords
    73   jz  blitremain    ; less then 4 bytes
     73  jz  blitremain     ; less then 4 bytes
    7474  jmp blitStart
    7575blitloop:
     
    7979  mov  ebx, dword ptr [esi]
    8080  mov  eax, dword ptr [edi]
    81   cmp  ebx, edx  ; All 4 bytes transparent?
     81  cmp  ebx, edx   ; All 4 bytes transparent?
    8282  jz TTTT
    83   cmp   bx, dx     ; lower 2 bytes transparent ?
     83  cmp   bx, dx    ; lower 2 bytes transparent?
    8484  jz XXTT
    85   cmp   bl, dl    ; lower byte trans
     85  cmp   bl, dl    ; lower byte transparent?
    8686  jz XXOT
    8787  mov   al, bl
     
    9393  ror  eax, 16
    9494  ror  ebx, 16
    95   cmp   bx,dx
     95  cmp   bx, dx
    9696  jz   skipbyte4
    9797  cmp   bl, dl
     
    9999  mov   al, bl
    100100skipbyte3:
    101   cmp  bh, dl
     101  cmp  bh, dh
    102102  je  skipbyte4
    103103  mov  ah, bh
     
    107107TTTT:
    108108  dec  ecx
    109   jz   blitloop
     109  jnz  blitloop
    110110blitremain:
    111111  pop  ecx
     
    114114  jz   blit2
    115115  test ecx,ecx
    116   jz endofblit
    117   mov  eax, dword ptr[esi]
     116  jz   endofblit
     117  mov  eax, dword ptr [esi]
    118118  mov  ebx, dword ptr [edi]
    119   rol  eax, 8
    120   rol  ebx, 8
    121119  cmp  al,dl
    122   jz  endofblit
     120  jz   endofblit
    123121  mov  bl,al
    124   ror  ebx, 8
    125122  mov  dword ptr[edi],ebx
    126123  jmp endofblit
    127124
    128125blit3:
    129   mov  eax, dword ptr[esi]
     126  mov  eax, dword ptr [esi]
    130127  mov  ebx, dword ptr [edi]
    131   ror  eax, 16
    132   ror  ebx, 16
    133128  cmp  ax, dx
    134   jz TTX
    135   cmp  ah,dh
    136   jz TXX
    137   mov bh,ah
     129  jz   TTX
     130  cmp  ah, dh
     131  jz   TXX
     132  mov  bh, ah
    138133TXX:
    139   cmp al,dl
    140   jz TTX
    141   mov bl,al
     134  cmp  al, dl
     135  jz   TTX
     136  mov  bl, al
    142137TTX:
    143138  ror  eax, 16
    144139  ror  ebx, 16
    145   cmp  ah,dh
    146   jz Cpyback
    147   mov  dh,ah
     140  cmp  al, dl
     141  jz   Cpyback
     142  mov  bl, al
    148143Cpyback:
     144  ror  ebx, 16
    149145  mov  dword ptr [edi], ebx
    150   jmp endofblit
     146  jmp  endofblit
    151147
    152148blit2:
    153   mov  eax, dword ptr[esi]
     149  mov  eax, dword ptr [esi]
    154150  mov  ebx, dword ptr [edi]
    155   ror  eax, 16
    156   ror  ebx, 16
    157151  cmp  ax, dx  ; both bytes transparent ?
    158   jz endofblit
    159   cmp  ah,dh
    160   jz TX
    161   mov bh,ah
     152  jz   endofblit
     153  cmp  ah, dh
     154  jz   TX
     155  mov  bh, ah
    162156TX:
    163   cmp al,dl
    164   jz OT
    165   mov bl,al
     157  cmp  al, dl
     158  jz   OT
     159  mov  bl, al
    166160OT:
    167   ror  ebx, 16
    168161  mov dword ptr[edi], ebx
    169162
     
    202195  push  edx
    203196
    204   mov  edi, dword ptr [ebp+8]    ;dest
     197  mov  edi, dword ptr [ebp+8]     ;dest
    205198  mov  esi, dword ptr [ebp+12]    ;src
    206199  mov  ecx, dword ptr [ebp+20]    ;linesize
     
    212205  or   edx,eax       ; create dwColorKey
    213206  shr  ecx, 1        ; linesize in dwords
    214   jz   OnePixel
     207  jz   OnePixel      ; FIXME: BUG if ecx was really 1!
    215208
    216209blitloop16:
    217210  mov  eax, dword ptr [esi]
    218211  mov  ebx, dword ptr [edi]
    219   add esi , 4
    220   cmp  eax, edx ; are both pixel transparent?
    221   je  LoopUp    ; Yes, then Jump to loopend
    222   cmp  ax,dx    ; Is lower pixel transparent
    223   je  DrawOT    ; Yes So We got OT (OPAQUE/Transparent
    224   mov  bx,ax    ; No so copy the lower pixel
    225   ror  eax,16   ;
    226   cmp  ax,dx    ; Is higher pixel transparent
    227   je  CopyBack  ;
     212  add  esi, 4
     213  cmp  eax, edx  ; are both pixel transparent?
     214  je   LoopUp    ; Yes, then Jump to loopend
     215  cmp  ax, dx    ; Is lower pixel transparent
     216  je   DrawOT    ; Yes So We got OT (OPAQUE/Transparent
     217  mov  bx, ax    ; No so copy the lower pixel
    228218DrawOT:
     219  ror  eax, 16   ;
     220  cmp  ax, dx    ; Is higher pixel transparent
     221  je   CopyBack  ;
     222  mov  bx, ax
     223CopyBack:
    229224  ror ebx,16
    230   mov  bx,ax
    231   ror ebx,16
    232 CopyBack:
    233225  mov dword ptr[edi], ebx ; copy back the result in ebx
    234226LoopUp:
    235227  mov ebx, dword ptr [ebp+20] ; V load this this in case we are done
    236   add edi , 4                 ; U
     228  add edi, 4                  ; U
    237229OnePixel:
    238230  dec  ecx
    239   jnz blitloop16
     231  jnz  blitloop16
    240232  test ebx, 1                 ; Do we have an odd linesize
    241   jz endofblit16
     233  jz   endofblit16
    242234  mov  eax, dword ptr [esi]
    243235  mov  ebx, dword ptr [edi]
    244   ror  eax,16
    245   ror  ebx,16
    246236  cmp  ax, dx
    247   je endofblit16              ; last pixel is transparent
    248   mov  bx,ax    ; No so copy the lower pixel
    249   ror ebx,16
    250   mov dword ptr[edi], ebx ; copy back the result in ebx
     237  je   endofblit16            ; last pixel is transparent
     238  mov  bx,ax                  ; No so copy the lower pixel
     239  mov  dword ptr [edi], ebx   ; copy back the result in ebx
    251240
    252241endofblit16:
     
    276265  push  edx
    277266
    278   mov  edx,  [ebp+16]    ;colorkey
    279   mov  edi,  [ebp+8]    ;dest
    280   mov  dh,dl
    281   mov  esi,  [ebp+12]    ;src
    282   mov  ax,dx
    283   mov  ecx, dword ptr [ebp+20]    ;linesize
    284   shr  edx,16
    285   mov  dx,ax
    286   movd mm4,edx
    287   movd mm5,edx
     267  mov   edx,  [ebp+16]    ;colorkey (in dl)
     268  mov   edi,  [ebp+8]     ;dest
     269  mov   esi,  [ebp+12]    ;src
     270  mov   ecx, dword ptr [ebp+20]    ;linesize
     271  mov   dh,dl
     272  mov   eax,edx
     273  shl   edx,16
     274  mov   dx,ax
     275  movd  mm4,edx
     276  movd  mm5,edx
    288277  psllq mm4,32
    289   por  mm4,mm5
    290   shr ecx,3
     278  por   mm4,mm5
     279  shr   ecx,3
    291280  jz BltRemain8
    292281
    293282bltLoopMMX8:
    294   movq mm0, [esi] ; get source qword
    295   movq mm1, [edi] ; get dest   qword
    296   movq mm2,mm0   ; copy source
    297   PCMPEQB mm0,mm4 ; create mask
    298   pand  mm1,mm0  ; mask dest
    299   pandn mm2,mm0  ; mask source
    300   por   mm1,mm2  ; or them
     283  movq mm0, [esi]  ; get source qword
     284  movq mm1, [edi]  ; get dest   qword
     285  movq mm2, mm0    ; copy source
     286  pcmpeqb mm0, mm4 ; create mask
     287  pand  mm1, mm0   ; mask dest
     288  pandn mm0, mm2   ; NOT mask AND source
     289  por   mm1, mm0   ; or them
    301290  movq qword ptr [edi], mm1 ; write back result
    302291  add esi, 8
     
    326315;
    327316blt7MMX8:
    328   movd mm0, dword ptr[esi]
    329   mov  ax,  word ptr[esi+4]
    330   mov  bx,  word ptr[edi+4]
    331   movd mm1, dword ptr[edi]
    332   psllq mm0,32
    333   shl  eax,8
    334   shl  ebx,8
    335   mov  al, byte ptr[esi+6]
    336   mov  bl, byte ptr[edi+6]
    337   movd mm0,eax
    338   psllq mm1,32
    339   movd mm1,ebx
    340   movq mm2,mm0    ; copy source
    341   PCMPEQB mm0,mm4 ; create mask
    342   pand  mm1,mm0   ; mask dest
    343   pandn mm2,mm0             ; mask source
    344   por   mm1,mm2 ; or them
     317  movd  mm0, dword ptr[esi]
     318  mov   ax, word ptr[esi+4]
     319  mov   bx, word ptr[edi+4]
     320  movd  mm1, dword ptr[edi]
     321  psllq mm0, 32
     322  shl   eax, 8
     323  shl   ebx, 8
     324  mov   al, byte ptr[esi+6]
     325  mov   bl, byte ptr[edi+6]
     326  movd  mm5, eax
     327  por   mm0, mm5
     328  psllq mm1, 32
     329  movd  mm6, ebx
     330  por   mm1, mm6
     331  movq  mm2, mm0   ; copy source
     332  pcmpeqb mm0, mm4 ; create mask
     333  pand  mm1, mm0   ; mask dest
     334  pandn mm0, mm2   ; mask source
     335  por   mm1, mm0   ; or them
    345336  movd  eax, mm1
    346337  psrlq mm1,32
    347   mov  byte ptr[edi+6], al
     338  mov   byte ptr[edi+6], al
    348339  movd  dword ptr[edi], mm1
    349   shr  eax,8
    350   mov  word ptr[edi+4],ax
    351   jmp bltEndMMX8
     340  shr   eax,8
     341  mov   word ptr[edi+4], ax
     342  jmp   bltEndMMX8
    352343
    353344blt6MMX8:
    354   movd mm0, dword ptr[esi]
    355   mov  ax,  word ptr[esi+4]
    356   mov  bx,  word ptr[edi+4]
    357   movd mm1, dword ptr[edi]
    358   psllq mm0,32
    359   psllq mm1,32
    360   movd mm0,eax
    361   movd mm1,ebx
    362   movq mm2,mm0   ; copy source
    363   pcmpeqb mm0,mm4 ; create mask
    364   pand  mm1,mm0 ; mask dest
    365   pandn mm2,mm0             ; mask source
    366   por   mm1,mm2 ; or them
     345  movd  mm0, dword ptr[esi]
     346  mov   ax, word ptr[esi+4]
     347  mov   bx, word ptr[edi+4]
     348  movd  mm1, dword ptr[edi]
     349  psllq mm0, 32
     350  psllq mm1, 32
     351  movd  mm5, eax
     352  por   mm0, mm5
     353  movd  mm6, ebx
     354  por   mm1, mm6
     355  movq  mm2, mm0   ; copy source
     356  pcmpeqb mm0, mm4 ; create mask
     357  pand  mm1, mm0   ; mask dest
     358  pandn mm0, mm2   ; mask source
     359  por   mm1, mm0   ; or them
    367360  movd  eax, mm1
    368361  psrlq mm1,32
    369   mov  word ptr[edi+4],ax
     362  mov   word ptr[edi+4], ax
    370363  movd  dword ptr[edi], mm1
    371   jmp bltEndMMX8
     364  jmp   bltEndMMX8
    372365
    373366blt5MMX8:
    374367  movd mm0, dword ptr[esi]
    375368  movd mm1, dword ptr[edi]
    376   movq mm2,mm0   ; copy source
    377   pcmpeqb mm0,mm4 ; create mask
    378   pand  mm1,mm0 ; mask dest
    379   add esi, 4;
    380   pandn mm2,mm0 ; mask source
    381   por   mm1,mm2 ; or them
     369  movq mm2, mm0    ; copy source
     370  pcmpeqb mm0, mm4 ; create mask
     371  pand  mm1, mm0  ; mask dest
     372  add   esi, 4
     373  pandn mm0, mm2  ; mask source
     374  por   mm1, mm0  ; or them
    382375  movd  dword ptr[edi], mm1
    383   add edi,4
    384   jmp blt1MMX8
     376  add   edi,4
     377  jmp   blt1MMX8
    385378
    386379blt4MMX8:
    387380  movd mm0, dword ptr[esi]
    388381  movd mm1, dword ptr[edi]
    389   movq mm2,mm0   ; copy source
     382  movq mm2,mm0    ; copy source
    390383  pcmpeqb mm0,mm4 ; create mask
    391   pand  mm1,mm0 ; mask dest
    392   pandn mm2,mm0             ; mask source
    393   por   mm1,mm2 ; or them
    394   movd dword ptr [edi], mm1 ; write back result
    395   jmp bltEndMMX8
     384  pand  mm1,mm0   ; mask dest
     385  pandn mm0,mm2   ; mask source
     386  por   mm1,mm ; or them
     387  movd  dword ptr [edi], mm1 ; write back result
     388  jmp   bltEndMMX8
    396389;
    397390; loading a dword into mm0/mm1 might be faster for 3-2...
    398391;
    399392blt3MMX8:
    400   mov  ax , word ptr [esi]
    401   mov  bx , word ptr [edi]
     393  mov  ax, word ptr [esi]
     394  mov  bx, word ptr [edi]
    402395  shl  eax,8  ; 3 Pixel left to blit
    403396  shl  ebx,8  ; so shift the buffers
     
    408401  movq mm2,mm0
    409402  pcmpeqb mm0,mm4 ; create mask
    410   pand  mm1,mm0 ; mask dest
    411   pandn mm2,mm0 ; mask source
    412   por   mm1,mm2 ; or them
    413   movd eax, mm1 ; write back result
    414   mov  byte ptr[edi+2],al
    415   shr eax,8
    416   mov  word ptr[edi],ax
     403  pand  mm1,mm0   ; mask dest
     404  pandn mm0,mm2  ; mask source
     405  por   mm1,mm ; or them
     406  movd  eax, mm1 ; write back result
     407  mov   byte ptr[edi+2], al
     408  shr   eax, 8
     409  mov   word ptr[edi], ax
    417410  jmp bltEndMMX8
    418411
    419412blt2MMX8:
    420413  mov  al, byte ptr [esi]
    421   cmp al,dl
    422   je  blt1aMMX8
     414  cmp  al, dl
     415  je   blt1aMMX8
    423416  mov  byte ptr [edi], al
    424   mov  bl , byte ptr [esi+1]
    425   cmp bl,dl
    426   je  bltEndMMX8
    427   mov  byte ptr [edi+1], bl
    428   jmp bltEndMMX8
     417;  mov  bl, byte ptr [esi+1]
     418;  cmp  bl, dl
     419;  je   bltEndMMX8
     420;  mov  byte ptr [edi+1], bl
     421;  jmp bltEndMMX8
    429422blt1aMMX8:
    430   add esi,1
    431   add edi,1
     423  add esi, 1
     424  add edi, 1
    432425blt1MMX8:
    433426  mov  al, byte ptr [esi]
    434   cmp al,dl
    435   je  bltEndMMX8
     427  cmp  al, dl
     428  je   bltEndMMX8
    436429  mov  byte ptr [edi], al
    437430
     
    461454  mov  edx, dword ptr [ebp+16]    ; colorkey
    462455  mov  edi, dword ptr [ebp+8]     ; dest
    463   mov  eax, dword ptr [ebp+16]    ; colorkey
    464   shr  edx,16;
    465456  mov  ecx, dword ptr [ebp+20]    ; linesize in pixel!
    466   mov  dx,ax                      ; extend colorkey to 32 Bit
     457
     458  mov  eax, edx
     459  shl  edx, 16;
     460  mov  dx, ax                     ; extend colorKey to 32 bit
     461
    467462  mov  esi, dword ptr [ebp+12]    ; src
    468463  mov  eax, ecx                   ; copy of linesize
     
    476471
    477472bltLoopMMX16:
    478   movq mm0,qword ptr [esi] ; get source dword
    479   movq mm1,qword ptr [edi] ; get destination
    480   movq mm2,mm0   ; copy source
    481   pcmpeqw mm0,mm4 ; create mask
    482   pand  mm1,mm0  ; mask dest
    483   add esi, 8
    484   pandn mm2,mm0  ; mask source
    485   por   mm1,mm2  ; or them
     473  movq mm0,qword ptr [esi]  ; get source dword
     474  movq mm1,qword ptr [edi]  ; get destination
     475  movq mm2,mm0              ; copy source
     476  pcmpeqw mm0,mm4           ; create mask in mm0
     477  pand  mm1,mm0             ; mask dest
     478  add   esi, 8              ; point to next source qword
     479  pandn mm0,mm2             ; NOT mask AND source
     480  por   mm1,mm0             ; or them
    486481  movq qword ptr [edi], mm1 ; write back result
    487482  add edi, 8
     
    505500  movd mm0, dword ptr[esi]
    506501  movd mm1, dword ptr[edi]
    507   movq mm2,mm0   ; copy source
     502  movq mm2,mm0    ; copy source
    508503  add esi,4
    509504  pcmpeqw mm0,mm4 ; create mask 16 bit
    510   pand  mm1,mm0 ; mask dest
    511   pandn mm2,mm0            ; mask source
     505  pand    mm1,mm0 ; mask dest
     506  pandn   mm0,mm2 ; mask source
    512507  add edi,4
    513   por   mm1,mm2 ; or them
     508  por   mm1,mm0 ; or them
    514509  movd  dword ptr[edi-4], mm1
    515510  jmp blt1MMX16
     
    521516  pcmpeqw mm0,mm4 ; create mask 16 bit
    522517  pand  mm1,mm0 ; mask dest
    523   pandn mm2,mm0             ; mask source
    524   por   mm1,mm2 ; or them
     518  pandn mm0,mm2             ; mask source
     519  por   mm1,mm0 ; or them
    525520  movd dword ptr [edi], mm1 ; write back result
    526521  jmp bltEndMMX16
     
    19421937  inc eax
    19431938Return:
     1939;  mov  eax, 0 ; pretend no MMX is available
    19441940  pop  edx
    19451941  pop  ecx
Note: See TracChangeset for help on using the changeset viewer.