|
さて、後編です。 第5話:アナログパレットの利用PC−9801Vシリーズのあまり使われない機能の中に4096色のアナログパレットがあります。私も今までグラフィックツールソフトの他にこの機能を利用したソフトを見たことがありません。が、これも利用しない手はないというもの。ビジネスソフトに、ゲームソフトに、発想次第ではいくらでも応用できることと思います。例えばモノトーンの画面でも、郷愁を誘う微妙なセピア色のワークシートとか目に優しく気持ちの落ちつくグローブグリーンのテキストエディタなど、ちょっとした色使いでかなり面白い効果を出せる場合も多いと思います。また、ゲームなどの分野であっても、重厚なメタリック感覚のキャラクタやリアルな爆発シーンなど大きな効果を期待できます。 それでは早速プログラミングに入りましょう。Vシリーズにはハードウェア的に2つのカラーモードが存在します。それぞれ8色グラフィックモード、16色グラフィックモードと呼ばれ、前者が従来機とのコンパチモード(8色パレット)で後者が今回利用する4096色パレットが使用できるモードです。「16色」というのは、Vシリーズ以降の機種はRGB3画面の他にI(インテンシティー)(=明度)の画面が追加され、同時16色表示が可能になったことに由来します。 PC9801のパレットポートはかなり異常でプログラマ泣かせでありまして、IOアドレスが連続しているわけでもなければパレットコードの順に並んでいるわけでもありません。おまけにポートが4バイトしかなく、従来コンパチの8色パレットの場合は上下2つのニブル(4bit)に分割して使用しなければなりません。はっきり言って完璧に人を馬鹿にしています。 幸い4096色パレットの設定の場合は8色のときほど苦労はなさそうです。IOポートを【表1】に示します。
さて、パレットの設定の仕方ですが、わずか4バイトのIOポートを用いて4096色を表現するわけですから、従来のように3bitのパレットコードを出力するだけではとても済みません。まずA8Hにカラーコード(0=黒〜15=明るい白)を出力し、次いでそのコードに割り当てる色をGRBそれぞれ16段階(4bit)でAAH,ACH,AEHに出力、設定します。ここで注意することは、VM2/VF2のように実際にはインテンシティーVRAMが載っておらず(オプション)16色モードに設定しても8色しか使用できない機種の場合は、出力するカラーコードが0及び9〜15になることです。ちなみにカラーコード8はグレー(灰色)になります。 何はともあれサンプルプログラムを見てみましょう。一目瞭然だと思います。このプログラムを走らせると画面をフェードイン・フェードアウトします。原理は簡単で、グラフィックVRAMの黒のカラーコードに暗色の白から明色の白へ15段階でパレットコードを割り当てるわけです。ま、リストを見てください。ただ、このプログラムはSLR社のオプティマイズアッセンブラで開発してありますので、マイクロソフト社のMASMだとエラーを出すかもしれません。そのときは適宜修正してください。
第6話:ちょっとひと休み(SLR社製OPTASMについて)
|
|||||||||||||||||||||||||||||
第7話:V30の使いこなし以前、零壱症候群第一号で「V30の話」をいたしました。ここではその続きを兼ねまして8086との差やアッセンブラプログラミングの高速テクニックなどを紹介します。 ●回数指定SHIFT命令 8086にはCLレジスタにより回数を指定するSHIFT命令があることは周知の通りです。1ステップの命令で最大15回までの任意シフトができるわけですから、定数乗除算やビット編集にはもってこいの命令のように思われます。
確かにソースレベルではまことに便利なのですが、オブジェクトレベルになると話は別です。実行速度がかなり遅くなるのです。8086CPUの場合、レジスタの1回シフトに要するクロックは最低の2クロックですが、回数指定シフトの場合は1回のシフトでも12クロックもかかってしまうのです。【表.1】を見てください。
CLによる回数指定シフトの場合は、基本8クロックにシフト回数×4クロックを加えた分のクロックを消費します。ですから、ex.1の場合を計算すると 6×4+8=32 となります。これに対して1回シフト命令を任意回数繰り返した場合は 6×2=12 となり、6回シフトする場合は約2.7倍も高速になります。ちなみに2回シフトの場合は4倍、15回シフトの場合は約2.3倍と、共に回数指定をしない方がずっと高速です。8086の場合は回数指定SHIFT命令の使用は、高速性が必要なく、ビット操作の多用が必要なとき以外は控えるべきでしょう。 以上の話はあくまで8086のときのことで、これがV30になるとかなり話は変わってきます。表.2を見ればわかるように、回数指定シフトのクロック数が減っています。
これから計算しますと、7回以上シフトするときは回数指定SHIFT命令を使用した方が良いことになります。ちょうど7回シフトした場合は共に14クロックですが、当然サイズの小さい回数指定シフトの方がよいでしょう。これはV30が定数指定によるシフトが可能なためです。8086のようにCLレジスタによる指定しかできないと、CLレジスタへ回数をロードする手間がかかってしまうので11回以上シフトしないと元がとれないことになってしまいます。7回以上一度にシフトすることはめずらしいとは思いますが、いちおう憶えておくことをおすすめします。 ●DEC,INC命令の不条理 DEC,INC命令はZ80や6809などの8bitCPUにも存在するオーソドックスな命令です。もちろん8086にもあり、任意の汎用レジスタやメモリの内容を±1することができます。 インテル系CPUの特徴のひとつであるブロック転送専用命令は、8086ではストリング命令として用意されています。MOVS命令がそれで、バイト転送/ワード転送どちらを選択することも自由です。この命令の簡便性、高速性は使用経験ある方は実感済みのことと思います。 ではここで、8086のMOVS命令の高速性を証明するために、通常のMOV命令を使用した等価ルーチンとの所要クロックの差を見ていくことにしましょう。
さて、表.3をご覧になればおわかりのように、8086のストリング命令を使用した場合としなかった場合では実に約2.5倍もの実行速度の差が生じます。このことは脳裏にしっかりととどめておいてください。たかだか3ワード程度のデータ転送だからといって1ワードずつレジスタを介して転送するよりも、多少の初期設定をしてでもストリング命令を使用した方が高速な場合だって多々あるのです。V30ならばなおさらです。 ここでV30のケースがでましたが、【表.3】の括弧内を見れば一目瞭然なように、ストリング命令を使用しない場合でも25%程度、使用した場合はちょうど2倍も8086より高速なのです。このストリング命令の高速化はV30の特徴のひとつでして、PC9801がVシリーズになってからグラフィックを多用したゲームなどの速度がグ〜ンとアップした理由のひとつはここにあるといってよいでしょう(V-RAMアクセスのウエイトが下がったのも大きいですが)。V30プログラマの人はここんとこをうまく利用しましょう。 (※以上はメモリアクセスに際してウエイトがかからないという前提で計算したものです。) |
|||||||||||||||||||||||||||||
|
●ビットフィールド操作命令 V30特有の命令にビットフィールド操作命令があります。これは他の16bitCPUにも類を見ないものです。
(MOV AX,10101B ;AX=WRITEデータ) となります。これを8086のコードで書くと、 (MOV AX,10101B ;AX=WRITEデータ) このようになってしまいます。ここでは2バイトにまたがる例でしたが、これが3バイトにまたがる場合だとこんなもんでは済みません。INS命令を使用すれば第2オペランド(アンダーライン部分)を例えば14にするだけで済みますが、8086コードだとさらに複雑になってしまいます。速度は言うに及ばず、平均でも3〜5倍高速化されます。 |
|||||||||||||||||||||||||||||
|
●STOS命令の高速性 STOS命令も知らないと損をする命令のひとつでしょう。どのくらい速いかというと、
この場合、メモリを32Kバイト0でクリアするルーチンになります。ご覧のようにSTOS命令をREPプリフィクスと併用して使用すると8086で2.6倍、V30で4倍も高速化します。 STOS命令はメモリを一定のデータで埋める用途以外にはあまり使い道はないように定説化されていますが、数列や演算テーブルの作成など応用はまだまだあると思われます(リピートプリフィクスは使用できませんけ ど)。特にV30の場合はそれによってかなり高速化が図れます。 (※これもメモリアクセスに際してウエイトがかからないという前提で計算したものです。) |
|||||||||||||||||||||||||||||
| ●ビット操作命令
Z80のプログラミングをされたことのある方はビット操作命令のありがたみがおわかりになると思います。任意1ビットのセット,クリア,テストが1ラインで実現できるのですから。8080でこれをやろうとすると大変。シフトやAND,ORの連発になります。実は8086も8080と同様で、任意のビットを操作するには論理演算の連発にならざるを得ません。 V30特有命令の中でも光っているもののひとつです。V30ニモニックでは、 push R と表現します。わずか1ラインで8ライン分のPUSH/POPを行なうのですから嬉しさいっぱい夢いっぱいです。8本の汎用レジスタをもれなく一気にスタックに放り込んだり戻したりしてくれます。さて問題の速度ですが、【表.5】を見てみましょう。
(※これもメモリアクセスに際してウエイトがかからないという前提で計算したものです。) |
|||||||||||||||||||||||||||||
最終話:特に脈絡ありません先日、NECからV30の改良型と呼ぶべきV33が発表になりました。16MHzで2.8MIPS、10MHzのV30に比べ4倍の処理能力といいますからなかなかのものです。物理アドレス空間も16Mバイトになり、内部回路も完全ワイヤードロジックになりました。これによってインテルとの訴訟問題も解決するとのことです。今秋発表のNECのPC9801シリーズの新型にもおそらくV33が載ってくることでしょう。今から楽しみですね。(「心から……」ではないけど) |
|||||||||||||||||||||||||||||
|
※この原稿は1990年頃に書かれたものです。
|