ÀÌ°ÍÀº 1999³â ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °­ÁÂÀÔ´Ï´Ù.

                                              ¹ÙÀ̳ʸ® µ¥ÀÌÅÍ

#####################################################

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

´Ù¸§ ¾Æ´Ï¶ó À̹ø¿¡´Â MMX Technology ¸¦ ÀÌ¿ëÇÏ¿© DX »ó¿¡¼­ °í¼Ó ½ºÇÁ¶óÀÌÆ®¸¦
Âï´Â ¹ýÀ» ¼³¸íÇÏ°íÀÚ ÇÕ´Ï´Ù.

ÈçÈ÷ DX 256 Ä÷¯ ¸ðµå¿¡¼­ Ç¥¸éÀ» Lock ÇÏ¿© ±×°÷¿¡ ½ºÇÁ¶óÀÌÆ®¸¦ ¾²°íÀÚ ÇÑ´Ù¸é
¾ÐÃà ½ºÇÁ¶óÀÌÆ®¸¦ ¾²´øÁö ¾Æ´Ï¸é Á÷Á¢ 1 byte ¾¿ Åõ¸í»öÀÎÁö ¾Æ´ÑÁö¸¦ üũÇØ
°¡¸ç Á¡ ´ÜÀ§ ¿¬»êÀ» ÇÏ´Â °ÍÀÌ º¸ÅëÀ̾ú½À´Ï´Ù.

ÀÌ¿¡, Á¦°¡ ¼Ò°³ ÇÏ°íÀÚ ÇÏ´Â ÆÁÀº Åõ¸í»öÀÎÁö ÆǺ°Á¶Â÷ ÇÏÁö¾Ê°í¼­µµ 8 °³ÀÇ
½ºÇÁ¶óÀÌÆ® Çȼ¿À» µ¿½Ã¿¡ Àü¼ÛÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù.

ÀÏ´Ü ¿¹Àüó·³ Åõ¸í»öÀÎÁö ¾Æ´ÑÁö ÆǺ°ÇÏ´Â ºÎºÐÀÌ ¾ø¾îÁ³À¸¹Ç·Î 'je', 'jz' ¶ó´Â
¸í·É¾î·Î ÀÎÇÑ ºÐ±âÀÇ ºÎÇϸ¦ ÁÙÀÌ°í 1 byte ¾¿ ÇÏ´ø Àü¼ÛÀ» Çѹø¿¡ 8 bytes ¾¿
°¡´ÉÇÏ°Ô ÇØÁشٴ °Í¿¡ ±× ÀÇÀǸ¦ µÑ ¼ö°¡ ÀÖ½À´Ï´Ù.


Ç®¼Ò½º¿¡ µé¾î°¡±â Àü¿¡ ÇÙ½É ºÎºÐ¸¸ Ãß·Áº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

----------------------------------------------------------------------------


 >> ÀüÁ¦...

   esi     : ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ
   edi     : Lock µÈ Direct Draw Surface ÀÇ ¹Ì¸® °è»êµÈ ÁÖ¼Ò
   pMask   : char pMask[8] ·Î Á¤ÀǵǾî ÀÖÀ¸¸ç 8°³ÀÇ byte °¡ ¸ðµÎ Åõ¸í»ö
             Index ·Î ä¿öÁ® ÀÖ´Ù.


 >> ÄÚµå

   mov   ebx, pMask
   movq  mm4, [ebx]     // mm4 ¿¡ Åõ¸í»ö ¹øÈ£¸¦ ³Ö´Â´Ù

   mov   ecx, Size.X    // Size.X ¿¡´Â X ½ºÇÁ¶óÀÌÆ®ÀÇ x »çÀÌÁî°¡ µé¾î°¨
   shr   ecx, 3         // µ¿½Ã¿¡ 8°³ÀÇ Á¡À» ¿¬»êÇϹǷÎ

