2006年07月28日

光速船エミュレータ開発記(その53)

ベクタースキャン方式のゲーム機エミュレータについて
==================================================

はじめに
--------
 ベクタースキャン方式のゲーム機として、光速船のエミュレータを開発しました。いままでのファミコンとか、ゲームボーイのようなラスタースキャン方式のゲーム機と違うこともありましたので、簡単にまとめておきます。

グラフィックスのエミュレーション
--------------------------------
 最大にして、唯一といってよいのが、グラフィックスのエミュレーションです。

(a) ラスタースキャン方式の場合

 ラスタースキャン方式の場合には、以下のようなグラフィックス処理を実行します。

for ( 走査線数だけ繰り返し ) {
 走査線1本に対応するCPUクロック分だけ、CPUエミュレーション実行
 走査線1本だけ、フレームバッファに描画
}
フレームバッファを画面へ転送


(b) ベクタースキャン方式の場合

 これに対して、ベクタースキャン方式の場合には、以下のようなグラフィックス処理を実行することにしました。

for ( 1/10秒程度に対応するCPUクロック分だけ繰り返し ) {
 CPU1命令を実行(CPUクロック数を保存)
 CPUクロック数分だけ、周辺装置(6522A VIA)の処理を実行
 if ( ビームがONか? ) {
  ビーム始点、ビーム輝度を保存
  CPUクロック数分だけ、ビーム移動
  ビーム終点を保存
 }
}
フレームバッファをクリア
保存されたビームの始点、終点、輝度に基づいて、フレームバッファにライン描画
フレームバッファを画面へ転送


 正解というわけではないと思いますが、InfoVectrexでは、問題なく動作しています。他のエミュレータの構成法について情報があれば、教えて下さい。

おわりに
--------
 この文書では、ベクタースキャンのエミュレータの構成法について、InfoVectrexで採用した方法を紹介しました。

参考文献
--------

コンソールエミュレータについて
http://www.geocities.jp/infones1998/tech/Paper.html
(エミュレータ構成法について解説がある)

光速船・Vectrexに関するコラム
http://vectrex.takuranke.com/vectrex_column.html
(ベクタースキャン方式について解説がある)

補遺
----
 6809エミュレータを開発する時に、命令を実装する毎に、命令表を蛍光ペンで消していきました。以下は、その命令表の写真です。

 
posted by Jay at 18:22| 東京 霧| Comment(1) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年07月22日

光速船エミュレータ開発記(その52)

□技術情報

前回リリースしたINTERNAL.TXT(日本語訳)を、更新しましたので、リリースします。日本の光速船プログラミングが、ますます発展しますように。

Vectrex HP3000 Programming Notes(日本語版)
http://infones.up.seesaa.net/INTERNAL_J2.TXT

Vectrex HP3000 Programming Notes(原文)
http://www.programmersheaven.com/search/download.asp?FileID=13240

# 夏休みは、いろいろを勉強する予定(光速船は、少しスローダウンかも)

□スクリーンショット(再掲)

 

posted by Jay at 22:38| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年07月17日

光速船エミュレータ開発記(その51)

□スクリーンショット(左から、No.16、17)

 

□進捗状況

2006/7/17

* Win32: デバッグメッセージ出力を修正
* 6809: MINE STORM用暫定パッチ(画面崩れ対策)

2006/7/16

* 6809: MUL命令修正(Cフラグ動作:Bレジスタの7ビット目と連動)

v0.3Jをリリースした後に、MINE STOMEのSTAGE #2で、四角い敵を倒すと、画面が崩れるバグを発見した。直接の原因は、下のコードで、$E59Cで、Aに4以上の値が入ってくるために、Xに変な値が入るためらしい。

E599 8EE25A LDX #$E25A
E59C A641 LDA 1,U
E59E 48 ASLA
E59F AE86 LDX A,X

ただ、なぜここに、その値が書き込まれるのかは、判明できなかったので、パッチを当てることで、問題は回避できた。よく、nesterJとかで、そういうのがあったっけ…。
posted by Jay at 15:10| 東京 雨| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年07月08日

光速船エミュレータ開発記(その50)

□進捗状況

* v0.3Jリリース(06/07/08)
 https://sourceforge.jp/projects/infones/files/release_id=20875#20875

プロジェクト開始から1年経つのにリリースファイルがないのも残念なので、まだまだ不十分な箇所もありますが、リリースしました。6809エミュレータも含んでいるので、再利用できるものも多いかもしれないです。

□スクリーンショット(再掲)

 

□参考文献

* Vecx emulator
 http://www.valavan.net/vectrex.html

* All about 光速船
 http://vectrex.takuranke.com/
posted by Jay at 23:48| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年07月02日

光速船エミュレータ開発記(その49)

□スクリーンショット(左から、No.14、15)

 

線の太さをキー操作で選択できるようしました。ゲームの時は、線を太くすると遅くして、タイトルの時は、線を細くして速くするなどができるようになりました。BIOSゲーム(MINE STORM)で、遊べるようになりました。

□進捗状況

2006/7/1

* Win32: ペン選択ボタン(0、1、2)処理を追加

公開して欲しいという声も大きくなってきた(どこで?)ので、公開しようかなと思っています。公開すると、しばらくいじらないので、飽きたら、公開しようかな。
posted by Jay at 00:13| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年06月25日

光速船エミュレータ開発記(その48)

□スクリーンショット(左から、No.12、13)

 

画面描画ルーチンを書き直しました。1画面分のラインを配列で持ち、画面アップデート時に、その配列を元に、ラインを描画するように変更しました。また、画面アップデートも、裏画面を持つようにしたので、ちらつかなくなりました。太いラインを使うと、遅いので、細いラインに変更しました。

□進捗状況

2006/6/25

* Win32: ベクトル描画処理(DrawLine)を修正
* Win32: ベクトル描画処理(UpdateScreen)を修正

しかし、ラインが細すぎるのと、速すぎて、弾が見えないので、ゲームとしては、いまいちです。来週は、もう少しチューニングをして、そろそろリリースしようかなぁ。
posted by Jay at 23:27| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年06月24日

光速船エミュレータ開発記(その47)

□技術情報

重要なところを訳し忘れてました。

Vectrex HP3000 Programming Notes
http://www.programmersheaven.com/search/download.asp?FileID=13240

<日本語訳>

システムメモリマップ
~~~~~~~~~~~~~~~~~~~~

チップ/お金/スペースを節約するため、光速船のメモリは、少し難解だが、2つのチップしか使っていない。1つは、4つの2入力NANDゲートを含み、もう1つは、4つの2入力ORゲートを含んでいる。これは、利用しているゲート数を考慮すると、尊敬に値する仕事である。

0000-7FFF

カートリッジROM領域。CART線は、~Eによってゲートされる。~Eは、ROMを有効にする出力に、直接与えられる信号を生成する(訳注:CART線、~Eの説明は、どこにもないので、詳細不明)。このアドレス領域は、R/W線でゲートされず、直接カートリッジコネクタに与えられる(R/W)

8000-C7FF

未使用領域

C800-CFFF

光速船RAM領域 1Kx8、ミラーリング2回(R/W)

D000-D7FF

6522PIAレジスタ、ミラーリング128回(R/W)

D800-DFFF

使用禁止。6522、RAMが、この領域を読み書きする

E000-FFFF

システムROM領域 8Kx8(R/W)
posted by Jay at 18:07| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年06月23日

光速船エミュレータ開発記(その46)

□技術情報

暇をみて、日本語訳していたものをリリースします。

Vectrex HP3000 Programming Notes
http://www.programmersheaven.com/search/download.asp?FileID=13240

<日本語訳>

もし、描画の前にベクトルの位置を変えるだけであれば、ステップ5、6は省略できる。

