InfoPyuta: ぴゅう太エミュレータ for Win32
Copyright (c) 2001 Jay's Factory

はじめにお読みください

 InfoPyutaは,Windows上で動作する,空想上のぴゅう太エミュレータです.現時点では,商用ゲームなどは,動作しないと思います.なお,「空想上」の意味については,以下で詳細に述べていますので,そちらを参照ください.  

注意事項

更新状況

動作環境

操作方法

 船スプライトデモのカートリッジROM(ship.bin)を選択して,動作確認をしてください.

免責

 InfoPyutaは,フリーウェアです.また,いかなる保証もありません. 本ソフトウェアによって生じた損害等に関して,作者は一切責任を負いません. InfoPyutaに関する情報やアップデートについては,以下のページ[2]を参照ください.
 よりよいソフトウェアを目指すために,御利用いただいた皆様からの 御意見,御要望,バグ報告等を,下記の連絡先で御待ちしています.
 なお,ぴゅう太(TM)は,TOMY社の登録商標です. Windows(TM)は,マイクロソフトの登録商標です.

連絡先

謝辞

 本プログラムを作成する際に,下記のプログラム,および,資料を参考にさせていただきました. 作者の皆様に,御礼を申し上げます.

空想上のぴゅう太(TM)仕様

目次

1 はじめに

 InfoNESの仕事が,一段落ついたある日,ある掲示板で,「XBOXでは,ファミコンやスーファミのゲームが,動作するか?」という質問に対して,半分やけ気味に「IntelliVisionやぴゅう太のゲームだって,動作する」と発言する内容の会話を読みました.でも,この回答は,半分は正しいのですが,半分は間違っています.確かに,IntelliVisionのエミュレータは,この世に存在しますので,XBOXに移植するのは,比較的簡単でしょう.もう,動いているかもしれません.ただ,ぴゅう太のエミュレータは,この世には存在しなかったのです.
 当時,ぴゅう太といえば,16ビットCPU,16色のグラフィックスを搭載して,一世を風靡したマシンです.この時,まだファミコンは発売されていません.また,スクランブルやフロッガーなどのアーケードからの移植ゲームなどが,カートリッジとして発売されました.このまま,ぴゅう太を思い出の中で,眠らせてしまっていいものだろうか? これが,作者を揺り動かした,大きな力でした.
 ぴゅう太のエミュレータを作ろう.InfoNESの開発を通じて,エミュレータを開発する技術は,幸運にも手の中にありました.問題は,ぴゅう太に関する技術的な情報をどのように集めるかでした.しかし,この問題は,現時点でも,解決していません.皆さまからの情報をお待ちしております.

2 仕様

 本来,エミュレータは,実機の機能を忠実にまねることが,正しい動作です.ただ,前述したように,現時点では,実機の機能について,正確な情報が得られていない状況です.そこで,作者はぴゅう太の仕様を空想してみました.しかし,ただ単に,空想するだけでは,あまりにも非科学的なので,下記の事実から,空想をめぐらせてみました.
  1. ぴゅう太のCPUは,TI社製のTMS9995である
  2. ぴゅう太のVDPは,TI社製のTMS9918Aである
  3. ぴゅう太は,RAM16KB, ROM20KBを搭載している(RAM16KBはVDP内に搭載)
  4. ぴゅう太は,TI社製のTI-99/4Aをベースにして開発された

2.1 CPU

 ぴゅう太のCPUは,TMS9995です.TI-99/4Aで利用されていたTMS9900からの差分は,下記の点です.
  1. 内部RAM(256バイト)を搭載
  2. ステータスレジスタST10(OVEN:OVer flow ENable)が追加
  3. 符号付整数の乗除算命令(MPYS,DIVS)が追加

2.2 メモリマップ

 メモリマップに関しては,下記をベースとして,空想する必要がありました.
  1. ぴゅう太は,RAM16KB, ROM20KBを搭載している(RAM16KBはVDP内に搭載)
  2. ぴゅう太のメモリマップは,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においては,下記のオペコードが実装されています.  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...).

3.2 I/O

 InfoPyuta v0.02Jでは,VDP I/Oとして,VDP RAM読み込み(>8800), VDPステータス読み込み機能(>8802), VDPレジスタ書き込み(>8C02), VDP RAM書き込み(>8C02, >8C00)を実装しています.下記に動作をまとめます.
 コマンドは,下記の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のいずれかの領域で,下記のような動作をします.    各テーブルは,各レジスタで指定します.この指定方法について,下記にまとめます.なお,この当時の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個のスプライトを表示可能ですが,画面は下記のような優先順位で表示されます.  なお,スプライトは,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機能だけを実装しています.  ステータスレジスタを利用することで,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.