Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <xmmintrin.h>
- int * pix32tbl;
- void
- _PsetL(int * ddscr, unsigned char * bkline)
- {
- register int i,acc, *ptrl,*ptrh;
- __m128 xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7;
- if (bkline == 0)
- {
- xmm0 = _mm_xor_ps(xmm0,xmm0);
- for (i = 0; i < 32; i++)
- {
- _mm_stream_ps(ddscr+0, xmm0);
- _mm_stream_ps(ddscr+4, xmm0);
- _mm_stream_ps(ddscr+8, xmm0);
- _mm_stream_ps(ddscr+12,xmm0);
- _mm_stream_ps(ddscr+16,xmm0);
- _mm_stream_ps(ddscr+20,xmm0);
- _mm_stream_ps(ddscr+24,xmm0);
- _mm_stream_ps(ddscr+28,xmm0);
- ddscr += 32;
- }
- return;
- }
- for (i = 0; i < 32; i++) {
- acc = bkline[0];
- ptrl = &pix32tbl[acc*8];
- acc = bkline[1];
- ptrh = &pix32tbl[acc*8];
- //
- // загрузка
- // 111111 222222 333333 444444
- // 111111 222222 333333 444444
- //
- xmm0 = _mm_load_ps(ptrl);
- xmm2 = _mm_load_ps(ptrl+4);
- xmm4 = _mm_load_ps(ptrh);
- xmm6 = _mm_load_ps(ptrh+4);
- xmm5 = xmm4;
- xmm7 = xmm6;
- xmm1 = xmm0;
- xmm3 = xmm2;
- //
- // преобразование
- // 111111 111111 222222 222222
- // 333333 333333 444444 444444
- //
- xmm0 = _mm_shuffle_ps(xmm0,xmm0,0x50);
- xmm1 = _mm_shuffle_ps(xmm1,xmm1,0xfa);
- xmm2 = _mm_shuffle_ps(xmm2,xmm2,0x50);
- xmm3 = _mm_shuffle_ps(xmm3,xmm3,0xfa);
- xmm4 = _mm_shuffle_ps(xmm4,xmm4,0x50);
- xmm5 = _mm_shuffle_ps(xmm5,xmm5,0xfa);
- xmm6 = _mm_shuffle_ps(xmm6,xmm6,0x50);
- xmm7 = _mm_shuffle_ps(xmm7,xmm7,0xfa);
- //
- // вывод
- //
- _mm_stream_ps(ddscr+0, xmm0);
- _mm_stream_ps(ddscr+4, xmm1);
- _mm_stream_ps(ddscr+8, xmm2);
- _mm_stream_ps(ddscr+12,xmm3);
- _mm_stream_ps(ddscr+16,xmm4);
- _mm_stream_ps(ddscr+20,xmm5);
- _mm_stream_ps(ddscr+24,xmm6);
- _mm_stream_ps(ddscr+28,xmm7);
- //
- ddscr += 4*8;
- bkline+= 2;
- }
- }
- /* */
- void DrawScreen(int BKScr,int ScrollReg)
- {
- // extern RECT WndRect;
- int *DDrawScr,y,ys;//,x;
- // проверить доступность и восстановление экранов
- if ( IDirectDrawSurface_IsLost(lpDDSBack) != S_OK )
- {
- IDirectDrawSurface_Restore(lpDDSBack);
- IDirectDrawSurface_Restore(lpDDSPrimary);
- }
- if ( IDirectDrawSurface_Lock(lpDDSBack,NULL, &ddsd,
- DDLOCK_SURFACEMEMORYPTR, 0) != S_OK) return;
- DDrawScr = (int*)ddsd.lpSurface;
- for (y = 0; y < 256; y++) {
- ys = (y-(ScrollReg-216)) & 0xFF ;
- _PsetL(DDrawScr+(ys*d_x),(unsigned char*)BKScr+y*64);
- // очистка неактивной части экрана в режиме "РП"
- if ( (y>63) && ((ScrollReg & 0x200) == 0) )
- _PsetL((int*)DDrawScr+(y*d_x),0);
- }
- if (IDirectDrawSurface_Unlock(lpDDSBack,NULL) != S_OK) return;
- //IDirectDraw_WaitForVerticalBlank(lpDD,1,0);
- if (IDirectDrawSurface_Blt(lpDDSPrimary, &WndRect,lpDDSBack,NULL, 0, NULL)
- == DDERR_SURFACELOST) IDirectDrawSurface_Restore(lpDDSPrimary);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement