OSDN Git Service

[VM][General][WIP] Apply new (Upstream 2016-02-21) APIs to VMs.
[csp-qt/common_source_project-fm7.git] / source / src / emu.h
index e9eceee..3d8bc3b 100644 (file)
-/*\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 <SDL2/SDL.h>\r
-//# include "menuclasses.h"\r
-# include "mainwidget.h"\r
-# include "qt_gldraw.h"\r
-# include "emu_utils.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
-#if defined(USE_FD1)\r
-#include "vm/disk.h"\r
-#endif\r
-\r
-#if defined(_USE_AGAR)\r
-#include "agar_input.h"\r
-#elif defined(_USE_QT)\r
-#include "qt_input.h"\r
-#endif\r
-\r
-#if defined(_USE_AGAR) || defined(_USE_QT)\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
-        uint32_t modkey_status;\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
-#ifdef _USE_QT\r
-        QImage *pPseudoVram;\r
-#else\r
-       Uint32 *pPseudoVram;\r
-#endif\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
-        uint32_t *getJoyStatPtr(void) {\r
-          return joy_status;\r
-       }\r
-   \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*, GLDrawClass*);\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
-#ifdef _USE_QT\r
-        QImage *getPseudoVramClass(void) { return pPseudoVram;}\r
-#endif\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
-       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[128]; // Convert to UTF8\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
-       int get_access_lamp(void);\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
-       bool is_write_protected_fd(int drv);\r
-       void write_protect_fd(int drv, bool flag);\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
-        int get_tape_ptr() {\r
-          return vm->get_tape_ptr();\r
-       }\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
-#if defined(_USE_QT)\r
-       void key_mod(uint32 mod) {\r
-           modkey_status = mod;\r
-       }\r
-#endif\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
-       int get_screen_width_aspect(void) {return screen_width_aspect;}\r
-       int get_screen_height_aspect(void) {return screen_height_aspect;}\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_
+