tweaking win32 port

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@339 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-01-28 19:28:53 +00:00
parent 4b2b67ebc7
commit 8831ef19a0
9 changed files with 79 additions and 142 deletions

View file

@ -12,7 +12,6 @@ static IDirectSoundBuffer *LoopBuffer=NULL;
static int LoopLen=0,LoopWrite=0; // Next position in loop to write static int LoopLen=0,LoopWrite=0; // Next position in loop to write
short *DSoundNext=NULL; // Buffer for next sound data to put in loop short *DSoundNext=NULL; // Buffer for next sound data to put in loop
//int DSoundSeg=0; // Seg length in samples
static int LoopBlank() static int LoopBlank()
{ {
@ -102,7 +101,7 @@ int DSoundUpdate()
DWORD play=0; DWORD play=0;
int pos=0; int pos=0;
if (LoopBuffer==NULL) return 1; if (LoopBuffer==NULL) return -1;
LoopBuffer->GetCurrentPosition(&play,NULL); LoopBuffer->GetCurrentPosition(&play,NULL);
pos=play>>((PicoOpt&8) ? 2 : 1); pos=play>>((PicoOpt&8) ? 2 : 1);
@ -121,10 +120,12 @@ int DSoundUpdate()
void DSoundMute() void DSoundMute()
{ {
if (LoopBuffer==NULL) return;
LoopBuffer->Stop(); LoopBuffer->Stop();
} }
void DSoundUnMute() void DSoundUnMute()
{ {
if (LoopBuffer==NULL) return;
LoopBuffer->Play(0,0,DSBPLAY_LOOPING); LoopBuffer->Play(0,0,DSBPLAY_LOOPING);
} }

View file

@ -21,7 +21,8 @@ int DirectInit()
{ {
D3DPRESENT_PARAMETERS d3dpp; D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE mode; D3DDISPLAYMODE mode;
int i=0,ret=0; D3DDEVTYPE dt = D3DDEVTYPE_HAL;
int i,u,ret=0;
memset(&d3dpp,0,sizeof(d3dpp)); memset(&d3dpp,0,sizeof(d3dpp));
memset(&mode,0,sizeof(mode)); memset(&mode,0,sizeof(mode));
@ -44,25 +45,21 @@ int DirectInit()
#endif #endif
// Try to create a device with hardware vertex processing: // Try to create a device with hardware vertex processing:
for (i=0;i<4;i++) for (u=0;u<2;u++)
{ {
int behave=D3DCREATE_HARDWARE_VERTEXPROCESSING; for (i=0;i<4;i++)
#ifdef _XBOX
if (i==1)
{ {
// If 60Hz didn't work, try PAL 50Hz instead: int behave=D3DCREATE_HARDWARE_VERTEXPROCESSING;
d3dpp.FullScreen_RefreshRateInHz=0;
d3dpp.BackBufferHeight=MainHeight=576; // Try software vertex processing:
if (i==1) behave=D3DCREATE_MIXED_VERTEXPROCESSING;
if (i==2) behave=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
Direct3D->CreateDevice(D3DADAPTER_DEFAULT,dt,FrameWnd,behave,&d3dpp,&Device);
if (Device) break;
} }
#endif
// Try software vertex processing:
if (i==2) behave=D3DCREATE_MIXED_VERTEXPROCESSING;
if (i==3) behave=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
Direct3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,FrameWnd,behave,&d3dpp,&Device);
if (Device) break; if (Device) break;
dt = D3DDEVTYPE_REF;
} }
if (Device==NULL) return 1; if (Device==NULL) return 1;
@ -184,12 +181,14 @@ static int SetupMatrices()
int DirectScreen() int DirectScreen()
{ {
unsigned char *lock=NULL; unsigned char *lock=NULL;
int ret;
// Copy the screen to the screen texture: // Copy the screen to the screen texture:
#ifdef _XBOX #ifdef _XBOX
TexScreenSwizzle(); TexScreenSwizzle();
#else #else
TexScreenLinear(); ret=TexScreenLinear();
if (ret) dprintf2("TexScreenLinear failed\n");
#endif #endif
SetupMatrices(); SetupMatrices();
@ -197,14 +196,19 @@ int DirectScreen()
MakeVertexList(); MakeVertexList();
// Copy vertices in: // Copy vertices in:
VertexBuffer->Lock(0,sizeof(VertexList),&lock,0); if (lock==NULL) return 1; VertexBuffer->Lock(0,sizeof(VertexList),&lock,0);
if (lock==NULL) { dprintf2("VertexBuffer->Lock failed\n"); return 1; }
memcpy(lock,VertexList,sizeof(VertexList)); memcpy(lock,VertexList,sizeof(VertexList));
VertexBuffer->Unlock(); VertexBuffer->Unlock();
Device->SetTexture(0,TexScreen); ret=Device->SetTexture(0,TexScreen);
Device->SetStreamSource(0,VertexBuffer,sizeof(CustomVertex)); if (ret) dprintf2("SetTexture failed\n");
Device->SetVertexShader(D3DFVF_CUSTOMVERTEX); ret=Device->SetStreamSource(0,VertexBuffer,sizeof(CustomVertex));
Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); if (ret) dprintf2("SetStreamSource failed\n");
ret=Device->SetVertexShader(D3DFVF_CUSTOMVERTEX);
if (ret) dprintf2("SetVertexShader failed\n");
ret=Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
if (ret) dprintf2("DrawPrimitive failed\n");
return 0; return 0;
} }

View file

@ -2,9 +2,7 @@
#include "app.h" #include "app.h"
unsigned short *EmuScreen=NULL; unsigned short *EmuScreen=NULL;
extern "C" unsigned short *framebuff=NULL;
int EmuWidth=0,EmuHeight=0; int EmuWidth=0,EmuHeight=0;
static int frame=0;
static int EmuScan(unsigned int num, void *sdata); static int EmuScan(unsigned int num, void *sdata);
unsigned char *PicoDraw2FB = NULL; unsigned char *PicoDraw2FB = NULL;
@ -18,10 +16,9 @@ int EmuInit()
EmuWidth=320; EmuHeight=224; EmuWidth=320; EmuHeight=224;
len=EmuWidth*EmuHeight; len<<=1; len=EmuWidth*EmuHeight; len<<=1;
EmuScreen=(unsigned short *)malloc(len); if (EmuScreen==NULL) return 1; EmuScreen=(unsigned short *)malloc(len); if (EmuScreen==NULL) return 1;
framebuff=(unsigned short *)malloc((8+320)*(8+224+8)*2); PicoDraw2FB=(unsigned char *)malloc((8+320)*(8+224+8)*2);
memset(EmuScreen,0,len); memset(EmuScreen,0,len);
PicoDraw2FB = (unsigned char *)framebuff;
PicoDrawSetColorFormat(1); PicoDrawSetColorFormat(1);
PicoScan=EmuScan; PicoScan=EmuScan;
@ -32,7 +29,7 @@ void EmuExit()
{ {
//RomFree(); //RomFree();
free(EmuScreen); EmuScreen=NULL; // Deallocate screen free(EmuScreen); EmuScreen=NULL; // Deallocate screen
free(framebuff); free(PicoDraw2FB);
EmuWidth=EmuHeight=0; EmuWidth=EmuHeight=0;
PicoExit(); PicoExit();
@ -50,7 +47,7 @@ static int EmuScan(unsigned int num, void *sdata)
pd=EmuScreen+(num<<8)+(num<<6); end=pd+320; pd=EmuScreen+(num<<8)+(num<<6); end=pd+320;
ps=(unsigned short *)sdata; ps=(unsigned short *)sdata;
do { *pd++=*ps++; } while (pd<end); do { *pd++=0xf800;/**ps++;*/ } while (pd<end);
return 0; return 0;
} }
@ -69,7 +66,6 @@ int EmuFrame()
PicoPad[0]=input; PicoPad[0]=input;
frame++;
PsndOut=(short *)DSoundNext; PicoFrame(); PsndOut=NULL; PsndOut=(short *)DSoundNext; PicoFrame(); PsndOut=NULL;
return 0; return 0;

View file

@ -2,13 +2,6 @@
#include "app.h" #include "app.h"
#include <commdlg.h> #include <commdlg.h>
extern char *romname;
extern unsigned char *rom_data;
extern unsigned int rom_size;
extern int fastForward;
extern int frameStep;
extern int emu_frame;
struct Input Inp; struct Input Inp;
// --------------------- XBox Input ----------------------------- // --------------------- XBox Input -----------------------------
@ -123,25 +116,27 @@ static int DeviceRead()
else if(!sblobked && GetAsyncKeyState(VK_TAB)) { else if(!sblobked && GetAsyncKeyState(VK_TAB)) {
PicoReset(0); PicoReset(0);
sblobked = 1; sblobked = 1;
emu_frame = 0;
} }
else if(!sblobked && GetAsyncKeyState(VK_ESCAPE)) { else if(!sblobked && GetAsyncKeyState(VK_ESCAPE))
DSoundMute(); {
unsigned char *rom_data;
unsigned int rom_size;
DSoundMute();
pm_file *rom = 0; pm_file *rom = 0;
OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME)); OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME));
of.lStructSize = sizeof(OPENFILENAME); of.lStructSize = sizeof(OPENFILENAME);
of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen\0"; of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen\0";
of.lpstrFile = romname; romname[0] = 0; of.lpstrFile = romname; romname[0] = 0;
of.nMaxFile = MAX_PATH; of.nMaxFile = MAX_PATH;
of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
GetOpenFileName(&of); GetOpenFileName(&of);
rom = pm_open(romname); rom = pm_open(romname);
DSoundUnMute(); DSoundUnMute();
if(!rom) return 1; if(!rom) return 1;
PicoCartLoad(rom, &rom_data, &rom_size); PicoCartLoad(rom, &rom_data, &rom_size);
PicoCartInsert(rom_data, rom_size); PicoCartInsert(rom_data, rom_size);
pm_close(rom); pm_close(rom);
sblobked = 1; sblobked = 1;
} }
else else
sblobked = GetAsyncKeyState(VK_F6) | GetAsyncKeyState(VK_F9) | sblobked = GetAsyncKeyState(VK_F6) | GetAsyncKeyState(VK_F9) |

