InfoPyuta: ぴゅう太エミュレータ for Win32
Copyright (c) 2001 Jay's Factory
はじめにお読みください
InfoPyutaは,Windows上で動作する,空想上のぴゅう太エミュレータです.現時点では,商用ゲームなどは,動作しないと思います.なお,「空想上」の意味については,以下で詳細に述べていますので,そちらを参照ください.
注意事項
- ROMイメージは,各自御用意下さい
- ROMイメージの入手方法に関する御質問は,御遠慮ください
- 上記の事項に同意いただけない場合には,本ソフトウェアは御利用いただけません
更新状況
- v0.02J (01/07/01)
- CPU: スキャンライン制御機能を追加
- CPU: CPU,VDP間タイミング制御機能を追加
- VDP: スプライト機能(8x8, 16x16, 拡大機能)を追加
- VDP: VDPステータスのVBLANKフラグ制御を追加
- 主記憶: 外部RAM機能を削除
- I/O: VDP RAM読み込み機能(>8800), VDPステータス読み込み機能(>8802)
動作環境
- OS: Windows Me/2000 Pro
- CPU: Intel製CPU
- HW: ビデオカード
操作方法
船スプライトデモのカートリッジROM(ship.bin)を選択して,動作確認をしてください.
- [ファイル(F)] - [開く(O)]: カートリッジROMを選択して,エミュレーションの開始
- [ファイル(F)] - [再起動(R)]: エミュレータをリセットして,エミュレーションの再開
- [ファイル(F)] - [停止(S)]: エミュレーションの停止
- [ファイル(F)] - [終了(X)]: プログラムの終了
- [ヘルプ(H)] - [バージョン情報(V)]: バージョン情報,著作権情報の表示
免責
InfoPyutaは,フリーウェアです.また,いかなる保証もありません.
本ソフトウェアによって生じた損害等に関して,作者は一切責任を負いません.
InfoPyutaに関する情報やアップデートについては,以下のページ[2]を参照ください.
よりよいソフトウェアを目指すために,御利用いただいた皆様からの
御意見,御要望,バグ報告等を,下記の連絡先で御待ちしています.
なお,ぴゅう太(TM)は,TOMY社の登録商標です.
Windows(TM)は,マイクロソフトの登録商標です.
連絡先
謝辞
本プログラムを作成する際に,下記のプログラム,および,資料を参考にさせていただきました.
作者の皆様に,御礼を申し上げます.
空想上のぴゅう太(TM)仕様
目次
1 はじめに
InfoNESの仕事が,一段落ついたある日,ある掲示板で,「XBOXでは,ファミコンやスーファミのゲームが,動作するか?」という質問に対して,半分やけ気味に「IntelliVisionやぴゅう太のゲームだって,動作する」と発言する内容の会話を読みました.でも,この回答は,半分は正しいのですが,半分は間違っています.確かに,IntelliVisionのエミュレータは,この世に存在しますので,XBOXに移植するのは,比較的簡単でしょう.もう,動いているかもしれません.ただ,ぴゅう太のエミュレータは,この世には存在しなかったのです.
当時,ぴゅう太といえば,16ビットCPU,16色のグラフィックスを搭載して,一世を風靡したマシンです.この時,まだファミコンは発売されていません.また,スクランブルやフロッガーなどのアーケードからの移植ゲームなどが,カートリッジとして発売されました.このまま,ぴゅう太を思い出の中で,眠らせてしまっていいものだろうか? これが,作者を揺り動かした,大きな力でした.
ぴゅう太のエミュレータを作ろう.InfoNESの開発を通じて,エミュレータを開発する技術は,幸運にも手の中にありました.問題は,ぴゅう太に関する技術的な情報をどのように集めるかでした.しかし,この問題は,現時点でも,解決していません.皆さまからの情報をお待ちしております.
2 仕様
本来,エミュレータは,実機の機能を忠実にまねることが,正しい動作です.ただ,前述したように,現時点では,実機の機能について,正確な情報が得られていない状況です.そこで,作者はぴゅう太の仕様を空想してみました.しかし,ただ単に,空想するだけでは,あまりにも非科学的なので,下記の事実から,空想をめぐらせてみました.
- ぴゅう太のCPUは,TI社製のTMS9995である
- ぴゅう太のVDPは,TI社製のTMS9918Aである
- ぴゅう太は,RAM16KB, ROM20KBを搭載している(RAM16KBはVDP内に搭載)
- ぴゅう太は,TI社製のTI-99/4Aをベースにして開発された
2.1 CPU
ぴゅう太のCPUは,TMS9995です.TI-99/4Aで利用されていたTMS9900からの差分は,下記の点です.
- 内部RAM(256バイト)を搭載
- ステータスレジスタST10(OVEN:OVer flow ENable)が追加
- 符号付整数の乗除算命令(MPYS,DIVS)が追加
2.2 メモリマップ
メモリマップに関しては,下記をベースとして,空想する必要がありました.
- ぴゅう太は,RAM16KB, ROM20KBを搭載している(RAM16KBはVDP内に搭載)
- ぴゅう太のメモリマップは,TI-99/4Aのメモリマップと類似している可能性が高い
以上から,空想したメモリマップを下記に示します.
| 開始アドレス |
終了アドレス |
用途 |
| >0000 |
>0fff |
外部ROM(BIOS) |
| >1000 |
>3fff |
不明 |
| >4000 |
>7fff |
外部ROM(G-BASIC , カートリッジ) |
| >8000 |
>87ff |
不明 |
| >8800 |
>8fff |
メモリマップI/O( VDP ) |
| >9000 |
>efff |
不明 |
| >f000 |
>f0fb |
内部RAM |
| >f0fc |
>fff9 |
不明 |
| >fffa |
>fffb |
内部メモリマップI/O |
| >fffc |
>ffff |
内部RAM(NMIベクタ) |
2.3 VDP
VDPとは,Video Display Processorの略語で,グラフィック関連を管理するプロセッサです.ぴゅう太では,VDPとして,TMS9918Aが,採用されています.このチップは,MSX等でも採用されており,当時としては一般的なチップです.
3 実装
InfoPyuta v0.02Jは,上記の仕様の一部を満たすエミュレータで,Windows MeやWindows 2000 Professional等で動作します.InfoPyutaの実装においては,TI-99/4AエミュレータであるAmi 99のソースコードを一部借用させて頂きました.ここで,作者のM.Brent/Tursi氏にお礼を申し上げます.
3.1 CPU
InfoPyuta v0.02Jにおいては,下記のオペコードが実装されています.
- 算術命令: a,ab,abs,ai,dec,dect,div,inc,inct,mpy,neg,s,sb
- 分岐命令: b,bl,blwp,jeq,jgt,jhe,jh,jl,jle,jlt,jmp,jnc,jne,jno,jop,joc,rtwp,x,xop
- 比較命令,I/O命令: c,cb,ci,coc,czc,ldcr,sbo,sbz,stcr,tb,ckof,ckon,idle,rset,lrex
- ロード/ストア命令: li,limi,lwpi,mov,movb,stst,stwp,swpb
- 論理演算命令: andi,ori,xor,inv,clr,seto,soc,socb,szc,szcb,sra,srl,sla,src
InfoPyuta v0.02Jでは,起動時に,PC = >4000, WP = >f000という値が代入されます.ここで,>4000は,G-BASICやカートリッジとして供給される外部ROMの先頭アドレス,>f000は,内部RAMの先頭アドレスです.したがって,起動直後に,カートリッジ等に制御が移ることになります.
実際には,上記の動作は,>0000 - >1000に存在するBIOSに記述されるべき内容です.しかし,InfoPyuta v0.02Jでは,BIOSイメージを読み込む機能を実装していないので,上記のようにハードコーディングしています.万一,BIOSイメージを読み出す方法をご存知の方は,御連絡ください.
VDPタイミング
VDPが1画面を描画する時に,CPUは何クロック分実行するかを管理しないと,正確なエミュレーションはできません.
InfoPyuta v0.02Jでは,クロック数まで管理できていないため,VDPが1ライン描画する間に,22命令実行するように実装しました.これは,下記のデータに基づきます(( 19.91 / 262 ) / (0.0005 * 7) = 21.71...).
- VBLANK間隔: 19.91[ms]
- 1画面ライン数: 262
- CPUクロック周波数: 2 [MHz] = 0.0005[ms]
- 1命令実行時の平均クロック数: 7
3.2 I/O
InfoPyuta v0.02Jでは,VDP I/Oとして,VDP RAM読み込み(>8800), VDPステータス読み込み機能(>8802), VDPレジスタ書き込み(>8C02), VDP RAM書き込み(>8C02, >8C00)を実装しています.下記に動作をまとめます.
- >8800: VDP RAMアドレスから1バイトを読み込み,アドレスポインタをインクリメント(+1)する
- >8802: ステータスレジスタから1バイトを読み込み,ステータスレジスタをクリアして,割り込みをクリアする
- >8C00: VDP RAMアドレスに1バイトを書き込み,アドレスポインタをインクリメント(+1)する
- >8C02: VDPにコマンドを送信する(コマンドは2バイト)
コマンドは,下記の2種類あります.
| コマンド |
1バイト目 |
2バイト目 |
| レジスタへ書き込み |
レジスタの内容 |
1 0 レジスタ番号(6ビット) |
| VDP RAMアドレスを設定 |
A6-A13 |
0 0 A0-A5(6ビット) |
3.3 VDP
InfoPyuta v0.02Jでは,スタンダードモード(グラフィック1),スプライトを実装しています.TMS9918Aは,9本のレジスタ(VR0-VR7, Status)と16KBのVDP RAMを持っています.
スタンダードモード(グラフィック1)
本モードは,VR0の7ビット目(重み:>01)とVR1の3,4ビット目(重み:>10,>08)が0の時に,選択されます.ただし,InfoPyuta v0.02Jでは,常に本モードが選択されます.
本モードでは,8x8ピクセルを1キャラクタとして,画面を32 x 24キャラクタで表示します.各キャラクタは,2色で表示され,"1"の時はフォアグランドカラー,"0"の時はバックグラウンドカラーで表示されます.このパレットは,フォアグランドカラー(4ビット) + バックグランドカラー(4ビット)で表現され,8キャラクタ毎に設定されます.各テーブルは,VDP RAMのいずれかの領域で,下記のような動作をします.
- スクリーンイメージテーブル: 画面上の(0,0)から(31,23)までのキャラクタ番号列(32x24=768バイト)を格納したVDP RAM内の先頭アドレス
- カラーテーブル: パレット列(キャラクタ番号0-7, ..., 248-255毎に32バイト)を格納したVDP RAM内の先頭アドレス
- キャラクタパターンテーブル: 1キャラクタ毎に8バイトで表現したキャラクタパターン列(8x256=2048バイト)を格納したVDP RAM内の先頭アドレス
各テーブルは,各レジスタで指定します.この指定方法について,下記にまとめます.なお,この当時のTI系のCPUでは,何ビット目という表記が,Intel系のCPU(普通の表記)とは,LSBとMSBが逆になっているので,注意してください.
ビット:
重み: |
0
>80 |
1
>40 |
2
>20 |
3
>10 |
4
>08 |
5
>04 |
6
>02 |
7
>01 |
| VR2 |
0 |
0 |
0 |
0 |
スクリーンイメージテーブル(<<10) |
| VR3 |
カラーテーブル(<<6) |
| VR4 |
0 |
0 |
0 |
0 |
0 |
キャラクタパタンテーブル(<11) |
スプライト
スプライトとは,スクリーン上の任意の箇所に表示される特殊なキャラクタのことです.
スタンダードモード1が選択されると,同時にスプライトも表示されます.
スプライトは,VR1の6ビット目(サイズ4(2x2))と連動して,8x8ピクセル(0),もしくは,16x16ピクセル(1)で表示されます.
また,VR1の7ビット目(拡大(2倍))と連動して,2倍の拡大されて,表示されます.
同時に,32個のスプライトを表示可能ですが,画面は下記のような優先順位で表示されます.
- 黒
- 外部ビデオ入力
- バックドロップ色(VR7の4-7ビット): 未実装
- キャラクタ
- スプライト#32
- ...
- スプライト#0
なお,スプライトは,VDPレジスタの下記のビットを利用して,表示されます.
ビット:
重み: |
0
>80 |
1
>40 |
2
>20 |
3
>10 |
4
>08 |
5
>04 |
6
>02 |
7
>01 |
| VR1 |
- |
- |
- |
- |
- |
0 |
サイズ4(2x2) |
拡大(2倍) |
| VR5 |
0 |
スプライト属性テーブル(<<7) |
| VR6 |
0 |
0 |
0 |
0 |
0 |
スプライトパターンテーブル(<<11) |
| VR7 |
- |
バックドロップ色 |
スプライト属性テーブル
スプライト属性テーブルは,VR6で指定されるアドレスに記述されるテーブルで,下記のような形式をしています.
このテーブルは,32エントリを持っており,各エントリは,4バイト長なので,テーブル長は,最大で>100バイトとなります.
|
バイト1 |
バイト2 |
バイト3 |
バイト4 |
| スプライト0 |
Y座標-1 |
X座標 |
パターン番号 |
クロックビット |
スプライト色 |
| スプライト1 |
"
|
"
|
"
|
"
|
"
|
スプライトの位置は,スプライトの左上で指定します.
Y座標は,デクリメント(-1)した値を格納しますので,一番上のラインのY座標は,>FF(-1)となります.
したがって,Y座標は,>FFから>BEとなります.
ファミリーコンピュータ(TM)でも,このような仕様なのですが,走査線とのタイミングの都合なのでしょう.
スプライトパターンテーブル
スプライト番号は,スプライトパターンテーブルでの位置を参照します.そして,スプライト色は,下位4ビットで規定された色となります.スプライト属性テーブルは,すべてのスプライトを定義する必要はなく,X座標に>D0を指定することで,エンドマークとして,以下のエントリを無視するように指定できます.
スプライトパターンテーブルは,8バイト長(8x8),もしくは,32バイト長(16x16)のエントリから構成されます.
8x8の場合,ビットに"1"を指定すると,スプライト属性テーブルで指定した色のピクセル,
ビットに"0"を指定すると,透明色のピクセルとなります.
また,16x16を指定すると,下記のような配置で,8x8のスプライトを配置したのと同じになります.
1 3
2 4
したがって,16x16を指定して,32スプライトのパターンを格納するためには,>400(32x32)バイトが必要になります.
ステータスレジスタ
InfoPyuta v0.02Jにおいては,>8802の値を読み込むと,ステータスレジスタを返却します.
ステータスレジスタの仕様を下記に示します.
ビット:
重み: |
0
>80 |
1
>40 |
2
>20 |
3
>10 |
4
>08 |
5
>04 |
6
>02 |
7
>01 |
| ステータス |
VBLANK |
Coinc |
5スプライト |
スプライト番号(5番目) |
このうち,InfoPyuta v0.02Jでは,下記の1機能だけを実装しています.
- VBLANK: 表示可能領域の最終ライン(244ライン目)を描画終了した時に,1にセットされる.もし,割込みが有効(VR1の2ビット目)であれば,このビットが1の時,割込みピンはLowになり,このビットが0の時,割込みピンはHighになる
ステータスレジスタを利用することで,CPUとVDPが通信することが可能になります.
すなわち,CPU(ROMファイル)側では,1画面分の処理を終了してから,VBLANKの開始を検出するまでウェイト処理をして,VBLANKに同期した処理を記述することが可能です.
これは,当時のゲーム(ファミコン(TM)などでも,広く行なわれた)でよく行なわれた手法です.
また,重要な注意点として,VDP側は,CPU側が>8802への読み込みを実行して,割込みピンをクリア(High)にするまで,VBLANKを続行します.
InfoPyuta v0.02Jでは,常に割込み有効として処理をしていますので,VR1の2ビット目は,無視されます.
4 カートリッジ
InfoPyuta v0.02Jでは,カートリッジのROMイメージを,ファイルとして読み込んで,外部ROM(>4000->7fff)にロードします.商用ゲームの実行には,BIOS(>0000->0fff)も必要なりますが,著作権等の問題も存在するので,今後の課題としたいと思います.ちなみに,TI-99/4Aにおいては,TI社がBIOS ROMの著作権を放棄しているようです.日本でも,X68000において,SHARP社が同様にBIOS ROMの著作権を放棄しています.
4.1 開発環境
InfoPyuta v0.02Jの動作を確認するためには,なんらかのカートリッジのROMイメージを用意する必要があります.ここでは,TMS9900のアセンブラを利用して,ROMイメージを開発する方法について,まとめます.なお,TMS9900アセンブラとしては,Macroassembler ASを利用しました.
1. ダウンロード
The Macroassembler ASから,Win32 Binariesをダウンロードします.
2. インストール
アーカイブをC:\ASなどに解凍します.
3. 環境設定
AUTOEXEC.BATに,下記を追加します.
SET PATH=......;C:\AS\BIN
SET ASCMD=@c:\as\lib\as.rc
C:\AS\LIBに,as.rcというファイルを新規に作成して,下記の一行を追加します.
-i c:\as\include
4. ASMファイル作成
例えば,test.asmというファイル名で,下記の内容のファイルを作成します.
cpu tms9900
org 4000H
label:
inc (r1)
jmp label
end
5. アセンブル
下記のコマンドを実行して,中間ファイル(test.p)を生成します.
C> asw test.asm
下記のコマンドを実行して,バイナリファイル(test.bin)を生成します.
C> p2bin -r 0x4000-0x7fff test.p
4.2 カラーバーデモ
本デモ(colorbar.bin)は,左からパレット0 - パレット15の色のバーを表示するデモで,ぴゅう太の起動画面を作成しようとして,挫折した結果できました.詳細は,別途公開するカラーバーデモのソースを参照ください.VDPとI/Oする方法が分かると思います.
4.3 船スプライトデモ
本デモ(ship.bin)は,複数の船(スクランブル風)が飛ぶデモです.
詳細は,別途公開する船スプライトデモのソースを参照ください.
スプライト機能の利用方法と,VBLANKを利用したプログラミングを説明しています.
5 まとめ
InfoPyuta v0.02Jは,世界初のぴゅう太エミュレータとして,開発されました.
本リリース(v0.02J)によって,コントローラを除いたゲーム(デモ)レベルであれば,自由に記述できるレベルまで到達できたと思っています.
ただし,本エミュレータは,商用ゲームなどは動作せず,プロジェクトとしても,ぴゅう太に関する詳細な技術情報も得られてないという状態です.作者の力だけでは,どうにも成りません.このプロジェクトを成功させるためには,皆様からの情報が,どうしても必要です.今後は,コントローラ,および,VDPの実装を進めていきたいと思います.
謝辞
InfoPyuta開発のベースとなったAmi99の作者,M.Brent/Tursi氏に感謝します.また,議論につきあってくださったHarmelnプロジェクトの関係者,はーめるん氏に感謝します.VDPに関する詳細な情報を公開してくださったThierry Nouspikel氏に感謝します.
InfoPyuta 0.02J, Copyright (c) 2001 Jay's Factory, All rights reserved.