LOOP_X:
   movq  mm0, [edi]     // mm0 Àº Destination
   movq  mm1, [esi]     // mm1 Àº Source
   movq  mm2, mm1       // mm2 ¿¡ Source µ¥ÀÌÅ͸¦ º¹»ç
   pcmpeqb mm2, mm4     // mm2 ¿¡ Åõ¸í»ö¿¡ µû¸¥ ¸¶½ºÅ©¸¦ »ý¼º
   movq  mm3, mm2       // mm3 ¿¡ ¸¶½ºÅ©¸¦ Çϳª ´õº¹»ç
   pandn mm2, mm1       // Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸ º¹»ç
   pand  mm3, mm0       // Destination ÀÇ °»½ÅµÉ ºÎºÐ¸¸ Á¦°Å
   por   mm2, mm3       // Source ¿Í Destination À» °áÇÕ
   movq  [edi], mm2     // Destination ¿¡ °á°ú¸¦ ¾¸

   add   esi, 8         //  Çѹø¿¡ 8 bytes ¸¦ µ¿½Ã¿¡ ó¸®ÇßÀ¸¹Ç·Î
   add   edi, 8

   loop  LOOP_X


 >> ¼³¸í

   MMX Technology ´Â FPU ÀÇ ½ºÅà ÇÁ·¹ÀÓÀ» Àý´ë ¹øÁö·Î »ç¿ëÇÏ¿© 8 bytes Â¥¸®
   ·¹Áö½ºÅÍÀÎ mm0 ¿¡¼­ mm7 ±îÁöÀÇ 8 °³ÀÇ ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ´Â ±â¼úÀÔ´Ï´Ù.
   ±×¸®°í DSP ÀûÀÎ ¿ä¼Ò°¡ ¸¹¾Æ¼­ ( °öÇÏ°í µ¿½Ã¿¡ ´õÇÑ´Ù´øÁö.. ) ¸ÖƼ¹Ìµð¾î
   °è»ê¿¡ ÀûÇÕÇÏ´Ù°íµé ÇÏÁÒ.. ÇÏÁö¸¸ ³ÐÀº ÀǹÌÀÇ ¸ÖƼ¹Ìµð¾îÀÇ ÇѺоßÀÎ
   °ÔÀÓ¿¡¼­ ¿ª½Ã MMX Technology ´Â ¾ÆÁÖ À¯¿ëÇÏ°Ô ¾²À̴µ¥ ±× Áß ÇÑ ºÎºÐÀÌ
   ¹Ù·Î ÀÌÁ¦ ¼³¸íÇÏ·Á´Â '¹«ºÐ±â ½ºÇÁ¶óÀÌÆ® Ãâ·Â'ÀÔ´Ï´Ù.
                        ~~~~~~~~~~~~~~~~~~~~~~~~
   À§ÀÇ ¼Ò½º¿¡¼­ º¸½Ã´Ù½ÃÇÇ 8 bytes ¸¦ µ¿½Ã¿¡ Àü¼ÛÇϸ鼭µµ ÇÑÁ¡ ÇÑÁ¡ÀÌ
   Åõ¸í»öÀÎÁö ¾Æ´ÑÁö¸¦ üũÇÏÁö ¾Ê°í ¹Ù·Î ¿¬»êÀ» ÇÕ´Ï´Ù.

   ¿¹Àü °°À¸¸é,

      mov  ecx, Size.X

   LOOP_X:

      cmp  ptr byte [esi], TRANSPARENCY_COLOR
      je   SKIP

      mov  ptr byte [edi], al

   SKIP:
      inc  esi

      loop LOOP_X

   ÀÌ·± ½ÄÀÌ µÇ¾î¼­ Á¡ÀÇ ¼ö¸¸Å­ 'cmp'¸¦ Çؾ߸¸ Çß¾ú½À´Ï´Ù.


 >> ÄÚµåºÐ¼®

   °¡Àå ÄÚ¾î ºÎºÐ¸¸ º¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

   - movq  mm0, [edi]

     mm0 ·¹Áö½ºÅÍ¿¡ edi °¡ °¡¸®Å°´Â µ¥ÀÌÅÍÁß 8 bytes ¸¦ °¡Á® ¿É´Ï´Ù.

     ¿¹>   mm0   =>   43 2D 1A E4 54 78 20 CA

   - movq  mm1, [esi]

     mm0 ·¹Áö½ºÅÍ¿¡ esi °¡ °¡¸®Å°´Â µ¥ÀÌÅÍÁß 8 bytes ¸¦ °¡Á® ¿É´Ï´Ù.

     ¿¹>   mm2   =>  10 2F F8 80 80 3D 80 CE

   - movq  mm2, mm1

     mm2 ·¹Áö½ºÅÍ¿¡ mm1 ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» Ä«ÇÇÇÕ´Ï´Ù.
     ¼Ò½º µ¥ÀÌÅÍ¿¡¼­ Åõ¸í»ö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò±â À§Çؼ­ÀÔ´Ï´Ù.

   - pcmpeqb mm2, mm4

     À§¿¡ º¸½Ã¸é ÀÌ¹Ì mm4 ¿¡´Â 1byte Â¥¸® ¸¶½ºÅ©·Î 8bytes °¡ ä¿öÁ® ÀÖ½À´Ï´Ù.
     'pcmpeqb' ¸í·ÉÀº byte ´ÜÀ§·Î 8 °³ÀÇ °¢ byte °¡ °°ÀºÁö °°Áö ¾ÊÀºÁö¸¦
     ÆǺ°ÇÕ´Ï´Ù. ±×·¡¼­ ¸¸¾à °ªÀÌ °°´Ù¸é ±× byte´Â ¸ðµÎ 1·Î ä¿ì°í ±×·¸Áö
     ¾Ê´Ù¸é ¸ðµÎ 0À¸·Î ä¿ó´Ï´Ù/

     ¿¹>     mm2   =>   10 2F F8 80 80 3D 80 CE
             mm4   =>   80 80 80 80 80 80 80 80   ( Åõ¸í»öÀÌ 0x80 À϶§ )

      °á°ú   mm2   =>   00 00 00 FF FF 00 FF 00

   - movq  mm3, mm2

     ÀÌ·¸°Ô ¸¸µé¾îÁø ¸¶½ºÅ©¸¦ mm3 ¿¡ Çϳª ´õ º¹»çÇÕ´Ï´Ù.

   - pandn mm2, mm1       // Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸ º¹»ç

     'pandn' ¸í·É¾î´Â mm2 ¸¦ ¹ÝÀüÇÑÈÄ ±× mm2 ¿Í mm1 ¸¦ and Çؼ­ mm2 ·Î
     ³Ö½À´Ï´Ù.

     ¿¹>     mm2    =>   00 00 00 FF FF 00 FF 00
             mm2    =>   FF FF FF 00 00 FF 00 FF  ( ¹ÝÀü )
             mm1    =>   10 2F F8 80 80 3D80 CE

      °á°ú   mm2    =>   10 2F F8 00 00 3D 00 CE  ( mm2 & mm1 )

     °á°ú¿¡¼­ º¸½Ã¸é ¾Æ½Ã°ÚÁö¸¸ ¿ø ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ¿¡¼­ Åõ¸í»ö ºÎºÐ¸¸
     '00' ÀÌ µÇ¾ú´Ù´Â °ÍÀ» ¾Ë °ÍÀÔ´Ï´Ù.

   - pand  mm3, mm0

     'pand' ¸í·É¾î´Â mm3 ¿Í mm0 ¸¦ and ¿¬»êÇÏ¿© mm3 ¿¡ ³Ö½À´Ï´Ù.

     ¿¹>     mm3    =>   00 00 00 FF FF 00 FF 00
             mm0    =>   43 2D 1A E4 54 78 20 CA

      °á°ú   mm3    =>   00 00 00 E4 54 00 20 00

   - por   mm2, mm3

     'por' ¸í·É¾î´Â mm2 ¿Í mm3 ¸¦ or ¿¬»êÇÏ¿© mm2 ¿¡ ³Ö½À´Ï´Ù.

     ¿¹>     mm3    =>   00 00 00 E4 54 00 20 00
             mm2    =>   10 2F F8 00 00 3D 00 CE

      °á°ú   mm2    =>   10 2F F8 E4 54 3D 20 CE

   - movq  [edi], mm2

     edi °¡ °¡¸®Å°´Â ÁÖ¼Ò¿¡ mm2 ÀÇ ³»¿ë 8 bytes ¸¦ ¾´´Ù.


   ÀÌ·¸°Ô Çؼ­ °á±¹Àº ¾Æ·¡ÀÇ °á°ú¸¦ ³À´Ï´Ù.

             [edi]   =>   43 2D 1A E4 54 78 20 CA ( ¹è°æ )
             [esi]   =>   10 2F F8 80 80 3D 80 CE ( ½ºÇÁ¶óÀÌÆ®, Åõ¸í»ö 80 )

             [edi]   =>   10 2F F8 E4 54 3D 20 CE
                                   ~~ ~~    ~~    ( Åõ¸í»öÀ̾ú´ø ºÎºÐ¸¸
                                                    ¹è°æÀ¸·Î ġȯ         )