View file

@ -1,10 +1,6 @@
#include "app.h" #include "app.h"
//#include "FileMenu.h" //#include "FileMenu.h"
extern char *romname;
int fastForward=0;
int frameStep=0;
char LoopQuit=0; char LoopQuit=0;
static FILE *DebugFile=NULL; static FILE *DebugFile=NULL;
int LoopMode=0; int LoopMode=0;
@ -17,9 +13,8 @@ int LoopInit()
// bits LSb->MSb: // bits LSb->MSb:
// enable_ym2612&dac, enable_sn76496, enable_z80, stereo_sound; // enable_ym2612&dac, enable_sn76496, enable_z80, stereo_sound;
// alt_renderer, 6button_gamepad, accurate_timing, accurate_sprites // alt_renderer, 6button_gamepad, accurate_timing, accurate_sprites
PicoOpt=0x1f; PicoOpt=0xbccf;
PsndRate=44100; PsndRate=44100;
//PsndLen=PsndRate/60; // calculated later by pico itself
// Init Direct3D: // Init Direct3D:
ret=DirectInit(); if (ret) { error("Direct3D init failed"); return 1; } ret=DirectInit(); if (ret) { error("Direct3D init failed"); return 1; }
@ -55,18 +50,9 @@ void LoopExit()
// ---------------------------------------------------------------- // ----------------------------------------------------------------
int emu_frame = 0;
static int DoGame() static int DoGame()
{ {
if(fastForward) { PicoSkipFrame+=1; PicoSkipFrame&=7; }
else PicoSkipFrame=0;
if(frameStep==1) return 0;
else if(frameStep==3) frameStep=1;
EmuFrame(); EmuFrame();
emu_frame++;
if (Inp.held[7]==1) LoopMode=2; // Right thumb = Toggle Menu if (Inp.held[7]==1) LoopMode=2; // Right thumb = Toggle Menu
@ -144,9 +130,8 @@ static int ModeRender()
static void UpdateSound(int len) static void UpdateSound(int len)
{ {
if(fastForward) return; while (DSoundUpdate() > 0) { Sleep(1); }
while (DSoundUpdate()) { Sleep(1); } while (DSoundUpdate()== 0) { }
while (DSoundUpdate()==0) { }
} }
int LoopCode() int LoopCode()

View file

@ -1,5 +1,5 @@
#include "app.h" #include "app.h"
#include "version.h"
#include <crtdbg.h> #include <crtdbg.h>
#include <commdlg.h> #include <commdlg.h>
@ -8,42 +8,6 @@ HWND FrameWnd=NULL;
int MainWidth=720,MainHeight=480; int MainWidth=720,MainHeight=480;
char AppName[]="GenaDrive";
#ifdef STARSCREAM
extern "C" int SekReset();
#endif
// ------------------------------------ XBox Main ------------------------------------------
#ifdef _XBOX
static int MainCode()
{
int ret=0;
ret=LoopInit(); if (ret) { LoopExit(); return 1; }
LoopQuit=0; LoopCode();
LoopExit();
return 0;
}
int __cdecl main()
{
LD_LAUNCH_DASHBOARD launch;
MainCode();
// Go back to dashboard:
memset(&launch,0,sizeof(launch));
launch.dwReason=XLD_LAUNCH_DASHBOARD_MAIN_MENU;
XLaunchNewImage(NULL,(LAUNCH_DATA *)&launch);
}
#endif
// ----------------------------------- Windows Main ----------------------------------------
#ifndef _XBOX
// Window proc for the frame window: // Window proc for the frame window:
static LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) static LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{ {
@ -88,7 +52,7 @@ static int FrameInit()
top-=height; top>>=1; top-=height; top>>=1;
// Create the window: // Create the window:
FrameWnd=CreateWindow(wc.lpszClassName,AppName,style|WS_VISIBLE, FrameWnd=CreateWindow(wc.lpszClassName,"PicoDrive " VERSION,style|WS_VISIBLE,
left,top,width,height,NULL,NULL,NULL,NULL); left,top,width,height,NULL,NULL,NULL,NULL);
return 0; return 0;
@ -102,19 +66,17 @@ static DWORD WINAPI ThreadCode(void *)
return 0; return 0;
} }
// starscream needs this
unsigned char *rom_data = 0;
unsigned int rom_size = 0;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int) int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int)
{ {
MSG msg; MSG msg;
int ret=0; int ret=0;
DWORD tid=0; DWORD tid=0;
HANDLE thread=NULL; HANDLE thread=NULL;
unsigned char *rom_data = 0;
unsigned int rom_size = 0;
FrameInit(); FrameInit();
ret=LoopInit(); if (ret) { LoopExit(); return 1; } ret=LoopInit(); if (ret) goto end0;
// notaz: load rom // notaz: load rom
static char rompath[MAX_PATH]; rompath[0] = 0; static char rompath[MAX_PATH]; rompath[0] = 0;
@ -125,27 +87,29 @@ int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int)
if(strlen(rompath) > 4) rom = pm_open(rompath); if(strlen(rompath) > 4) rom = pm_open(rompath);
if(!rom) { if(!rom) {
OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME)); OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME));
of.lStructSize = sizeof(OPENFILENAME); of.lStructSize = sizeof(OPENFILENAME);
of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen\0"; of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen;*.zip\0";
of.lpstrFile = rompath; rompath[0] = 0; of.lpstrFile = rompath; rompath[0] = 0;
of.nMaxFile = MAX_PATH; of.nMaxFile = MAX_PATH;
of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
if(!GetOpenFileName(&of)) return 1; if(!GetOpenFileName(&of)) goto end0;
rom = pm_open(rompath); rom = pm_open(rompath);
if(!rom) return 1; if(!rom) goto end0;
} }
romname = rompath; romname = rompath;
if(PicoCartLoad(rom, &rom_data, &rom_size)) { ret=PicoCartLoad(rom, &rom_data, &rom_size);
//RDebug::Print(_L("PicoCartLoad() failed."));
//goto cleanup;
}
pm_close(rom); pm_close(rom);
if (ret) {
error("failed to load ROM");
goto end0;
}
PicoCartInsert(rom_data, rom_size); PicoCartInsert(rom_data, rom_size);
// only now we got the mode (pal/ntsc), so init sound now // only now we got the mode (pal/ntsc), so init sound now
DSoundInit(); ret=DSoundInit();
if (ret) error("Failed to init DirectSound"); // warning
// Make another thread to run LoopCode(): // Make another thread to run LoopCode():
LoopQuit=0; LoopQuit=0;
@ -165,6 +129,7 @@ int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int)
LoopQuit=1; WaitForSingleObject(thread,5000); LoopQuit=1; WaitForSingleObject(thread,5000);
CloseHandle(thread); thread=NULL; CloseHandle(thread); thread=NULL;
end0:
LoopExit(); LoopExit();
DestroyWindow(FrameWnd); DestroyWindow(FrameWnd);
@ -178,5 +143,4 @@ extern void error(char *text)
{ {
MessageBox(FrameWnd, text, "Error", 0); MessageBox(FrameWnd, text, "Error", 0);
} }
#endif

