diff --git a/zsnes/src/linux/sdllink.c b/zsnes/src/linux/sdllink.c index e513c2d1..917dcee9 100644 --- a/zsnes/src/linux/sdllink.c +++ b/zsnes/src/linux/sdllink.c @@ -136,10 +136,10 @@ _int64 start, end, freq, update_ticks_pc, start2, end2, update_ticks_pc2; extern unsigned char pressed[]; - void drawscreenwin(void); - void Init_2xSaI(UINT32 BitFormat); - DWORD LastUsedPos=0; - DWORD CurMode=-1; +void drawscreenwin(void); +void Init_2xSaI(UINT32 BitFormat); +DWORD LastUsedPos=0; +DWORD CurMode=-1; DWORD InputEn=0; BOOL InputAcquire(void) @@ -207,17 +207,14 @@ int Main_Proc(void) switch(event.type) { case SDL_KEYDOWN: - if(event.key.keysym.sym == SDLK_ESCAPE) - { - SDL_Quit(); - exit(0); - } else { - if (pressed[event.key.keysym.sym]!=2) - pressed[event.key.keysym.sym]=1; - } + if (event.key.keysym.scancode-8 > 0) { + if (pressed[event.key.keysym.scancode-8]!=2) + pressed[event.key.keysym.scancode-8]=1; + } break; case SDL_KEYUP: - pressed[event.key.keysym.sym]=0; + if (event.key.keysym.scancode-8 > 0) + pressed[event.key.keysym.scancode-8]=0; break; } } @@ -1775,19 +1772,19 @@ void clearwin() DWORD i,j,color32; DWORD *SURFDW; -#ifdef __LINUX__ Temp1=LockSurface(); if(Temp1==0) { return; } - STUB_FUNCTION; SurfBufD=(DWORD) &SurfBuf[0]; SURFDW=(DWORD *) &SurfBuf[0]; switch(BitDepth) { case 16: -/* + // TODO - This code crashes zsnes - DDOI + STUB_FUNCTION; + /* __asm__ __volatile__ (" - pushl %%es + pushw %%es movw %%ds, %%ax movw %%ax, %%es xorl %%eax, %%eax @@ -1796,17 +1793,21 @@ void clearwin() Blank2: xorl %%eax, %%eax movl SurfaceX, %%ecx - rep stosw + rep + stosw addl Temp1, %%edi subl SurfaceX, %%edi subl SurfaceX, %%edi addl $1, %%ebx cmpl SurfaceX, %%ebx jne Blank2 + popw %%es " : : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi"); + */ break; - */ case 32: + // TODO - intel2gas this - DDOI + STUB_FUNCTION; /* _asm { push es @@ -1832,60 +1833,6 @@ void clearwin() break; } UnlockSurface(); -#else - Temp1=LockSurface(); - if(Temp1==0) { return; } - - SurfBufD=(DWORD) &SurfBuf[0]; - SURFDW=(DWORD *) &SurfBuf[0]; - - switch(BitDepth) - { - case 16: - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov edi,SurfBufD - xor ebx,ebx - Blank2: - xor eax,eax - mov ecx,SurfaceX - rep stosw - add edi,Temp1 - sub edi,SurfaceX - sub edi,SurfaceX - add ebx,1 - cmp ebx,SurfaceY - jne Blank2 - } - break; - case 32: - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov edi,SurfBufD - xor ebx,ebx - Blank3: - xor eax,eax - mov ecx,SurfaceX - rep stosd - add edi,Temp1 - sub edi,SurfaceX - sub edi,SurfaceX - sub edi,SurfaceX - sub edi,SurfaceX - add ebx,1 - cmp ebx,SurfaceY - jne Blank3 - } - break; - } - UnlockSurface(); -#endif } void drawscreenwin(void) @@ -1900,8 +1847,6 @@ void drawscreenwin(void) // the value of newengen is equal to 1. // (see ProcessTransparencies in newgfx16.asm // for ZSNES' current transparency code) -#ifdef __LINUX__ - //STUB_FUNCTION; UpdateVFrame(); if(curblank!=0) return; @@ -2050,10 +1995,113 @@ void drawscreenwin(void) switch(BitDepth) { case 16: + // TODO - convert this assembly - DDOI if (FPUCopy) { STUB_FUNCTION; + /* + _asm { + push es + mov ax,ds + mov es,ax + xor eax,eax + xor ebx,ebx + mov esi,ScreenPtr + mov edi,SurfBufD + Blank1MMX: + xor eax,eax + mov ecx,160 + rep stosd + sub edi,640 + add edi,Temp1 + add ebx,1 + cmp ebx,8 + jne Blank1MMX + xor ebx,ebx + pxor mm0,mm0 + Copying2MMX: + mov ecx,4 + MMXLoopA: + movq [edi],mm0 + movq [edi+8],mm0 + add edi,16 + dec ecx + jnz MMXLoopA + mov ecx,32 + MMXLoopB: + movq mm1,[esi] + movq mm2,[esi+8] + movq [edi],mm1 + movq [edi+8],mm2 + add esi,16 + add edi,16 + dec ecx + jnz MMXLoopB + mov ecx,4 + MMXLoopC: + movq [edi],mm0 + movq [edi+8],mm0 + add edi,16 + dec ecx + jnz MMXLoopC + inc ebx + add edi,Temp1 + sub edi,640 + sub esi,512 + add esi,576 + cmp ebx,223 + jne Copying2MMX + + xor eax,eax + mov ecx,128 + rep stosd + pop es + emms + } + */ } else { STUB_FUNCTION; + /* + _asm { + push es + mov ax,ds + mov es,ax + xor eax,eax + xor ebx,ebx + mov esi,ScreenPtr + mov edi,SurfBufD + Blank1: + xor eax,eax + mov ecx,160 + rep stosd + sub edi,640 + add edi,Temp1 + add ebx,1 + cmp ebx,8 + jne Blank1 + xor ebx,ebx + Copying2: + xor eax,eax + mov ecx,16 + rep stosd + mov ecx,128 + rep movsd + xor eax,eax + mov ecx,16 + rep stosd + inc ebx + add edi,Temp1 + sub edi,640 + sub esi,512 + add esi,576 + cmp ebx,223 + jne Copying2 + + xor eax,eax + mov ecx,128 + rep stosd + pop es + } + */ } break; case 32: @@ -2159,392 +2207,6 @@ void drawscreenwin(void) } UnlockSurface(); -#else - UpdateVFrame(); - if(curblank!=0) return; - - Temp1=LockSurface(); - if(Temp1==0) { return; } - - ScreenPtr=vidbuffer; - ScreenPtr+=16*2+32*2+256*2; - SurfBufD=(DWORD) &SurfBuf[0]; - SURFDW=(DWORD *) &SurfBuf[0]; - if(SurfaceX==256&&SurfaceY==224) - { - switch(BitDepth) - { - case 16: - if (FPUCopy){ - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov esi,ScreenPtr - mov edi,SurfBufD - Copying3: - mov ecx,32 - CopyLoop: - movq mm0,[esi] - movq mm1,[esi+8] - movq [edi],mm0 - movq [edi+8],mm1 - add esi,16 - add edi,16 - dec ecx - jnz CopyLoop - inc eax - add edi,Temp1 - sub edi,512 - sub esi,512 - add esi,576 - cmp eax,223 - jne Copying3 - - xor eax,eax - mov ecx,128 - rep stosd - pop es - emms - } - } else { - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov esi,ScreenPtr - mov edi,SurfBufD - Copying: - mov ecx,128 - rep movsd - inc eax - add edi,Temp1 - sub edi,512 - sub esi,512 - add esi,576 - cmp eax,223 - jne Copying - - xor eax,eax - mov ecx,128 - rep stosd - pop es - } - } - break; - case 32: - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov ebx,BitConv32Ptr - mov esi,ScreenPtr - mov edi,SurfBufD - Copying32b: - mov ecx,256 - push eax - xor eax,eax - CopyLoop32b: - mov ax,[esi] - add esi,2 - mov edx,[ebx+eax*4] - mov [edi],edx - add edi,4 - loop CopyLoop32b - pop eax - inc eax - add edi,Temp1 - sub edi,1024 - sub esi,512 - add esi,576 - cmp eax,223 - jne Copying32b - pop es - } - - -/* for(j=0;j<223;j++) - { - for(i=0;i<256;i++) - { - color32=(((*(WORD *)(ScreenPtr))&0xF800)<<8)+ - (((*(WORD *)(ScreenPtr))&0x07E0)<<5)+ - (((*(WORD *)(ScreenPtr))&0x001F)<<3)+0x7F000000; - SURFDW[i]=color32; - ScreenPtr+=2; - } - ScreenPtr=ScreenPtr+576-512; - SURFDW=(DWORD *) &SurfBuf[j*Temp1]; - } */ - - SURFDW=(DWORD *) &SurfBuf[222*Temp1]; - color32=0x7F000000; - - for(i=0;i<256;i++) - { - SURFDW[i]=color32; - } - - SURFDW=(DWORD *) &SurfBuf[223*Temp1]; - color32=0x7F000000; - - for(i=0;i<256;i++) - { - SURFDW[i]=color32; - } - break; - case 24: - MessageBox (NULL, "Sorry. ZSNESw does not work in windowed 24 bit -color modes. \nClick 'OK' to switch to a full screen mode.", "DDRAW Error" , -MB_ICONERROR ); - cvidmode=3; - initwinvideo(); - Sleep(1000); - drawscreenwin(); - break; - default: - UnlockSurface(); - MessageBox (NULL, "Mode only available in 16 and 32 bit color", -"DDRAW Error" , MB_ICONERROR ); - cvidmode=2; - initwinvideo(); - Sleep(1000); - drawscreenwin(); -// exit(0); - break; - } - } - - if(SurfaceX==320&&SurfaceY==240) - { - switch(BitDepth) - { - case 16: - if (FPUCopy){ - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - xor ebx,ebx - mov esi,ScreenPtr - mov edi,SurfBufD - Blank1MMX: - xor eax,eax - mov ecx,160 - rep stosd - sub edi,640 - add edi,Temp1 - add ebx,1 - cmp ebx,8 - jne Blank1MMX - xor ebx,ebx - pxor mm0,mm0 - Copying2MMX: - mov ecx,4 - MMXLoopA: - movq [edi],mm0 - movq [edi+8],mm0 - add edi,16 - dec ecx - jnz MMXLoopA - mov ecx,32 - MMXLoopB: - movq mm1,[esi] - movq mm2,[esi+8] - movq [edi],mm1 - movq [edi+8],mm2 - add esi,16 - add edi,16 - dec ecx - jnz MMXLoopB - mov ecx,4 - MMXLoopC: - movq [edi],mm0 - movq [edi+8],mm0 - add edi,16 - dec ecx - jnz MMXLoopC - inc ebx - add edi,Temp1 - sub edi,640 - sub esi,512 - add esi,576 - cmp ebx,223 - jne Copying2MMX - - xor eax,eax - mov ecx,128 - rep stosd - pop es - emms - } - } else { - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - xor ebx,ebx - mov esi,ScreenPtr - mov edi,SurfBufD - Blank1: - xor eax,eax - mov ecx,160 - rep stosd - sub edi,640 - add edi,Temp1 - add ebx,1 - cmp ebx,8 - jne Blank1 - xor ebx,ebx - Copying2: - xor eax,eax - mov ecx,16 - rep stosd - mov ecx,128 - rep movsd - xor eax,eax - mov ecx,16 - rep stosd - inc ebx - add edi,Temp1 - sub edi,640 - sub esi,512 - add esi,576 - cmp ebx,223 - jne Copying2 - - xor eax,eax - mov ecx,128 - rep stosd - pop es - } - } - break; - case 32: - for(j=0;j<8;j++) - { - SURFDW=(DWORD *) &SurfBuf[j*Temp1]; - color32=0x7F000000; - - for(i=0;i<320;i++) - { - SURFDW[i]=color32; - } - } - - for(j=8;j<223+8;j++) - { - color32=0x7F000000; - for(i=0;i<32;i++) - { - SURFDW[i]=color32; - } - - for(i=32;i<(256+32);i++) - { - color32=(((*(WORD *)(ScreenPtr))&0xF800)<<8)+ - (((*(WORD *)(ScreenPtr))&0x07E0)<<5)+ - (((*(WORD *)(ScreenPtr))&0x001F)<<3)+0x7F000000; -// SURFDW[i]=color32; - ScreenPtr+=2; - } - - color32=0x7F000000; - for(i=(256+32);i<320;i++) - { - SURFDW[i]=color32; - } - - ScreenPtr=ScreenPtr+576-512; - SURFDW=(DWORD *) &SurfBuf[(j)*Temp1]; - } - - for(j=(223+8);j<240;j++) - { - SURFDW=(DWORD *) &SurfBuf[j*Temp1]; - - color32=0x7F000000; - for(i=0;i<320;i++) - { - SURFDW[i]=color32; - } - } - break; - default: - UnlockSurface(); - MessageBox (NULL, "Mode only available in 16 and 32 bit color", -"DDRAW Error" , MB_ICONERROR ); - cvidmode=2; - initwinvideo(); - Sleep(1000); - drawscreenwin(); -// exit(0); - break; - } - } - - if(SurfaceX==512&&SurfaceY==448) - { - switch(BitDepth) - { - case 16: - AddEndBytes=Temp1-1024; - NumBytesPerLine=Temp1; - WinVidMemStart=&SurfBuf[0]; - _asm - { - pushad - call copy640x480x16bwin - popad - } - break; - default: - UnlockSurface(); - MessageBox (NULL, "Mode only available in 16 bit color", "DDRAW -Error" , MB_ICONERROR ); - cvidmode=2; - initwinvideo(); - Sleep(1000); - drawscreenwin(); -// exit(0); - } - } - - if(SurfaceX==640&&SurfaceY==480) - { - switch(BitDepth) - { - case 16: - AddEndBytes=Temp1-1024; - NumBytesPerLine=Temp1; - WinVidMemStart=&SurfBuf[16*640*2+64*2]; - _asm - { - pushad - call copy640x480x16bwin - popad - } - break; - default: - UnlockSurface(); - MessageBox (NULL, "Mode only available in 16 bit color", "DDRAW -Error" , MB_ICONERROR ); - cvidmode=2; - initwinvideo(); - Sleep(1000); - drawscreenwin(); -// exit(0); - } - } - - - UnlockSurface(); -#endif }