[戻る]

PyutaTech: ぴゅう太(TM)に関する技術情報 v0.02J
Copyright (c) 2001 Jay's Factory

目次

1 はじめに

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

2 仕様

 本来,エミュレータは,実機の機能を忠実にまねることが,正しい動作です.ただ,前述したように,現時点では,実機の機能について,正確な情報が得られていない状況です.そこで,作者は,以下の事実から,ぴゅう太の仕様を考察してみました.
  1. ぴゅう太のCPUは,TI社製のTMS9995(クロック周波数: 2[MHz])である
  2. ぴゅう太のVDPは,TI社製のTMS9918Aである
  3. ぴゅう太は,VRAM16KB, ROM20KBを搭載している(VRAM16KBはVDP内に搭載)
  4. ぴゅう太は,TI社製のTI-99/4Aをベースにして開発された
 上記の事実は,ぴゅう太を実現している基盤をみれば,大体類推できることで,多くの人から同一の報告があるので,ほぼ間違いないと思われます. ただ,米国等で発売されていたTOMY TUTOR等とは,外部RAMの容量等で,微妙に異なります. 本資料では,初代のぴゅう太を対象としていきます.

3 CPU

 ぴゅう太に搭載されたCPUは,TI社製のTMS9995[5][8]です.TMS9995は,TI-99/4Aで利用されていたTMS9900[7]をベースとして,新たに開発された16ビットCPUです. TMS9995に関しては,TI社が提供しているデータシート[5]に詳細な情報が記載されています. この資料を参考にしていただくことが,確実だと思います. 本資料では,TMS9995の概要について,説明していきます. この部分の説明は,資料[7][8]を参考にさせていただきました.

3.1 レジスタ

 TMS9995は,下記の3本のレジスタ(16ビット)を持っています(PC:プログラムカウンタ,WP:ワークポインタ,ST:ステータスレジスタ).

名称 ビット:0
重み:>8000
1
>4000
2
>2000
3
>1000
4
>800
5
>400
6
>200
7
>100
8
>80
9
>40
10
>20
11
>10
12
>8
13
>4
14
>2
15
>1
PC PC
WP WP
ST ST0
L>
ST1
A>
ST2
EQ
ST3
C
ST4
OV
ST5
OP
ST6
XOP
ST7
-
ST8
-
ST9
-
ST10
OVEN
ST11
-
ST12
IM0
ST13
IM1
ST14
IM2
ST15
IM3

 STの各ビットには,TMS9995の状態を格納されており,下記のような項目になります(STのnビット目を,STnと表記しています).注意点として,TMS9995においては,MSBがビット0,LSBがビット15のように表記します.Intel等とは,逆の表記になっています.メモリアドレスは,バイト単位で指定され,16ビットデータを格納する場合,上位バイトを偶数アドレスに,下位バイトを偶数アドレス+1に格納します.

nビット 略称 意味
ST0 L> 論理的大なりフラグ
ST1 E> 算術的大なりフラグ
ST2 EQ 等価フラグ
ST3 C キャリーフラグ
ST4 OV オーバーフローフラグ
ST5 OP 奇数パリティフラグ
ST6 XOP XOP命令実行中フラグ
ST10 OVEN オーバーフロー許可フラグ
ST12-ST15 IM0-IM3 割込みマスク

 WPが指し示すアドレスから30バイトが,現在の汎用レジスタ0-15(R0-R15)となります. 汎用レジスタは,通常のCPUにおけるレジスタと同様で,演算対象として利用されます. WPは,主記憶上の任意の場所を指し示すことができますが,TMS9995では,高速な 内部RAM256バイトを搭載しており,通常は,この領域(>f000 - >f0fb, >fffc - >ffff) を利用します.
このように,TMS9995では,3レジスタ(PC,WP,ST)を保存することで,高速にコンテキストスイッチ(割り込み処理等)ができるような構造になっています.

