このエントリーをはてなブックマークに追加
スポンサーリンク

PC-PR201系制御コード

PC-PR201

PC-PR201はドットプリンタです。ドットプリンタは、循環式の布のインクリボンごしにヘッドを用紙に打ち付ける事で文字を印刷します。そのため印刷時にはかなり大きな音がします。

ドットプリンタを使うケースのほとんどは、複写式の伝票に印刷をする場合です。複写式の伝票は、間にカーボンが挟んであったり、インクがカプセル状に吹き付けられていて圧力がかかるとカプセルがつぶれてインクが出るようになっていたりします。なので、インクジェットや熱転写のような圧力のかからない印刷方式では2枚目以降に文字が複写されません。

PC-9801全盛期の頃、PC-9801でMS-DOSで動作する業務アプリが多く作られました。そして、帳票の印刷ではPC-PR201系プリンターが多く使われました。そのため、業務アプリの世界ではPC-PR201系の制御コードを対象としたものが多く存在します。現在もESC/Pスーパーの制御コードを持つレーザープリンター等でPR-201系の制御コードも受け付けてくれるプリンターが現存しています。

PC-PR201系の制御コードの特徴として、イメージ印刷や外字登録以外のコマンドでは、バイナリデーターを直接送信しません。値を指定する場合、テキストコードである0x30〜0x39で指定するものがほとんどです。したがって、プリンタードライバー内でシフトJIS→JISコード変換を透過する処理も、イメージ印字と外字印字だけを考慮すれば良いため、比較的処理が単純になります。

PR-201系のプリンターはJIS-78系の漢字コードを持っているため、PC-9801に接続して使う分には問題はないのですが、AT互換機に接続して使う場合、一部機種依存文字が画面には表示されるのに印刷には出ない場合が出てきます。そこで、プリンタードライバー内で機種依存文字のコード(@AB…や、括窮撃ネど)を変換しています。それでも、桧や篭など一部の文字は対応しきれておりませんで、画面に出た文字と印刷の文字が異なってしまうものもあります。当時はGoogleなんて便利なものがなくて、機種依存文字に関する資料が集めきれませんでした。

漢字オン、漢字オフ

<1B>K ・・・ 横書き漢字
<1B>t ・・・ 縦書き漢字
<1B>H ・・・ HDパイカ指定
<1B>N ・・・ HSパイカ指定
<1B>Q ・・・ コンデンス指定
<1B>E ・・・ エリート指定
<1B>P ・・・ プロポーショナル指定

PC-PR201系の制御コードでは、ESC/Pのような明確な「漢字オン」「漢字オフ」といったコマンド体系ではなく、「書体の変更」というコマンドで半角/全角の切り替えを行います。つまり「横書き漢字」が事実上の「漢字オン」で、「HDパイカ指定」が事実上の「漢字オフ」となります。

縦書き漢字、HSパイカ、コンデンス、エリート、プロポーショナルは別途アプリ層で送出すれば使用可能になりますが、半角/全角まりじの文字列を印刷する際に、プリンタードライバー(NPRINTER.SYS)の方で全角文字を送出する前に「横書き漢字」、全角文字を送出した後に「HDパイカ指定」を送出していますので、アプリ層の方でプリンタードライバーのコード変換機能をオフにした上で自前のルーチンで漢字コード変換を行う必要があります。

という事なので、PC-PR201系のコード体系では、数値などの確実に半角のみとわかっている文字列を打つ場合以外を除いて、HSパイカ、コンデンス、エリート、プロポーショナルのフォントは使いづらいのではないかと思われます。

文字間ピッチの指定

PC-PR201は160DPIで、デフォルトでは半角16ドットピッチ、全角24ドットピッチに設定されています。そのため通常では半角:全角のドットピッチは1:1.5です。そのためストックフォーム連続用紙などで帳票を作る場合に、半角:全角を1:2にする制御コードを送出する必要があります。

10CPIにする
<1C>B ・・・ 全角文字を32ドットピッチにする
この制御コードをあらかじめ送出しておく事で、半角のドットピッチはそのままで、全角を32ドットピッチで印刷する事ができます。通常はこの方法で半角:全角を1:2にします。


13.3CPIにする
<1C>A ・・・ 全角文字を24ドットピッチにする
ドットプリンターでストックフォーム連続用紙でガーガー印刷していた頃は、10CPIでも特に文句は言われなかったのですが、そのうちパソコンの性能がアップするにつれ、単票用紙の指定位置に印刷するようになってきました。そうなってくると、10CPIでは文字間が開きすぎていて、「もっと文字間をつめれば文字数入るはずだ」「文字間をもっとつめてくれ」と要求される事が多くなりました。

現在はパソコンの性能がさらにアップしたため、印刷はMicrosoft Access等で指定位置に綺麗に印刷してくれるため、ドットピッチを気にしなくても良くなったのですが、当時は当時の技術でなんとかして半角の文字間をつめる必要があったのです。 そこで、PC-PR201プリンタに内蔵されている「半角漢字フォント」というものを使う方法が考えられました。

