
	TGB Dual Ver. Vol.7' (Build:2053)

§1 TGB Dual Version (以下 TGB Dual) とは…？：

 DMGシステム及びその上位機種(CGB)をエミュレーションします。
 いわゆるGameboy(Color)エミュレータです。

 システム必要最低条件
  32bitWindows & DirectX5 以上の環境
  (必然的にNTは駄目)
  サウンドカード必須(無論ビデオカードも)
  ジョイスティックは無くても可


§2 概要/エミュレーションの実装状況：

 1.DMG/CGB

 ・CPU…多分大丈夫だと。
 ・サウンドチップ(多分PSG系だと思う)…大体OKではなかろうかと。
 ・その他のGBの中身…多分大体OK(実機が無いので詳細不明)

 2.チップ

 カートリッジ側に含まれるチップのサポート状況は以下の通り

	対応ROMサイズ：
		0,1,2,3,4,5,6,7,8
	対応SRAMサイズ：
		0,1,2,3,4,5
	対応カートリッジタイプ:
		0,1,2,3,5,6,8,9,A,C,D,F,10,11,12,13,19,1A,1B,1C,1D,1E,22,FE,FF
	対応チップ:
		MBC1/2/3/5/7/RTC/モーションセンサー,HuC-1(*),HuC-3(*),MMM01(*)
		(*は一部未実装の機能を含む)

	8,9,A はかなり不完全です。
	C,D はRTCエミュレーションも行います。
	1C,1D,1E はRumbleエミュレーションをFFBで行います。
	22(MBC7?+MotionSensor+SerialEEPROM)は完全に実装してあります。
	モーションセンサーはアナログジョイスティックでの操作も可能です。

	FE(HuC-3)の時計機能は実装しておりません。
	FF(HuC-1)の赤外線通信は実装しておりません。
	1F(Pocket Camera),FD(TAMA5)には未対応です。

	なおカートリッジタイプの内 4,7,B,E,14,15,16,17,18,20,21,は存在しません。
	その他(23-FC)は現時点では未定義です

	対応ROMサイズは"8"がMBC5のマップできる最大容量である64MBitですので､
	これ以上のものが登場するかは非常に怪しいところです(新しいマッパが出るかは非常に疑わしい)。
	対応SRAMサイズは"5"が容量の公式に当てはまらないので､なんともいえません。

	参考:各MBCのRAM容量の限界
	MBC1の限界…16/8モード･8KB､4/32モード･32KB
	MBC2の限界…512*4Bit固定(チップに内臓)
	MBC3の限界…32KB(ただしポケモンクリスタルではD2が有効らしく64KB/
			 全てのゲームで有効かも/)
	MBC5の限界…128KB

 3.付加機能

  何か色々(把握しきれていない)…ありますが特筆すべきものとしては(説明が必要な)
 オンライン通信機能…ローカルでの通信と同等の精度でオンライン通信を行えます。別途付属テキストに詳細あり。
 チートコード…PARのコード及びXT-Zのコードに一応対応しています。
               さらに繰り返し､条件分岐コードを独自拡張として備えています。
               仕様は別途付属テキストにあります。

 4.周辺機器のエミュレーション

  GBにはシリアルポート接続の周辺機器が多数(?)発売されていますが､TGB Dualはシリアル通信を
  DLLでフックすることが出来ます。(或いは赤外線通信も…実装しているのに往々にして動いてくれないの…)
  DLLの仕様は別途記載

  現在利用可能なもの…TPPE DLL版(ポケットプリンタ)､TPPE 改(POPさん作､同梱させて頂いております)
                      TBR(バーコードリーダ)､何やら赤外線操作プラグイン

 5.GBR

  TGB DualはGBRの再生に対応しています。
  再生はdevicesフォルダに入っているtgbr_dll.dllを用いています。
  これは数値演算しか行わないので､他アプリケーションでもご使用いただけるかもしれません。

(一応)仕様：

gbr_procs *get_interface()
  唯一のエクスポート関数です。
  サービスルーチンへのポインタが入った構造体が返ってきます。

struct gbr_procs{
	void(*load)(BYTE*,int); // 読み込み(メモリデータ､サイズ)
	void(*unload)(); // 解放 (忘れるとメモリリークが起こります)
	void(*run)(); // CPUを走らせる(456*154クロック､一画面分､これを秒間59.6回ぐらい呼んで下さい)
	void(*render)(short*,int); // メモリに波形を書き込みます(バッファ､サンプル数(片チャンネル分の))
	void(*select)(int); // 選曲します(0-255)
	void(*enable)(int,int); // チャンネルのOn/Offを変更します(チャンネル番号､On/Off(1/0))
	void(*effect)(int,int); // エフェクタのOn/Offを変更します(エフェクタ番号､On/Off(1/0))
};
(4バイト境界)

16ビット､44100Hz専用です。

§3 操作法

  ほとんどの機能は再定義可能ですが､アクセラレータはいじれないので､
  説明しておきます。

  Alt+Enter : フルスクリーン/ウインドウモード切替
  Ctrl+P    : スクリーンショット
  Ctrl+O    : サウンドレコード開始/停止

  その他記述すべき事柄

   コマンドラインからの起動：
   TGB_Dual.exe [filename] [/f]

    filenameは読み込むファイル名､""で囲えばパスに空白が入ってもOK
    /f…フルスクリーン状態で起動

  TGB/TGB Dualは状態保存の際に使用するすべての情報をTGB.iniに記録しています。
  レジストリは一切使用していません。

  セーブデータについて：
  TGB/TGB Dualに於いて､SRAMデータは "(ROMイメージのファイル名).sav" という名前で保存されます(TGBは*.ramと両用)。
  Slot2のSRAMデータは "(ROMイメージのファイル名).sa2" という名前で保存されます。
  これらの内容は '単にSRAMをダンプしたもの' です。

  ステートセーブについては､"(ROMイメージのファイル名).sv?" のファイル名で保存されます。
  ステートセーブの構造を以下に記します。

