━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 「陰極管表示免許皆伝の書」掲載プログラム集 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ プログラム名: 対応機種 :FM TOWNS 作者 :Waku ●口上  TOWNSには,多色のモードから高解像のモードまで実に18種類もの画面モード があります。しかしまだまだ,そんなことで驚いてはいけません。CRTC(画面表示 用のLSI)を直接使うことで,縦横のドット数から偏平率まで,用途に応じてお好み の表示画面が作れてしまうのです。ここでは, CRTC使いこなしガイドとして定評のあ る,Oh!FM'90年4月号p.56〜p.61掲載の「陰極管表示免許皆伝の書」で紹介された 画面表示関係のプログラムを, 作者Waku氏とOh!FM編集部のご好意により収録し ました。  なお,以下の解説では,収録プログラムの概略のみ取り扱っています。CRTCの 操作方法に関する説明は同記事を参照ください。 ●893な用途のI/O関数  まず,C言語を使ってプログラムを作ってCRTCを操作したりしよう,などという 場合に必要になるものがあります。I/Oを直接操作する関数です。C言語はアセンブ ラに近いといわれていて,このような関数でも簡単に使えるところが嬉しいわけです ね。ここで使っている開発言語であるHigh Cには,標準ではこのI/O操作の関数が 付いてこないようです。それでは作ってしまえということで,6種類の低水準I/O操 作関数を作りました(IOPOT.ASM/IOPORT.OBJ)。  使い方は,IOPORT.OBJと,Cのコンパイルしたオブジェクトとともにリンクす るか,386|LIBを使ってライブラリに加えてもいいでしょう。ここに含まれる関数は, int INPB (addr) バイトデ−タの読みだし int INPW (addr) ワ−ドデ−タの読みだし void OUTB (addr,dat) バイトデ−タの書き込み void OUTW (addr,dat) ワ−ドデ−タの書き込み void OUTREGB (addr,num,dat) バイトレジスタの書き込み void OUTREGW (addr,num,dat) ワ−ドレジスタの書き込み の6種類です。 ●スクロールとズームは超高速  TOWNSのCRTCのスクロールとズームの機能を使ったサンプルプログラムGLOAD.EXPは, gloadという名前のとおり,これはいちおうグラフィックローダになっています。320 ×240×32768色のグラフィックデータをロードして表示するのですが,いちおうVR AMベタ形式で320×240ドットフルにセーブされているファイルならたいていのもの を表示できるという特徴をもっています。実行形式は,   run386 gload ファイル名[ファイルオフセット] という形で,ファイルの<ファイルオフセット>の位置からのデータを320×240×32768 色のデータとしてVRAMに表示します。 オフセットを省略した場合は0と見なされ ます。このオフセット指定によって,「.TIF」(512),「.P32」(XXX),「.GED」 (256),「.IMG」(XXX)といった様々なグラフィック形式のものを表示することがで きます。  表示した後は,パッドの操作によって,上下左右のスクロールと,拡大「A」縮小 「B」ができます。以上で説明したスクロールとズームの機能は,このプログラムで 操作してみると理解しやすいと思います。SELECTかRUNのボタンを押すと,MS-DO Sに戻ってきます。  なおソ−スプログラムはGLOAD.Cのほかに,MS-DOSの画面モード設定をするSCREEN.C と,CRTC用定義を書いたヘッダファイルCRTC.Hからなります。改造された場 合は,GLOAD.CとSCREEN.Cを別々にコンパイルした後,IORORT.OBJとともにリンクし てください。ライブラリはHCE.LIBとTBIOS.LIBを使います。   386link gload screen.obj -lib tbios hce -stack 100000 -pack ●VRAMサイズはお気に召すまま  ここで,VRAMサイズ変更とVRAMのアクセスを使ったサンプルを紹介してお きます。CROLL.EXPは,256×1024×32768の画面モードのデモです。プログラムでは, 256×1024のVRAM領域に縦長のグラデーションのパターンを描いて, 円筒スクロ ールをさせています。実際の表示は,256×480の部分が表示されるわけですが,横方 向のズームを2倍にして,1ピクセルが横長の長方形になるようにしています。実行時 のパラメータとして,スクロールの速度を指定できます。数字が大きいほど遅いスク ロールになります。 RUN386 CROLL スクロ−ル速度  実際のプログラムでは,まずTBIOSで画面モードを17(512×480×32768色モード) にしたあと,CRTCのレジスタLO0,LO1に64を書き込んで,横方向のVRAMを128 ドットに設定しています。関数HSVtoRGBは,グラデーションをつくるためのもので, ペイントソフトなどでお馴染みのHSV表記からRGB表記の変換をするものです。 ソ−スからコンパイルされるときは,SCREEN.OBJ,VRAM.OBJ, IOPORT.OBJの各オブ ジェクトをリンクし,ライブラリとしてHCEとTBIOSを指定してください。   386link croll screen.obj vram ioport -lib tbios hce -stack 100000 -pack ●スクリ−ンモ−ドの設定  もう1つ,VRAM領域の設定例として,前のサンプルでも使った,MS-DOSのスクリ ーンモードを設定するscreenterm関数(screen.obj/screen.c)について解説しておき ます。MS-DOSの状態では,16色のキャラクタ画面と16色のグラフィック画面がありま す。これをTBIOSの側からみると,レイア1が画面モード4でキャラクタ画面に対応し, レイア1がグラフィック画面で,画面モード1に対応するという構造になっています。 どちらも表示領域が640×400の16色ですが,VRAMのサイズが違っているというわ けです。  MS-DOSに戻って,キャラクタとグラフィックを正常に表示するためには,このよう にTBIOSではサポートされていない変則的な画面設定にする必要があります。 そこで これもCRTCのレジスタを操作することで実現しようというわけです。screenterm 関数では,まずTBIOSで,レイア0,1ともに画面モード1に設定したあと,CRTCの LO1レジスタを操作することで, レイア1のVRAMの横方向ドットを1024にしていま す。こうすることによって,MS-DOSのテキストとグラフィックが正常に表示できるよ うになります。  ただし,このような設定をした後でも,実は完全ではなく,MS-DOS側のGDS-BASEを 使うと,パレットの色の設定がおかしくなってしまうことがあります。これについて は,まだ原因がわかっていないのですが,おそらくネイティブプログラムの実行によっ て,リアルのBIOSで使っているワークエリアか何かに保存されている画面の状態等 の情報が,本当の状態と合わなくなってしまうためではないかと思われます。 ●禁断のX68000コンパチモード!?  TOWNSにはなくて,X68000にある画面モードをなんとか作れないか,という課 題に挑戦しました。X68000には,512×512×65536色(横長)と,768×512×16色と いうモードがあります。65536色は物理的に無理ですが, クロックを変えるという手 法で,横長512や768ドットというのはできそうです。  ESCREEN.EXPがそれらの画面モードを設定するテストプログラムです。31.47KHz の高解像16色モードで,4種類のクロックを使って表示してみるとどうなるかという テストです。0-3までのパラメータを与えてプログラムを走らせると,グリッドが表 示されます。0は通常の640×480のモード,1はクロックを下げて,512×480で横長の モード,3はクロックを上げて横を768ドットにしてあります。2では0とほとんど変わ りません。実際には,768ドットは両脇がひずんでしまって,綺麗にみえるのは740ド ットくらいですが,1行にたくさんの文字を表示させたい場合などに使えるかもしれ ません。32768色で横長512のモードにすれば,フリーウェアとして出回っているX68 000 で描かれた絵も,けっこう自然に見ることができます。縦方向については,この プログラムでは変えていませんが,クロックを変化しても走査線の幅は変わらずTO WNSのモニタの特性から512ラインの表示は無理なようで,490ドット程度に制限さ れてしまいます。  コンパイルされる場合は,実行ファイルの生成の際には,ESCREENもGLOADと同様に, SCREENとIOPORTをリンクします。   386link escreen screen.obj ioport -lib tbios hce -stack 100000 -pack ● 著作権・再配布について このプログラムの著作権は作者が保持しておりますが,著作権法の定める「個人的 な利用」の範疇であれば自由に利用してくださってけっこうです。また,転載・配布 についても事前の許諾なしに自由に行ってくださってかまいません。ただし配布時に, 1. 「Waku」がプログラミングしたものであること 2. Oh!FM'90年4月号に掲載されたものであること 3. 作者の自由転載許可に基づいて転載・配布したものであること を,説明用のテキストに明記してください。