1.5 CPU †

μPD9002の概要は以下のとおり。

  • V30モードとμPD780モードを持つ。両者の関係はV30のネイティブモードと8080エミュレーションモードの関係と同じであり、相互のモード移行方法も同様。
  • V50と同様に、以下の周辺回路を内蔵。
    • DMAコントローラ、割り込みコントローラ、タイマ、シリアルインタフェース*1
    • プログラマブルウェイト制御ユニット: メモリサイクル、I/Oサイクルに0〜3クロックのウェイトサイクルを指定して挿入。
    • クロックジェネレータ、リフレッシュユニット
  • I/Oトラップ機能を持つ。

1.5.1 命令セット †

V30モードにおける命令セットは、以下をサポートしない点を除いて、V30と同じ。

  • INS
  • EXT
  • OUTM
  • INM

[マイコン '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
です(^^;)

fileIOTRAP.LZH I/Oトラップ使用サンプル


*1 シリアルインタフェースはVAでは未使用かも

添付ファイル: fileIOTRAP.LZH 1218件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-10 (火) 18:36:26 (2409d)