major changes. relnev got auto bpp detect working and implemented the

remaining vidmodes.  I started work on getting dialogs to work right.
This commit is contained in:
theoddone33
2001-04-16 06:05:21 +00:00
parent b5dd537a0a
commit bc0d38abbc

View File

@@ -104,7 +104,6 @@ DWORD S12Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
DWORD CurrentJoy=0; DWORD CurrentJoy=0;
DWORD BitDepth; DWORD BitDepth;
DWORD GBitMask;
BYTE BackColor=0; BYTE BackColor=0;
DEVMODE mode; DEVMODE mode;
@@ -197,6 +196,9 @@ void ExitFunction(void)
} }
#ifdef __LINUX__ // AH #ifdef __LINUX__ // AH
int shiftptr = 0;
void ProcessKeyBuf(int scancode);
int Main_Proc(void) int Main_Proc(void)
{ {
// TODO: Main event loop // TODO: Main event loop
@@ -207,12 +209,19 @@ int Main_Proc(void)
switch(event.type) switch(event.type)
{ {
case SDL_KEYDOWN: case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_LSHIFT ||
event.key.keysym.sym == SDLK_RSHIFT)
shiftptr = 1;
if (event.key.keysym.scancode-8 > 0) { if (event.key.keysym.scancode-8 > 0) {
if (pressed[event.key.keysym.scancode-8]!=2) if (pressed[event.key.keysym.scancode-8]!=2)
pressed[event.key.keysym.scancode-8]=1; pressed[event.key.keysym.scancode-8]=1;
ProcessKeyBuf(event.key.keysym.sym);
} }
break; break;
case SDL_KEYUP: case SDL_KEYUP:
if (event.key.keysym.sym == SDLK_LSHIFT ||
event.key.keysym.sym == SDLK_RSHIFT)
shiftptr = 0;
if (event.key.keysym.scancode-8 > 0) if (event.key.keysym.scancode-8 > 0)
pressed[event.key.keysym.scancode-8]=0; pressed[event.key.keysym.scancode-8]=0;
break; break;
@@ -220,6 +229,92 @@ int Main_Proc(void)
} }
return TRUE; return TRUE;
} }
#define true 1
void ProcessKeyBuf(int scancode)
{
int accept = 0;
int vkeyval;
if (((scancode>='A') && (scancode<='Z')) ||
((scancode>='a') && (scancode<='z')) || (scancode==27) ||
(scancode==32) || (scancode==8) || (scancode==13) || (scancode==9)) {
accept=true; vkeyval=scancode;
}
if ((scancode>='0') && (scancode<='9')) {
accept=1; vkeyval=scancode;
if (shiftptr) {
switch (scancode) {
case '1': vkeyval='!'; break;
case '2': vkeyval='@'; break;
case '3': vkeyval='#'; break;
case '4': vkeyval='$'; break;
case '5': vkeyval='%'; break;
case '6': vkeyval='^'; break;
case '7': vkeyval='&'; break;
case '8': vkeyval='*'; break;
case '9': vkeyval='('; break;
case '0': vkeyval=')'; break;
}
}
}
if ((scancode>=256) && (scancode<=265)) {
accept=true; vkeyval=scancode-256+'0';
}
if (!shiftptr){
switch (scancode) {
// Fix these for proper SDL usage - DDOI
case 189: vkeyval='-'; accept=true; break;
case 187: vkeyval='='; accept=true; break;
case 219: vkeyval='['; accept=true; break;
case 221: vkeyval=']'; accept=true; break;
case 186: vkeyval=';'; accept=true; break;
case 222: vkeyval=39; accept=true; break;
case 188: vkeyval=','; accept=true; break;
case 190: vkeyval='.'; accept=true; break;
case 191: vkeyval='/'; accept=true; break;
case 192: vkeyval='`'; accept=true; break;
case 220: vkeyval=92; accept=true; break;
}
} else {
switch (scancode) {
// Fix these for proper SDL usage - DDOI
case 189: vkeyval='_'; accept=true; break;
case 187: vkeyval='+'; accept=true; break;
case 219: vkeyval='{'; accept=true; break;
case 221: vkeyval='}'; accept=true; break;
case 186: vkeyval=':'; accept=true; break;
case 222: vkeyval='"'; accept=true; break;
case 188: vkeyval='<'; accept=true; break;
case 190: vkeyval='>'; accept=true; break;
case 191: vkeyval='?'; accept=true; break;
case 192: vkeyval='~'; accept=true; break;
case 220: vkeyval='|'; accept=true; break;
}
}
switch (scancode) {
// Fix these for proper SDL usage - DDOI
case 33: vkeyval=256+73; accept=true; break;
case 38: vkeyval=256+72; accept=true; break;
case 36: vkeyval=256+71; accept=true; break;
case 39: vkeyval=256+77; accept=true; break;
case 12: vkeyval=256+76; accept=true; break;
case 37: vkeyval=256+75; accept=true; break;
case 34: vkeyval=256+81; accept=true; break;
case 40: vkeyval=256+80; accept=true; break;
case 35: vkeyval=256+79; accept=true; break;
case 107: vkeyval='+'; accept=true; break;
case 109: vkeyval='-'; accept=true; break;
case 106: vkeyval='*'; accept=true; break;
case 111: vkeyval='/'; accept=true; break;
case 110: vkeyval='.'; accept=true; break;
}
if (accept){
KeyBuffer[CurKeyPos]=vkeyval;
CurKeyPos++;
if (CurKeyPos==16) CurKeyPos=0;
}
}
#else // __WIN32__ #else // __WIN32__
LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
@@ -1062,9 +1157,9 @@ int startgame(void)
unsigned int color32,ScreenPtr2; unsigned int color32,ScreenPtr2;
int i; int i;
Uint32 flags = SDL_SWSURFACE | SDL_HWPALETTE; Uint32 flags = SDL_SWSURFACE | SDL_HWPALETTE;
DWORD GBitMask;
//STUB_FUNCTION; //STUB_FUNCTION;
// This was crashing zsnes for some strange reason
ScreenPtr2=BitConv32Ptr; ScreenPtr2=BitConv32Ptr;
for(i=0;i<65536;i++) for(i=0;i<65536;i++)
{ {
@@ -1074,20 +1169,6 @@ int startgame(void)
(*(unsigned int *)(ScreenPtr2))=color32; (*(unsigned int *)(ScreenPtr2))=color32;
ScreenPtr2+=4; ScreenPtr2+=4;
} }
// Temporary I hope - DDOI
BitDepth = 16;
// Check hardware for 565/555
GBitMask = 0x07E0;
if(BitDepth==16 && GBitMask!=0x07E0)
{
converta=1;
Init_2xSaI(555);
}
else
{
converta=0;
}
if (sdl_inited == 0) { if (sdl_inited == 0) {
if (SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) < 0) { if (SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) < 0) {
@@ -1100,14 +1181,31 @@ int startgame(void)
flags != ( FullScreen ? SDL_FULLSCREEN : 0); flags != ( FullScreen ? SDL_FULLSCREEN : 0);
surface = SDL_SetVideoMode(WindowWidth, WindowHeight, BitDepth, flags); surface = SDL_SetVideoMode(WindowWidth, WindowHeight, 0, flags);
if (surface == NULL) { if (surface == NULL) {
fprintf (stderr, "Could not set %dx%dx%d video mode.\n",SurfaceX, fprintf (stderr, "Could not set %dx%d video mode.\n",SurfaceX,
SurfaceY, BitDepth); SurfaceY);
return FALSE; return FALSE;
} }
/* Need to handle situations where BPP is not what we can handle */
SDL_WM_SetCaption ("ZSNES Linux","ZSNES"); SDL_WM_SetCaption ("ZSNES Linux","ZSNES");
SDL_ShowCursor(0); SDL_ShowCursor(0);
BitDepth = surface->format->BitsPerPixel;
// Check hardware for 565/555
GBitMask = surface->format->Gmask;
if(BitDepth==16 && GBitMask!=0x07E0)
{
converta=1;
Init_2xSaI(555);
}
else
{
converta=0;
}
return TRUE; return TRUE;
} }
#else // __WIN32__ #else // __WIN32__
@@ -1789,7 +1887,7 @@ void clearwin()
switch(BitDepth) switch(BitDepth)
{ {
case 16: case 16:
// TODO - This code crashes zsnes - DDOI // Still crashes - DDOI
STUB_FUNCTION; STUB_FUNCTION;
/* /*
__asm__ __volatile__ (" __asm__ __volatile__ ("
@@ -1800,7 +1898,6 @@ void clearwin()
movl SurfBufD, %%edi movl SurfBufD, %%edi
xorl %%ebx, %%ebx xorl %%ebx, %%ebx
Blank2: Blank2:
xorl %%eax, %%eax
movl SurfaceX, %%ecx movl SurfaceX, %%ecx
rep rep
stosw stosw
@@ -1808,37 +1905,34 @@ void clearwin()
subl SurfaceX, %%edi subl SurfaceX, %%edi
subl SurfaceX, %%edi subl SurfaceX, %%edi
addl $1, %%ebx addl $1, %%ebx
cmpl SurfaceX, %%ebx cmpl SurfaceY, %%ebx
jne Blank2 jne Blank2
popw %%es popw %%es
" : : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi"); " : : : "cc", "memory", "eax", "ebx", "ecx", "edi");
*/
break; break;
case 32: case 32:
// TODO - intel2gas this - DDOI __asm__ __volatile__ ("
STUB_FUNCTION; pushw %%es
/* movw %%ds, %%ax
_asm { movw %%ax, %%es
push es xorl %%eax, %%eax
mov ax,ds movl SurfBufD, %%edi
mov es,ax xorl %%ebx, %%ebx
xor eax,eax Blank3:
mov edi,SurfBufD movl SurfaceX, %%ecx
xor ebx,ebx rep
Blank3: stosl
xor eax,eax addl Temp1, %%edi
mov ecx,SurfaceX subl SurfaceX, %%edi
rep stosd subl SurfaceX, %%edi
add edi,Temp1 subl SurfaceX, %%edi
sub edi,SurfaceX subl SurfaceX, %%edi
sub edi,SurfaceX addl $1, %%ebx
sub edi,SurfaceX cmpl SurfaceY, %%ebx
sub edi,SurfaceX jne Blank3
add ebx,1 popw %%es
cmp ebx,SurfaceY " : : : "cc", "memory", "eax", "ebx", "ecx","edi");
jne Blank3 */
}
*/
break; break;
} }
UnlockSurface(); UnlockSurface();
@@ -1867,6 +1961,11 @@ void drawscreenwin(void)
SurfBufD=(DWORD) &SurfBuf[0]; SurfBufD=(DWORD) &SurfBuf[0];
SURFDW=(DWORD *) &SurfBuf[0]; SURFDW=(DWORD *) &SurfBuf[0];
if (SurfBufD == 0) {
UnlockSurface();
return;
}
if(SurfaceX==256&&SurfaceY==224) if(SurfaceX==256&&SurfaceY==224)
{ {
switch(BitDepth) switch(BitDepth)
@@ -1985,7 +2084,7 @@ void drawscreenwin(void)
fprintf (stderr, "Sorry, ZSNES does not work in windowed 24 bit color modes.\nSwitching to fullscreen mode\n"); fprintf (stderr, "Sorry, ZSNES does not work in windowed 24 bit color modes.\nSwitching to fullscreen mode\n");
cvidmode=3; cvidmode=3;
initwinvideo(); initwinvideo();
sleep(1000); sleep(1);
drawscreenwin(); drawscreenwin();
break; break;
default: default:
@@ -1993,7 +2092,7 @@ void drawscreenwin(void)
fprintf(stderr, "Mode only available in 16 and 32 bit color.\n"); fprintf(stderr, "Mode only available in 16 and 32 bit color.\n");
cvidmode=2; cvidmode=2;
initwinvideo(); initwinvideo();
sleep(1000); sleep(1);
drawscreenwin(); drawscreenwin();
break; break;
} // switch (BitDepth) } // switch (BitDepth)
@@ -2004,113 +2103,109 @@ void drawscreenwin(void)
switch(BitDepth) switch(BitDepth)
{ {
case 16: case 16:
// TODO - convert this assembly - DDOI
if (FPUCopy) { if (FPUCopy) {
STUB_FUNCTION; __asm__ __volatile__ ("
/* pushw %%es
_asm { movw %%ds, %%ax
push es movw %%ax, %%es
mov ax,ds xor %%eax, %%eax
mov es,ax xor %%ebx, %%ebx
xor eax,eax movl ScreenPtr, %%esi
xor ebx,ebx movl SurfBufD, %%edi
mov esi,ScreenPtr Blank1MMX:
mov edi,SurfBufD mov $160, %%ecx
Blank1MMX: rep
xor eax,eax stosl
mov ecx,160 subl $160, %%edi
rep stosd addl Temp1, %%edi
sub edi,640 addl $1, %%ebx
add edi,Temp1 cmpl $8, %%ebx
add ebx,1 jne Blank1MMX
cmp ebx,8 xor %%ebx, %%ebx
jne Blank1MMX pxor %%mm0, %%mm0
xor ebx,ebx Copying2MMX:
pxor mm0,mm0 mov $4, %%ecx
Copying2MMX: MMXLoopA:
mov ecx,4 movq %%mm0, 0(%%edi)
MMXLoopA: movq %%mm0, 8(%%edi)
movq [edi],mm0 addl $16, %%edi
movq [edi+8],mm0 dec %%ecx
add edi,16 jnz MMXLoopA
dec ecx mov $32, %%ecx
jnz MMXLoopA MMXLoopB:
mov ecx,32 movq 0(%%esi), %%mm1
MMXLoopB: movq 8(%%esi), %%mm2
movq mm1,[esi] movq %%mm1, 0(%%edi)
movq mm2,[esi+8] movq %%mm2, 8(%%edi)
movq [edi],mm1 addl $16, %%esi
movq [edi+8],mm2 addl $16, %%edi
add esi,16 decl %%ecx
add edi,16 jnz MMXLoopB
dec ecx mov $4, %%ecx
jnz MMXLoopB MMXLoopC:
mov ecx,4 movq %%mm0, 0(%%edi)
MMXLoopC: movq %%mm0, 8(%%edi)
movq [edi],mm0 addl $16, %%edi
movq [edi+8],mm0 decl %%ecx
add edi,16 jnz MMXLoopC
dec ecx incl %%ebx
jnz MMXLoopC addl Temp1, %%edi
inc ebx subl $640, %%edi
add edi,Temp1 subl $512, %%esi
sub edi,640 addl $576, %%esi
sub esi,512 cmpl $223, %%ebx
add esi,576 jne Copying2MMX
cmp ebx,223
jne Copying2MMX movl $128, %%ecx
rep
stosl
pop %%es
emms
" : : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
xor eax,eax
mov ecx,128
rep stosd
pop es
emms
}
*/
} else { } else {
STUB_FUNCTION; __asm__ __volatile__ ("
/* push %%es
_asm { movw %%ds, %%ax
push es movw %%ax, %%es
mov ax,ds xorl %%eax, %%eax
mov es,ax xorl %%ebx, %%ebx
xor eax,eax movl ScreenPtr, %%esi
xor ebx,ebx movl SurfBufD, %%edi
mov esi,ScreenPtr Blank1:
mov edi,SurfBufD movl $160, %%ecx
Blank1: rep
xor eax,eax stosl
mov ecx,160 subl $640, %%edi
rep stosd addl Temp1, %%edi
sub edi,640 addl $1, %%ebx
add edi,Temp1 cmpl $8, %%ebx
add ebx,1 jne Blank1
cmp ebx,8 xor %%ebx, %%ebx
jne Blank1 Copying2:
xor ebx,ebx movl $16, %%ecx
Copying2: rep
xor eax,eax stosl
mov ecx,16 movl $128, %%ecx
rep stosd rep
mov ecx,128 movsl
rep movsd movl $16, %%ecx
xor eax,eax rep
mov ecx,16 stosl
rep stosd incl %%ebx
inc ebx addl Temp1, %%edi
add edi,Temp1 subl $640, %%edi
sub edi,640 subl $512, %%esi
sub esi,512 addl $576, %%esi
add esi,576 cmpl $223, %%ebx
cmp ebx,223 jne Copying2
jne Copying2
movl $128, %%ecx
rep
stosl
pop %%es
" : : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
xor eax,eax
mov ecx,128
rep stosd
pop es
}
*/
} }
break; break;
case 32: case 32:
@@ -2138,7 +2233,7 @@ void drawscreenwin(void)
color32=(((*(WORD *)(ScreenPtr))&0xF800)<<8)+ color32=(((*(WORD *)(ScreenPtr))&0xF800)<<8)+
(((*(WORD *)(ScreenPtr))&0x07E0)<<5)+ (((*(WORD *)(ScreenPtr))&0x07E0)<<5)+
(((*(WORD *)(ScreenPtr))&0x001F)<<3)+0x7F000000; (((*(WORD *)(ScreenPtr))&0x001F)<<3)+0x7F000000;
// SURFDW[i]=color32; SURFDW[i]=color32;
ScreenPtr+=2; ScreenPtr+=2;
} }
@@ -2168,7 +2263,7 @@ void drawscreenwin(void)
fprintf(stderr, "Mode only available in 16 and 32 bit color.\n"); fprintf(stderr, "Mode only available in 16 and 32 bit color.\n");
cvidmode=2; cvidmode=2;
initwinvideo(); initwinvideo();
sleep(1000); sleep(1);
drawscreenwin(); drawscreenwin();
break; break;
} // switch } // switch
@@ -2189,7 +2284,7 @@ void drawscreenwin(void)
fprintf(stderr, "Mode only available in 16 and 32 bit color.\n"); fprintf(stderr, "Mode only available in 16 and 32 bit color.\n");
cvidmode=2; cvidmode=2;
initwinvideo(); initwinvideo();
sleep(1000); sleep(1);
drawscreenwin(); drawscreenwin();
break; break;
} // switch } // switch
@@ -2209,7 +2304,7 @@ void drawscreenwin(void)
fprintf(stderr, "Mode only available in 16 bit color.\n"); fprintf(stderr, "Mode only available in 16 bit color.\n");
cvidmode=2; cvidmode=2;
initwinvideo(); initwinvideo();
sleep(1000); sleep(1);
drawscreenwin(); drawscreenwin();
break; break;
} }