FM TOWNSテクニカルデータブックは、FM TOWNSが現役だった当時かなり助けられました。アプリケーションプログラムを書く分には何も支障が無かったですが、エミュレータを書こうと思ったらいくつもの誤りを発見してしたのでまとめてみました。新しいのを見つけるたびに追加する予定です。
8x8, 8x16ドットフォントのマッピング
(誤)
000CA000H 漢字ROMアドレス1E000H
000CA800H 漢字ROMアドレス1E800H
000CB000H 漢字ROMアドレス1E800H
000CBFFFH 漢字ROMアドレス1F800H
(正)
000CA000H 漢字ROMアドレス3D000H
000CA800H 漢字ROMアドレス3D800H
000CB000H 漢字ROMアドレス3D800H
000CBFFFH 漢字ROMアドレス3E800H
「Specific」という単語を「特殊」と訳してるんだけど、多分誤訳。「Special」と見間違えた?「特定」とかいう方が合ってると思う。「特殊EOIコマンド」とか「非特殊EOIコマンド」とか何のことかと思った。
あと、"Fully Nested Mode"をフリーネステドモードと訳してるんだけど、それはちょっとあんまりなんでない?"Free nested mode"かと思ったよ。"Specific"を日本語に訳すんだったら、"Fully"もきちんと「全ネステドモード」とかにしてほしかった。
これは著者の誤訳か、あるいはPICのデータシートを訳した人から間違ったのかはわからんけど。
TC3-0の解説「DMA転送が指定されたバイト数終了したかどうかを示す。」は誤りで、DMAC 71071データシートによると、"The register has DMA request states and terminal count or ~END information"とあるので、正しくは「DMA転送が指定されたバイト数終了したか、あるいはDMAに指定されたバイト数に達しなくても転送が終了したかを示す。」
### 表 I-3-25
タイマーカウントレジスタはそれぞれ16ビットなのに、8ビット分しか書いてない。
本文の方に「16ビット」と書いてあるから表のビット数は無視。
これは僕の勘違いだった模様。多分途中で16ビットアクセス可能にしたらたまたま何かが動くようになったとかあったのかもしれない、けどやっぱり8ビットアクセスが正しかった。
「チップセレクトがアクティブで、クロックが1のとき」
クロックは1で無くても良い。フリコレ6のブートセクタ内で 00H 80H 00Hの順に書き込んでアドレスリセットしている。
図I-4-33 オフセットレジスタ値へのアダレス値への加算
「アドレス」が「アダレス」になってる。
「スロットは、個別にエンベロープ信号を接続するかどうかのスイッチを持っているので、スロットごとにエンベロープ変調をかけるかどうかを選択できます。」
そんなレジスタは無い。できない模様。実際のアプリケーションでオフにする場合はTLを127にしている模様。
すべてのスロットにエンベロープがかかるし、上流の変調用スロットもDbスケールがかかってる。あと、どこにも記述が無いけど、各スロットの出力をdBスケールから線形スケールに変換して1.0が変調度の8PIに対応する。
図ではレジスタ25Hは下位3ビットのように見えるが実際は下位2ビット。
(誤) 内部クロック周波数は600KHzです。
(正 多分) 内部クロック周波数は667KHzです。
FM-7/77AVのFM音源カードYM2203Cに与えられるマスタークロックは、1228.8KHzであることが判明している。そこから、F-BASIC V3.3とF-BASIC 386がPLAY"O4A"で書き込むF_NUMとBLOCKを元に、クロック周波数の比を計算して、あてはめると、TOWNSのYM2612に与えられるベースクロックは1999.46KHzという計算になるので、おそらくマスタークロックが2MHz。YM2203Cは分周比2,3,6から選ぶことができるので、YM2612も同じと考えると、分周比3が使われているとすると、2000/3=667KHzの内部クロック周波数になっているものと思われる。
NOTE計算式。F11って書いてあるけどF-Numberは11ビットだから最上位ビットはF10だから。だから、N4=F10, N3=F10*(F9+F8+F7)+~F10F9F8*F7 と解釈するか?
ただ、これYM2608(CMOS版YM2612)のアプリケーションマニュアルにも同じ記述があるから、何が正しいのかは不明。
そもそもMMLの書き方としてA4と書いてあるのは変で、多分O4Aと書きたかったのではないか。
この表だとO4Aに対応するF-Numberは1153のはずだが、F-BASIC386で
PLAY "O4A"
とするとF-Numberは1038が書き込まれる。Sega Genesis Software Manual (Supplementary Index page 16) では"A"に対応するF-Numberは1037とある。当初ベースクロックが違うのかと思ってたけど多分FM TOWNSテクニカルデータブックの間違い。
(誤)
HDISEL(bit2):リード/ライトの対象となるメディアの面を指定する。
0=サイド1
1=サイド0
(正)
HDISEL(bit2):リード/ライトの対象となるメディアの面を指定する。
0=サイド0
1=サイド1
IMSK(bit6) 0:割り込み許可 1:割り込み禁止
とあるけど、0が禁止、1が許可の模様。そうでないとBIOSの解析結果と矛盾するし、実際走らない。
1024x512の画面モード (画面モード3と4)は球面スクロール可能。円筒スクロールという記述は誤り。
図ではスプライトBUSYの開始はVSYNC終了時と解釈できるが、実際はVSYNC開始と同時にスプライトBUSYとなる。FM TOWNS 2MX実機で計測したところ、スプライト画面消去にかかる時間は約30usだったので、おそらく32usという記述は正しい。スプライト一個あたりの所要時間は2MXの場合57usだった。MXでは先代TOWNSよりもスプライトの速度が上がっているという情報があるので、初代では図にある通り75usかかっていたのかもしれない。
誤 ES:DSI 正 DS:EDI なんだDSIって!?
音程の説明。表では値の範囲は24~119とあるが、TOWNS OS V2.1 L51のTBIOSで確認したところ12~107。範囲外ではパラメータエラーとなる模様。
ピッチベンドの説明。まず、入力DXは-8192~+8191ではない。0~8191。と思ったけどFM音源に出てくる値を見ると8008でF_NUMBERの上りが止まっているから、0~8008なのかもしれない。どうやらunsignedで値を受け付けているようで、-1を与えると0FFFFHと解釈するのか、振れ幅の範囲で最大周波数になる。
周波数の変化は線形で、サンプルしたケースではDX=5925付近で傾きが変わる。ただし、DX=4096が中央で、変化無し。また、DX=0のときピッチベンドは0と解釈するようで、変化無し。DX=1のときが周波数が最低となる。
なんだそりゃ?
パッド入力1とパッド入力2の説明、ビット0とビット1が逆。ビット0が上。ビット1が↓。
リターンデータは、 色識別番号,B,R,G,0の合計8バイトを繰り返す。「設定パレット数分繰り返す」だと4バイトだけ繰り返すように読めるが、これは誤り。309ページのEGB AH=04Hにそのまま渡せる形式のデータを返すようだ。
DSKCHG flag:
0=チェンジあり
1=チェンジ無し
とあるけど、逆。
pp.262と同じエラー。
R/Wの欄にR (Read)とあるけど、この図は、020CHのWriteの説明。