3.2 アドレッシングモード

 TMS9995は,下記に示すような,8種類のアドレッシングモードを持っています.
  1. レジスタ
  2. レジスタ間接
  3. レジスタ間接オートインクリメント
  4. 直接
  5. インデックス
  6. イミディエート
  7. プログラムカウンタ相対
  8. CRU相対

3.3 命令セット

 TMS9995は,下記に示すような,主要な命令を持っています.

3.4 TMS9900

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

3.5 ブート

 TMS9995は,ブート時に,PC = [>0000], WP = [>0002]という値が代入されて,動作を開始します. したがって,少なくとも,>0000 - >0003には,ROMが存在しないといけないわけです.

4 メモリマップ

 メモリマップに関しては,下記の事実をベースとして,考察しました.
  1. ぴゅう太は,VRAM16KB, ROM20KBを搭載している(VRAM16KBはVDP内に搭載)
  2. ぴゅう太のメモリマップは,TI-99/4Aのメモリマップと類似している可能性が高い
 以上から,考察したメモリマップを下記に示します. 基板上のデバイスの配置から,ROMは4KBと16KBに分けて考えるのが自然です. 本資料では,BIOS(4KB)とG-BASIC(16KB)として,考えました. BIOSは,ブート時の動作を含むと思われるので,>0000 - >0fffに配置しました. G-BASICとカートリッジが,同時には使えないことから, カートリッジ(16KB)とG-BASIC(16KB)は,メモリマップ上の同一の場所に配置しました.
 また,TI-99/4Aからの類推から,G-BASIC(16KB)とカートリッジ(16KB)は,>4000 - >7fffに, メモリマップドI/O(VDP)は,>8800 - >8fffに,それぞれ配置しました.

開始アドレス 終了アドレス 用途
>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ベクタ)

4.1 VDP I/O

 ぴゅう太においては,CPUとVDPが通信するために,VDP I/Oを利用します. VDP I/Oは,メモリマップド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ビット)

5 VDP

 VDPとは,Video Display Processorの略語で,グラフィック関連を管理するプロセッサです. ぴゅう太では,VDPとして,TMS9918A[3]が,採用されています. このチップは,MSX等でも採用されており,当時としては,一般的な(安価な)チップです.
 TMS9918Aについては,資料[3]において,詳細に解説されていますので,そちらを参照ください.

5.1 概要

 TMS9918Aは,9本のレジスタ(VR0-VR7, Status)と16KBのVDP RAMを持っています. また,主要なモードとして,スタンダードモード(グラフィック1),および,スプライトがあります.

5.2 スタンダードモード(グラフィック1)

 本モードは,VR0の7ビット目(重み:>01)とVR1の3,4ビット目(重み:>10,>08)が0の時に,選択されます.
 本モードでは,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)

5.3 スプライト

 スプライトとは,スクリーン上の任意の箇所に表示される特殊なキャラクタのことです. スタンダードモード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 SAT: スプライト属性テーブル(<<7)
VR6 0 0 0 0 0 SPTスプライトパターンテーブル(<<11)
VR7 - バックドロップ色
SAT: スプライト属性テーブル
 スプライト属性テーブルは,VR6で指定されるアドレスに記述されるテーブルで,下記のような形式をしています. このテーブルは,32エントリを持っており,各エントリは,4バイト長なので,テーブル長は,最大で>100バイトとなります.
バイト1 バイト2 バイト3 バイト4
スプライト0 Y座標-1 X座標 パターン番号 クロックビット スプライト色
スプライト1

"

"

"

"

"


 スプライトの位置は,スプライトの左上で指定します. Y座標は,デクリメント(-1)した値を格納しますので,一番上のラインのY座標は,>FF(-1)となります. したがって,Y座標は,>FFから>BEとなります.
SPT: スプライトパターンテーブル
 スプライト番号は,スプライトパターンテーブルでの位置を参照します.そして,スプライト色は,下位4ビットで規定された色となります.スプライト属性テーブルは,すべてのスプライトを定義する必要はなく,X座標に>D0を指定することで,エンドマークとして,以下のエントリを無視するように指定できます.
 スプライトパターンテーブルは,8バイト長(8x8),もしくは,32バイト長(16x16)のエントリから構成されます. 8x8の場合,ビットに"1"を指定すると,スプライト属性テーブルで指定した色のピクセル, ビットに"0"を指定すると,透明色のピクセルとなります.
 また,16x16を指定すると,下記のような配置で,8x8のスプライトを配置したのと同じになります.

1 3
2 4

 したがって,16x16を指定して,32スプライトのパターンを格納するためには,>400(32x32)バイトが必要になります.
ステータスレジスタ
 ぴゅう太においては,>8802の値を読み込むと,ステータスレジスタを返却します. ステータスレジスタの仕様を下記に示します.

ビット:
重み:
0
>80
1
>40
2
>20
3
>10
4
>08
5
>04
6
>02
7
>01
ステータス VBLANK Coinc 5スプライト スプライト番号(5番目)

 主要な機能としては,下記の1機能があります.  ステータスレジスタを利用することで,CPUとVDPが通信することが可能になります. すなわち,CPU側では,1画面分の処理を終了してから,VBLANKの開始を検出するまでウェイト処理をして,VBLANKに同期した処理を記述することが可能です. これは,当時のゲームでは,広く行われた手法です.
 また,重要な注意点として,VDP側は,CPU側が>8802への読み込みを実行して,割込みピンをクリア(High)にするまで,VBLANKを続行します.

5.4 垂直タイミング

 TMS9918Aにおけるスキャンラインは,下記のようになります.

スキャンライン 内容 時間
0-243 表示領域 18.8[ms]
244-246 VBLANK(前) 191.1[us]
247-248 VSYNC 191.1[us]
249-261 VBLANK(後) 828[us]

6 カートリッジ

 エミュレータなどでは,カートリッジのROMイメージは,起動時に外部ROM(>4000->7fff)にロードされ,実行されます.商用ゲームの実行には,BIOS(>0000->0fff)も必要なります. 本章では,別途,カートリッジのROMイメージを開発する方法と,デモ例について,説明します.

6.1 開発環境

 ここでは,TMS9900のアセンブラを利用して,ROMイメージを開発する方法について,まとめます. なお,TMS9900アセンブラとしては,Macroassembler AS[4]を利用しました.
1. ダウンロード
から,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

6.2 カラーバーデモ

 本デモ(colorbar.bin)は,左からパレット0 - パレット15の色のバーを表示するデモで,ぴゅう太の起動画面に似た画面を表示します.詳細は,カラーバーデモのソースを参照ください.VDP I/Oを利用する方法を説明しています.

6.3 スプライトデモ

 本デモ(ship.bin)は,複数の船(スクランブル風)が飛ぶデモです. 詳細は,スプライトデモのソースを参照ください. スプライト機能の利用方法と,VBLANKを利用したプログラミングを説明しています.

7 おわりに

 本資料では,ぴゅう太について,現在分かっている技術情報をまとめました. CPUやVDPに関する詳細な情報は分かっており,それらを通信させる方法は,TI-99/4Aを参考にしています. われわれは,上記の仕様を満たすエミュレータとして,InfoPyuta v0.02[2]を実装しました.  ただ,現時点では,本資料にも,多くの誤りや不足が存在していると思われるので, 皆様がご存知のことがあれば,是非ご協力ください.

付録

参考文献

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

免責

   本資料によって生じた損害等に関して,作者は一切責任を負いません. より正確な資料を目指すために,御意見,御要望,バグ報告等を, 下記の連絡先で御待ちしています.
 なお,ぴゅう太(TM)は,TOMY社の登録商標です.

連絡先


PyutaTech v0.02J, Copyright (c) 2001 Jay's Factory, All rights reserved.