さて、ややこしいところが、やってきた。どうやって、X方向の速度、Y方向の速度、X,Y座標積分器オフセットを計算するのか。また、RAMPパルスをどのぐらい長く生成するのか。

画面が静止しているように見えるためには、RAMPパルスの長さが重要になる。RAMPがアクティブ時に割り込みが発生すると、RAMPパルス長が変わってしまうので、ベクトル描画サイクル中は、割り込みを禁止しなければならない(MUST)。

私の知る限り、このシステムを動作させるには、3通りの方法がありうる。すべての方法で、X,Y積分器オフセットは定数で、ズームイン/アウトに利用できることが、仮定されている。

1) (私見では)EXEC ROMに最も近い方法。まず、すべてのベクトルについて、RAMPパルスの固定長を持つ。8ビットDAC値で指定するため、X座標、Y座標の両方とも、255単位のベクトルの解像度を持つことなる。これは、画面の解像度が、256x256という意味ではない。RAMP時間とX,Y積分器オフセットの値により、255単位のベクトルは、非常に小さくなったり、非常に大きくなったりする。これは、すべては、最後の積分器の位置に対し、相対的に行なわれるためである(訳注:RAMP時間はベクトル長の拡大・縮小、X,Y積分器オフセットは平行移動の効果もつので、ベクトル描画ごとに、255単位の大きさが変わるという意味)。私は、この方法が、計算が最もすくないと見積もっている。RAMPを固定し、X,Y積分器オフセットにより、単位長を設定できる。

2) まず、移動したい方向に応じたX,Y方向の値をルックアップ表(計算によって求めることも可)として持つ。これらの値は、ひとつの固定ベクトル単位長で、規定されている。必要なベクトル長を生成するためには、RAMP長か、X,Y積分器オフセットを変更することを選択できる。ちょうど、X,Y積分器に設定した値と、固定単位長を掛け算することで、必要なベクトル長を得ることができる。

3) 最も複雑な方法。すべての変数を変更する。しかし、これをどう計算するかは、神のみぞ知ることだ。4変数もあるのだからね。

方法1)、2)は、計算すべき変数の数が限られているので、最も見込みがある。RAMPとして固定値を使うことが、最も簡単な方法である。これは、要求されているRAMP設定するのに必要なCPUサイクルを数えるという問題を避けられるためである。RAMP時間の決定は、きちんと制御する必要がある。これは、不恰好な方法だが、特にハードウェアタイマがない場合でも、ソフトウェアで実現できないことはない。

(訳注:以下、仕様的に重要でないので、訳さず)
posted by Jay at 17:02| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年06月22日

光速船エミュレータ開発記(その45)

□技術情報

これまで訳してきたものを、1ファイルに統合しましたので、リリースします。日本の光速船プログラミングが、発展しますように。

Vectrex HP3000 Programming Notes(日本語版)
http://infones.up.seesaa.net/INTERNAL_J1.TXT

Vectrex HP3000 Programming Notes(原文)
http://www.programmersheaven.com/search/download.asp?FileID=13240
posted by Jay at 10:59| 東京 霧| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

2006年06月18日

光速船エミュレータ開発記(その44)

□スクリーンショット(左から、No.10、11)

 

キー入力を受け付けるようなったので、ゲームができるようになりました。ただ、画面描画ルーチンが、だめだめなので、画面がちらついてしまいます。

□進捗状況

2006/6/18

* Win32: Joystick #1の処理を追加
* VG: Joystick比較処理を修正(比較結果を保持)

Joystickの比較結果は、ORBに反映しないで、内部で持っていて、ORBの読み込み時に併せて出力するというのが、正解でした。

□今後の予定

あとは、暫定で作った画面描画ルーチンを、作り直しするところが、来週以降です。今日は、サッカーのため、夜はなにもしません。
posted by Jay at 12:41| 東京 曇り| Comment(0) | TrackBack(0) | 開発記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。