⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 direct.cpp

📁 DGen源码最后版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:

  // 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 + -