/*  やっぱり､ソースコードを参照のこと  */


§4 開発環境/動作確認環境

	開発環境:

	某AT互換機
	OS   : Windows2000(非SP1)/Windows98 Dual Boot
	MB   : VIA MVP3 (3次キャッシュ2MB)
	CPU  : K6-III 450MHz
	RAM  : 128MB SDRAM CL-2
	Video: TNT2 32MB
	Sound: SB Live! Value
	LAN  : 10Base-T

	Visual C++ 6.0 Enterprise Edition SP5 & DirectX8.0a SDK
	にて製作


	動作確認:

	某AT互換機
	OS   : Windows2000(非SP1)
	MB   : なんかフリーウェイの赤マザー(名前忘れた)
	CPU  : Athlon 750MHz
	MEM  : 128 SDRAM CL-2
	Video: G400
	Sound: オンボード

	某AT互換機
	OS   : Windows98
	MB   : 不明(Socket7､66MHzの品､2次キャッシュ容量は忘れた)
	CPU  : K6-233MHz
	MEM  : 32*2MB EDORAM
	Video: Graphics Blaster Exxtrame 4MB
	Sound: 不明(ISAの品)
	(この環境でたいがい60FPS出ます)

	AT互換機
	OS   : Windows2000
	MB   : 忘れた…
	CPU  : Duron800Mhz
	MEM  : 256MB SDRAM
	Video: GeForce2MX 200? の品
	Sound: オンボード

	AMDばっか…何でだろ…

§5 その他留意点

 MBC3の時計の時間(e.g.ポケモン金銀クリスタル､カードヒーロー)を変えるには…
  3つ方法があります。
  まず一つ目はMBC3/RTC編集機能を使うことです。
  MBC3/RTCを搭載しているROMを読み込んでいるときにメニューからこれを起動していただくと
  設定ダイアログが出てきて､これで変更可能です。
  ただ､ポケモンなどは､RTCの値に何らかの値を加減したものをゲーム中の時刻として使っているようで､
  相対的な時刻を考えつつ設定する必要があります。
  あとの2つは､ともにエミュレータの機能ではないですが､Windowsの時計をいじる､
  もしくは､ファイルを編集する。その2つです。
  ファイルに関して書いておくと､.SAVファイルの最後4バイトに､現在時刻からのずれ(単位:秒)
  が書き込まれています。(サイズがちょっと大きいから分かるはず)
  負の数は2の補数で。


/*
 §6 DTAについて
  ソース読んだら分かるからいいか…
*/

§7 ちょっと書きたいこと

☆高度な抽象化
 ゲームボーイというものを高度に抽象化したコーディング、
 画像サウンドにOS依存部を完全に排出、
 また、OS依存部も抽象化してあるので､
 決まったインターフェースをインプリメントするだけでさまざまなOSに対応可能！
 (理論的には)

☆精密なサウンド
 以前の分解能1/240(s)に対し､1/44100(s)にまで精密化。
 あらゆるサウンド効果､すべてのボイス機能を再現可能です。
 (それが滑らかかどうかはまた別問題…)


§8 TGB vs TGB Dual

 機能性…Dualのほうが上のはずなんだが…TGBにしかない機能があるらしい(Rumbleで画面フラッシュとか､ショートカットキーとか)
 速度…TGBのほうが少し上､スキップ時はDualのほうが圧倒的に上
 エミュレーション精度…Dualのほう圧倒的にが上
 グラフィックス…Dualのほうは完璧､旧TGBはかなりあやふや
 サウンド…Dualのほうがだいぶ上
 通信精度…Dualのほうが圧倒的に上

 Vol.4と同時に旧TGBは公開中止しました。(ファイル自体は置いてあるので､適当にぱくって行って下さい)


§9 分別不可話題

 何故に新銘柄なんて作ったのか？
  もうぶっちゃけた話､読めないとか何とかよりも､GBクラスのインスタンスを2つ作らなくてはならなかったんです。
  何としても作らなくてはならなかったので(閃いたアイデアを捨てるのは勿体無い)､
  全体からクラスで使っているグローバル変数､OS依存部､クラス内でインスタンス間競合が起こりそうなSTATICメンバ変数
  これらを完全に排除しなくてはならなかったわけです。
  (当初､違うコンセプトで拡張していこうと思ったのですが…表には出ていない(手元にまだある)TGB 0.246の残骸からみるに
   多分これはいけなかったんでしょう。本当に崩壊しましたからねー…)
  クラス設計がゆがんでいる部分､手抜きコーディング､その他色々きちゃない部分もついでに一掃すべく
  きっぱり新しく作り始めたと言うことです。

  (でーもー…後で見るとDualも充分汚くみえる)

§10 謝辞

 お受験に出るゲームボーイを書かれたろっきゅーさん
 GBSpecを書かれたkOOPaさん(Marat Fayzullinさん, Pascal Felberさん, Paul Robsonさん, Martin Korthさん)
 GB DEV FAQsを書かれたGeeBeeさん
 GBC 解析白書2000を書かれた某吉さん
 GBRについて教えてくださったIzumiさん
 その他参考にさせていただいた資料を作られた全ての方々
 動作レポートを送っていただいたちいじさん､ボニさん
 アドバイスを頂いた全ての方々
 置き場所を提供して下さっているRetrogamesさん

  改めて御礼申し上げます。


§11 著作権

 Copyright(C) 2000-2001 Hii

 (このプログラムはGPLVer.2に基づいて頒布されます)