----------------------------------------------------------------------------

Á¦ ³ª¸§´ë·Î´Â ¿­½ÉÈ÷ ¼³¸íÀ» µå¸°´Ù°í Çϱä Çߴµ¥ Á¦´ë·Î ÀÌÇØ°¡ µÇ¼Ì´ÂÁö
¸ð¸£°Ú³×¿ä...

±×¸®°í Á¦°¡ 8 bit Ä÷¯ ¸ðµå¿¡ ´ëÇؼ­¸¸ ¼³¸íÇߴµ¥.. 16bit ¸ðµå³ª Æ®·çÄ÷¯
¸ðµå¿¡¼­µµ ¶È°°ÀÌ Àû¿ëµË´Ï´Ù. ´Ü 'pcmpeqb' ¶ó´Â ¸í·É¾î°¡ 2bytes, 4bytes ¾¿
ºñ±³ÇÏ´Â 'pcmpeqw', 'pcmpeqd' ·Î ¼öÁ¤ÇÏ½Ã¸é µË´Ï´Ù.

±×¸®°í ¾Æ·¡´Â ¼Ò½ºÀÔ´Ï´Ù. Á¦°¡ µµ½º ¶§´Â Á¾Á¾ C ¹öÀüµµ °°ÀÌ ¿Ã¸®°ï Çߴµ¥
À©µµ¿ì·Î °¡¸é¼­ºÎÅÍ´Â Á¦°¡ Å×½ºÆ®Çغ¼ C ÄÄÆÄÀÏ·¯°¡ ¾ø¾î¼­ ±×³É 'µ¨ÆÄÀÌ'
¼Ò½º·Î¸¸ ¿Ã¸³´Ï´Ù. ¶æÀÌ ÀÖÀ¸½Å C À¯Àú ºÐµéÀº ¹ø¿ªÇؼ­ Àß »ç¿ëÇØ º¸¼¼¿ä..

