📄 direct.cpp
字号:
// This is the manual_define window
wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s).
wc.lpfnWndProc = man_def_keys_proc; // Function to retrieve messages for
// windows of this class.
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = 0; // No per-window extra data.
wc.hInstance = hInstance; // Application that owns the class.
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; // Name of menu resource in .RC file.
wc.lpszClassName = "manual_define"; // Name used in call to CreateWindow.
RegisterClass(&wc);
return 0;
}
static int direct_draw_init()
{
dprintf ("*direct_draw_init();\n");
hWnd = CreateWindow(
"DGENMAIN", // See RegisterClass() call.
"DGen v" VER, // Text for window title bar.
fullscreen?WS_POPUP:WS_OVERLAPPEDWINDOW, // Window style.
// CW_USEDEFAULT, // Default horizontal position.
// CW_USEDEFAULT, // Default vertical position.
// CW_USEDEFAULT, // Default width.
// CW_USEDEFAULT, // Default height.
160,80,
(320*1+8),(224*1+42+4),
NULL, // Overlapped windows have no parent.
NULL, // Use the window class menu.
main_inst, // This instance owns this window.
NULL // Pointer not needed.
);
if (!hWnd) exit(1);
ShowWindow(hWnd, 1); // Show the window
UpdateWindow(hWnd); // Sends WM_PAINT message
mddisp=new dxdisp(hWnd,fullscreen); // DXDISP.CPP inits directdraw
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd); // Sends WM_PAINT message
update_menu();
return 0;
}
static int direct_draw_exit()
{
dprintf ("*direct_draw_exit();\n");
if (mddisp) delete mddisp; mddisp=0; // DXDISP.CPP exits directdraw
if (hWnd) DestroyWindow(hWnd); hWnd=0;
return 0;
}
static int really_quit=1;
static int toggle_fullscreen()
{
fullscreen=!fullscreen;
sound_exit();
really_quit=0;
direct_draw_exit();
direct_draw_init();
really_quit=1;
sound_init();
return 0;
}
BOOL CALLBACK genie_proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_INITDIALOG) return(TRUE);
if (message == WM_COMMAND)
{
int id; id=(wParam&0xffff);
if (id==0x1002) // Patch
{
static char box[0x800]=""; int ret;
ret=GetDlgItemText(hDlg,0x1001,box,0x800);
megad.patch(box); // call joe's Genie patch code
return(TRUE);
}
else if (id==0x1003) megad.fix_rom_checksum();
else if (id==0x1004) EndDialog(hDlg, TRUE);
}
if (message==WM_CLOSE) EndDialog(hDlg, TRUE);
return(FALSE);
}
/****************************************************************************
FUNCTION: MainWndProc(HWND, UINT, WPARAM, LPARAM)
****************************************************************************/
long int PASCAL MainWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int sele=GET_WM_COMMAND_ID(wParam, lParam);
if (sele==0x0100) // Load
{
if (get_rom_name()==0)
{
maybe_auto_save_load(1);
megad.load(rom_name,1);
maybe_auto_save_load(0);
medley=0;
}
sound_exit();
sound_init();
}
else if (sele==0x0105) // Genie Dialog
{
DLGPROC lpproc; // pointer to thunk for dialog box
lpproc = (DLGPROC)MakeProcInstance((FARPROC)genie_proc, main_inst);
DialogBox(main_inst,MAKEINTRESOURCE(0x1010),hWnd,lpproc);
FreeProcInstance((FARPROC)lpproc);
}
else if (sele==0x0106) // Reload (e.g for genie codes
{
if (get_rom_name()==0) megad.load(rom_name,0);
}
else if (sele==0x0101)
{
maybe_auto_save_load(1);
megad.unplug();
sound_exit();
sound_init();
medley=0;
}
else if (sele==0x0102) md_res_req=1;
else if (sele==0x0103)
{
DestroyWindow(hWnd);
}
else if (sele==0x0104) megad.pause=!megad.pause;
else if (sele==0x0110) // Load State
{
if (get_save_name(0,0)==0) do_save_load(0,0,1,save_name);
}
else if (sele==0x0111) // Save State
{
if (get_save_name(1,0)==0) do_save_load(1,0,1,save_name);
}
else if (sele==0x0310) // Load SRAM
{
if (get_save_name(0,1)==0) do_save_load(0,1,1,save_name);
}
else if (sele==0x0311) // Save SRAM
{
if (get_save_name(1,1)==0) do_save_load(1,1,1,save_name);
}
else if (sele==0x0117) auto_saveload=!auto_saveload;
else if (sele==0x0118) sram_saveload=!sram_saveload;
else if (sele==0x0112) megad.country_ver=(megad.country_ver&0x0f)+0x80;
else if (sele==0x0113) megad.country_ver=(megad.country_ver&0x0f)+0x00;
else if (sele==0x0114) megad.country_ver=(megad.country_ver&0x0f)+0xc0;
else if (sele==0x0115) megad.country_ver=(megad.country_ver&0x0f)+0x40;
else if (sele==0x0116) megad.country_ver=(megad.country_ver&0x0f)+0xff0;
else if ((sele&0xff0)==0x0120)
{
megad.country_ver=(megad.country_ver&0xff0)+sele&0x0f;
}
else if (sele==0x0130) megad.change_cpu_emu(0);
else if (sele==0x0131) megad.change_cpu_emu(1);
else if (sele==0x0140)
{ manual_defining_keys=1; manual_define_keys(); }
else if (sele==0x0141)
{ manual_defining_keys=2; manual_define_keys(); }
else if (sele>=0x0142 && sele<0x0150) common_keys(sele-0x0142);
else if (sele==0x0150) tog_fs_req=1;
else if (sele==0x0151) split_screen=!split_screen;
else if (sele==0x0152) crap_tv=!crap_tv;
else if (sele==0x0153) any_size=!any_size;
else if (sele==0x0154) dgen_display_on=!dgen_display_on;
else if (sele==0x0155) megad.render_method=0;
else if (sele==0x0156) megad.render_method=1;
else if (sele==0x0157) megad.render_method=2;
else if (sele==0x0158) megad.render_method=3;
else if ((sele&0xff0)==0x0330)
{
megad.layer_sel^=1<<(sele&15);
}
else if (sele==0x01b0)
{
megad.mjazz=!megad.mjazz;
megad.flush_fm_to_mame();
}
else if ((sele&0xfe0)==0x0160)
{
if (sele==0x0160) ; // reset
else if (sele==0x0161) stereo16=0;
else if (sele==0x0162) stereo16=1;
else if (sele==0x0163) no_sound=!no_sound;
else if (sele==0x0168) snd_rate=8000;
else if (sele==0x0169) snd_rate=11025;
else if (sele==0x016a) snd_rate=22050;
else if (sele==0x016b) snd_rate=44100;
else if (sele==0x0170) virtual_fps=50;
else if (sele==0x0171) virtual_fps=60;
else if (sele==0x0172) virtual_fps=70;
sound_exit();
sound_init();
}
else if ((sele&0xf00)==0x200)
{
snd_segs=sele&0xff;
sound_exit();
sound_init();
}
else if (sele==0x0180) megad.snd_mute^=1;
else if (sele==0x0181) megad.snd_mute^=2;
else if (sele==0x0182) megad.snd_mute^=4;
else if ((sele&0xff0)==0x190)
{
if (medley<=0)
{
medley_record=0; // start recording keypresses
medley_press_mark=0; medley_had_fire=0;
medley_nothing_after=0;
medley_silence=-2*60;
}
medley_beep=10;
medley=(sele&0xf)*30*60;
}
else if ((sele&0xff0)==0x1a0) fm_chan_on^=1<<(sele&0xf);
update_menu();
}
case WM_MENUSELECT:
{
// Mute sound when user hits a menu
int tot_size=snd_segs*snd_size*(stereo16?4:1);
LPVOID ptr1, ptr2; DWORD size1, size2;
if (lpBuf!=NULL)
{
int ret=lpBuf->Lock(0,tot_size,&ptr1,&size1,&ptr2,&size2,0);
if (ret == DS_OK && ptr1!=NULL && size1>=tot_size )
{
memset(ptr1,stereo16?0:0x80,tot_size);
lpBuf->Unlock(ptr1, size1, ptr2, size2);
}
}
}
break;
case WM_ACTIVATEAPP:
// wParam true if we are switched to, false if user
// switches to another program
we_are_active = wParam;
break;
case WM_PAINT: case WM_NCPAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// function calls to repaint main window go here
if (mddisp)
{
mddisp->cls();
dprintf ("mess %.4x calling ",message);
mddisp->update(any_size);
}
//RECT rect;
//GetClientRect (hWnd, &rect);
//SetTextAlign (hdc, TA_BASELINE | TA_CENTER);
//TextOut(hdc, rect.right / 2, rect.bottom / 2, "DGen", 4);
EndPaint(hWnd,&ps);
}
break;
case WM_DESTROY: // message: window being destroyed
if (really_quit) PostQuitMessage(0);
break;
// Passes it on if unproccessed
}
// passes it on anyway...
return (DefWindowProc(hWnd, message, wParam, lParam));
}
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg; // message
char *rom_name=NULL;
main_inst=hInstance;
if (!hPrevInstance) // Other instances of app running?
if (InitApplication(hInstance)!=0) // Initialize shared things
return (FALSE); // Exits if unable to initialize
/* Perform initializations that apply to a specific instance */
// sound_log=fopen("sound.log","wb");
// debug_log=fopen("zzdebug.txt","wt");
GetCurrentDirectory(0x7f0,curr_path);
strcpy(config_name,curr_path);
strcat(config_name,"\\dgen.ini");
load_config(config_name);
if (state_path[0]==0) strcpy(state_path,curr_path);
if (rom_path[0]==0) strcpy(rom_path,curr_path);
// Wait for a bit (let screen mode change) before creating directdraw
// may fix +590 bugs?
direct_draw_init();
sound_init();
DirectInputInit(hInstance); // In kinp.cpp
if (fullscreen)
{
/*
if (depth==8)
{
ret=make_ddraw_pal(lpdd);
if (ret!=0)
{
sprintf (temp,"Return value was %x (%+-d)\n",ret,ret-MAKE_DDHRESULT(0));
MessageBox(hWnd,temp,"make_ddraw_pal(lpdd) results",MB_OK);
}
ret = lpDDSPrimary->SetPalette(ddpal);
// this sets the palette for the primary surface
}
*/
}
rom_name=NULL;
if (lpCmdLine!=NULL && lpCmdLine[0])
{
rom_name=lpCmdLine;
}
if (rom_name!=NULL)
{
megad.load(rom_name,1);
maybe_auto_save_load(0);
}
start_time=timeGetTime();
int done=0;
while (!done)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_SYSKEYDOWN)
if (msg.wParam==0xd) tog_fs_req=1;
if (msg.message == WM_QUIT) done=1;
else if (msg.message == WM_DESTROY) done=1;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
run_megadrive();
if (we_are_active)
{
static int last=0,ths;
ths=KEY_DOWN(0x70)||KEY_DOWN(0x71)||KEY_DOWN(0x72)||KEY_DOWN(0x76)||
KEY_DOWN(0x74)||KEY_DOWN(0x76)||KEY_DOWN('R')
||KEY_DOWN('P');
if ((!last) && ths)
{
if (KEY_DOWN(0x70)) crap_tv=!crap_tv;
if (KEY_DOWN(0x71)) split_screen=!split_screen;
if (KEY_DOWN(0x72)) megad.render_method=(megad.render_method+1)%4;
if (KEY_DOWN(0x74)) do_save_load(1,0,0,NULL);
if (KEY_DOWN(0x76)) do_save_load(0,0,0,NULL);
if (KEY_DOWN(0x12)&&KEY_DOWN('R')) md_res_req=1;
if (KEY_DOWN(0x12)&&KEY_DOWN('P')) megad.pause=!megad.pause;
update_menu();
}
last=ths;
if (KEY_DOWN(0x73))
{ int i; for (i=0;i<20;i++) megad.one_frame(NULL,NULL,NULL); }
float vchange=0.05;
if (KEY_DOWN(0x10)) vchange=-vchange;
if (KEY_DOWN('V')) vmul+=vchange;
if (KEY_DOWN('U')) umul+=vchange;
if (KEY_DOWN('C')) contrast+=vchange;
if (KEY_DOWN('B')) brightness+=vchange;
if (manual_defining_keys) manual_define_update();
if (tog_fs_req) toggle_fullscreen(); tog_fs_req=0;
if (md_res_req)
{
megad.reset();
sound_exit();
sound_init();
medley=0;
update_menu();
}
md_res_req=0;
}
}
}
end_time=timeGetTime();
maybe_auto_save_load(1);
megad.unplug();
sound_exit();
direct_draw_exit();
{
int timetaken;
timetaken=end_time-start_time;
if (timetaken)
{
dprintf ("Frames per second was %.1f\n",
(float)frame_count/((float)timetaken/1000.0));
//MessageBox(hWnd,temp,"DGen Performance",MB_OK);
}
}
unload_config(config_name);
if (sound_log!=NULL) fclose(sound_log); sound_log=NULL;
if (debug_log!=NULL) fclose(debug_log); debug_log=NULL;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -