forked from tianzhansheng/virtuanessrc097
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEmuThread.h
197 lines (153 loc) · 7.13 KB
/
EmuThread.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//
// エミュレータスレッドクラス
//
#ifndef __CEMUTHREAD_INCLUDED__
#define __CEMUTHREAD_INCLUDED__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string>
#include <deque>
#include <queue>
using namespace std;
#include "App.h"
#include "MMTimer.h"
#include "Config.h"
#include "WaveRec.h"
#include "typedef.h"
#include "macro.h"
#include "nes.h"
#include "mmu.h"
#include "cpu.h"
#include "ppu.h"
#include "apu.h"
#include "pad.h"
#include "rom.h"
#include "mapper.h"
// Prototypes
// NetPlay Event
class NETEV {
public:
INT Event;
DWORD Param;
};
//class NES;
class CEmuThread
{
public:
CEmuThread();
~CEmuThread();
// イベント
enum EMUEVENT {
EV_EXIT = -1,
EV_NONE = 0,
EV_INITIAL,
EV_PAUSE,
EV_RESUME,
// 以下はEventで使用する
EV_MESSAGE_OUT, // メッセージだけ出力したい時に使用
EV_FULLSCREEN_GDI, // EventParam
EV_EMUPAUSE,
EV_ONEFRAME,
EV_THROTTLE,
EV_FRAMESKIP_AUTO,
EV_FRAMESKIP_UP,
EV_FRAMESKIP_DOWN,
EV_HWRESET,
EV_SWRESET,
EV_NETPLAY_START,
EV_STATE_LOAD, // EventParam2
EV_STATE_SAVE, // EventParam2
// For Disk system
EV_DISK_COMMAND, // EventParam
// For ExController
EV_EXCONTROLLER, // EventParam
// For Sound
EV_SOUND_MUTE, // EventParam
// For Snapshot
EV_SNAPSHOT,
// For Movie
EV_MOVIE_PLAY, // EventParam
EV_MOVIE_REC, // EventParam
EV_MOVIE_RECAPPEND, // EventParam
EV_MOVIE_STOP, // EventParam
// For Wave recording
EV_WAVEREC_START, // EventParam
EV_WAVEREC_STOP,
// For Tape recording
EV_TAPE_PLAY, // EventParam
EV_TAPE_REC, // EventParam
EV_TAPE_STOP,
// For Barcode
EV_BARCODE, // EventParam2
// For TurboFile
EV_TURBOFILE, // EventParam
// For Debugger
EV_DEBUG_RUN,
EV_DEBUG_BRAKE,
EV_DEBUG_STEP,
EV_DEBUG_COMMAND, // EventParam
};
// 動作モード
enum {
STATUS_NONE = 0,
STATUS_RUN,
STATUS_PAUSE,
};
// デバッガコマンド
//
void SetPriority( INT nPriority );
BOOL Start( HWND hWnd, NES* nes );
void Stop();
void Pause();
void Resume();
void Event( EMUEVENT ev );
void EventParam( EMUEVENT ev, LONG Param );
void EventParam2( EMUEVENT ev, LONG Param, LONG Param2 );
BOOL IsRunning() { return (g_Status!=STATUS_NONE); }
BOOL IsPausing() { return (g_Status==STATUS_PAUSE); }
BOOL IsWaveRecord() { return g_WaveRec.IsWaveRecord(); }
INT GetDiskNo() { if( g_nes ) return g_nes->rom->GetDiskNo(); else return 0; }
INT GetExController() { if( g_nes ) return g_nes->pad->GetExController(); else return 0; }
//
NES* GetNES() { return g_nes; }
protected:
static void DiskCommand( BYTE cmd );
static BOOL FrameInput();
static DWORD WINAPI ThreadProc( LPVOID lpVoid );
// サウンドストリーミング用
static void StreamProcess( BOOL bPause );
// スレッドハンドルとID
HANDLE m_hThread;
DWORD m_dwThreadID;
// Thisポインタ
static CEmuThread* g_pThis;
// ウインドウハンドル
static HWND g_hWnd;
// エミュレータオブジェクトポインタ
static NES* g_nes;
// Waveレコーダ
static CWaveRec g_WaveRec;
// ポーズカウント
INT m_nPauseCount;
// ステータス
static INT g_Status;
// スレッドイベントとイベントハンドル
static INT g_Event;
static LONG g_EventParam;
static LONG g_EventParam2;
static HANDLE g_hEvent;
static HANDLE g_hEventAccept;
// スレッドプライオリティ
INT m_nPriority;
static INT g_PriorityTable[];
// エラーメッセージ
static CHAR g_szErrorMessage[512];
// ストリングテーブル
static LPCSTR g_lpSoundMuteStringTable[];
// NetPlay Event
static deque<NETEV> NetEventQueue;
static string strNetStateName;
private:
};
extern CEmuThread Emu;
#endif // !__CEMUTHREAD_INCLUDED__