±×¸®°í µ¨ÆÄÀÌ·ÎµÈ ½ÇÇà Å×½ºÆ® ÆÄÀÏ°ú Ç® ¼Ò½º´Â ÀÚ·á½Ç¿¡ ¿Ã¸®°Ú½À´Ï´Ù.

½Ã°£ÀÌ µÈ´Ù¸é MMX ÄÚµå·Î 3D Çà·Ä Çѹø¿¡ °è»ê ÇÏ´Â °Å³ª ¾Æ´Ï¸é MMX °í¼Ó
¾ËÆÄ ºí·»µù ±â¼úµµ ½á º¸°Ú½À´Ï´Ù.... ¾Æ´Ï¸é Direct Music ÂÊÀÌ µÉ·±Áöµµ..

±×·³.. SMgal.


----------------------------------------------------------------------------

¿©±â´Â °¢°¢ ¼­Çǽº¿¡¼­ Á÷Á¢ ÀоúÁö¸¸ ½ÇÁ¦·Ð ½ºÇÁ¶óÀÌÆ®°¡ À¯Àú µ¥ÀÌÅÍÇüÀ¸·Î
µé¾î°¡°Ô µÇ°ÚÁÒ... ( ÀÌ°Ç Å×½ºÆ®¶ó¼­ Surface »ç¿ëÇßÀ½.. )

procedure   SpriteCopy(DestX, DestY : integer;
                       SourX, SourY : integer;
                       Size         : TPoint;
                       Sour, Dest   : IDirectDrawSurface);