半角漢字フォントを使うためには、通常の全角文字と同じように「漢字オン」のコードを送信した後、<00>に続いて半角の文字コードを送信し、「漢字オフ」を送信します。ここで、あらかじめ<1C>Aを送出して、全角のドットピッチは24ドットにしておきます。


ただし、この方法では半角1文字ごとに、前に「漢字オン」<00>、後ろに「漢字オフ」をつける必要があるため、通常のアプリ層でこれを行うのは大変困難です。そこで、NPRINTER.SYSでは組み込む際に/C=13.3を指定する事で、自動的に半角文字を印刷する際に「漢字オン」<00>と、「漢字オフ」を付加してくれるようになります。

ただ、業務アプリの主流はすぐにMS-DOSからWindows+ Microsoft Officeに移ってしまったため、苦労した割にはこの技術はあまり長い期間は役に立ちませんでした。

行間ピッチの指定

改行幅はデフォルトでは1/6インチです。ただし、罫線の縦をつなげたい場合などの際に、改行幅を1/8にする事ができます。

<1B>A ・・・ 1/6インチ(デフォルト)
<1B>B ・・・ 1/8インチ
<1B>T改行幅・・・n/120インチ

n/120インチに設定する場合、改行幅は2桁の数値で指定します。数値はテキストで、0x30〜0x39までのコード2桁で指定します。2桁に満たない場合は、左の桁を0で埋めます。8/120インチに設定するなら、<1B>T08とします。

イメージ印字

プリンタにイメージを送信します。

書式
<1B>S列数データー ・・・ 8ドットイメージ印字
<1B>I列数データー ・・・ 16ドットイメージ印字
<1B>J列数データー ・・・ 24ドットイメージ印字

列数
列数は4桁で指定します。列数はテキストで、0x30〜0x39までのコード4桁で指定します。4桁に満たない場合は左側に0を補います。例えば1列打つ時は0001です。

データーの作成方法
24ドットイメージの場合、1列に対して3バイト分のデーターを用意します。NEC系は他社のコード体系とは逆で、下位ビットが上になっているため、ドットを上から下へキャリーフラグを含んで右シフトしながら3バイト分ローテーションさせて作成します。


例)
ドットの検査、ドットがあればSTC、なければCLC
RCR BYTE PTR [LDAT3],1
RCR BYTE PTR [LDAT2],1
RCR BYTE PTR [LDAT1],1
を、ドットを縦に検査しながら24ドット分繰り返します。

できあがった1列分データーを必要な列分作成して、プリンターに送信します。プリンタードライバー(NPRINTER.SYS)ではこのバイナリバイト数分だけ透過モードとなり、シフトJIS→JISコードへの変換を行わなくなります。

外字印字

プリンターに内蔵されていないフォントを、外字として登録する事ができます。NPRINTER.SYSでは、/UFOオプションを指定することでJFGAIJ.UFOファイルを読み込んで外字エリアに転送を行う事ができます。

書式
<1B>+文字コード外字データー

文字コード
外字はコードは7620〜7674です。ただし、ビッグエンディアンで指定するので、8086アセンブラを使っている場合は、上位バイト下位バイトを逆転させてから印字バッファにセットする必要があります。

例)
MOV AX,[ADDR2]
XCHG AH,AL
MOV [ADDR],AX

外字データー
外字データーは72バイトのバイナリで指定します。JFGAIJ.UFOなどのフォントパターンは通常1バイトが横1スライスになっています。しかしこのコマンドでは1バイトが縦1スライスで指定するため、プリンターに転送する前に横スライスを縦スライスに変換する必要があります。

画面用フォントパタンを上から順に左にシフトしていき、1シフトごとにそれぞれキャリーフラグに押し出されたビットを、プリンター用フォントにシフトして読み込みませます。NEC系のプリンターでは上が下位ビットであるため、右にシフトする必要があります。
;==============================================================================
;           画面用フォント  →  プリント用フォント
;==============================================================================
P_HENKAN	=	$
		MOV	SI,OFFSET KANPAT  ;SI ・・・・・・・ 表示用先頭アドレス
		MOV	DI,OFFSET PRPAT	  ;DI ・・・・・・・ プリント用先頭アドレス
		MOV	[KAISU1],BYTE PTR 8
		MOV	[KAISU2],BYTE PTR 3

;		上8ドット
UEPUT		=	$
		SHL	BYTE PTR [SI+00],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+03],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+06],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+09],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+12],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+15],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+18],1
		RCR	BYTE PTR [DI+00],1
		SHL	BYTE PTR [SI+21],1
		RCR	BYTE PTR [DI+00],1

;		まん中8ドット
NAKAPUT		=	$
		SHL	BYTE PTR [SI+24],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+27],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+30],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+33],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+36],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+39],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+42],1
		RCR	BYTE PTR [DI+01],1
		SHL	BYTE PTR [SI+45],1
		RCR	BYTE PTR [DI+01],1