View file

@ -86,7 +86,8 @@ int TexScreenLinear()
int y=0,line=0; int y=0,line=0;
unsigned short *ps=NULL; unsigned short *ps=NULL;
TexScreen->LockRect(0,&lock,NULL,0); if (lock.pBits==NULL) return 1; TexScreen->LockRect(0,&lock,NULL,0);
if (lock.pBits==NULL) return 1;
dest=(unsigned char *)lock.pBits; dest=(unsigned char *)lock.pBits;
ps=EmuScreen; ps=EmuScreen;
@ -98,7 +99,7 @@ int TexScreenLinear()
for (x=0; x<EmuWidth; x++,addr+=2) for (x=0; x<EmuWidth; x++,addr+=2)
{ {
*(unsigned int *)(dest+addr)=*ps++; *(unsigned int *)(dest+addr)=0xf0f0f0f0;//*ps++;
} }
} }

View file

@ -1,15 +1,9 @@
#include <stdio.h> #include <stdio.h>
#ifdef _XBOX
#include <xtl.h>
#endif
#ifndef _XBOX
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <d3d8.h> #include <d3d8.h>
#endif
#include <d3dx8.h> #include <d3dx8.h>
@ -19,11 +13,6 @@
#define RELEASE(x) if (x) x->Release(); x=NULL; #define RELEASE(x) if (x) x->Release(); x=NULL;
#ifdef _XBOX
#define HOME "d:\\"
#else
#define HOME ".\\"
#endif
// Emu.cpp // Emu.cpp
extern unsigned short *EmuScreen; extern unsigned short *EmuScreen;
@ -63,9 +52,9 @@ int LoopCode();
extern "C" int dprintf2(char *format, ...); extern "C" int dprintf2(char *format, ...);
// Main.cpp // Main.cpp
extern char *romname;
extern HWND FrameWnd; extern HWND FrameWnd;
extern int MainWidth,MainHeight; extern int MainWidth,MainHeight;
extern char AppName[];
extern void error(char *text); extern void error(char *text);
// Rom.cpp // Rom.cpp

View file

@ -0,0 +1,2 @@
#define VERSION "1.40"