Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.96 KB | None | 0 0
  1. #include <xmmintrin.h>
  2.  
  3. int * pix32tbl;
  4.  
  5. void
  6.  
  7. _PsetL(int * ddscr, unsigned char * bkline)
  8. {
  9.  
  10.   register int i,acc, *ptrl,*ptrh;
  11.  
  12.    __m128 xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7;
  13.  
  14.  
  15.   if (bkline == 0)
  16.   {
  17.  
  18.    xmm0 = _mm_xor_ps(xmm0,xmm0);
  19.  
  20.    for (i = 0; i < 32; i++)
  21.     {
  22.    _mm_stream_ps(ddscr+0, xmm0);
  23.    _mm_stream_ps(ddscr+4, xmm0);
  24.    _mm_stream_ps(ddscr+8, xmm0);
  25.    _mm_stream_ps(ddscr+12,xmm0);
  26.    _mm_stream_ps(ddscr+16,xmm0);
  27.    _mm_stream_ps(ddscr+20,xmm0);
  28.    _mm_stream_ps(ddscr+24,xmm0);
  29.    _mm_stream_ps(ddscr+28,xmm0);
  30.  
  31.     ddscr += 32;
  32.     }
  33.     return;
  34.   }
  35.  
  36.    for (i = 0; i < 32; i++) {
  37.  
  38.     acc = bkline[0];
  39.     ptrl = &pix32tbl[acc*8];
  40.     acc = bkline[1];
  41.     ptrh = &pix32tbl[acc*8];
  42. //
  43. // загрузка
  44. // 111111 222222 333333 444444
  45. // 111111 222222 333333 444444
  46. //
  47.     xmm0 = _mm_load_ps(ptrl);
  48.     xmm2 = _mm_load_ps(ptrl+4);
  49.     xmm4 = _mm_load_ps(ptrh);
  50.     xmm6 = _mm_load_ps(ptrh+4);
  51.  
  52.     xmm5  = xmm4;
  53.     xmm7  = xmm6;
  54.     xmm1  = xmm0;
  55.     xmm3  = xmm2;
  56. //
  57. // преобразование
  58. // 111111 111111 222222 222222
  59. // 333333 333333 444444 444444
  60. //
  61.     xmm0 = _mm_shuffle_ps(xmm0,xmm0,0x50);
  62.     xmm1 = _mm_shuffle_ps(xmm1,xmm1,0xfa);
  63.     xmm2 = _mm_shuffle_ps(xmm2,xmm2,0x50);
  64.     xmm3 = _mm_shuffle_ps(xmm3,xmm3,0xfa);
  65.     xmm4 = _mm_shuffle_ps(xmm4,xmm4,0x50);
  66.     xmm5 = _mm_shuffle_ps(xmm5,xmm5,0xfa);
  67.     xmm6 = _mm_shuffle_ps(xmm6,xmm6,0x50);
  68.     xmm7 = _mm_shuffle_ps(xmm7,xmm7,0xfa);
  69. //
  70. // вывод
  71. //
  72.    _mm_stream_ps(ddscr+0, xmm0);
  73.    _mm_stream_ps(ddscr+4, xmm1);
  74.    _mm_stream_ps(ddscr+8, xmm2);
  75.    _mm_stream_ps(ddscr+12,xmm3);
  76.    _mm_stream_ps(ddscr+16,xmm4);
  77.    _mm_stream_ps(ddscr+20,xmm5);
  78.    _mm_stream_ps(ddscr+24,xmm6);
  79.    _mm_stream_ps(ddscr+28,xmm7);
  80. //
  81.     ddscr += 4*8;
  82.     bkline+= 2;
  83.   }
  84. }
  85.  
  86. /*     */
  87. void DrawScreen(int BKScr,int ScrollReg)
  88. {
  89. //   extern RECT WndRect;
  90.    int *DDrawScr,y,ys;//,x;
  91.  
  92. // проверить доступность и восстановление экранов
  93.   if ( IDirectDrawSurface_IsLost(lpDDSBack) != S_OK )
  94.   {
  95.     IDirectDrawSurface_Restore(lpDDSBack);
  96.     IDirectDrawSurface_Restore(lpDDSPrimary);
  97.   }
  98.  
  99.   if ( IDirectDrawSurface_Lock(lpDDSBack,NULL, &ddsd,
  100.                                DDLOCK_SURFACEMEMORYPTR, 0) != S_OK) return;
  101.        DDrawScr = (int*)ddsd.lpSurface;
  102.  
  103.  
  104.        for (y = 0; y < 256; y++) {
  105.             ys = (y-(ScrollReg-216)) & 0xFF ;
  106.  
  107.             _PsetL(DDrawScr+(ys*d_x),(unsigned char*)BKScr+y*64);
  108.       // очистка неактивной части экрана в режиме "РП"
  109.             if ( (y>63) && ((ScrollReg & 0x200) == 0) )
  110.             _PsetL((int*)DDrawScr+(y*d_x),0);
  111.        }
  112.  
  113.   if (IDirectDrawSurface_Unlock(lpDDSBack,NULL) != S_OK) return;
  114.       //IDirectDraw_WaitForVerticalBlank(lpDD,1,0);
  115.   if (IDirectDrawSurface_Blt(lpDDSPrimary, &WndRect,lpDDSBack,NULL, 0, NULL)
  116.     == DDERR_SURFACELOST) IDirectDrawSurface_Restore(lpDDSPrimary);
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement