X1ド素人の覚書
戻る
11月21日
2D(N=2の360Kバイト)ディスクにN=1のレコード0を混入して、IPLがどっちを読むかのテストをする。今回のフォーマットでは、N=2セクタの方がインデックスホールから近いのだが、予想外な事に、必ずN=1のレコード0を読みに行ってしまう。これはこれで(FF00H〜のワークエリア参照ができるので)嬉しいが、なんでこういう動作をするのかは判らない。
10月27日
機種判別の手がかりを掴む為に、手元にあるX1シリーズ全機のIPL(BIOS)をぶっこ抜く。なんとX1twinのドライブが動作しない。ディスクドライブを摘出してみると、TEAC製ではなくSankyo製だった。Sankyoって、パチンコメーカのSankyoか?
ひとまず予備のドライブを接続して作業を終えたが、これ預かり物なんだよね。どうしたものやら。
10月22日
でIPLセクタの作成。
X1のIPLは、ブートセクタに実行コードではなく「ブートセクタの位置」を示す情報を書き、実行コードはその示されたセクタ(X1ではレコードと呼称)に置く間接方式になっている。
IPL ROMがそのブート位置情報セクタを読み出すアドレスはFE00Hだが、IPLセクタ長がN=1よりも大きい場合、FF00H〜のエリアを破壊してしまうことが予想される。ここには起動ドライブNo.やディスクタイプなどのワークエリアがあるので、N=2以上のディスクでブートさせる場合、このワークエリアの参照を諦めなければならない。かといって88のようにN=1セクタを混在させても一発解決にはならなさそうなのが困り物。実状はテストして調べるしかないか。
10月19日
2HDディスク(2DDも含む)の扱いがうまく行かないので、ディスクI/Oルーチンは当面2D専用で行く事にした。
とは言っても他のルーチンが全部出そろっている訳ではないので、すぐ稼働試験とはいかないのだが。
まずは自前IPLからか。
9月15日
結局X1turboII(CZ-856CE)とPC-TV454の「相性」は、PC-TV454の故障と判明した。デジタルRGB信号だけの入力では使えないが、アナログRGBに正常な信号が来ていれば、デジタルRGBの信号が映るというふざけた状態だ。
これは仕様じゃないよなぁ…。うちの機械はこんなのばっかり。ひとまずX1turboIIの正常動作が確認できてよかったよ。
6月18日
まだディスク方面。2HDではDMAを使わないとデータの送受信が間に合わないのを、知識では知っていたがすっかり忘れていて、READ ADDRESSの6バイトのデータ受信でLOST DATAエラーを食らって思い出した。うう。
が、それ以前に2HDモードではNOT READYが返ってきて何も読み込めない。理由が思い当たらないので、だんだん腹がたってきた。
X1のディスク関係は、調べれば調べるほどいい加減で困る。そもそも…(以下省略)。
PC−88初心者の他機種ユーザが、今からPC−88のプログラミングをしようとした時、充分な資料は入手できるだろうか? CD-ROMや2HDディスクに関しては『マシン語マスターバイブル』を参照すればよいが、8インチディスクとハードディスク(SASI)については、私も解説書籍を見た事がないので無理だろう。8インチディスクについては、N88-BASIC自体を解析して制御方法を知るという手もあるが、ハードディスクについては専用プログラム自体が入手困難で、それもままならない。仮に制御方法が判っても、SASIの10MBでは接続デバイスも見つからないだろうし、使いでも無さそうだ。
こうして考えると、資料が現存しそれを当たれるだけX1は恵まれていると言えそうだ。
6月 3日
その後の調べで、カレントドライブをソフトウェアに依存せず取得する方法は無いらしい事が判った。がっくり。
更に湧いた疑問としては、2DDと2Dを任意に切り替える方法や、モータを止めずにアクセスランプを消灯させる方法などというのがある。
前者は、2HD対応機の内蔵ドライブがFD-55GF*であり、ハードウェア的に2DDと2Dを切り替える機構があるだろうという(勝手な)読み。X1turboには2D専用機もあり、BIOSが内蔵ドライブの置換に対応しているのであれば、この機構がないと2Dと2DDを正確に分別できないはずである。
後者は、アクセスランプの点灯条件が事実上ドライブセレクトのみになっている為、モータが回転している限りラストアクセスドライブ則ちカレントドライブのアクセスランプは点灯したままになるという間抜けな状態を回避する為である。しかも下で述べているように、このカレントドライブを再取得する方法は無いという間抜けぶり。モータの回転を逐一止めると、ドライブ(というかFDC)のステータスが全部クリアされてしまうのと、再度モータオンするのに時間がかかるので、できればこれはやりたくない。
5月31日
出力→入力と来たら、残るは入出力のディスク。まずは一番簡単と思われる接続ドライブ数の取得。セオリー通り(?)に、I/Fチェックをして、I/Fのあるディスクタイプの全ドライブにリストアコマンドを発行、TRACK00を一定時間内に検出できたドライブをカウントする。
X1turboのディスク機構とMB8877は、まだまだ判らん事が多い。内蔵ディスクドライブが2D専用か2HD対応なのかを判別する方法とか、カレントドライブを環境に拠らず取得する方法とか。
5月20日
出力関係に目処が立ったら、次は入力関係という事でキーボードだ。キーボードはサブCPU(80C49)の管轄下にあり、8255を介してキーコードを取得する。具体的なキーコードが手元の資料には載っていなかったので、テストプログラムを書いて使いそうなキーのそれを調べてみた。
| key | function | code |
| SHIFT | 10111101b | --- |
| CAPSLOCK | 10110111b | --- |
| GRAPH | 10101111b | --- |
| CTRL | 10111110b | --- |
| カナ | 10111011b | --- |
| ESC | 10111111b | 1Bh |
| INS/DEL | 08h |
| HTAB | 09h |
| SPACE | 20h |
| BREAK | ??? | ??? |
|
| key | function | code |
| F1〜F5 | 00111111b (10key) | 71h〜75h |
| HELP | E2h |
| COPY | E1h |
| XFER | E8h |
| ROLLUP | ECh |
| ROLLDOWN | EBh |
| CLR/HOME | 0Bh |
| ↑ | 1Eh |
| ↓ | 1Fh |
| ← | 1Dh |
| → | 1Ch |
|
フルキー部以外は全部テンキー扱いなのね。カセットモデルのキーボードについているFFとかREWなども、恐らくそうなんだろう。現物が手元にないので判らないけど。
今回は先行入力処理をしないので、非割り込みでの使用になる。
5月19日
描いたら消すのは当り前という訳で、グラフィック画面クリアルーチンに掛かる。これも例によってコーディング済みだが、グラフィック画面に予め何か表示しておかないと、その動作を確かめられない。装飾クリアもあるので、ひたすら高速に動作すればいいという訳でもなく、テストはその見栄え調整も兼ねている。速すぎるルーチンはコードサイズ優先で再プログラムするだけなので楽。
VRAMアドレスの関係で、速度最優先で48KBベタにクリアするルーチンも、装飾クリアっぽく見えるのはご愛敬か。同時アクセスモードは、I/Oポート読み込みで自動解除されてしまうので、割り込みを許容している汎用ルーチン中では使えない。
5月17日
PCG取り込み定義ルーチンを進める。既に展開されているグラフィックデータをパターンとして、テキストキャラクタのコードに、アトリビュートの色でキャラクタを定義するというもの。グラフィックをPCGに色付きで写し取るといった方が解りやすいか。プログラム中に定義データを持つ必要のないのが利点だが、定義キャラクタコードとカラーは決めておかなければならないので、むしろ手間はこちらの方が大きいかも。諸般の事情(手抜き)でturbo専用だが、最大延べ2000回のPCG定義はノーマルX1には辛いかも知れない。
次に半角/漢字出力ルーチンに取り掛かる。とはいってもコーディング済みなので、アセンブルして実行環境に転送するだけだが、テストに当たって仮のフォント表示プログラムを付加する。第一・第二水準漢字は正常だが、非漢字がおかしい。コード変換部のソースが1行入れ違っていた。これを修正して正常な読み出しを確認。
X1で実装されていた独自選択漢字と半角文字は、turboには実装されていないようだ。
5月11日
グラフィック展開ルーチンのアドレス更新サブルーチンを直展開にしてみた。テストデータの展開には1秒掛からなくなり速度差も体感できるのだが、劇的とまでは行かない。それよりも既に移植時に膨らんだサイズの再増大の方が気になる。
そこで、ほんの少し遅くなるのを覚悟で、アドレス更新サブルーチンの条件分岐部分を再びサブルーチンコール形式に変更した。定数をBCレジスタに加算する処理なので直展開のままのほうが速度的によいのだが、ひとまず29バイトのサイズ増加で済んだ。
あとはレジスタの割り付けとアルゴリズム改良しかないけど、チューンにばかり時間を掛けてられないので、PCG取り込み定義ルーチンに行こうか。
5月 8日
PC−88用のグラフィック展開ルーチンを移植、テストする。このルーチンは縦圧縮がメインなので、グラフィックVRAMのアドレスを縦方向に変化させるのが苦手なX1では速度的に不利のようだ。現在テストデータの展開に1秒強掛かる。アドレス更新サブルーチンを直に展開すれば結構速くなりそうだが、オリジナルよりもサイズが膨らみそう。
4月29日
JETターボターミナル(以下JTT)を2HD起動対応にする。先達の手になるIPL書き換えプログラムを実行しただけの事なのだが、こういったプログラムが存在している事に感謝。当時はX1を持っていなかったはずなんだけど、情報収集しておいてよかった。これでDOS→Hu-BASICへの転送手段が出来た。
JTTはJETターミナルよりもTPAが狭い。これはX1turboとPC−88SRのメモリマップが激しく違う為だが、JETターミナル/JTTを比べると、漢字テキストVRAMを持ち、96KバイトものグラフィックVRAMを持つX1turboよりも、16KバイトのバンクRAM(グラフィックRAMの緑面)と16KBのサブシステムメモリを持つPC−88SRの方が有利なのである。速度はともかく、プログラムを直接実行できるメモリ量の差が効いているようである。JTTがturboZIIのバンクメモリを活用していたら、JTTのTPAもJETターミナル並になっていたかも知れない。現にturbo用のMSX-DOSはバンクメモリを使用してTPAを確保していると聞く。
ここで言うMSX-DOSとは、JET(ターボ)ターミナルに秘かに実装されたOS「CDOS2」と同じく、8ビット機用Multiplanに実装されたOSの事で、X1turbo用とPC−88用がある(らしい)。
X1をいじっていると、Z80の仕様に対して不満が出て来る。I/Oポートアドレスの間接指定レジスタはBCじゃなくてDEにしておいてくれればよかったのに、と。I/Oアドレスを16ビットフルデコードしている環境では、一部のI/O命令でBレジスタが(カウンタとして)変化してしまうのが非常に鬱陶しい。つまり命令の実装方法からして矛盾しているのね。ザイログもその辺は承知していたようで、Z380でI/Oポートアドレスの間接指定をDEレジスタに割り当てた新命令を追加している。望むべくもないのだが、上位プロセッサじゃなく差し替え可能なプロセッサで実現してくれればよかったのにねぇ。
2001年 4月 8日
X1turboII(CZ-856CE)の導入に伴い、CZ-8FB03からCZ-8FB01(2D)とCZ-8FB02(2D)の起動ディスクを作成する。前回作ったはずのCZ-8FB03のバックアップも見当らないので、これも改めてマスターからバックアップを作る。
さて、今のところ15KHz出力が全滅で不満たらたらのディスプレイ環境を徹底(?)テスト。本体3機種×ディスプレイ2台での総当たり戦。
| | CU-14AD | PC-TV454 |
24KHz デジタル | 24KHz アナログ | 15KHz デジタル | 15KHz アナログ | ビデオ | 24KHz デジタル | 24KHz アナログ |
X1turboII (CZ-856CE) | ○ | - | × | - | △ | × | - |
X1turboZIII (CZ-888CB) | - | ○ | - | - | × | - | × |
X1G (CZ-822CB) | - | - | × | - | ○ | - | - |
PC-8801mkIISR (参考) | ○ | ○ | × | ○ | - | × | ○ |
なんじゃこの結果は。
これはX1とディスプレイを接続するデジタルケーブルが駄目駄目なのか、それともPC-TV454がX1と相性最悪なのか。いずれにしてもどこか壊れてるんじゃないのかこれ? と疑わずにはいられない。
まずい、このままだとうちではX1は永久に日陰者扱いされてしまう。使っているだけで腹が立つようでは、いずれ触らなくなるのは明白だ。
11月18日
システムディスクも作らないうちから、ルーチンの移植にかかる。機種の特徴を覚えるには好きな事から始めないとね。開発自体はクロス環境で行うからいいのだが、転送手段も確立しないうちから取り掛かってよいものか?
転送手段がないという事は、実機検証・デバッグ環境がないという事だ。脳内検証は必要だが、あとで虫が大量発生では目も当てられない。
DOS環境からは、やっぱりRS-232Cでちんたら送り込むしかないのか? クロスケーブルに余りはあったかな。
turboが発売された時、X1の完全上位コンパチだと言われたが、それは嘘っパチである。少なくとも漢字ROMに関してはこの両機種にまったく互換性はない。turboにCZ-8KRやCZ-8BK2(どちらも第一水準漢字ROM)を増設できるなら話は別だが、標準で第一水準漢字ROMを内蔵している機種に、更に第一水準漢字ROMを増設するなんて普通は考えないし、やったとしたら相当間抜けな話である。
11月12日
下で悩んだOPMでOPN周波数をエミュレートする方法だが、手っとり早くテーブルを直索きする事にした。オクターブ除去済みの周波数値から、(4D4h-26Ah)×2=1236(4D4h)バイトのテーブルを索いてKEY CODEとKEY FRACTIONを求める。
例によって音合わせもしていない計算式だけのテーブルなので、どんな音になるのか今から楽しみだ。
実はPSGも1.9968MHz→2.0000MHzとマスター周波数が微妙に違うので、調整しないといけない。どの程度違いが出るか。
でも絶対音感を持っている訳ではないから、多少音程が外れたところで全然気付かないだろうけどね。
10月25日
2Dのシステムディスク作成にかかる。なんだかんだで1日潰れて成果なし。勝手が違うとはこういう事か。敵はなかなかに手ごわいぞ。
9月30日
X1の標準音源はPSGで、AY-3-8910かYM2149が搭載されているそうで。AY-3-8910が入手困難になってYM2149に切り換えたのだろうけど、今ではそのYM2149とともに、FM音源のYM2151(OPM)も入手困難になってしまい寂しい限り。
FM音源(OPM)に入力されているのは、本体のシステムクロックと同じ4.0000MHz。石が想定している3.579MHzとかPC−8801の3.9936MHzとは違うので、それらのクロック入力を前提としたデータで音楽的に正しい音階を出力するには補正が必要になる。X1では、OPM内蔵タイマも使えないらしいので、これもZ80CTCのお世話にならねばならない。内蔵タイマを前提にしたテンポも適正に変換してやらねばならない。
具体的なOPN系とOPM間の移植性だが、音色データについては、OPMはOPNの上位互換で、より細かい表現が可能である。両者で露骨に違うところを表にしてみた。
| OPNA | OPM |
| ADDRESS | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ADDRESS | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 22H | - | LFO | LFO周波数 | 01H | - | LFO | - |
| 18H | LFO周波数 |
| 28H | SLOT(4〜1) | - | *1 | CH# | 08H | - | SLOT(4〜1) | CH# |
| A0〜A2H | F-num2 | 28〜2FH | - | KEY CODE |
| A4〜A6H | - | BLOCK | F-num2 | OCT | NOTE |
| B0〜B2H | - | FB | ALG | 20〜27H | R | L | FB | ALG |
| B4〜B6H | L | R | AMS | - | PMS | 38〜3FH | - | PMS | - | AMS |
| 30〜3EH | - | DT | MULTI | 40〜5FH | - | DT1 | MUL |
| 60〜6EH | EN | - | DR | A0〜BFH | EN | - | D1R |
| 70〜7EH | - | SR | C0〜DFH | DT2 | - | D2R |
| 80〜8EH | SL | RR | E0〜FFH | D1L | RR |
*1:0=CH1〜3、1=CH4〜6を選択
OPMのアドレス40〜FFHのパラメータは、名称が違うだけでOPNAと一緒(DT2を除く)。
一番の難題は、両者の発振周波数の与え方の違いで、この部分は8ビット機では完全な変換(移植)を望めそうにない。よって近似値の範囲でどうごまかすかが課題になる。
9月28日
ひょんな事から、X1の資料をお借りする事ができた。これでX1に対する心のモヤモヤをちょっとでも晴らせるかも知れない。
15年前だったら、自分で解析くらいはしたかも知れないが、先達の遺産がある今となっては、それは無駄な作業になりかねないし、もはやそんな気力もない。資産はありがたく活用させて戴こう。
一通りX1の構造を眺めてみての第一印象。メインで使用しているPC−8801との比較という形になるが、
・Z80ファミリの特性を活かした設計
・グラフィックRAMが必要以上に複雑
この2点に尽きる。
X1は、Z80CPUを始め、Z80CTC、Z80SIO、Z80DMA(turbo以降のみ)を搭載したモード2割り込み専用のシステム設計と、これらの周辺を接続するI/Oエリアを64KBフルに実装している(うち52KBをVRAMで使用)。PC−8801ではモード2割り込み自体は使用できるが、Z80ファミリは一切使用していないし、割り込み自体も8レベルしか使用できない。I/Oエリアも、アドレスバス上位8ビットをマスクして256バイトしか使えないようになっている。
基本設計時期が違うとはいえ、この差はかなり大きい。
グラフィックRAMについては、搭載CRTCの違いや設計上の都合(?)を差し引いても、人間感覚からすると非常に判りづらいアドレス配列になっている。turboでグラフィックRAMの容量が倍化したり、turboZで色数が増えたりしたため、その度に画面モードも増えて混迷の度合を増している。慣れればどうという事はないのかも知れないが、熟練には時間を要しそうだ。
実はグラフィックRAM自体がI/Oエリアに実装されている事自体は欠点とは言えないのだが、HLレジスタで直接アドレス指定できないのは、グラフィックRAMのアドレス配列の点からも少々痛い。もし、Z80DMAでの操作を見越してグラフィックRAMをバンク切り替え実装にしなかったのだとすれば、それはそれで天晴な話である。
ちなみに、PC−8801のグラフィックRAMはバンク切り替え実装であり、DMAC(8257)からは全く見えないメモリとなっている。
戻る