ÀÌ°ÍÀº 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