const
   TRANSPARENCY_VALUE  = 80; // Åõ¸í»öÀÌ 80¹ø À妽ºÀÌ´Ù.
var
   SourDesc, DestDesc  : TDDSurfaceDesc;
   pSour, pDest, pMask : PByte;
   Transparency        : array[1..8] of byte;
begin

   FillChar(Transparency,8,TRANSPARENCY_VALUE);

   SourDesc.dwSize := SizeOf(TDDSurfaceDesc);
   with Basic do repeat
   until MakeItSo(Sour.Lock(PRect(nil)^,SourDesc,DDLOCK_SURFACEMEMORYPTR +
                                                 DDLOCK_WAIT,0));

   DestDesc.dwSize := SizeOf(TDDSurfaceDesc);
   with Basic do repeat
   until MakeItSo(Dest.Lock(PRect(nil)^,DestDesc,DDLOCK_SURFACEMEMORYPTR +
             DDLOCK_WAIT,0));

   pSour := PByte(DWORD(SourDesc.lpSurface) + SourY*SourDesc.lPitch + SourX);
   pDest := PByte(DWORD(DestDesc.lpSurface) + DestY*DestDesc.lPitch + DestX);
   pMask := Pointer(@Transparency);

   asm
         push  esi
         push  edi

         mov   esi, pMask
         db $0F,$6F,$26       /// movq  mm4, [esi]
                              //  mm4 ¿¡ Åõ¸í»ö ¹øÈ£¸¦ ³Ö´Â´Ù
         mov   esi, pSour
         mov   edi, pDest

         mov   ecx, Size.Y

   @@LOOP_Y:

         push  ecx

         mov   ecx, Size.X
         shr   ecx, 3         // µ¿½Ã¿¡ 8°³ÀÇ Á¡À» ¿¬»êÇϹǷÎ


   @@LOOP_X:

         db $0F,$6F,$07       /// movq  mm0, [edi]
                              //  mm0 Àº Destination
         db $0F,$6F,$0E       /// movq  mm1, [esi]
                              //  mm1 Àº Source
         db $0F,$6F,$D1       /// movq  mm2, mm1
                              //  mm2 ¿¡ Source µ¥ÀÌÅ͸¦ º¹»ç
         db $0F,$74,$D4       /// pcmpeqb mm2, mm4
                              //  mm2 ¿¡ Åõ¸í»ö¿¡ µû¸¥ ¸¶½ºÅ©¸¦ »ý¼º
         db $0F,$6F,$DA       /// movq  mm3, mm2
                              //  mm3 ¿¡ ¸¶½ºÅ©¸¦ Çϳª ´õ º¹»ç
         db $0F,$DF,$D1       /// pandn mm2, mm1
                              //  Source ½ºÇÁ¶óÀÌÆ® ºÎºÐ¸¸À» ³²±è
         db $0F,$DB,$D8       /// pand  mm3, mm0
                              //  Destination ÀÇ °»½ÅµÉ ºÎºÐ¸¸ Á¦°Å
         db $0F,$EB,$D3       /// por   mm2, mm3
                              //  Source ¿Í Destination À» °áÇÕ
         db $0F,$7F,$17       /// movq  [edi], mm2
                              //  Destination ¿¡ °á°ú¸¦ ¾¸

         add   esi, 8
                              //  Çѹø¿¡ 8 bytes ¸¦ µ¿½Ã¿¡ ó¸®ÇßÀ¸¹Ç·Î
         add   edi, 8

         loop  @@LOOP_X

         add   esi, SourDesc.lPitch
         sub   esi, Size.X
         add   edi, DestDesc.lPitch
         sub   edi, Size.X

         pop   ecx
         loop  @@LOOP_Y

         db $0F,$77              /// emms

         pop   edi
         pop   esi

   end;

   Sour.UnLock(SourDesc.lpSurface);
   Dest.UnLock(DestDesc.lpSurface);

end;

----------------------------------------------------------------------------

             " A Mountain is a mountain, Water is water "


                                              copyright SMgal 1999/05/24