-
Notifications
You must be signed in to change notification settings - Fork 7
/
README.ja
161 lines (128 loc) · 5.27 KB
/
README.ja
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
美しい日本のファミコンエミュレータ
(Beautiful Japanese NES Emulator)
Copyright(C) 2005-2010 tanakh
・概要/コンセプト
ファミコンエミュレータです。
何が美しいのかというと、ずばりソースコードです。
ソースコードが美しくて何が嬉しい?というのは至極当然な疑問でありますが、
プログラマの人以外には嬉しいことはありません。
何が嬉しいのかというと、エミュレータというものの構造の理解に
有用に働くのではないかと思われます。
では、美しいとは何?どういう基準なの?というのもこれまた
至極当然の疑問でありますが、ここでの美しさは構造の単純さ、
ソースコードの簡潔さ、ということにしておきます。
あらゆる部分から非自明な・回りくどいコードを排除して
いわゆる読みやすいコードにしたつもりです。
(中にはファミコン固有の仕様を知らなければどうしようもない部分もありますが)
そういうわけで、コードが美しいわけなのですが、
美しくするためにエミュレーション精度・拡張性を犠牲にしては
下も子もありませんから、なるべく高精度なエミュレーションを維持します。
拡張性も、将来的に色々なマッパーに対応できるだけのキャパシティを持たせます。
エミュレーション速度は今回はあまり意識していないので
いわゆるパフォーマンスハックの類は一切入れていません。
・現在の成果
ファミコンの全機能実装で、
$ wc *.h *.cpp
105 231 2361 apu.h
51 83 811 cpu.h
18 33 277 mapper.h
34 61 510 mbc.h
45 98 773 nes.h
43 85 838 ppu.h
60 96 1029 regs.h
42 77 930 renderer.h
45 96 842 rom.h
129 200 3138 sdl_renderer.h
49 76 1064 timer.h
15 39 350 types.h
7 11 113 util.h
446 686 11739 apu.cpp
600 1714 18198 cpu.cpp
82 133 1717 main.cpp
20 57 481 mapper.cpp
109 297 2942 mbc.cpp
106 176 2174 nes.cpp
206 357 6288 ppu.cpp
266 497 6545 regs.cpp
92 127 1720 rom.cpp
2570 5230 64840 total
2千五百行ででファミコンエミュレータが出来た!
(マッパー含まず)
・ソース解説
ソースは主にUI部分とエミュレーションコア部分に分かれています。
両者はrendererというインターフェースを用いて接続されます。
エミュレーションコア部分はあらゆる環境に非依存なので
移植性が高いかと思われます。
UI部はSDLに依存しています。
(UI部)
main.cpp
エントリポイント、リソース初期化、実行ループ …など
timer.h
FPS維持用のタイマ
sdl_renderer.h
SDLレンダラの実装
(エミュレーションコア部)
types.h
サイズ指定な整数型の定義
util.h
色々な定義
nes.h nes.cpp
NESクラスの実装。各種エミュレーションリソースを保持していたりする。
cpu.h cpu.cpp
6502エミュレーションコア
ppu.h ppu.cpp
PPUエミュレーション部
apu.h apu.cpp
APUエミュレーション部
rom.h rom.cpp
ROMイメージ管理クラス
mbc.h mbc.cpp
メモリコントローラ
regs.h regs.cpp
ハードウェアレジスタの処理
mapper.h
マッパークラスの定義
mapper.cpp
マッパーファクトリ
mapper/*.h
個々のマッパーの実装
・使い方
コマンドライン引数からROMイメージを引数に渡すとエミュレーションが開始されます。
・動作環境
g++とSDLのあるところならどこでもコンパイルできるはずです。
とりあえずWindows XPでは動作確認できています。
・免責
このプログラムの使用によるいかなる傷害に対しても
作者は責任を負いかねます。自己責任でご使用ください。
・ライセンス
このプログラムは修正BSDライセンスに基づいて頒布されます。
・更新履歴
2010/3/14 0.2.0
ライセンスを修正BSDに変更
waf化
githubで公開
2005/5/9 0.1.2
SRAMセーブ実装。
ステートセーブ実装。
レンダラのインターフェースに仮想デストラクタの定義が抜けていたのを修正(…うーむ)
2005/5/8 0.1.1
マッパー色々追加。
(それに伴って拡張サウンドの仕様など追加)
メモリコントローラ修正。
パッド周りのレジスタの処理がおかしかったのを修正。
2005/5/6 0.1.0
マッパー#3実装。
APU修正、DMC実装。
APUステータスレジスタの読み込みのタイミングをちゃんと実装。
PPU未実装部分実装。
プライオリティの処理がおかしかったのを修正。
NMIのタイミングを修正。
微妙にリファクタリング。
ひとまずファミコンの基本仕様が全部実装できた。
2005/5/4 0.0.1
サウンド実装、マッパー#1,#2,#4実装。
ちょっと実装がまずかった部分を変更。
CPUのバグを一箇所取った。
2005/5/1 0.0.0
とりあえずなんか動いたので出してみる。
デバッグ全然してないんだけど、なんか動いちゃってるなぁ。