Top > 88VAユーザーズクラブ > Q&A集 > 27
#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 >>>


Top > 88VAユーザーズクラブ > Q&A集 > 27