#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 >>>