#0027/9999 Q&A集
★タイトル (88VAUSER) 95/11/01 00:00 (194)
1.25 VAのCPUはV30とどこが違うのでしょうか?
★内容
A: VAに搭載されているCPU(μPD9002)は、CPU命令ではV30相当です。
正確には、V30に割り込みコントローラとDMAコントローラ、プログラマブ
ルタイマ等を内蔵したV50に近いものになっています。ちなみにV50はPC-98LT
やPC-98HAのCPUでもあります。
V50は、内蔵の各種コントローラのI/Oポートの配置を定義するために、専
用のコントロールポートが 0FFF0H 以降に用意されています。これについて
は後述します。
μPD9002がV50と違う点は以下の通りです。
1. V30やV50の専用命令のうち INS,EXT,OUTM,INM の4つはサポートしない
2. V30やV50にあった8080エミュレーションモードが強化され、μPD780エ
ミュレーションモード(すなわちZ80エミュレーション)になった
3. I/Oトラップ機能がサポートされている
1.に関してはそう問題になることは少ないと思います。ただ、OUTM,INM
(ともにNECニーモニック表記)は、80186命令のOUTSB(OUTSW),INSB(INSW)
と同じコードなので、80186命令を使ったソフトでは弊害が出る可能性もあ
ります。
なお、オリジナルのISH.COMではCPUが8086かV30かの判定を行って、それぞ
れに適した処理をするのですが、VA上で動作させるとV30と判断されてしま
い、VAではサポートされていない命令を実行するため、不都合が生じる場合
があります。
2.は、8ビット88をエミュレートする際に必要となる機能で、V30における
8080エミュレーションの扱いかたと全く同じです。違うのはZ80命令がエミュ
レートできることです。
このため、V30の8080エミュレーションを用いたCP/Mエミュレータ(cpm.exe
v0.4 (c)k.murakami等)では、VAで実行させるとZ80をハードエミュレートす
るため、Z80 8MHz相当の速度が出ます。この機能については各種書籍を参考
にしてください。(8080エミュレーションがそのまま適用できます)
3.も8ビット88をエミュレートする際に必要なもので、特定のI/O命令を実
行した時点で内部割り込みを発生させる機能です。これにより、98のI/Oポー
トをVAでエミュレートさせることも不可能では有りません(すべてのポート
をI/Oトラップでサポートするのは非現実的ではありますが...)
なお、I/Oトラップ機能の詳細とサンプルがPC実験室の#4015-#4017にあり
ます。詳しいことはそちらをご覧ください。
I/Oトラップ、内蔵コントローラの制御はI/Oポート 0FFE0H〜0FFFFH のI/O
ポートで行います。簡単に各I/Oポートの説明をします。
なお、0FFF0H〜0FFFFHはバイトアクセスのみ可能です。
(参考:CoBit氏のI/Oトラップ関連資料(#4016)、μPD70216データシート(NEC))
0FFE0H (IOTrap1S) OUT Word
I/Oトラップポートブロック1開始ポート番号
0FFE2H (IOTrap1E) OUT Word
I/Oトラップポートブロック1終了ポート番号
0FFE4H (IOTrap2S) OUT Word
I/Oトラップポートブロック2開始ポート番号
0FFE6H (IOTrap2E) OUT Word
I/Oトラップポートブロック2終了ポート番号
0FFEFH (IOTrapC) I/O Byte
I/Oトラップ制御
bit0 : INトラップ許可フラグ 0:禁止 / 1:許可
bit1 : OUTトラップ許可フラグ 0:禁止 / 1:許可
bit4 : トラップポート選択 0:byte / 1:word
I/Oトラップ領域はIOTrap1S〜IOTrap1E、IOTrap2S〜IOTrap2Eの2領域が設
定可能(但し下位8ビットのみ有効)。
設定したI/Oにアクセスすると、INの場合はINT 7CH、OUTの場合はINT 7DH
が発生する(但しスタックに積まれるCS:IPはI/O命令が存在する番地なので
IRETの前にCS:IPを進めておく必要がある)。トラップ時はCLI状態である。
どのI/OをアクセスしたかはCS:IPの命令を見る事。
(以上Cobit氏の書き込みを参考にしました。以下はV50データシートより抜粋)
0FFF0H (_TCKS) I/O Byte
Timer Clock Selection register
内蔵タイマカウンタの分周比設定、供給クロック選択
7 6 5 4 3 2 1 0
+----+----+----+----+----+----+----+----+
| | | |CS2 |CS1 |CS0 | PS |
+----+----+----+----+----+----+----+----+
PS (Prescale of Internal Clock) : 分周比
0 0 : 内部クロック分周数2 (VAデフォルト)
0 1 : 内部クロック分周数4
1 0 : 内部クロック分周数8
1 1 : 内部クロック分周数16
CS0 - CS2 (Clock Selection of TCU#n) : 供給クロック選択
0 : 内部クロック (VAデフォルト、全カウンタ共通)
1 : 外部クロック
0FFF2H (_RFC) I/O Byte
Refresh Control register
リフレッシュ制御(VAではCPU内蔵リフレッシュ制御を使用していな
いためこのポートは無効。0154H(_RefMode)参照)
bit0-4 : (Refresh Timer) リフレッシュ間隔設定
bit7 : (Refresh Enable) リフレッシュ許可
0:禁止(VAデフォルト) / 1:許可
0FFF4H (_WMB) I/O Byte
programmable Wait, Memory Boundary register
メモリ空間領域(上位・下位)設定
7 6 5 4 3 2 1 0
+----+----+----+----+----+----+----+----+
| | L M B | | U M B |
+----+----+----+----+----+----+----+----+
LMB (size of Lower Memory Block) : 下位メモリ空間
UMB (size of Upper Memory Block) : 上位メモリ空間
000 : メモリ空間下位(上位)32KBを設定
001 : メモリ空間下位(上位)64KBを設定
010 : メモリ空間下位(上位)96KBを設定
011 : メモリ空間下位(上位)128KBを設定
100 : メモリ空間下位(上位)192KBを設定
101 : メモリ空間下位(上位)256KBを設定
110 : メモリ空間下位(上位)384KBを設定
111 : メモリ空間下位(上位)512KBを設定
UMBはMS-DOS 5.0のUMBとは意味が違うので注意。
V50はメモリ1MBのメモリ空間を3つ(上位・中位・下位)の3つ
に区切って、それぞれ別々にウェイトをかけることが可能。中位ブ
ロックは上位と下位に挟まれた空間。
VA3ではこのポートを読み出すと0D3Hが返る。
0FFF5H (_WCY1) I/O Byte
programmable Wait, Cycle register 1
ウェイトサイクルレジスタ1
7 6 5 4 3 2 1 0
+----+----+----+----+----+----+----+----+
| IOW | UMW | MMW | LMW |
+----+----+----+----+----+----+----+----+
IOW (Wait for the I/O) : I/O空間ウェイト
UMW (Wait for the Upper Memory block) : 上位メモリ空間ウェイト
MMW (Wait for the Middle Memory block) : 中位メモリ空間ウェイト
LMW (Wait for the Lower Memory block) : 下位メモリ空間ウェイト
00 : 0 Clock (No wait)
01 : 1 Clock
10 : 2 Clock
11 : 3 Clock
VA3ではこのポートを読み出すと80Hが返る。
0FFF6H (_WCY2) I/O Byte
programmable Wait, Cycle register 2
ウェイトサイクルレジスタ2
7 6 5 4 3 2 1 0
+----+----+----+----+----+----+----+----+
| | | | | DMAW | RFW |
+----+----+----+----+----+----+----+----+
DMAW (Wait for the DMA cycle) : DMAサイクルウェイト
RFW (Wait for the Refresh cycle) : リフレッシュサイクルウェイト
00 : 0 Clock (No wait)
01 : 1 Clock
10 : 2 Clock
11 : 3 Clock
VA3ではこのポートを読み出すと88Hが返る。
VA3でDMAWを0にするとHDDアクセスで暴走した。
0FFF8H (_SULA) I/O Byte
SCU Low Address Register
内蔵シリアルポートSCU(UART相当)の下位ポート設定
SCUはDMAUと排他使用。VAではDMAUを利用しているため未使用
0FFF9H (_TULA) I/O Byte
TCU Low Address Register
内蔵プログラマブルタイマの下位ポート設定
0FFFAH (_IULA) I/O Byte
ICU Low Address Register
内蔵割り込みコントローラ(マスタPIC)の下位ポート設定
0FFFBH (_DULA) I/O Byte
DMAU Low Address Register
内蔵DMAコントローラの下位ポート設定
0FFFCH (_OPHA) I/O Byte
On-chip Peripheral High Address register
各内蔵コントローラの上位ポート設定
0FFFDH (_OPSEL) I/O Byte
On-chip Peripheral Selection register
内蔵コントローラの使用・禁止
bit0 : SCU(シリアルコントローラ)
bit1 : TCU(プログラマブルタイマ)
bit2 : ICU(割り込みコントローラ)
bit3 : DMAU(DMAコントローラ)
0:使用不可 / 1:使用可能
0FFFDH (_OPCN) I/O Byte
On-chip Peripheral Connection register
内蔵コントローラのピンアサイン設定
ハードと密接に関っているので変更するとVAが動作しません。
<<< end of article >>>