S−OS日本語表示パッケージ「JACKWRITE2」 (C)S−OSユーザーズクラブ 森 喜一郎 *継続は力なり  「JACKWRITE」の発表が87年,この時はひらがなデータしか公開されな かったが,同人の金氏,黒木氏の協力を得て,JIS非漢字442字と第1水準の 2,965字のデータがそろったのが91年である.プログラムもJISデータ(全 角のみ)の表示ではなく,シフトJISの半角混じりテキストが表示できるように改 良していたが,その後多忙のため作業は中断し,最初の発表から7年が経過していた. この度,病を得て,ようやくドキュメントが書ける時間ができた.時期を逸した感は 否めないが,このさい発表することにしよう. *概要  このパッケージは,MAGICのラインルーチンを利用し,シフトJIS(別名: MS漢字コード)文字列から,ディスク上のベクトルフォント(漢字ストロ−クテー ブル:以下KSTと略記)を検索し,画面に全角/半角混在のテキストを表示するも のである.ベクトルフォントであるから,文字の大きさは勿論,文字間隔や表示方向 (縦書き/横書き)などを自由に設定することができる.  また,検索の頻度が多いと思われる,記号/英数字/かな/ギリシャ文字のデータ は,メモリ上に置くこととした.これにより,従来のJACKWRITE(Ver. 1.0)に比べ,平均で2倍以上,表示の高速化が可能となった.  このパッケージは,つぎのファイルで構成されている. ・KPRINT2 ……表示プログラム本体.使用法は後述. ・KST.DIC ……漢字ストロークテーブル.JIS非漢字と第1水準のベ クトルデータが入っている.このファイルは,ディスク のデータエリアの先頭から連続したFATに書き込まれ ている必要がある(データフォーマットは,Ver.1. 0と全く同じである). このファイルの入っているディスクを,以降KSTディ スクと呼ぶこととする. ・KST.PAC ……上記のデータのうち,記号/英数字/かな/ギリシャ文 字のデータを圧縮したもの.メモリに常駐して使用され る.KST.DICと同じディスク内にあること. ・KPACK ……KST.DIC上の記号/英数字/かな/ギリシャ文字のデータ を取り出して,KST.PACとしてセーブするプログラム. ・KANJI Uty ……KSTディスクの作成と,KST.DIC内の漢字データのメモ リへの読み込み,またはメモリ上の漢字データのKST.DIC への書き込みを行なうプログラム. ・KTYPE2 ……シフトJISコードを含むテキストファイルを表示する プログラム. ・KANJI INPUT.Bas ……KST.DIC内のベクトルフォントを入力編集するプログラム FuzzyBASICで記述されている. *メモリマップ 0000| | | "SWORD"本体 | |__________| 3000| | | TPA | |(プログラムエリア)| : : |__________| A800| | | KPRINT2本体 | |__________| AF00| | | 各機種用MAGIC | |__________| D000| | | KST.PAC | |__________| | | | データ展開用ワーク | |__________| #MEMAX| | *KPRINT2のサブルーチン  つぎに,実際に日本語表示を行なうための方法を説明する.まず,メモリに各機種 用のMAGICとKPRINT2をロードすること.その後,以下のサブルーチンを コールする.なお,特に述べていないレジスタの内容は保存される. (1)%KPINI(A800H)……破壊:AF (#DSK)にKSTディスクの入っているデバイス名をセットしてコールする と,各種ワークエリアおよびMAGICの初期化と,常駐データ(KST.PAC) のメモリへの読み込みを行なう.具体的には ・表示位置を左上にセット ・全角文字のサイズを横32×縦16ドットにセット ・文字間隔は密着(0ドット) ・表示方向は横書き ・表示プレーンは0(青画面)でパレットを白とする ・表示範囲(ウインドウ)は最大(640×200) となる.KSTディスクが正しくなかったり,エラーの時は,キャリフラグを立て てリターンする. コマンドラインからインストールする場合には,デフォルトデバイスにMAGI C,BドライブにKSTディスクおよびKPRINT2が入っているとして, # MAGIC # B:KPRINT2 とキーインすればよい. (2)%KPRNT(A803H)……破壊:AF 1文字出力ルーチン.Aレジスタにキャラクタをセットしてコールする.Aレジ スタの内容がシフトJISコードの第1バイトの場合は,つづけてAレジスタに第 2バイトを入れてコールすると,全角文字の表示を行なう.シフトJISコードで ない場合は,半角文字の表示となる.なお,半角文字は,全角のデータを横1/2 に圧縮したものである. (3)%KMPRT(A806H)……破壊:AF メッセージ表示ルーチンである.CALL命令に続いて,表示したいシフトJI S文字列を記述する.文字列の終端は,00Hとする. 例) CALL %KMPRT DEFB 30H,21H,30H,4AH,31H,26H ; 亜以右 DEFB 0 (4)%KSPRT(A809H)……破壊:AF DEレジスタにシフトJIS文字列の先頭アドレスを入れてコールすると,文字 列を表示する.文字列の終わりは,同じく00Hである. (5)%KLTNL(A80CH)……破壊:AF 改行する.即ち次に表示する文字を行頭へもっていく. (6)%KPCLS(A80FH)……破壊:AF 画面のクリアを行なう. (7)%STSCR(A812H)……破壊:AF 文字を表示するプレーンを指定する.Aレジスタに0〜2の値をセットしてコー ルする. (8)%STWIN(A815H)……破壊:AF CALL命令につづいて,文字の表示範囲(ウインドウ)をドット単位で指定す る. 例)画面左上1/4のみ表示するには CALL %STWIN DEFW 0,0,319,99 (9)%STPAL(A818H)……破壊:AF CALL命令の後に,パレットデータを記述する.MAGICのPALETと同 じ. 例)プレーン2を使用し,表示色を白にするには LD A,2 CALL %STSCR CALL %STPAL DEFB 0,0,0,0,7,7,7,7 (10)%STSIZ(A81BH)……破壊:なし Eレジスタに文字の横方向のドット数,Dレジスタに縦方向のドット数を入れて コールすると,以降の文字の大きさが設定できる. (11)%STPCH(A81EH)……破壊:なし 文字間隔のセット.Aレジスタに,文字間のドット数を入れてコールする. (12)%STDIR(A821H)……破壊:なし Aレジスタに以下の値をセットしてコールすると,以降の表示する文字方向が設 定できる. 0:横書き指定 1:縦書き指定 (13)%STLOC(A824H)……破壊:なし CALL命令につづいて,以降に表示する文字の表示位置を記述する. 例)画面中央にカーソル移動 CALL %STLOC DEFW 320,100  Ver.1.0のジャンプテーブル(AB00H〜)は廃止する.但し誤って使用す ることを防ぐため,旧KPINIT(AB00H)をコールすると,常にキャリフラ グを立ててリターンするようにしてある. *第2水準漢字への対応  KSTは一応第1水準の範囲しかサポートしていない(2Dのディスク容量では妥 当な仕様だと思う)が,第1水準の余っているコード(2921H〜あたり)を借用 して,一部の漢字を追加できるようにしておいた.具体的には,第2水準の漢字を表 示しようとしたときは,AE2BH〜の変換テーブルを参照して,「実際に」その漢 字が格納されているコードに変換するのである.新たに表示したい第2水準の漢字が できたときは,適当な空きコードに KANJI INPUT.Bas を使用してフォントを入力し, 変換テーブルを追加してやればよい.自分の名前が表示できない人は,各自ソースリ ストを参考の上,取り組んでもらいたい. *KTYPE2コマンド このコマンドは,前項で説明したサブルーチンを使って,シフトJIS文字列を含 むテキストファイルの内容を読み込んで,画面に表示するものである.ただし,MA GICとKPRINT2があらかじめインストールされていること.  コマンドラインから,つぎのようにキーインする. # KTYPE2:[drv:]filename drvはデバイス名,filenameはファイル名である. "F"キーまたは"↓"で次頁,"B"キーまたは"↑"で前の頁の内容を見ることができ る.終了は"Q"キーまたは"!"である. *オリジナルのKSTディスクを作ってみよう  ここからの説明は,すでにKSTディスクが存在する場合で,そのデータをそのま ま(前述のKTYPE2コマンドなどで)利用するだけならば,読む必要はない.  このパッケージをBBSや印刷物で入手された人や,自分独自のKSTを作ろうと いう人は,参考にしていただきたい. まずKSTディスクの作り方から説明しよう.初期化したディスクを1枚用意する. 最初に KANJI Uty を起動し,「3.INITIALIZE」を選択する.初期化したディスクの入 っているドライブ名を入力し,Yをキーインすれば,KSTディスクの作成が始まる. 作業が終了したなら,ディレクトリを見て,"KST.DIC"というファイルが出来ているこ とを確認すること.  つぎにKSTのデータフォーマットを説明する.KSTは1文字64バイトで(す なわち1レコードに4文字),JISコード2021Hから順に,ディスクの32レ コードを先頭に書き込まれていなければならない.当然KSTの作りたては,データ が何も書かれていないわけだから,すべてのレコードが00Hで埋められている.  1文字分のデータ形式は,先頭1バイトが線分の数,続くデータは2バイト単位で 線分の相対座標を表わしている. |←――――64バイト――――→| | |←nn×2バイト→| | nn yx yx yx yx ... yx 00 ... 00 ↑ ↑ ↑ | | 終点 | 始点 線分の数  このデータをディスクエディタ等で書き込んでやればよいのだが,むーん,余りに 作業が大変,というわけで,フォントデータの入力には KANJI INPUT.Bas を利用して いただきたい.グラフィックライブラリを登録済みのFuzzyBASICからRU Nして,KSTドライブ名を入力し,漢字コードをキーインする(このとき"$"のぶ んだけカーソルを右へやるよーに).2468でカーソルの移動,5で線分の確定, 0で取り消し,リターンキーでデータをセーブする.このプログラムはVer.1.0 から変わっていないので,くわしい説明は割愛させていただく.  フォントデータを作成するとき,複数の人間で作業することもあるだろう.また, 「JISコードの△△△△〜□□□□だけ,A氏の作ったフォントを利用したい」と いうことも考えられる.それから記号〜ギリシャ文字部分のフォントは,メモリに常 駐させるため,別ファイルで取り出さなくてはいけない.そのために,KSTディス クから特定の範囲のコードのフォントをメモリに取り出したり,逆にメモリ上のフォ ントデータをKSTディスクに書き出したりするのが,KANJI Uty の「1.LOAD」と 「2.SAVE」である. KANJI Uty を起動し,1をキーインして,KSTディスクのドライブ名を入力する. そして読み込みたい開始JISコードと終了のJISコードを入れてやると,メモリ の4000H〜にフォントデータを読み出すことができる.このときのフォントデー タは,1文字ずつ先頭にJISコードが付加され,余分な00Hが詰められた形式に なっている.  反対に,この形式のデータをKSTに落すには,4000H〜にデータをロードし KANJI Uty で 2をキーイン,KSTディスクのドライブ番号を入力すればよい. 終端の00Hまでをフォントデータとして,KSTディスクに書き込む.  なお,前述のKST.PACの場合は,メモリ節約のためJISコードを付けない 形式になっているので,これとは別の KPACK を実行して,作成していただきたい. *おわりに  7年間も同じプログラム(後ろの4年はドキュメントが書けなかっただけだが)に 取り組んでいると,自分のプログラミングスタイル(ラベルやコメントの付け方とか インデントのとり方など)が,いろいろな影響を受けて変わっていくのが見えて,興 味深い.  KSTのベクトルデータは汎用性があるので,それ字体,いや自体いろいろ使い道 があるだろう(たとえば,プロッタへの漢字出力など).今回は間に合わなかったが O−EDITの黒木氏が,GRAPH.LIBをJACKWRITE対応にしている という話を聞く.また,ワークエリアを覗けば,MAGICのコマンドに展開された フォントデータが残っているので,3Dに展開して見るのも面白いだろう.  最後になったが,フォントデータの作成に協力いただいた金氏,ならびに黒木氏に は並々ならぬ作業を手伝ってもらった.この場を借りて,感謝の意を表したい. <参考文献> 1.全機種共通システムS−OS"SWORD" Oh!MZ 1986年2月号 2.高速グラフィックパッケージ MAGIC 〃 〃 9月号 3.漢字出力パッケージ JACKWRITE 〃 1987年8月号 (EOF)