;		下5ドット
SITAPUT		=	$
		SHL	BYTE PTR [SI+48],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+51],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+54],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+57],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+60],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+63],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+66],1
		RCR	BYTE PTR [DI+02],1
		SHL	BYTE PTR [SI+69],1
		RCR	BYTE PTR [DI+02],1

		ADD	DI,3

;		前半8ドット分終った?
		SUB	[KAISU1],BYTE PTR 1
		CMP	[KAISU1],BYTE PTR 0
		JE	ZENHANE
		JMP	UEPUT

ZENHANE		=	$
		ADD	SI,1
		MOV	[KAISU1],BYTE PTR 8

;		後半8ドット終った?
		SUB	[KAISU2],BYTE PTR 1
		CMP	[KAISU2],BYTE PTR 0
		JE	KOUHANE
		JMP	UEPUT

KOUHANE		=	$
		RET

その他のコマンド

片方向印字/両方向印字
シリアルドットプリンターでは、大抵はヘッドが左右に往復しながら印刷を行うわけですが、ヘッドが右から左へ移動する場合と、左から右へ移動する場合で印刷位置がズレてしまう場合があります。

現在はステップモーターの制度が非常に上がっているので、ヘッドが左右に動きながら印刷を行っても印刷位置がズレる事はまずありませんが、当時のシリアルドットプリンターでは縦の罫線やハードコピーをズレずに印刷する時に、片方向印字を指定する必要がありました。

片方向を指定すると、ヘッドが左から右へ移動する時のみ印刷を行うようになります。ハードコピードライバーGRAPH201.COMではデフォルトでは片方向印字コマンドを送信しています。これは、オプションで変更する事もできます。

<1B>> ・・・ 片方向印字
<1B>] ・・・ 両方向印字(デフォルト)

・・・って、これだとわかりにくいですね。片方向印字は、ESCのコード(1B)と>のコード(3E)です。両方向印字は、ESCのコード(1B)と]のコード(5D)です。

バック改行
逆方向に改行します。ドットプリンターで連続帳票や連続複写伝票を印刷してる時にやたら逆方向に改行すると、用紙がすぐジャムってしまう(※用紙の穴とスプロケットのギアが脱線すること)ので、シリアルドットプリンターではあまり役に立たなかったのですが、レーザープリンターでPC-PR201エミュレーションで動かしている場合、わりと自由に印刷物のレイアウトができて便利だったりします。

<1B>r ・・・ バック改行
<1B>f ・・・ 順方向改行(デフォルト)

バック改行を指定すると、次に順方向改行のコマンドが来るまで、改行は全て逆方向になります。

拡大印字
文字を縦横それぞれ倍角で印刷します。レーザープリンターのPR201エミュレーションとかでは綺麗に拡大されますが、通常ドットプリンタで倍角印刷してもドットが粗くなるだけであまり綺麗には印刷されません。

<0E> ・・・ シフトイン
<0F> ・・・ シフトアウト

シフトイン、シフトアウトは7ビットモードではカナオン、カナオフという意味になるのですが、8ビットモードでは横倍角のオンとオフという意味になります。これだと横倍しかできないので、通常はこれではなく<1B>eを使います。

縦横倍率指定
<1B>eに続いて縦の倍率、横の倍率を指定します。<1B>e21で縦倍角、<1B>e12で横倍角、<1B>e22で4倍角になります。という事は、縦、横どちらかの2倍か両方2倍(4倍)しかできないという事です。とはいえ、PR201はアウトラインフォントではないし、ドットインパクトプリンタなので、そんなに拡大しても綺麗になりません。それでも、昔はドットプリンタで納品書とか見積書の自社名とかを倍角(4倍角)で打ったりしました。

<1B>e縦倍率横倍率

繰り返し印字
<1B>R繰り返し数文字

同じ文字を繰り返し印字します。といっても、指定できるのは半角文字だけです。繰り返し数は3桁の10進数で指定します。なので、9回繰り返したい場合は、009と指定します。

<1B>R009*
と指定すると、*を9個印字します。昔の帳票はキャラクター文字を使って罫線のかわりにしていました。

強調印字
強調印字します。といっても、ドットプリンターであるPC-PR201では二度打ちするだけです。熱転写やインクジェットだと二度打ちしてもあまり変わらないのですが、ドットプリンターは大抵はリボンが循環式なので、二度打ちすると結構目立ちます。レーザープリンターのエミュレーションでは太字になる場合が多いようです。

<1B>!・・・・強調印字
<1B>"・・・・強調印字解除

アンダーライン
アンダーラインをつけて印字します。プリンターによっては、一番下がアンダーラインと重なってしまう場合もあるようです。

<1B>X・・・アンダーライン
<1B>Y・・・アンダーライン解除

参考文献
PC-PR201取扱説明書 NEC
Microline5320SV取扱説明書 OKI
PC-PRプリンタハンドブック 斉藤邦彦著 株式会社技術評論社

スポンサーリンク