1.5 CPU †μPD9002の概要は以下のとおり。
1.5.1 命令セット †V30モードにおける命令セットは、以下をサポートしない点を除いて、V30と同じ。
[マイコン '87/8月号] Z80エミュレーションモードへの移行命令として、BRKEM2命令が追加されている。バイトコードは0F,FE,nnの3バイトで、nnは割り込み番号。VAではV30コンパチのBRKEM(0F,FF,nn)は使用されていない。 1.5.2 内蔵周辺回路の制御 †V50の場合は、FFF0h-FFFFhのI/OでCPUの端子の機能の選択、ウェイト制御、DMAコントローラ、割り込みコントローラ、タイマ、シリアルインタフェースのI/Oアドレスの指定を行う。μPD9002でも同様と推測される。 VA2の場合、以下の設定で使用している。(VA1未調査) ポート番号 出力データ(バイト) いずれも16進表記 ---- -- FFFE 11 FFFD 07 FFFC 01 FFFB 60 FFFA 88 FFF9 A0 FFF6 08 FFF5 80 FFF4 53 FFF2 08 FFF0 00 1.5.3 I/Oトラップ †[VAクラブ PC実験室 4016 (92/ 3/31) CoBit?氏] I/OトラップとはI/O命令を実行すると発生するソフトウェア割り込み のことです。普通、Vシリ〜ズ系のソフトウェア割り込みはINT、INTO 命令やDIV命令等の実行時エラ〜で発生しますが、VAではIN、OUT命 令でも発生させることができます。 I/Oトラップは、もともとV1・V2モ〜ドのために一部のI/Oポ〜ト (50〜53H、60〜68H、6E〜6FH)をエミュレ〜トするために存 在します。したがって、V3モ〜ドではI/Oトラップは禁止状態になってま すが、制御ポ〜トを操作することで使用することができます。しかし、これは V1・V2モ〜ドのI/Oのいわばパッチ当てのために存在するようなものな ので、その機能は貧弱です。 VAにはBNNのテニカルマニュアルに載ってないI/Oポ〜トがいくつか ありますが、I/Oトラップのためのポ〜トはFFE0〜FFE7,FFEF に割り当ててあります。以下にその内容を示しますが、その名称は私が独自に つけたものです。 I/Oポ〜ト FFE0 _IOTrap1S OUT W I/Oトラップポ〜トブロック1のスタ〜トポ〜トNo. FFE2 _IOTrap1E OUT W I/Oトラップポ〜トブロック1のエンドポ〜トNo. FFE4 _IOTrap2S OUT W I/Oトラップポ〜トブロック2のスタ〜トポ〜トNo. FFE6 _IOTrap2E OUT W I/Oトラップポ〜トブロック2のエンドポ〜トNo. FFE0とFFE2、FFE4とFFE6を互いにペアとして使い、 I/Oトラップするポ〜トNo.の領域(ブロック)を2組設定できる。 FFEF _IOTrapC I/O B I/Oトラップ制御 76543210 000*00** | || | |+― 0:INトラップ禁止、 1:許可 | +―― 0:OUTトラップ禁止、1:許可 +――――― 0:バイトポ〜トトラップ、1:ワ〜ドポ〜トトラップ 次にトラップが発生した時の割り込みベクタです。 割り込みベクタ 7CH I/OTrap(IN) 7DH I/OTrap(OUT) I/Oトラップを使用するときは、このベクタを割り込み処理プログラム の先頭アドレスに設定してやります。 ※注意点 ・I/Oトラップするポ〜トNo.の領域を設定するので、トラップを望ん でないポ〜トがその領域内に存在する場合は、トラップ先のプログラムで トラップ禁止にして、実際のI/O処理をしてやらなければなりません。 ・FFE0〜FFE6はワ〜ドアクセスできますが、上位バイトは常に0で、 下位バイトしか設定できません。したがって、ワ〜ドポ〜トトラップに設 定しても、ワ〜ドポ〜トNo.の下位バイトが一致すると必ずトラップす るので、トラップ先のプログラムで望みのポ〜トかどうか調べなければな りません。 ・I/Oトラップが発生した後、ベクタに設定した割り込み処理プログラム へ実行を移す時FLAG、CS、IPがスタックに保存されますが、その CS:IPの値はトラップが発生した場所、つまりI/O命令がある番地 であって、割り込み処理後、次に実行する命令の番地ではありません。こ のため、どのようなI/O命令でトラップしたのかが、スタックに保存さ れたCS:IPの番地をみることでわかります。ですが、IRETで戻る 前にはI/O命令の長さを考えて、必ずスタックの中のCS:IPを増や して、次の命令の番地にしてからIRETしないと無限ル〜プに陥ります。 ・I/Oトラップはソフトウェア処理ですから、I/Oトラップを使用した 場合、I/O命令は数十倍から数百倍遅くなると考えてください。特に、 ポ〜ト52Hを含んでワ〜ドトラップすると、ポ〜ト152Hもトラップ するので、このポ〜トを頻繁に利用するPC―ENGINEでは、極端に 目に見えて動きが遅くなります。FDDなどのポ〜トもまたしかりです。 ・トラップが発生すると割り込み禁止(CLI)状態で割り込み処理プログ ラムに実行が移ります。 ・割り込み処理プログラム中でI/O命令を使う時は必ずトラップ禁止にし て、I/Oトラップがネストしないようにします。 ・I/Oトラップの割り込み処理プログラムは、処理中に外部割り込み許可 (STI)にするときは、必ずトラップ禁止にします。 ・ffe0〜ffffのポ〜トをトラップしてはいけない。 ・これらの機能は私がROM解析&実験して判断したものなので、まちがい があるかもしれません。また、まだ足りない部分があるかもしれません。 ここまで、みてきてもなにがなにやらわからないと思うので、アセンブラの プログラム例(98IOE)を以下にアップしておきます。決してわかりやす いプログラムではありませんが、これをもとにすればI/Oトラップ処理につ いて考えずに処理ポ〜ト内容を増やしていけるかと思います。要OPTASM です(^^;) IOTRAP.LZH I/Oトラップ使用サンプル |