-/*\r
- Skelton for retropc emulator\r
-\r
- Author : Takeda.Toshiya\r
- Date : 2006.08.18 -\r
-\r
- [ win32 emulation i/f ]\r
-*/\r
-\r
-#ifndef _EMU_H_\r
-#define _EMU_H_\r
-\r
-// DirectX\r
-#define DIRECTSOUND_VERSION 0x900\r
-#define DIRECT3D_VERSION 0x900\r
-\r
-// for debug\r
-//#define _DEBUG_LOG\r
-#ifdef _DEBUG_LOG\r
- // output fdc debug log\r
-// #define _FDC_DEBUG_LOG\r
- // output i/o debug log\r
-// #define _IO_DEBUG_LOG\r
-#endif\r
-\r
-#if defined(_USE_AGAR)\r
-# include <SDL/SDL.h>\r
-# include <agar/core.h>\r
-# include <agar/gui.h>\r
-# include "simd_types.h"\r
-// Wrapper of WIN32->*nix\r
-\r
-#ifndef _MAX_PATH\r
- #define _MAX_PATH AG_PATHNAME_MAX\r
-#endif\r
-\r
-#elif defined(_USE_QT)\r
-# include <SDL/SDL.h>\r
-# include "menuclasses.h"\r
-# include "qt_gldraw.h"\r
-# include "qt_main.h"\r
-# include "simd_types.h"\r
-// Wrapper of WIN32->*nix\r
-\r
-#ifndef _MAX_PATH\r
- #ifdef MAX_PATH\r
- #define _MAX_PATH MAX_PATH\r
- #else\r
- #define MAX_PATH 2048\r
- #define _MAX_PATH 2048\r
- #endif\r
-#endif\r
-\r
-#else // _USE_WIN32\r
-#include <windows.h>\r
-#include <windowsx.h>\r
-#include <mmsystem.h>\r
-#include <process.h>\r
-\r
-#endif // _USE_WIN32\r
-\r
-#include <stdio.h>\r
-#include <assert.h>\r
-#include "common.h"\r
-#include "config.h"\r
-#include "vm/vm.h"\r
-\r
-#if defined(_USE_AGAR)\r
-#include "agar_input.h"\r
-\r
-#elit defined(_USE_QT)\r
-\r
-# define WM_RESIZE 1\r
-#define WM_SOCKET0 2\r
-#define WM_SOCKET1 3\r
-#define WM_SOCKET2 4\r
-#define WM_SOCKET3 5\r
-#else // WIN32\r
-#define WM_RESIZE (WM_USER + 1)\r
-#define WM_SOCKET0 (WM_USER + 2)\r
-#define WM_SOCKET1 (WM_USER + 3)\r
-#define WM_SOCKET2 (WM_USER + 4)\r
-#define WM_SOCKET3 (WM_USER + 5)\r
-#endif\r
-\r
-#if defined(USE_LASER_DISC) || defined(USE_VIDEO_CAPTURE)\r
-#define USE_DIRECT_SHOW\r
-#endif\r
-\r
-#ifdef USE_VIDEO_CAPTURE\r
-#define MAX_CAPTURE_DEVS 8\r
-#endif\r
-\r
-#ifndef SCREEN_WIDTH_ASPECT\r
-#define SCREEN_WIDTH_ASPECT SCREEN_WIDTH\r
-#endif\r
-#ifndef SCREEN_HEIGHT_ASPECT\r
-#define SCREEN_HEIGHT_ASPECT SCREEN_HEIGHT\r
-#endif\r
-#ifndef WINDOW_WIDTH\r
-#define WINDOW_WIDTH SCREEN_WIDTH_ASPECT\r
-#endif\r
-#ifndef WINDOW_HEIGHT\r
-#define WINDOW_HEIGHT SCREEN_HEIGHT_ASPECT\r
-#endif\r
-\r
-#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)\r
-\r
-typedef struct {\r
- Sint16 **pSoundBuf;\r
- int *uBufSize;\r
- int *nSndWritePos;\r
- int *nSndDataLen;\r
- SDL_sem **pSndApplySem;\r
- Uint8 *iTotalVolume;\r
- bool *bSndExit;\r
- bool *bSoundDebug;\r
-} sdl_snddata_t;\r
-\r
-#else // WIN32\r
-#pragma comment(lib, "d3d9.lib")\r
-#pragma comment(lib, "d3dx9.lib")\r
-#include <d3d9.h>\r
-#include <d3dx9.h>\r
-#include <d3d9types.h>\r
-\r
-#include <dsound.h>\r
-#include <vfw.h>\r
-\r
-#ifdef USE_DIRECT_SHOW\r
-#pragma comment(lib, "strmiids.lib")\r
-#include <dshow.h>\r
-//#include <qedit.h>\r
-EXTERN_C const CLSID CLSID_SampleGrabber;\r
-EXTERN_C const CLSID CLSID_NullRenderer;\r
-EXTERN_C const IID IID_ISampleGrabberCB;\r
-MIDL_INTERFACE("0579154A-2B53-4994-B0D0-E773148EFF85")\r
-ISampleGrabberCB : public IUnknown {\r
-public:\r
- virtual HRESULT STDMETHODCALLTYPE SampleCB( double SampleTime,IMediaSample *pSample) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE BufferCB( double SampleTime,BYTE *pBuffer,long BufferLen) = 0;\r
-};\r
-EXTERN_C const IID IID_ISampleGrabber;\r
-MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F")\r
-ISampleGrabber : public IUnknown {\r
-public:\r
- virtual HRESULT STDMETHODCALLTYPE SetOneShot( BOOL OneShot) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE SetMediaType( const AM_MEDIA_TYPE *pType) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( AM_MEDIA_TYPE *pType) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( BOOL BufferThem) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( /* [out][in] */ long *pBufferSize,/* [out] */ long *pBuffer) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( /* [retval][out] */ IMediaSample **ppSample) = 0;\r
- virtual HRESULT STDMETHODCALLTYPE SetCallback( ISampleGrabberCB *pCallback,long WhichMethodToCallback) = 0;\r
-};\r
-#endif\r
-\r
-#ifdef __cplusplus\r
-#ifdef USE_LASER_DISC\r
-class CMySampleGrabberCB : public ISampleGrabberCB {\r
-private:\r
- VM *vm;\r
-public:\r
- CMySampleGrabberCB(VM *vm_ptr)\r
- {\r
- vm = vm_ptr;\r
- }\r
- STDMETHODIMP_(ULONG) AddRef()\r
- {\r
- return 2;\r
- }\r
- STDMETHODIMP_(ULONG) Release()\r
- {\r
- return 1;\r
- }\r
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
- {\r
- if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown) {\r
- *ppv = (void *) static_cast<ISampleGrabberCB*>(this);\r
- return NOERROR;\r
- }\r
- return E_NOINTERFACE;\r
- }\r
- STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample)\r
- {\r
- return S_OK;\r
- }\r
- STDMETHODIMP BufferCB(double dblSampleTime, BYTE *pBuffer, long lBufferSize)\r
- {\r
- vm->movie_sound_callback(pBuffer, lBufferSize);\r
- return S_OK;\r
- }\r
-};\r
-#endif\r
-#endif\r
-#endif\r
-\r
-#ifdef USE_SOCKET\r
-# if defined(_USE_AGAR) || defined(_USE_SDL)\r
-# elif defined(_USE_QT)\r
-# else // _WIN32\r
-# include <winsock.h>\r
-# endif\r
-#endif\r
-\r
-// check memory leaks\r
-#ifdef _DEBUG\r
-#define _CRTDBG_MAP_ALLOC\r
-#include <crtdbg.h>\r
-#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)\r
-#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
-#endif\r
-\r
-#ifdef USE_FD1\r
-#define MAX_D88_BANKS 64\r
-#endif\r
-\r
-#ifdef USE_SOCKET\r
-#define SOCKET_MAX 4\r
-#define SOCKET_BUFFER_MAX 0x100000\r
-#endif\r
-\r
-#ifdef __cplusplus\r
-class EMU;\r
-class FIFO;\r
-class FILEIO;\r
-#endif\r
-\r
-#if defined(_USE_AGAR) || defined(_USE_QT)\r
- typedef Uint32 scrntype;\r
-#else\r
-typedef struct video_thread_t {\r
- PAVISTREAM pAVICompressed;\r
- scrntype* lpBmpSource;\r
- LPBITMAPINFOHEADER pbmInfoHeader;\r
- DWORD dwAVIFileSize;\r
- LONG lAVIFrames;\r
- int frames;\r
- int result;\r
-} video_thread_t;\r
-#endif\r
-\r
-#ifdef USE_DEBUGGER\r
-typedef struct debugger_thread_t {\r
- EMU *emu;\r
- VM *vm;\r
- int cpu_index;\r
- bool running;\r
- bool request_terminate;\r
-} debugger_thread_t;\r
-#endif\r
-\r
-#ifdef __cplusplus\r
-class EMU\r
-{\r
-protected:\r
- VM* vm;\r
-#if defined(_USE_AGAR) || (_USE_SDL) || defined(_USE_QT)\r
- SDL_sem *pVMSemaphore; // To be thread safed.\r
-#endif\r
-private:\r
- // ----------------------------------------\r
- // input\r
- // ----------------------------------------\r
- void initialize_input();\r
- void release_input();\r
- void update_input();\r
- \r
- uint8 keycode_conv[256];\r
- uint8 key_status[256]; // windows key code mapping\r
-#ifdef USE_SHIFT_NUMPAD_KEY\r
- uint8 key_converted[256];\r
- bool key_shift_pressed, key_shift_released;\r
-#endif\r
- bool lost_focus;\r
- \r
- uint32 joy_status[2]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons\r
- int joy_num;\r
- uint32 joy_mask[2];\r
- \r
- int mouse_status[3]; // x, y, button (b0 = left, b1 = right)\r
- bool mouse_enabled;\r
- \r
-#ifdef USE_AUTO_KEY\r
- FIFO* autokey_buffer;\r
- int autokey_phase, autokey_shift;\r
-#endif\r
- \r
- // ----------------------------------------\r
- // screen\r
- // ----------------------------------------\r
- void initialize_screen();\r
- void release_screen();\r
-#if !defined(_USE_AGAR) && !defined(_USE_SDL) && !defined(_USE_QT)\r
- void create_dib_section(HDC hdc, int width, int height, HDC *hdcDib, HBITMAP *hBmp, HBITMAP *hOldBmp, LPBYTE *lpBuf, scrntype **lpBmp, LPBITMAPINFO *lpDib);\r
-#endif \r
- // screen settings\r
- int screen_width, screen_height;\r
- int screen_width_aspect, screen_height_aspect;\r
- int window_width, window_height;\r
- int display_width, display_height;\r
- bool screen_size_changed;\r
- \r
-#if defined(_USE_AGAR)\r
-\r
-#elif defined(_USE_QT)\r
-\r
-#else\r
- HDC hdcDibSource;\r
- scrntype* lpBmpSource;\r
- LPBITMAPINFO lpDibSource;\r
- LPBITMAPINFOHEADER pbmInfoHeader;\r
-#endif\r
- \r
- int source_width, source_height;\r
- int source_width_aspect, source_height_aspect;\r
- int stretched_width, stretched_height;\r
- int stretch_pow_x, stretch_pow_y;\r
- int screen_dest_x, screen_dest_y;\r
- bool stretch_screen;\r
- \r
- // update flags\r
- bool first_draw_screen;\r
- bool first_invalidate;\r
- bool self_invalidate;\r
- \r
- // screen buffer\r
-#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)\r
- \r
-#ifdef USE_SCREEN_ROTATE\r
- // rotate buffer\r
-#endif\r
- \r
- // stretch buffer\r
- bool render_to_GL;\r
- bool render_to_SDLFB;\r
- bool use_GL;\r
- bool use_SDLFB;\r
- bool render_with_OpenCL;\r
- bool single_window;\r
- bool wait_vsync;\r
- Uint32 *pPseudoVram;\r
-\r
- // record video\r
-#ifdef _USE_QT\r
- _TCHAR video_file_name[_MAX_PATH];\r
-#else\r
- _TCHAR video_file_name[AG_PATHNAME_MAX];\r
-#endif\r
- int rec_video_fps;\r
- double rec_video_run_frames;\r
- double rec_video_frames;\r
- \r
-// LPBITMAPINFO lpDibRec;\r
-// PAVIFILE pAVIFile;\r
-// PAVISTREAM pAVIStream;\r
-// PAVISTREAM pAVICompressed;\r
-// AVICOMPRESSOPTIONS opts;\r
-// DWORD dwAVIFileSize;\r
-// LONG lAVIFrames;\r
- \r
-// HDC hdcDibRec;\r
-// HBITMAP hBmpRec, hOldBmpRec;\r
-// LPBYTE lpBufRec;\r
-// scrntype* lpBmpRec;\r
- \r
- bool use_video_thread;\r
-#if defined(_USE_QT)\r
-#else\r
- AG_Thread hVideoThread;\r
-#endif\r
- //video_thread_t video_thread_param;\r
-\r
- // ----------------------------------------\r
- // sound\r
- // ----------------------------------------\r
- void initialize_sound();\r
- void release_sound();\r
- void update_sound(int* extra_frames);\r
- //void AudioCallbackSDL(void *udata, Uint8 *stream, int len);\r
-\r
- sdl_snddata_t snddata;\r
- int sound_rate, sound_samples;\r
- bool sound_ok, sound_started, now_mute;\r
- SDL_AudioSpec SndSpecReq, SndSpecPresented;\r
- //Uint8 iTotalVolume;\r
- // direct sound\r
- bool first_half;\r
- \r
- // record sound\r
-#if defined(_USE_QT)\r
- _TCHAR sound_file_name[_MAX_PATH];\r
-#else\r
- _TCHAR sound_file_name[AG_PATHNAME_MAX];\r
-#endif\r
- FILEIO* rec;\r
- int rec_bytes;\r
- int rec_buffer_ptr;\r
-\r
-#else // _WIN32\r
- HDC hdcDib;\r
- HBITMAP hBmp, hOldBmp;\r
- LPBYTE lpBuf;\r
- scrntype* lpBmp;\r
- LPBITMAPINFO lpDib;\r
- \r
-#ifdef USE_SCREEN_ROTATE\r
- // rotate buffer\r
- HDC hdcDibRotate;\r
- HBITMAP hBmpRotate, hOldBmpRotate;\r
- LPBYTE lpBufRotate;\r
- scrntype* lpBmpRotate;\r
- LPBITMAPINFO lpDibRotate;\r
-#endif\r
- \r
- // stretch buffer\r
- HDC hdcDibStretch1;\r
- HBITMAP hBmpStretch1, hOldBmpStretch1;\r
- LPBYTE lpBufStretch1;\r
- scrntype* lpBmpStretch1;\r
- LPBITMAPINFO lpDibStretch1;\r
- \r
- HDC hdcDibStretch2;\r
- HBITMAP hBmpStretch2, hOldBmpStretch2;\r
- LPBYTE lpBufStretch2;\r
- scrntype* lpBmpStretch2;\r
- LPBITMAPINFO lpDibStretch2;\r
- \r
- // for direct3d9\r
- LPDIRECT3D9 lpd3d9;\r
- LPDIRECT3DDEVICE9 lpd3d9Device;\r
- LPDIRECT3DSURFACE9 lpd3d9Surface;\r
- LPDIRECT3DSURFACE9 lpd3d9OffscreenSurface;\r
- scrntype *lpd3d9Buffer;\r
- bool render_to_d3d9Buffer;\r
- bool use_d3d9;\r
- bool wait_vsync;\r
- // record video\r
- _TCHAR video_file_name[_MAX_PATH];\r
- int rec_video_fps;\r
- double rec_video_run_frames;\r
- double rec_video_frames;\r
-#endif \r
- \r
-#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)\r
-#else\r
- LPBITMAPINFO lpDibRec;\r
- PAVIFILE pAVIFile;\r
- PAVISTREAM pAVIStream;\r
- PAVISTREAM pAVICompressed;\r
- AVICOMPRESSOPTIONS opts;\r
- DWORD dwAVIFileSize;\r
- LONG lAVIFrames;\r
- \r
- HDC hdcDibRec;\r
- HBITMAP hBmpRec, hOldBmpRec;\r
- LPBYTE lpBufRec;\r
- scrntype* lpBmpRec;\r
-\r
- bool use_video_thread;\r
- HANDLE hVideoThread;\r
- video_thread_t video_thread_param;\r
-\r
- void initialize_sound();\r
- void release_sound();\r
- void update_sound(int* extra_frames);\r
- \r
- int sound_rate, sound_samples;\r
- bool sound_ok, sound_started, now_mute;\r
-\r
-#endif\r
- \r
- \r
- // ----------------------------------------\r
- // sound\r
- // ----------------------------------------\r
-#if defined(_USE_AGAR) || defined(_USE_QT)\r
-#else\r
- // direct sound\r
- LPDIRECTSOUND lpds;\r
- LPDIRECTSOUNDBUFFER lpdsb, lpdsp;\r
- bool first_half;\r
- \r
- // record sound\r
- _TCHAR sound_file_name[_MAX_PATH];\r
- FILEIO* rec;\r
- int rec_bytes;\r
- int rec_buffer_ptr;\r
-#endif\r
-#endif\r
- \r
-#if defined(_USE_AGAR)\r
- // ----------------------------------------\r
- // direct show\r
- // ----------------------------------------\r
- void initialize_display_agar();\r
- void release_display_agar();\r
-#elif defined(_USE_QT)\r
-#else\r
-#ifdef USE_DIRECT_SHOW\r
- // ----------------------------------------\r
- // direct show\r
- // ----------------------------------------\r
- void initialize_direct_show();\r
- void release_direct_show();\r
- void create_direct_show_dib_section();\r
- void release_direct_show_dib_section();\r
- \r
- IGraphBuilder *pGraphBuilder;\r
- IBaseFilter *pVideoBaseFilter;\r
- IBaseFilter *pCaptureBaseFilter;\r
- ICaptureGraphBuilder2 *pCaptureGraphBuilder2;\r
- ISampleGrabber *pVideoSampleGrabber;\r
- IBaseFilter *pSoundBaseFilter;\r
- ISampleGrabber *pSoundSampleGrabber;\r
- CMySampleGrabberCB *pSoundCallBack;\r
- IMediaControl *pMediaControl;\r
- IMediaSeeking *pMediaSeeking;\r
- IMediaPosition *pMediaPosition;\r
- IVideoWindow *pVideoWindow;\r
- IBasicVideo *pBasicVideo;\r
- IBasicAudio *pBasicAudio;\r
- bool bTimeFormatFrame;\r
- bool bVirticalReversed;\r
- \r
- HDC hdcDibDShow;\r
- HBITMAP hBmpDShow, hOldBmpDShow;\r
- LPBYTE lpBufDShow;\r
- scrntype* lpBmpDShow;\r
- LPBITMAPINFO lpDibDShow;\r
- \r
- int direct_show_width, direct_show_height;\r
- bool direct_show_mute[2];\r
-#ifdef USE_LASER_DISC\r
- double movie_frame_rate;\r
- int movie_sound_rate;\r
- bool now_movie_play, now_movie_pause;\r
-#endif\r
-#ifdef USE_VIDEO_CAPTURE\r
- void enum_capture_devs();\r
- bool connect_capture_dev(int index, bool pin);\r
- int cur_capture_dev_index;\r
- int num_capture_devs;\r
- _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];\r
-#endif\r
-#endif\r
-#endif // _WIN32\r
- \r
- // ----------------------------------------\r
- // media\r
- // ----------------------------------------\r
- typedef struct {\r
- _TCHAR path[_MAX_PATH];\r
- bool play;\r
- int offset;\r
- int wait_count;\r
- } media_status_t;\r
- \r
-#ifdef USE_CART1\r
- media_status_t cart_status[MAX_CART];\r
-#endif\r
-#ifdef USE_FD1\r
- media_status_t disk_status[MAX_FD];\r
-#endif\r
-#ifdef USE_QD1\r
- media_status_t quickdisk_status[MAX_QD];\r
-#endif\r
-#ifdef USE_TAPE\r
- media_status_t tape_status;\r
-#endif\r
-#ifdef USE_LASER_DISC\r
- media_status_t laser_disc_status;\r
-#endif\r
- \r
- void initialize_media();\r
- void update_media();\r
- void restore_media();\r
- \r
- void clear_media_status(media_status_t *status)\r
- {\r
- status->path[0] = _T('\0');\r
- status->wait_count = 0;\r
- }\r
- \r
- // ----------------------------------------\r
- // printer\r
- // ----------------------------------------\r
- void initialize_printer();\r
- void release_printer();\r
- void reset_printer();\r
- void update_printer();\r
- void open_printer_file();\r
- void close_printer_file();\r
-#ifdef _USE_QT\r
- _TCHAR prn_file_name[_MAX_PATH];\r
-#else\r
- _TCHAR prn_file_name[AG_PATHNAME_MAX];\r
-#endif\r
- FILEIO *prn_fio;\r
- int prn_data, prn_wait_frames;\r
- bool prn_strobe;\r
- \r
-#ifdef USE_SOCKET\r
- // ----------------------------------------\r
- // socket\r
- // ----------------------------------------\r
- void initialize_socket();\r
- void release_socket();\r
- void update_socket();\r
- \r
- int soc[SOCKET_MAX];\r
- bool is_tcp[SOCKET_MAX];\r
- struct sockaddr_in udpaddr[SOCKET_MAX];\r
- int socket_delay[SOCKET_MAX];\r
- char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];\r
- int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];\r
-#endif\r
- \r
-#ifdef USE_DEBUGGER\r
- // ----------------------------------------\r
- // debugger\r
- // ----------------------------------------\r
- void initialize_debugger();\r
- void release_debugger();\r
-#if defined(_USE_AGAR)\r
- AG_Thread hDebuggerThread;\r
-#elif defined(_USE_QT)\r
-#else\r
- HANDLE hDebuggerThread;\r
-#endif\r
- debugger_thread_t debugger_thread_param;\r
-#endif\r
- \r
-#ifdef _DEBUG_LOG\r
- // ----------------------------------------\r
- // debug log\r
- // ----------------------------------------\r
- void initialize_debug_log();\r
- void release_debug_log();\r
- FILE* debug_log;\r
-#endif\r
- \r
-#ifdef USE_STATE\r
- // ----------------------------------------\r
- // state\r
- // ----------------------------------------\r
- void save_state_tmp(_TCHAR* file_path);\r
- bool load_state_tmp(_TCHAR* file_path);\r
-#endif\r
- \r
- // ----------------------------------------\r
- // misc\r
- // ----------------------------------------\r
-#ifdef USE_CPU_TYPE\r
- int cpu_type;\r
-#endif\r
-#ifdef USE_SOUND_DEVICE_TYPE\r
- int sound_device_type;\r
-#endif\r
- _TCHAR app_path[_MAX_PATH];\r
- bool now_suspended;\r
- \r
-public:\r
- bool bDrawLine[SCREEN_HEIGHT];\r
- // ----------------------------------------\r
- // initialize\r
- // ----------------------------------------\r
-#if defined(_USE_AGAR)\r
- EMU(AG_Window *hwnd, AG_Widget *hinst);\r
-#elif defined(_USE_QT)\r
- EMU(class UI_MainWindow *hwnd, class GLDrawClass *hinst);\r
-#else\r
- EMU(HWND hwnd, HINSTANCE hinst);\r
-#endif\r
- ~EMU();\r
-\r
- _TCHAR* application_path()\r
- {\r
- return app_path;\r
- }\r
- _TCHAR* bios_path(_TCHAR* file_name);\r
-#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)\r
- // To be thread safety.\r
- void LockVM(void) {\r
- if(pVMSemaphore) SDL_SemWait(pVMSemaphore);\r
- }\r
- void UnlockVM(void) {\r
- if(pVMSemaphore) SDL_SemPost(pVMSemaphore);\r
- }\r
-#endif\r
- \r
- // ----------------------------------------\r
- // for windows\r
- // ----------------------------------------\r
-#if defined(_USE_AGAR)\r
- AG_Window *main_window_handle;\r
- AG_Widget *instance_handle;\r
- bool use_opengl;\r
- bool use_opencl;\r
-#elif defined(_USE_QT)\r
- class Ui_MainWindow *main_window_handle;\r
- class GLDrawClass *instance_handle;\r
- bool use_opengl;\r
- bool use_opencl;\r
-#else\r
- HWND main_window_handle;\r
- HINSTANCE instance_handle;\r
-#endif \r
- // drive virtual machine\r
- int frame_interval();\r
- int run();\r
- void reset();\r
-#ifdef USE_SPECIAL_RESET\r
- void special_reset();\r
-#endif\r
-#ifdef USE_POWER_OFF\r
- void notify_power_off();\r
-#endif\r
- void suspend();\r
- \r
- // media\r
-#ifdef USE_FD1\r
- typedef struct {\r
- _TCHAR name[18];\r
- int offset;\r
- } d88_bank_t;\r
- typedef struct {\r
- _TCHAR path[_MAX_PATH];\r
- d88_bank_t bank[MAX_D88_BANKS];\r
- int bank_num;\r
- int cur_bank;\r
- } d88_file_t;\r
- d88_file_t d88_file[MAX_FD];\r
-#endif\r
- \r
- // user interface\r
-#ifdef USE_CART1\r
- void open_cart(int drv, _TCHAR* file_path);\r
- void close_cart(int drv);\r
- bool cart_inserted(int drv);\r
-#endif\r
-#ifdef USE_FD1\r
- void open_disk(int drv, _TCHAR* file_path, int offset);\r
- void close_disk(int drv);\r
- bool disk_inserted(int drv);\r
-#endif\r
-#ifdef USE_QD1\r
- void open_quickdisk(int drv, _TCHAR* file_path);\r
- void close_quickdisk(int drv);\r
- bool quickdisk_inserted(int drv);\r
-#endif\r
-#ifdef USE_TAPE\r
- void play_tape(_TCHAR* file_path);\r
- void rec_tape(_TCHAR* file_path);\r
- void close_tape();\r
- bool tape_inserted();\r
-#endif\r
-#ifdef USE_TAPE_BUTTON\r
- void push_play();\r
- void push_stop();\r
-#endif\r
-#ifdef USE_LASER_DISC\r
- void open_laser_disc(_TCHAR* file_path);\r
- void close_laser_disc();\r
- bool laser_disc_inserted();\r
-#endif\r
-#ifdef USE_BINARY_FILE1\r
- void load_binary(int drv, _TCHAR* file_path);\r
- void save_binary(int drv, _TCHAR* file_path);\r
-#endif\r
- bool now_skip();\r
- \r
- void start_rec_sound();\r
- void stop_rec_sound();\r
- void restart_rec_sound();\r
- bool now_rec_sound;\r
- \r
- void capture_screen();\r
- bool start_rec_video(int fps);\r
- void stop_rec_video();\r
- void restart_rec_video();\r
- bool now_rec_video;\r
- \r
- void update_config();\r
- \r
-#ifdef USE_STATE\r
- void save_state();\r
- void load_state();\r
-#endif\r
- \r
- // input device\r
- void key_down(int code, bool repeat);\r
- void key_up(int code);\r
- void key_lost_focus()\r
- {\r
- lost_focus = true;\r
- }\r
- uint32 recent_key_sym;\r
- uint32 recent_key_mod;\r
- uint32 recent_key_unicode;\r
-#ifdef USE_BUTTON\r
- void press_button(int num);\r
-#endif\r
- \r
- void enable_mouse();\r
- void disenable_mouse();\r
- void toggle_mouse();\r
- bool get_mouse_enabled()\r
- {\r
- return mouse_enabled;\r
- }\r
- \r
-#ifdef USE_AUTO_KEY\r
- void start_auto_key();\r
- void stop_auto_key();\r
- bool now_auto_key()\r
- {\r
- return (autokey_phase != 0);\r
- }\r
-#endif\r
- \r
- // screen\r
- int get_window_width(int mode);\r
- int get_window_height(int mode);\r
- void set_display_size(int width, int height, bool window_mode);\r
- int draw_screen();\r
-#if defined(_USE_AGAR)\r
- void update_screen(AG_Widget *target);\r
-#elif defined(_USE_QT)\r
- void update_screen(GLDrawClass *glv);\r
-#else\r
- void update_screen(HDC hdc);\r
-#endif\r
-#ifdef USE_BITMAP\r
- void reload_bitmap()\r
- {\r
- first_invalidate = true;\r
- }\r
-#endif\r
- \r
- // sound\r
- void mute_sound();\r
- \r
-#ifdef USE_VIDEO_CAPTURE\r
- // video capture\r
- int get_cur_capture_dev_index()\r
- {\r
- return cur_capture_dev_index;\r
- }\r
- int get_num_capture_devs()\r
- {\r
- return num_capture_devs;\r
- }\r
- _TCHAR* get_capture_dev_name(int index)\r
- {\r
- return capture_dev_name[index];\r
- }\r
- void open_capture_dev(int index, bool pin);\r
- void close_capture_dev();\r
- void show_capture_dev_filter();\r
- void show_capture_dev_pin();\r
- void show_capture_dev_source();\r
-#endif\r
- \r
-#ifdef USE_SOCKET\r
- // socket\r
- int get_socket(int ch)\r
- {\r
- return soc[ch];\r
- }\r
- void socket_connected(int ch);\r
- void socket_disconnected(int ch);\r
- void send_data(int ch);\r
- void recv_data(int ch);\r
-#endif\r
- \r
-#ifdef USE_DEBUGGER\r
- // debugger\r
- void open_debugger(int cpu_index);\r
- void close_debugger();\r
- bool debugger_enabled(int cpu_index);\r
- bool now_debugging;\r
-#endif\r
- \r
- // ----------------------------------------\r
- // for virtual machine\r
- // ----------------------------------------\r
- \r
- // power off\r
- void power_off()\r
- {\r
-#if defined(_USE_AGAR)\r
-\r
-#elif defined(_USE_QT)\r
- \r
-#else\r
- PostMessage(main_window_handle, WM_CLOSE, 0, 0L);\r
-#endif\r
- }\r
- \r
- // input device\r
- uint8* key_buffer()\r
- {\r
- return key_status;\r
- }\r
- uint32* joy_buffer()\r
- {\r
- return joy_status;\r
- }\r
- int* mouse_buffer()\r
- {\r
- return mouse_status;\r
- }\r
- \r
- // screen\r
- void change_screen_size(int sw, int sh, int swa, int sha, int ww, int wh);\r
- scrntype* screen_buffer(int y);\r
-#ifdef USE_CRT_FILTER\r
- bool screen_skip_line;\r
-#endif\r
- \r
- // timer\r
- void get_host_time(cur_time_t* time);\r
- \r
- // printer\r
- void printer_out(uint8 value);\r
- void printer_strobe(bool value);\r
- \r
-#ifdef USE_DIRECT_SHOW\r
- // direct show\r
- void get_direct_show_buffer();\r
- void mute_direct_show_dev(bool l, bool r);\r
- \r
-#ifdef USE_LASER_DISC\r
- bool open_movie_file(_TCHAR* file_path);\r
- void close_movie_file();\r
- \r
- void play_movie();\r
- void stop_movie();\r
- void pause_movie();\r
- \r
- double get_movie_frame_rate()\r
- {\r
- return movie_frame_rate;\r
- }\r
- int get_movie_sound_rate()\r
- {\r
- return movie_sound_rate;\r
- }\r
- void set_cur_movie_frame(int frame, bool relative);\r
- uint32 get_cur_movie_frame();\r
-#endif\r
-#ifdef USE_VIDEO_CAPTURE\r
- void set_capture_dev_channel(int ch);\r
-#endif\r
-#endif\r
- \r
-#ifdef USE_SOCKET\r
- // socket\r
- bool init_socket_tcp(int ch);\r
- bool init_socket_udp(int ch);\r
- bool connect_socket(int ch, uint32 ipaddr, int port);\r
- void disconnect_socket(int ch);\r
- bool listen_socket(int ch);\r
- void send_data_tcp(int ch);\r
- void send_data_udp(int ch, uint32 ipaddr, int port);\r
-#endif\r
- \r
- // debug log\r
- void out_debug_log(const _TCHAR* format, ...);\r
- \r
- void out_message(const _TCHAR* format, ...);\r
- int message_count;\r
- _TCHAR message[_MAX_PATH];\r
-};\r
-#endif\r
-\r
-\r
+/*
+ Skelton for retropc emulator
+
+ Author : Takeda.Toshiya
+ Date : 2006.08.18 -
+
+ [ win32 emulation i/f ]
+*/
+
+#ifndef _EMU_H_
+#define _EMU_H_
+
+// for debug
+//#define _DEBUG_LOG
+#ifdef _DEBUG_LOG
+ // output fdc debug log
+// #define _FDC_DEBUG_LOG
+ // output i/o debug log
+// #define _IO_DEBUG_LOG
+#endif
+
+#if defined(_USE_QT)
+# include <SDL.h>
+# include "simd_types.h"
+// Wrapper of WIN32->*nix
+
+
+#else // _USE_WIN32
+
+#include <process.h>
+
+#endif // _USE_WIN32
+
+#include <stdio.h>
+#include <assert.h>
+#include "common.h"
+#include "config.h"
+#include "vm/vm.h"
+#if defined(USE_FD1)
+#include "vm/disk.h"
+#endif
+
+
+#if defined(_USE_QT)
+#define OSD_QT
+#elif defined(_USE_SDL)
+#define OSD_SDL
+#elif defined(_WIN32)
+#define OSD_WIN32
+#else
+// oops!
+#endif
+
+
+// OS dependent header files should be included in each osd.h
+// Please do not include them in emu.h
+
+#if defined(OSD_QT)
+#include "qt/osd.h"
+#elif defined(OSD_SDL)
+#include "sdl/osd.h"
+#elif defined(OSD_WIN32)
+#include "win32/osd.h"
+#endif
+
+#ifdef USE_FD1
+#define MAX_D88_BANKS 64
+#endif
+
+#ifdef USE_SOCKET
+#define SOCKET_MAX 4
+#define SOCKET_BUFFER_MAX 0x100000
+#endif
+
+
+class EMU;
+class FIFO;
+class FILEIO;
+class OSD;
+
+#ifdef USE_DEBUGGER
+typedef struct {
+ OSD *osd;
+ VM *vm;
+ int cpu_index;
+ bool running;
+ bool request_terminate;
+} debugger_thread_t;
+class CSP_Debugger;
+#endif
+
+#if defined(OSD_QT)
+class GLDrawClass;
+class EmuThreadClass;
+class DrawThreadClass;
+#endif
+
+#ifdef __cplusplus
+class EMU
+{
+protected:
+ VM* vm;
+ OSD* osd;
+private:
+ _TCHAR app_path[_MAX_PATH];
+ // ----------------------------------------
+ // sound
+ // ----------------------------------------
+ void initialize_sound();
+ void release_sound();
+ void update_sound(int* extra_frames);
+
+ // ----------------------------------------
+ // media
+ // ----------------------------------------
+ typedef struct {
+ _TCHAR path[_MAX_PATH];
+ bool play;
+ int bank;
+ int wait_count;
+ } media_status_t;
+
+#ifdef USE_CART1
+ media_status_t cart_status[MAX_CART];
+#endif
+#ifdef USE_FD1
+ media_status_t floppy_disk_status[MAX_FD];
+#endif
+#ifdef USE_QD1
+ media_status_t quick_disk_status[MAX_QD];
+#endif
+#ifdef USE_TAPE
+ media_status_t tape_status;
+#endif
+#endif
+#ifdef USE_LASER_DISC
+ media_status_t laser_disc_status;
+#endif
+
+#ifdef USE_SOCKET
+ int soc[SOCKET_MAX];
+ bool is_tcp[SOCKET_MAX];
+#if !defined(_USE_QT)
+ struct sockaddr_in udpaddr[SOCKET_MAX];
+#endif
+ int socket_delay[SOCKET_MAX];
+ char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
+ int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
+#endif
+ void initialize_media();
+ void update_media();
+ void restore_media();
+
+ void clear_media_status(media_status_t *status)
+ {
+ status->path[0] = _T('\0');
+ status->wait_count = 0;
+ }
+
+
+ // ----------------------------------------
+ // state
+ // ----------------------------------------
+#ifdef USE_STATE
+ void save_state_tmp(const _TCHAR* file_path);
+ bool load_state_tmp(const _TCHAR* file_path);
+#endif
+
+public:
+ // ----------------------------------------
+ // initialize
+ // ----------------------------------------
+#if defined(OSD_QT)
+ EMU(class Ui_MainWindow *hwnd, GLDrawClass *hinst);
+#elif defined(OSD_WIN32)
+ EMU(HWND hwnd, HINSTANCE hinst);
+#else
+ EMU();
+#endif
+ ~EMU();
+
+ // ----------------------------------------
+ // for windows
+ // ----------------------------------------
+#if defined(_USE_QT)
+#ifdef OSD_QT
+ // qt dependent
+ EmuThreadClass *get_parent_handler();
+ void set_parent_handler(EmuThreadClass *p, DrawThreadClass *q);
+ VM *get_vm()
+ {
+ return vm;
+ }
+ OSD *get_osd()
+ {
+ return osd;
+ }
+ void set_host_cpus(int v);
+ int get_host_cpus();
+#endif
+#ifdef USE_DEBUGGER
+ debugger_thread_t debugger_thread_param;
+ SDL_Thread *debugger_thread_id;
+ CSP_Debugger *hDebugger;
+#endif
+ void set_mouse_pointer(int x, int y);
+ void set_mouse_button(int button);
+ int get_mouse_button();
+#else
+ HWND main_window_handle;
+ HINSTANCE instance_handle;
+ bool vista_or_later;
+#endif
+ // drive machine
+ int get_frame_interval();
+ bool is_frame_skippable();
+ int run();
+
+ void reset();
+#ifdef USE_SPECIAL_RESET
+ void special_reset();
+#endif
+#ifdef USE_NOTIFY_POWER_OFF
+ void notify_power_off();
+#endif
+ void power_off();
+ void suspend();
+ void lock_vm();
+ void unlock_vm();
+ void force_unlock_vm();
+ bool is_vm_locked();
+
+ // input
+#ifdef OSD_QT
+ void key_modifiers(uint32 mod);
+#endif
+ void key_down(int code, bool repeat);
+ void key_up(int code);
+ void key_lost_focus();
+#ifdef ONE_BOARD_MICRO_COMPUTER
+ void press_button(int num);
+#endif
+ void enable_mouse();
+ void disenable_mouse();
+ void toggle_mouse();
+ bool get_mouse_enabled();
+ bool is_mouse_enabled();
+#ifdef USE_AUTO_KEY
+ void start_auto_key();
+ void stop_auto_key();
+ bool is_auto_key_running()
+ {
+ return (auto_key_phase != 0);
+ }
+ FIFO* get_auto_key_buffer()
+ {
+ return auto_key_buffer;
+ }
+#endif
+
+ const uint8* get_key_buffer();
+ const uint32* get_joy_buffer();
+ const int* get_mouse_buffer();
+
+ // screen
+ int get_window_width(int mode);
+ int get_window_height(int mode);
+ void set_host_window_size(int window_width, int window_height, bool window_mode);
+ void set_vm_screen_size(int screen_width, int screen_height, int window_width, int window_height, int window_width_aspect, int window_height_aspect);
+ int get_vm_window_width();
+ int get_vm_window_height();
+ int get_vm_window_width_aspect();
+ int get_vm_window_height_aspect();
+#if defined(USE_MINIMUM_RENDERING)
+ bool is_screen_changed();
+#endif
+ int draw_screen();
+ scrntype* get_screen_buffer(int y);
+#ifdef USE_CRT_FILTER
+ void screen_skip_line(bool skip_line);
+#endif
+#ifdef ONE_BOARD_MICRO_COMPUTER
+ void reload_bitmap();
+#endif
+#ifdef OSD_WIN32
+ void update_screen(HDC hdc);
+#endif
+ void capture_screen();
+ bool start_record_video(int fps);
+ void stop_record_video();
+ bool is_video_recording();
+
+ // sound
+ void mute_sound();
+ void start_recording_sound();
+ void stop_recording_sound();
+ bool is_sound_recording();
+
+ // video device
+#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
+ void get_video_buffer();
+ void mute_video_dev(bool l, bool r);
+#endif
+#ifdef USE_MOVIE_PLAYER
+ bool open_movie_file(const _TCHAR* file_path);
+ void close_movie_file();
+ void play_movie();
+ void stop_movie();
+ void pause_movie();
+ double get_movie_frame_rate();
+ int get_movie_sound_rate();
+ void set_cur_movie_frame(int frame, bool relative);
+ uint32 get_cur_movie_frame();
+#endif
+#ifdef USE_VIDEO_CAPTURE
+ int get_cur_capture_dev_index();
+ int get_num_capture_devs();
+ _TCHAR* get_capture_dev_name(int index);
+ void open_capture_dev(int index, bool pin);
+ void close_capture_dev();
+ void show_capture_dev_filter();
+ void show_capture_dev_pin();
+ void show_capture_dev_source();
+ void set_capture_dev_channel(int ch);
+#endif
+
+#ifdef USE_PRINTER
+ void create_bitmap(bitmap_t *bitmap, int width, int height);
+ void release_bitmap(bitmap_t *bitmap);
+ void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
+ void release_font(font_t *font);
+ void create_pen(pen_t *pen, int width, uint8 r, uint8 g, uint8 b);
+ void release_pen(pen_t *pen);
+ void clear_bitmap(bitmap_t *bitmap, uint8 r, uint8 g, uint8 b);
+ int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
+ void draw_text_to_bitmap(bitmap_t *bitmap, font_t *font, int x, int y, const char *text, uint8 r, uint8 g, uint8 b);
+ void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
+ void draw_rectangle_to_bitmap(bitmap_t *bitmap, int x, int y, int width, int height, uint8 r, uint8 g, uint8 b);
+ void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8 r, uint8 g, uint8 b);
+ void stretch_bitmap(bitmap_t *dest, int dest_x, int dest_y, int dest_width, int dest_height, bitmap_t *source, int source_x, int source_y, int source_width, int source_height);
+ void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
+#endif
+ // socket
+#ifdef USE_SOCKET
+ int get_socket(int ch);
+ void notify_socket_connected(int ch);
+ void notify_socket_disconnected(int ch);
+ bool initialize_socket_tcp(int ch);
+ bool initialize_socket_udp(int ch);
+ bool connect_socket(int ch, uint32 ipaddr, int port);
+ void disconnect_socket(int ch);
+ bool listen_socket(int ch);
+ void send_socket_data_tcp(int ch);
+ void send_socket_data_udp(int ch, uint32 ipaddr, int port);
+ void send_socket_data(int ch);
+ void recv_socket_data(int ch);
+#endif
+ // debugger
+#ifdef USE_DEBUGGER
+ void open_debugger(int cpu_index);
+ void close_debugger();
+ bool is_debugger_enabled(int cpu_index);
+ void initialize_debugger();
+ void release_debugger();
+ bool now_debugging;
+#endif
+ // debug log
+ void out_debug_log(const _TCHAR* format, ...);
+ void out_message(const _TCHAR* format, ...);
+ int message_count;
+ _TCHAR message[1024];
+
+ // misc
+ void sleep(uint32 ms);
+
+ // debug log
+#ifdef _DEBUG_LOG
+ void initialize_debug_log();
+ void release_debug_log();
+ FILE* debug_log;
+#endif
+
+ // misc
+ int sound_rate, sound_samples;
+#ifdef USE_CPU_TYPE
+ int cpu_type;
+#endif
+#ifdef USE_SOUND_DEVICE_TYPE
+ int sound_device_type;
+#endif
+#ifdef USE_PRINTER
+ int printer_device_type;
+#endif
+ bool now_suspended;
+
+ // input
+#ifdef USE_AUTO_KEY
+ FIFO* auto_key_buffer;
+ int auto_key_phase, auto_key_shift;
+ void initialize_auto_key();
+ void release_auto_key();
+ void update_auto_key();
+#endif
+ uint32 joy_status[4];
+ void update_joystick();
+
+ // media
+#ifdef USE_FD1
+ struct {
+ _TCHAR path[_MAX_PATH];
+ _TCHAR disk_name[MAX_D88_BANKS][128]; // Convert to UTF8
+ int bank_num;
+ int cur_bank;
+ } d88_file[MAX_FD];
+#endif
+ int get_access_lamp(void);
+ // user interface
+#ifdef USE_CART1
+ void open_cart(int drv, const _TCHAR* file_path);
+ void close_cart(int drv);
+ bool is_cart_inserted(int drv);
+#endif
+#ifdef USE_FD1
+ void open_floppy_disk(int drv, const _TCHAR* file_path, int bank);
+ void close_floppy_disk(int drv);
+ bool is_floppy_disk_inserted(int drv);
+ void is_floppy_disk_protected(int drv, bool value);
+ bool is_floppy_disk_protected(int drv);
+#endif
+#ifdef USE_QD1
+ void open_quick_disk(int drv, const _TCHAR* file_path);
+ void close_quick_disk(int drv);
+ bool is_quick_disk_inserted(int drv);
+#endif
+#ifdef USE_TAPE
+ void play_tape(const _TCHAR* file_path);
+ void rec_tape(const _TCHAR* file_path);
+ void close_tape();
+ bool is_tape_inserted();
+# ifndef TAPE_BINARY_ONLY
+ bool is_tape_playing();
+ bool is_tape_recording();
+ int get_tape_position();
+# endif
+# ifdef USE_TAPE_BUTTON
+ void push_play();
+ void push_stop();
+ void push_fast_forward();
+ void push_fast_rewind();
+ void push_apss_forward();
+ void push_apss_rewind();
+# endif
+#endif
+#ifdef USE_LASER_DISC
+ void open_laser_disc(const _TCHAR* file_path);
+ void close_laser_disc();
+ bool is_laser_disc_inserted();
+#endif
+#ifdef USE_BINARY_FILE1
+ void load_binary(int drv, const _TCHAR* file_path);
+ void save_binary(int drv, const _TCHAR* file_path);
+#endif
+#ifdef SUPPORT_DUMMY_DEVICE_LED
+ uint32 get_led_status(void);
+#endif
+#ifdef USE_SOUND_VOLUME
+ void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
+#endif
+ void update_config();
+ // state
+#ifdef USE_STATE
+ void save_state();
+ void load_state();
+#endif
+};
+#endif // _EMU_H_
+